Files
zhila/docs/PLAN.md
T

40 KiB
Raw Blame History

ZHILA — план проекта

Черновик v1.1 · 1 ноября 2026 Статус: P1 полностью выполнен (P0, P1a–P1f; см. P0.md, P1.md). Демо reference/demo/ — референс, не кодовая база. Следующая фаза — аранжировка, рендер и агент.

Зафиксировано 1 ноября: descent — основной вид; камень = паттерн; климат — на жилу (концепт погоды остаётся); платформа v1 — Linux; UI — Svelte 5. Журнал — §9.


0. Резюме

Что. ZHILA — инструмент для музыки из найденного звука: сэмпл здесь не файл, а вещь с местом, шрамом, погодой и клеймом. Материал берут и режут в карьере, укладывают и играют в нефе. Агент — не чат сбоку, а второй исполнитель на тех же глаголах.

Для кого. Композиторы и саунд-дизайнеры, которые мыслят сэмплами, а не нотами; люди, которым тесно в обычном DAW; те, кто хочет работать с агентом, но не отдавать ему проект вслепую.

v1. Импорт и запись материала → анализ → керн и грани → паттерны → аранжировка → микс → сохранение → рендер. Плюс встроенный агент с правом предлагать и обязанностью согласовывать разрушительное. Один человек + агенты, Linux-первый, Tauri 2 + Rust.

Не v1. VST/CLAP, коллаборация, облако, мобильное приложение, macOS/Windows, видео, спектральный редактор, стем-разделение, маркетплейс, MIDI-железо и синхронизация.

Стек. Rust-ядро (движок, сессия, агент), Tauri 2 — оболочка, вебвью — поверхность; браузер-первый фронт на Svelte 5; SQLite + контент-адресуемые ассеты; протокол команд/событий с двумя транспортами (WS в dev, Tauri IPC в проде).

Оценка. 32–38 недель full-time для одного разработчика с агентами до v1.0; внутренняя альфа на ~22-й неделе, приватная бета на ~30-й. Оценка с широкой вилкой; после спайков и первой беты пересматривается. С двумя инженерами (ядро/UI) — 24–30 недель.


1. Видение и v1

1.1 Обещание

Через месяц работы в ZHILA человек делает вещь, которую не сделал бы в Ableton не потому, что там нет функций, а потому, что там нет языка: «взять этот подъезд, разрезать по швам, положить в низ, выветрить до камня, дать агенту добавить редкое».

1.2 Северная звезда (приёмочный сценарий)

На бете новый человек без документации:

  1. открывает ZHILA с готовой вещью и слышит её в один клик;
  2. импортирует три своих сэмпла, видит найденные швы, режет на грани;
  3. собирает паттерн, кладёт его в аранжировку, делает 2-минутную вещь;
  4. один раз просит агента добавить/убрать и принимает или отклоняет правку;
  5. сохраняет, закрывает, открывает, рендерит WAV.

Цель — 45 минут, без чтения мануала, с ощущением «резал и клал», а не «изучал DAW».

1.3 Не-цели v1

  • плагины и хостинг VST3/CLAP;
  • коллаборация, облако, аккаунты, маркетплейс;
  • мобильные приложения и веб-версия для всех;
  • macOS/Windows в v1 (после — да, но не в этом релизе);
  • видео, спектральное редактирование, source separation;
  • MIDI-железо, синхронизация по clock, OSC;
  • многоканальный выход больше стерео;
  • time-stretch/фазовый вокодер (только питч через рейт);
  • полноценный piano roll (см. §3).

1.4 Метрики успеха

Метрика Цель v1
Первый звук после установки < 60 с (демо-проект)
Первая своя петля < 15 мин с онбордингом
Crash-free сессии ≥ 99.5%
Аудио-дропауты 0 на часовой сессии 8 жил @ 256 фреймов на референсном ноутбуке
CPU ≤ 25% на 16 голосах + климат (2020, Linux)
UI 60 fps на 1440p, frame time p95 ≤ 16 мс
Агент: валидные вызовы ≥ 90%
Агент: разрушительные без согласования 0
Бета 5–10 музыкантов, ≥ 3 хотят продолжать

