Run QA checks.
/qa [commit|full|staging|prod|e2e-gen|visual|ios] [--commit-strict] [--workflow|--classic] [--invoked-by <caller>]
Flags:
--commit-strict — commit mode only: trust your judgement and skip the automatic qa-domain escalation when the completion-verifier flags a domain-logic gap--workflow / --classic — full mode only: force how the surface fan-out is spawned (dynamic Workflow vs the classic parallel agents). Classic is the default; the workflow path falls back to classic on any error--invoked-by <implement|fix|pr> — set automatically when another skill runs /qa for you; suppresses /qa’s own “Run /review-pr now?” prompt since the calling skill asks its own next-step question. Standalone runs are unchanged/pr — the default commit mode checks exactly what you changedfull mode runs every surface (web, iOS, domain, adversarial) in parallelstaging / prod modes hit the deployed environment’s health and smoke checksFor mode-selection strategy and the four-layer test philosophy, see the QA Guide. This page covers invocation and what each run does.
/qa
What you’ll see: a mode line confirming commit mode, then 2-4 QA agents running targeted checks on your changed files (5-8 generated scenarios, ~1-3 min), ending with a structured QA report and a suggested next step (/review-pr then /pr).
/qa # commit mode — targeted checks on the last commit's diff (~1-3 min)
/qa full # comprehensive multi-surface QA, all agents in parallel (~10-20 min)
/qa staging # health + smoke + E2E against deployed staging
/qa prod # READ-ONLY health + smoke against production — no mutations
/qa e2e-gen # generate + run exploratory Playwright tests for changed components (~3-8 min)
/qa visual # screenshot routes at desktop/tablet/mobile and evaluate (~5-15 min)
/qa ios # iOS Simulator visual QA — macOS with Xcode + built .app only (~5-10 min)
/qa --commit-strict # commit mode without the automatic qa-domain escalation pass
/qa full --workflow # run the full-mode surface fan-out as a dynamic Workflow (classic is the default)
If you run /qa with no argument and nothing has changed since the last commit, it shows a one-line picker instead of running — user-confirmation checkpoint (Enter for a full audit, ? for all modes, c to cancel).
Commit and full modes follow the same skeleton:
CLAUDE.md test commands, QA knowledge base (past bug patterns, incidents), and .claude/qa-config.json if present.HEAD~1 in commit mode, main...HEAD in full mode. Commit mode also runs an advisory /revert-check and annotates the report if anything looks like an accidental revert.--commit-strict)./review-pr now or skip to /pr (user-confirmation checkpoint — suppressed when /pr, /implement, or /fix invoked QA with --invoked-by, since the caller asks its own next-step question); on fail it asks whether to fix and re-run.Staging/prod modes skip the diff analysis and instead resolve deployed URLs from CLAUDE.md, hit health endpoints, and run smoke (and E2E for staging) checks. Prod is strictly read-only.
Selection depends on mode and which files changed. Commit-mode/core agents run in both commit and full mode; the surface agents are full-mode only (except when invoked directly via /qa visual, /qa e2e-gen, or /qa ios).
Commit-mode / core agents (run in commit mode, and again in full mode over the full-codebase diff):
| Agent | Model tier | Role |
|---|---|---|
| backend-qa / frontend-qa | haiku | Lint, type check, tests, build on changed layers |
| contract-qa | haiku | Schema diff / migration validation |
| domain-qa, code-review, pbt-qa | sonnet | Business-logic checks, architectural review, property-based tests |
| qa-test-promoter | haiku | Converts an approved bug-catching scenario into a permanent regression test (only when you say yes) |
| completion-verifier | sonnet | Final completeness cross-check |
Full-mode surface agents (the F3 roster — additive on top of the core agents above):
| Agent | Model tier | Role |
|---|---|---|
| qa-visual | sonnet | Visual regression across desktop/tablet/mobile viewports |
| qa-e2e | sonnet | Exploratory end-to-end flow testing (Playwright) |
| qa-ios | sonnet | iOS Simulator visual QA (macOS + Xcode + built .app only) |
| qa-domain | sonnet | Domain/business-logic validation across the full surface |
| qa-challenger | sonnet | Adversarial attacks against the changes |
Note: e2e-gen (/qa e2e-gen) is a separate opt-in mode that generates new exploratory Playwright tests — it is not part of full mode. qa-e2e is the full-mode surface agent that runs E2E tests. The similar names refer to different things.
Model tiers shown above are defaults from model-policy.yml and may differ if your project customizes model assignments via a model-policy.override.yml.
In full mode the surface agents (qa-visual, qa-e2e, qa-ios, qa-domain, qa-challenger) can spawn either classically or as a dynamic Workflow (--workflow); results, verdict math, and the report are identical in both paths.
qa-report-{timestamp}.md in the project root, plus per-agent JSON results in qa-results/.claude/qa-knowledge/ (bug-patterns.md, coverage-gaps.md, flaky-tests.md) when a run discovers something new.claude/qa-knowledge/promoted-tests/| Problem | Fix |
|---|---|
diff is empty picker appears |
Nothing changed since the last commit — pick full audit, another mode, or cancel |
/qa: empty diff — specify mode (CI/autopilot) |
Non-interactive runs need an explicit mode argument |
Dev server not running (visual / e2e-gen) |
Start the dev server with the command from CLAUDE.md, then re-run |
Playwright not configured (e2e-gen) |
The project has no playwright.config.* — e2e-gen can’t generate tests without it |
computer-use MCP not connected (visual) |
Connect the computer-use MCP and retry; full mode marks the surface SKIPPED instead |
| iOS surface reports SKIPPED | iOS QA requires macOS with Xcode and a built .app bundle |