Watch
1
0
Fork
You've already forked SouveraineOS
0

tasks: squeekboard is the sole OSK; add 71 (mobile scanner recon) and 73 (self-dashboard)

This commit is contained in:
Fimeg 2026-08-11 19:57:58 -04:00
commit c9d40b26e8
8 changed files with 274 additions and 57 deletions

View file

@ -1,23 +1,29 @@
# TASK 17 — Keyboard (stevia) + dictation polish
# TASK 17 — Squeekboard + dictation polish
**Status:** Squeekboard replacement source authored 2026-08-11; parser tests
green, full package build and glass proof pending. Stevia remains the active
fallback until the new Squeekboard package is installed and survives repeated
dismiss/reopen cycles.
**Status:** single-OSK cutover installed 2026-08-11. Pixel3Arch CI 1362 built
pkgrel 4; the phone runs it as the sole OSK, and the former second keyboard
plus process switcher are uninstalled. Commit `3794aa9` advances pkgrel 5 with
an explicit in-keyboard Daily/Terminal chooser and removes every dual-OSK
living path; CI 1368 and phone installation/glass proof remain.
## Current decision (2026-08-11)
One keyboard owns the phone: Squeekboard. The daily layout has a permanent
number row plus Fn/numpad; the terminal hint selects the compact terminal
layout. Both expose the same first-party dictation action. The old
Stevia/Squeekboard switcher and drag-up keyboard swap retire only after the
replacement is proven on glass.
One keyboard owns the phone: Squeekboard. Ordinary inputs select a four-row
iOS-style Daily layout with no terminal modifiers, arrows, Fn layer, or
permanent number row. Its mode key opens Squeekboard's own chooser, where
Terminal selects the five-row layout with Tab, number row, Ctrl/Alt/Esc,
arrows, and Fn/numpad. Terminal input purpose may select it automatically, but
the visible chooser is the reliable manual route in either direction. Both
layouts expose the same first-party dictation action and an explicit dismiss
key. No process is swapped and no shell or pill gesture chooses a keyboard.
`Pixel3Arch/pkgs/squeekboard` now carries:
- a `dictate` layout action that spawns packaged
`/usr/bin/souveraine-stt`;
- daily and terminal layouts with the mic available from their base rows;
- Daily and Terminal layouts with the mic available from their base rows;
- the Daily mode key and upstream chooser entry that make Terminal reachable
without relying on input-purpose hints;
- a Cairo-drawn, state-honest mic: restrained violet at idle, three breathing
violet bubbles while recording, a rotating broken ring while transcribing,
and a red-violet error mark;
@ -29,7 +35,7 @@ No bitmap was imported and no Stevia completion code was reused. Native
Squeekboard word completion remains the next layer after the single-keyboard
path is stable.
## Earlier Stevia path (historical, currently installed)
## Earlier Stevia path (historical, no longer installed)
- **stevia is the OSK**, patched to run under Hyprland. Upstream stevia
hard-requires `zphoc_device_state_v1` (phoc-private) before creating a
@ -59,7 +65,7 @@ path is stable.
1. **Dictation UX:** the earlier Stevia implementation established the state
contract. Squeekboard now renders that contract directly in the mic key;
package and glass proof remain.
pkgrel 5 publication, install, and glass proof remain.
**2026-07-30 progress:**
- `souveraine-stt` now writes a 3-state file
@ -82,16 +88,12 @@ path is stable.
(200px, no auto-scale). The taller auto value is
`['auto-portrait','auto-landscape']` (348px). Applies live, no restart.
Not a bug — just record the chosen default so a reflash keeps it.
3. **Layouts**: the vendored squeekboard `us+apple` (iOS-style) and
`us+hacker` designs are the target *feel*; stevia uses its own JSON
layout format (`src/layouts/*.json` in the stevia tree). Porting the
iOS layout to stevia is open design work — start from the squeekboard
header notes in `SouveraineOS/blueline/squeekboard/`.
The target is now explicit: iOS-like letter geometry, a permanent number
row, Hunspell completion retained, working language/layout switcher, mic
retained, and compact arrows available outside the terminal-only layout.
The parked `surfaces/quickshell/assets/keyboard/us.json` number-row draft
is input, not acceptance.
3. **Layouts**: the vendored Squeekboard `us+apple` reference produced the
four-row Daily board. Dense work keys remain a separate Terminal layout;
the explicit mode key and chooser connect them inside one process. A
permanent number row on Daily is deliberately absent. Native completion
remains the follow-on; it must be built in Squeekboard rather than copied
from the retired implementation.
5. **Hyprland key safety**: Pixel3Arch `a5fdbf6` ships stevia 0.56.0-5 with
high virtual eventcodes plus zeroed fallback modifiers. Keep the
compositor-collision hammer test (bound letters/digits must never dispatch
@ -104,9 +106,9 @@ path is stable.
## Context
- Patches: `Pixel3Arch/pkgs/stevia/0001-make-zphoc-device-state-optional.patch`
(Hyprland compat, upstream candidate) and
`0002-dictation-key-terminal-arrows.patch` (mic key + arrows).
- Retired dual-OSK implementation and its patches:
`Pixel3Arch/archive/retired-dual-osk-2026-08-11/`. This is evidence only;
no build, overlay, compositor startup, or package workflow reads it.
- CLI: `Pixel3Arch/rootfs-overlay/usr/local/bin/souveraine-stt`.
- Shell: `souveraine/surfaces/quickshell/modules/settings/SpeechConfig.qml`,
`modules/common/Config.qml` (speech block), `settings-phone.qml`.
@ -117,19 +119,20 @@ path is stable.
## Acceptance
Squeekboard raises from ordinary and terminal inputs, types letters/numbers,
and survives at least five dismiss/reopen cycles. Its mic key dictates real
speech into the focused field and visibly traverses idle → recording →
and survives at least five dismiss/reopen cycles. Daily's mode key opens the
chooser; Terminal exposes Tab, number row, Ctrl/Alt/Esc, arrows and Fn; the
chooser returns to Daily without losing the focused field. Its mic key dictates
real speech into the focused field and visibly traverses idle → recording →
transcribing → idle; the error state is also forced once. The AI side panels
must not dismiss or strand it. Only after that proof may Stevia,
`souveraine-osk-switch`, and the shell's keyboard-swap gesture be removed.
must not dismiss or strand it. Stevia and `souveraine-osk-switch` are already
removed from the live phone; no acceptance path may silently reinstall them.
Native word completion is a following acceptance step, not a blocker for the
single-keyboard cutover.
## Connects to
[[whisper-stt-server]] (the STT backend), TASK-15 (dictation is a network
fetcher the idle coordinator must wake for), the stevia patches are
upstream candidates (Hyprland compat especially). Under viewtop the OSK's
fetcher the idle coordinator must wake for). Under viewtop the OSK's
z-order is structurally enforced by the compositor (`ad2b6cb`, TASK-43) — a
layer derived from the surface's furniture role, not a layerrule — so the
layer-collision class this task fought in quickshell does not arise there.

