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.
9.7 KiB
9.7 KiB
SouveraineOS — task files
Single-session-sized work units. Each file is self-contained: the goal, the context a fresh session needs, the acceptance check, and where it connects. Pick one, open a session, finish it. Don't pull in neighbours unless they're a hard prerequisite.
This index says what is left, not what happened. History lives in the task
file. Closed work lives in archive/ with its full record
— nothing is deleted.
Start here
Four that are cheap relative to what they unblock:
- 46 camera — the drivers and CAMSS are already in our kernel; blueline's DT has no camera node at all. A same-sensor reference (Pocophone F1) sits in our own tree. Plausibly one session to a first frame.
- 31 dial contents — the component and the squeeze that opens it are live; its entries are still a hand-written QML list. Wiring them to the verb tables is what stops a third capability enumeration existing.
- 19 settings health readout — three separate tasks (08f, 42, 34) all owe their surfacing to this one page.
- 44 fingerprint, piece 1 — the vendor DT node and shim have sat unused in
staging/since 2026-07-07. Wiring them buys a wake source; biometrics is a separate, harder question.
Live — built, one check outstanding
| # | Task | What's left |
|---|---|---|
| 43 | viewtop: the Souveraine compositor | Runs on the phone. Another session is building the ext-session-lock admission gate — sync before touching it (head a308f39f). The two-client lock handoff is the thing not to get wrong. |
| 29 | SouveraineOS Updater | Ships and installs by pacman -Syu. Read-only on device until something runs a polkit agent — that is the shell's job. Also owns TASK-42's layer 2. |
In progress
| # | Task | What's left |
|---|---|---|
| 08 | Device state manager / power profiles | 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 | 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 | 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 | 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 | sessiond has describe + refusal codes + intent. Dock, apps, shell and settings do not. One session per surface. |
| 42 | Build outcomes are invisible | 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. |
| 02 | Lockscreen-as-Rust-system | sessiond's fallback should render the glance, not a second PIN pad. Stopgap shipped 07-17. |
| 14 | Overview → phone app grid | Paged app grid replacing the desktop workspace pane; Auxo-style running cards; unconditional Home path. |
Blocked or gated
| # | Task | Blocked by |
|---|---|---|
| 15 | Idle coordinator | Freezing app.slice would freeze sessiond, shell and secrets. Needs slice separation first (measured 07-25). |
| 28 | Handover on upgrade | TASK-27's packaging. Also owns TASK-13's outstanding cold-boot handshake check. |
| 25 | One repo, all packages | Parked 07-25 — four blockers before repo-add --sign. See TASK-27. |
| 40 | Inference tiering for the sensors | Nothing — it is the gate. P1 applied to sensord/grip/dial; gates the grip raw stream and TASK-31's IPC. Decisions first, then small code. |
Open
| # | Task | What's left |
|---|---|---|
| 48 | Shell dies on any reload that owes a lock | Fully diagnosed 07-29, 11 crashes since 07-17. A reload re-requests ext-session-lock while the outgoing instance still holds it → FATAL: Tried to show lockscreen surfaces without active lock. Sync with TASK-43 before touching the lock path. |
| 47 | Auto-brightness: anchors, none of it built | §12 reads as settled and has zero code behind its actuation half — no brightness Action, no anchors, grep anchor src/ is empty. The evidence half (lux in, health tracked) is live. |
| 46 | Camera: the front camera works | First frame captured 2026-07-29 on the running kernel — no reboot, no DT change. Both front IMX355 were already bound; nobody had tried streaming. Recipe + the stride/packing gotchas are in the task. Next: exposure controls, then libcamera. Rear IMX363 DT (c7784b716) still unbuilt but no longer the blocker. |
| 44 | Fingerprint (FPC1020) | Piece 1 (wake source / input) is a session — DT + shim already extracted. Piece 2 (biometrics) is a TrustZone question, answer it before scheduling it. |
| 45 | Haptics (CS40L20) | First: which chip actually drives the motor — pmi8998_haptics is what the dial's detents use today. Then port cs40l2x from Kirisakura; firmware blobs are committed. |
| 41 | Producers must be attested | Design first. Demonstrated live 07-28 — a squeeze and a dial-open both accepted from an SSH shell. |
| 36 | CHRE nanoapp host for the SLPI | Three methods to add; method table recovered 07-27. No longer on grip's critical path — wanted for DozeDeep detection and elmyra_haptics_control. |
| 34 | SLPI FastRPC session wedge | Re-diagnose. The real symptom: a DSP session survives its host daemon's death and only a cold boot clears it. No longer blocks grip. |
| 03 | Boot timing: splash → lock | The EBUSY handoff race is the last timing bug. Splash text killed, holder added. |
| 07 | WCD9340 mic | Functional since 07-20. One defect: the power pin that makes it work. Kernel branch mic-race-fix. |
| 09 | Suspend-resume FTS calibration race | Kernel-side real fix; interim fix shipped. Cold-boot only. |
| 12 | Face auth as a capability factor | Per-target. Phone needs front-camera bring-up — that is TASK-46's IMX355 half. |
| 17 | Keyboard + dictation polish | No word completion (stevia asks hunspell for en-us, the dict is en_US); no recording indicator on the mic key. The layout half moved to TASK-24. TTS now exists (10.10.20.123:7863) — the settings field can be filled. |
| 18 | Selection/highlight action menu | Component first, fluid before functional. Read Aloud is unblocked — TTS is live. |
| 20 | Player: video + agent control | Video, snapshot, manifest. Preserve the music path. |
| 21 | Reboot-to-Android confirmation | Scoped 07-22. A one-tap irreversible slot flip still sits bare in app search. |
| 23 | culver locked-notification nudge | Needs SyncBurst() + an IdleCoordinator schedule (TASK-15). |
| 24 | Keyboard layout rethink | Redesign from scratch, not more patches. Start from squeekboard us+apple. Casey decides where the mic key goes. |
| 27 | Gitea pipeline audit | The fixes. Overlay is not a package; no primary branch; poisoned build sysroot. |
| 32 | Pill and keyboard as owned apps | Both erroneous daily; neither has an owner or a shipping story. |
| 33 | Battery belongs to the state machine | Last raw feed going straight to the glass. The charge ceiling is writable today. |
| 37 | "Back" as a first-class verb | Our Gestures.qml is already the compositor half; can_go_back is the dial's enabled/reason. |
| 38 | Pill swipe-to-max swaps the keyboard | Micro. The only route to a terminal keyboard since stevia dropped its layout. |
| 39 | Audio levels as tracked state | Defaults + roles, not a save bug — WirePlumber persistence measured working 07-28. Do not add a second writer. |
| — | Unify the shell trees | DONE 2026-07-31 — verified by md5 across both devices: 918 differing files → 7, all 7 declared in the ii-phone overlay, laptop-only 0, zero stranded. The KEEP list was promoted to repo overrides, not lost. Blocks nothing; archive it. |
Conventions
- Repo of record:
~/Projects/souveraine(substrate + QML shell),~/Projects/Pixel3Arch(phone rootfs/overlays/kernel),~/Projects/SouveraineOS/docs(this tree). - Builds: on archdev (
10.10.20.123, ssh key~/.ssh/ani). Never the laptop (93% disk). - Phone: ssh aliases
pixel/pixel-rootat172.16.42.1. COLD boots only — a warm reboot poisons TZ/remoteproc. - CI:
SouveraineOS/tools/ci-status.sh <repo>reads outcomes from the Gitea API. The runner journal is not a status source. - Commits: no Co-Authored-By, no Claude attribution, terse sysadmin prose, no caveats in public messages.