2. Принципы

Дизайн

  1. Одна поверхность: никаких карточек, радиусов и теней. Регионы — провалы, линии и свет.
  2. Звук — рельеф. Все аудиоданные (волна, уровень, спектр, ноты) рисуются как порода, а не как плашки в рамках.
  3. Сверху агент, снизу руки. Режим choir / hand меняет свет и права, а не прячет половину.
  4. Клеймо — память, не полиция. Происхождение видно, но не мешает работать.
  5. Движение только там, где оно что-то сообщает. Одна оркестровка на загрузку, дальше — отклик.
  6. Типографика как надпись: антиква для голоса, моногарнитура для протокола. Читаемость важнее атмосферы, но не вместо неё.

Инженерия

  1. Ядро — источник истины. UI — проекция. Никакого состояния, которое живёт только в вебвью.
  2. Один журнал команд. Человек, API и MCP ходят через него. Undo, аудит и коллаборация — производные.
  3. Материал неизменяем, размещение ссылается. Удаление — «закопать». Керн нельзя испортить.
  4. Аудиочасы — мастер. Время песни, керна и кольца резолвятся в сэмпл-фреймы.
  5. Реальное время без аллокаций в аудиопотоке и без блокировок на пути звука.
  6. Движок за протоколом. Оболочка (Tauri/Electron/браузер) заменяема без переписывания звука.
  7. Детерминизм: одинаковый проект + одинаковые команды → одинаковый рендер (для тестов и агента).
  8. Агент — актор, а не хозяин: права, черновик, согласование, бюджет.

3. Взаимодействие: ревизия демо

3.1 Что оставляем как есть

  • ZHILA и две комнаты: материал внизу, собор наверху.
  • Рельеф, контурный язык, палитра, антиква + моногарнитура, правило одной поверхности.
  • Метафоры: керн, грань, камень, кольцо, погода, клеймо, опись.
  • Хор как протокол: консоль с вызовами, аргументами, результатом и одной репликой.
  • Семантику «взять — разрезать — уложить».
  • descent как главный вид аранжировки и исполнения; точность — линза и фокус-полоса.

3.2 Что пересматриваем

В демо Почему меняем В v1
Перспективная дорога — единственный вид аранжировки Перекрытия, сжатие времени к горизонту, нет зума и точных ручек. Красиво играть, больно править. Descent — основной вид (зафиксировано). Точность решаем внутри него: линза у курсора/плейхеда, фокус-полоса с текущим тактом, видимые ручки у ближних камней. Плоская доска — вторичный режим для сложных правок, если понадобится; точность паттерна берёт на себя кристалл.
Камень = один срез или кольцо Так можно играть, но трудно «писать музыку»: нет ритма внутри клипа, нет вариаций. Зафиксировано: камень = паттерн: 16/32 шага, строки = грани, у шага velocity/pitch/probability/ratchet. Кольцо — режим повтора с эрозией. crystal — редактор паттерна, не piano roll.
Лоток керна — цилиндр Красивая витрина, но резать и ставить loop-точки в ней нельзя. В карьере — масштабируемая волна с транзиентами, зумом, cut/loop-точками, скрабом и audition. Цилиндр остаётся героем витрины и иконкой в store.
Пустота — единственный ввод агента Одна строка без истории, стрима, отмены, области действия и согласований. Пустота остаётся жестом «позвать» и индикатором. Настоящий разговор — док-консоль choir: стрим, карточки вызовов, diff, область (выделение/жила/вещь), отмена, повтор, согласование.
Пять жил фиксированы Пять — это шаблон «спуск», а не закон. N жил, добавление/удаление/перестановка, группы/шины. Пять — стартовый шаблон.
Ресницы — фейдеры Волоски — сильный образ, но не микшер: нет панорамы, сендов, инсертов, solo. Ресницы — метры/жест исполнения; микшер — выдвижной набор канальных стрипов: pan, sends, mute/solo, inserts, метры.
Погода глобальная Один климат на всю вещь красив, но музыканту нужен сухой камень рядом с выветренным. Зафиксировано: климат — на жилу (четыре макроса на каждой жиле) + dry/wet на камне. Глобальный «сезон» — макрос-смещение для всей вещи, не отдельный климат. Автоматизация — на жиле и на сезоне.
Клеймо и печать как ежедневный ритуал Ритуал на каждом действии — трение. Клеймо — метаданные/история. draft → seal — только для предложений агента и разрушительных операций. Свои действия — прямой undo. Опись = история/аудит/undo.
Мелкий тип (7–9 px), низкий контраст Атмосфера не должна стоить читаемости; это DAW, а не постер. Шкала: 10 px только служебные метки, 11–12 — подписи, 13+ — основной текст; контраст ≥ 4.5:1 для текста; клавиатура, focus, aria; режим высокой контрастности. Атмосферу держат композиция, антиква и рельеф.
Кристалл только читает Нет способа писать внутри паттерна. Кристалл — редактируемая сетка шагов. Позже — piano roll для тонального материала.
Агент действует на весь проект Нельзя сказать «только эта жила» или «только выделение». Область действия: выделение / жила / сцена / вещь. Агент показывает diff, разрушительное — только после согласования.
Импорт только через файл Материал должен приходить и из комнаты. Запись входа, импорт, позже — полевые заметки; анализ на входе.
Нет MIDI Для аудирования граней клавиатура полезна. Базовый MIDI-вход (ноты/velocity) — опционально, без синхронизации и хардверных обещаний.

