Commit Graph

65 Commits

Author SHA1 Message Date
kk0t9 9b87751ab8 feat(v0.6): Lima E2E зелёный с нуля + shell software-render screenshot
План 5 ч.2: поднял Lima-VM и довёл сквозной E2E до зелёного из чистого yaml
(just vm-reset && just e2e — exit 0). Приёмка §9.4 (v0.1 + v0.6 + шагающий скелет).

Shell (lib+bin split):
- режим --screenshot <path>: headless software-render первого кадра в PNG
  (Slint software-renderer, без дисплея/композитора, §6); TDD-тест «кадр не
  пустой + тема отражена», зелёный и на dev-Mac, и в VM (Linux).
- shturman-shell.service → oneshot software-render → /run/shturman/frame.png
  (RemainAfterExit → is-active детерминированно, без хрупкого weston;
  живой weston-shell — v0.5). just shell-frame — инспекция кадра.

E2E (tests/e2e/run.sh, двухфазно pre→reboot→post):
- /data+power-safe опции, volatile-tmpfs, first-boot идемпотентность, per-unit
  active, имена на шине + GetPowerState, fake-ACC SetAcc→AccChanged, первый кадр
  PNG, base-бюджеты (journald volatile / zram / oomd / fake-hwclock→/data /
  eMMC-прокси), персист Settings + machine-id every-boot bind после reboot.

Провижининг (lima/shturman.yaml) — правки по реальным ошибкам Lima:
- build-deps Slint/winit на Linux (libfontconfig1-dev/libxkbcommon-dev/libwayland-dev);
- linux-modules-extra (zram/vcan не в vz-ядре); systemd-oomd; rm стокового
  /etc/fake-hwclock.data (A11); VM-локальный CARGO_TARGET_DIR.

Док-синхронизация (спека §13/§8.1/§7.5 + CLAUDE.md): швы реализации, eMMC-порог
T=4096 сект, fake-hwclock masked-в-Lima, dev-mock policy не нужен.

Перф-вердикт — на RK3588 (в VM — функционально, performance §2). just ci зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 17:14:31 +03:00
kk0t9 a9aad21636 chore: убрать GitHub-Actions CI (триггерит Gitea) + CLAUDE.md цель → Lima E2E
- удалён .github/workflows/ci.yml: self-hosted Gitea ловит GitHub-Actions-формат, не нужно.
  Активный гейт — локальный just ci; авто-CI на Gitea — решение позже.
