Casey Tunturi

August 15, 2026

August 15, 2026

47 public commits · 6 public repos · 331 private commits

Work threads
work8atmosphere7state6lens4nervous4input2body2fix2
  • Private work 8 repos sealed

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

  • souveraine 20 changes
    • 10:59 p.m. · 68c353a

      settleTo gave home and overview the same end shift, so a release past the multitasking detent animated *down* to it, held the overview fully present, and teleported — the release never reached its end target. detent is the boundary between the two (rail: pullTo(travel, missionAt)), and presence is built to reach 0 at clock 2, which is where home lives.

    • 10:39 p.m. · 3f796f5

      The rig held 760px of a 1037px surface and left 226 for a status row, the agent field, both pads and four buttons — so the pads were 92px and the last row sat under a dock that claims no exclusive zone unless pinned. With the hand up the rig drops to 320 and the pads take what is left.

    • 9:33 p.m. · 2217de8

      Atmosphere::lerp returned an endpoint at t=0.5 and apologised for it in a comment — the enum had nowhere to put a blend. It has one now: Custom carries the four tones, so a room halfway from MintTea to NeonGlow can be stored, compared and sent, not only drawn. Unnameable by construction, so nothing can ask for a blend by name and get a room she never chose.

    • 6:13 p.m. · 7d8a8f9

      CI caught what a fresh pair of eyes needed: invalid_input wanted a &str, hand wanted a borrow, and the validation test read its input after the move. All three now follow the shapes already proven in the same file.

    • 5:43 p.m. · f87d912

      The injection engine was built (usb-hid-inject) and the shell owns it (USB Hands, the usbHands IPC, the skill string that teaches the reach), but her own vocabulary ended at set_usb_mode — she could arm the hand but never say it was there. speaks the shell's bridge: status, type, key, click, pointer, gated by the host, not by her.

    • 5:16 p.m. · 9f97e47

      CI's lib run passed but the sessiond bin had never been built until now. The plexus's constructor is an associated function, not a module item; a duplicate panel_on got in the way of the one that already existed; a test Daemon omitted the new plexus field; and the clock's attended ingest borrowed the guard twice in one expression. All four are gone.

    • 5:07 p.m. · 41656fb

      The test plexus called an associated function through the module path, and the Body tool's unknown-verb refusal handed a String to a &str parameter. The gate earns its keep.

    • 4:56 p.m. · e3480ef

      `Changing(bool)` becomes `Light { changing, lux }` end to end: sensord forwards the number, the machine keeps the level in evidence with a 30 s stale rule, and both charge and the presence sensors ingest into the plexus on arrival. The clock feeds `attended` at 1 Hz, plexus events land in the forensic trail as Somatic, and the DeviceState answer gains a `body` section. The Body tool is registered and committed with the substrate that carries it.

    • 4:56 p.m. · f3fcdd0

      phone_plexus leaves the test module and takes the clock. It grows `attended`, derived by sessiond rather than reported by a sensor, and the two grip gauges that nothing reports yet — the gap on the record instead of a false calm. to_json renders every field's belief, trend, locus, health and pressure, the ranked pressures, homeostatic cost and the unreachable list for the IPC surface; unknown stays null, never zero.

    • 3:54 p.m. · 4687686

      A battery at .42 is still .42 when nobody looks — only confidence in an unrefreshed reading decays. Feeding a fuel gauge into an accumulator would drain the pack because the reporter went quiet, which is the empty-result trap wearing a units label. Field keeps exudates; Level keeps readings.

    • 3:24 p.m. · a3dfe30

      INTERO (RobOntics'25) axiom 7: a variable is interoceptive only if some subsystem can act on it. That is doctrine §13 in first-order logic, so `unreachable()` lists inner fields with no verb and a test fails on them.

    • 3:03 p.m. · f8fccd3

      Fields replace booleans: accumulation with half-life decay, velocity, trend detection. Source health monitoring closes the gap the mapping session found — a dead nerve now reads as silent, not calm. Thirteen tests.

    • 11:52 a.m. · 2fa9221

      no-ai-attribution failed in checkout's post-action — the runner lost /var/run/act/actions/.../dist/index.js between steps (MODULE_NOT_FOUND). rust-test passed; aarch64-artifact was skipped behind the failure.

    • 11:45 a.m. · 1336960

      ChargeEvidence was the rule violated four times in one type: a side door past the gate, the decider probing sysfs on the clock, the driver interpreting, and nothing leaving tick(). Its comment cited bearer — another instance of itself.

    • 11:20 a.m. · 4662fa1

      mid_turn_peek was a bare await while the model call three hundred lines up was already guarded, so a subconscious that never answered parked the turn somewhere /cancel could not reach it — twenty minutes, measured 2026-08-15, on a provider whose key was spent.

    • 10:54 a.m. · e485b91

      The authority takes ext-session-lock before any surface exists, which is the window -pre reserves. It cannot start earlier — ext-session-lock is a Wayland protocol and needs the compositor's socket. Also drops the injected venv variable from eleven surface scripts; each finds the path itself.

    • 9:53 a.m. · 4a4f0a5

      /etc/pam.d/souveraine-sessiond arrived by hand on 2026-07-16 and is owned by no package on either device — root-owned config can only arrive by package. Same rail as souveraine-stepup, plus a bsdtar assertion so a future drop fails the build instead of shipping quietly. TASK-76.

    • 6:10 a.m. · 7329351

      Compaction can drop the opening user message, and the tool_result answering the first turn orphans on the wire when its call alone is deleted — a 400. Calls and the results bound to them go together.

    • 6:10 a.m. · 24086b3

      TASK-33 part 2: the machine owns the conclusion — plugged, status, charge type, and what it means — probed on the bearer's cadence, one decision made once on the trail. Surfaces render it; they do not re-derive it.

    • 12:52 a.m. · 0dd8aaa

      TASK-08(f): EvidenceSeen held the stamps internally and nothing outside the daemon could read them. to_ipc_json now carries evidence_last_seen_secs_ago; null stays distinct from stale, because never-reported and long-ago are different claims.

    • 9:42 p.m. · b47c170

      The twenty frames in AniAvatar carry no alpha, so one composited at the blink's 0.12 is a 12% black wash over the whole panel — indistinguishable from expose dimming the screen. At that alpha the image lands inside 30 of the panel's 255 code values, so anything under 8/255 in the file is simply not there.

    • 9:07 p.m. · 7086b4a

      The shader half landed (viewtop 5d6f0f0, smithay 48adf6f) — dissonance is a verb, the clock is shared with the dim, nobody has seen it on the panel.

    • 6:42 p.m. · 91128b8

      Folder/subcategory support and inbox capture landed in souveraine-lens (61cf534, c71c7e4); this files the owner doc the build was missing and indexes it.

    • 5:44 p.m. · cdbb744

      The body tool now speaks the usbHands IPC; the gates stay as refusals, and what still binds is the authority seam itself, not her verbs.

    • 11:45 a.m. · 3cdd36f

      The r506 build had ChargeEvidence reading sysfs from sessiond's clock with conclusion() inside the driver type — the rule violated four times in one object. Recorded here: the ruling (§4), the task reconciliation, and the bearer audit under the same rule. Also the corrected cutover answer: the laptop is the test bed, the chooser is phone-shaped, mechanism undecided.

    • 10:55 a.m. · 6a86b51

      Four docs recorded 'nothing starts it' as settled fact and concluded don't use the target, where the conclusion available was light the target. viewtop's session launcher starts it now.

    • 9:53 a.m. · 6e2f3f8

      Five souveraine files own no package across the two live devices, and /etc/systemd/system/souveraine-machined.service shadows the packaged signer unit on both — measured, not inferred. Retires the Phase C deploy checklist: CLAUDE.md banned its build step on 2026-07-24, START-HERE §5 bans its deploy step.

    • 7:55 a.m. · b45d776

      Sddm is one candidate among others; the chooser must serve the phone form factor too, touch-first.

    • 7:55 a.m. · 6d19ce5

      Login-time pick between viewtop and hyprland via wayland-sessions, so a bad viewtop update is one wrong login, never a locked box.

    • 7:53 a.m. · a46d9cb

      Sessiond's idle dimming now runs on the laptop (2026-08-15, first observation) — keep or change is open. Casey stated the laptop moves to viewtop as the real test bed; Hyprland stays as fallback so a broken viewtop update can never lock the box.

    • 7:44 a.m. · 4cd894a

      The aarch64-only line traced to a partial install on 07-24 (no unit, no PAM, no hook); the correction was already written down in the 08-09 power-authority handoff. Enabled from the hyprland.start hook 2026-08-15, lock cycle verified live, recovery doc on disk.

    • 11:15 p.m. · 55f93a0

      window_local_under answers relative to the window rectangle; Window::surface_under walks from offset (0,0) and reads its argument as relative to the buffer. Those differ by geometry().loc — the inset a client-side-decorated app declares its window at inside a buffer that also holds its shadow. The render already subtracts it, so every lookup landed a shadow-width up-and-left of the finger and Firefox had to be aimed down-and-right of anything you wanted to hit.

    • 11:10 p.m. · 1d6d7c1

      size is the rect the configure asked for. A client laying out against something else keeps rendering its own, and since contacts are mapped through the rect, the error grows with distance from the window's origin — which is what "everywhere I tap is off, and it depends where I tap" looks like from the outside. Nothing reported the drawn rectangle, so nothing could see it.

    • 10:53 p.m. · 78f885e

      An on-screen keyboard has nothing to enable against when nothing is focused, so "tapping the field does nothing" and "no surface has focus" looked identical from outside the compositor — and no verb could tell them apart. TASK-59's rule: what is invisible on the glass is reported.

    • 10:31 p.m. · 1f47842

      Casey on the glass: held at weight it is a distortion to look past, "sexy IF it's very brief". A strike is 370ms end to end on one shared envelope — rise 90, hold 60, fall 220 — and clears any standing weight, because a pulse that left the screen fractured behind it is not a pulse. Blink reads the same envelope.

    • 9:36 p.m. · b7ef258

      TASK-52 #15. The dim inverted — expose and dissonance ease toward a level and stay, this rises, holds and returns to nothing without being told to. That is the whole technique: a presence you have to dismiss is furniture, one that leaves on its own is weather.

    • 8:59 p.m. · 5d6f0f0

      TASK-52 #6, the chromatic split. `{"intent":"dissonance","amount":0.35}` sets a 0..=1 weight — the agent composes attention and the compositor owns the mapping to texels, so nobody outside has to track the panel's geometry. Optional angle for the fracture's axis; it lands instantly while the amount eases, because an axis is a direction the effect has and not a place it travels through.

    • 7:37 p.m. · 3d6af62

      A fresh window veils in and pops to full over the same clock — the 'blur and pop' on load. Alpha eases 0→1, scale eases 0.94→1.0, ease-out over ~220ms, frame-rate independent. Obscured stays instant; a readable ghost mid-fade is a disclosure.

    • 7:24 p.m. · 325ec74

      First brick of the one attention clock (TASK-52). expose still sets the discrete target; the compositor now eases each surface's painted alpha toward it on the vblank clock, so a dim is a curve instead of a snap. Obscured stays instant — a readable ghost mid-fade is a disclosure. Frame-rate independent, like the strip settle.

    • 7:02 p.m. · ff754c7

      The tap was delivered twice — once to the app underneath, once (late) to the recogniser, which only commits on the last lift. The window sheet opened while the app had already eaten all three fingers. Now three fingers that arrive together cancel the client's touch and withhold the rest of the sequence, while the recogniser keeps running to resolve the tap. Two fingers still reach apps; a grab still owns its own touches.

    • 10:54 a.m. · 1692b35

      The launcher already imported the environment, then hand-kicked three units with reset-failed, restart and a sleep 3 — a hand-rolled PartOf and a hand-rolled After. It starts graphical-session-pre then graphical-session now, waits on sessiond's socket rather than a guessed 3 s, and stops both on exit. souveraine-shell.service comes with it; it lived unowned in /etc since 07-17.

    • 6:41 p.m. · c71c7e4

      CI run 1632 built, signed and reached the publish step, then died with exit 126 — the publisher had never been marked executable. This is the whole fix.

    • 6:41 p.m. · 61cf534

      The garden was flat — every note at the root. A note now lives in any folder (real directories, the vault's own shape), the rail grows a folder tree, and a capture line plants a thought straight into inbox/. The folder path is guarded so nothing can climb out of the vault.

    • 6:11 p.m. · 6cbe5bd

      the [host] runner builds, makepkg assembles, the house archive key signs, and the package lands as this repo's own additive edge asset — /usr/bin/souveraine-lens, a desktop entry, an icon, a LICENSE. DESIGN.md argues the garden: human-first, the agent a guest, the vault the one thing with no other readers.

    • 6:11 p.m. · 0f34f55

      the human garden — two skins, the rail and drawer, the [[ picker with plant-and-link, backlinks with orphan nudges, the palette, the first-run guide. Fixes the guide that never opened, a picker that measured itself hidden, clicks that fought the physics, and links that fell into the dead-leaf dialog.

  • smithay 1 change
    • 8:57 p.m. · 48adf6f

      Red sampled ahead of the fragment and blue behind it, green and alpha left alone, so an edge fringes red and cyan while the geometry stays put. Off is `None` and costs a scalar compare.

    • 10:54 a.m. · db47ab4

      The session launcher named it by hand because graphical-session.target started nothing. It does now, so the keyboard ships its own wants symlink like edge-sense, and PartOf takes it down with the session.