Casey Tunturi

July 30, 2026

July 30, 2026

29 public commits · 6 public repos · 255 private commits

Work threads
work7shell3tasks3docs3wire2fix2compositor2hyprgrass
  • Private work 6 repos sealed

    255 commits count toward the day. Names, subjects, and links stay private.

    • 7:13 p.m. · 0b57daa

      Deliberate, never automatic. The autonomous gate it replaces recycled the tunnel 652 times in 90 minutes and could not be switched off, because 'nmcli connection down' fired the dispatcher that brought it back up.

    • 3:26 p.m. · 15af38a

      The ticker instantiation in AiChat referenced qs.modules.souveraine. subconscious, but those files were absent from the deploy MANIFEST, so a deploy left the import unresolved. Add SubconsciousTicker/EventPanel + a qmldir mirroring the dial/selection modules.

    • 3:22 p.m. · 4caca36

      Revises the prior fix: the model's reply is already complete in final_content before the paced stream loop, so truncating to needlessly dropped the unstreamed tail. On SSE receiver-drop, stop streaming but commit the FULL reply (interrupt flag skips the pointless N+1 and marks the turn); the surface recovers the whole reply on resume.

    • 3:17 p.m. · 483902a

      Re-mount SubconsciousTicker in AiChat (lost in the 07-30 relocation out of the ii tree). The view is decoupled; it just needed its host back.

    • 3:17 p.m. · 426dcf6

      turn.rs streaming loop returned early on tx.send failure (receiver gone) before the session commit, orphaning the turn: the assistant's partial reply never landed, so the next turn's history snapshot read the user's follow-up with no preceding reply -> a user->user gap. The model then answered as if from nowhere (the 'whatever it was...' non-sequitur), model-independent and intermittent. Commit the partial like an interrupt instead, the way the cancel branch already does, so the thread links.

    • 2:24 p.m. · 3bc363a

      Best-effort mirror step after the edge publish: PUT each built pkg to /api/packages/Fimeg/arch/edge so the Packages page stays current. Never fails the publish; 409 = bump to republish. Runs only on public (same gate as the publish job).

    • 12:57 p.m. · 25898a9

      The subconscious three-tier surface (SubconsciousTicker + SubconsciousEventPanel) is Souveraine-original, not upstream ii. It lived under ii-base/modules/ii only because it had never been re-homed, so the ii -> souveraine shell migration silently stranded it: the files survived, but the running shell (qs -c souveraine) never loaded them, and the feature dropped off the device.

    • 9:18 a.m. · 0ef2395

      Speech resolves voice per active agent (agents[].voice_id from the list), with the system voice as fallback — two agents on a host need not match. Souveraine.qml carries voice_id into the agents map and adds a turn clock (turnStartedAt/turnElapsedMs) + a 60s agent-inventory refresh. Ai.qml declares pendingFilePath and imports qs.modules.common.functions so StringUtils.ttsClean no longer aborts the stream-finished handler.

    • 9:18 a.m. · e9bf33e

      AgentSummary carries voice_id, sourced from agent.json (_souveraine) via get() rather than the DB config_json column, which is write-once at create and drifts on later edits. The list endpoint is the surface's only unauthenticated view of an agent, so voice travels there; /v1/agents/:id is token-gated.

    • 7:51 p.m. · e351afe

      Deferring this package did not avoid the work, it moved it onto the device. A plain 'pacman -Syu' dead-locked tonight: hyprgrass pinned hyprland=0.56.0 while hyprtoolkit needed the newer aquamarine, so nothing could move until the plugin was rebuilt by hand. A Hyprland plugin is pinned to one exact compositor version, so it has to republish in lockstep with every bump. Now in packages.yml with an ABI sanity check.

    • 7:22 p.m. · 9ad69ea

      The OSK's dictation key spawns it by name, so it is load-bearing for the keyboard and was owned by no package — rootfs-overlay reaches a device on a flash, and this phone runs pacman -Syu. Every fix since has been hand-carried. /usr/bin, not /usr/local/bin, which shadows.

    • 3:05 p.m. · e9320be

      souveraine-stt: 3-state machine (idle|recording|transcribing|error) written to $XDG_RUNTIME_DIR/souveraine-stt/state; --status reads it. Collapse whisper's embedded newlines before ydotool (typing \n sent Enter, chopping dictation). Fix the dead pw-record wait-loop.

    • 2:12 p.m. · 410f942

      Dual-publish: alongside the release-assets edge (the phone's source of truth), also PUT each built package to /api/packages/Fimeg/arch/edge so the Packages page is populated and the registry can be evaluated as the eventual home (clean edge/stable split, no hand-rolled repo-add). The mirror step is best-effort and never breaks the release publish; a 409 means (name,version) is immutable -- bump to republish. Auth/SigLevel for pointing pacman here is unsolved by design until the registry is proven.

    • 1:53 p.m. · 0eccd6f

      9 built *.pkg.tar.zst binaries and two stale bare VCS clones (pkgs/stevia/stevia, pkgs/squeekboard/squeekboard) had been committed and were bloating the repo; the stale clone made makepkg abort packages.yml with 'not a clone of <url>'. Remove them, gitignore *.pkg.tar.zst + the VCS checkout dirs, and set SRCDEST out-of-tree in CI so clones never land in a package dir again.

    • 1:49 p.m. · e306218

      Wire the 8 hand-installed packages into the edge CI publisher so they reach pacman -Syu: pulse-native-provider, souveraine-osk-switch (any), hexagonrpc-blueline, tqftpserv-blueline, blueline-edge-sense, souveraine-stevia, souveraine-squeekboard, usb-signaller (aarch64 cross).

    • 8:01 p.m. · 0077776

      The two intents were advertised in the verb table and had no state behind them: Surface carried no geometry beyond size and no legibility at all, so nothing could act on either. Adds Pose (identity by default) and the exposure actually in force.

    • 11:35 a.m. · 234a631

      Brokers zwp_primary_selection_v1 and zwlr_data_control_manager_v1, the combination wl-paste --primary --watch relies on to observe selections without focus. data-control is created against the primary-selection state so a data-control client sees primary selections too. This is the selection source the shell's action menu (TASK-18) reads once viewtop is the session.

    • 11:30 a.m. · ad2b6cb

      Serve wlr-layer-shell and, on new_layer_surface, override the requested layer with the one derived from the surface's furniture role. INTERFACE-ARCHITECTURE §1 found the pill's z-order was a documented guarantee the code did not enforce — a layerrule in a Lua file a reload could lose, so an ii restart could bury the pill under the dock and stop it taking touch. Being the compositor is the chance to derive the layer from what the surface IS rather than trust a rule.

    • 11:22 a.m. · 61cf90a

      pose — rotation and scale about a pivot. Geometry is the agent's outright (doctrine §13), so the compositor honors it rather than adjudicating it; it is applied to the paint and used for inverse input-mapping, which is the real cost of a rotated surface.