40 KiB
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 Северная звезда (приёмочный сценарий)
На бете новый человек без документации:
- открывает ZHILA с готовой вещью и слышит её в один клик;
- импортирует три своих сэмпла, видит найденные швы, режет на грани;
- собирает паттерн, кладёт его в аранжировку, делает 2-минутную вещь;
- один раз просит агента добавить/убрать и принимает или отклоняет правку;
- сохраняет, закрывает, открывает, рендерит 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. Принципы
Дизайн
- Одна поверхность: никаких карточек, радиусов и теней. Регионы — провалы, линии и свет.
- Звук — рельеф. Все аудиоданные (волна, уровень, спектр, ноты) рисуются как порода, а не как плашки в рамках.
- Сверху агент, снизу руки. Режим
choir / handменяет свет и права, а не прячет половину. - Клеймо — память, не полиция. Происхождение видно, но не мешает работать.
- Движение только там, где оно что-то сообщает. Одна оркестровка на загрузку, дальше — отклик.
- Типографика как надпись: антиква для голоса, моногарнитура для протокола. Читаемость важнее атмосферы, но не вместо неё.
Инженерия
- Ядро — источник истины. UI — проекция. Никакого состояния, которое живёт только в вебвью.
- Один журнал команд. Человек, API и MCP ходят через него. Undo, аудит и коллаборация — производные.
- Материал неизменяем, размещение ссылается. Удаление — «закопать». Керн нельзя испортить.
- Аудиочасы — мастер. Время песни, керна и кольца резолвятся в сэмпл-фреймы.
- Реальное время без аллокаций в аудиопотоке и без блокировок на пути звука.
- Движок за протоколом. Оболочка (Tauri/Electron/браузер) заменяема без переписывания звука.
- Детерминизм: одинаковый проект + одинаковые команды → одинаковый рендер (для тестов и агента).
- Агент — актор, а не хозяин: права, черновик, согласование, бюджет.
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 Ключевые сценарии
- Первый сэмпл. Открыть демо-вещь →
play→ спуститься в карьер → импорт → анализ находит 7 швов → резать → audition грани → назначить строку паттерна. - Петля. Выбрать жилу → кристалл → 16 шагов, 3 строки граней, velocity/pitch → длина паттерна 2 такта → перетащить камень в аранжировку → слушать.
- Агент. Выделить сцену → «стало тесно, убери голос и затемни» → агент предлагает draft с diff → принять → погода и камни изменились → undo доступен.
- Микс. Открыть микшер → pan/sends → ресницы танцуют → мастер-лимитер → рендер WAV и stems.
- Сессия. Автосейв → закрыть → открыть → всё на месте → экспорт.
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. Открытые вопросы
- План B при провале WebKitGTK: Electron с Rust-ядром или native-окно? Решается после спайка P0.
- Точность descent: линза у курсора + фокус-полоса + ручки ближних камней — достаточно? Или нужна плоская доска как обязательный второй режим? Главный дизайн-вопрос P0.
- Микшер: ресницы как метры или как фейдеры? Где грань между жестом и точностью?
- Паттерн: 8 строк-граней достаточно или piano roll нужен уже в v1?
- Сенды: 2 сенда в v1 или позже?
- Агент по умолчанию: DeepSeek (есть ключ) или провайдеро-нейтральный BYOK с пустым стартом?
- Контент: стартовая библиотека — CC0-полевки или пустой карьер с онбордингом?
- Имя/домен/торговая марка: проверять сейчас или на бете?