Four docs recorded 'nothing starts it' as settled fact and concluded don't use the target, where the conclusion available was light the target. viewtop's session launcher starts it now.
8.2 KiB
DUMP · task-doc duplication + state-machine findings — 2026-08-14
Handoff. Nothing here is pushed. One commit exists locally and is described in §1.
1. Landed locally, NOT pushed
souveraine primary is ahead 1: c31fa10 stop expecting the accelerometer nothing reports.
EXPECTED_SOURCES still listed Accelerometer after 6b67512 (08-04) unclaimed
it for 14% of a core. So SOURCE_EXPECTED_WITHIN (300 s) elapsed every boot,
accel went Absent, any_down() counts Absent, and sensors_degraded read
true on 3074 consecutive snapshots in the current trail file alone — TASK-19's
Device page banner has been lit for ten days over a sensor that was deliberately
removed. The const's own doc comment forbids exactly this.
Gates, on archdev, cargo test --features sessiond --bin souveraine-sessiond:
126 pass. Reintroduce the bug and exactly two fail (left: Absent right: Unknown,
left: 3 right: 2), so the gate is proven able to fail. Clippy: 30 errors, and
the same 30 with and without the change — all pre-existing.
The push is an open decision. It publishes into edge, which today carries
the poisoned r498. The publish would supersede it and unblock pacman -Syu — but
it carries 3670b88 and 1ef8a20 along, both of which AUDIT §6 marks not
exercised.
2. The pocket veto's only measured effect is refusing Casey
Measured across all three trail generations (~10 MB):
- 17
input-refusedentries total. 17/17 areDoubleTapToWake. No other trigger has ever been refused. - All 17 are one burst: ts 1786671941, 943, 945, 945, 946, 946, 947, 947, 948, 948, 948, 949, 949, 950, 950, 951, 951 — 17 refusals in 10 seconds, accelerating from one per 2 s to two per second.
- Snapshot at refusal:
belief=pocket confidence=0.70 covered=true locked=true lit=false active=false,proximity_near=true.
That is Casey at a dark screen tapping harder because nothing happened. The veto has never refused an actual pocket. True positives: zero.
Casey's mechanism, 2026-08-14: "if I double tap 3 or 4 times in a quick
succession that's the whole belief should shift a bit." A pocket does not emit
escalating deliberate double-taps, and the FTS controller recognises DBLTAP
specifically (PAF/touch.md), not arbitrary contact — so a burst of them is
intent by construction.
suppress_wake (device_state.rs:2795) is a pure function of placement() with
no memory. note_input_gated (:2372) already records every refusal through
record_decision — the evidence is being written and nothing reads it back.
Numbers come off the trail per §9.5: the burst opens at +2 s and tightens to 2/s, so ~3 attempts inside ~5 s sits above anything a pocket produces and below what Casey reached in under six seconds. Fail open, and say so in the trail.
3. The documented test gate never compiles sessiond
CLAUDE.md documents cargo build / cargo test. souveraine-sessiond is
required-features = ["sessiond"], so a plain cargo test never builds
src/sessiond/ at all.
cargo test -> 389 + 10 + 8, zero sessiond
cargo test --features sessiond --bin souveraine-sessiond -> 126 tests
device_state.rs — 5300 lines, the state machine, LEGAL_TRANSITIONS, the
confidence arithmetic, source health, the forensic chain, bearer — has 126 tests
the documented command has never once run. Every "389 tests pass" in
AUDIT-2026-08-14.md was a suite that did not compile the daemon being changed.
Same for clippy: 30 errors under --features sessiond --all-targets, invisible
to the documented gate.
4. souveraine/docs/tasks/ is eight dead copies and an index
SouveraineOS/docs/tasks/archive/from-substrate/README.md already did this work
properly — 18 files, each with its new owner named. The originals were never
removed, and have since been committed to git, so they now read as
authoritative.
Six are byte-identical to their archived twins (cmp -s, all six):
power-indication.md, quickshell-surface-package.md,
device-specific-quickshell-profiles.md, souveraine-cicd-pipeline.md,
souveraine-lock-primitives.md, souveraine-lock-primitives-session-prompt.md.
Two were promoted and renamed rather than archived:
souveraine-native-audio-privacy.md → docs/AUDIO-PRIVACY.md,
souveraine-settings-ipc-profiles.md → docs/SETTINGS-AUTHORITY.md.
The ninth is INDEX.md, byte-identical to docs/substrate/tasks/INDEX.md except
for nine lines — seven of which are the STALE banner ("generated 2026-05-19,
describes May") that only the substrate copy carries. The copy in the repo people
open is the one with the warning missing.
The two that actively misdirect
Audio. souveraine-native-audio-privacy.md and AUDIO-PRIVACY.md carry the
same task_id: souveraine-native-audio-001 and opposite architectures. The
souveraine copy: "Native PulseAudio is the only audio server… pipewire-pulse
is never started." AUDIT-updated AUDIO-PRIVACY.md (08-07): "PipeWire 1.6.8
owns the graph… Native PulseAudio and the old ABI-provider shims are historical
experiments, not the desired architecture." TASK-39 names
pipewire-abi-provider — which the souveraine copy is built on — as the retired
experiment that "must not drive current policy." Both files are
status: in_progress, priority: high.
Power. power-indication.md specifies services/PowerService.qml: a QML
singleton reading UPower and driving idle policy through IdleCoordinator.
DEVICE-STATE-MACHINE.md §12 forbids that exact shape and predicts an outside
adviser will propose it. TASK-33: "Do not add a fourth surface that reads UPower
directly. That is the problem." Its work-breakdown items 1–5 also describe
upower-fork work TASK-08(b) records as landed three weeks ago across four
commits (628283f, 718e921, f974714, beb94dc).
Also unindexed
Four files on disk in docs/tasks/ and absent from README.md: 49, 54, 61,
72. All four hold landed code or measured hardware. TASK-49 is the sharp one:
SouveraineOS/CLAUDE.md states it "was written about packaging that
TASK-25/29/32 already owned, and had to be deleted." It was not deleted, and it
is bearer/DNS/VPN, not packaging — with a landed src/sessiond/bearer.rs section
and acceptance #3–#5 still open.
5. Everything that does NOT go through the state machine
SensorSource is closed at { Proximity, Accelerometer, Light, Touch };
SensorValue is four booleans. So:
| Wanted | State of it |
|---|---|
| charge/battery | no variant. TASK-33's "last raw feed going straight to the glass", confirmed |
| thermal | no variant. TASK-08(h): 23 zones, nothing below 85 °C, policy empty |
| grip | no variant. TASK-19: "why didn't my squeeze work" has no answer on the device |
| lux | flattened to Changing(bool) — a change-detector cannot drive brightness |
brightness Action |
absent from the Action enum. TASK-47: "grep anchor src/ is empty" |
| last-seen per source | EvidenceSeen holds it internally, never crosses IPC |
6. Live risks found today, not addressed
kitty-touch-bridge— unpackaged overlay service on the daily driver holding a global uinput pointer when it fires. Claims to fail closed outside Kitty; unverified. START-HERE trap #5, §12's blind actor, and TASK-50 already says the agent "still reaches touch through uinput, which is the exact conflationinput.rsexists to prevent" — so this is a second one.- archdev mirror pollution.
/home/casey/Projects/souveraine/has a flattenedsrctree at its root —main.rs,core/,server/,bridge/,bin/,api/beside the realsrc/.main.rsthere is dated 08-05, so it predates this session. Left alone; deleting at the mirror root is Casey's call. libssc.so.2now malformed alongsidelibcmatrix.so.0u. TASK-25 logs the latter as the ldconfig warning on every transaction. There are two now.
7. Task queue as filed
1 fixed. 2 docs. 3 charge→machine. 4 lux enum. 5 brightness Action (blocked on 4). 6 grip. 7 last-seen. 8 kitty-touch-bridge. 9 tap-repetition belief shift. 10 the sessiond gate.
If only one thing gets done: §2. It is measured, it is small, and it is the one where the phone currently refuses its owner.