3.3 Карта экранов

  • Material / quarry — store кернов, волна-редактор, стена граней, климат, анализ, запись/импорт, клеймо.
  • Arrangement / nave — descent (основной вид): сцены, жилы, камни, паттерны, автоматизация; линза/фокус-полоса для точной правки. Плоская доска — вторичный режим для сложных правок. descent — и исполнение, и обзор.
  • Crystal — редактор паттерна выбранного камня/жилы (16/32 шага, до 8 строк-граней).
  • Mixer — выдвижные канальные стрипы: gain/pan/mute/solo, два сенда, мастер-лимитер; ресницы — метры.
  • Choir — док-консоль агента: история, стрим, вызовы, область, diff, согласование, «послушать».
  • Session — проект, версии, автосейв, рендер, настройки, клавиши.

3.4 Ключевые сценарии

  1. Первый сэмпл. Открыть демо-вещь → play → спуститься в карьер → импорт → анализ находит 7 швов → резать → audition грани → назначить строку паттерна.
  2. Петля. Выбрать жилу → кристалл → 16 шагов, 3 строки граней, velocity/pitch → длина паттерна 2 такта → перетащить камень в аранжировку → слушать.
  3. Агент. Выделить сцену → «стало тесно, убери голос и затемни» → агент предлагает draft с diff → принять → погода и камни изменились → undo доступен.
  4. Микс. Открыть микшер → pan/sends → ресницы танцуют → мастер-лимитер → рендер WAV и stems.
  5. Сессия. Автосейв → закрыть → открыть → всё на месте → экспорт.

4. Архитектура

4.1 Слои

┌─ surface ────────────────────────────────────────────────┐
│  material · arrangement · crystal · mixer · choir        │
└──────▲───────────────────────────────────────┬───────────┘
       │ проекции (снапшоты + события)          │ команды
┌──────┴───────────────────────────────────────▼───────────┐
│  session: журнал · ревизии · undo · снапшоты · ассеты    │
├──────────────────────────────────────────────────────────┤
│  composition: сцены · жилы · паттерны · камни · автоматика│
│  instrument: маппинг граней · голоса · климат            │
│  timeline: tempo/meter map · маркеры · три шкалы времени │
├──────────────────────────────────────────────────────────┤
│  engine: аудиочасы · lookahead · голоса · шины · PDC     │
│  рендер офлайн · запись · метры                          │
├──────────────────────────────────────────────────────────┤
│  archive: cores · faces · analysis · seals · assets       │
└──────────────────────────────────────────────────────────┘
       ▲
       │ tools / read model / hearing
