Files
shturman/docs/roadmap.md
T

177 lines
14 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.
# Роадмапа
> Фазы реализации лестницей: каждая ступень — законченный, **демонстрируемый**
> артефакт. Порядок диктуется зависимостями из [architecture.md](architecture.md)
> и [capability-catalog.md](capability-catalog.md).
## Как читать
- **ID** (`A01`, `D10`, …) ссылаются на строки [capability-catalog.md](capability-catalog.md).
Фазы там — источник; роадмапа их **секвенирует и группирует в треки**, не переопределяет.
- Каждая фаза = **ступень-демо**, по шаблону: **Цель/демо · Входит** (ID по параллельным
трекам) **· Зависимости/порядок · Готово, когда · 🟡 гейты**.
- **Составные фазы каталога** (`vN/vM`) размещены по **старту**; завершение/доводка —
пометкой в поздней фазе.
- **dev-environment проектируется рано** (до v0-реализации) и идёт сквозным треком —
не на критическом пути, но разблокирует каждую фазу.
- Учтены все **170** функций: 150 в v0v4 + 20 «[за горизонтом v4](#за-горизонтом-v4-laterongoing)».
---
## v0 — База + Shell · *критпуть: образ/power-safe → UI*
- **Цель/демо:** RK3588 стартует **< 10 c** в красивый Slint-лаунчер (день/ночь, крупные
тайлы) и переживает отключение зажигания без повреждения eMMC. Демо: вкл/выкл в машине →
мгновенный UI, без fsck-боли.
- **Входит:**
- *Образ / ФС / boot (A):* `A01 A02 A04 A05 A06 A07 A09 A10 A11 A12 A14 A15 A16 A17`
- *Power / lifecycle (B):* `B01 B02 B03 B04 B05 B06 B07 B08 B09` + старт thermal `B10`
- *Shell (C):* `C01 C02 C03 C04 C05 C07 C09` + зародыш настроек `C10`
- *Dev-enabling (F/J, параллельно):* `F01 F02 F03 F04` + камера-сим `J06`
- **Зависимости/порядок:** hardware HAL/BSP → образ `A` → power `B` (graceful shutdown требует
hold-up, hardware §3) → shell `C` (первый кадр Stage 1 поверх boot Stage 0). Power-safe — гейт демо.
- **Готово, когда:** холодный boot < 10 c до интерактивного home · N циклов зажигания без
потери `/data` · автопереключение день/ночь.
- **🟡 гейты:** `A01` (Armbian/Debian vs Yocto), `A02` (f2fs vs ext4), `B08/B09`
(**MCU vs supercap-only** — определяет архитектуру питания). Фундамент — закрыть в v0.
---
## v1 — Ассистент онлайн + связь + аудио + Location · *критпуть: ассистент-онлайн*
- **Цель/демо:** «Штурман, …» → корректный устный RU-ответ через online-LLM; аудио-арбитр
жив (TTS с ducking); статус сети в баре; громкость с руля; distraction по GPS-скорости.
Демо: голосовой Q&A в машине.
- **Входит:**
- *Ассистент (D):* `D01 D02 D03 D04 D05 D06 D07 D08 D09 D11` + distraction `D12`
- *Связь — core (G):* `G01 G02 G03`
- *Аудио-плоскость — core (H):* `H01 H02 H03 H04 H05`
- *Location / датчики (K):* `K01 K02 K03 K04` + старт мультируль-ADC `K05`
- *Shell-интеграция (C):* `C11` (PTT+лог) + старт distraction `C12` + старт мультируль `C13`
- *База-доводка (A/B):* `A08` (GPS-время) `A13` (thermal-тюнинг) `B11` (MCU firmware)
`B12` (старт sleep/wake) `B13` (гейт wake-word)
- **Зависимости/порядок:** `G01`(сеть) → `D08`(online-LLM); `H01`(аудио-плоскость) → `D04`(TTS);
`K01`(Location) → `C12`/`D12`(distraction по GPS-скорости); `B13``D` (гейт wake-word по lifecycle).
Всё поверх v0-базы/shell.
- **Готово, когда:** голосовой вопрос → устный RU-ответ при сети · «нет сети» graceful (`D11`) ·
громкость с руля (`K05`) · distraction-режим по GPS-скорости.
- **🟡 гейты:** `B08/B09` (если MCU не закрыт в v0 — гейтит `B11`/`B12`); `K05` (маппинг кнопок
руля / калибровка ADC — per-BSP). Офлайн-LLM ещё НЕ здесь (→ v3).
---
## v2 — Контекст машины (killer) + телефон + медиа + камера · *критпуть: контекст машины*
- **Цель/демо:** «Штурман, прочитай ошибки» / «что значит эта лампочка» → ассистент читает
live-OBD + DTC и объясняет по-человечески (**vehicle-context injection**). **Killer-демо.**
Плюс: hands-free звонки, локальная/BT-музыка с now-playing, задняя камера с парктроником.
- **Входит:**
- *Vehicle-Data (E):* `E01 E02 E03 E04 E05 E06` + `E07` (pending/permanent) + старт расход `E08`
- *Контекст-ассистент (D):* `D10` (**vehicle-context injection**)
- *Телефон (G):* `G04 G05 G06 G07 G08 G09` + старт tethering `G10`
- *Медиа (H):* `H06 H07 H08 H09 H10` + первый Wayland-surface `C06` (now-playing)
- *Камера (J):* `J01 J02 J03 J04 J05` + Stage 0 boot-инфра `A18`
- *Прочее:* статус машины в баре `C08` · CAN-кнопки руля `K06` · старт реверс-wake `B14` ·
старт телеметрии (opt-in, выключена) `L07`
- **Зависимости/порядок:** `E`(CAN-транспорт)+data-model → `D10`(контекст), поверх v1-ассистента
(`D06`/`D08`). BT-адаптер `G04``H08`(A2DP) и `G05`(HFP). `A18`(Stage 0) → `J01`(ранний путь
камеры). `C06`(полный композитор) → первая поверхность `H07`/`J04`.
- **Готово, когда:** ассистент по голосу читает реальные DTC и объясняет · hands-free звонок
(руль/тач) · локальный трек и BT-музыка с now-playing · задняя камера с парктроник-оверлеем
и fail-safe «нет сигнала».
- **🟡 гейты:** `E03` (DTC-база: своя RU vs готовая), `H06` (декодер / AAC-патент — legal),
`J01` (DRM-master handoff Stage 0→1).
---
## v3 — Офлайн-фолбэк + Plugin API + companion · *критпуть: офлайн + расширяемость*
- **Цель/демо:** ассистент отвечает **без сети** (локальная модель); сторонний **плагин**
(intent/tile) ставится в песочнице с ревью разрешений; **companion**-приложение на телефоне
видит данные машины/поездки. Демо: офлайн + экосистема.
- **Входит:**
- *Офлайн-ассистент (D):* `D13` (provider-switch + офлайн-фолбэк llama.cpp) `D14` (память
водителя) `D15` (plugin-интенты)
- *Plugin host (F):* `F05 F06 F07 F08 F09 F10` + старт подписи `F11`
- *Связь — later (G):* `G11` (WiFi-hotspot) `G12` (SMS/MAP + чтение вслух)
- *Медиа-расширения (H):* `H11` (FM-радио) `H12` (стриминг) `H13` (интернет-радио)
`H14` (media-source-плагины)
- *Companion (L):* `L01 L02 L03 L04 L05` + старт уведомлений `L06` + старт бэкапа `L08`
- *Shell:* `C14` (UI управления разрешениями)
- **Зависимости/порядок:** `F`(lifecycle плагина) поверх App-Host + atomic-install (a-base §3);
`D15`(plugin-интенты) → `F` + plugin-sdk; `L01`(companion) → `G`(транспорт) + паринг `L02`;
`C14`(perm-UI) → `F10`(capability-review) + security-privacy. Офлайн-LLM поверх v1-пайплайна;
companion читает `E`(v2) / trip-плагин.
- **Готово, когда:** сеть выключена → ассистент локально отвечает (`D13`) · сторонний плагин
ставится/песочница/ревью разрешений · телефон-companion синкает настройки/память/поездки
(local-first).
- **🟡 гейты:** `D13` (выбор офлайн-модели — бенч на железе), `D14` (схема памяти / consent),
`F11` (схема подписи / keyring / ревокация), `H11` (FM-тюнер: аппаратно добавить vs отказаться —
нет в hardware §4), `L03` (моб.стек: Flutter vs Rust-core+native),
`L06` (push-транспорт: relay vs APNs/FCM vs локально).
---
## v4 — Навигация + OTA + прод-образ + ретрофит · *критпуть: первый «продукт»*
- **Цель/демо:** офлайн-навигация OSM с голосовым turn-by-turn; **флешируемый релиз-образ**;
**OTA** A/B с откатом; **документированный ретрофит на одну реальную машину**. Демо: первый продукт.
*(«образ» здесь = флешируемый прод-релиз, отличать от bring-up/base-образа v0 —
см. [a-base-system](domains/a-base-system.md) §2.)*
- **Входит:**
- *Навигация (I):* `I01 I02 I03 I04 I05 I06 I07 I08 I09 I10 I11 I12 I13` + nav-позиционирование `K09`
- *OTA / прод-образ / безопасность (A):* `A03` (флеш-образ RAUC) `A19` (OTA) `A20` (secure boot)
`A21` (at-rest шифрование) `A22` (factory reset)
- *OTA-канал / облако (L):* `L09 L10 L11 L12 L13`
- *Проекция (опционально):* `G13` (CarPlay/Android Auto — вне скоупа / плагин / неопр.)
- **Зависимости/порядок:** `I`(роутинг) → движок (🟡); `I`(карты) → хранилище + покрытие;
`I06`(map-matching) → `K`(Location, v1); `I05`(turn-by-turn) → аудио (H §3) + `D`. OTA:
`A19`(механизм/применение) ↔ `L09`(канал/доставка); `A20`(secure boot) → `A21`(at-rest) →
trust-anchor для `F11`(подпись, v3). Nav поверх `K`/`H`/`D` (v1).
- **Готово, когда:** маршрут офлайн с голосовым ведением в загруженном регионе · релиз-образ
прошивается · OTA доставляет/применяет/откатывает (anti-rollback) · **ретрофит на одну машину
задокументирован** (BSP / калибровка / гайд).
- **🟡 гейты:** `I03` (Valhalla vs OSRM), `I01` (карты + ODbL-атрибуция + размещение данных),
`G13` (проекция — решить scope/legal).
---
## Сквозные треки (не привязаны к одной фазе)
- **Dev-environment + моки** *(проектируется до v0, параллельно всем фазам).* Разблокирует
разработку без железа: fake-аудио/BT/камера/plugin-host (внесены) + **хвост:** L мок-облако/OTA
и I нав-сим (тест-регион/мок-маршрут). ID: `F02 F03 F04 J06` + доменные dev-симуляторы
(G/H/I/L §«Dev-симулятор»). Не на критпути.
- **Security/privacy-гейтинг** *(растёт по фазам).* Capability-модель (security-privacy §3)
включается с первого чувствительного ресурса: `audio_in` (v1) → `camera_in`/location-consent
(v2) → plugin-capability-review + perm-UI `C14` (v3) → secure-boot/at-rest/trust-anchor (v4).
- **Цепочка доверия OTA.** Подпись плагинов `F11` (v3) → secure boot `A20` + signed OTA
`A19`/`L09` (v4) образуют единую trust-цепочку с anti-rollback.
## Критический путь (узким списком)
```
hardware/BSP → A(образ) → B(power-safe) → C(shell) ⟶ v0
→ G01(сеть) + H01(аудио) → D(ассистент) ⟶ v1
∟ K01(Location) → distraction (C12/D12) — параллельно
→ E(CAN read) → D10(контекст — killer) ⟶ v2
→ D13(офлайн-LLM) + F(Plugin API) ⟶ v3
→ I(навигация) + A19/L09(OTA) + ретрофит ⟶ v4
```
Параллельно (не на критпути): телефон/медиа/камера (v2-треки рядом с `E`), companion (v3),
dev-environment (сквозной).
## За горизонтом v4 (later/ongoing)
Доразвитие из тех же доменов по мере спроса — не входит в лестницу v0–v4:
- **База:** `A23` (мульти-BSP) · `A24` (kernel/dtb-тюнинг — *ongoing*).
- **Shell/ассистент:** `C15` (мультидисплей / профили / виджеты) · `D16` (barge-in).
- **Vehicle-Data:** `E09` (trip-производные — *у плагина*) · `E10` (fuel-trim) `E11` (VIN)
`E12` (DBC-сниффинг) `E13` (vendor-DTC) `E14` (лог поездок).
- **Экосистема/медиа:** `F12` (курируемый стор) · `H15` (мульти-зона / EQ / A2DP-source).
- **Навигация:** `I14` (трафик TMC/RDS) `I15` (онлайн-трафик/поиск) `I16` (DR в тоннелях).
- **Камеры/датчики:** `J07` (0..N источников) `J08` (dashcam) `J09` (surround/360°) ·
`K07` (IMU) `K08` (выделенные не-CAN датчики).