From cd967cced4ec68c3efe5ae9cfd05d5d100fd633b Mon Sep 17 00:00:00 2001 From: Emil Date: Sun, 1 Nov 2026 00:11:31 +0300 Subject: [PATCH] Import ZHILA plan and reference demo --- .gitignore | 11 ++ README.md | 5 + docs/PLAN.md | 363 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 379 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docs/PLAN.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b4e087b --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +target/ +node_modules/ +dist/ +build/ +*.log +.env +.env.* +.DS_Store +reference/demo/node_modules/ +reference/demo/render.wav +reference/demo/test.wav diff --git a/README.md b/README.md new file mode 100644 index 0000000..cc6801b --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# ZHILA + +Sound is terrain. A sampling instrument with an agent on the same verbs as the hand. + +P0 is in progress: the Rust core, the local protocol and the browser surface. See `docs/PLAN.md`. diff --git a/docs/PLAN.md b/docs/PLAN.md new file mode 100644 index 0000000..f5247f4 --- /dev/null +++ b/docs/PLAN.md @@ -0,0 +1,363 @@ +# ZHILA — план проекта + +Черновик v1.1 · 1 ноября 2026 +Статус: **план**. Код проекта не начат. Демо `zhila/` — референс, не кодовая база. + +**Зафиксировано 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. **Имя/домен/торговая марка:** проверять сейчас или на бете?