┌──────┴───────────────────────────────────────────────────┐
│  harness: embedded LLM · MCP · capabilities · draft/seal │
└──────────────────────────────────────────────────────────┘

Оболочка: Tauri 2 (webview) или браузер (dev). Ядро — Rust-процесс/библиотека. Протокол один.

4.2 Данные

Объект Что это Ключевые поля
Asset файл материала/ассет hash (blake3), path, sr, channels, license, provenance
Core запись как керн id, name, asset, seal, analysis (onsets/tempo/key/loudness), variant
Face срез керна id, core, in/out frames, loop points, gain/pan/tune, rms
Pattern 16/32 шага id, rows (до 8 граней), steps (face/velocity/pitch/probability/ratchet), swing, length
Stone размещение паттерна id, pattern, vein, start, length, repeat, transpose, climate (dry/wet), seal
Vein канал id, name, gain, pan, mute/solo, sends, climate (age/pressure/air/heat), insert chain, color
Scene секция id, name, start, length, scene-level automation snapshot
TimeMap время песни tempo/meter events, markers
Automation линии target (param id), points, mode
Instrument как играть грани mapping (v1: 16 pads/rows), voice policy, envelopes
Journal команды id, actor (hand/api/mcp), ts, tx, revision, command
Seal происхождение kind (found/taken/gift/loan/unknown), note, actor
Snapshot состояние revision, serialized projection, asset refs

Керн и его грани — архив, неизменяемы. Паттерны/камни — проект, изменяемы. Климат — инсерт каждой жилы (четыре макроса); у камня — climate 0..1 (dry/wet); «сезон» — глобальный макрос-смещение, не отдельный климат.

4.3 Три шкалы времени

  • Керн: сэмпл-фреймы + маркеры швов (анализ). Неизменяемая ось записи.
  • Песня: такты/доли через TimeMap (темп, размер, маркеры, сцены); аудиочасы — мастер.
  • Повтор: цикл/фаза паттерна; каждый оборот может выветриваться (эрозия, детюн, потеря верха/громкости).

Резолвинг: событие паттерна → такт → секунды (TimeMap) → фреймы (SR) → сэмпл-точное событие с offset; PDC компенсирует инсерты и запись.

4.4 Протокол

  • hello (версия, capabilities), snapshot (ревизия, проекция), command (id, op, args), result, event (ревизия), frame (бинарные метры/волны).
  • Команды — JSON (типизированы из Rust через ts-rs/specta), бинарные кадры — отдельно; события батчатся, метры 30–60 Гц, волны — заранее посчитанные пики.
  • Два транспорта: WS (браузер/dev, с per-session токеном, localhost only) и Tauri IPC (прод). Один Bridge в UI.
  • Ревизии и снапшоты: UI не хранит авторитетное состояние; при расхождении — перезапрос снапшота.
  • MCP — отдельный stdio-сервер над тем же командным слоем; capabilities и approval.

4.5 Потоки и реальное время

  • Аудиопоток: RT-приоритет, без аллокаций, без мьютексов; SPSC-очереди к control-потоку. Климат — по жиле; все инсерты/голоса предаллоцированы, стоимость в бюджете CPU.
  • Control/session-поток: владеет документом, применяет команды, пишет журнал, отправляет проекции.
  • Analysis-воркер: онисеты/фичи/пики волн; результаты асинхронно.
  • UI: 60 fps, только чтение проекций; ввод — команды.
  • Агент: async tokio-задачи; LLM/MCP вне RT; «слух» — офлайн-рендер в отдельном потоке.

4.6 Стек

