Watch
1
0
Fork
You've already forked SouveraineOS
0

docs: 08(f) surfaced — the state machine has a readout

Device page renders state, evidence, per-source health, sensors_degraded and the
decision trail. Notes what is still absent from device_state: last-seen per
source, and grip as a fourth source.
This commit is contained in:
Fimeg 2026-07-31 13:12:19 -04:00
commit bd528e3443
2 changed files with 21 additions and 2 deletions

View file

@ -102,6 +102,25 @@ That split matters: a health readout that is merely accurate is useful the day
it ships, whereas a controls page over a machine that ignores its own thresholds
would be lying.
**Built 2026-07-31 (souveraine `1c90d7f`) — the readout half.** `DeviceEvidence`
was egress-only: every surface could *report* input to the machine and none could
*read* it back. It now has an ingress that polls `device_state` and
`forensic_log`, and the Device page renders state, lock phase, panel, dimmed,
display-active, idle, observed + confidence, wake-suppression, per-source health
with the `sensors_degraded` banner, and the last twelve decisions with their
reasons. Strictly a projection — it holds nothing the protocol owns and branches
on nothing, so it does not become §1's eighth actor; and it polls only while a
surface is watching, so an open settings page is not a request per second all
day. `available: false` renders as "sessiond is not answering on this device"
rather than healthy-looking zeroes, which is §10's rule that "no evidence" and
"evidence says nothing is happening" are different states.
Still owed here: **last-seen per source** (TASK-19 asked for it; `device_state`
ships health and freshness but no timestamp, so it is not shown rather than
faked), and **grip as a fourth evidence source** — it is absent from
`device_state` entirely, so "why didn't my squeeze work" still has no answer on
the device. Controls remain blocked on TASK-08(g).
## Acceptance
1. Hammer Settings icon ten times: exactly one standalone PID/window, zero new

View file

@ -36,9 +36,9 @@ Four that are cheap relative to what they unblock:
| # | Task | What's left |
|---|------|-------------|
| 08 | [Device state manager / power profiles](08-device-state-manager.md) | Largest task; sub-divide before starting. (e) lease missing, **(f) `sensors_degraded` reaches no surface**, (g) confidence gates need a decision before code. |
| 08 | [Device state manager / power profiles](08-device-state-manager.md) | Largest task; sub-divide before starting. (e) lease missing, (f) **surfaced 2026-07-31** — health, evidence and the decision trail render on the Device page; last-seen and grip still absent from `device_state`. (g) confidence gates need a decision before code. |
| 16 | [culver: messenger + contacts](16-culver-messenger-contacts.md) | A/B/D landed. C (contact card) builds and awaits phone acceptance. F is the folded-in TASK-01. |
| 19 | [First-party Settings control center](19-settings-control-center.md) | Owes the state-machine + source-health readout. 08(f), 34 and 42's layer 3 all surface here. |
| 19 | [First-party Settings control center](19-settings-control-center.md) | State-machine + source-health readout **built 2026-07-31**, unverified on glass. 34 and 42's layer 3 still surface here. |
| 31 | [The radial dial](31-radial-dial.md) | Component, gestures and squeeze invocation are live. **Entries are still a list in `DialHost.qml`** — they must come from the verb tables. |
| 30 | [Agent reach: verb tables](30-agent-reach-verb-tables.md) | sessiond has describe + refusal codes + intent. Dock, apps, shell and settings do not. One session per surface. |
| 42 | [Build outcomes are invisible](42-build-outcomes-are-invisible.md) | Layer 1 built (`tools/ci-status.sh` + push hook). Layer 2 is TASK-29's, layer 3 is TASK-19's. Pin-rot prevention unbuilt. |