View file

@ -1,8 +1,16 @@
# TASK 24 — Keyboard layout rethink
**Status:** 2026-07-24 — Casey is not pleased with the current state. The
layout needs to be rethought from scratch, not incrementally patched.
**Size:** redesign + implementation. **Repo:** `Pixel3Arch/pkgs/stevia`.
**Status:** superseded in implementation 2026-08-11 by TASK-17's one-keyboard
Squeekboard cutover; retained as the evidence that forced a reference-led
redesign. **Repo:** `Pixel3Arch/pkgs/squeekboard`.
The resulting Daily board starts from the validated iOS-style geometry and is
four rows with mic, dismiss, and mode keys. The mode key opens Squeekboard's
own chooser; Terminal is a separate five-row layout with Tab, number row,
Ctrl/Alt/Esc, arrows, and Fn/numpad. An input-purpose hint may select it, but
the visible chooser is the reliable route both ways. Stevia is no longer
installed. Remaining glass acceptance and word completion live in TASK-17;
do not resume the Stevia patch plan below.
## Problem

View file

@ -69,6 +69,17 @@ stubs is fine. A janky dial is not.
- Does not appear over a locked screen with anything personal on it.
- Reaches a device by a mechanism that survives the next update.
## Visual references (recon 2026-08-11)
- `ay-hooshan/circular-menu` — a ring of Qt Quick Shapes wedges with a center
cutout, elastic open animation, per-wedge icon color and click. No
screenshots upstream — **unproven visuals**, treat as geometry reference
only, not a look to copy. ~664 lines.
- `nextsigner/timelineview` — Qt 5.14 "Zooland": concentric-circle chart
rendering (bodies/houses/signs/aspect arcs) plus a `ZmMoveTime` motion dial.
The concentric ring composition and arc math are the sample; the astrology
content is not.
## Connects to
TASK-13 (squeeze — the first invocation), TASK-30 (the vocabulary),

