7.2 KiB
Handoff — 2026-08-05, navigation & the window sheet
Your job first: audit what this session did against the docs, then judge whether it actually delivered Casey's ask. Do not start new work until you have. Several things were built fast and one was built wrong and rewritten.
Read these FULLY. Do not grep them.
Grepping these produces confident, wrong architecture — it is the single most reliable failure in this project, and it is written down in three places.
SouveraineOS/START-HERE.mdSouveraineOS/docs/tasks/55-hand-verbs-on-the-glass.md— the sheet; most of this session is its "what landed" sectionSouveraineOS/docs/tasks/60-the-multitasking-view.md— written after the multitasking view was built wrong and Casey said so. Uncommitted.SouveraineOS/docs/SESSION-AUTHORITY-DOCTRINE.md— §13 first, then §4, §9-11SouveraineOS/docs/DEVICE-STATE-MACHINE.md— §1, §4, §12SouveraineOS/docs/LOCK-DPMS-LESSONS.md— §1 is the lock-then-blank invariantsouveraine-viewtop/docs/SHELL-BOUNDARY.md— the engine runs in-processsouveraine-viewtop/crates/compositor/src/workspace.rs— header only; the zone model, and why a zone exists because something is on itsouveraine-viewtop/crates/compositor/src/gesture.rs— header only; the compositor recognises, the shell drawsSouveraineOS/docs/tasks/59-her-face-on-the-glass.md— TASK-59 phase 1 passed on hardware; phase 2 is unstarted
State of the tree — READ THIS BEFORE TOUCHING ANYTHING
souverainehas UNCOMMITTED work.ZoneOverview.qml(new), the rail's gesture rewrite,Overview.qmlrewired to zone cards,deploy.shmanifest,ViewtopControl.qml. It is deployed to the phone and not committed. Commit or discard deliberately; do not deploy over it without looking.souveraine-viewtopis pushed at8e6700band not yet on the phone. The device runsr84.g2d0ffdc. So the compositor there does not yet reportfocused,app_idortitle— whichZoneOverviewneeds to group and label cards. Untilr85+installs, the new overview will draw zones but its cards cannot match pictures to windows. That is expected, not a bug.- CI publishes automatically now: green
mainon viewtop dispatches Pixel3Arch'spackages.yml. Verified end-to-end (run 1176 → 1177).
What was asked, and what happened
Casey's asks, in order given:
- Remove three-finger tap from everything binding it — done. It opened the
overview;
Action::Overviewis gone. - Three-finger tap opens an overlay on the app: resize, split, close —
built (
WindowSheet.qml), deployed. Now four buttons: Move, Resize, Split, Close. Close is polite on tap,killon a 1 s hold. - Zones/states, not workspaces; drop Hyprland verbiage — done in new code
and in the shell. The wire op is still spelled
workspaceand the compositor'sworkspace.rsstill uses the old noun throughout. A rename sweep is owed and was deliberately not started. - Long-press power → context overlay — built (
PowerMenu.qml), shows real USB-C data role + charger state. Not lock-gated. - Short swipe → multitasking, long swipe → home; dock always on zone one — built. Home is 18% of panel height.
- Multitasking must show all backgrounded zones including splits —
this is the one that was built wrong twice. First as a live scale of the
active zone (a transition mistaken for a destination), then rewritten as
ZoneOverview.qml. The rewrite is deployed but UNVERIFIED on glass. TASK-60 holds the design questions that were answered by fiat, not by Casey: card = zone,ScreencopyViewper window inside it, focus reported by the compositor, refresh on open, scale-on-drag deleted. Check those against what he actually wanted.
Bugs found and fixed, worth verifying rather than trusting
posenever worked. It was applied by passing a smaller scale torender_elements_from_surface_tree, which positions but does not resize; the size comes fromElement::geometry(scale), called later with the output scale. Windows moved and never shrank. Fixed withRescaleRenderElement. Casey diagnosed it precisely: "the content slid to meet the upper left corner instead of shrinking." Verify on glass — it was confirmed broken by eye, and the fix has not been confirmed the same way.- Firefox drew off-centre because the main render path never subtracted
window.geometry().loc(CSD shadow inset). The popup and capture paths both did. Fixed. Not folded intowindow_originon purpose — that feeds the hit test, and correcting it there would move touch targets instead. - Every window got two zone-membership entries —
new_toplevelhad a pre-existingon_workspace.pushplus the new explicit claim. Duplicates keep empty zones alive forever, which is whatprune_workspacesexists to prevent. - Three-finger drag deleted outright, not retuned: it beat the tap to nearly
every gesture. The window carry came back as
grab/drop, entered from the sheet. While grabbed,Route::ClientbecomesWithheldso the app underneath stops receiving the finger. - CI never published viewtop. Its own workflow only ran fmt/clippy/test/
cross-build. Fixed by dispatching Pixel3Arch's job on green
main; the 403 wasLOCAL_GITEA_TOKENexisting only as a Pixel3Arch repo secret.
Known-not-done — say so rather than discovering it later
- The dock when an app opens. Casey asked twice; never resolved. The dock is a global layer surface whose visibility is now per-zone (pinned on home). Its exclusive zone may still reserve space on every zone. Needs eyes on glass.
- A real resize handle. Resize cycles half → two-thirds → full. No corner drag.
- Widgets on zone one. It is kept clear and never pruned; nothing fills it.
- The runtime-lock paint gap. Power → black → lockscreen paints → blank.
Decisions are correctly ordered (
lock-before-blank→lock-directive→panel-off); the black isframe_elementscompositing lock surfaces and nothing else while the shell's lock surface has not painted. Casey's rule: lock, confirm the lockscreen is up, then blank — which is viewtop's to attest, since only it knows a lock surface is presented on every output. - Casey's OSK bug from the morning handoff (search bar "jerked", keyboard did not open) — never investigated. Untouched by this session.
app_id+titleas a join key is approximate. Two terminals with the same title collide. The sound fix is a shared id in foreign-toplevel.
The trap that cost this session the most time
Reaching for the phone's control socket earlier would have saved an hour:
$XDG_RUNTIME_DIR/souveraine/viewtop.sock, one JSON object per line.
{"op":"describe"} is the authoritative verb table, {"op":"workspaces"} lists
zones and windows, and {"op":"scene","intent":"close","id":N} closed two apps
Casey could not close — no rebuild, no deploy. The phone has no socat/nc but has
python3.
Also: qs -c souveraine ipc … needs WAYLAND_DISPLAY set or it reports "no
running instances" while the shell is plainly running. sessiond has it; an ssh
session does not.