Per-theme wallpaper memory: host checkpoint
Observed 2026-09-23 from the c92160d8 integration base. The optional
background-selections.json lives under the user’s theme state directory,
outside every unchanged source checkout. Its keys hash canonical source paths;
its values are source-relative backgrounds/NAME entries rather than stale
generation store paths. The file is bounded to 64 KiB/256 choices, written
atomically with mode 0600, and rejects foreign symlinks and malformed data.
Omitting a background in either omarchy-theme-set or the JSON chooser reads
the remembered asset if it remains staged. An explicit asset wins, including
the theme’s default image. If the remembered asset was removed in a source
update, preparation reports remembered background removed; using theme default; this does not rewrite the preference during preview. The next
acknowledged activation records the fallback.
The preference guard and final write run under the same existing activation
flock as the current/active pointer swap. A shell commit ACK precedes the
memory write; a failed ACK preserves both prior pointer and preference. A
failed post-ACK preference write attempts restoration of the pointer, prior
preference bytes, and shell generation. A stale implicit preview whose source
preference changed while it waited for the lock is rejected for re-preview.
There is no claim that the physical panel presented or remembered an image.
python3 tests/test_theme_preferences.py PASS 9 host tests
python3 tests/test_theme_catalog.py PASS 9 host tests
python3 tests/test_omarchy_theme_activation.py PASS 9 host tests
python3 tests/test_omarchy_theme_transaction.py PASS 13 host tests
openspec validate the-shell-loads-omarchy-themes --strict PASS
Fixtures cover switch-away/back and a fresh process read, source update, deleted asset fallback, preview/cancel, failed shell ACK, injected preference write failure after replacement, cached-generation diagnostics, conflicting concurrent activations, the compatible command path, and an alien symlink. No Nix package build, reboot, touch chooser, decode/cache/overlay/fit mode, or real-glass proof was run for this checkpoint. OpenSpec task 4.1 and the physical tasks remain open.
The coordinator subsequently built the narrow command package from the landed
99ac8e48 integration revision: nix build .#handheld-theme-command --no-link
PASS, output /nix/store/xjncl4sgb4yb7asabpk41l051wncpi5b-handheld-theme-command-0.1.
This proves the package evaluates and cross-builds; it does not prove a theme
switch, client repaint, wallpaper presentation, or persistence on the board.