b9500356b0
Двунаправленные швы (спека v0.3 §10) после реализации Плана 7: - domain B: banner «Реализация (v0.3)» (B01–B07, VM-модель abort/PONR=stop+umount+remount); §12 — MCU/supercap (B08/B09) → v0.4. - ipc.md §3: Power оживлён из FSM (не mock); Sleep/Wake/RequestSleep зарезервированы. - foundation §5.2: «Power-стаб» → реальный PowerFsm (проекции state/ignition/source из FSM); dev-mock кормит входы FSM. - CLAUDE.md: статус v0.3 ГОТОВО; «Следующее» → v0.5 shell / v0.4 MCU-thermal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Alexander <akotenev2003@gmail.com>
91 lines
8.3 KiB
Markdown
91 lines
8.3 KiB
Markdown
# Штурман — инструкции проекта
|
||
|
||
Open-source русскоязычный companion-слой («ОС поверх Linux») для авто на **RK3588**: быстрый
|
||
Slint-UI + голосовой RU-ассистент, читающий OBD/CAN **только на чтение** + расширяемый Plugin API.
|
||
Лицензия **MIT**. Общение и комментарии — по-русски; код-идентификаторы — как есть.
|
||
|
||
## Фаза: РЕАЛИЗАЦИЯ (v0)
|
||
|
||
Проектирование завершено. **Источник правды по дизайну — каталог `docs/`** (Tier 0–3 + 8 контрактов +
|
||
детальный `roadmap.md`; всё прошло многоагентный adversarial-ревью). Не противоречь докам; если
|
||
реальность расходится с доком — **синхронизируй док** (двунаправленные швы, как в дизайн-фазе).
|
||
|
||
## КРАСНЫЕ ЛИНИИ (нерушимы)
|
||
|
||
1. **Никогда не safety-critical** — двигатель/тормоза/ABS/ESP/руль/подушки; в системе нет actuator-путей.
|
||
2. **CAN только на чтение** — стандартные OBD-II read-запросы (Mode 01/03/07/09/0A) допустимы; запрещены
|
||
write/actuator/Mode-04/UDS-write. Граница и энфорсмент — `docs/contracts/safety.md`.
|
||
|
||
## Стек (canonical — `docs/tech-stack.md`)
|
||
|
||
Rust везде в проде (Python — только dev/симуляторы). **D-Bus** control-plane; **PipeWire**+WirePlumber
|
||
(аудио); **Wayland** + **smithay**-композитор (Shell); **Slint** (UI); **bubblewrap** + Perm-Broker
|
||
(песочница плагинов); NM/MM + BlueZ (GPL-демоны через D-Bus, изолированы). License-гигиена — `cargo-deny`.
|
||
|
||
## Dev-окружение (`docs/dev-environment.md`)
|
||
|
||
Всё в **Lima ARM64-VM** (Ubuntu) — нативно к таргету RK3588, **разработка без машины** (принцип #13):
|
||
vcan + Vehicle Simulator + моки (аудио/BT/камера/GPS/сеть/plugin-host/нав/облако). `justfile` — единые
|
||
команды (`just vm-up`, `just sim`, `just test`, … — создаём по ходу). **Перф-вердикт — на реальном RK3588**
|
||
(не на dev-Mac), бюджеты — `docs/contracts/performance.md`.
|
||
|
||
## Как работаем (реализация)
|
||
|
||
- **Roadmap ведёт.** Идём по вехам `docs/roadmap.md`. Текущая цель — **v0** (критпуть: образ → power-safe → shell).
|
||
- **Цикл на веху:** спека (раскладка/границы/D-Bus-интерфейсы/тест-план/acceptance) → **TDD** → реализация
|
||
→ **verify в Lima-VM** → коммит. **Не писать код до утверждённой спеки.**
|
||
- Скиллы: `test-driven-development`, `writing-plans`/`executing-plans`, `verification-before-completion`,
|
||
`systematic-debugging`, `requesting-code-review`.
|
||
- **Коммиты:** `feat/fix/chore(<area>): …`; ветка от `main` (без явного «ок» в `main` не коммитим);
|
||
в конце — `Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>`.
|
||
- Сквозные гейты каждой вехи: safety (red-lines/distraction), performance (бюджеты), design-system (визуальный язык).
|
||
|
||
## Текущая цель — v0 (см. `docs/roadmap.md` § v0)
|
||
|
||
**Фундамент готов и в `main`** (Планы 1–5 ч.1; спека `docs/specs/v0.1-v0.6-foundation.md` + планы `docs/specs/plans/`):
|
||
воркспейс + `shturman-common`/`ipc`/`sdk` + стаб-сервисы `firstboot`/`settings`/`power` (интеграция на D-Bus) +
|
||
первый Slint-кадр (`shell`) + dev-tools (валидатор/scaffolding) + systemd/Lima/E2E-файлы. `just ci` зелёный.
|
||
|
||
**План 5 ч.2 — ГОТОВО (ветка `feat/v0.6-lima-e2e`):** Lima-VM поднимается (`just vm-up`), сквозной `just e2e`
|
||
зелёный с нуля (`just vm-reset && just e2e`): boot → `data.mount` → firstboot → machine-id bind → `Power`/`Settings`
|
||
на системной шине → fake-ACC `AccChanged` → **первый Slint-кадр** (software-render → PNG, oneshot-сервис) →
|
||
base-бюджеты (journald volatile / zram / oomd / fake-hwclock→/data / eMMC-прокси) → **reboot**: персист Settings +
|
||
machine-id стабилен. Приёмка §9.4 (v0.1 + v0.6 + шагающий скелет) выполнена. Швы реализации — спека §13.
|
||
|
||
**v0.2 Boot-конвейер — ГОТОВО (ветка `feat/v0.2-boot-pipeline`):** спека `docs/specs/v0.2-boot-pipeline.md` + план
|
||
`docs/specs/plans/06-v0.2-boot-pipeline.md`. `shturman.target` → **зонтик** фаз Stage 0/1/2; `shturman-splash` (Stage 0,
|
||
software-render → `/run/shturman/splash.png`, `Before=shell` → до первого кадра) + `shturman-stage2-warmup` (деферред
|
||
`After=shell`); общий рендер-хелпер `shturman-render` (shell+splash). `just vm-reset && just e2e` зелёный с нуля:
|
||
фазы разделены (splash ≤ frame ≤ stage2), регресс v0.1/v0.6 цел. Приёмка спека v0.2 §9.3 выполнена.
|
||
|
||
**v0.3 Power-safe ядро — ГОТОВО (ветка `feat/v0.3-power-safe`):** спека `docs/specs/v0.3-power-safe.md` + план
|
||
`docs/specs/plans/07-v0.3-power-safe.md`. Стаб `Power` → **реальный lifecycle-FSM**: чистый `PowerFsm`
|
||
(`off↔accessory↔running→shutting_down{abortable→committed}→off`, abort до PONR) + сервис `ru.shturman.Power`
|
||
оживлён из FSM (dev-mock кормит события, grace-таймер + durable-barrier `sync` на commit); watchdog-конфиг (B05/A14) +
|
||
save-time timer (B07). `just vm-reset && just e2e` зелёный с нуля: **N=3 цикла зажигания** (`/data` + счётчик целы),
|
||
**abort до PONR** (`ShutdownAborted`, `/data` RW, running), **power-cut-сим** (SIGKILL → `fsck` clean, durable-value цел);
|
||
регресс v0.1/v0.2 + machine-id-стабильность цел. prod-build-gate: `--no-default-features` без `PowerMock1`. Приёмка спека
|
||
v0.3 §9.4 выполнена. **VM-модель** (abort/PONR = stop+umount+remount); аппаратное (MCU/hold-up/fail-safe-таймер, **B08/B09**) → v0.4.
|
||
|
||
**Следующее:** `v0.5` полный shell (живой weston-shell) и `v0.4` MCU/thermal (замыкает B08/B09) — параллельно поверх v0.2/v0.3.
|
||
|
||
> CI: GitHub-Actions-конфиг **удалён** (его ловит Gitea). Гейт — локальный `just ci`. CI на Gitea — решение позже.
|
||
|
||
## Карта документации
|
||
|
||
- **Архитектура/процессы/шина:** `docs/architecture.md` · **стек:** `docs/tech-stack.md` · **принципы (13):** `docs/principles.md`.
|
||
- **Контракты** (`docs/contracts/`): `ipc` · `data-model` · `security-privacy` · `plugin-sdk` · `hardware` · `safety` · `performance` · `design-system`.
|
||
- **Домены** (`docs/domains/`): A base-system · B power-lifecycle · C shell-ux · D assistant · E vehicle-data · F plugin-host · G…L.
|
||
- **План:** `docs/capability-catalog.md` (170 функций, ID `<буква><NN>`) · `docs/roadmap.md` (вехи v0.1…v4.5) + `docs/roadmap.html`.
|
||
|
||
## Решения-🟡 (всплывут по ходу — НЕ блокеры старта)
|
||
|
||
`A01` Armbian/Debian vs Yocto, `A02` f2fs vs ext4 — на сборке **прод-образа** (dev использует Lima Ubuntu).
|
||
`B08/B09` MCU vs supercap-only — на `v0.4` (вероятно нужна аппаратная проверка). Полный реестр — `docs/roadmap.md` «Риск-реестр».
|
||
|
||
## Гочи
|
||
|
||
- §-якоря в доках = номера **РАЗДЕЛОВ**, не строк.
|
||
- Adversarial-ревью через Workflow: **НЕ** ставить сырые backticks в template-literal промптах агентов
|
||
(закрывают строку, валят скрипт) — код-идентификаторы в одинарных кавычках.
|