Files

187 lines
22 KiB
Markdown
Raw Permalink 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.
# Роадмапа (детальный план исполнения)
> Фазы реализации лестницей: каждая ступень — законченный **демонстрируемый** артефакт.
> Каждая фаза разложена на **упорядоченные вехи** с зависимостями, способом теста **без
> машины** (принцип #13) и проверяемым критерием готовности. Порядок диктуется
> зависимостями из [architecture.md](architecture.md) и [capability-catalog.md](capability-catalog.md).
## Как читать
- **ID** (`A01`, `D10`…) — строки [capability-catalog.md](capability-catalog.md); фазы оттуда, roadmap их **секвенирует**.
- **Веха** `vN.k` — атомарный шаг внутри фазы: *что заработало · ID · зависит-от · тест без машины · готово-когда (acceptance)*.
- **Тест без машины** ссылается на dev-симуляторы ([dev-environment.md](dev-environment.md)): Vehicle Simulator, fake-GPS/аудио/BT/камера, plugin-host-харнесс, нав-сим, мок-облако/OTA.
- Все **170** функций: 150 в вехах v0–v4 + 20 «[за горизонтом](#за-горизонтом-v4)».
- Числа-бюджеты (латентность/пороги) — из [performance.md](contracts/performance.md) и [safety.md](contracts/safety.md) (помечены 🟡, финал на железе/HMI).
## Сводная лестница
| Фаза | Демо (killer-артефакт) | Вехи | Критпуть-звено |
|------|------------------------|------|----------------|
| **v0** | вкл/выкл в машине → мгновенный красивый UI, переживает срыв питания | v0.1–v0.6 | образ → power-safe → shell |
| **v1** | «Штурман, …» → устный RU-ответ; аудио с ducking; distraction по GPS | v1.1v1.7 | ассистент-онлайн |
| **v2** | «прочитай ошибки / что значит лампочка» → live OBD+DTC по-человечески | v2.1–v2.7 | **контекст машины (killer)** |
| **v3** | ответ **без сети** + установка стороннего **плагина** + companion-телефон | v3.1v3.5 | офлайн + Plugin API |
| **v4** | офлайн-навигация + OTA + **документированный ретрофит на реальное авто** | v4.1–v4.5 | первый «продукт» |
---
## v0 — База + Shell · *критпуть: образ → power-safe → UI*
**Демо:** подаём питание → RK3588 за **< 10 c** (потолок; цель — быстрее) в красивый Slint-лаунчер
(день/ночь, крупные тайлы); глушим зажигание → graceful shutdown без повреждения eMMC; повторяем цикл.
| Веха | Заработало | ID | Зависит | Тест без машины | Готово, когда |
|------|-----------|----|---------|-----------------|---------------|
| **v0.1** Образ-болванка | грузится, `/data` монтируется | A01 A02 A06 A17 | hardware/BSP | Lima-VM | init поднялся; RO-rootfs A/B + overlay + `/data` ок |
| **v0.2** Boot-конвейер | splash → таргет фазами | A04 A05 A15 | v0.1 | VM boot | Stage 0/1/2 разделены; splash мгновенно |
| **v0.3** Power-safe ядро | переживает срыв питания | B01 B03 B04 B02 B06 B07 A14 B05 | v0.2, hold-up (hw §3) | fake-ACC + power-cut в VM | N циклов зажигания без потери `/data`; abort до PONR |
| **v0.4** MCU/thermal fail-safe | аппаратный фундамент питания/тепла | B08 B09 B10 A12 | v0.3, мок-MCU | мок-MCU/sensor | thermal-trip → graceful; MCU-таймер режет питание, если SoC завис |
| **v0.5** Shell первый кадр | красивый home, день/ночь | C03 C04 C01 C05 C02 C07 C09 C10 | v0.2, design-system | нативный Slint + VM | до интерактива < бюджет (perf §3); авто день/ночь |
| **v0.6** База-доводка + dev-харнесс | память/лог/eMMC + dev-цикл | A09 A10 A11 A07 A16 F01 F02 F03 F04 J06 | паралл. v0.1v0.5 | сам harness | dev-итерация без железа работает; память/лог/eMMC в бюджете |
**Порядок/параллелизм:** v0.1→v0.2 строго; затем v0.3 (power) и v0.5 (shell) **параллельно** поверх v0.2;
v0.4 после v0.3; v0.6 — сквозной enabling-трек (нужен для разработки всех остальных).
**🟡 гейты:** `A01` (Armbian/Debian vs Yocto) · `A02` (f2fs vs ext4) · `B08/B09` (**MCU vs supercap-only** — определяет v0.4). Закрыть в v0: это фундамент.
---
## v1 — Ассистент онлайн + связь + аудио + Location · *критпуть: ассистент-онлайн*
**Демо:** «Штурман, …» → корректный устный RU-ответ через online-LLM; аудио-арбитр (TTS с ducking);
сеть в статус-баре; громкость с руля; distraction-режим по GPS-скорости.
| Веха | Заработало | ID | Зависит | Тест без машины | Готово, когда |
|------|-----------|----|---------|-----------------|---------------|
| **v1.1** Аудио-плоскость | роли + ducking + вывод | H01 H02 H05 H04 | v0 (PipeWire/WirePlumber) | fake-аудио (H §12) | ducking-лестница работает; громкость с руля (perf: ducking ≤150 ms) |
| **v1.2** Location/датчики | валидная скорость/курс | K01 K02 K03 K04 A08 | v0, fake-GPS | NMEA-реплей | `ru.shturman.Location` публикует zero-clamp-скорость; time-sync от GPS |
| **v1.3** Связь-core | online/portal/offline | G01 G02 G03 | v0, NM/MM | мок-сеть (управляемые состояния) | portal/limited не врёт «online»; статус в баре (C07) |
| **v1.4** Ассистент-пайплайн (офлайн-узлы) | wake→STT→TTS локально | D01 D02 D03 D04 D05 H03 | v1.1, mic | моки STT(текст)/TTS(лог) | «Штурман»→STT→TTS офлайн; AEC держит wake во время медиа (wake ≤400 ms) |
| **v1.5** Интенты + онлайн-LLM | устный ответ при сети | D06 D07 D08 D09 D11 | v1.4, v1.3 (для D08) | мок-LLM (canned) + мок-сеть | голос→ответ; «нет сети» graceful; локальный интент ≤300 ms без LLM |
| **v1.6** Distraction + руль | безопасный UI на ходу | C11 C12 D12 C13 K05 | v1.2 (скорость), v1.4, safety §4 | fake-GPS speed + мок-руль | distraction по порогам safety §4; навигация/громкость рулём |
| **v1.7** База-доводка v1 | lifecycle-гейты | A13 B11 B12 B13 | v0.4 | мок | wake-word гейтится состояниями; sleep/wake базово |
**Порядок/параллелизм:** v1.1/v1.2/v1.3 — **параллельно** поверх v0; v1.4 после v1.1 (аудио); v1.5 после v1.4+v1.3;
v1.6 после v1.2+v1.4; v1.7 параллельно.
**🟡 гейты:** `K05` (маппинг руля / ADC-калибровка — per-BSP) · `B08/B09` (если MCU не закрыт в v0). distraction-числа (safety §4) — подтвердить на HMI. *Офлайн-LLM — НЕ здесь (v3).*
---
## v2 — Контекст машины (killer) + телефон + медиа + камера · *критпуть: контекст машины*
**Демо:** «Штурман, прочитай ошибки» / «что значит эта лампочка» → ассистент читает live-OBD + DTC и
объясняет по-человечески (**vehicle-context injection**). Плюс hands-free звонки, локальная/BT-музыка, задняя камера.
| Веха | Заработало | ID | Зависит | Тест без машины | Готово, когда |
|------|-----------|----|---------|-----------------|---------------|
| **v2.1** CAN-транспорт | live-сигналы | E01 E04 E06 E05 | v0/v1, data-model, hw(CAN), ISO-TP | Vehicle Simulator (ELM327-emu + vcan) | live-сигналы с rate-cap ~1020 Гц; `engine_running` (не дублирует Power) |
| **v2.2** DTC + диагностика | чтение ошибок | E02 E03 E07 E08 | v2.1, DTC-база | симулятор инжектит `P0420` | читает реальные DTC + RU-расшифровка |
| **v2.3** Vehicle-context (**KILLER**) | объяснение по голосу | D10 C08 | v2.2, v1-ассистент (D06/D08) | симулятор `P0420` → объяснение по-русски | **killer-demo**: голос «что за ошибка» → live OBD+DTC → человеческое объяснение |
| **v2.4** Телефон | hands-free | G04 G05 G06 G07 G08 G09 G10 | v1.1 (phone_call), v1.6 (руль), BT, D §6 | fake-BT-стек (G §12) | звонок руль/тач; контакты PBAP; входящий-оверлей vs реверс |
| **v2.5** Медиа | музыка + now-playing | H06 H07 H08 H09 H10 C06 | v2.4 (BT-адаптер), v1.1, storage | синтет-медиа + fake-A2DP | локальный трек + BT-музыка; now-playing как первая Wayland-поверхность |
| **v2.6** Камера | задняя камера + парктроник | A18 J01 J02 J03 J04 J05 K06 B14 | v2.1 (E), C06 (surface), A §4/B §7 | fake-камера (паттерн/no-signal/реверс) | реверс→камера приоритетно; парктроник-оверлей; fail-safe «нет сигнала» |
| **v2.7** Телеметрия-задел | opt-in, выключена | L07 | security-privacy §7, consent | мок-телеметрия-sink | по умолчанию ноль egress; consent-гейт |
**Порядок/параллелизм:** v2.1→v2.2→v2.3 (killer-цепочка, критпуть); v2.4→v2.5 (BT-адаптер раньше A2DP);
v2.6 после v2.1+C06; v2.4/v2.5/v2.6/v2.7 — параллельно killer-цепочке.
**🟡 гейты:** `E03` (DTC-база: своя RU vs готовая) · `H06` (декодер/AAC-патент — legal) · `J01` (DRM-master handoff Stage 0→1).
---
## v3 — Офлайн-фолбэк + Plugin API + companion · *критпуть: офлайн + расширяемость*
**Демо:** ассистент отвечает **без сети** (локальная модель); сторонний **плагин** (intent/tile) ставится в
песочнице с ревью разрешений; **companion**-приложение на телефоне видит данные машины/поездки.
| Веха | Заработало | ID | Зависит | Тест без машины | Готово, когда |
|------|-----------|----|---------|-----------------|---------------|
| **v3.1** Plugin host | песочница + lifecycle | F05 F06 F07 F08 F09 F10 C14 | v0 (App-Host, a-base §3), plugin-sdk, sec-priv | plugin-host-харнесс (F) | сторонний плагин install/update/remove в песочнице; ревью разрешений (perm-UI C14) |
| **v3.2** Plugin-интенты + подпись | расширение ассистента | D15 F11 | v3.1, v1-ассистент (D06) | тест-плагин с intent | плагин регистрирует интент, ассистент его зовёт; подпись манифеста |
| **v3.3** Офлайн-ассистент | работает без сети | D13 D14 | v1-пайплайн, storage | мок-сеть off + локальная мелкая модель | сеть выключена → локальный ответ; память водителя (`.md`) |
| **v3.4** Companion | телефон видит машину | L01 L02 L03 L04 L05 L06 L08 | v1.3 (G), v2 (E/trip-плагин) | фейк-companion-peer + мок-облако | паринг; синк настроек/памяти/поездок local-first; бэкап |
| **v3.5** Связь+медиа-расширения | hotspot/SMS/радио/стриминг | G11 G12 H11 H12 H13 H14 | v1.3, v3.1 (для H14), network | моки сети/медиа | WiFi-hotspot; SMS-чтение; media-source через плагин |
**Порядок/параллелизм:** v3.1→v3.2 (host перед интентами/подписью); v3.3 поверх v1-пайплайна (независимо);
v3.4 после v3.1+v2; v3.5 после v3.1.
**🟡 гейты:** `D13` (офлайн-модель) · `D14` (схема памяти/consent) · `F11` (схема подписи) · `L03` (моб-стек) · `L06` (push-транспорт) · `H11` (FM-тюнер: аппаратно vs отказаться).
---
## v4 — Навигация + OTA + прод-образ + ретрофит · *критпуть: первый «продукт»*
**Демо:** офлайн-навигация OSM с голосовым turn-by-turn; **флешируемый релиз-образ**; **OTA** A/B с откатом;
**документированный ретрофит на одну реальную машину**.
*(«образ» здесь = флешируемый прод-релиз, отличать от bring-up base-образа v0 — [a-base §2](domains/a-base-system.md).)*
| Веха | Заработало | ID | Зависит | Тест без машины | Готово, когда |
|------|-----------|----|---------|-----------------|---------------|
| **v4.1** Карты + рендер | карта офлайн | I01 I02 I04 I08 | tech-stack, хранилище, C §4, G §2 | нав-сим (тест-регион PMTiles) | карта рендерится офлайн (GPU); детект «вне региона»; геокодер |
| **v4.2** Роутинг + ведение | маршрут с голосом | I03 I05 I06 I07 I09 I10 I11 I12 I13 K09 | v4.1, v1.2 (Location), v1.1 (аудио), D §6 | мок-маршрут (rerouting/maneuver) | turn-by-turn-ведение; map-matching; назначение голосом; resume |
| **v4.3** Прод-образ + secure boot | флешируемый релиз | A03 A20 A21 A22 | v0-образ, hardware | флеш на железо (HW-in-the-loop) | релиз-образ прошивается; verified boot; `/data` шифрован; factory reset |
| **v4.4** OTA-канал | обновления с откатом | A19 L09 L10 L11 L12 L13 | v4.3 (trust-anchor), v3.4 (паринг), F11 | мок-облако/OTA (подписанные/битые/downgrade) | OTA доставляет/применяет/откатывает; anti-rollback; каналы stable/beta |
| **v4.5** Ретрофит + опц. | первый продукт на авто | G13 | всё v0–v4 на реальном авто | реальная установка | **документированный ретрофит на одну машину** (BSP/калибровка/гайд) |
**Порядок/параллелизм:** v4.1→v4.2 (карты перед роутингом); v4.3→v4.4 (secure boot trust-anchor перед signed OTA);
нав-ветка (v4.1/v4.2) и OTA-ветка (v4.3/v4.4) **параллельны**; v4.5 — финал, требует всего.
**🟡 гейты:** `I03` (Valhalla vs OSRM) · `I01` (карты + ODbL-атрибуция + размещение данных) · `G13` (проекция — scope/legal).
---
## Сквозной критический путь (по вехам)
```
hardware/BSP → v0.1(образ) → v0.2(boot) → v0.3(power-safe) ┬→ v0.5(shell) ⟶ v0
└→ v0.4(MCU/thermal)
→ v1.1(аудио)+v1.2(Location)+v1.3(сеть) → v1.4(пайплайн) → v1.5(LLM онлайн) ⟶ v1
→ v2.1(CAN) → v2.2(DTC) → v2.3(контекст — KILLER) ⟶ v2
→ v3.1(plugin-host) → v3.3(офлайн-LLM) ⟶ v3
→ v4.1(карты) → v4.2(роутинг) ‖ v4.3(secure boot) → v4.4(OTA) → v4.5(ретрофит) ⟶ v4
```
Параллельно (не на критпути): телефон/медиа/камера (v2.4v2.6), companion (v3.4), расширения (v3.5),
нав- и OTA-ветки v4 идут одновременно. Сквозной enabling-трек — dev-environment (v0.6, далее везде).
## Риск-реестр (🟡-гейты: что выбрать и к какой фазе)
| Гейт | Выбор между | Решить к | Владелец-док |
|------|-------------|----------|--------------|
| `A01` база-образ | Armbian/Debian vs Yocto | **v0** | a-base §2 |
| `A02` ФС `/data` | f2fs vs ext4 | **v0** | a-base §3 |
| `B08/B09` питание | MCU-копилот vs supercap-only | **v0** | b-power §5, hardware §3 |
| distraction-пороги | числа км/ч + список блокируемого | **v1** (на HMI) | safety §4 |
| перф-бюджеты | латентные числа (кадр/голос/ввод…) | по фазам | performance §3 |
| `K05` мультируль | маппинг кнопок / ADC-калибровка | v1/v2 | k-sensors §3 |
| `E03` DTC-база | своя RU из открытых списков vs готовая | **v2** | e-vehicle-data §5 |
| `H06` декодер | `symphonia` + AAC-патент (юр-проверка) | **v2** | h-media §5 |
| `J01` камера | DRM-master handoff Stage 0→1 | **v2** | j-cameras §3 |
| `D13` офлайн-LLM | YandexGPT Lite / T-lite / Qwen + квантизация | **v3** | d-assistant §5 |
| `D14` память водителя | что авто-запоминать / схема / consent | **v3** | d-assistant §7 |
| `F11` подпись | формат / keyring / ревокация | **v3** | f-plugin §3, sec-priv §6 |
| `L03` моб-стек | Flutter vs Rust-core+native | **v3** | l-cloud §3 |
| `L06` push-транспорт | self-relay vs APNs/FCM vs локально | **v3** | l-cloud §5 |
| `H11` FM-тюнер | добавить аппаратно vs отказаться | **v3** | h-media §7, hardware §4 |
| `A19` OTA-тул | RAUC vs Mender/swupdate/OSTree | **v4** (раньше подтвердить) | a-base §5 |
| `I03` роутинг | Valhalla vs OSRM | **v4** | i-nav §4 |
| `I01` карты | ODbL-атрибуция + размещение данных | **v4** | i-nav §2 |
| `G13` проекция | not-first-party / плагин / вне скоупа | **v4** | g-conn §8 |
## Сквозные треки (вне одной фазы)
- **Dev-environment + моки** *(с v0.6, параллельно всему).* Разблокирует разработку без железа: Vehicle
Simulator (E), fake-аудио/BT/камера, plugin-host-харнесс, нав-сим, мок-облако/OTA. Не на критпути.
- **Security/privacy-гейтинг** *(растёт по фазам):* `audio_in` (v1) → `camera_in`/location-consent (v2) →
plugin-capability-review + perm-UI (v3) → secure-boot/at-rest/trust-anchor (v4). Контракт — [security-privacy.md](contracts/security-privacy.md).
- **Цепочка доверия OTA:** подпись плагинов `F11` (v3.2) → secure boot `A20` + signed OTA `A19`/`L09` (v4.3/v4.4) — единая trust-цепочка с anti-rollback.
- **Бюджеты/безопасность как gate:** [performance.md](contracts/performance.md) (CI perf-gate, регрессия = баг) и [safety.md](contracts/safety.md) (distraction, red-line-энфорсмент) — сквозные требования к каждой вехе.
- **Дизайн-система** *(язык — до v0.5):* визуальный язык/токены ([design-system.md](contracts/design-system.md)) опережает первый видимый кадр (v0.5); прод-скин/значения итерируются на железе. AMG-leaning премиум, dark-first; плагины наследуют через Shell.
## За горизонтом v4
Доразвитие из тех же доменов по мере спроса — не входит в лестницу v0–v4 (20 функций):
- **База:** `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 датчики).