Files
zhila/docs/PLAN.md
T

364 lines
40 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ZHILA — план проекта
Черновик v1.1 · 1 ноября 2026
Статус: **P0, P1a, P1b, P1c и P1d выполнены** (см. `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. **Имя/домен/торговая марка:** проверять сейчас или на бете?