'Use when QA-ing an app build through journeys — browser (web shell) or device (native shell). One engine, two workflows: workflows/browser.md (agent-browser — SPA routing, storage/session, service worker, CORS, console, hydration, responsive) and workflows/device.md (agent-device + simctl — real native taps, keyboard, safe-area, splash, plugins, system sheets, deep links, push, appearance). Depth levels, journey reuse, findings=beads, and the conductor/worker evidence protocol are shared. Triggers on "QA the app", "test web app", "browser QA", "device QA", "simulator QA", "test native app", "validate the build", "web smoke test", "native smoke test", "QA on iOS". NOT for writing unit/component/E2E tests (testing), ad-hoc UI bug repro (ui-debug), or visual polish (ui-elevate).'
Resources
2Install
npx skillscat add craigvandotcom/agent-compounds/ac-qa Install via the SkillsCat registry.
One engine, two workflows.
workflows/browser.mdproves the web shell;workflows/device.mdproves the native shell. Shared conventions — depth
levels, journey reuse, findings=beads, theQA_VALIDATIONreport, the
conductor/worker evidence protocol — live inreferences/qa-shared.md;
both workflows reference it so they stay in lockstep. Each workflow owns its
toolchain specifics only.
Generic skill — method only, zero app facts. Symlinked from agent-compounds
and shared across consuming apps. App specifics (URLs, credentials, routes,
journeys, bundle id, build command, simulator target, viewport policy) → the
consuming app's.claude/skills/CORE/SKILL.md— journeys inCORE/journeys/,
web facts inCORE/journeys/environments.md+routes.md, native facts inCORE/journeys/native.md.
QA Skill — one engine, two workflows
You are the conductor. You never drive the browser or the simulator yourself.
Journeys run in implementer subagents (the workers; the journey prompt is the
lens) — one journey per worker, each reporting a structured verdict file. You hold
the manifest, the verdicts, the gate decision, and the report; workers hold the DOM
snapshots, console noise, accessibility trees, and screenshots. The full evidence
protocol (manifest schema, verdict schema, lanes, completeness rule, session naming)
is references/qa-shared.md § Conductor / worker evidence protocol — read it now.
No Task tool, or spawns still failing after 2 retries/rung → you have NO workers:
read ac-pipeline/references/degraded-mode.md before writing the manifest.
Workflows
| Workflow | Tool | Proves | Runs on |
|---|---|---|---|
workflows/browser.md |
agent-browser | Web shell: SPA routing, storage/session persistence, service worker, CORS, console, responsive | any OS |
workflows/device.md |
agent-device + simctl | Native shell: real taps, keyboard, safe-area, splash, plugins, system sheets, deep links, push | macOS |
Decision rule: logic / layout / state / routing / console / responsive → browser.
"Does the real app work when really native-touched" → device.
Layered QA model
| Layer | Tool | Coverage | Cost |
|---|---|---|---|
| 1. Browser (DOM) | agent-browser | Exhaustive: every route, button, state, edge case | Cheap, fast |
| 2. Native shell | agent-device + simctl | Every journey happy-path with real native taps | Slower per action |
| 3. DOM-in-shell | Appium webview context | DOM truth inside the real shell (origin/cookies/storage) | Flaky; escape hatch only |
For hybrid (Capacitor) apps the webview renders the same bundle the browser
does — so exhaustive DOM-matrix coverage stays in Layer 1. Layer 2 proves what only
the native shell can: real touch pipeline, keyboard, safe-area, splash/cold-start,
plugin bridge, system sheets, deep links, lifecycle. Full list →references/native-shell-checklist.md.
Depth levels
Defined in references/qa-shared.md (smoke / full / exhaustive). Per-workflow
specifics: workflows/browser.md § Depth levels, workflows/device.md § Depth
levels. Flag-gated journeys need a flag-ON build at every level —references/qa-shared.md § Flag-gated paths need a flag-ON build; an env-gated path
that is off in every environment is unverified by construction, so sign it off only
with a flag-ON pass or an explicit UNVERIFIED record.
Conductor flow
The shared shape; each workflow file owns its toolchain-specific steps.
- Orient + serve/build (yours, once). Selection + depth arrive from
ac-pipeline/references/verification-gate.md(standalone human runs: consult it
yourself, or honor an explicit depth request). Mint RUN_ID if the orchestrator
didn't hand one down (contract:ac-pipeline/references/run-id.mdmint-if-absent
rule) and deriveARTIFACTS_DIR. Browser: serve a local production build.
Device: Platform Gate, then build + install. Serve/build failure = non-run
(ac-61zh.1): write$ARTIFACTS_DIR/unverified_tiers.txt
(references/qa-shared.md§ non-run artifact) and hand off. - Manifest. Write
$ARTIFACTS_DIR/journeys-manifest.jsonBEFORE any spawn —
includingskippedwith reasons. Validator key isdispatched[](notworkers[]); required fields per row: at leastjourney,lane(seeac-pipeline/scripts/validate-qa-run.sh+ qa-shared example). - Dispatch. One worker per journey via the workflow's prompt template
(references/journey-tester-prompt.mdfor browser,references/device-journey-prompt.mdfor device). Browser: parallel lane (cap 3)- sequential lane. Device: sequential only. Bound every wait
(ac-pipeline/references/delegation-contract.md) — a silent worker past the cap
is astall, not a pause.
- sequential lane. Device: sequential only. Bound every wait
- Collect + file beads AS EACH VERDICT LANDS — never batch filing to the end.
Stamp the id back into the verdict'sfindings[].bead. Missing output ≠
"no findings"; re-spawn each missing worker once. - Aggregate + report. Emit the
QA_VALIDATIONblock
(references/qa-shared.md). VERDICT writeback when the manifest listsproves: [<bead-id>, …]. Mechanical self-check:ac-pipeline/scripts/validate-qa-run.sh "$ARTIFACTS_DIR" --baseline-findings "$BASELINE_FINDINGS"must exit 0, AFTER the writeback. - Teardown sweep (mandatory). Close sessions, stop the server / reset the sim,
and delete rows the run created. Each workflow owns its sweep.
Findings = beads
File each finding as a bead the moment it is confirmed — conventions, types, and
labels (qa-finding / qa-blocker) are in references/qa-shared.md. Workers
report findings in their verdict files with "bead": "pending"; the conductor
files the beads (deduped), stamps the id back, and never leaves a pending entry.
Tag bead descriptions with browser QA or device QA; each filed bead carriesdiscovered-from: <bead-id|unknown>.
Verdict comment (VERDICT grammar)
When the QA_VALIDATION pass completes, the conductor records the ceremony's
outcome as a structured VERDICT comment on each bead it validated —VERDICT: passed: (journey PASS), VERDICT: failed: (a QA finding), orVERDICT: blocked: (infra-flaky / NO-STAMP) — per the grammar inbeads-standards § Verification verdicts. QA is a verifier ceremony: the
conductor writes the verdict from the verdict files (workers/implementers never do —
Goodhart guard).
Journey stamps (last_pass)
After a journey PASS, update its last_pass frontmatter block inCORE/journeys/<name>.md — build, sha, date, platform — committed with the
QA artifacts in the same run that emits QA_VALIDATION. The conductor writes stamps
from verdicts (workers never edit files). A FAIL never writes a stamp; an
infra-flaky drive is a NO-STAMP, never FAIL, never PASS. Schema + staleness rule:ac-pipeline/references/verification-gate.md §Journey registry.
Conflict rule: last_pass is last-writer-wins. On a merge conflict, keep the
NEWER stamp (compare date, then build) — never hand-merge a hybrid stamp.
Related files
references/qa-shared.md— depth levels, journey reuse, findings=beads,QA_VALIDATIONschema, conductor/worker evidence protocol (manifest/verdict schemas, lanes, session naming)ac-pipeline/references/verification-gate.md— selection + depth, journey registry schema (mutates:,last_pass)ac-pipeline/scripts/validate-qa-run.sh— mechanical pass validationreferences/journey-tester-prompt.md·references/device-journey-prompt.md— the worker prompt templatesreferences/driver-browser.md·references/driver-device.md— low-level tool mechanics (worker-side)references/native-shell-checklist.md·references/web-shell-checklist.md— what ONLY each shell surfaces_tools/crawl-and-capture/— the shared full-app crawl + screenshot primitive- Consuming app's
CORE/journeys/+environments.md+routes.md+native.md— the what