View file

@ -1,8 +1,9 @@
# TASK 32 — The pill and the keyboard, as owned apps
**Status:** open. Both are erroneous in daily use (Casey, 2026-07-26).
**Status:** partly resolved 2026-08-11. Squeekboard now has one package and one
runtime owner; the pill and the shell's `$HOME` delivery still need ownership.
**Size:** two sessions, one each. **Repo:** `~/Projects/souveraine`,
`~/Projects/Pixel3Arch/pkgs/stevia`.
`~/Projects/Pixel3Arch/pkgs/squeekboard`.
## Why one task for two surfaces
@ -18,25 +19,25 @@ updates**, and what it refuses. Not a bag of fixes.
## The keyboard
**Current state:** stevia 0.56.0-7, patched for Hyprland, with a dictation mic
key. TASK-24 scoped the layout rework and it has not happened: backspace is on
the wrong row, the bottom row has seven keys against the reference's six, and
the layout matches no validated design. TASK-17 records the other live defect —
completion is on by default but stevia asks hunspell for `en-us` while the
dictionary is `en_US`, so it may still show nothing.
**Current state:** `souveraine-squeekboard` pkgrel 4 is installed from the
Pixel3Arch package repository and is the sole active OSK. Ordinary input gets
the four-row Daily board; its mode key opens Squeekboard's own chooser, where
Terminal selects the five-row board with Tab, number row, Ctrl/Alt/Esc, arrows,
and Fn/numpad. Both carry dictation and dismiss keys. Commit `3794aa9` advances
pkgrel 5 with that visible route and removes the remaining dual-OSK
provisioning. Stevia and the process switcher are absent. Publication, glass
acceptance, and native word completion remain in TASK-17.
**The rule TASK-24 already wrote and that must hold:** start from a validated
reference (squeekboard `us+apple`, gmankab `us-mobile`), not from first
principles. No layout change ships without a screenshot of the rendered
keyboard on the device.
**Update management.** stevia is a Pixel3Arch package built on archdev and
hand-carried; nothing publishes it (TASK-27). Upstream ALARM ships a
`squeekboard` that declares `conflicts=stevia`, so the phone currently pins
squeekboard to keep both — an interim recorded in `rootfs-overlay/etc/
pacman.conf` that must come off when our own squeekboard ships at a version
outranking theirs. The osk-switch toggle is the runtime arbiter and is staged,
not functional.
**Update management.** Pixel3Arch CI builds, signs, and publishes
`souveraine-squeekboard`; pacman owns the binary and both layout provenance
files. Commit `3794aa9` removes the old pin, dual-keyboard services, overlay,
and package workflow from every living path; their evidence is retained only
under `archive/retired-dual-osk-2026-08-11/`.
## The pill
@ -61,7 +62,8 @@ owns the fix.
- Each has a section in `docs/` naming what it owns, what it refuses, and how
it reaches a device — not a list of fixed bugs.
- Keyboard: layout matches a validated reference, screenshot-verified at every
level; completion actually completes.
level and through repeated dismiss/reopen cycles; completion actually
completes.
- Pill: the gesture table is single-sourced; adding a gesture touches one row.
- Both ship by a mechanism that survives an update, or the gap is named with
the task that owns it.

View file

@ -1,7 +1,11 @@
# TASK 38 — Pill swipe-to-max swaps the keyboard
**Status:** open, 2026-07-27 (Casey). **Size:** micro. **Repo:** `souveraine`
(`surfaces/quickshell`) + `Pixel3Arch` (osk-switch).
**Status:** superseded 2026-08-11; archive after TASK-17's remaining glass
acceptance. The phone has one Squeekboard process. Daily's mode key opens its
own chooser, which selects the five-row Terminal board and returns to Daily;
input-purpose selection is only a convenience. Stevia and
`souveraine-osk-switch` are uninstalled, so no pill gesture swaps keyboard
processes. The history below records why the discarded design existed.
## What Casey asked for

