Volume UI: real-board verification — 2026-10-01
result.json records PASS for fifteen assertions against the actual Inno ALSA/PipeWire sink and a real named playback stream on the installed coherent system. board-probe.py ran through the reserved serial console, with injected kernel uinput contacts, actual wpctl/pw-dump state and native output captures. The system/client identities are in the result. Normal volume/mute were restored; the owned app, tone and injected device were removed.
Passed: Settings volume changes while the contact is still held, authoritative release, zero-mute, speaker-icon mute/unmute with remembered level, Shade slider, independently mapped HUD above Home and above a real Foot window, popup repositioning, held-contact survival past the auto-hide interval, eventual auto-hide after release, expanded real stream, held stream volume update/release/mute, and actual sink selection. Native screenshots were reviewed; the stream name is Volume proof and its provided generic audio icon uses the documented letter fallback. Hardware mixer quantization can round the nominal 75% gesture to 76%.
The verification found and fixed two backend bugs: shell quotes around the SPA Props object made interactive pw-cli silently ignore it; writing ALSA sink DSP Props adjusted a different volume/mute from wpctl’s hardware mixer. Sink parsing and live writes now use the matching Device Route and preserve device-only monitor updates; ordinary stream nodes retain native Props writes. The generated format was checked on the real board: the hardware Route reported a muted approximately 50% level through wpctl, then was restored.
The independent-popup fixture QEMU command unshare -Ur python3 tests/volume_hud_qemu.py --sway <exact Sway> --rust <exact Rust> --output <private output> passed collapsed/expanded/both-slider captures. This is synthetic graph proof only, distinct from the real board results. Full Rust library/binary/integration tests passed (477 tests, one ignored); the doc-test invocation was rerun with matching Nix rustdoc after an unrelated toolchain mismatch. The coherent cross-build and activation passed.
Harness corrections: restart the UI before each run so prior popup repositioning cannot invalidate coordinates; take the hide baseline before release/capture; and launch the owned Foot with an accessible working directory. Failed attempts are not counted as passes. The 3.289s wait in the result includes screenshot/polling time, not a precise compositor timing measurement; source timers and held-contact tests establish the 2.5s policy.
Limits: injected UI is not a new human-finger acceptance run; the user delegated verification. A playback graph node proves neither headphone nor speaker audibility. No audio add-on is attached; no keyboard emitting XF86 audio keys is confirmed. Task 9.2 remains open unless the user explicitly authorizes transferring it into the existing audio proposal.
The installed closure is /nix/store/xphf8zb00gz9hiyqkkh399rldr2ljykb-nixos-system-nixos-26.11.20260919.20b1ddd. Runtime switch and active shell/seat/PipeWire/WirePlumber services were checked. Final boot-profile installation is recorded separately.
Authorized listening-test transfer
On 2026-10-01 the user said “move headphone listening test into audio proposal”. The unperformed volume task 9.2 is preserved as the-handheld-plays-through-its-speaker task 5.6, including known playback through PipeWire, several Settings slider levels, mute, connected headphone/line-out and committed listening observations. This permits closing the verified volume UI; no audible test was performed or marked passed.