- CLAUDE.md § «Текущая цель»: фундамент (Планы 1–5 ч.1) в main; следующее — A (Lima E2E, План 5 ч.2).
- spec §8.3 — пометка об удалении CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 14:50:59 +03:00
kk0t9 6e8fe0796b fix(review): systemd target тянет critical set (#1) + harden machine-id bind + deny slint-note
- БЛОКЕР: shturman.target Wants= сервисов (enable target не каскадит) — иначе start поднимал только /data.
- machine-id bind: создаём /etc/machine-id, если нет, перед mount --bind.
- deny.toml: заметка о хрупкости slint-exceptions к апгрейдам.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 14:36:50 +03:00
kk0t9 bfe490e899 refactor(review): shell current-thread runtime + единый дефолт; PowerClient parse_enum; тесты на ipc::names
- shell: new_current_thread рантайм (без пула на холодном старте, #11); единый Initial::default().
- PowerClient: generic parse_enum (убрал 3 копии map_err).
- ipc::names::power::MOCK_IFACE; интеграционные тесты — через ipc::names (не хардкод).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 14:36:50 +03:00
kk0t9 69beaad596 fix(review): manifest deny_unknown_fields + каталог сигналов в sdk::vehicle
- deny_unknown_fields: опечатка в ключе capability (граница доверия F §3) не проглатывается.
- VEHICLE_SIGNALS → shturman_sdk::vehicle (single source; валидатор берёт оттуда).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 14:36:50 +03:00
kk0t9 2b06ff749f fix(review): Settings — типизированный SettingValue + лог битого JSON + Error::Failed + чистый reset
- SettingValue{Str,Int,Bool} в сторе: провод-variant теперь честно поддержан (не string-only).
- битый settings.json → WARN в лог (не молча) + откат к дефолтам.
- отказ записи /data → Error::Failed (не InvalidArgument).
- reset ключа без дефолта → no-op + InvalidArgument (без ложного Changed("")).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 14:36:50 +03:00
kk0t9 bc2c0b8cfd feat(harness): systemd-юниты + Lima-конфиг + E2E-харнесс (файлы)
systemd/ (target/data.mount/firstboot/machineid/power/settings/shell + dbus-policy + journald/zram/oomd):
ordering data.mount->firstboot->machineid->dbus->power+settings->shell; Requires+After firstboot; OOMScoreAdjust.
lima/shturman.yaml (vz, Ubuntu ARM64, /data loopback, провижининг). tests/e2e/run.sh (каркас приёмки).
justfile: vm-up/down/reset/shell, run, e2e, shell-frame. Валидация — часть 2 (поднятие Lima).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 13:26:45 +03:00
kk0t9 9d0b5b5aa7 feat(devtools): scaffolding (just new-plugin) + just-таргеты
templates/plugin (валидный манифест+locales+README); new-plugin генерит и валидирует;
validate-manifest / plugin-dev-run (каркас, App-Host v3) / sim (плейсхолдер v2). plugins/ — в .gitignore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 13:22:16 +03:00
kk0t9 69e4e06940 feat(validator): manifest-validator (F02) + bad-manifest фикстуры (F04)
Правила: id не ru.shturman.*, shturman_api поддержан, len(tiles)<=ui_tiles, vehicle_read из каталога.
Фикстуры good + bad-{id-reserved,api,tiles-quota,vehicle-read}; 6 тестов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 13:20:26 +03:00
kk0t9 20ee069059 docs(specs): План 5 — dev-tools + systemd + Lima + E2E
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 13:19:08 +03:00
kk0t9 ca763116d8 feat(shell): первый Slint-кадр на SDK (срезы C03/04/05/07/02) + slint GPL exception
theme::resolve_night (TDD); slint! AppWindow (статус-бар часы+сеть + грид тайлов + тема день/ночь);
main — best-effort чтение Settings/Power через sdk (без шины — дефолты, #4); часы UTC (локаль tz — позже).
deny.toml: GPL-3.0 exceptions для slint-крейтов (вариант A, финал к v4) + BSL-1.0 (error-code).
Slint тянет zbus5/thiserror2 — дубли версий (bans=warn). Реальный screenshot кадра — План 5 E2E.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 13:03:22 +03:00
kk0t9 75a7132864 docs(specs): План 4 — shturman-shell первый Slint-кадр
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:56:13 +03:00
kk0t9 ce525dd622 test(core): интеграция Settings/Power на session-шине (#[ignore])
Settings round-trip + Changed; Power state + fake-ACC AccChanged — на живой D-Bus.
just test-integration (dbus-run-session). #[ignore] → just ci (unit) не требует шины.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:51:07 +03:00
kk0t9 9aeff2aa7d feat(power): Power1 стаб + dev-mock fake-ACC (feature dev-mocks)
PowerService (Power1, стаб running) + PowerMock (dev.PowerMock1, разделяет State через Arc<Mutex>).
dev-mocks — default-фича; прод (--no-default-features) mock не регистрирует.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:46:22 +03:00
kk0t9 b8f084b1e1 feat(settings): Settings1 стаб + атомарный стор + seed дефолтов
Store (load_or_seed/get/set/reset/list, durable-write) + SettingsService #[interface] + bin.
v0: строковые значения (variant на проводе), сам сеет дефолты.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:41:44 +03:00
kk0t9 b7a76d78f6 feat(firstboot): идемпотентный provision /data + machine-id (A06)
lib provision (idempotent; factory-reset; recover mid-run) + bin; machine-id из /dev/urandom.
Привязка к /etc/machine-id — every-boot юнит (План 5). Дефолты настроек — Settings.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:38:21 +03:00
kk0t9 d62ba80755 refactor(ipc): connect() в ipc::conn; sdk ре-экспортит
Сервисам нужен bus-bootstrap, а от sdk они не зависят (граница architecture §3).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:37:09 +03:00
kk0t9 afa1afa970 docs(specs): План 3 — стаб-сервисы firstboot/settings/power + интеграция
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:33:51 +03:00
kk0t9 52d3a6e2ce feat(sdk): connect + Power/Settings клиенты (bus-тест — План 3)
connect (system/session по SHTURMAN_BUS); PowerClient/SettingsClient — типизированные обёртки proxy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:15:20 +03:00
kk0t9 297970901a feat(sdk): схема манифеста (plugin-sdk §2)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:13:13 +03:00
kk0t9 d8eebc96ce feat(ipc): zbus-proxy Power1/Settings1
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:11:11 +03:00
kk0t9 0d630dde84 feat(ipc): enum-типы Power/Ignition/Source/Reason (string round-trip)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:10:07 +03:00
kk0t9 d91d218ade feat(ipc): Error (ru.shturman.Error.*) + well-known имена
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:07:29 +03:00
kk0t9 df553790ae docs(specs): План 2 — shturman-ipc (контракт) + shturman-sdk (клиент)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:05:30 +03:00
kk0t9 54f17cbf4e chore(dev): justfile (ядро) + CI-гейт (lint/test/deny) + rustfmt
just ci зелёный: fmt + clippy(-D warnings) + 6 unit-тестов common + cargo-deny.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 12:01:04 +03:00
kk0t9 b969d35b81 chore(license): deny.toml — allow-list + advisories (#12)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 11:59:25 +03:00
kk0t9 7bbef6886f docs(governance): LICENSE (MIT) + DCO + CONTRIBUTING + README
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 11:58:12 +03:00
kk0t9 e8576a0196 feat(common): init_tracing -> journald (A10) + re-exports
journald на Linux, stderr-fallback иначе (cfg-gate).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:56:52 +03:00
kk0t9 70045e2544 feat(common): монотонные часы (B §8)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:55:47 +03:00
kk0t9 ab012381d0 feat(common): durable atomic write (power-safe #5)
write-temp -> fsync -> rename -> fsync(dir); тесты целостности.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:55:12 +03:00
kk0t9 334faeb000 feat(common): Layout — канонические пути /data
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:54:14 +03:00
kk0t9 4ee012127f chore(workspace): Rust-воркспейс + скелет shturman-common
- workspace (resolver 2; members растут по планам)
- rust-toolchain 1.96.0; tracing-journald cfg-gated на Linux (кросс-платформенность)
- shturman-common: модули-скелеты paths/atomic/clock/log

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:53:13 +03:00
kk0t9 d443fb479b docs(specs): спека реализации v0.1/v0.6 (v1) + План 1
Спека после adversarial-ревью (17 находок) + позиция Slint (вариант A, финал отложен к v4).
План 1 — воркспейс + governance + shturman-common (TDD).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:47:49 +03:00
kk0t9 25703751dc chore: CLAUDE.md — точка входа фазы реализации (v0)
Инструкции проекта для новых сессий: стек, dev-окружение, рабочий цикл (спека→TDD→verify→коммит), текущая цель v0, карта docs/, красные линии.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 21:26:16 +03:00
kk0t9 32edd07636 docs(design-system): новый контракт Tier-1 — визуальный язык (токены/компоненты/distraction-визуал), AMG-leaning премиум dark-first, после adversarial-ревью (11 находок) + швы (C §5/§6, plugin-sdk §4.1, roadmap-трек+v0.5, README×2)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 20:27:16 +03:00
kk0t9 cf04b05097 docs(roadmap): детальный план исполнения (вехи v0.1–v4.5 + риск-реестр + критпуть) + интерактивный roadmap.html
Каждая фаза разложена на упорядоченные вехи (что заработало / ID / зависит / тест без машины / готово-когда); биекция 170↔170 в md и html.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:58:02 +03:00
kk0t9 9604ce1248 docs(perf): новый контракт Tier-1 — NFR-бюджеты (латентность/память/тепло), измеримый принцип #11, после adversarial-ревью (7 находок) + швы (README×2)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:32:30 +03:00
kk0t9 b1818e0955 docs(safety): новый контракт Tier-1 — граница не-safety-critical + энфорсмент red-lines + driver-distraction, после adversarial-ревью (8 находок) + швы (principles #2 Mode 0A, README×2)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:04:18 +03:00
kk0t9 dad0b8c33c docs(dev-env): нав-сим (I §16) + мок-облако/OTA (L §12) в моки, после adversarial-ревью (4 находки)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 17:58:27 +03:00
kk0t9 83ce37ef83 docs(roadmap): v1 — лестница v0–v4 (170 функций по фазам/трекам + критпуть + сквозные треки), после adversarial-ревью (2 находки)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 17:27:58 +03:00
kk0t9 e9bff7f4c8 docs(catalog): v1 — мастер-индекс 170 функций + capability-карта, после adversarial-ревью (9 находок) + кросс-док-швы (F/C)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 16:52:01 +03:00
kk0t9 2eaa561892 docs(domain I): v2 — навигация (offline OSM/роутинг/turn-by-turn), после adversarial-ревью (24 находки) + кросс-док
Последний домен. Offline-first навигация: OSM-карты (MapLibre GL Native),
оффлайн-роутинг (Valhalla), turn-by-turn, поиск/POI, связка с ассистентом.
Не safety/ADAS (#1). Фаза v4. Многоагентный adversarial-ревью: 28 находок,
24 подтверждены (default-refute), все применены.

Ключевое из ревью:
- stale нав-промпт под звонком (проигрался бы ПОСЛЕ поворота) → продюсер I снимает заявку по окну релевантности; H остаётся контент-агностичным.
- Нет секции отказ-путей → добавлена (no-route/geocoder-fail/битые-тайлы/ENOSPC, симметрично J/H/L).
- Маршрут через границу регионов / назначение в нескачанном регионе → детект покрытия + предложение докачать / маршрут до края.
- reroute-шторм в urban-canyon → детект схода с гистерезисом + HDOP/FixQuality-гейт; dead_reckoning трактуется как нет-фикса.
- Якорь RDS-TMC G §7 → H §7 (FM-радио живёт в медиа-тракте H, не в сетевом G).
- MapLibre Native = BSD-2-Clause (не BSD-3); ODbL-атрибуция (#12); единицы км/мили из локали (data-model §4, #10).
- Интент «домой» разведён: D §6 = домашний экран (v1), навигация-домой = Nav-интент (v4).
- Добавлены секции Зависимости и last-parked (K §2/L §5 ждали); Boot-Stage 2; speed-limit — пассивный бейдж, не предупреждение (#1).

Кросс-док: d-assistant §6 («домой» = домашний экран; навигация-домой → Nav v4).
(architecture §3/§6 уже содержат Nav; a-base apps-storage уже покрывает нав-PII.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 14:23:34 +03:00
kk0t9 1eaa0b8896 docs(domain L): v2 — облако/компаньон (Companion+OTA-канал+телеметрия), после adversarial-ревью (21 находка) + кросс-док
Новый домен L: device-Companion-сервис + моб.приложение + опц.self-hostable облако.
Облако опционально, local-first, никогда не управляет машиной. Многоагентный
adversarial-ревью: 30 находок, 21 подтверждена (default-refute), все применены.

Ключевое из ревью:
- OTA untrusted-host неполон без anti-rollback → добавлена монотонность security-version (downgrade/replay-защита); подпись ≠ свежесть. Зеркально в a-base §5.
- fscrypt-ключ eFuse-bound непереносим → честно: cross-device restore требует отдельного backup-ключа (открыто); убрана ложная «ключ у пользователя».
- DOWNLOAD(L) ≠ APPLY(A): разведены фазы; download-fail-safe (ENOSPC/resume/отбраковка битого до RAUC) симметрично J/H.
- Time-gate (a-base §7): холодный boot 1970 → TLS «not yet valid» — OTA/sync/телеметрия ждут вменяемых часов.
- Captive-portal (G): egress только при State==online, не на portal/limited.
- Телеметрия: consent/буфер стираются на factory-reset (инвариант «после reset все opt-in выкл»); не ретроспективна; отзыв → дроп буфера; облако: retention+удаление (152-ФЗ).
- Поездки — из trip-плагина (app-storage), не из core E.
- dashcam-бэкап: отдельный носитель + consent-гейт J §4.
- Staged-rollout halt-петля + парадокс с opt-in телеметрией; push-доставка; модель аккаунта (recovery/multi-vehicle/multi-user); version-skew моб↔головблок — зафиксированы.

Кросс-док: a-base §5 (anti-rollback + Журнал), §12 (telemetry-consent в wipe);
architecture §3 (Companion first-party) + §5 (ребро Companion→Connectivity).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:55:40 +03:00
kk0t9 3fd9b42bb0 docs(tails): закрыть кросс-док хвосты (a-base/b/dev-env/J/hardware) + наполнить glossary
Закрыты накопленные мелкие хвосты из ревью F/J/H/G:
- Stage-нормализация: Stage-0/1/2 → Stage 0/1/2 по 6 докам (a/b/f/h/j/hardware); каноническая запись Stage 0/1/2 в glossary.
- a-base §8: видео-пайплайн (DMABUF камер / VPU dashcam) внесён в OOM-порядок — задняя защищена (Stage 1), dashcam/surround throttleable.
- a-base §12: dashcam-медиа (отдельный носитель) + контакты/журнал (G) в список factory-reset wipe.
- b §12: grace-hold резолвнут  — J запросчик (J §7), B владелец/арбитр (§4 шаг 2, §7).
- dev-environment: моки fake-камера (J)/аудио (H)/BT-телефон (G) + plugin-host-харнесс; just-цели plugin-dev-run/sideload.
- J §3/§11/§13 + hardware §4: сигнал реверса  GPIO фонаря з.х. (выбранный дефолт); CAN-gear отложен (нет gear-сигнала в E).
- glossary.md: наполнен (~55 терминов в 7 областях: машина/CAN, платформа/IPC, ассистент/аудио, питание/boot, хранилище/OTA, связь/телефон, безопасность).

Tier-3 capability-catalog + roadmap не трогаются — зависят от доменов I+L.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:46:36 +03:00
kk0t9 fb4e585152 docs(domain G): v2 — связь/телефон (Connectivity+Phone), после adversarial-ревью (15 находок) + кросс-док
Новый домен G: Connectivity-core (WiFi/LTE/tethering + BT-адаптер/паринг) +
Phone-ап (HFP-звонки/контакты). Многоагентный adversarial-ревью: 24 находки,
15 подтверждено (default-refute; tech-измерение — 0, техника устояла), все применены.

Ключевое из ревью:
- BT-шов резолвнут двунаправленно: владелец BlueZ — Connectivity-core (G §3 ↔ H §6/§15 ).
- Граница голоса: только HFP спаренного телефона; встроенный модем — data-only (VoLTE/eCall вне скоупа).
- SIM PIN/PUK-флоу (sim_locked/no_sim) + captive-portal детект (portal/limited, не ложный online) — модем v1.
- Connectivity поднимается на Stage 2 (синхр. с architecture §6).
- Мультипаринг: ровно один active-телефон для HFP/PBAP (Dial/CallStateChanged однозначны).
- SCO-loss mid-call → CallState=audio_lost + снятие роли phone_call → H раскорчивает медиа (не залипает).
- Входящий-оверлей не перекрывает реверс-вид (z-order overlay-слота → C); tethering-петля AP+tether запрещена.
- PBAP-синк фоновый; отказ-пути паринга/no_service симметрично J/H.

Кросс-док: H §6/§15 (BlueZ ) + якоря D §147/§148→§10; architecture §3 (Connectivity+BT)
/§6 (Stage 2); ipc §3 (Type+tether, State enum, CallState=audio_lost); security-privacy §7
(контакты/журнал/SMS local-first); hardware §4 (Bluetooth); tech-stack (NM/MM/BlueZ);
C §11 (z-order overlay).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 19:08:52 +03:00
kk0t9 77d9a5a0ee docs(domain H): v2 — медиа/аудио + арбитр ducking, после adversarial-ревью (20 находок) + кросс-док
Новый домен H (медиа/аудио). Ядро — сквозной арбитр аудио (политика
фокуса/ducking поверх PipeWire, role-based), плюс медиаплеер (локальное/BT
A2DP/AVRCP/радио/стриминг). Многоагентный adversarial-ревью: 24 находки,
20 подтверждено (default-refute), все применены.

Ключевое из ревью:
- symphonia НЕ декодирует Opus → отдельный audiopus (libopus, BSD).
- AEC: module-echo-cancel (≠ filter-chain) в audio-plane, не в ассистенте — резолв D §147.
- media.role (арбитраж) vs media.category (Playback/Capture) разведены.
- Кнопки громкости мультируля — uinput→Wayland-input (C/K), не интенты ассистента.
- Crash-safe по двум осям (source: жизнь ноды + проактивный cork по NameOwnerChanged/watchdog; sink: пересчёт при возврате output).
- intra-role media-фокус (один media-продюсер), гистерезис фокуса (анти-pumping), duck = относит. аттенюатор.
- boot аудио-плоскости на Stage 1; отказ-пути плеера (битый файл/обрыв A2DP/ENOSPC/underrun); resume без авто-старта.

Кросс-док: D §147 AEC→; tech-stack (symphonia/audiopus/module-echo-cancel);
hardware §4 (amp-mute-GPIO + FM-тюнер + откр. вопросы); B §4 (amp-mute перед
cut); architecture §9 (аудио-арбитр → H); domains/README (строка H).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 18:08:36 +03:00
kk0t9 b9747ee66d docs(domains F+J): v2 после adversarial-ревью (37 находок) + кросс-док
F (plugin-host, 17):
- exec-путь плагина (/data/apps/<id>/, код exec-поддерево / данные noexec); IPC-передача
  Install→App-Host (LoadApp/UnloadApp); teardown с явным StopApp+отзыв грантов; атомарный
  install/update (staging+rename, a-base §3); ре-валидация манифеста на каждом activate +
  capability-pin; sideload-гигиена распаковки; бюджет ресурсов (cgroup+OOM); аудит операций;
  namespace manifest-id ru.shturman.* vs OWN-экспорт ru.shturman.plugin.<id>.*; WASM↔identity-конфликт;
  PluginManager в ipc; dev-tools/тест-харнесс (#13); фазы (SDK/dev v0, экосистема v3)

J (cameras, 20):
- Stage 0 ранний путь = DRM/KMS из initramfs (не Wayland) + DRM-master handoff smithay без
  чёрного кадра; реверс-сигнал owner=Power/GPIO (CAN-gear требует сигнал в E); camera_in
  capability + per-node видео-гейтинг (/dev/videoN only first-party); fail-safe frame-watchdog
  → no_signal (не stale DMABUF); dashcam privacy (152-ФЗ, fscrypt, retention, factory-reset,
  индикатор); lifecycle (не пишет в sleep, ShutdownImminent-флаш сегментами, grace-hold via B);
  surround/video ресурсы (VPU/DMABUF/a-base §8); dev-симулятор камер (#13); Camera в ipc

Кросс-док: ipc (AppHost.LoadApp/UnloadApp, PluginManager, Camera), security-privacy
(namespace-фикс ru.shturman.*, camera_in, audit-scope), a-base §3 (dashcam в at-rest fscrypt)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:57:54 +03:00
kk0t9 5ba19cde46 docs(domain K): v2 после adversarial-ревью (18 находок) + кросс-док
- GPS-скорость: zero-clamp <~2-3 км/ч (на стоянке Doppler-шум, не ноль) — distraction v1
  получал бы ложный on; FixQuality многоуровневый (no_fix/2d/3d/augmented/dead_reckoning
  + HDOP/sats); dead_reckoning не валиден для distraction/Nav; валидность времени ≠ позиции
- приватность локации: эфемерна (без трека в v1), audit-log, исключена из LLM-промпта,
  while-in-use грант, on-device
- антенна (внешняя/активная), TTFF cold/warm-start, окно без GPS на старте поездки;
  питание GPS в sleep/battery-cutoff (обесточивание+cold-start по умолчанию)
- резистивная ADC-лесенка руля: контракт window-table + кондиционирование + collision-drop
  + темп-дрейф; транспорт ввода = uinput/evdev (не Shell-D-Bus, иначе surface-апы не покрыты);
  гейтинг руль-действий в distraction
- IMU опционален/не гарантирован → dashcam (J) = непрерывный ring-buffer, не на g-sensor
- точность времени SHM (~десятки-сотни мс), PPS опц./hardware-gated; Nav «фаза 2»→v4
- кросс-док: a-base §7/§14 (SHM, split time-row + K-dep), hardware §4 (антенна/1PPS),
  domains/README (K-cell без TPMS/климата), ipc Location (enum), c-shell §7/§9/§11
  (clamped speed, uinput-ввод, закрыт Location-вопрос)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:30:08 +03:00
kk0t9 7a30ed7a7d docs(domain B): v2 после adversarial-ревью (22 находки) + кросс-док
Существенная переработка power-lifecycle:
- детект running по НАПРЯЖЕНИЮ бортсети (~14В генератор vs ~12.4В покой), не RPM (v2);
  Power.IgnitionState — единственный канон lifecycle-состояния
- триггер shutdown ≠ rate-of-change: ACC-off / under-voltage-held / thermal-trip;
  cold-crank до ~6В — НОРМА (ride-through), не индикатор обрыва
- SoC↔MCU shutdown-протокол специфицирован СЕЙЧАС: hold-up-таймер + heartbeat +
  safe-to-cut + fail-safe при потере линка (обе стороны); MCU — fail-safe-авторитет
- abort при re-power до PONR (ShutdownAborted); shutting-down разбит abortable/committed
- НОВОЕ: thermal shutdown (триггер/гистерезис/UX); ordered teardown (E закрывает ISO-TP);
  таблица MCU-vs-supercap; battery deep-discharge cutoff; монотонные часы для таймеров;
  первый boot без времени; периодическое сохранение времени
- watchdog по фазам (runtime + shutdown RebootWatchdogSec/MCU-дедлайн + boot-окно);
  v0=SoC+MCU+reboot, bootcount=v4
- фазы: MCU HW fail-safe-таймер = v0 (не v1); save-time = v0
- кросс-док: security-privacy (mic power-gated), ipc Power (enum/reason/ShutdownAborted),
  e/data-model (engine_running не дублирует IgnitionState), a-base §7 (периодич. save)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 01:53:57 +03:00
kk0t9 c66ccf08ea docs: ретро-ревью pass-2 остаточные (data-model/plugin-sdk/hardware/C)
- data-model: структура DTC-кода исправлена (буква + 2-битная категория + 3 hex, не
  «4 hex»; P0/P2 generic, P1/P3000-33FF производитель); module_voltage путь →
  Vehicle.OBD.ControlModuleVoltage (был неверный LowVoltageBattery)
- plugin-sdk: пример id → dev.example.* (ru.shturman.* зарезервирован); i18n строк
  манифеста (per-locale, ru обязателен); ui_screens capability + гейт RegisterScreen
- hardware: камера «фаза 2» → v2; требования к MCU-копилоту (обновляемость прошивки,
  fail-safe при его отказе, позиция в цепочке доверия)
- tech-stack: карты «фаза 2» → v4 (нормализация фазовой номенклатуры)
- C-shell: день/ночь v0 = время, GPS-восход v1 (был конфликт фаз); ui_screens-гейтинг

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 01:30:00 +03:00