kk0t9
b9500356b0
docs(v0.3): синхронизация швов power-safe + статус
...
Двунаправленные швы (спека 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 >
2026-06-25 00:21:10 +03:00
kk0t9
598070de96
docs(v0.3): план реализации power-safe (План 7)
...
P7.1 чистый PowerFsm (TDD, все переходы) → P7.2 Power-сервис на FSM
(dev-mock кормит события, grace-таймер + durable-barrier sync, integration abort) →
P7.3 watchdog-конфиг + save-time timer → P7.4 lima/E2E блок (N=3 цикла + abort +
power-cut-сим) → P7.5 verify Lima + acceptance + швы. Полный код, без плейсхолдеров.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Signed-off-by: Alexander <akotenev2003@gmail.com >
2026-06-24 20:58:38 +03:00
kk0t9
4fe5103e88
docs(v0.3): спека power-safe ядра (FSM + graceful shutdown)
...
Веха v0.3: стаб Power → реальный lifecycle-FSM. Состояния off/accessory/running/
shutting_down{abortable,committed} (sleep/battery_cutoff — каркас); graceful
shutdown (ShutdownImminent→grace→durable-barrier sync→commit=PONR=unmount); abort
до PONR (re-power→ShutdownAborted). dev-mock кормит входы FSM. Watchdog/save-time/
монотоника. Подход A: FSM+сигналы, teardown через systemd/харнесс. Гибрид-E2E:
N=3 in-VM цикла + 1 reboot + abort + power-cut-сим. HW (hold-up/MCU/B08-B09) — v0.4.
Красные линии: Power не трогает CAN, без actuator (#2 ).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Signed-off-by: Alexander <akotenev2003@gmail.com >
2026-06-24 20:51:58 +03:00
kk0t9
fd5c5c2dd5
docs(v0.2): синхронизация швов boot-конвейера + статус
...
P6.5: CLAUDE.md — v0.2 ГОТОВО, следующее v0.3/v0.5 параллельно поверх v0.2.
a-base §4 — dev-VM Stage 0/1/2 = фазовые таргеты + shturman-splash (software-render),
U-Boot framebuffer/A-B/secure-boot — HW (VM↔HW-граница). v0.1-v0.6 спека §13 —
шов «shturman.target → зонтик; critical set → stage1.target».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Signed-off-by: Alexander <akotenev2003@gmail.com >
2026-06-24 20:20:32 +03:00
kk0t9
e841c082b3
docs(v0.2): план реализации boot-конвейера (План 6)
...
P6.1 общий рендер-хелпер shturman-render (рефактор из shell) →
P6.2 shturman-splash (Stage 0) → P6.3 фазовые systemd-таргеты + splash/warmup +
зонтик → P6.4 justfile/lima/E2E-блок Stage 0/1/2 → P6.5 verify в Lima + acceptance.
TDD-шаги с полным кодом, без плейсхолдеров. Self-review: покрытие спеки полное.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Signed-off-by: Alexander <akotenev2003@gmail.com >
2026-06-24 19:57:36 +03:00
kk0t9
9a3b6a8753
docs(v0.2): спека boot-конвейера (Stage 0/1/2 + splash)
...
Веха v0.2: рефактор плоского shturman.target в фазовый конвейер.
- Stage 0: shturman-splash (Slint software-render → splash.png, до первого кадра);
- Stage 1: критический набор v0.1 → shturman-stage1.target (без изменений тела);
- Stage 2: shturman-stage2-warmup (oneshot-плейсхолдер, после кадра);
- shturman.target → зонтик; общий headless-render хелпер из shell переиспользует splash.
D-Bus-поверхности нет (фазы — systemd). Splash в VM = software-render PNG
(U-Boot framebuffer — HW, шов §10). Тайминг <10c — функц. в VM, вердикт на RK3588.
Приёмка: фазы разделены + splash до кадра + warmup после + регресс v0.1/v0.6 зелёный.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Signed-off-by: Alexander <akotenev2003@gmail.com >
2026-06-24 19:51:49 +03:00
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
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
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
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
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
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
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
kk0t9
08d787d977
docs(domain E): v2 — ретро-ревью pass-2 (5 находок) + tech-stack ISO-TP
...
- ISO-TP (ISO 15765-2): нативный CAN-OBD требует can-isotp/CAN_ISOTP для multiframe
(Mode 03 DTC, Mode 09 VIN), не голый socketcan; адресация 0x7DF/0x7E8..0x7EF
- планировщик опроса: бюджет req/s на транспорт (ELM327 half-duplex) + приоритеты PID,
round-robin при насыщении; эффективная частота = min(desired, потолок, доля бюджета)
- §5a безопасность активного опроса: гейт по движению, предпочтение passive listen-only,
fail-safe при аномалиях шины, риск ретрофита; «безобидность» read-запросов условна
- §5b отказ/восстановление транспорта: bus-off + restart-ms, ELM327 reconnect,
Online=false → unavailable, без зависания (#4 )
- владение computed: core (состояние/мгновенный расход) vs плагин (trip-производные)
- tech-stack: CAN/OBD row + ISO-TP
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 01:27:25 +03:00
kk0t9
02f13db1f3
docs(domain D): v2 — ретро-ревью pass-2 (9 находок) + кросс-док
...
- AEC (эхоподавление, loopback-ref из PipeWire) добавлен в пайплайн — нужен для
wake-word во время воспроизведения и barge-in (был полностью пропущен)
- auto-fallback: v1 = online degradation UX, офлайн-фолбэк (llama.cpp) = v3 (раньше
фолбэкать в v1 было некуда); offline-first (#3 ) в v1 частично, полный — v3
- инференс: ONNX (Silero) + Vosk через нативный Kaldi (не «всё через ONNX»)
- vehicle-context: контракт инъектора — только quality=valid, гейт по состоянию машины,
ассистент декларирует vehicle_read через прокси; деградация на простых авто
- wake-word по состояниям питания (не безусловно always-on, риск разряда; Stage 2; гейт Power/B)
- distraction: owner Shell §7, скорость K(GPS v1)/E(OBD v2); журнал wake-word/mic
- кросс-док: tech-stack (Porcupine отвергнут), principles #3 (фазировка офлайн-диалога)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 01:25:11 +03:00
kk0t9
d112f5397d
docs(C-shell + кросс-док): ретро-ревью (6 находок) + синхронизация
...
C-shell v2:
- GPS-скорость для distraction — домен K (ru.shturman.Location), не E (E это OBD, v2);
E — уточнение OBD-скорости в v2 + быстрый статус машины
- механизм поверхности: Wayland slot-протокол ru.shturman.shell_slot + slot-token,
не «handle по D-Bus»
- fail-safe distraction при потере/устаревании скорости (консервативный дефолт,
гистерезис, арбитраж GPS/OBD)
- контракт статус-бара: network «unknown» до Connectivity; часы — до синка времени
Кросс-док:
- architecture §1 (ELM327-оговорка к «физическому» read-only), §5 (положение/GPS из
Location/K, не Vehicle-Data), §7 (Perm-Broker = грантодатель, статика — прокси+sandbox),
§8 (surface через Wayland slot-протокол)
- ipc Shell.RegisterScreen → slot_token
- dev-environment: cage → smithay/weston в журнале и списке пакетов
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 01:06:05 +03:00
kk0t9
64ef300ef4
docs(plugin-sdk): v2 — ретро-ревью (6 находок)
...
- версионирование: shturman_api ↔ набор D-Bus-мажоров; хост экспортирует все
поддерживаемые мажоры параллельно; неподдерж. версия → Error.Unsupported (не тихо)
- IntentHandler: обязательный dispatch-таймаут; крэш/таймаут/NotAvailable →
деградированный ответ (#4 ), пайплайн не виснет (#11 )
- vehicle_read: per-vehicle Unavailable (Subscribe ок, SignalChanged молчит, плагин
деградирует); install-ревью предупреждает о неподдерживаемых сигналах
- авторитет манифеста: extension_points.tiles авторитетны, ui_tiles — квота (len ≤ N)
- storage: квота (ENOSPC плагину не системе — бережёт /data), remove чистит, миграция
- lifecycle: discover/install только для сторонних; first-party — в base-образе, без install
- network host-allowlist приведён к best-effort (синхрон с security-privacy)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 01:02:43 +03:00
kk0t9
d9209987e4
docs(hardware): v2 — ретро-ревью (8 находок)
...
- ELM327 = software-дисциплина (полноценный CAN-узел, может TX); физический read-only
инвариант только на нативном CAN в silent-режиме (уточнить architecture/sec-privacy §1)
- конверт входа по ISO 7637-2/16750-2: 9-16В, cold-crank ~6В, jump-start 24В, load-dump TVS
(вместо размытого «40+В»); under-voltage brown-out + гистерезис → graceful shutdown
- hold-up как числовой контракт (ток×hold-time×дератинг −40°C/старение) + load-shedding
- §1a тепловой/механический конверт + темп-класс (industrial/AEC-Q100) + cold-start + охлаждение
- детект ACC кондиционированный: debounce + crank-приоритет (нет ложного shutdown на старте)
- контракт задней камеры (CVBS, reverse-сигнал, latency-бюджет #11 , fail-safe), CAN front-end
(трансивер/заземление/ESD/backfeed pin16), тир носителей /data (eMMC прод / SD dev)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 00:58:10 +03:00
kk0t9
3790715fc7
docs(security-privacy): v2 — ретро-ревью (10 находок)
...
- аудио per-node гейтинг (PipeWire Security Context + WirePlumber), не голый сокет:
audio_out ≠ audio_in; capture только по runtime-гранту
- сеть: строгая гарантия только бинарно on/off; host-allowlist best-effort
(DNS-allowlist обходится прямым IP — нужен forced-proxy по SNI/Host)
- якорь first-party не существует до v4: v0-v3 = trust-by-build/физконтроль
- целостность id при установке (отказ при коллизии; ru.shturman.plugin.* зарезервирован)
- жизненный цикл гранта: while-in-use, авто-снятие на stop/crash; enforce-split
(статически прокси+sandbox/App-Host, рантайм-гранты Perm-Broker)
- НОВОЕ: §1a Модель угроз (адверсарии↔слои + out-of-scope)
- 152-ФЗ: явное отзываемое согласие (не только уведомление), минимизация VIN/локации,
роли оператора/обработчика в BYO, локализация ≠ правовое основание
- audit-log промотирован в нормативный (владелец A §9 + UI домена C)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 00:55:15 +03:00
kk0t9
76596408e1
docs(data-model): ретро-ревью (5 находок)
...
- dtc_count диапазон 0..255 → 0..127 (поле 7-битное)
- добавлено runtime-поле quality (valid/stale/unavailable) + max_age, ортогонально
статической availability (синхрон с ipc GetSignal/SignalChanged)
- §3: детект Mode 03/07/0A через trial-read (нет support-bitmask); пустой PID 0x00
не каскадит «всё Unavailable»; MVP (mil_on + Mode 03) не зависит от пробинга
- убран ложный ярлык «SI» (km/h, rpm, °C — не СИ) → «канонический набор единиц»
- module_voltage: отметка, что property в ipc = ModuleVoltage
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 00:51:10 +03:00
kk0t9
2a9f9925cc
docs(ipc): v2 — ретро-ревью (10 находок)
...
- enforcement: прокси даёт грубую изоляцию (сервис/метод), тонкую (per-signal,
per-key) делает сам сервис по идентичности sender — прокси не видит payload
- PermBroker: идентичность только из соединения, CheckCapability(cap) sender-scoped
(не принимает app аргументом → нет спуфинга); GrantChanged адресный
- НОВЫЙ сервис ru.shturman.Location (домен K) — GPS/положение; GPS-скорость не через E
- ошибки Stale/Timeout (транзиентно) vs NotAvailable (постоянно); GetSignal с таймаутом
- desired_max_hz = агрегатный hint (не per-subscriber троттл); подписки owner-bound,
авто-снятие по NameOwnerChanged; quality-поле; BatteryVoltage→ModuleVoltage
- RegisterIntents(handler_path) — фразы из манифеста; версии-мажоры сосуществуют
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-21 00:49:41 +03:00
kk0t9
231a64300d
docs(domain A): v2 после adversarial-ревью (24 находки) + кросс-док
...
Существенная переработка base-system по итогам multi-agent ревью:
- A/B-единица = весь boot-юнит (kernel+dtb+initramfs+rootfs) на слот; загрузчик вне A/B
- bootcount/bootlimit + mark-good (Shell-кадр) — иначе откат не срабатывает
- overlay upper/work на tmpfs; персист только через /data
- ФС /data: f2fs(рек)/ext4 + power-safe mount + durable-write (fsync/rename)
- at-rest шифрование /data (fscrypt, eFuse-bound, v4)
- watchdog: SoC+MCU разведены, вооружён в boot-окне, единственный владелец
- boot-порядок исправлен под architecture §6 (splash в Stage 0, ядро в Stage 1)
- secure boot = OTP-eFuse необратим + key-mgmt (не «мягкий переключатель»)
- НОВОЕ: время (RTC/NTP/GPS, TLS-gating), память (zram/OOM/cgroup), логи
(journald volatile + критичное в /data + pstore), first-boot, factory-reset, локаль
- OTA: A=механизм/подпись, L=канал; verified-boot в бюджете boot; SD-тир; образ v0≠v4
Кросс-док: roadmap (образ v4 = флешируемый релиз), hardware (тепло/eMMC ✅ резолв),
security-privacy (at-rest шифрование как открытый→направлен в A §3).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-20 21:12:35 +03:00
kk0t9
47d53d0956
docs(domain C): Shell/UX — спека + ревью-фиксы; cage→smithay
...
- спека домена C: композитор, слот-модель, декларативный UI-DSL (резолв вопроса),
тема, driver-distraction, интеграция ассистента, ввод
- КОРРЕКЦИЯ: shell = кастомный multi-client композитор на smithay (Rust); cage
(single-app kiosk) не годится для мульти-поверхностной слот-модели → правка
в tech-stack и dev-environment
- ревью-де-риск v0: shell стартует как Slint-ап без внешних поверхностей, полный
smithay-композитор — с первым surface-апом
- ревью-фазинг: статус машины в статус-баре → v2; distraction по GPS-скорости в v1
(раньше OBD); день/ночь v0 по времени/GPS; настройки растут с фичами
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-20 20:53:05 +03:00
kk0t9
a8895ab99f
docs(domain D): Assistant — спека + ревью-фиксы
...
- спека домена D: пайплайн (wake→VAD→STT→router→[локальные/LLM]→TTS, ONNX Runtime),
функции (MVP/later), vehicle-context injection (killer), provider-agnostic LLM,
интенты, память о водителе (.md), приватность
- ревью: openWakeWord вместо проприетарного Porcupine (принцип #12 ); мягкая
деградация при нестабильной сети до офлайн-фолбэка; креды LLM — свои у пользователя;
+ контекст-размер, офлайн-STT в шуме, function-calling, обучение wake-word
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-20 20:45:20 +03:00
kk0t9
01119a4ccf
docs(domain E): Vehicle-Data — спека + ревью-фиксы
...
- спека домена E по шаблону: назначение/границы, функции (MVP/later),
данные/интерфейсы, зависимости, открытые вопросы, журнал решений
- MVP-ядро killer-фичи: MIL-статус (PID 01) + чтение DTC (Mode 03), универсально
- ревью: покрытие OBD-протоколов (не-CAN старые авто → ELM327 мульти-протокол),
OBD-порт ≠ все шины, коалесцированный опрос, объём DTC-базы, ELM327-клоны, staleness
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-20 20:29:07 +03:00
kk0t9
fb27d8d2fe
docs: завершить Tier 1 (контракты) + ревью-фикс red-line CAN
...
- security-privacy: изоляция, capabilities, гейтинг по каналам, приватность/152-ФЗ;
first-party = вшит в подписанный образ; рисковые комбинации (vehicle_read+network)
- plugin-sdk: манифест, точки расширения, коллизия интентов, host-allowlist
- hardware: RK3588, power-safe, периферия, HAL/BSP портирование
- ВАЖНО: уточнён red-line CAN (принцип #2 + hardware §4): «чтение» = без
управляющих/actuator/write-передач; диагностические OBD read-запросы допустимы
(иначе не прочитать DTC); listen-only — только пассивный сниффинг
- + автозащита питания, тепло, износ eMMC; кросс-доковые аннотации
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-20 20:28:52 +03:00
kk0t9
3d13bb5827
docs: tech-stack + контракты ipc/data-model (+ ревью-фиксы)
...
- tech-stack: Rust-first (один прод-рантайм; Python — dev-only), полный стек, крейты
- architecture: ассистент Python→Rust для консистентности; boot-порядок
(Broker+App-Host до Shell); потолок частоты сигналов ~10–20 Гц
- contracts/ipc: реестр D-Bus (сервисы ядра/апов, соглашения, портал-брокеринг)
+ открытые вопросы из self-review
- contracts/data-model: VSS-aligned каталог сигналов, OBD-PID маппинг, DTC-модель;
добавлен MIL-статус (PID 0x01) для killer-фичи, состояние машины, расход-estimate
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-20 20:01:36 +03:00
kk0t9
9e685edd02
docs: заложить фундамент проектирования Штурмана
...
Каркас документации + содержательный фундамент (фаза проектирования,
реализация отложена):
- vision: видение, позиционирование, границы (вариант B, 2 красные линии)
- principles: 13 сквозных принципов (red lines, offline-first, power-safe…)
- architecture: тонкое ядро + SDK, planes, lifecycle, песочница, хостинг UI,
карта связей + журнал из 6 решений
- dev-environment: разработка с Mac (Lima/ARM64, vcan, Vehicle Simulator)
- индексы contracts/ и domains/ (+ единый шаблон домена, заделы по камерам)
- заготовки glossary, capability-catalog, roadmap
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-20 19:28:16 +03:00