View file

@ -0,0 +1,51 @@
# TASK 71 — QmlMobileScanner as a components app candidate
**Status:** recon 2026-08-11, verdict owed. **Source reviewed:**
`emericg/QmlMobileScanner` (GPL-3.0, upstream clone for reference).
## What it is
A demo barcode & QR **scanner + writer** in Qt Quick: live camera scanning,
read-from-picture (WIP), barcode generation, and a SQLite history
(`DatabaseManager`). Phone, tablet, and desktop UIs in one tree, plus a small
`ComponentLibrary`. Backends: zxing-cpp v3.0.2, QZXing v3.3.0 (Qt6 port), and
zint v2.16 for generation. Qt 6.8+, Qt Multimedia with **ffmpeg backend**,
CMake.
## Why it fits (and the caveats)
- License: GPL-3.0 inside Souveraine's AGPL-3.0 is compatible — AGPL is a
GPLv3 superset, vendoring is legal, but the component's provenance must be
visible (thirdparty/ carries full zxing-cpp + zint trees already).
- The phone-side gate is **camera**: TASK-46 has the front IMX355 streaming
since 2026-07-29 with the rear IMX363 DT still unbuilt. Scanner can ship
laptop-first with a webcam and land on glass when the rear camera does.
- Qt Multimedia/ffmpeg is the heavyweight — check the ffmpeg backend actually
binds freedreno's V4L2 before committing; the no-GNOME/no-KDE constraint
doesn't bar Qt, but a second multimedia stack might be worth a fight.
- **fontawesome-qml** (`schnitzeltony/fontawesome-qml`, LGPL-3.0): flagged as
possibly needed. Verified: the scanner's QML has **no FontLoader or ttf
references** — icons are its own `MenuXxx` components and logo images — so
it **may already work** as-is; fontawesome would only matter if we re-skin.
Marked unverified, not assumed.
- `souveraine-components/` is referenced in `docs/README.md` (authority
binaries + audit ladder) but has **no local repo** — decide whether this
candidate lives in a new components repo (TASK-25 packaging story) or
stays an app package.
## What's owed
1. Verdict: adopt as component / adopt as app / archive the idea.
2. If adopt: dependency pass (ffmpeg backend on freedreno), icon story
(fontawesome verdict), and whether the demo-grade code (read-from-picture
WIP, writer WIP) matches the acceptance bar.
## Acceptance
One written verdict with the camera gate and multimedia stack named, and —
if adopt — the component landed in the repo of record.
## Connects to
TASK-46 (camera gate), TASK-25 (one repo, all packages),
`docs/README.md` (components reference).

View file

