August 15, 2026
47 recorded commits · 6 named repos · 8 private repos
- Private work 8 private repos
Activity was recorded across 8 private repos. Names, subjects, counts, and links stay private.
- souveraine20 changes
- zone: the long swipe travels to home instead of back to the detent10:59 p.m. · 68c353a · internal Gitea record only
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.
- face: hid mode gives the room to the hands10:39 p.m. · 3f796f5 · internal Gitea record only
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.
- atmosphere: a blend is a value, and one parser owns the name9:33 p.m. · 2217de8 · internal Gitea record only
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.
- body: the hand compiles again6:13 p.m. · 7d8a8f9 · internal Gitea record only
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.
- body: the hand, a verb for reaching through the port5:43 p.m. · f87d912 · internal Gitea record only
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.
- fix: the sessiond tree's first real compile, four errors down5:16 p.m. · 9f97e47 · internal Gitea record only
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.
- fix: two things CI caught that the editor never did5:07 p.m. · 41656fb · internal Gitea record only
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.
- sessiond: lux rides the wire, the plexus goes live, the body has a tool4:56 p.m. · e3480ef · internal Gitea record only
`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.
- nervous: the plexus declares the phone's body and speaks it4:56 p.m. · f3fcdd0 · internal Gitea record only
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.
- nervous: gauges and glands are different afferents3:54 p.m. · 4687686 · internal Gitea record only
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.
- nervous: locus and viability — the plexus stops being telemetry3:24 p.m. · a3dfe30 · internal Gitea record only
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.
- nervous: somatic plexus, NervousNode trait3:03 p.m. · f8fccd3 · internal Gitea record only
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.
- ci: retrigger after runner flake11:52 a.m. · 2fa9221 · internal Gitea record only
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.
- charge becomes a sensor source11:45 a.m. · 1336960 · internal Gitea record only
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.
- race the subconscious peek against cancel11:20 a.m. · 4662fa1 · internal Gitea record only
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.
- order sessiond at graphical-session-pre10:54 a.m. · e485b91 · internal Gitea record only
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.
- package the sessiond pam file9:53 a.m. · 4a4f0a5 · internal Gitea record only
/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.
- claude bridge: strip leading turns as pairs6:10 a.m. · 7329351 · internal Gitea record only
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.
- sessiond: carry charging as machine evidence6:10 a.m. · 24086b3 · internal Gitea record only
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.
- cross last-seen over the wire as seconds-ago per source12:52 a.m. · 0dd8aaa · internal Gitea record only
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.
- SouveraineOS11 changes
- docs: what a veil frame has to be9:42 p.m. · b47c170 · internal Gitea record only
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.
- atmosphere: correct the seam, and name whose instrument this is9:07 p.m. · 7086b4a · internal Gitea record only
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.
- task-77: the lens, a human-first garden over a git vault6:42 p.m. · 91128b8 · internal Gitea record only
Folder/subcategory support and inbox capture landed in souveraine-lens (61cf534, c71c7e4); this files the owner doc the build was missing and indexes it.
- task-62: record the agent hand reach landing (souveraine f87d912)5:44 p.m. · cdbb744 · internal Gitea record only
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.
- state: charge is a sensor source, and the laptop is moving to viewtop11:45 a.m. · 3cdd36f · internal Gitea record only
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.
- correct the graphical-session.target claim10:55 a.m. · 6a86b51 · internal Gitea record only
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.
- file task 76: nothing owns provisioning9:53 a.m. · 6e2f3f8 · internal Gitea record only
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.
- state: session chooser is phone-shaped, mechanism undecided7:55 a.m. · b45d776 · internal Gitea record only
Sddm is one candidate among others; the chooser must serve the phone form factor too, touch-first.
- state: laptop viewtop lands as an sddm session choice7:55 a.m. · 6d19ce5 · internal Gitea record only
Login-time pick between viewtop and hyprland via wayland-sessions, so a bad viewtop update is one wrong login, never a locked box.
- state: laptop idle policy live; laptop viewtop is the plan7:53 a.m. · a46d9cb · internal Gitea record only
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.
- state: sessiond runs on the laptop now7:44 a.m. · 4cd894a · internal Gitea record only
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.
- souveraine-viewtop10 changes
- input: hit-test a window in its own coordinate space11:15 p.m. · 55f93a0 · internal Gitea record only
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.
- workspaces: report what a client drew, not only what it was told11:10 p.m. · 1d6d7c1 · internal Gitea record only
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.
- state: report who holds the keyboard10:53 p.m. · 78f885e · internal Gitea record only
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.
- atmosphere: dissonance can strike instead of hold10:31 p.m. · 1f47842 · internal Gitea record only
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.
- atmosphere: the blink's curve, on the one clock9:36 p.m. · b7ef258 · internal Gitea record only
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.
- atmosphere: dissonance is a verb8:59 p.m. · 5d6f0f0 · internal Gitea record only
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.
- atmosphere: blur and pop on load7:37 p.m. · 3d6af62 · internal Gitea record only
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.
- atmosphere: ease the dim, don't snap it7:24 p.m. · 325ec74 · internal Gitea record only
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.
- input: a three-finger tap claims the stream7:02 p.m. · ff754c7 · internal Gitea record only
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.
- start the session targets instead of naming units10:54 a.m. · 1692b35 · internal Gitea record only
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.
- souveraine-lens4 changes
- lens: make the edge publisher executable6:41 p.m. · c71c7e4 · internal Gitea record only
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.
- lens: plant into folders, dump ideas into an inbox6:41 p.m. · 61cf534 · internal Gitea record only
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.
- lens: ship as a signed package6:11 p.m. · 6cbe5bd · internal Gitea record only
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.
- lens: overhaul the face6:11 p.m. · 0f34f55 · internal Gitea record only
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.
- smithay1 change
- gles: optional chromatic split on sampled textures8:57 p.m. · 257088a · internal Gitea record only
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.
- Pixel3Arch1 change
- enable squeekboard from its own package10:54 a.m. · db47ab4 · internal Gitea record only
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.