Launcher appearance receiver source checkpoint
Observed 2026-09-23. With k230.shell.themeReceiverTrial = true, the launcher
has a same-UID, mode-0600 Unix receiver under its existing private /run/shell
runtime directory and the command enters the image. The normal configuration
keeps this option off. The receiver accepts a
bounded versioned prepare/commit/rollback request, parses only generated
palette fields from a bounded report.json, and changes its current
background, text, tile, selected and accent colors. The authored muted
swatches in the pinned dark/light sources measure only about 1.9–2.5:1
against their backgrounds, so small launcher hint text temporarily uses the
foreground color; its source value remains in the report. Error text selects
a contrasting light or dark color. Commit returns an
acknowledgement after the launcher submits and flushes a themed Wayland
buffer; a pending page transition is settled first. Invalid generation IDs,
missing palette data, foreign peers and absent configuration do not produce
successful commit acknowledgements. A restarted receiver loads the previous
generation supplied by the coordinator before switching. The installed
default palette remains when the trial option is off.
python3 tests/test_omarchy_theme_activation.py
PASS: 7 host tests, including a public-name command which fails closed
without a receiver and leaves the active pointer absent.
python3 tests/test_omarchy_theme_transaction.py
PASS: 10 host transport tests.
python3 tests/test_shell_appearance_receiver.py
PASS: 4 native host receiver socket tests: prepare/commit/rollback,
pre-prepare rejection, restart restoration, socket mode 0600, and synthetic
light/dark plus pinned dark/light/community foreground/hint-to-background,
tile, selected and error contrast >= 4.5.
python3 tests/test_launcher_navigation.py
PASS: 3 existing launcher navigation tests with appearance.c linked.
nix build .#touch-launcher --max-jobs 1 --cores 4 --no-link --print-out-paths
PASS: /nix/store/1abjx9k2xm3k7w14bmv9ypxwmswi383w-k230-touch-launcher
nix build .#handheld-theme-command --max-jobs 1 --cores 4 --no-link --print-out-paths
PASS: /nix/store/8hg86rs0yfxsc0a7lcbnbyh3d18i6wcx-handheld-theme-command-0.1
Closure: 338,250,352 bytes, dominated by target Python; package is opt-in.
nix eval --json .#nixosConfigurations.k230.config.k230.shell.themeReceiverTrial
PASS: false in normal configuration.
nix eval --impure --json --expr 'let f = builtins.getFlake (toString ./.); c = f.nixosConfigurations.k230.extendModules { modules = [ { k230.shell.themeReceiverTrial = true; } ]; }; in { enabled = c.config.k230.shell.themeReceiverTrial; installed = builtins.any (p: (p.pname or "") == "handheld-theme-command") c.config.environment.systemPackages; }'
PASS: {"enabled":true,"installed":true} in an opt-in evaluation; no image built.
This receiver currently styles the installed launcher only, using a subset of
the generated palette. It does not consume full shell.toml fields or bind
cards, Settings, notifications, keyboard, wallpaper or applications. The host
fixture has no Wayland compositor or panel, so it proves protocol behavior
but not frame presentation, touch readability or physical rollback. OpenSpec
tasks 2.1/2.2 and the surface tasks remain open pending package/default source
integration, richer token consumption and device evidence.