From b9500356b081e5b4fd2b599be0524fce4cf92667 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 25 Jun 2026 00:21:10 +0300 Subject: [PATCH] =?UTF-8?q?docs(v0.3):=20=D1=81=D0=B8=D0=BD=D1=85=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=88=D0=B2?= =?UTF-8?q?=D0=BE=D0=B2=20power-safe=20+=20=D1=81=D1=82=D0=B0=D1=82=D1=83?= =?UTF-8?q?=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Двунаправленные швы (спека 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 Signed-off-by: Alexander --- CLAUDE.md | 11 ++++++++++- docs/contracts/ipc.md | 1 + docs/domains/b-power-lifecycle.md | 10 ++++++++-- docs/specs/v0.1-v0.6-foundation.md | 12 +++++++----- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 0894d65..7638750 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -58,7 +58,16 @@ software-render → `/run/shturman/splash.png`, `Before=shell` → до перв `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 и `v0.5` полный shell (живой weston-shell) — параллельно поверх v0.2 · затем `v0.4` MCU/thermal. +**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 — решение позже. diff --git a/docs/contracts/ipc.md b/docs/contracts/ipc.md index b17d025..d9c3887 100644 --- a/docs/contracts/ipc.md +++ b/docs/contracts/ipc.md @@ -60,6 +60,7 @@ - **Методы:** `GetPowerState() → state` (enum `off`/`accessory`/`running`/`shutting_down`/`sleep`/`battery_cutoff`), `RequestSleep()` (внутр.). - **Сигналы:** `AccChanged(on)`, `ShutdownImminent(seconds, reason)` (`reason ∈ acc_off|under_voltage|thermal|battery_cutoff`), **`ShutdownAborted()`** (re-power до PONR), `Sleep()`, `Wake()`. - **Properties:** `IgnitionState` (off/accessory/running — **канон**; E зеркалит, не дублирует), `Uptime` (монотонные часы), `PowerSource` (`vehicle_12v`/`holdup_cap`/`sleep_rail`/`low_battery`). +- **Реализация (v0.3):** состояние/сигналы **оживлены из FSM** (`PowerFsm` в `shturman-power`, не mock); `ShutdownImminent`/`ShutdownAborted` — из реальных переходов (abort до PONR + grace-таймер). `Sleep`/`Wake`/`RequestSleep` объявлены, но **зарезервированы** (v1/v2, B §7). Источник событий (ACC/voltage/thermal через MCU) → v0.4; в v0.3 кормит dev-mock. ### `ru.shturman.Settings` — конфигурация и состояние - **Методы:** `Get(key) → value`, `Set(key, value)`, `List(prefix) → [key]`, `Reset(key)`. diff --git a/docs/domains/b-power-lifecycle.md b/docs/domains/b-power-lifecycle.md index b97c0be..3aa4471 100644 --- a/docs/domains/b-power-lifecycle.md +++ b/docs/domains/b-power-lifecycle.md @@ -7,6 +7,12 @@ Статус: **v2 (на ревью).** v2 — после adversarial-ревью (22 находки). Связано с: [architecture.md](../architecture.md) (§6) · [hardware.md](../contracts/hardware.md) (§3 питание/MCU) · [a-base-system.md](a-base-system.md) (§5–§11) · [ipc.md](../contracts/ipc.md) (`Power`) · [principles.md](../principles.md) (#5) · домены D (гейт wake-word), E (engine-state) +**Реализация (v0.3):** срезы **B01–B07** реализованы — чистый `PowerFsm` (§2: `off↔accessory↔running→shutting-down +{abortable→committed}→off`, abort до PONR) + сервис `ru.shturman.Power` оживлён из FSM (grace-таймер + durable-barrier +`sync` на commit), watchdog/save-time-конфиг. **VM-модель:** abort/PONR в Lima = stop+umount+remount, power-cut = +SIGKILL+`fsck`. Аппаратное (MCU/hold-up/heartbeat/`safe-to-cut`/fail-safe-таймер) и выбор **B08/B09** → **v0.4**; +sleep/wake/battery-cutoff — каркас (no-op), тело → v1/v2 (§7). Спека: `docs/specs/v0.3-power-safe.md`. + --- ## 1. Назначение и границы @@ -193,8 +199,8 @@ power-эффектом; ни одно SoC-сообщение не должно ( ## 12. Открытые вопросы -- 🟡 **MCU-копилот vs supercap-only** (hardware §3) — определяет владельца ACC/watchdog, **наличие - независимого бэкстопа и fail-safe-снятия при зависшем SoC**, и доступность scheduled-wake. +- 🟡 **MCU-копилот vs supercap-only** (hardware §3, **B08/B09**) — определяет владельца ACC/watchdog, **наличие + независимого бэкстопа и fail-safe-снятия при зависшем SoC**, и доступность scheduled-wake. **→ v0.4** (вероятно нужна аппаратная проверка). - ◻️ **Протокол SoC↔MCU** (UART/I2C/GPIO, формат, keepalive, политика тишины-линка, replay-защита) — shutdown-подмножество уже специфицировано в §4/§5, остальное здесь. - ◻️ **Бюджет разряда АКБ** (sleep, ACC-off listening, battery-cutoff порог) — числа с hardware. diff --git a/docs/specs/v0.1-v0.6-foundation.md b/docs/specs/v0.1-v0.6-foundation.md index 1995420..504dc4a 100644 --- a/docs/specs/v0.1-v0.6-foundation.md +++ b/docs/specs/v0.1-v0.6-foundation.md @@ -242,7 +242,7 @@ shturman/ `dbus-daemon`) — герметично, параллелизуемо, без root (§9). - Изоляция песочных апов — через прокси (появится с App-Host, v3). -### 5.2 `ru.shturman.Power` — стаб (B04, домен B §9) +### 5.2 `ru.shturman.Power` — стаб v0.1 → **реальный FSM v0.3** (B03/B04, домен B §9) - **Имя/путь/интерфейс:** `ru.shturman.Power` · `/ru/shturman/Power` · `ru.shturman.Power1`. - **Методы:** @@ -258,11 +258,13 @@ shturman/ - `IgnitionState: s` ∈ `{off, accessory, running}` — **канон** (B §1; E зеркалит, не дублирует) - `Uptime: t` — секунды **монотонных** часов (`CLOCK_MONOTONIC`, B §8) - `PowerSource: s` ∈ `{vehicle_12v, holdup_cap, sleep_rail, low_battery}` -- **Стаб-поведение (v0):** старт в `running`/`IgnitionState=running`/`PowerSource=vehicle_12v`; - `Uptime` растёт монотонно. **Никаких** методов записи/actuator (#2). Реальная FSM/секвенсинг — v0.3. +- **Поведение:** старт в `running`/`IgnitionState=running`/`PowerSource=vehicle_12v`; `Uptime` растёт монотонно. + **Никаких** методов записи/actuator (#2). **v0.1 — плоский стаб; v0.3 — реальный `PowerFsm`** (состояния/переходы B03, + graceful shutdown подход A, grace-таймер + durable-barrier `sync` на commit/PONR); `power_state`/`ignition`/`source` — + проекции FSM. Реальный источник событий (ACC/voltage/thermal через MCU) → v0.4; в v0.3 события кормит dev-mock. - **Dev-mock (feature `dev-mocks`):** доп.интерфейс `ru.shturman.dev.PowerMock1` на том же объекте — - «**fake-ACC**» для тестов и будущего v0.3: - - `SetAcc(b on)` → меняет state/IgnitionState + эмитит `AccChanged` + «**fake-ACC/voltage/thermal**», **кормит входы FSM** (v0.3) для тестов/E2E: + - `SetAcc(b on)` → `Event::AccOn`/`AccOff` (FSM) + эмитит `AccChanged` - `SetIgnition(s state)` - `TriggerShutdown(u seconds, s reason)` → эмитит `ShutdownImminent` - `AbortShutdown()` → эмитит `ShutdownAborted`