Casey Tunturi

July 31, 2026

July 31, 2026

28 recorded commits · 3 named repos · 10 private repos

Work threads
sessiond3compositor2viewtop2lock2ci2vpn toggle2fix2docs2
  • Private work 10 private repos

    Activity was recorded across 10 private repos. Names, subjects, counts, and links stay private.

  • souveraine16 changes
    • packaging: ship souveraine-button, the reporter that replaces the policy script
      9:48 p.m. · a89556a · internal Gitea record only

      Reports down/up edges to sessiond and decides nothing. Wire it in hyprland.lua as a bind/bindr pair — reporting only the press leaves the machine believing the button is held forever.

    • sessiond: the power button reports edges; the machine recognises gestures
      9:45 p.m. · 86afe00 · internal Gitea record only

      blueline-power-button decided policy in shell script — read its own panel state, asked the shell to lock over qs ipc, polled, then blanked the panel itself. That was a path to a dark panel outside request_blank(), so §1's lock-then-blank invariant had a hole in the most-used control on the device.

    • lock: hoist the lock out of the Config.ready loaders so a reload can adopt
      9:25 p.m. · 5c618f1 · internal Gitea record only

      PanelLoader is a LazyLoader gated on Config.ready, behind a second one. On reload both are shut when quickshell propagates, so LazyLoader has no item to hand its successor and the new WlSessionLock never adopts the live compositor lock. Lock is a direct child of ShellRoot now, as the boot-order doc already asked.

    • sessiond: subscribe — the body tells the mind when a belief changes
      9:07 p.m. · 1eb50a1 · internal Gitea record only

      A held connection receives one trail entry per notable edge: transitions, source-down/recovered, violated guarantees. Readings, wakes and heartbeats never cross — the filter is the point, not the transport.

    • ci: sessiond clippy is advisory until its 9 pre-existing warnings are burned down
      7:14 p.m. · b5ee87d · internal Gitea record only
    • sessiond: peer pid via getsockopt, and put sessiond under test
      6:52 p.m. · 539df90 · internal Gitea record only

      UnixStream::peer_cred is still unstable, so it only failed at the aarch64 build after rust-test had gone green. Use the same getsockopt machined uses.

    • ci: one branch. primary builds and ships; public and the dead codeberg mirror are gone
      2:36 p.m. · b5fc48e · internal Gitea record only
    • lock: adopt the session lock across a scene reload
      2:32 p.m. · efe2d0d · internal Gitea record only

      sessiond admits shell_ready from the lease holder's own pid; the shell carries its lock request through the reload so WlSessionLock adopts the existing lock instead of taking the unlock branch on it.

    • vpn toggle: status, not a bool
      1:57 p.m. · 0745b48 · internal Gitea record only

      It read "On" for an hour through a dead tunnel — NM said activated while wg had 368 B received against 5.3 KiB sent. Now off/connecting/limited/online, decided by a 2s probe of the far-side resolver rather than by the interface being up. Sailfish models the same distinction (Online/Limited/Connecting); Android won't let an unvalidated network win at all.

    • fix: guard altAction on long-press
      1:38 p.m. · 189de61 · internal Gitea record only

      GroupButton called it unguarded while releaseAction two lines up was guarded. altAction is null for every toggle without a menu, so a long-press threw. Only showed once the toggles that had been filtered out of the panel started rendering.

    • settings: the device state machine gets a surface
      1:11 p.m. · 1c90d7f · internal Gitea record only

      TASK-08(f)/TASK-19: state, panel, evidence, confidence, per-source health, the sensors_degraded flag and the recent decision trail were legible only through forensic.jsonl. DeviceEvidence gains a read path (polled only while watched); the Device page renders it. Readout only — the confidence gates are still computed and never branched on, so controls over them would lie.

    • deploy: never --delete into the phone's tree
      12:58 p.m. · 8a4eebb · internal Gitea record only

      It is not a git repo, it gets edited on the device, and this path had no snapshot while the local compose path has had one all along. Now it snapshots to ~/souveraine-surfaces/.quickshell-previous, copies by checksum, and only reports phone-only files instead of destroying them.

    • shell: give the subconscious event log a host
      12:51 p.m. · 49635fb · internal Gitea record only

      Tier 2 was written, deployed and mounted by nothing — its own header named the gap. The chat sidebar hosts it now: ticker long-press, or the psychology indicator by the input box, which works when no pass is running.

    • shell: quick toggle types come from the chooser, not a second list
      12:51 p.m. · e6e3dd3 · internal Gitea record only

      The hand-written allowlist in AndroidQuickPanel had drifted from it, so the phone rendered 12 of its 17 configured toggles and said nothing about the rest. Adds the missing fullScreenshot and waydroidTerminate, and a deploy guard so the phone chooser can't fall behind the base one again.

    • fix: keep the conversation when the agent list is re-polled
      12:50 p.m. · e4e6594 · internal Gitea record only

      selectAgent cleared conversationId even when the agent hadn't changed, and the 60s inventory poll re-selects the persisted agent forever — so any message sent a minute after the last one opened a fresh conversation. 27 of them yesterday, four messages each. An empty curl body no longer counts as "no conversations".

    • vpn toggle: point at [host], the phone's own peer
      7:57 a.m. · e4d6ddc · internal Gitea record only

      The old [host] profile shared its address and private key with the laptop, so WireGuard could only hold one of them, and the key is no longer listed server-side — it sent and never received. [host] is [host], port 51822, keepalive 25. Proven off-LAN: handshake 8s, gitea 200 in 0.126s.

  • SouveraineOS7 changes
    • task-48: daemon half fixed and live; shell half shipped and measured failing
      8:14 p.m. · 80ea42c · internal Gitea record only
    • TASK-49: bearer selection and DNS belong to the state machine
      1:55 p.m. · ec2f856 · internal Gitea record only

      Measured on the phone: all IPv4 left over cellular while on wifi, because NM penalised the wifi metric +20000 for a failed connectivity check, which failed because the VPN profile injected a resolver reachable only over the degraded default. Prior art read off the local LineageOS image and Sailfish tree: both route DNS per link and gate preference on a probe. We do neither.

    • docs: 08(f) surfaced — the state machine has a readout
      1:12 p.m. · bd528e3 · internal Gitea record only

      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.

    • docs: subconscious surface is hosted
      12:54 p.m. · 012e4e1 · internal Gitea record only

      Tier 2 reached the tree on 07-30 and the glass on 07-31 — nothing mounted it in between, and that was invisible because a component nobody instantiates logs nothing. Notes why verifying a row means looking at the glass.

    • shell-tree unification: done, zero stranded files
      8:25 a.m. · 705e7b5 · internal Gitea record only
    • shell-tree unification is all but done: 918 files -> 7
      8:22 a.m. · 6b0bf5c · internal Gitea record only

      Re-measured by md5 across both devices. The ii-base pin + ii-phone overlay landed without this task being worked and killed the drift: laptop-only is 0, the settings suite is byte-identical everywhere, and the 4 phone-only files are the declared overlay.

    • VPN: correct the port, the peer, and the keepalive
      7:57 a.m. · 25bb99c · internal Gitea record only

      51822 not 51820; the phone has its own peer ([host]) rather than sharing the laptop's key; keepalive 25 not 0. Records that the autonomous gate is dead and why a full tunnel that cannot handshake takes the machine with it.

  • souveraine-viewtop5 changes
    • compositor: present the scene — the panel finally has a render pass
      10:13 p.m. · e6555ca · internal Gitea record only

      on_vblank was a trace! and nothing drew. Every panel now owns a DrmCompositor (GBM swapchain, damage, plane assignment); the flip is answered, the frame is built and queued, and clients get their callbacks so they draw a second frame.

    • compositor: the kms build compiles; layer override moves to render order
      10:03 p.m. · 4c2f7d0 · internal Gitea record only
    • fmt: main was red on rustfmt since the pose/expose commits
      9:57 p.m. · ad63594 · internal Gitea record only
    • viewtop: build the phone backend in CI
      9:56 p.m. · ef7425e · internal Gitea record only

      The kms binary compiled for no target at all — the workspace cross-build skipped it (required-features = nested) and the nested step is host-only. Both backends are cfg-gated with a bail fallback now, so the binary builds with kms alone and the Pixel 3 target is actually checked.

    • viewtop: let the binary build without winit so the phone target can ship
      9:55 p.m. · c80a241 · internal Gitea record only