Watch
1
0
Fork
You've already forked SouveraineOS
0
SouveraineOS/docs/tasks/README.md
Fimeg 39c9a022b4 TASK-32: record that --phone rsyncs --delete with no snapshot
Folds in the 2026-07-29 finding instead of a new task file; TASK-32 already owns
how these surfaces ship.
2026-07-29 17:55:18 -04:00

9.4 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) sensors_degraded reaches no surface, (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 Owes the state-machine + source-health readout. 08(f), 34 and 42's layer 3 all 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 motorpmi8998_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 ~900-file ii drift; blocks durable shell fixes reaching the phone.

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-root at 172.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.