Picker row repaint: first physical pair
The board received software-injected input events, not a real finger. Both runs used the same active appearance generation, eight backgrounds, compositor PID/start identity, current system and normal launcher wrapper. Each restarted the UI/helper, waited for Settings and a twelve-second picker warmup, then ran six theme and six background swipes: 240 pixels over 200 ms followed by 1.2 seconds at rest. Both 60-second bounded trace pairs have zero dropped events and no exporter warnings. Native PNGs were captured after timing, at grim scale 0.6. These captures show the picker and resolved previews; they are not camera recordings.
Baseline executable: /nix/store/8cikjd811d7b7hsdhn7nnb3lnipf3vwp-k230-shell-rust-riscv64-unknown-linux-gnu-0.1.0/bin/k230-shell-rust (coherent runtime source b57ba41ccf6755c54039fc85b0a54145001b186a). Candidate source: 42e22d4353e35d9c4f6367ed5b159c80b489ec5d; exact coherent-configuration output /nix/store/2mprr7lqh4hznwz9z1zmv7vamf5nbnna-k230-shell-rust-riscv64-unknown-linux-gnu-0.1.0. Its direct runtime references exactly match the baseline. The generic standalone cross-package output was deliberately excluded from this comparison because it links different Cairo/Pango/librsvg outputs.
| Measured result | Baseline | Candidate |
|---|---|---|
| Presented frames in bounded recording | 105 | 127 |
| Active presentation gap median | 134.121 ms | 76.641 ms |
| Active presentation gap p95 | 210.765 ms | 153.287 ms |
| Active presentation gap p99 | 229.923 ms | 191.602 ms |
| Theme phase overlay draw median thread CPU | 96.443 ms | 78.363 ms |
| Background phase overlay draw median thread CPU | 62.014 ms | 34.015 ms |
| Theme phase full scene rebuilds | 50 | 12 |
| Background phase full scene rebuilds | 43 | 4 |
The row repaint mechanism reduced complete scene rebuilding and improved this pair’s cadence. Jank is not resolved. This is one pair, not a statistical confidence claim or a matched-pixel microbenchmark. The input programs match, but the existing step-integrated momentum behaves differently with the changed frame cadence: the final selected preview is Lupine in the baseline and matte-black in the candidate. Active appearance remains identical. The continuous elapsed-time motion correction belongs to task group 18 and was not included in this candidate. Presentation summaries cover the entire bounded recording including picker opening; per-row CPU summaries use only each swipe and its following 1.2-second rest. Overlapping span medians are not additive. Background decode/preparation may already be in flight; the new policy stops new speculative admission during motion, rather than cancelling an existing worker.
Sources and replay
The executed capture script, its input helper, raw bounded numeric traces, exporter summaries and comparison are frozen here. SHA256 values are in sha256.json. Traces identify CLOCK_MONOTONIC timestamps; they contain no external collector or cross-host timestamp rebasing. The helper’s unused standalone collector mode remains in the frozen source; this pair invoked only its verified virtual-device and native-touch functions.
Coordinator only: stage these scripts on the reserved board as pair-capture.py and baseline.py, and stage the reviewed Goodix descriptor whose device name is K230 injected touchscreen. The script refuses a physical input device. Use the board Python interpreter and installed normal service wrapper. PROTECTED_UPLOAD_URL must come from the local protected transfer endpoint, outside Git; it is used only after restoration to collect fixed allowlisted files.
BOARD_PYTHON=/nix/store/v189xydz6qkcd4cbkixcmv91w8hbc560-python3-riscv64-unknown-linux-gnu-3.14.7/bin/python3
systemd-run --quiet --wait --collect --unit=k230-theme-row-base \
--property=RuntimeMaxSec=150s \
--setenv=PATH=/run/current-system/sw/bin:/run/current-system/sw/sbin \
"$BOARD_PYTHON" /root/tmp/k230-theme-row-trial/pair-capture.py \
base "$PROTECTED_UPLOAD_URL" \
/nix/store/8cikjd811d7b7hsdhn7nnb3lnipf3vwp-k230-shell-rust-riscv64-unknown-linux-gnu-0.1.0/bin/k230-shell-rust
# Repeat with unit/label candidate and the exact 2mpr candidate ELF above.
python3 tools/runtime-trace-export.py \
docs/evidence/theme-picker/row-repaint/pair/candidate-rust.json \
docs/evidence/theme-picker/row-repaint/pair/candidate-helper.json \
--timeline NEW_TIMELINE.json --summary NEW_SUMMARY.json
The exact host cross-build used the committed flake’s nixosConfigurations.k230-coherent-shell.pkgs.callPackage (f.outPath + "/nix/rust-shell-client") {} with one job/eight cores. Host checks: 418 library tests passed, one existing ignored; 22 binary route tests passed; nine Python runtime-trace checks passed. Two new full-render pixel oracle tests cover fractional movement, reversal, pressed feedback and semantic/route/size invalidation; prepare-ahead tests cover both-row rest admission. Source build and traces are separate evidence classes.
Both trials used an independent 180-second service-restoration timer plus finally cleanup, preserving the installed wrapper environment and replacing only its final ELF. After candidate collection the normal 8cik executable was running and shell/shell-ui/theme-helper were active; both owned trial drop-ins were absent. Normal boot Image, initrd, DTB, boot arguments and firmware hashes still match the previously committed physical normal-boot recovery evidence. No boot selector or system profile was written. Earlier setup attempts aborted before timed input on stale input-unit/preflight identity/generation checks; those failed attempts are not successful results in this pair.
Remaining: combined latest source installation (picker plus subsequently landed visual polish), exact installed runtime inspection and task 14.4 real-finger acceptance. Wider group 13/15 gates and the motion target remain open. This candidate was restored after the comparison, so it is not claimed as the persistent current shell.