Casey Tunturi

August 11, 2026

August 11, 2026

64 recorded commits · 6 named repos · 10 private repos

Work threads
patches6squeekboard5ci4agent sessions4face4speech4tasks3agentsd3

Today Casey kept turning absence into something the system could name: Annie's replies learned to survive a vanished surface, an empty success stopped masquerading as her voice, and the subconscious thread learned to carry and heal its own history. On the phone, chat and dock began yielding cleanly to the keyboard; in the shell, the agent left the cramped top bar and took her place beside the conversation. Then the public ledger was born under the pressure of the day itself—forty commits across two visible repositories in its first captured slice—and immediately had to learn that credentials, branches, and even a calendar date can lie unless somebody stays long enough to make them answer.

Narrator ran 7:21 p.m. · covered through 6:24 p.m. · the ledger continued afterward

  • Private work 10 private repos

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

  • souveraine35 changes
    • osk: retire the dead dual-keyboard path
      7:21 p.m. · fb5e9bb · internal Gitea record only
    • agent sessions: show conversations, not storage ghosts
      6:47 p.m. · dd19ab2 · internal Gitea record only
    • bar: finish the shared resource widget
      6:40 p.m. · 12da479 · internal Gitea record only
    • patches: retire the old top-bar agent mount
      6:40 p.m. · 013a06a · internal Gitea record only
    • osk: recover with Squeekboard, not Stevia
      6:37 p.m. · 62638e0 · internal Gitea record only
    • chat: raise the keyboard when the field is tapped
      6:24 p.m. · 692455c · internal Gitea record only
    • dock: yield the bottom edge to the keyboard
      5:21 p.m. · 41d13c9 · internal Gitea record only
    • turns: never mistake an empty success for Annie
      5:09 p.m. · 7842c04 · internal Gitea record only
    • subconscious: heal persisted tool-call history
      4:05 p.m. · dfc72d7 · internal Gitea record only
    • agent sessions: leave the bar and sit beside chat
      3:43 p.m. · 2179b62 · internal Gitea record only
    • patches: keep island work outside turn fix
      3:01 p.m. · 3bdc1c8 · internal Gitea record only
    • turns: survive the surface disappearing
      3:01 p.m. · 3aa7019 · internal Gitea record only
    • island: fix three defects found by actually loading the shell
      2:46 p.m. · 783f096 · internal Gitea record only

      The island had never been load-tested. All three were fatal or noisy and none were visible by reading.

    • bar: one BarContent for every device, layout as data
      2:40 p.m. · 391e239 · internal Gitea record only

      ii-base and ii-phone each carried a 357-line BarContent to express eight differences, all of them either "is this widget shown" or "which slot is it in". No behaviour differed. Every bar edit had to be made twice or diverge silently against the pin.

    • patches: queue 0005, mount the agent island
      2:22 p.m. · d87d611 · internal Gitea record only
    • agent sessions: use shellPath convention for collector path
      2:21 p.m. · b211842 · internal Gitea record only
    • agent sessions: one collector, one island
      2:19 p.m. · 47ce2d1 · internal Gitea record only

      Collector emits a single JSON envelope for every agent session (Souveraine, Claude Code, Codex) and always exits 0; a failing provider reports available:false rather than taking the envelope down.

    • face: recreate a refused rig socket
      2:08 p.m. · 928bd8d · internal Gitea record only

      Quickshell retains the failed QLocalSocket object, so toggling its requested state cannot reconnect. Replace the Socket body until the host answers.

    • agentsd: collapse the scan predicate
      2:05 p.m. · e7929e4 · internal Gitea record only
    • agentsd: drop dead limit collection from the session parser
      2:05 p.m. · d739f35 · internal Gitea record only
    • agentsd: one collector for claude, codex and souveraine sessions
      2:03 p.m. · 60a2978 · internal Gitea record only
    • face: keep knocking until the rig answers
      2:03 p.m. · 5afa132 · internal Gitea record only
    • face: expose the two live gaze links
      2:02 p.m. · e314d4f · internal Gitea record only

      Let the remote shell deploy accept the assets its caller already staged, so a successful composition does not fail after switching the tree.

    • face: reconnect to the rig after host startup
      1:33 p.m. · 8fd1a72 · internal Gitea record only
    • subconscious: carry her thread across restarts
      1:18 p.m. · 9149c40 · internal Gitea record only

      One unreadable conversation.json aborted the whole listing, so hydration returned an error, the caller read it as no prior thread, and a fresh conversation opened on every boot. Skip the damaged record and warn.

    • api: carry ordered text and image parts across the message boundary
      12:30 p.m. · cfad688 · internal Gitea record only

      `Message.content` was `String`, so an attachment could not reach the substrate even though everything downstream was ready for it: the session already stores `ContentBlock::Image`, `run_turn` already builds OpenAI multi-part content, and the provider client already speaks `image_url`. The whole pipe was plumbed and the tap was welded shut at the door.

    • rescue: preserve unversioned source copy found on [host]
      11:06 a.m. · c367a4d · internal Gitea record only

      ~/souveraine on the build box is a full copy of this repo with no .git at all, newest sources 2026-08-09 21:07. Audited by hashing every file and querying this repo's object database: 1545 checked, ten unknown after excluding the vendored upower submodule.

    • subagent: send task as user message, not folded into system prompt
      10:48 a.m. · 517d8c1 · internal Gitea record only
    • memory: gate write over an existing file, report the delta
      10:33 a.m. · e498e72 · internal Gitea record only

      write replaces a whole file and reported success identically whether the file grew, held, or was erased. Replacing an existing file now requires overwrite: true, and the refusal names append/edit as the likely intent. Every write returns a WriteDelta so the result carries magnitude; a write that drops a file below half its former size says so loudly.

    • patches: queue QML compatibility fix
      9:37 a.m. · d290b12 · internal Gitea record only
    • shell: keep typed segments QML-compatible
      9:35 a.m. · 23cebc5 · internal Gitea record only
    • patches: queue typed chat segments
      8:56 a.m. · 52f379f · internal Gitea record only
    • shell: render typed chat segments
      8:54 a.m. · 8c434df · internal Gitea record only

      Keep assistant, reasoning, tool-call, and tool-return frames structured through the sidebar delegate. Tool cards bind returns by wire id and fold their output by default.

    • patches: queue think-fence collision fix
      8:10 a.m. · f17fa7c · internal Gitea record only
    • shell: stop sensor calls closing an open reasoning fence
      8:09 a.m. · a8f7f62 · internal Gitea record only

      A tool_call/tool_return arriving while a <think> block was open emitted its own self-closing fence, whose </think> closed the outer block early. Every reasoning token after that point rendered as prose, and the stray close left the trailing assistant text mis-segmented. Append inside the open fence instead; only open one when arriving in prose.

  • Pixel3Arch12 changes
    • ci: prove both keyboard modes ship
      7:28 p.m. · ca717b7 · internal Gitea record only
    • squeekboard: make dictation a real dependency
      7:26 p.m. · 98129d3 · internal Gitea record only
    • squeekboard: own every keyboard mode
      7:22 p.m. · 3794aa9 · internal Gitea record only
    • viewtop package: preserve the launcher pkgrel
      7:04 p.m. · 63b564b · internal Gitea record only
    • squeekboard: keep daily and terminal layouts distinct
      6:47 p.m. · d69e35e · internal Gitea record only
    • viewtop session: keep Squeekboard across login
      6:37 p.m. · 47f9893 · internal Gitea record only
    • squeekboard: embed the keyboard we actually drew
      6:24 p.m. · 0da4708 · internal Gitea record only
    • usb-signaller: stop truncating the HID helper
      4:54 p.m. · 03ccc49 · internal Gitea record only
    • squeekboard: give dictation a pulse
      3:42 p.m. · d42775e · internal Gitea record only
    • ci: provide PAM headers to the ARM build
      2:38 p.m. · b272d1b · internal Gitea record only
    • fingerprint: build the PAM module from its owned source
      1:51 p.m. · 6e0242d · internal Gitea record only
    • ci: cross-build the fingerprint PAM module
      1:33 p.m. · b2281f0 · internal Gitea record only
  • SouveraineOS9 changes
    • docs: elmyra answered, and the site map lost a layer
      9:57 p.m. · b87e433 · internal Gitea record only

      TASK-36 said the load path had never executed. It ran 2026-08-11 — LoadNanoappResponse decoded, success byte set, and six gauges came off a flat baseline at 2502 and 2990 against a 2500 floor. Recorded with Casey's numbers and the two things that would otherwise compress away: the margin carries intent, and the proximity veto is a separate job from the threshold.

    • tasks: squeekboard is the sole OSK; add 71 (mobile scanner recon) and 73 (self-dashboard)
      7:57 p.m. · c9d40b2 · internal Gitea record only
    • keyboard: make Squeekboard the single path
      3:44 p.m. · 89cf93f · internal Gitea record only
    • distribution: add ViewTop to the laptop body
      2:40 p.m. · d8820da · internal Gitea record only

      Record update delivery as a per-body offer and local candidate activation after a live shell push killed an active conversation.

    • tasks: 69 stage 1 and 70 island built
      2:23 p.m. · 74e3bc5 · internal Gitea record only
    • tasks: the message API carries images now, the surface still does not
      12:31 p.m. · 9669b0c · internal Gitea record only

      Reconciles the two owning docs with souveraine cfad688. Sub-scope A was always half-landed: the substrate was multimodal end to end and the HTTP door was text-only, so the TUI could see and every other surface was blind. The door opens; nothing walks through it yet.

    • task 72: plan owned agent surface
      9:36 a.m. · 315f4d8 · internal Gitea record only
    • task 72: record typed segment patch
      8:55 a.m. · d796f53 · internal Gitea record only
    • task 72: surfacing pane tool primitives and honest bottom bar
      8:33 a.m. · 3ab4f77 · internal Gitea record only
  • souveraine-speech4 changes
    • speech: stream VibeVoice through the public queue
      10:48 a.m. · f6ec2a2 · internal Gitea record only
    • speech: uncap VibeVoice and add cancellable queue
      8:24 a.m. · f89f7f9 · internal Gitea record only
    • speech: keep VibeVoice request path unbounded
      12:34 a.m. · be9219d · internal Gitea record only
    • speech: restore VibeVoice on RX 560
      12:28 a.m. · ea43970 · internal Gitea record only
  • souveraine-viewtop3 changes
    • ci: version packages from full history
      2:38 p.m. · 991f766 · internal Gitea record only
    • packaging: publish ViewTop for the laptop
      1:53 p.m. · 1bcbfa5 · internal Gitea record only
    • input: let application popups take their touches
      1:06 p.m. · a073ea5 · internal Gitea record only

      Firefox extension and Bitwarden popups were rendered above their parent but absent from client hit testing, so every contact fell through to the toplevel beneath. Walk application popups at the same origin and in the same parent-by-parent order used by rendering, including popup area outside the parent bounds.

  • souveraine-lens1 change
    • ui: keep new-note prompts inside the lens
      6:50 p.m. · 0bf2dbc · internal Gitea record only