Executes hardware-in-the-loop QA testing on iOS/Android devices using deterministic verifiers.

Install

mkdir -p .claude/skills/qa-dutradotdev && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/17334" && unzip -o skill.zip -d .claude/skills/qa-dutradotdev && rm skill.zip

Installs to .claude/skills/qa-dutradotdev

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

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).
373 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Intermediate

Key capabilities

  • Detect available platforms (iOS, Android)
  • Run non-interactive test cases
  • Run interactive TUI test cases
  • Apply verification predicates against captured output or frames
  • Generate a detailed test report
  • Perform an optional exploratory UX pass

How it works

The skill reads YAML test cases, checks platform requirements, runs tests using `drive.sh`, applies deterministic verification predicates, and generates a report.

Inputs & outputs

You give it
YAML test case definitions from `tests/llm/*.yaml`
You get back
A test report in `tests/llm/reports/` with pass/fail/skip status

When to use qa

  • Run device E2E test suite
  • Validate release readiness on hardware
  • Automate QA reporting

About this skill

/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

  1. tmux and jq installed. If tmux is missing, stop and tell the user brew install tmux.
  2. A current build: run cargo build (debug qk at target/debug/qk).
  3. At least one device attached. Detect platforms: tests/llm/lib/drive.sh platforms → prints ios and/or android. 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:

  1. Check requires against 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.
  2. Run it.

    • No interact block (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 like qa_<id>).
      • For each step: wait_for: Xdrive.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 (default q) and drive.sh stop <session>.
      • If wait times out, that is a FAIL (the TUI never reached the expected state).
  3. Apply every verify predicate against the captured output/frame:

    PredicateCheck
    exit_code: Nthe __QA_EXIT__ value equals N
    output_matches: Rregex R matches the captured output
    frame_matches: Rregex R matches the captured frame
    frame_excludes: Rregex R does not match the frame
    json_valid: truethe captured output parses as JSON (jq . <<<output)
    golden_frame: namethe frame equals tests/llm/golden/<name>.txt exactly
    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".
  4. 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 skipped and 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.

When not to use it

  • When subjective UX judgment is the primary pass/fail criterion
  • When `tmux` is not installed
  • When no device is attached

Prerequisites

tmuxjqA current build from `cargo build`At least one device attached

Limitations

  • Pass/fail is decided ONLY by deterministic predicates.
  • Subjective UX judgment is advisory and never a gate.
  • Requires `tmux` and `jq` installed.

How it compares

This skill automates real-device end-to-end testing with deterministic pass/fail criteria and structured reporting, which is different from manual testing or subjective evaluations.

Compared to similar skills

qa side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
qa (this skill)01moNo flagsIntermediate
xcodebuildmcp243moNo flagsAdvanced
ios-simulator-skill271moReviewAdvanced
claude-mobile-ios-testing188moNo flagsIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry