evidence · 5.5 KiB

README.md

Committed at docs/evidence/keyboard-gestures/native-qemu/README.md. This is what grounds the requirements that cite it.

Open raw source

Keyboard gesture native QEMU checkpoint

Observed 2026-09-24 UTC from branch impl/keyboard-touch-gestures, source 9fea8e1f61ef4776856a37d567a17c166681be86. This is a 568×1232 headless Pixman Sway session under qemu-riscv64-static with IPC-injected contacts, the real wvkbd-mobintl Wayland surface, and the synthetic live card probe client. It is not a board, panel, or real-finger observation.

The exact narrow cross-build was nix build .#card-shell --max-jobs 1 --cores 4 --no-link --print-out-paths: package /nix/store/pzjnkai9mpkv11zaxmrs96vyng6rw901-k230-card-shell, Sway /nix/store/nkz1nrjk71pmlslsninjwj4xalgapmfx-sway-unwrapped-riscv64-unknown-linux-gnu-1.12/bin/sway. The keyboard was the already-realized /nix/store/n7p6qfbyw30yany09x8kr95j2ar1fh7b-wvkbd-riscv64-unknown-linux-gnu-0.20/bin/wvkbd-mobintl; this does not assert the final image’s keyboard closure. The fixture client was /nix/store/6nskh3ldk3ya7mwxbb258qszrxhw2i61-card-composition-probe-client-0.1/bin/card-composition-probe-client.

Run from the repository root with those exact executables:

python3 tests/test_keyboard_gestures.py
python3 tests/test_keyboard_gestures_runtime.py \
  --sway /nix/store/nkz1nrjk71pmlslsninjwj4xalgapmfx-sway-unwrapped-riscv64-unknown-linux-gnu-1.12/bin/sway \
  --client /nix/store/6nskh3ldk3ya7mwxbb258qszrxhw2i61-card-composition-probe-client-0.1/bin/card-composition-probe-client \
  --keyboard /nix/store/n7p6qfbyw30yany09x8kr95j2ar1fh7b-wvkbd-riscv64-unknown-linux-gnu-0.20/bin/wvkbd-mobintl \
  --output /tmp/k230-keyboard-qemu-popup-hit
python3 tests/test_keyboard_gestures_runtime.py \
  --sway /nix/store/nkz1nrjk71pmlslsninjwj4xalgapmfx-sway-unwrapped-riscv64-unknown-linux-gnu-1.12/bin/sway \
  --client /nix/store/6nskh3ldk3ya7mwxbb258qszrxhw2i61-card-composition-probe-client-0.1/bin/card-composition-probe-client \
  --keyboard /nix/store/n7p6qfbyw30yany09x8kr95j2ar1fh7b-wvkbd-riscv64-unknown-linux-gnu-0.20/bin/wvkbd-mobintl \
  --output /tmp/k230-keyboard-qemu-popup-hit-fail-helper --fail-hide

The policy suite passed 16 sanitizer cases. Both native runs passed. The first kept two contacts down while a 100 px centroid rise moved the painted grip and usable-area edge to y=1132; a pause held that position without drift; a 50 px reverse moved it to y=1182. Releasing settled hidden at app height 1232. A second chord settled shown at app height 756. A 210 px grip drag moved the edge to y=966; touch cancellation restored the shown keyboard, then an ordinary keyboard touch delivered one key press to the live client. A fresh 210 px grip drag again reached y=966, then reversed 40 px to y=926 before continuing past the midpoint and settling hidden. Actions were show, hide, show, hide. The screenshot files here show the actual composited pixels at those states. result.json retains the numeric checks.

The negative run made the trusted hide helper exit failure; after its bounded recovery the keyboard returned to app height 756 and a normal key press still arrived. fail-hide-result.json records that result. The earlier source checkpoint reproduced a Sway scene-descriptor crash on wvkbd teardown; the corrected compositor completed show→hide→show without that crash. A keyboard popup elsewhere on the output initially blocked the grip because the old guard was global; the final source checks popup overlap at the contact and retains popup ownership if it actually covers the grip.

StateCommitted capture
Hidden keyboard and full-height live apphidden.png
Two-finger held revealheld.png
Two-finger reversereverse.png
Settled keyboard and usable areashown.png
Grip held at 210 px travelgrip-held.png
Grip reversed by 40 pxgrip-reverse.png

The machine-readable positive result and failed-helper recovery result retain numeric outcomes.

An optional repeat with --foot /nix/store/kv21hqgv043bmdfi5i1f791n9x7crwgg-foot-riscv64-unknown-linux-gnu-1.28.0/bin/foot started the real RISC-V Foot terminal with a PTY-backed /usr/bin/tee child. After explicit Foot focus, two wvkbd touches entered the public letter c and Enter; the file contained exactly bytes 63 0a. The Foot capture and text result show the exact result. This closes native text ownership in task 2.3, without asserting real-finger text entry.

With --output-reset, disabling the sole headless output caused wvkbd to exit after logging Could not find config for output HEADLESS-1; the compositor returned the app to height 1232. After an explicit restart of wvkbd (modeling a supervisor), a fresh two-finger show, grip hide and ordinary key check passed. Output-restart result retains the action sequence. The installed coherent session currently starts wvkbd once from Sway configuration, so automatic resurrection remains an open task 1.2 gate.

The later guarded installed preview records the actual system identity and a keyboard shown on the board by USR2. That separate observation does not turn these QEMU contacts into real fingers; it also predates the supervised keyboard and high-contrast grip source. Remaining gates for the new source are automatic restart in the installed unit, real two-finger and grip motion on glass, panel/camera observation, workload budgets, and user acceptance. These captures cannot establish touch reachability or physical smoothness.