Casey Tunturi

August 7, 2026

August 7, 2026

61 recorded commits · 7 named repos · 4 private repos

Work threads
work10docs9upstream6usb4smoo3multitasking3TASK-603face3
  • Private work 4 private repos

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

  • souveraine25 changes
    • usb: make the HID controller doorway honest
      5:36 p.m. · 78d6743 · internal Gitea record only
    • memory: base scoped commits on HEAD
      4:06 p.m. · 9ceaf61 · internal Gitea record only
    • memory: persist every git index mutation
      4:02 p.m. · 0c9db09 · internal Gitea record only
    • usb: build the full KVM composite surface
      2:48 p.m. · 8cd2adb · internal Gitea record only
    • multitasking: one owner for the transition, and the release travels
      12:26 p.m. · 16c6ee1 · internal Gitea record only

      ZoneTransition owns the card rect, the four overview verbs, the end-target table and the gesture clock. ZoneOverview and the rail read it; neither derives a geometry.

    • the card is the window's size through the whole pull
      8:52 a.m. · 72171ac · internal Gitea record only

      Two fixes to the same seam. columnLayout was still gated on missionControlOpen, so a peek raised a panel whose contents were invisible — the same line that had been left behind once before, with its own comment saying so.

    • restore every window the drag posed, not the ones the poll names
      8:52 a.m. · 452acea · internal Gitea record only

      Going home from a pull left the app scaled down until the pill was dragged back to clear it. clearPose walked ViewtopControl.windows, which is the 2 s poll's list, so a window that list no longer named never got its 1.0 back. Track the ids actually posed and clear those too.

    • multitasking draws under a dwelling thumb
      8:42 a.m. · f699f57 · internal Gitea record only

      The overview loader was only active once missionControlOpen was already true, so nothing existed during the pull and ZoneOverview.progress following the rail was dead mid-drag. The cards appeared at release and animated on their own clock — two motions, which is the seam TASK-60's acceptance names.

    • rail: the pose rides the drag, not each exit path
      8:41 a.m. · 57208c8 · internal Gitea record only

      A partial slide left the app scaled small until another pull brought it back (DUMP-bugs 8). Every path anyone checked did call endPull, so the hunt for the one that didn't was the wrong shape: while restoring is a step, some path skips it. It is now a function of `dragging`.

    • handoff: 2026-08-07
      2:29 a.m. · 14c3c80 · internal Gitea record only
    • sidebar: the keyboard leaves with the panel that summoned it
      2:24 a.m. · 630d691 · internal Gitea record only

      The drawer clears oskOpen on close and this did not, so the OSK outlived the surface holding the only text field it was serving — and with nothing focused there was no obvious way to put it away.

    • drawer: the keyboard comes up on a tap, not on a press
      2:22 a.m. · f4caaae · internal Gitea record only

      Summoning on onPressed meant any gesture that merely began over the search field raised the keyboard — including the swipe that scrolls the app grid, which starts at the top of the drawer more often than not. The press now only remembers where it landed and the release decides, with a generous slop: a thumb reaching the top of a 540px panel is not steady, and a few pixels of drift while tapping a text field is a tap.

    • face: her postures reach the rig, and she stops miming on startup
      2:21 a.m. · 47e8135 · internal Gitea record only

      `posture()` called window.live2dMotion, which does not exist — measured undefined on the device. Nine states advertised to her in the prompt and wired to nothing. The bundle exposes two levers: #live_talk, a motion slot it reads every frame, and its own head/body hit test. The nine collapse onto those rather than pretending: speaking talks, idle rests, and the rest are a look — head for attention, body for effort.

    • Revert the duplicate onCanceled on the rail
      2:07 a.m. · e218601 · internal Gitea record only

      The handler already existed and already did this — a second one in the same MouseArea is "Property value set multiple times", which failed the whole module and took the shell down. The pill's stranded-pose symptom is something else; the cancel path was never the hole.

    • pill: a cancelled climb puts the app back
      2:06 a.m. · 4826574 · internal Gitea record only

      onReleased is the only thing that clears the pull's pose, and a MouseArea whose grab is taken away never gets one — it gets onCanceled, which had no handler. So a cancelled climb left `dragging` true, the pull progress set and the app posed at 0.6: shrunken, with nothing on screen to say why, and no way back except pulling the pill again to force a fresh press and release through.

    • dock: scale it up, and put the scale in settings
      2:04 a.m. · 5c44ea0 · internal Gitea record only

      44px buttons with 35px icons read small on a 540px panel, and a stack's members were 12px inside a 35px box — unreadable, which is the whole job of the collapsed form. 56/44 now, and the member icons give back the border and padding that were being subtracted from them as well as the grid spacing.

    • multitasking: inset the cards so neighbouring zones show through
      1:34 a.m. · a1d9a87 · internal Gitea record only
    • multitasking: the cards were zero pixels wide
      1:32 a.m. · 6f37528 · internal Gitea record only

      ZoneOverview took its width from the Column it sits in, and a Column is as wide as its widest child. The drawer's search widget supplies that; mission control is the cards alone and has no search, so the only child left was the loader — whose width came from the column, whose width came from the loader. The cycle resolves to zero.

    • overview: a verb for mission control, and a state readout
      1:23 a.m. · 5ec6bfd · internal Gitea record only

      Multitasking was raised only by the pill's first-stage swipe, so the one surface that has been reported broken was the one neither an agent nor a test could reach. state() reports what the cards are drawn from.

    • face: locking sends her away, and she stays away
      1:11 a.m. · 075ddf1 · internal Gitea record only

      Gated on screenLockSecure, the compositor's ack, not on screenLocked. The request drifts: measured on the phone, `session lock` answered already-locked while logind reported LockedHint=no and the phone was in use. That is a shadow copy of state the protocol owns, and a face gated on it would have been permanently dismissed with nothing on screen to explain why.

    • face: follow the finger anywhere on the panel
      1:01 a.m. · c8dc24d · internal Gitea record only

      Subscribes to viewtop's gaze feed and dispatches a synthetic pointer move on the canvas, so live2d.js's own mousemove path drives head angle and eye direction with its existing damping. Synthetic is the point: she is deliberately not being given those contacts, and this lets her watch them anyway.

    • deleted branch Fimeg/souveraine
      12:31 a.m. · forge event · internal Gitea record only
    • dial: hold the camera to record the screen
      12:24 a.m. · ae432e7 · internal Gitea record only

      Entries may carry a hold verb beside verb; the ring fills while it charges so the commitment is visible while it is still cancellable, and sliding off cancels. Holding the camera starts a recording, tapping or holding it again stops it — the same seat, because the dial is muscle memory.

    • her face on the glass: it draws, it listens, and it gets out of the way
      12:24 a.m. · ac35b34 · internal Gitea record only

      The rig never drew. live2d.js is not only the Cubism runtime — it carries the reference's character layer, which reads #live_talk every update as its motion-state slot. Our page omitted the element, so it threw on the first frame after the model and all four textures had loaded: assets 200, WebGL live, no error reaching Rust, blank canvas.

    • gamma goes to the compositor, not to a binary that is not there
      12:24 a.m. · 78496e1 · internal Gitea record only

      hyprsunset does not exist under viewtop and execDetached cannot fail loudly, so the brightness slider and the night light have done nothing since the move. Same public surface, pointed at viewtop's gamma verb. TASK-61.

  • SouveraineOS14 changes
    • docs: record SLIMbus v1 submission
      8:40 p.m. · 376ef95 · internal Gitea record only
    • docs: normalize SLIMbus sender address
      8:22 p.m. · df334ca · internal Gitea record only
    • docs: record SLIMbus review result
      8:00 p.m. · bc00214 · internal Gitea record only
    • docs: park SLIMbus upstream follow-up
      7:40 p.m. · 4f8f7cf · internal Gitea record only
    • docs: record the first live HID cable proof
      5:36 p.m. · 327c08c · internal Gitea record only
    • docs: record the USB landing and VPN gate
      5:24 p.m. · 721b0c7 · internal Gitea record only
    • docs: archive the memory write-path audit
      4:16 p.m. · 5cc4020 · internal Gitea record only
    • docs: keep USB authority and hardware acceptance open
      3:55 p.m. · b1a9efc · internal Gitea record only
    • docs: reconcile USB, Waydroid, audio and charging
      2:52 p.m. · 4aa61d7 · internal Gitea record only
    • TASK-60: shell half done; the release was the seam
      12:26 p.m. · 71f6ce5 · internal Gitea record only

      The awkward hand-off was not the dwell gate — it was committing at whatever shift the thumb left. quickstep travels to the end target first; settleTo does that now. Dwell restored to match prior art.

    • TASK-60: compositor half done, shell half specified
      9:50 a.m. · f71f0d7 · internal Gitea record only
    • TASK-60: one owner for the transition
      9:18 a.m. · ee8697c · internal Gitea record only

      Two writers own one geometry — the rail's pose and ZoneOverview's scale, running opposite curves off the same progress. Three attempts to make the numbers agree failed in a session. The strand proves it: the repro path is card taps, which never reach the rail's clear-the-pose code.

    • 59/60 and the bug dump: what landed the day her face went on the glass
      2:29 a.m. · 528d290 · internal Gitea record only

      TASK-59 becomes a record of five bugs that each presented as something else — the missing #live_talk element, --app-id doing nothing, the GL context claimed before the canvas was sized, posture wired to a function that does not exist, and a feed that dropped its own reader for being slow. Plus the furniture role, input regions, gaze, and what the rig costs next.

    • bugs: the multitasking cards are blocked on screencopy hanging, not on missing data
      1:24 a.m. · d62ae3f · internal Gitea record only
  • Pixel3Arch14 changes
    • upstream: record SLIMbus v1 submission
      8:39 p.m. · fe8ad41 · internal Gitea record only
    • upstream: normalize SLIMbus sender address
      8:22 p.m. · b77f181 · internal Gitea record only
    • upstream: apply SLIMbus review notes
      7:57 p.m. · 31fe89c · internal Gitea record only
    • upstream: use Samaritan Solutions identity for SLIMbus patch
      7:28 p.m. · b2a1d2c · internal Gitea record only
    • upstream: make DEF_ACT_CHAN patch speak plainly
      7:17 p.m. · e8bb2bf · internal Gitea record only
    • upstream: prepare SLIMbus DEF_ACT_CHAN fix
      7:07 p.m. · 6a75798 · internal Gitea record only
    • usb: publish the management tether owner
      3:54 p.m. · 8c9c50f · internal Gitea record only
    • smoo: provision its pinned cross target
      3:40 p.m. · 3924279 · internal Gitea record only
    • ci: let package prepares populate Cargo
      3:35 p.m. · 4e862e8 · internal Gitea record only
    • smoo: fetch host build dependencies
      3:31 p.m. · d7c765a · internal Gitea record only
    • smoo: fetch before the offline build
      3:24 p.m. · b6bc0ff · internal Gitea record only
    • ci: bound package workspace storage
      3:04 p.m. · d151164 · internal Gitea record only
    • usb: package the full HID and KVM gadget
      2:51 p.m. · 258c995 · internal Gitea record only
    • triage: find the phone when the laptop is on a foreign network
      9:49 a.m. · 9b1afd1 · internal Gitea record only

      Section 6 told the reader to get the address from the router, which is advice you cannot follow from a laptop that already knows the subnet. When both defaults fail, sweep the laptop's own non-home subnets and report only addresses that answer ssh on our key. Cost 2026-08-07 its first twenty minutes.

  • souveraine-viewtop7 changes
    • the overview carry: one owner for the transition geometry
      9:46 a.m. · 3c85397 · internal Gitea record only

      The shell scaled real windows through pose while ZoneOverview scaled its cards, both off one progress and running opposite curves, so the window was at 0.6 of the glass when the card arrived near full bleed. Worse, the pose was applied by the rail and had to be undone by whoever ended the gesture — tapping a card never touches the rail, so a window came back shrunk with no way to restore it.

    • feeds: a slow subscriber is behind, not gone
      2:21 a.m. · 62ec16b · internal Gitea record only

      A full channel dropped the subscriber, which made a fast stream self-terminating: gaze pushes at ~25/s filled the queue faster than a QML socket drained it, so the shell was unsubscribed inside the first burst of a drag and never told. It looked exactly like a compositor that had stopped pushing — and an external client that read faster kept working, which is what made it look like the shell's bug.

    • layer surfaces get their popups drawn, and touched
      1:52 a.m. · b14d992 · internal Gitea record only

      An xdg_popup is its own surface, not a subsurface, so a layer surface's surface tree does not contain it — and only toplevels had a popup pass. Every menu the shell opened from the bar, the dock or the pill was created, configured, and never composited. The dock's app-stack fan named it: tapping a stack set `expanded`, built the arc, and put nothing on the glass.

    • move mode: the sheet that ends it keeps its touches
      1:45 a.m. · f6778ef · internal Gitea record only

      Withholding every client contact during a grab took the shell's own chrome with it, because a quickshell layer surface is a Wayland client like any other. So "Done moving" went deaf and the move could be entered and never left. Top and overlay layers are exempt now; the app underneath still gets nothing, which is the point of the grab.

    • gaze: push where contacts are, so a face can look at them
      12:59 a.m. · d7a6760 · internal Gitea record only

      Her input region is her silhouette now, so the compositor stops handing her contacts that land on the wallpaper — which also stopped her tracking unless you touched her first. Where a finger is and who receives it are different questions; this answers the first without changing the second.

    • furniture: a role for the face, and honour input regions
      12:20 a.m. · bb95307 · internal Gitea record only

      A toplevel is classified at its first commit rather than at map, because xdg_toplevel is created before the client sends set_app_id — so the old code minted a zone, moved the strip, took the keyboard and told the dock about a window it had not yet identified. Furniture (org.souveraine.face) takes no zone, is announced to nobody, wears no frame, keeps its own size, and hangs from the top of the zone with the room below it left free.

    • colour management: map sRGB into the panel's primaries
      12:20 a.m. · 21882c9 · internal Gitea record only

      blueline's SW43408 has no EDID and viewtop has been scanning out raw sRGB onto a ~P3 panel since the move off Hyprland, so everything reads oversaturated. The linear-light transform lives in the GLES fork; this side owns which matrix, because only the compositor knows which device it is.

  • linux-blueline2 changes
  • smithay2 changes
    • deleted branch Fimeg/smithay
      12:17 a.m. · forge event · internal Gitea record only
    • gles: optional linear-space gamut transform on sampled textures
      12:07 a.m. · 25ef078 · internal Gitea record only

      The transform rides on a uniform rather than a shader variant, so an unmanaged draw takes no colour arithmetic at all and stays byte-through. Un-premultiplies around the sRGB transfer functions: a 3x3 commutes with the alpha scalar, the transfer curve does not, so decoding premultiplied values shifts hue at every alpha but 1.

  • souveraine-usb1 change
    • new repocreated repo Fimeg/souveraine-usb
      1:20 p.m. · forge event · internal Gitea record only