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:
parent
012e4e1d59
commit
bd528e3443
2 changed files with 21 additions and 2 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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. |
|
||||
|
|
|
|||
Loading…
Reference in a new issue