Rust theme restart and wallpaper-layer recovery: host checkpoint
On service start, the Rust appearance receiver now validates the private theme state’s active symlink and loads that immutable generation before mapping the drawer or wallpaper. The target must resolve to a direct child of the state’s generations directory and pass the same bounded appearance/report checks as an incoming transaction. An absent, stale, malformed or escaping pointer falls back to the pinned default generation. A host restart fixture selects a user generation, rebinds the receiver, then checks the selected snapshot; it also checks fallback from a foreign pointer.
If a commit’s ACK is lost after the receiver has adopted it, the coordinator can still send its idempotent rollback. A host fixture closes the commit peer before reading its reply, then checks that rollback restores the prior snapshot with an exact protocol response.
The persistent no-input wallpaper layer now schedules a remap after compositor closed and retries no faster than once per second if creation fails. A map without configure is retired after three seconds and retried, so output loss does not leave a permanently absent wallpaper surface or grow an unbounded layer list. This lifecycle path has source review and host compile proof only; the paired Sway/output-close behavior still needs QEMU and real device evidence.
cargo fmt --manifest-path nix/rust-shell-client/Cargo.toml --check
cargo test --manifest-path nix/rust-shell-client/Cargo.toml --locked
cargo clippy --manifest-path nix/rust-shell-client/Cargo.toml --locked --all-targets -- -D warnings
Host checks on 2026-09-24 UTC passed: 21 library tests, 4 main tests, 10 appearance receiver tests, 5 background decoder tests, formatting and strict clippy.
The exact source commit 3bd2d35bdec884e13f958097631bb19e97b8d0f4 subsequently passed the RISC-V target build:
nix build "git+file://$PWD?rev=3bd2d35bdec884e13f958097631bb19e97b8d0f4#handheld-shell-rust" --max-jobs 1 --cores 4 --no-link --print-out-paths
Derivation /nix/store/gw784waxvdiy0szz1lsbbac09dg4nwjs-k230-shell-rust-riscv64-unknown-linux-gnu-0.1.0.drv produced /nix/store/rx393c3q7j3ch30zk3l3w0ws8hyi96b1-k230-shell-rust-riscv64-unknown-linux-gnu-0.1.0. Paired Sway transaction/restart and physical output recovery remain open.