Слой Выбор
Язык ядра Rust stable (edition 2024), workspace
Оболочка Tauri 2 (WebView2/WKWebView/WebKitGTK)
UI Svelte 5 + Vite + TypeScript (зафиксировано)
Стили CSS custom properties + компонентные стили; без utility-фреймворка
Аудио cpal, собственный движок; symphonia (decode), rubato (SRC), rustfft (свёртка/спектр), rtrb
Состояние SQLite (rusqlite), контент-адресуемые файлы (blake3), журнал
Сериализация serde, JSON для команд, postcard/bincode для снапшотов
Типы UI ts-rs или specta/tauri-specta
Агент rust reqwest (OpenAI-совместимый), rmcp или JSON-RPC stdio, keychain
Тесты cargo-nextest, proptest, insta, criterion, Playwright, tauri-driver
Сборка cargo, Vite, Tauri bundler; AppImage/deb, dmg, msi
CI GitHub Actions: Linux (dummy audio, headless Chromium), Tauri build

4.7 Репозиторий

core/           zhila-core (домен, журнал), zhila-engine (звук), zhila-analysis,
                zhila-io, zhila-protocol, zhila-agent, zhila-cli
ui/             фронт (браузер-first), bridge/ws.ts, bridge/tauri.ts, canvas
app/            Tauri-оболочка, capabilities, updater, keychain
mcp/            внешний MCP-сервер (stdio) над протоколом
docs/           архитектура, решения, дизайн-система, протокол
fixtures/       тестовые сэмплы, проекты, эталонные рендеры

5. Объём v1

Область В v1 Приёмка Вне v1
Материал импорт WAV/AIFF/FLAC/MP3; запись входа; анализ (онисеты, темп, тональность, громкость); керн, грани, loop-точки; зум/скраб/audition; store с поиском 20-минутная запись режется за минуты; швы находятся; аудиоция без щелчков спектральное редактирование, source separation
Инструмент 16 граней, до 8 строк паттерна; gain/pan/tune/start/end/loop/reverse; полифония/чейз; климат жилы 16 граней играются паттерном; два камня не конфликтуют; CPU в бюджете клавишный маппинг, velocity-слои, round-robin (позже)
Композиция паттерны 16/32; камни; сцены; N жил; автоматизация климата/громкости/панорамы; луп-регион; метроном 2-минутная вещь из 4+ жил собирается и играет piano roll, аккорды/лад, генеративные правила
Микс gain/pan/mute/solo, климат на жиле, 2 сенда, мастер-лимитер, метры вещь не клиппует; сенды слышны; CPU VST/CLAP, группы, sidechain
Сессия журнал, undo/redo, автосейв, снапшоты, crash recovery, папка проекта, ассеты, экспорт/импорт закрыл/открыл — всё на месте; падение не теряет больше 10 с коллаборация, облако
Рендер WAV мастера и stems; офлайн быстрее реального времени 2 минуты рендерятся < 30 с; RMS/пик совпадают с реалтаймом видео, DDP
Агент BYOK, встроенный LLM, 14+ инструментов, трейс, стрим, область, diff, согласование, «слух» (рендер+анализ), локальный фолбэк 90% запросов — валидные действия; 0 разрушительных без согласования внешний MCP-рынок, автономные агенты
MCP stdio-сервер, те же инструменты, capabilities внешний клиент делает get_state/place_stone OAuth, мультипользовательский сервер
UI браузер-first; Tauri; 2 комнаты; descent + линза точности; кристалл; микшер; choir; онбординг; a11y северная звезда §1.2 мобильное, планшет
Платформы Linux — v1 (AppImage/deb); macOS/Windows — после сборки подписаны на Linux; PipeWire/ALSA/JACK проверены мобильные, macOS/Windows в v1

6. Поставка

Оценка для одного full-time разработчика с агентами. Недели — календарные, с запасом.

