/qa-full
The per-feature QA gate. Where /daily-qa is the unattended, repo-wide,
time-windowed background sweep, /qa-full is the present-human,
branch-scoped, pass/fail gate you run the moment a feature is done — before
/finish-branch and /ship.
implement → /qa-full → /finish-branch → /ship
(this gate)
It reuses /daily-qa's trigger matrix (which checks to run based on what
changed) with three deliberate differences:
- Scope is the branch diff (
base..HEAD + working tree), not a time window.
- Output is a pass/fail verdict, not an advisory report. CRITICAL/HIGH
findings block.
- Interactive checks auto-run. Because a human is present, the checks
/daily-qa only recommends (/web-perf, browser QA) are run here when
their triggers fire.
Hard rules
- The bar is the superskills quality standard — TDD/DRY/SOLID/YAGNI plus the
hard-gate list, both spelled out in full in this skill (Step 10), so you do
not need to open any external file. The canonical written copy is
ENGINEERING_STANDARDS.md in the superskills install (a plugin install exposes
it at ${CLAUDE_PLUGIN_ROOT}/ENGINEERING_STANDARDS.md); it is not expected
to exist in the project you're reviewing, so don't flag it as missing. Step 10's
verdict is exactly "does the diff meet those standards."
- This is a gate, not a fixer. Detect and report blockers with the
smallest viable fix; do not mutate source, open PRs, or push. The user
fixes, then re-runs
/qa-full. (For an auto-fixing flow, that's a future
--fix mode — not this command.)
- Ground every finding in concrete evidence: file:line, failing test name,
log snippet, severity as the underlying tool produced it. No speculation.
- Separate blockers from warnings. Only test/build failures and
CRITICAL/HIGH findings block. Everything else is a warning that ships with a
follow-up note.
- Scope stays on the diff. Run every sub-check against the changed files,
not the whole repo — keep it fast and signal-dense.
- Never claim SHIP-READY without receipts. The verdict must cite the exact
checks that ran, what passed, and what was skipped (and why).
- No silent skips — mandatory accounting. Every Phase-4 check (security +
performance, Steps 4–8) must resolve to exactly one of: RAN (with evidence),
SKIPPED (with a stated reason — e.g. "no reachable dev server", "scanner
not authorized in this env"), or NOT-TRIGGERED (its diff trigger didn't
fire). A check whose trigger fired but that neither ran nor was explicitly
skipped-with-reason is an unaccounted check ⇒ NOT READY. "Recommend-only"
is not an allowed resting state for a triggered check — it must become RAN or
SKIPPED(reason). Projects may mark specific checks MANDATORY in
CLAUDE.md
(e.g. /pentest on a payments service), and for those, SKIPPED is itself a
blocker — only RAN with evidence passes.
Project configuration (CLAUDE.md)
This gate reads the project's root CLAUDE.md for a few optional settings. They
are plain prose (CLAUDE.md is agent instructions, not a config file) — look for a
## qa-full section and honor whatever it states. A project that wants to force
specific checks to actually run writes something like:
## qa-full
- Mandatory checks (must RUN with evidence — a skip is a blocker): `/pentest`, `/defense`
- Hard perf gate: LCP ≤ 2.5s and INP ≤ 200ms on `/` and `/checkout` (breach blocks)
- Design is a gate: run `/design-audit` on any UI change, don't just recommend it
- Dev URL: http://localhost:3000 (for `/web-perf`)
- Test/build: `pnpm test` and `pnpm build`
Recognized settings (all optional; absence = the defaults in the steps below):
- Mandatory checks — listed commands must read RAN in the ledger; SKIPPED is a
blocker (Step 4/10). Use for compliance-critical surfaces (payments, auth, PII).
- Hard perf gate — turns a
/web-perf budget breach from a warning into a
blocker (Step 6).
- Design is a gate — auto-runs
/design-audit (read-only) and blocks on its
findings instead of recommending (Step 8).
- Dev URL / Test+build commands — feed Steps 6 and 2 so they don't have to
guess.
If there is no ## qa-full section, run with the built-in defaults — nothing here
is required.
Step 1: Establish the diff scope
- Detect the base branch:
gh repo view --json defaultBranchRef -q .defaultBranchRef.name,
else git symbolic-ref refs/remotes/origin/HEAD, else fall back to main/master.
- If
$ARGUMENTS names a base branch or --scope <paths>, use it.
- Compute the changed-file set:
git diff --name-only <base>...HEAD plus
uncommitted changes (git status --porcelain). This set drives every
trigger below.
- Record at the top of the report: base branch, commit range, changed-file
count, and whether the working tree is dirty.
If there is no diff against base, stop and say so — there is nothing to gate.
Step 2: Tests & build (always — hard blocker)
- Find the project's test/build commands from
CLAUDE.md; if absent, infer
from package.json scripts, Makefile, pyproject.toml, etc. If you
cannot determine them, ask rather than guess.
- Run the test suite and the build. Capture exact failures (test name +
verbatim error in a code block).
- Any failing test or broken build is a hard blocker — the gate cannot be
SHIP-READY. Recommend
/verify to confirm a fix, or /debug /
/investigate to root-cause.
Step 3: Correctness — /code-review (always, auto-run)
Run /code-review scoped to the diff (base..HEAD). Because this is a
pre-ship gate, default to a higher local tier (high) than the daily pass.
/code-review reads the diff only — no fix mode here (gate, not fixer).
- Fold correctness findings into the report. CRITICAL/HIGH block.
- The
ultra tier (deep multi-agent cloud review, billed) is recommend-only
— surface the exact command when a finding is high-stakes; the user launches it.
Step 4: Security — /defense (always, auto-run)
Run /defense scoped to the changed files (OWASP Top 10 / secrets / auth /
crypto / data-protection). Diff-only, no external tools, no auth prompt.
- CRITICAL/HIGH block. MEDIUM/LOW are warnings.
/pentest is an external scanner (needs auth confirmation), so it is not
auto-run — but when /defense flags CRITICAL/HIGH or auth/crypto/session/
token/deserialization/file-upload paths changed in the diff, it becomes a
triggered, mandatory-accounting check: either run it (record evidence) or
record it SKIPPED with a reason (e.g. "scanner unavailable in CI"). Leaving it
as a bare "recommend" when its trigger fired ⇒ unaccounted ⇒ NOT READY. If
CLAUDE.md marks /pentest MANDATORY, SKIPPED is a blocker.
/fuzz needs a running target (like /web-perf), so it is not auto-run —
but when the diff adds or changes new endpoints, input parsing, file-upload
handling, or deserialization paths, it becomes a triggered,
mandatory-accounting check exactly like /pentest: either run it against a
reachable dev server (record evidence) or record it SKIPPED with a reason
(e.g. "no reachable dev server"). Leaving it as a bare "recommend" when its
trigger fired ⇒ unaccounted ⇒ NOT READY. CRITICAL/HIGH fuzz findings (crash,
injection, auth bypass surfaced by fuzzing) block. If CLAUDE.md marks
/fuzz MANDATORY, SKIPPED is a blocker.
- Infra/deploy config —
/iac-scan. When the diff changes infrastructure
(Dockerfile, docker-compose*, *.tf/*.tfvars, k8s/Helm manifests,
.github/workflows/**, .gitlab-ci.yml, Jenkinsfile, nginx/cloud config —
see /iac-scan's trigger section for the authoritative list), run /iac-scan
(auto-run path uses local static linters only, no network/auth — safe in a
gate) scoped to those files. CRITICAL/HIGH misconfigs (root container,
0.0.0.0/0 ingress, wildcard IAM, privileged pod, untrusted CI trigger, baked-in
secret) block. It's the infra counterpart to /defense's app-code sweep.
Step 5: Database — /db-optimize (auto-run if triggered)
Trigger when changed files match ORM models, migrations, query builders
(**/models/**, **/migrations/**, **/queries/**, **/*repository*,
**/*.sql), raw SQL in the diff, or new ORM calls (.find, .where,
.includes, .join, .preload). Run /db-optimize scoped to matched files.
- N+1s and missing indexes on hot paths are blockers; other suggestions are
warnings. If no trigger matched, record it NOT-TRIGGERED (no DB/ORM/SQL in
the diff) in the ledger rather than dropping it.
Step 6: Frontend perf — /web-perf (auto-run if triggered)
This is a key difference from /daily-qa, which only recommends /web-perf.
Here a human is present and a dev server can be started, so run it.
Trigger when the diff includes frontend code (**/*.tsx, **/*.jsx,
**/*.vue, **/*.svelte, **/components/**, **/pages/**, **/styles/**,
**/*.css, **/*.scss), new images/fonts/assets, or bundler config
(next.config.*, vite.config.*, webpack.config.*).
- Find the dev URL (
CLAUDE.md, or the dev script in package.json).
If no running app and none can be started, record the check as
SKIPPED with the reason ("no reachable dev server") in the accounting
ledger — do not block on an environment you can't reach, but do not let it
vanish silently. (A bare "recommend-only" with no reason for a triggered
frontend diff is unaccounted ⇒ NOT READY.)
- Run
/web-perf against the affected routes. Report Core Web Vitals (LCP,
INP, CLS) vs. any known budget.
- A measured regression past budget is a warning by default (perf is rarely
a hard ship-blocker) unless
CLAUDE.md defines a hard perf gate, in which
case treat a breach as a blocker.
- Recommend
/perf-profile (do not auto-run — it needs a representative
workload, not a diff) when the diff touches hot server-side paths, the change
is pre-launch, or /db-optimize//web-perf point at a bottleneck that needs
application-level execution timing to localize. This is the app-layer
counterpart to /web-perf (frontend) and /db-optimize (DB).
Step 7: Browser QA — /qa-only (auto-run if UI changed)
Use /qa-only (report-only), not /qa. A gate must not mutate source.
Trigger when the diff includes UI/frontend code or route handlers serving HTML.
Run /qa-only scoped to the affected surface; fold its health score and repro
steps into the report.
- Broken user-facing flows (CRITICAL/HIGH bugs in the QA report) are blockers.
- If the user wants the test→fix→re-verify loop instead, recommend
/qa
(interactive, mutates code) as a follow-up — outside this gate.
Step 8: Design audit — recommend (auto-run optional)
When the diff includes UI changes, recommend /design-audit for visual
consistency, hierarchy, accessibility, and AI-slop tells. /design-audit is
read-only — it audits and produces a design plan, so it's the gate-correct
visual counterpart to /qa-only (Step 7): together they cover does it work +
does it look right on a frontend change without mutating source. This is a
quality warning layer, not a blocker. Auto-run it only if the project treats
design as a gate (per CLAUDE.md); otherwise output the command.
- Do NOT auto-run
/design-review here — it fixes and commits code, which
a gate must not do. Recommend it as a follow-up to fix what /design-audit
flags, run by the user after the gate.
- Accessibility —
/a11y. When the UI change is heavy and likely to affect
assistive tech — new/changed interactive components, forms, ARIA/role/
tabindex, focus/keyboard handling, images, color/contrast, or motion/animation
(not a pure spacing/copy tweak — see /a11y's trigger section for the
authoritative list) — run /a11y's static pass (read-only, diff-scoped, safe
in a gate) and fold its CRITICAL/SERIOUS findings into the ledger. A control no
screen-reader or keyboard user can operate is a blocker. Recommend /a11y's
dynamic axe pass when a dev URL is reachable.
- Scope split with
/design-audit: /design-audit owns visual quality
(consistency, hierarchy, AI-slop); /a11y owns WCAG / assistive-tech
correctness (screen-reader, keyboard, contrast ratios). They overlap on
contrast only — treat /a11y's measured contrast finding as authoritative.
Step 9: Coverage — untested paths
For each changed file, locate its test (sibling *.test.*, parallel tests/).
Use coverage data if present (coverage/, lcov.info, .coverage); else do a
structural check for new exported functions / new branches / new error paths
without a corresponding assertion.
- New public surface with zero tests is a blocker for a feature
completion gate. Draft one focused failing-then-passing test per gap (output
as a code block — do not apply). Internal helpers without tests are warnings.
- This step is a gate check only — draft-and-report, never apply (gates
don't mutate source). To actually close the gaps found here — including
edge/corner cases and past-regression coverage beyond just "new public
surface" — recommend
/test-coverage, which writes and applies the missing
tests and enforces Google's Testing on the Toilet best practices on them.
- Recommend
/tdd when a gap is large enough to warrant test-first follow-up.
- Recommend
/playwright when the untested surface is a user-facing flow:
/tdd covers the unit gap and /qa-only observes the flow once, but neither
leaves an e2e regression test behind — /playwright does.
Step 10: Accounting ledger + ship-readiness verdict
First build the accounting ledger — a row per Phase-4/Phase-5 check, each
resolved to RAN (evidence) / SKIPPED (reason) / NOT-TRIGGERED / MANDATORY-FAIL.
The verdict cannot be SHIP-READY while any triggered check is unaccounted.
Phase-4 accounting (security + performance — what this gate enforces "was done"):
- Steps 4–8 each get a ledger row. A triggered check with no RAN evidence and no
SKIPPED reason is an unaccounted-check blocker.
/pentest, /fuzz, /perf-profile are accounted the same way once their trigger fires.
- Any check
CLAUDE.md marks MANDATORY must be RAN with evidence — SKIPPED ⇒ blocker.
Phase-5 accounting (honest scope): /qa-full is the entry to Phase 5, so it
can only enforce the pre-ship half. It cannot verify /finish-branch,
/ship, or /land-and-deploy — those run after this gate, so do not claim
they're done. What it does enforce:
- Tests + build were freshly run this invocation (Step 2) — no stale results
(the
/verify discipline). Stale/absent fresh evidence ⇒ NOT READY.
- A passing verdict is the hard precondition for ship: only on SHIP-READY do
you hand off "Proceed to
/finish-branch then /ship."
Then the verdict:
- SHIP-READY — zero blockers and every triggered check accounted for.
List warnings + follow-ups, then hand off to
/finish-branch → /ship.
- NOT READY — one or more blockers (including any unaccounted/MANDATORY-FAIL
check). List each with its file:line/test-name/missing-check evidence and the
smallest fix. Tell the user to fix and re-run
/qa-full.
Blocker set (any one ⇒ NOT READY — this is the authoritative list for the gate;
it mirrors the superskills ENGINEERING_STANDARDS.md, kept in sync by the
maintainer — you do not need to read that file to run this gate):
- failing test or broken build, or test/build not freshly run this invocation (Step 2)
/code-review CRITICAL/HIGH correctness finding (Step 3)
/defense CRITICAL/HIGH security finding (Step 4)
/fuzz CRITICAL/HIGH finding — crash, injection, or auth bypass surfaced by fuzzing (Step 4)
/pentest CRITICAL/HIGH vulnerability, when it ran (Step 4)
- N+1 / missing index on a hot path (Step 5)
- CRITICAL/HIGH browser-QA bug in a user-facing flow (Step 7)
/a11y CRITICAL finding — a control unusable by screen-reader/keyboard (Step 8)
/iac-scan CRITICAL/HIGH infra misconfig (Step 4)
- new public surface with zero tests (Step 9)
- a hard perf gate breach, only if
CLAUDE.md defines one (Step 6)
- a triggered Phase-4 check left unaccounted — neither RAN with evidence nor
SKIPPED with a stated reason (Steps 4–8)
- a
CLAUDE.md-MANDATORY check that was SKIPPED rather than run
Report format
Write to qa-full-reports/<branch>-<YYYY-MM-DD>.md (create dir; add to
.gitignore). Structure:
# QA-Full — <branch> @ <YYYY-MM-DD>
Base: <base> Range: <base>..HEAD Changed files: N Working tree: clean|dirty
## VERDICT: SHIP-READY ✅ | NOT READY ⛔
### Blockers (must fix before /finish-branch)
1. <file:line> — <evidence> — <minimal fix>
- (or) None.
### Warnings (ship with a follow-up note)
- …
## Accounting ledger (every triggered check must be RAN or SKIPPED-with-reason)
| Check | Phase | Status | Evidence / reason |
|-------|-------|--------|-------------------|
| Tests & build (Step 2) | 5-pre | RAN (fresh) / FAIL | exact command + result |
| /code-review (Step 3) | 3 | RAN | tier used, N findings |
| /defense (Step 4) | 4 | RAN | N findings |
| /iac-scan (Step 4) | 4 | RAN / NOT-TRIGGERED | infra/deploy files changed? |
| /pentest (Step 4) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | sensitive paths? |
| /fuzz (Step 4) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | new endpoints / input parsing? |
| /db-optimize (Step 5) | 4 | RAN / NOT-TRIGGERED | DB/ORM/SQL in diff? |
| /web-perf (Step 6) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | dev URL / "no server" |
| /perf-profile (Step 6) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | pre-launch / hot path? |
| /qa-only (Step 7) | 4 | RAN / NOT-TRIGGERED | health score |
| /design-audit (Step 8) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | UI changed? |
| /a11y (Step 8) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | heavy UI / a11y-affecting? |
| Coverage (Step 9) | 5-pre | RAN | N gaps, drafted tests |
> No row may be blank or "recommend" for a check whose trigger fired — that is an
> unaccounted-check blocker. `CLAUDE.md`-MANDATORY checks must read RAN.
## Recommended follow-up commands
- `/code-review ultra` — (only if a high-stakes correctness concern)
- `/review` — (heavier staff-level production-readiness pass; distinct from the
diff-bug focus of `/code-review` — recommend when the change is architecturally
significant or touches a critical path)
- `/cso` — (**backstop**: only if the diff crosses a new trust boundary — new
auth/endpoint/external-input/deserialization — and there's no evidence threat
modeling happened at plan time; threat modeling belongs in `/write-plan`, this
is the late catch)
- `/pentest` — (only if /defense found CRITICAL/HIGH or sensitive paths changed)
- `/fuzz` — (only if the diff added endpoints / input parsing / uploads /
deserialization and it was SKIPPED in the ledger — needs a running target)
- `/perf-profile` — (app-level execution profiling; pre-launch or when a
hot path / measured bottleneck needs localizing)
- `/qa` — (interactive test→fix loop, if Step 7 found user-facing bugs)
- `/design-audit` — (if UI changed; read-only visual/a11y audit, alongside `/qa`)
- `/a11y` — (if heavy UI likely to affect screen-reader/keyboard/contrast; dynamic axe pass needs a dev URL)
- `/iac-scan` — (if infra/deploy config changed; static, plus `/pentest` if HIGH/CRITICAL)
- `/playwright` — (if Step 9 found untested user-facing flows; leaves e2e
regression tests behind)
- `/simplify` — (reuse/simplification/efficiency cleanups; mutates code, so it
runs after the gate, not during it)
- `/design-review` — (to *fix* what `/design-audit` flags; mutates + commits, so
it runs after the gate, not during it)
- `/finish-branch` → `/ship` — (only if VERDICT is SHIP-READY)
Print the verdict + a 5-line summary to the chat.
Anti-patterns (do not do)
- Mutating source, opening PRs, or pushing — this is a gate, not a fixer.
- Declaring SHIP-READY while a check was skipped without saying which and why.
- Running any sub-check against the whole repo instead of the diff.
- Auto-running
/qa (mutates) instead of /qa-only (reports).
- Blocking on
/web-perf when no dev server is reachable — downgrade to
recommend and note it.
- Treating MEDIUM/LOW findings as blockers (noise) or hiding CRITICAL/HIGH in
the warnings list.
Related commands
Reuses the trigger matrix from /daily-qa (see skills/daily-qa/SKILL.md
Step 7 for the canonical globs). Differences: branch-scoped, gate semantics,
interactive checks auto-run.
Auto-run (diff-scoped, non-mutating):
/code-review — correctness (Step 3); local tiers only.
/defense — OWASP/secrets/auth/crypto (Step 4).
/iac-scan — when infra/deploy config changed; static infra misconfig scan (Step 4).
/db-optimize — when DB/ORM/SQL changed (Step 5).
/web-perf — when frontend changed and a dev URL is reachable (Step 6).
/qa-only — when UI changed; report-only (Step 7).
/a11y — static pass when a heavy/a11y-affecting UI change landed (Step 8).
/design-audit — read-only visual/a11y audit when UI changed (Step 8).
Recommend-only:
/code-review ultra — deep multi-agent cloud review; billed + user-triggered.
/review — staff-level production-readiness review; heavier, architectural —
recommend for significant or critical-path changes (not a substitute for the
Step 3 /code-review pass).
/cso — OWASP+STRIDE threat modeling. Design-time by nature, so its real
home is /write-plan; here it's only a backstop when a trust-boundary
change reaches the gate without a threat model.
/pentest — external scanner needing auth confirmation.
/fuzz — web fuzzing against a running target; triggered-accounting like
/pentest when the diff adds endpoints/input parsing (Step 4).
/perf-profile — app-level execution profiling; needs a representative
workload, so it's a pre-launch / bottleneck-localizing follow-up, not a gate.
/qa — interactive test→fix→re-verify loop (mutates code).
/design-audit — read-only visual/a11y audit → design plan; the gate-correct
design check, paired with /qa-only on any UI change.
/design-review — fixes and commits visual issues (mutates); a post-gate
follow-up to apply what /design-audit found, never run inside the gate.
/playwright — e2e regression tests for untested user-facing flows (Step 9).
/test-coverage — writes and applies the missing unit/integration/e2e
tests that Step 9 only drafts as a gate check; the fixer counterpart.
/simplify — post-gate quality cleanups on the diff (mutates code); the
read-only equivalent already runs inside Step 3's /code-review.
/verify, /debug, /investigate, /tdd — per-issue follow-ups.
Hand-off (only when SHIP-READY):
/finish-branch — choose how to integrate the work.
/ship — sync, bump VERSION, changelog, PR.
1---2name: qa-full3description: Comprehensive per-feature QA gate. Runs the full multi-dimensional quality fan-out (tests, correctness, security, DB, frontend perf, browser QA, coverage) scoped to the current branch's diff, then emits a pass/fail ship-readiness verdict. Run it when a feature is finished, before /finish-branch and /ship. Use when asked to "run full QA", "qa-full", "feature done — check it", "is this ready to ship", "pre-ship check", or "full quality gate".4---56# /qa-full78The per-feature QA gate. Where `/daily-qa` is the unattended, repo-wide,9time-windowed **background** sweep, `/qa-full` is the **present-human,10branch-scoped, pass/fail** gate you run the moment a feature is done — before11`/finish-branch` and `/ship`.1213```14implement → /qa-full → /finish-branch → /ship15 (this gate)16```1718It reuses `/daily-qa`'s trigger matrix (which checks to run based on what19changed) with three deliberate differences:2021- **Scope is the branch diff** (`base..HEAD` + working tree), not a time window.22- **Output is a pass/fail verdict**, not an advisory report. CRITICAL/HIGH23 findings **block**.24- **Interactive checks auto-run.** Because a human is present, the checks25 `/daily-qa` only *recommends* (`/web-perf`, browser QA) are run here when26 their triggers fire.2728## Hard rules2930- **The bar is the superskills quality standard** — TDD/DRY/SOLID/YAGNI plus the31 hard-gate list, both spelled out in full in this skill (Step 10), so you do32 **not** need to open any external file. The canonical written copy is33 `ENGINEERING_STANDARDS.md` in the superskills install (a plugin install exposes34 it at `${CLAUDE_PLUGIN_ROOT}/ENGINEERING_STANDARDS.md`); it is **not** expected35 to exist in the project you're reviewing, so don't flag it as missing. Step 10's36 verdict is exactly "does the diff meet those standards."37- **This is a gate, not a fixer.** Detect and report blockers with the38 smallest viable fix; do **not** mutate source, open PRs, or push. The user39 fixes, then re-runs `/qa-full`. (For an auto-fixing flow, that's a future40 `--fix` mode — not this command.)41- **Ground every finding in concrete evidence**: file:line, failing test name,42 log snippet, severity as the underlying tool produced it. No speculation.43- **Separate blockers from warnings.** Only test/build failures and44 CRITICAL/HIGH findings block. Everything else is a warning that ships with a45 follow-up note.46- **Scope stays on the diff.** Run every sub-check against the changed files,47 not the whole repo — keep it fast and signal-dense.48- **Never claim SHIP-READY without receipts.** The verdict must cite the exact49 checks that ran, what passed, and what was skipped (and why).50- **No silent skips — mandatory accounting.** Every Phase-4 check (security +51 performance, Steps 4–8) must resolve to exactly one of: **RAN** (with evidence),52 **SKIPPED** (with a stated reason — e.g. "no reachable dev server", "scanner53 not authorized in this env"), or **NOT-TRIGGERED** (its diff trigger didn't54 fire). A check whose trigger fired but that neither ran nor was explicitly55 skipped-with-reason is an **unaccounted check ⇒ NOT READY**. "Recommend-only"56 is not an allowed resting state for a *triggered* check — it must become RAN or57 SKIPPED(reason). Projects may mark specific checks **MANDATORY** in `CLAUDE.md`58 (e.g. `/pentest` on a payments service), and for those, SKIPPED is itself a59 blocker — only RAN with evidence passes.6061## Project configuration (`CLAUDE.md`)6263This gate reads the project's root `CLAUDE.md` for a few optional settings. They64are plain prose (CLAUDE.md is agent instructions, not a config file) — look for a65`## qa-full` section and honor whatever it states. A project that wants to *force*66specific checks to actually run writes something like:6768```markdown69## qa-full7071- Mandatory checks (must RUN with evidence — a skip is a blocker): `/pentest`, `/defense`72- Hard perf gate: LCP ≤ 2.5s and INP ≤ 200ms on `/` and `/checkout` (breach blocks)73- Design is a gate: run `/design-audit` on any UI change, don't just recommend it74- Dev URL: http://localhost:3000 (for `/web-perf`)75- Test/build: `pnpm test` and `pnpm build`76```7778Recognized settings (all optional; absence = the defaults in the steps below):79- **Mandatory checks** — listed commands must read RAN in the ledger; SKIPPED is a80 blocker (Step 4/10). Use for compliance-critical surfaces (payments, auth, PII).81- **Hard perf gate** — turns a `/web-perf` budget breach from a warning into a82 blocker (Step 6).83- **Design is a gate** — auto-runs `/design-audit` (read-only) and blocks on its84 findings instead of recommending (Step 8).85- **Dev URL / Test+build commands** — feed Steps 6 and 2 so they don't have to86 guess.8788If there is no `## qa-full` section, run with the built-in defaults — nothing here89is required.9091## Step 1: Establish the diff scope92931. Detect the base branch: `gh repo view --json defaultBranchRef -q .defaultBranchRef.name`,94 else `git symbolic-ref refs/remotes/origin/HEAD`, else fall back to `main`/`master`.952. If `$ARGUMENTS` names a base branch or `--scope <paths>`, use it.963. Compute the changed-file set: `git diff --name-only <base>...HEAD` plus97 uncommitted changes (`git status --porcelain`). This set drives every98 trigger below.994. Record at the top of the report: base branch, commit range, changed-file100 count, and whether the working tree is dirty.101102If there is no diff against base, stop and say so — there is nothing to gate.103104## Step 2: Tests & build (always — hard blocker)1051061. Find the project's test/build commands from `CLAUDE.md`; if absent, infer107 from `package.json` scripts, `Makefile`, `pyproject.toml`, etc. If you108 cannot determine them, **ask** rather than guess.1092. Run the test suite and the build. Capture exact failures (test name +110 verbatim error in a code block).1113. **Any failing test or broken build is a hard blocker** — the gate cannot be112 SHIP-READY. Recommend `/verify` to confirm a fix, or `/debug` /113 `/investigate` to root-cause.114115## Step 3: Correctness — `/code-review` (always, auto-run)116117Run `/code-review` scoped to the diff (`base..HEAD`). Because this is a118pre-ship gate, default to a **higher local tier** (`high`) than the daily pass.119`/code-review` reads the diff only — no fix mode here (gate, not fixer).120121- Fold correctness findings into the report. **CRITICAL/HIGH block.**122- The `ultra` tier (deep multi-agent cloud review, billed) is **recommend-only**123 — surface the exact command when a finding is high-stakes; the user launches it.124125## Step 4: Security — `/defense` (always, auto-run)126127Run `/defense` scoped to the changed files (OWASP Top 10 / secrets / auth /128crypto / data-protection). Diff-only, no external tools, no auth prompt.129130- **CRITICAL/HIGH block.** MEDIUM/LOW are warnings.131- `/pentest` is an external scanner (needs auth confirmation), so it is **not**132 auto-run — but when `/defense` flags CRITICAL/HIGH or auth/crypto/session/133 token/deserialization/file-upload paths changed in the diff, it becomes a134 **triggered, mandatory-accounting check**: either run it (record evidence) or135 record it SKIPPED with a reason (e.g. "scanner unavailable in CI"). Leaving it136 as a bare "recommend" when its trigger fired ⇒ unaccounted ⇒ NOT READY. If137 `CLAUDE.md` marks `/pentest` MANDATORY, SKIPPED is a blocker.138- `/fuzz` needs a running target (like `/web-perf`), so it is **not** auto-run —139 but when the diff adds or changes **new endpoints, input parsing, file-upload140 handling, or deserialization paths**, it becomes a **triggered,141 mandatory-accounting check** exactly like `/pentest`: either run it against a142 reachable dev server (record evidence) or record it SKIPPED with a reason143 (e.g. "no reachable dev server"). Leaving it as a bare "recommend" when its144 trigger fired ⇒ unaccounted ⇒ NOT READY. CRITICAL/HIGH fuzz findings (crash,145 injection, auth bypass surfaced by fuzzing) **block**. If `CLAUDE.md` marks146 `/fuzz` MANDATORY, SKIPPED is a blocker.147- **Infra/deploy config — `/iac-scan`.** When the diff changes infrastructure148 (`Dockerfile`, `docker-compose*`, `*.tf`/`*.tfvars`, k8s/Helm manifests,149 `.github/workflows/**`, `.gitlab-ci.yml`, `Jenkinsfile`, nginx/cloud config —150 see `/iac-scan`'s trigger section for the authoritative list), run `/iac-scan`151 (auto-run path uses **local static linters only**, no network/auth — safe in a152 gate) scoped to those files. CRITICAL/HIGH misconfigs (root container,153 `0.0.0.0/0` ingress, wildcard IAM, privileged pod, untrusted CI trigger, baked-in154 secret) **block**. It's the infra counterpart to `/defense`'s app-code sweep.155156## Step 5: Database — `/db-optimize` (auto-run if triggered)157158Trigger when changed files match ORM models, migrations, query builders159(`**/models/**`, `**/migrations/**`, `**/queries/**`, `**/*repository*`,160`**/*.sql`), raw SQL in the diff, or new ORM calls (`.find`, `.where`,161`.includes`, `.join`, `.preload`). Run `/db-optimize` scoped to matched files.162163- N+1s and missing indexes on hot paths are **blockers**; other suggestions are164 warnings. If no trigger matched, record it **NOT-TRIGGERED** (no DB/ORM/SQL in165 the diff) in the ledger rather than dropping it.166167## Step 6: Frontend perf — `/web-perf` (auto-run if triggered)168169> This is a key difference from `/daily-qa`, which only *recommends* `/web-perf`.170> Here a human is present and a dev server can be started, so **run it**.171172Trigger when the diff includes frontend code (`**/*.tsx`, `**/*.jsx`,173`**/*.vue`, `**/*.svelte`, `**/components/**`, `**/pages/**`, `**/styles/**`,174`**/*.css`, `**/*.scss`), new images/fonts/assets, or bundler config175(`next.config.*`, `vite.config.*`, `webpack.config.*`).1761771. Find the dev URL (`CLAUDE.md`, or the `dev` script in `package.json`).178 If no running app and none can be started, record the check as179 **SKIPPED with the reason** ("no reachable dev server") in the accounting180 ledger — do not block on an environment you can't reach, but do **not** let it181 vanish silently. (A bare "recommend-only" with no reason for a *triggered*182 frontend diff is unaccounted ⇒ NOT READY.)1832. Run `/web-perf` against the affected routes. Report Core Web Vitals (LCP,184 INP, CLS) vs. any known budget.185- A measured regression past budget is a **warning** by default (perf is rarely186 a hard ship-blocker) unless `CLAUDE.md` defines a hard perf gate, in which187 case treat a breach as a blocker.188- **Recommend `/perf-profile`** (do not auto-run — it needs a representative189 workload, not a diff) when the diff touches hot server-side paths, the change190 is pre-launch, or `/db-optimize`/`/web-perf` point at a bottleneck that needs191 application-level execution timing to localize. This is the app-layer192 counterpart to `/web-perf` (frontend) and `/db-optimize` (DB).193194## Step 7: Browser QA — `/qa-only` (auto-run if UI changed)195196> Use `/qa-only` (report-only), **not** `/qa`. A gate must not mutate source.197198Trigger when the diff includes UI/frontend code or route handlers serving HTML.199Run `/qa-only` scoped to the affected surface; fold its health score and repro200steps into the report.201202- Broken user-facing flows (CRITICAL/HIGH bugs in the QA report) are **blockers**.203- If the user wants the test→fix→re-verify loop instead, recommend `/qa`204 (interactive, mutates code) as a follow-up — outside this gate.205206## Step 8: Design audit — recommend (auto-run optional)207208When the diff includes UI changes, **recommend `/design-audit`** for visual209consistency, hierarchy, accessibility, and AI-slop tells. `/design-audit` is210**read-only** — it audits and produces a design plan, so it's the gate-correct211visual counterpart to `/qa-only` (Step 7): together they cover *does it work* +212*does it look right* on a frontend change without mutating source. This is a213quality warning layer, not a blocker. Auto-run it only if the project treats214design as a gate (per `CLAUDE.md`); otherwise output the command.215216- **Do NOT auto-run `/design-review`** here — it *fixes and commits* code, which217 a gate must not do. Recommend it as a **follow-up** to fix what `/design-audit`218 flags, run by the user after the gate.219- **Accessibility — `/a11y`.** When the UI change is *heavy and likely to affect220 assistive tech* — new/changed interactive components, forms, ARIA/`role`/221 `tabindex`, focus/keyboard handling, images, color/contrast, or motion/animation222 (not a pure spacing/copy tweak — see `/a11y`'s trigger section for the223 authoritative list) — run `/a11y`'s **static** pass (read-only, diff-scoped, safe224 in a gate) and fold its CRITICAL/SERIOUS findings into the ledger. A control no225 screen-reader or keyboard user can operate is a **blocker**. Recommend `/a11y`'s226 dynamic axe pass when a dev URL is reachable.227 - **Scope split with `/design-audit`:** `/design-audit` owns *visual* quality228 (consistency, hierarchy, AI-slop); `/a11y` owns *WCAG / assistive-tech229 correctness* (screen-reader, keyboard, contrast ratios). They overlap on230 contrast only — treat `/a11y`'s measured contrast finding as authoritative.231232## Step 9: Coverage — untested paths233234For each changed file, locate its test (sibling `*.test.*`, parallel `tests/`).235Use coverage data if present (`coverage/`, `lcov.info`, `.coverage`); else do a236structural check for new exported functions / new branches / new error paths237without a corresponding assertion.238239- New **public** surface with zero tests is a **blocker** for a feature240 completion gate. Draft one focused failing-then-passing test per gap (output241 as a code block — do not apply). Internal helpers without tests are warnings.242- This step is a **gate check only** — draft-and-report, never apply (gates243 don't mutate source). To actually **close** the gaps found here — including244 edge/corner cases and past-regression coverage beyond just "new public245 surface" — recommend `/test-coverage`, which writes and applies the missing246 tests and enforces Google's Testing on the Toilet best practices on them.247- Recommend `/tdd` when a gap is large enough to warrant test-first follow-up.248- Recommend `/playwright` when the untested surface is a **user-facing flow**:249 `/tdd` covers the unit gap and `/qa-only` observes the flow once, but neither250 leaves an e2e regression test behind — `/playwright` does.251252## Step 10: Accounting ledger + ship-readiness verdict253254First build the **accounting ledger** — a row per Phase-4/Phase-5 check, each255resolved to RAN (evidence) / SKIPPED (reason) / NOT-TRIGGERED / MANDATORY-FAIL.256**The verdict cannot be SHIP-READY while any triggered check is unaccounted.**257258**Phase-4 accounting (security + performance — what this gate enforces "was done"):**259- Steps 4–8 each get a ledger row. A triggered check with no RAN evidence and no260 SKIPPED reason is an **unaccounted-check blocker**.261- `/pentest`, `/fuzz`, `/perf-profile` are accounted the same way once their trigger fires.262- Any check `CLAUDE.md` marks MANDATORY must be RAN with evidence — SKIPPED ⇒ blocker.263264**Phase-5 accounting (honest scope):** `/qa-full` *is* the entry to Phase 5, so it265can only enforce the **pre-ship** half. It **cannot** verify `/finish-branch`,266`/ship`, or `/land-and-deploy` — those run *after* this gate, so do not claim267they're done. What it does enforce:268- Tests + build were **freshly run this invocation** (Step 2) — no stale results269 (the `/verify` discipline). Stale/absent fresh evidence ⇒ NOT READY.270- A passing verdict is the **hard precondition** for ship: only on SHIP-READY do271 you hand off *"Proceed to `/finish-branch` then `/ship`."*272273Then the verdict:274275- **SHIP-READY** — zero blockers **and** every triggered check accounted for.276 List warnings + follow-ups, then hand off to `/finish-branch` → `/ship`.277- **NOT READY** — one or more blockers (including any unaccounted/MANDATORY-FAIL278 check). List each with its file:line/test-name/missing-check evidence and the279 smallest fix. Tell the user to fix and re-run `/qa-full`.280281Blocker set (any one ⇒ NOT READY — this is the authoritative list for the gate;282it mirrors the superskills `ENGINEERING_STANDARDS.md`, kept in sync by the283maintainer — you do not need to read that file to run this gate):284- failing test or broken build, or test/build not freshly run this invocation (Step 2)285- `/code-review` CRITICAL/HIGH correctness finding (Step 3)286- `/defense` CRITICAL/HIGH security finding (Step 4)287- `/fuzz` CRITICAL/HIGH finding — crash, injection, or auth bypass surfaced by fuzzing (Step 4)288- `/pentest` CRITICAL/HIGH vulnerability, when it ran (Step 4)289- N+1 / missing index on a hot path (Step 5)290- CRITICAL/HIGH browser-QA bug in a user-facing flow (Step 7)291- `/a11y` CRITICAL finding — a control unusable by screen-reader/keyboard (Step 8)292- `/iac-scan` CRITICAL/HIGH infra misconfig (Step 4)293- new public surface with zero tests (Step 9)294- a hard perf gate breach, only if `CLAUDE.md` defines one (Step 6)295- **a triggered Phase-4 check left unaccounted** — neither RAN with evidence nor296 SKIPPED with a stated reason (Steps 4–8)297- **a `CLAUDE.md`-MANDATORY check that was SKIPPED** rather than run298299## Report format300301Write to `qa-full-reports/<branch>-<YYYY-MM-DD>.md` (create dir; add to302`.gitignore`). Structure:303304```markdown305# QA-Full — <branch> @ <YYYY-MM-DD>306307Base: <base> Range: <base>..HEAD Changed files: N Working tree: clean|dirty308309## VERDICT: SHIP-READY ✅ | NOT READY ⛔310311### Blockers (must fix before /finish-branch)3121. <file:line> — <evidence> — <minimal fix>313- (or) None.314315### Warnings (ship with a follow-up note)316- …317318## Accounting ledger (every triggered check must be RAN or SKIPPED-with-reason)319| Check | Phase | Status | Evidence / reason |320|-------|-------|--------|-------------------|321| Tests & build (Step 2) | 5-pre | RAN (fresh) / FAIL | exact command + result |322| /code-review (Step 3) | 3 | RAN | tier used, N findings |323| /defense (Step 4) | 4 | RAN | N findings |324| /iac-scan (Step 4) | 4 | RAN / NOT-TRIGGERED | infra/deploy files changed? |325| /pentest (Step 4) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | sensitive paths? |326| /fuzz (Step 4) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | new endpoints / input parsing? |327| /db-optimize (Step 5) | 4 | RAN / NOT-TRIGGERED | DB/ORM/SQL in diff? |328| /web-perf (Step 6) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | dev URL / "no server" |329| /perf-profile (Step 6) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | pre-launch / hot path? |330| /qa-only (Step 7) | 4 | RAN / NOT-TRIGGERED | health score |331| /design-audit (Step 8) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | UI changed? |332| /a11y (Step 8) | 4 | RAN / SKIPPED(reason) / NOT-TRIGGERED | heavy UI / a11y-affecting? |333| Coverage (Step 9) | 5-pre | RAN | N gaps, drafted tests |334335> No row may be blank or "recommend" for a check whose trigger fired — that is an336> unaccounted-check blocker. `CLAUDE.md`-MANDATORY checks must read RAN.337338## Recommended follow-up commands339- `/code-review ultra` — (only if a high-stakes correctness concern)340- `/review` — (heavier staff-level production-readiness pass; distinct from the341 diff-bug focus of `/code-review` — recommend when the change is architecturally342 significant or touches a critical path)343- `/cso` — (**backstop**: only if the diff crosses a new trust boundary — new344 auth/endpoint/external-input/deserialization — and there's no evidence threat345 modeling happened at plan time; threat modeling belongs in `/write-plan`, this346 is the late catch)347- `/pentest` — (only if /defense found CRITICAL/HIGH or sensitive paths changed)348- `/fuzz` — (only if the diff added endpoints / input parsing / uploads /349 deserialization and it was SKIPPED in the ledger — needs a running target)350- `/perf-profile` — (app-level execution profiling; pre-launch or when a351 hot path / measured bottleneck needs localizing)352- `/qa` — (interactive test→fix loop, if Step 7 found user-facing bugs)353- `/design-audit` — (if UI changed; read-only visual/a11y audit, alongside `/qa`)354- `/a11y` — (if heavy UI likely to affect screen-reader/keyboard/contrast; dynamic axe pass needs a dev URL)355- `/iac-scan` — (if infra/deploy config changed; static, plus `/pentest` if HIGH/CRITICAL)356- `/playwright` — (if Step 9 found untested user-facing flows; leaves e2e357 regression tests behind)358- `/simplify` — (reuse/simplification/efficiency cleanups; mutates code, so it359 runs after the gate, not during it)360- `/design-review` — (to *fix* what `/design-audit` flags; mutates + commits, so361 it runs after the gate, not during it)362- `/finish-branch` → `/ship` — (only if VERDICT is SHIP-READY)363```364365Print the verdict + a 5-line summary to the chat.366367## Anti-patterns (do not do)368369- Mutating source, opening PRs, or pushing — this is a gate, not a fixer.370- Declaring SHIP-READY while a check was skipped without saying which and why.371- Running any sub-check against the whole repo instead of the diff.372- Auto-running `/qa` (mutates) instead of `/qa-only` (reports).373- Blocking on `/web-perf` when no dev server is reachable — downgrade to374 recommend and note it.375- Treating MEDIUM/LOW findings as blockers (noise) or hiding CRITICAL/HIGH in376 the warnings list.377378## Related commands379380Reuses the trigger matrix from `/daily-qa` (see `skills/daily-qa/SKILL.md`381Step 7 for the canonical globs). Differences: branch-scoped, gate semantics,382interactive checks auto-run.383384Auto-run (diff-scoped, non-mutating):385- `/code-review` — correctness (Step 3); local tiers only.386- `/defense` — OWASP/secrets/auth/crypto (Step 4).387- `/iac-scan` — when infra/deploy config changed; static infra misconfig scan (Step 4).388- `/db-optimize` — when DB/ORM/SQL changed (Step 5).389- `/web-perf` — when frontend changed and a dev URL is reachable (Step 6).390- `/qa-only` — when UI changed; report-only (Step 7).391- `/a11y` — static pass when a heavy/a11y-affecting UI change landed (Step 8).392- `/design-audit` — read-only visual/a11y audit when UI changed (Step 8).393394Recommend-only:395- `/code-review ultra` — deep multi-agent cloud review; billed + user-triggered.396- `/review` — staff-level production-readiness review; heavier, architectural —397 recommend for significant or critical-path changes (not a substitute for the398 Step 3 `/code-review` pass).399- `/cso` — OWASP+STRIDE **threat modeling**. Design-time by nature, so its real400 home is `/write-plan`; here it's only a **backstop** when a trust-boundary401 change reaches the gate without a threat model.402- `/pentest` — external scanner needing auth confirmation.403- `/fuzz` — web fuzzing against a running target; triggered-accounting like404 `/pentest` when the diff adds endpoints/input parsing (Step 4).405- `/perf-profile` — app-level execution profiling; needs a representative406 workload, so it's a pre-launch / bottleneck-localizing follow-up, not a gate.407- `/qa` — interactive test→fix→re-verify loop (mutates code).408- `/design-audit` — read-only visual/a11y audit → design plan; the gate-correct409 design check, paired with `/qa-only` on any UI change.410- `/design-review` — *fixes and commits* visual issues (mutates); a post-gate411 follow-up to apply what `/design-audit` found, never run inside the gate.412- `/playwright` — e2e regression tests for untested user-facing flows (Step 9).413- `/test-coverage` — *writes and applies* the missing unit/integration/e2e414 tests that Step 9 only drafts as a gate check; the fixer counterpart.415- `/simplify` — post-gate quality cleanups on the diff (mutates code); the416 read-only equivalent already runs inside Step 3's `/code-review`.417- `/verify`, `/debug`, `/investigate`, `/tdd` — per-issue follow-ups.418419Hand-off (only when SHIP-READY):420- `/finish-branch` — choose how to integrate the work.421- `/ship` — sync, bump VERSION, changelog, PR.