name: qa description: > Run quokka's real-device E2E layer (QA strategy layer 5): drive the real qk binary against connected iPhone/Android devices through tmux, apply deterministic verifiers, and write a report. Use when the user asks to "run /qa", "run the device QA suite", "test against the real device", or before a release. Optionally finishes with an advisory exploratory UX pass (layer 6).
/qa — real-device E2E runner
You are the driver for layer 5 of the QA strategy
(docs/superpowers/specs/2026-06-01-qa-strategy-design.md). You run the real
binary against attached hardware and decide pass/fail deterministically.
Hard rule
Pass/fail is decided ONLY by the deterministic predicates below (exit code, regex over captured text, golden-frame compare, JSON validity). You do not use your own judgment to pass or fail a case. Subjective UX judgment belongs to the optional exploratory pass at the end, which is advisory and never a gate.
Preconditions
tmuxandjqinstalled. Iftmuxis missing, stop and tell the userbrew install tmux.- A current build: run
cargo build(debugqkattarget/debug/qk). - At least one device attached. Detect platforms:
tests/llm/lib/drive.sh platforms→ printsiosand/orandroid. If empty, stop and tell the user to connect a device.
All mechanics go through tests/llm/lib/drive.sh (see its header for the
subcommands). Never reimplement the tmux dance inline.
Procedure
Read every tests/llm/*.yaml (not lib/, not golden/, not reports/). For
each case, in file order:
-
Check
requiresagainst the detected platforms.any→ at least one device present.ios/android→ that platform present.- Not met → record SKIP with the reason. Never fail on absence.
-
Run it.
- No
interactblock (non-interactive):drive.sh run <command>. The output ends with__QA_EXIT__=<code>. The captured text above that line is the output. - Has
interact(interactive TUI):drive.sh start <session> <command>(use a unique session likeqa_<id>).- For each step:
wait_for: X→drive.sh wait <session> "X" <timeout>;keys: [..]→drive.sh keys <session> <k1> <k2> .... - After the steps, capture the frame:
drive.sh capture <session>. - Send
quit_keys(defaultq) anddrive.sh stop <session>. - If
waittimes out, that is a FAIL (the TUI never reached the expected state).
- No
-
Apply every
verifypredicate against the captured output/frame: | Predicate | Check | |-----------|-------| |exit_code: N| the__QA_EXIT__value equals N | |output_matches: R| regex R matches the captured output | |frame_matches: R| regex R matches the captured frame | |frame_excludes: R| regex R does not match the frame | |json_valid: true| the captured output parses as JSON (jq . <<<output) | |golden_frame: name| the frame equalstests/llm/golden/<name>.txtexactly | A case PASSES only if every predicate holds. A case with no predicates and a clean run is a PASS but flag it as "smoke-only". -
Always tear the session down even on failure (
drive.sh stop).
Report
Write tests/llm/reports/<YYYY-MM-DD-HHMM>.md containing:
- a summary line:
N passed, M failed, K skippedand the detected platforms; - per case: id, status (PASS/FAIL/SKIP), which predicate failed (if any), and the captured frame in a fenced block (the trajectory, for debugging).
Then print the summary to the user. If anything failed, lead with the failures.
Optional: exploratory UX pass (layer 6, advisory)
Only if the user asks for it, or it is pre-release. After the deterministic suite, drive a connected device freely beyond the scripted cases — open each TUI, trigger an error path (e.g. unplug mid-command if the user is present), resize, navigate. Report UX smells ("this error doesn't say what to do", "the dashboard wraps awkwardly at 80 cols") as observations, NOT pass/fail. The user decides what becomes a ticket. Never gate a release on this pass.
TDD Red-Green-Refactor
Testing
Skill qui guide Claude a travers le cycle TDD complet.
Audit d'Accessibilité Web
Testing
Réalise un audit d'accessibilité web complet selon les normes WCAG.
Générateur de Tests UAT
Testing
Génère des cas de test d'acceptation utilisateur structurés et complets.