Фаза Недели Что Выход
P0. Решения и спайки 2–3 decision log (descent, паттерны, климат жилы, Linux, Svelte 5); спайк Tauri/WebKitGTK с descent-дизайном и линзой; спайк cpal (8 голосов, буферы, latency); протокол v0; репозиторий, CI; дизайн-система и interaction spec Браузерный UI ↔ Rust daemon играет сэмпл; Tauri-окно рисует descent на Linux; замеры latency/fps; решения зафиксированы
P1. Ядро и сессия 5–6 домен, журнал, снапшоты, SQLite, ассеты; движок: транспорт, плейбек срезов, голоса, шины, PDC, рендер; CLI; каркас UI с транспортом и плоской сеткой 8-тактовый проект командами: импорт → паттерн из 4 граней → играет → save/load → WAV; e2e и golden render
P2. Материал 5–6 импорт/запись, анализ, керн/грани, волна-редактор (зум, транзиенты, cut/loop, скраб), store, стена граней, audition 3 сэмпла → керны → 16 граней → audition; store ищет; анализ стабилен
P3. Инструмент и партитура 6–7 голосовой движок, климат на жиле, паттерны/кристалл, камни, descent + линза точности, сцены, N жил, автоматизация климата 16-тактовый эскиз из 5 жил и паттернов; всё играет; undo работает
P4. Микс и сессия 4–5 стрипы, pan/sends, климат-инсерт на жиле, мастер, метры; снапшоты/восстановление; a11y/типографика; stems; онбординг 2-минутная вещь; закрыл/открыл; stems; читаемо с клавиатуры
P5. Агент и harness 5–6 LLM-хост, инструменты, трейс, стрим, область, diff/approval, draft/seal, слух, MCP stdio; бюджеты, ключи Агент делает слой и правит вещь; внешний MCP-клиент; 0 разрушительных без согласования
P6. Полировка и бета 4–6 перформанс, WebKitGTK-фиксы, crash recovery, AppImage/deb, подписи, доки, бета 5–10 музыкантов на Linux v1.0-кандидат; метрики §1.4

Вехи: первая играющая петля — конец P1 (~9 нед.); материал→паттерн→аранжировка — конец P3 (~22 нед.); приватная бета — конец P5 (~30 нед.); v1.0 — конец P6 (~36 нед.).

Cut lines

  • MVP (если время поджимает): P0–P3 без сендов/автоматизации/MCP; 8 жил; только импорт; браузер; 16–20 недель. Уже даёт «сделать вещь и отрендерить».
  • Бета-срез: P0–P5, Linux, без stems, без расширенного маппинга.
  • Позже: плагины, MIDI-железо, коллаборация, мобильное, stretch, key mapping, рынок.

7. Тестирование и качество

  • Rust: unit + integration для домена/движка; proptest для журнала (apply → invert → хеш состояния); insta-снапшоты проекций и протокола.
  • Звук: детерминированный RNG; golden renders — RMS/пик/спектральный отпечаток с допусками; бенчи criterion на голоса/климат/рендер.
  • Протокол: контрактные тесты Rust↔TS (codegen), round-trip команд/событий/бинарных кадров.
  • E2E: Playwright против реального Rust-daemon в браузере: импорт, резка, паттерн, плей, undo, save/load, рендер, агентские вызовы. Tauri smoke: окно, шрифты, play, скриншот (WebDriver).
  • Soak: 8 часов, 8 жил, смена устройств, sleep/wake, xrun-лог.
  • Fuzz: импорт форматов, проект, журнал.
  • A11y: axe-core в Playwright, клавиатурные сценарии, контраст.
  • Перформанс-бюджеты в CI: frame time, время старта, CPU 16 голосов, latency.

8. Риски

