July 30, 2026
29 recorded commits · 6 named repos · 6 private repos
- Private work 6 private repos
Activity was recorded across 6 private repos. Names, subjects, counts, and links stay private.
- souveraine9 changes
- shell: VPN quick toggle in the right panel7:13 p.m. · 0b57daa · internal Gitea record only
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.
- deploy: ship the subconscious module in the shell manifest3:26 p.m. · 15af38a · internal Gitea record only
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.
- fix: preserve the full reply (not the streamed partial) on surface-drop3:22 p.m. · 4caca36 · internal Gitea record only
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.
- shell: restore the subconscious ticker to the chat column3:17 p.m. · 483902a · internal Gitea record only
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.
- fix: commit partial reply when the SSE surface drops mid-stream3:17 p.m. · 426dcf6 · internal Gitea record only
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.
- mirror souveraine + upower-souveraine into the Gitea Arch registry2:24 p.m. · 3bc363a · internal Gitea record only
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).
- shell: re-home the subconscious surface from the ii tree to souveraine12:57 p.m. · 25898a9 · internal Gitea record only
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.
- surface: per-agent TTS voice + turn clock + reply-handler fix9:18 a.m. · 0ef2395 · internal Gitea record only
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.
- agent: per-agent voice_id on the public list9:18 a.m. · e9bf33e · internal Gitea record only
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.
- Pixel3Arch6 changes
- hyprgrass: rebuild for hyprland 0.56.1 and publish it7:51 p.m. · e351afe · internal Gitea record only
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.
- package souveraine-stt; it only ever shipped by flash7:22 p.m. · 9ad69ea · internal Gitea record only
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.
- stevia 0.56.0-2: dictation key status animation; souveraine-stt state machine3:05 p.m. · e9320be · internal Gitea record only
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.
- mirror device packages into the Gitea Arch registry2:12 p.m. · 410f942 · internal Gitea record only
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.
- untrack committed build junk + set SRCDEST in packages CI1:53 p.m. · 0eccd6f · internal Gitea record only
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.
- publish stranded device packages via packages.yml1:49 p.m. · e306218 · internal Gitea record only
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).
- SouveraineOS6 changes
- CLAUDE.md: the umbrella repo had none7:13 p.m. · d64579a · internal Gitea record only
An agent landing here got nothing. Says what the project is, the reading order, and the rule that keeps being broken: ls by date and read, do not grep — these documents argue, and the argument is the content.
- tasks: TASK-17 dictation status — CLI shipped, key-anim patch pending build3:08 p.m. · 4df694c · internal Gitea record only
- docs: [host] VPN — phone split-tunnel + semi-intelligent gate2:19 p.m. · 051da9e · internal Gitea record only
- mark package stranding resolved (TASK-25)1:57 p.m. · ee68f5b · internal Gitea record only
Pixel3Arch packages.yml now publishes all 14 device packages; pacman -Sl souveraine-aarch64 is the manifest. Update TASK-25 status/acceptance + record the four cross-build shapes and the committed-junk CI trap. DUMP for the session. STATE.md last-updated 2026-07-30.
- docs: add SHELL-SURFACES.md — the migration checklist12:59 p.m. · 66dbb60 · internal Gitea record only
Migrations have been silently lossy: the subconscious surface was stranded for over a week by the ii -> souveraine shell move, and five packages went stale, both because there was no list of what exists to tick off. SHELL-SURFACES.md is that list — every shell surface and first-party service, the contract it is defined against, its substrate today, and whether it reaches the glass.
- tasks: settle viewtop scene composition + selection design; cross-link11:36 a.m. · d4ea575 · internal Gitea record only
TASK-43 gains the §Scene composition design settled 2026-07-30: the texture/content wall, pose (geometry, the agent's) and expose (legibility, gate-veiled) as authority-split verbs, the selection surface as a scene element not a layer surface, and the primary-selection/data-control source now wired (234a631) with its owed refinements named.
- souveraine-viewtop4 changes
- wire: give pose and expose somewhere to land8:01 p.m. · 0077776 · internal Gitea record only
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.
- compositor: serve primary selection and wlr data-control11:35 a.m. · 234a631 · internal Gitea record only
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.
- compositor: enforce furniture z-order structurally in wlr-layer-shell11:30 a.m. · ad2b6cb · internal Gitea record only
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.
- wire: add pose and expose intents11:22 a.m. · 61cf90a · internal Gitea record only
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.
- souveraine-speech3 changes
- stt: proxy to resident whisper-server; drop per-request model load2:19 p.m. · f10e34b · internal Gitea record only
whisper-server keeps ggml-large-v3-turbo loaded once at boot (RX 560/Vulkan) and serializes inference via its mutex. sttd.py becomes a stdlib-only field- name shim (audio->file) that passes the {"text":...} response through verbatim; clients unchanged.
- tasks: remove the tts-compat shim — voice must be native, not translated12:55 p.m. · b1470ca · internal Gitea record only
Casey's standing instruction was to delete the shim, not patch it. Document the removal plan, the live lever-map (samplers work on base; instructions need a non-base talker; speed is a no-op), and the verify-before-remove ordering.
- docs: multi-voice registry, clone recipe, :7863 voice routing, per-agent voice12:39 p.m. · ccc3cf7 · internal Gitea record only
Voice is no longer annie-only. Document the registered clones (annie + the kyutai voice-donations set), the clone-from-reference recipe, the ref_text/ICL repetition trap, the tts-compat voice-routing fix on :7863, and how an agent selects its own voice (_souveraine.voice_id -> agent list -> Speech.qml).
- souveraine-updater1 change
- mirror souveraine-updater into the Gitea Arch registry2:24 p.m. · 1540559 · internal Gitea record only
Best-effort mirror after the edge publish: PUT the built pkg to /api/packages/Fimeg/arch/edge. Never fails the publish; 409 = bump to republish.