# 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. **Имя/домен/торговая марка:** проверять сейчас или на бете?