Риск Вероятность/эффект Мера
WebKitGTK не тянет визуал/60 fps высокая/критический (Linux — единственная платформа v1) спайк P0; облегчённые эффекты; рельеф текстурой из Rust; при провале — смена оболочки (Electron/Chromium с Rust-ядром за протоколом), не языка
Движок и DSP съедают срок высокая/высокий v1 без плагинов/stretch; сначала плейбек срезов; при необходимости — консультант по Rust-аудио
Аудиоустройства/Linux latency высокая/высокий Linux-first, матрица устройств, настройки буфера, PipeWire/ALSA/JACK, xrun-логи
Linux-only v1 сужает аудиторию и бету высокая/средний бета через Linux-сообщества; macOS — следующий релиз; не подгонять UI под WebKitGTK ценой дизайна
Скоуп высокая/высокий cut lines, не-цели, фазы с выходом
Агент ненадёжен/дорог средняя/средний схемы инструментов, dry-run, согласование, бюджеты, BYOK, локальный фолбэк
Дизайн vs читаемость средняя/средний типографическая шкала, a11y-проход, тесты с музыкантами
Потеря данных средняя/высокий журнал, атомарные записи, автосейв, снапшоты, восстановление
Права на сэмплы низкая/средний клеймо/лицензия как метаданные, без юридических обещаний; не шипить чужие паки
Solo-время высокая/высокий агенты, cut lines, ранняя бета, «одна вещь до блеска»

9. Журнал решений

# Решение Выбор Альтернативы Статус
D1 Оболочка Tauri 2, браузер-first Electron, native egui принято
D2 Ядро Rust, собственный движок C++/JUCE+FFI, creek принято
D3 UI Svelte 5 + Vite SolidJS, React принято
D4 Протокол JSON-команды + бинарные события, WS dev / Tauri IPC prod только WS, только IPC принято
D5 Данные SQLite + контент-адресуемые ассеты, журнал-first JSON-файл, CRDT сразу принято
D6 Инструмент v1 16 граней + паттерны, без key mapping полноценный сэмплер с зонами принято
D7 Сетка descent — основной вид; flat — вторичный режим, если понадобится только flat принято 1 ноября
D8 Климат на жилу + dry/wet на камне; «сезон» — глобальный макрос мастер-инсерт принято 1 ноября
D9 Агент BYOK, embedded + MCP, draft/seal только MCP, только API принято
D10 Платформы Linux — v1; macOS/Windows после macOS-first, сразу три принято 1 ноября
D11 Кольцо режим повтора паттерна/камня с эрозией отдельный объект Ring принято как следствие
D12 Сенды/инсерты 2 сенда, климат-инсерт на жиле, встроенные эффекты без сендов в v1 обсуждается
D13 Точность descent линза у курсора + фокус-полоса + ручки ближних камней плоская доска как основной обсуждается в P0

10. Первые две недели (когда скажешь «поехали»)

День 1–2. Decision log: оболочка, UI, протокол, данные, объём v1; список не-целей; критерии севера.

День 3–5. Спайк A — Tauri/WebKitGTK. Окно с descent-рельефом, шрифтами, одной панелью, линзой/фокус-полосой, 60 fps canvas и облегчённым режимом. Замеры: старт, frame time, canvas, фильтры, шрифты.

День 6–8. Спайк B — Rust audio. cpal: 8 голосов, буферы 64/128/256, latency, старт/стоп без щелчков, метры/волна в UI через протокол. Проверить PipeWire/ALSA.

Неделя 2. Скелет репозитория (crates, Svelte 5 UI, protocol codegen, CI), архитектурная записка, дизайн-система и interaction spec; вертикальный срез: кнопка в UI → команда Rust → сэмпл играет → метр назад.

Выход P0: решения зафиксированы, риски WebKitGTK и latency измерены, есть репозиторий и «hello engine». Только после этого — P1.


11. Открытые вопросы

  1. План B при провале WebKitGTK: Electron с Rust-ядром или native-окно? Решается после спайка P0.
  2. Точность descent: линза у курсора + фокус-полоса + ручки ближних камней — достаточно? Или нужна плоская доска как обязательный второй режим? Главный дизайн-вопрос P0.
  3. Микшер: ресницы как метры или как фейдеры? Где грань между жестом и точностью?
  4. Паттерн: 8 строк-граней достаточно или piano roll нужен уже в v1?
  5. Сенды: 2 сенда в v1 или позже?
  6. Агент по умолчанию: DeepSeek (есть ключ) или провайдеро-нейтральный BYOK с пустым стартом?
  7. Контент: стартовая библиотека — CC0-полевки или пустой карьер с онбордингом?
  8. Имя/домен/торговая марка: проверять сейчас или на бете?