@ -0,0 +1,134 @@
# 73 — The self-dashboard: one spine, two skins (Gatehouse)
Status: **designed 2026-08-10/11, nothing built.** Working name for the house
skin: **Gatehouse** — name decision is Casey's, still open. Owner: Rook, under
Casey's direction.
Origin: the 2026-08-10 session (exported to clipboard) opened with Casey: *"I
was building a local desktop app vewsion"* of RedFlag, and then, on sshbool:
*"we're stealing it for RedFlag and SouveraineOS's implementation of the
self-dashboard. It'll need to include 'Agent Health' as well Federated Agents.
So massive expansion and we're stealing what we want from it into our own
desktop app."*
## The shape — decided
One spine, two skins. The UI is a view, never a state writer — both skins are
thin clients of the local agent; the authority stays in the agent/helper.
- **Skin 1 — RedFlag Desktop** (public, MIT, Codeberg): stays **Tauri v2**,
already the stack in `RedFlag/desktop/`. Tauri's value is for machines Casey
doesn't own: installers, updater, plugin ecosystem, a security model someone
else audits. Tray lives here. FEAT-007 owns it and is mostly built.
- **Skin 2 — House Gatehouse** (private): the **wry way**, souveraine-lens's
skeleton — `wry 0.56 + tao 0.36`, ~317-byte manifest, LTO/strip. No tray
code at all: Casey, 2026-08-11: *"we have QML we can build whatever we want
so tray is irrelevant as argument."* Presence is the shell's. Two
affordances:
- **The glance** — agent health, gate badges, pending approvals. A native
QML widget in the shell (`surfaces/quickshell/services/`), one socket
payload, no webview, no window.
- **The workbench** — SFTP panes, terminal, Monaco, fleet graph: the
sshbool frontend steal, in a wry window summoned by the shell over a unix
socket (the lens's own pattern: `--ipc $XDG_RUNTIME_DIR/souveraine/lens.sock`,
one JSON object per line, both ways).
- **The wall:** `gatedLocalApproval` hard-gates dnf/apt only —
`agent/internal/handlers/local_approve.go:52`, mirrored at
`LocalAgentApp.tsx:151`. SouveraineOS is Arch; the Pixel 3 is Arch ARM. So
RedFlag-as-self-dashboard, today, lists every update on the house machines
and can install none — which is exactly why `souveraine-updater` exists
(Rust + 16 QML, `updater-core/src/auth.rs:50`:
`pkexec /usr/bin/pacman -S --noconfirm` — no token, no closure, no gate).
- **The spine:** teach the closure resolver pacman. Signed repo metadata plus
`-Sp --print-format` gives the artifact set — tractable, and untracked (no
GATE-* covers it; GATE-006 is Docker). When the spine lands,
souveraine-updater's pkexec path becomes **deletable** rather than defended.
- **License flow is one-way:** MIT shell flows into the house freely;
house-specific never reaches the public mirror (the gitignored-`docs/tasks/`
trick). sshbool is Apache-2.0 — clean, decision settled 2026-08-10.
## Acceptance
- [ ] The pacman closure spine exists in the agent and resolves an update set
from signed repo metadata; a RedFlag gate verdict covers Arch packages.
- [ ] `pkexec pacman --noconfirm` is gone; souveraine-updater retired; update
approval on house machines goes through the gated flow.
- [ ] House Gatehouse repo exists: lens skeleton, socket IPC to the
agent/substrate, pacman-owned delivery (no updater, no second channel).
- [ ] The glance renders agent health and gate verdicts on the shell from the
socket; the workbench opens/summons from the shell and shows the same
payloads as a deep seat (SFTP, terminal, fleet graph).
- [ ] sshbool frontend pieces ported into the workbench; Agent Health and
Federated Agents views present.
- [ ] Public skin: FEAT-007 remainder lands (journal read endpoint, fleet-join
transition, live e2e) and ships as RedFlag Desktop.
- [ ] Verified on hardware: laptop, ArchDev, and the Pixel 3 agent through the
gated path — update listed, approved, installed.
## Evidence
- Origin session quotes and dates above; the thread was exported, no task
file existed until this one.
- RedFlag `public` branch is clean at `1f75bfd2` (v0.2.9.3) with **four
uncommitted desktop files**: `desktop/tauri.conf.json`,
`web/vite.desktop.config.ts`, `helper/src/main.rs`,
`agent/internal/handlers/upgrade_healthcheck.go` — launcher plumbing to make
the tray appear at all in compositor-only sessions (Hyprland/Sway/River),
untouched since Jul 27.
- FEAT-007 is ~two-thirds built: `LocalAgentApp.tsx` rewritten Jul 1 20:03 —
update list, scan trigger, approve, override-reason on a blocked gate,
verdict rendering, standalone-vs-fleet branching. Missing: journal read
endpoint, fleet-join transition, live e2e.
- sshbool audit (2026-08-10): v0.1.4, Apache-2.0, Tauri v2 + React 19 + russh;
ships `tauri-plugin-single-instance` — the dep RedFlag's tray lacks. README
overclaims: **SQLCipher absent** (plain sqlite, plaintext host rows at
`crates/infrastructure/src/ssh/manager.rs:120`), **FIDO2 absent** (no
ctap/webauthn anywhere). Real hole to know about: first-contact host keys
accepted at `manager.rs:23` and the pin written after `authenticate()`.
The clone lived only in the session scratchpad — **needs re-pull.**
- `souveraine-lens` is the house precedent: `README.md` seam sentence — "the
lens is a surface over them, not a home for them" — and the shell-over-
socket drive pattern.
## Remaining work
1. Re-pull sshbool into the workspace (it is not on disk anywhere).
2. Decide the name — Casey's call (Gatehouse / The Watch / The Ward).
3. Decide where the shared shell/spine physically lives: crate in RedFlag
consumed by the house, a shared repo, or vendoring. Two skins, zero
duplicated state writers — do not fork the spine.
4. File the pacman-closure task (new GATE-* under RedFlag's docs/tasks).
5. House skeleton: lens skeleton + socket to the agent/substrate.
6. The glance: QML service in `surfaces/quickshell/services/`.
7. Port the sshbool frontend pieces into the wry workbench.
8. Wire gate verdict rendering to the spine.
9. Delete the pkexec path; retire souveraine-updater.
10. FEAT-007 remainder on the public skin; ship RedFlag Desktop.
## Open questions the audit session should ask
- The name.
- Home repo for the house skin: new `souveraine-gatehouse` vs a directory in
`souveraine` (lens is its own repo).
- On a house box both agents live: does the workbench speak to the RedFlag
agent over localhost HTTP and to the substrate over the socket — or is one
agent enough on the x86 seats?
- What "Federated Agents" means at house scale: the fleet graph across
ArchDev / .19 / Pixel 3 / laptop, rendering the same payloads the glance
shows per-box.
- Scope of the glance vs the workbench: which payloads stay native QML and
which wake the webview.
## Connections
- `RedFlag/docs/tasks/FEAT-007-desktop-tray-standalone-ui.md` — public-skin
owner; this task owns the structure around it.
- 29-souveraine-updater — the task this design replaces.
- 68-shared-household-state — the dashboard renders household state; the
first slice (admitted task trail + QML view) overlaps the glance.
- 69-agent-usage-session-daemon — "shell services become projections of one
socket" is the same shape as the glance.
- RedFlag RAF §11 — the gate only gates what routes through it; the pacman
spine is the helper pointed inward.
- 66-souveraineai-overhaul — the public face; the Gatehouse is the private
seat of the same house.

View file

@ -64,6 +64,10 @@ Four that are cheap relative to what they unblock:
| # | Task | What's left |
|---|------|-------------|
| 73 | [One spine, two skins: the self-dashboard](73-self-dashboard.md) | Designed 2026-08-11, nothing built. RedFlag Desktop (Tauri, public) + house Gatehouse (wry + QML glance, lens skeleton), spine is agent-side pacman closure resolution that retires souveraine-updater's `pkexec --noconfirm`. Name and home-repo decisions are Casey's. |
| 71 | [QmlMobileScanner as a components app candidate](71-qml-mobile-scanner-candidate.md) | Recon 2026-08-11, verdict owed. GPL-3.0 Qt Quick scanner+writer (zxing-cpp/QZXing/zint, SQLite history). Compatible inside AGPL; camera gate is TASK-46; ffmpeg backend needs a freedreno check; fontawesome-qml likely **not** needed (no FontLoader in the tree — unverified). |
| 70 | [The island: agent surfacing for the shell](70-the-island-agent-surfacing.md) | Recon 2026-08-11. "Open Agent Island" — end-4 fork (same ancestor as ii-base) with a morphing notch, Claude Code status, and permission Allow/Deny from the notch. Take the mechanisms (AgentService + bridge, 13/13 safety) onto ii-base, not the shell. Twines with TASK-59: the notch can host Annie as a morph state. Adjacent to TASK-69. |
| 69 | [Agent usage, one spine: the session daemon](69-agent-usage-session-daemon.md) | Recon 2026-08-11, nothing built. One collector tracks Souveraine + Claude Code + Codex from their local truth (`~/.codex/sessions` JSONL, `~/.claude/projects` JSONL, substrate `core/session`). Two gaps are one shape: the substrate records usage nobody reads (TASK-67). Shell services become projections of one socket. |
| 68 | [Shared household state: tasks first](68-shared-household-state.md) | Canonical plan landed 2026-08-10. First slice is an admitted local task trail + materialized QML app/sidebar view; Culver is the Personal-class client, not the authority. |
| 67 | [The caching landed blind, and compaction drifted](67-caching-landed-blind-and-compaction-drift.md) | Prompt caching works — one turn shows `cache_write=22585` then `cache_read=22585` — and **nothing reads the counters**: `assistant_with_usage` has zero callers, so the only proof is a log line. Separately, the live config hands the subconscious `sliding_window` where the doc and the code default both say `sliding_reflect`, and the `memory` tool's enum exposes the blind strategy while hiding the safe one. §1 needs Casey's word, not a fix. |
| 64 | [One SouveraineOS build for the iPhone](64-one-iphone-build.md) | Scoped 2026-08-10, not started. `linux-pauli` is not a repository, reaches the phone by `scp`, and CI has never built it. The display work that day is worth more than its code: the raster is **derived, not guessed** — 888×1845 @ 60 off `adp_mipi_regs` — and `aperture_remove_all_conflicting_devices()` is the correct handoff. ADP still shows nothing with everything else correct; the `adp16` kernel is staged and has never booted. |
@ -87,17 +91,17 @@ Four that are cheap relative to what they unblock:
| 07 | [WCD9340 mic](07-mic-wcd9340-slim-tx.md) | Functional and in daily STT use. One defect: the permanent sysclk + MICB2 power pin. Kernel branch `mic-race-fix`. |
| 09 | [Suspend-resume FTS calibration race](09-suspend-resume-fts.md) | Kernel-side real fix; interim fix shipped. Cold-boot only. |
| 12 | [Face auth as a capability factor](12-gaze-reference-face-auth.md) | Per-target. Phone needs front-camera bring-up — **that is TASK-46's IMX355 half.** |
| 17 | [Keyboard + dictation polish](17-keyboard-stevia-dictation.md) | Dictation works in daily use. Open: no word completion (`en-us` vs `en_US`) and the stateful mic-key indicator is written but not built. Layout moved to TASK-24. **TTS now exists** (`10.10.20.123:7863`). |
| 17 | [Squeekboard + dictation polish](17-keyboard-squeekboard-dictation.md) | Sole OSK installed at pkgrel 4. Pkgrel 5 adds Daily's visible mode key and chooser for the separate five-row Terminal board; CI, install, repeated reopen, mic-state, and side-panel focus proof remain. Native completion follows. |
| 18 | [Selection/highlight action menu](18-selection-menu.md) | Component first, fluid before functional. **Read Aloud is unblocked** — TTS is live. |
| 20 | [Player: video + agent control](20-player-video-agent.md) | Video, snapshot, manifest. Preserve the music path. |
| 21 | [Reboot-to-Android confirmation](21-reboot-android-confirmation.md) | Scoped 07-22. A one-tap irreversible slot flip still sits bare in app search. |
| 23 | [culver locked-notification nudge](23-culver-locked-notification-nudge.md) | Needs `SyncBurst()` + an IdleCoordinator schedule (TASK-15). |
| 24 | [Keyboard layout rethink](24-keyboard-layout-rethink.md) | Redesign from scratch, not more patches. Start from squeekboard `us+apple`. Casey decides where the mic key goes. |
| 24 | [Keyboard layout rethink](24-keyboard-layout-rethink.md) | Superseded by TASK-17's reference-led Daily/Terminal Squeekboard layouts. Retained as design evidence; do not resume its Stevia patch plan. |
| 27 | [Gitea pipeline audit](27-gitea-pipeline-audit.md) | The fixes. Overlay is not a package; no `primary` branch; poisoned build sysroot. |
| 32 | [Pill and keyboard as owned apps](32-pill-and-osk-as-apps.md) | Both erroneous daily; neither has an owner or a shipping story. |
| 32 | [Pill and keyboard as owned apps](32-pill-and-osk-as-apps.md) | Keyboard now has one runtime/package owner and no dual-OSK provisioning; glass proof remains. Pill ownership and package-owned shell delivery remain open. |
| 33 | [Battery belongs to the state machine](33-battery-as-device-state.md) | Last raw feed going straight to the glass. The charge ceiling is writable today. |
| 37 | ["Back" as a first-class verb](37-navigation-back-verb.md) | 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](38-pill-swipe-osk-swap.md) | Micro. The only route to a terminal keyboard since stevia dropped its layout. |
| 38 | [Pill swipe-to-max swaps the keyboard](38-pill-swipe-osk-swap.md) | Superseded: Squeekboard's own visible mode chooser selects Daily/Terminal inside one process. Archive after TASK-17 glass acceptance. |
| 39 | [Audio levels as tracked state](39-audio-levels-as-state.md) | Open policy: roles, defaults, lock tiers, and state-driven profile intent. WirePlumber persistence works; do not add a second writer. |
| — | [Unify the shell trees](unify-shell-trees-laptop-phone.md) | **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. |