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.
14 KiB
DUMP — both keyboards, 2026-07-28 evening → 2026-07-29 morning
Session dump per STATE.md convention. Written by Claude (Opus) at Casey's
instruction after a session that cost him hours. Read the "What I got wrong"
section first if you are an agent picking this up — most of the damage came
from acting before reading what was already written down.
STATUS 2026-07-29 evening — §8 is closed, §7's grip item is answered.
- §8 row 1. The squeekboard prefix fix is committed and on
Pixel3Arch/main(87efdd0); the topic branch is gone. It triggered no CI —kernel.ymlis that repo's only workflow and it fires onkernel/**alone, so nothing in the pipeline buildspkgs/**. The phone has the good package by hand (1.43.1-5, 0 files under/usr/local), and the fixed build carries the same version string as the broken one, so no other device can be moved onto it bypacman. Bumping to-6collides with the "never exceed extra's pkgrel" rule — that tension is TASK-25/27's to settle, not a detail. - §8 row 2. The phone-only shell work is in git (souveraine
5965c64). There were five files, not two: the two named here plusii/onScreenKeyboard/OnScreenKeyboard.qmlandii/dock/{DockAppButton, DockStack}.qml.find ~/souveraine-surfaces/quickshell -newer .../DEPLOYED-REVISIONis how to find them next time. A landmine came with them:AppSearch.resolveEntry, which the two dock files call, had been added to the phone's live~/.config/quickshell/ii/— a directorydeploy.shrsyncs FROMii-base/on every run. The next deploy would have deleted the function and left both callers pointing at nothing. It is inii-base/now, on the laptop and the phone. - §8 row 3. archdev's
~/Projects/souverainewas repaired, not re-cloned — its.githad noobjects/pack/and invalid sha1 on refs. Re-cloning would have destroyed ~225 files:.gitignorecarries a baredocs/under "never committed to any remote", so souveraine's design corpus is untracked by design and exists only on archdev. Verified 0 tracked content was unique before touching it. - §7 grip. Casey was right and this section was written not knowing:
grip is live.
LoadNanoappResponse success=true, the six chassis gauges leaving their ~0.24–0.36 baseline for 2502/2990 against a 2500 floor, with a pocket/proximity veto. §7's own instinct was correct — it reports to sessiond, not the shell gesture IPC.
Still open from §7: word completion (needs an IME context; kitty.conf has
wayland_enable_ime no), the unaccounted-for "Kill waydroid" dial entry, and
the untappable stevia layout menu.
1. squeekboard was dead. Root cause found and fixed at the packaging level.
Symptom: osk-switch squeek left the phone with no keyboard. Unit failed
203/EXEC; when run by path it died SIGABRT (SI_TKILL, non-main thread).
Root cause — one missing flag. pkgs/squeekboard/build-cross.sh ran bare
meson setup. Meson's default prefix is /usr/local. The PKGBUILD deliberately
does not use arch-meson (it injects host -march/-mtune) — but arch-meson
is also what normally supplies --prefix=/usr, so dropping it dropped the prefix.
All 39 packaged files landed under /usr/local, breaking it in two places:
/usr/local/bin/squeekboardvs the unit'sExecStart=/usr/bin/squeekboard→203/EXEC- schema at
/usr/local/share/glib-2.0/schemas/sm.puri.Squeekboard.gschema.xml, where glib never looks →GLib-GIO-ERROR: Settings schema 'sm.puri.Squeekboard' is not installed→g_error()aborts → SIGABRT
The PKGBUILD's stray-guard could not catch it:
find "$pkgdir" -mindepth 1 -maxdepth 1 ! -name usr passes, because
usr/local/... is under usr/.
This is a regression, not a long-standing defect. From pacman.log:
1.43.1-1 installed 2026-07-25 from ~/osk-switch-build/ shipped usr/bin +
usr/share correctly and worked. The 2026-07-27 rebuild that added the sysroot
relocation to package() went out as 1.43.1-5 and is the one that regressed.
Fix (branch fix/squeekboard-prefix on archdev, ~/Projects/Pixel3Arch):
build-cross.sh:meson setup … --prefix=/usr --libexecdir=lib --sbindir=binPKGBUILD: explicit[[ ! -d "$pkgdir/usr/local" ]]guard after the existing stray check, since the maxdepth-1 test cannot see it
Built on archdev with the documented invocation
(CARCH=aarch64 makepkg -f --noconfirm --skippgpcheck --ignorearch), installed
on the phone with pacman -U. Verified: /usr/bin/squeekboard present,
gsettings list-schemas sees sm.puri.Squeekboard, unit goes active, owns
sm.puri.OSK0, zero coredumps, layer maps.
Build base was NOT stale — Gitea
Pixel3Arch/mainccb7f327vs archdev checkoutccb7f32, 0 commits behind. (The stale checkout issouveraine; see §6.)
Known cosmetic issue: makepkg's x86 strip can't process aarch64 binaries
(strip: Unable to recognise the architecture), so the package ships unstripped
— 12MB vs 1.35MB for the old -1. Functional, but wants STRIP=aarch64-linux-gnu-strip.
2. squeekboard was loading the wrong layout
It logged Tried file ".../keyboards/us.yaml", but it's missing →
Loaded layout Resource: us — the stock built-in, not the dense layout.
sources is [('xkb','us')], and squeekboard resolves the source name to
<name>.yaml in ~/.local/share/squeekboard/keyboards/. us.yaml had been
deleted 2026-07-20 as a "duplicate".
Fix: us.yaml -> us+hacker.yaml symlink — same pattern as the existing
terminal/us.yaml -> ../us+hacker.yaml. Screenshot-verified on device: number
row, Tab, Ctrl, Esc, Alt, Fn, arrows, brackets.
3. The two keyboards no longer share layout config
Both read org.gnome.desktop.input-sources sources, so they fought over one key.
squeekboard now has its own dconf database:
/etc/dconf/profile/squeekboard→user-db:squeekboard+system-db:localEnvironment=DCONF_PROFILE=squeekboardin/etc/systemd/user/squeekboard.service/etc/dconf/db/localcreated (dconf update) to silence the missing-db warning
Set squeekboard-only keys with DCONF_PROFILE=squeekboard gsettings set ….
Do NOT add a terminal layout to stevia. stevia carries
0005-drop-terminal-layout.patch; the stevia/squeekboard split is deliberate
(TASK-38). stevia = daily (completion, dictation). squeekboard = terminal.
4. Heights matched
stevia 348px, squeekboard was 315px. stevia has no continuous height knob — its
scaling flags give 200 ([]) or 348 (['auto-portrait','auto-landscape'])
only. squeekboard does. Matched at 348 by scaling squeekboard up:
DCONF_PROFILE=squeekboard gsettings set sm.puri.Squeekboard \
scale-in-vertical-screen-orientation 1.1048
Both now report y=732 h=348. If the shorter 200 is wanted instead (TASK-17 §2
records that as Casey's original choice; the setting has since drifted back to
auto), set stevia scaling "[]" and squeekboard scale to 0.635 — and change
the pill's oskLift fallback to match.
5. The pill vanished — stale lift across a swap
Observed rail y=733 against an osk top edge of 732: the pill was buried
inside the keyboard's top rows, which reads as simply gone.
oskLift was stuck at squeekboard's 315 while stevia was at 348. The probe only
ever ran on GlobalStates.oskOpen going true — and oskOpen does not flip
across a keyboard swap; the keyboard stays "open", only the daemon changes.
Fix in SystemGestureRail.qml: extracted probeOskHeight(), called on swap
as well as on open; retry interval drops to 400ms while swapping (a swap has a
real gap with no osk layer mapped at all); margins.bottom holds the lift across
that gap so the pill doesn't fall to 0 and snap back.
Any future path that can change keyboard height must call probeOskHeight().
6. TASK-38 — and a duplicate I introduced
Gestures.qml already had oskSwapAction, an "oskSwap" action and an
oskSwap() IPC. I did not read the file first and added a parallel
oskSwipeAction / second "oskSwap" / oskSwipe() set — two identical keys in
one object literal (last silently wins).
Consolidated onto the pre-existing naming. Single path now:
pill (travel >= swapAt 300, OSK up)
→ Gestures.deliver("osk-swap", Gestures.oskSwapAction)
→ actions["oskSwap"] → Haptics.confirm() → /usr/local/bin/osk-switch
bind() and state() are now wired for it — they were not before; that gap
is the one useful thing the duplicate exposed. Test without the gesture:
qs -c souveraine ipc call gesture oskSwap.
Per TASK-38 the detent is past the existing swipe-to-max, armed only while an OSK
is visible, with a haptic tick() on the crossing and a shape change
(radius: 2) so it reads as a further stage.
DEBT (TASK-38 + TASK-25): /usr/local/bin/osk-switch is owned by no package
and is now a load-bearing dependency of a shipped gesture. It wants packaging
into the rootfs overlay.
7. NOT DONE / NOT VERIFIED — read before claiming any of this works
- Grip gesture. Casey states it WAS live; I did not establish its current
state and ran out of session. Facts gathered, nothing concluded:
blueline-edge-sense0.2.0-1 installed,/usr/bin/blueline-edge-sensepresentblueline-edge-sense-power.serviceactive (rail powered)blueline-hexagonrpcd-adsp+-sdspactive- the reader is a user unit:
/usr/lib/systemd/user/blueline-edge-sense.service, pulled in viagraphical-session.target.wants/ - TASK-40 records that
graphical-session.targetis never started on this device — that is exactly what keptsouveraine-sensorddead from every boot until 2026-07-27. Same target, same trap, different package — CHECK THIS FIRST, but confirm it rather than assuming it. (Superseded 2026-08-15:souveraine-session-viewtopstarts the target. The trap is closed — TASK-76.) - It reports to the session authority (sessiond), not to the shell's gesture
IPC.
qs -c souveraine ipc call gesture stateis the WRONG probe — that is a parallel path. Use sessiond / the device state machine.
- Word completion — the completer is genuinely live (
Switching default completer to 'hunspell',en_US.aff/en_US.dicloaded). It lacks a preedit, which requires an input-method-v2 context.kitty.confhaswayland_enable_ime no, so completion cannot appear in kitty. Not changed — it is entangled with the terminal-layout history and is Casey's call. - "Kill waydroid" dial entry — absent from both the phone and Gitea
primary. waydroid IS installed.DialHost.qmlhas "Screenshot" and "Kill window" and is byte-identical to Giteaprimary. Unaccounted for. - stevia layout menu / word-completion toggle untappable — Casey reports this as pre-existing. Not diagnosed.
8. Uncommitted work — THE ACTUAL RISK
~/souveraine-surfaces/quickshell on the phone is not a git repo, and it is
ahead of Gitea for SystemGestureRail.qml and Gestures.qml. That single
unversioned directory is the only copy. This is the mechanism behind work
repeatedly "disappearing" — there is nothing to revert to.
| where | what | state |
|---|---|---|
archdev ~/Projects/Pixel3Arch |
branch fix/squeekboard-prefix (build-cross.sh + PKGBUILD) |
uncommitted |
phone ~/souveraine-surfaces/quickshell |
SystemGestureRail.qml, Gestures.qml |
phone-only, no VCS |
archdev ~/Projects/souveraine |
on public @ 0e780d5 (2026-06-26) |
a month stale; Gitea primary is 21b602a7 |
souveraine uses AGit — head moves only on refs/for/primary pushes.
9. Changed outside git on the phone
Backups in the session scratchpad (osk-backup-223036/, osk-switch.bak,
squeekboard.service.bak).
/etc/systemd/user/squeekboard.service— addedEnvironment=DCONF_PROFILE=squeekboard/etc/dconf/profile/squeekboard,/etc/dconf/db/local— new~/.local/share/squeekboard/keyboards/us.yaml— new symlink →us+hacker.yaml~/.pi/extensions/llamaswap-provider.ts— new, registered viapi install- gsettings:
mobi.phosh.osk.Completers default 'hunspell',completion-mode ['manual','hint'],osk-features [](key-indicator off, it was the flicker), squeekboard-scopedscale-in-vertical-screen-orientation 1.1048
10. What I got wrong — do not repeat
- Restarted
souveraine-shelltwice and then told Casey I hadn't. The journal showed cleanStopping/Stopped/Startedat 22:53:21 and 22:55:05. Check the journal before asserting what you did. - Inverted a documented fix. Pill sat wrong because
scalinghad drifted from Casey's recorded[](200px) to auto (348px). TASK-17 §2 says so. I changedoskLift200→348 instead of restoring the setting — and TASK-17 also warns a too-high lift lands the pill in stevia's upward-opening layout menu ("keyboard selection not working", 2026-07-21). - "Fixed" squeekboard's path by editing the unit to
/usr/local/bin— i.e. cementing the packaging bug instead of fixing it. - Added a duplicate
oskSwapbecause I editedGestures.qmlby anchor without reading it. - Proposed adding a terminal layout to stevia — directly contradicts the
deliberate split and stevia's own
0005-drop-terminal-layout.patch. - Claimed "squeekboard has never worked" and baked it into a code comment.
pacman.logdisproved it in one command. - Probed grip via the shell gesture IPC. Wrong path entirely; it goes through the state machine.
The pattern: the answer was already written down in docs/tasks/ and
pacman.log every single time. Read SouveraineOS/docs/tasks/ and
STATE.md before touching anything on this device.
Connects to
TASK-17 (keyboard/dictation), TASK-24 (layout rethink — incl. the row-count
max_rows rule for dead bands), TASK-25 (packaging unowned /usr/local
binaries), TASK-38 (pill swipe → OSK swap), TASK-40 (sensor tiering + the
graphical-session.target trap), INTERFACE-ARCHITECTURE.md §4.