reviewing-test-plan — SKILL.md
Variant: standard · When to use: judging a finished (or amended) QA/verification test plan as an acceptance gate — checking a tester can execute it, every upstream behavior has a traceable case, the catalog is risk-weighted not combinatorial, and the warranted non-functional testing carries numeric targets, then emitting VERDICT: approve|revise with actionable findings.
Overview
This skill is the review half of an authoring/judging test-plan pair. Loaded by a reviewer who holds a finished QA/verification test plan — the document stating what to test, at what level, in what environment, with what data, to what done-criteria, plus the case catalog to run — it judges that document against one question: can a tester execute this plan with no questions, does every behavior in the handed-in upstreams have at least one traceable test case, and is the catalog sized by risk (not the full input-permutation cross-product, not skeletal)? It applies a fixed 10-condition coverage + testability checklist — the same bar a test-plan author produces to (authoring-test-plan Step-7), so the produce-bar and the review-bar do not drift — then emits a single machine-parseable verdict plus findings the author can act on in one revision pass. It is an acceptance gate: it does not author, fix, or rewrite the plan; it judges and returns findings, and the producer revises.
The single most load-bearing checks are coverage completeness (enumerate every upstream behavior/operation/error and confirm each has >=1 traceable case — a behavior with no case is the highest-impact defect) and catalog sizing (risk-weighted, not a combinatorial blow-up and not thin/padded). Both are easy to miss when the plan looks thorough.
When to activate
- A finished QA/verification test plan needs an accept/revise decision before testing begins or before it feeds a release runbook's exit criteria.
- You are the independent reviewer / gate for a test plan a producer just authored, and you have the upstreams (feature-spec / api-spec / PRD) to check coverage against.
- Re-judging a revised test plan after a prior
revise verdict, or reviewing an amend (a change request handed in against an approved plan — judge it delta-scoped, cond. 10).
Do NOT activate when:
- Authoring or repairing a test plan -> use
authoring-test-plan (it produces to the same bar this skill asserts). This skill never writes the document.
- Reviewing the release/deployment runbook — the go-to-production procedure (deploy steps, verification, rollback) -> use a release-runbook-review skill. The runbook reuses this plan's exit criteria; the bars differ (executability/rollback vs coverage/testability).
- Reviewing engineering design documents — a spec, plan, design doc, RFC, or ADR -> use a design-review skill that verifies design claims against the codebase. That gates the design; this gates the verification plan derived downstream of it.
- Judging or running the executable test scripts (pytest / Playwright / etc.) — those are implementation, downstream of this plan. This gate judges the plan document, not the automation code or a test run's results.
- Checking template/section conformance -> that is a template concern. This skill judges quality against the bar, not whether every heading is present.
Workflow
Step 1: Read the whole plan with fresh eyes — and pull up the upstreams
Read the test plan end to end as if you were the tester who must execute it tomorrow, without the author's framing. Your stance is a gatekeeper for that tester: a finding carries weight only when it shows the tester cannot execute a case, cannot decide whether done-criteria are met, or finds a behavior with no case. Identify the project archetype the plan is sized to (a thin CLI vs a broad UI product) — Step 2's proportionality calibration depends on it. Critically, load the handed-in upstreams (feature-spec / api-spec / PRD / NFRs — whatever the project actually produced): they are your coverage checklist. Enumerate every behavior / acceptance criterion (feature-spec), every operation + error case (api-spec), or — if those weren't produced — every requirement (PRD); note the NFRs that warrant non-functional testing. Never assume a fixed input; enumerate from whatever upstream was handed in. If an upstream was not handed in, record that now — flag it as an assumption in Step 4 and judge coverage on what you have; never invent an expectation of a document the project didn't produce, and never default to approve because the checklist couldn't be fully run. If a change request was handed in against an existing plan, this is an amend — run cond. 10 delta-scoped (Step 2).
Step 2: Run the coverage + testability checklist — judge each condition
For each condition below, decide pass or gap. A condition fails only on a real, named deficiency — "I'd have ordered the cases differently" is not a gap. For each gap, capture the exact location and what is missing (Step 4 turns it into an actionable finding). These ten conditions are the single-sourced bar (the same conditions authoring-test-plan Step-7 produces to); do not add private ones. Depth + worked pass/gap signals: references/coverage-testability-bar.md.
- Complete coverage. Every behavior / acceptance criterion in the handed-in feature-spec, and every operation + error case in the handed-in api-spec (else every requirement in the PRD), has >=1 traceable test case. Gap when an enumerated upstream behavior/operation/error has no case pointing back to it — the highest-impact defect class. (Binds at any size.)
- Appropriate functional levels. The functional levels & types chosen fit the project — unit/integration/e2e/acceptance present as the system warrants; regression/smoke as warranted; any omission justified, not silent. Gap when a level the system clearly warrants is absent with no rationale (e.g. no integration cases for a multi-service system). (Non-functional testing is cond. 9, not here.) Proportionality: a thin project collapses the levels it doesn't need.
- Testable entry/exit criteria. Entry and exit ("done") criteria are observable/measurable — a reader can mechanically decide each (e.g. "all High-priority cases pass; every behavior has a passing traceable case; no open Critical/High defect"). The exit ties to a coverage floor + an open-defect threshold; coverage phrased against requirements/risk, not a bare code-coverage %. Gap when a criterion is vague ("testing looks good") so two readers could disagree. Proportionality: a thin plan has a short criteria list, still decidable.
- Environments + test data specified. Each level states where it runs and the data/fixtures it needs + how they're provisioned/reset + how sensitive data (PII/PHI) is handled. Gap when a level names no environment, or cases assume fixtures the plan never specifies. Proportionality: a thin plan = one env, simple fixtures.
- Each catalog case is executable + traceable. Every case has preconditions, single-action steps, an observable expected result (the exact message/error for negatives; for an ML/probabilistic case a metric-threshold on a named dataset or a metamorphic relation — "the model is accurate"/"results are relevant" is the un-runnable result this rejects), and a traces-to. Gap when a case lacks preconditions, has vague/multi-action steps, has a non-observable expected result, or has no traces-to. (Binds at any size — the executability floor.)
- Risk-prioritized + risk-weighted. The plan prioritizes by Likelihood x Impact, and catalog depth follows risk — more cases (boundaries, equivalence partitions, decision-table/state-transition/pairwise selections, negative paths) on high-risk areas, fewer on trivial ones — NOT the full input-permutation cross-product. Gap in three directions: a coverage gap (too few cases for the risk), a combinatorial blow-up (every permutation — e.g. all 1,024 combinations of a 10-switch module instead of risk + pairwise), or a padded/thin catalog (cases that don't add coverage, or a high-risk area with only a happy-path case). The case-design techniques are author aids — judge the outcome, never "draw a decision table".
- No fabrication. Every case traces to a real upstream; any coverage gap (an untestable requirement, a missing NFR) is surfaced as an explicit assumption, never filled with an invented behavior. Gap when a case tests a behavior no upstream declares. Spot-check a sample of cases' traces-to against the actual upstreams. (Binds at any size.)
- Proportional to the archetype. The catalog and the level set are sized to the project — a thin CLI gets a handful of cases and may collapse non-functional testing; a large UI product gets many. Gap only when the plan is skeletal for its archetype or combinatorial (cond. 6). Right-sizing is not a gap.
- Non-functional testing (warranted types carry numeric targets). Each non-functional type the NFRs / archetype warrant is present with a checkable approach + a numeric/standard target: performance (load profile + p95/throughput), security (a threat-derived set), accessibility (WCAG 2.2 AA), usability, compatibility (a matrix), i18n/l10n. Gap when a warranted type is present with no approach/target ("we'll test performance" with no profile/target), or an NFR exists with no non-functional testing covering it. Proportionality (load-bearing): a thin project with no NFR warrants none — its absence is NOT a gap; never demand a non-functional type the archetype doesn't warrant, and never fabricate a target. (This condition owns the non-functional axis; cond. 2 is functional-only — a missing warranted perf level is ONE finding here, not two.)
- Delta-scoped amend (only when a change request is handed in). When the input includes a change request/delta against an existing plan, judge delta-scoped: the delta is in-scope + edit-not-redraw; the coverage map was re-traced (changed behaviors re-mapped, removed ones retired, no behavior left without a case); the regression set was selected by impact + risk (not all, not none); a discovered-defect amend added a traced regression case; the plan's own version + changelog is present and superseded cases marked; the touched cases still meet conds. 5–6 — NOT a full re-review of the unchanged plan. Gap when the delta is a silent redraw, leaves a changed behavior without a re-traced case, skips/over-runs regression selection, or lacks the version/changelog. Proportionality: on a greenfield first build (no change request) this condition is n/a — never a gap.
Proportionality. "Can a tester execute it and is every behavior covered" scales with the project. A thin project's plan legitimately collapses what it doesn't need — no non-functional testing without an NFR (cond. 9 n/a), no integration tier without seams, a short catalog if there are few behaviors, no amend section greenfield (cond. 10 n/a). That is correct sizing, not a gap. Judge the tester's ability to execute and the coverage of the enumerated behaviors, not case count. A small, complete plan that satisfies every applicable condition passes; do not manufacture a gap from brevity. (Conditions 1, 5, 7 still bind at any size.)
Step 3: Decide the verdict
- approve — every applicable condition passes. A tester can execute the plan as written, every enumerated upstream behavior has a traceable case, the catalog is risk-weighted, the warranted non-functional testing carries targets, and nothing is fabricated. Approve even if you can imagine stylistic improvements; the bar is coverage + testability, not perfection — and not maximalism.
- revise — one or more applicable conditions have a real, named gap.
Do not revise to signal effort or to request nice-to-haves. A condition is either met or it isn't.
Step 4: Emit the verdict + actionable findings
Emit the verdict as a single line — the literal text VERDICT: approve or VERDICT: revise, on its own line, with no surrounding code fences, quotes, or extra words (the fences here are illustration only):
VERDICT: approve
Then, on the following lines, list findings. On revise, every finding is actionable — the failed condition, the exact location, and how to fix it. On approve, findings are optional non-blocking notes; do not let them imply a revision is required.
If an upstream was not handed in, state that as an explicit assumption (e.g. "api-spec not provided — operation/error coverage (cond. 1) judged only against the feature-spec") and judge the other conditions on what you have. Do not silently pass over the un-runnable check, and do not default to approve.
Good findings name the gap and the fix:
revise — Complete coverage (cond. 1), feature-spec behavior "user can reset password via email link": no case traces to it. Fix: add a case (happy path + the expired/invalid-link negative) with a traces-to back to this behavior.
revise — Non-functional testing (cond. 9): NFR-PERF requires p95 <= 200ms but the plan's performance row states no load profile or target. Fix: add a load profile (concurrency/duration) + the p95 target + the tool, or flag the NFR as unverifiable.
revise — Delta-scoped amend (cond. 10): the change request alters "checkout applies a coupon" but the catalog wasn't re-traced and no regression set was selected. Fix: re-map the coupon coverage row, add/adjust its case, and select the impact+risk regression set (the cart + pricing cases that depend on coupons).
A bad finding is vague and unactionable:
The coverage could be more thorough. (Which behavior? Which case? What fixes it?)
Rules
Hard rules (never violate):
- Emit exactly one verdict line,
VERDICT: approve or VERDICT: revise — that literal token, on its own line, nothing else on it. Downstream tooling parses it. No alternate verdict vocabulary.
- Judge, never author. Return findings; do not rewrite, fix, or fill in the plan. The producer revises.
- Single-sourced bar. Judge against the ten conditions in Step 2 — the same bar the author produces to (
authoring-test-plan Step-7). Do not invent extra conditions or apply a stricter private standard.
- Coverage completeness is load-bearing. Enumerate every behavior/operation/error from the handed-in upstreams and confirm each has >=1 traceable case (cond. 1). Enumerate from whatever upstream was handed in — never assume a fixed input.
- Risk-weighted, not combinatorial, not thin. A coverage gap, a full input-permutation cross-product, and a padded/thin catalog are each a
revise (cond. 6). The case-design techniques are author aids judged by outcome — never demand a named technique.
- Non-functional is targeted + proportional. A warranted non-functional type with no approach/target is a gap (cond. 9); a non-functional type the archetype doesn't warrant is NOT demanded, and no target is ever fabricated. Cond. 9 owns the non-functional axis; cond. 2 is functional-only — never double-count a missing perf level across both.
- ML cases use a metric-threshold, not a fixed oracle. An ML/probabilistic case's expected result is a metric-threshold on a named dataset (or a metamorphic relation); "the model is accurate" is the un-runnable result cond. 5 rejects — recognize the probabilistic case, don't impose a new bar.
- Amend is reviewed delta-scoped (cond. 10), by input signal. Run cond. 10 ONLY when a change request is handed in; greenfield -> n/a. Judge the delta + coverage/trace integrity + regression selection, not the unchanged plan.
- No fabrication. A case testing a behavior no upstream declares is a defect (cond. 7) — a real gap is flagged as an assumption. Spot-check traces-to against the actual upstreams.
- No false-revise. A plan meeting every applicable condition is approved, even a thin one. Proportional sizing that still covers every enumerated behavior is not a defect. Revise only on a real, named gap.
- No false-approve. Never approve over a genuine gap to be agreeable. A blocking gap is a
revise.
- Untestable done-criteria is a gap. An exit criterion two readers could disagree on fails cond. 3 — done-criteria must be mechanically decidable (a coverage floor + an open-defect threshold).
- Missing upstream is flagged, not silently passed. Surface it as an explicit assumption; judge the rest on what you have. Never default to approve.
- Judge against the upstreams the document was given. A not-produced upstream is never a revise trigger. But a plan that ignored a produced upstream (a handed-in feature-spec whose behaviors have no cases) is a fair finding.
- Every revise finding is actionable — failed condition + location + concrete fix. No vague notes.
Preferences (override-able):
- Order findings by severity — coverage gaps and fabrication first, then catalog-sizing + non-functional, then amend, then minor ones.
- Reference the condition number/name in each finding so the author maps it back to the bar.
- Keep approve-notes few and clearly non-blocking.
Gotchas
- Approving for completeness instead of executability. Every section can be present and the plan still un-executable (cases with no preconditions, vague steps, an unobservable expected result, no traces-to). Judge whether a tester can execute and trace it, not whether the template is filled.
- The behavior with no case. The plan can look thorough — a long catalog, a coverage matrix — while silently missing a case for one upstream behavior. The only catch is to enumerate the upstream behaviors and tick each (cond. 1). A long catalog is not proof of coverage.
- The combinatorial blow-up that reads as rigor. A catalog enumerating every permutation looks exhaustive but is unmaintainable and misses risk-weighting — 1,024 cases for a 10-switch module is a defect (cond. 6). Check high-risk areas get depth and trivial areas get happy-path-only.
- The thin/padded catalog. Cases that restate each other (padding), or a high-risk area with only a happy-path case (thin). Both fail cond. 6 even though the count looks fine. Judge depth against risk.
- The untestable exit criterion. "Testing complete when coverage is good" can't be mechanically decided (cond. 3). A real exit criterion ties to passing cases + an open-defect threshold.
- "The model is accurate" as an ML expected result. A non-deterministic system has no fixed oracle — a deterministic pass/fail is un-runnable (cond. 5). Accept a metric-threshold-on-a-named-dataset or a metamorphic relation; don't invent a new bar beyond cond. 5.
- Non-functional double-count or maximalism. Don't flag a missing perf level under both cond. 2 and cond. 9 — cond. 9 owns it. And don't demand a non-functional type a thin project's archetype doesn't warrant (cond. 9 is proportional; no NFR -> n/a).
- The fabricated case. A case can test a plausible behavior no upstream declares (cond. 7). Spot-check traces-to; a case with no real upstream backing is a defect, not coverage.
- Amend judged as a full review. On a change request, judge the delta + coverage/trace integrity + regression selection (cond. 10) — not a fresh full review of the unchanged plan; conversely, don't wave through an amend that didn't re-trace coverage or select a regression set.
- Systematic over-flagging (false-revise). A reviewer asked to find problems over-corrects, judging sound plans as defective. Calibrate to the bar: a condition is a gap only on a named, real deficiency, not a case order or a level choice you'd have made differently.
- False-revise on a proportionally-sized plan. A thin project's plan is correctly small — a handful of cases, no non-functional testing without an NFR, no integration tier without seams. That is right-sizing (conds. 1, 5, 7 still bind).
- Confusing this with the release-runbook or design-review gate. This judges the QA/verification plan. A release-runbook-review judges the operational procedure that reuses this plan's exit criteria; design-review gates engineering design docs against the codebase.
- Verdict token drift. "Approved", "LGTM", "needs work", or a verdict buried mid-paragraph will not parse. Emit the literal
VERDICT: approve|revise on its own line.
Anti-patterns
- Rubber-stamp approve. Skimming the catalog's length and approving — the gate exists to catch plans a tester can't execute or that miss a behavior.
- Skipping the upstream enumeration. "The catalog is long, so coverage must be fine" — without enumerating the upstream behaviors and ticking each, you miss the highest-impact defect class (cond. 1).
- Counting cases instead of weighting by risk. A bigger catalog is not better. The bar is risk-weighted coverage (cond. 6).
- Inventing conditions. Adding a private requirement the bar does not carry ("it should include a traceability-tool export / a specific test-management format / a literal decision table / an exploratory tier"). Judge the ten conditions only — the case-design techniques, exploratory/SBTM, and metamorphic testing are author aids judged by OUTCOME, never demanded. This is the load-bearing guard under the new aids.
- Maximalism. Demanding a non-functional type, an integration tier, or a fuller catalog from a thin project that doesn't warrant them (cond. 9 is proportional).
- Nit-pick revise. Blocking on case-ordering taste or nice-to-haves dressed up as gaps. Revise is for real coverage/executability blockers only.
- Silent rewrite. Authoring inside a review collapses the produce/judge separation.
- Hedged verdict. "Mostly approve but…" or two verdict lines. Exactly one decision, exactly one token.
Output
A single review result for one test plan:
- One verdict line —
VERDICT: approve or VERDICT: revise, verbatim, on its own line.
- Findings — on
revise, one actionable finding per blocking gap (failed condition + location + concrete fix); on approve, optional non-blocking notes.
The plan under review is textual today — strategy prose + a coverage matrix + a non-functional matrix + a test-case catalog (markdown via the local docs backend); the review method + bar are medium-independent (a future test-management-tool export changes only the medium). The abstract consumer is whatever orchestrates the produce->review loop: approve accepts the plan for execution (and lets a release runbook reuse its exit criteria); revise returns the findings for a bounded revision pass.
Related
authoring-test-plan — the produce half of the pair; it writes the plan to the same coverage + testability bar this skill judges against (its Step-7 = these ten conditions). Pairing them single-sources the bar so produce and review do not drift.
- The upstream feature-spec / api-spec / PRD / NFRs — the documents every case derives from; this gate enumerates their behaviors/operations/errors and checks each has a traceable case (cond. 1) and that the NFRs are covered (cond. 9). Gated at their own authoring time, not here.
- A release-runbook-review skill — the gate for the operational go-to-production runbook that reuses this plan's exit criteria. Distinct doc, distinct bar.
- A design-review skill — the gate for engineering design documents (spec, plan, RFC, ADR), which verifies claims against the codebase. Distinct gate, distinct artifact; not the verification plan.
- A test-plan template / content-template tool — owns the section structure; this skill judges quality against the bar, not structural conformance.
Progressive disclosure
references/coverage-testability-bar.md — per-condition pass/gap signals + worked findings for the ten conditions (esp. the deepened cond. 3/4/5 and the new cond. 9 non-functional + cond. 10 amend), and the no-false-revise / inventing-conditions discipline. Load to apply the bar at depth.
references/sources.md — research provenance for the review method (the single-sourced coverage + testability bar; the ISTQB / ISO-IEC-IEEE 29119 / WCAG 2.2 / OWASP / NIST grounding; the reviewer-overcorrection basis for the no-false-revise discipline). Load only to audit where the guidance came from.
Body budget
description <= 1,024 chars (agentskills.io cap). Claude truncates the combined description + when_to_use at 1,536 chars in the listing.
- Body <= ~500 lines / 5,000 tokens — kept in context every turn.
- Per reference file: warn >10k tokens, error >25k. Total references: warn >25k tokens, error >50k.
Changelog
- 1.1.0 (2026-06-15) — single-sourced restructure to the 10-condition bar matching
authoring-test-plan 1.1.0: cond. 2 narrowed to FUNCTIONAL levels; new cond. 9 non-functional testing (warranted types carry numeric targets — perf/security/WCAG 2.2 AA/compat/i18n; subsumes the old cond. 2 non-functional clause, no double-count) and cond. 10 delta-scoped amend; deepened cond. 3 (coverage floor + open-defect threshold), cond. 4 (test-data management), cond. 5 (ML metric-threshold recognition); the case-design techniques + exploratory/SBTM + metamorphic testing held as author aids judged by outcome (inventing-conditions guard reinforced). VERDICT contract + input contract unchanged.
- 1.0.0 (2026-06-05) — initial reviewed release.
1---2name: reviewing-test-plan3description: Use when reviewing/judging a test plan / QA verification plan — deciding whether a tester can execute it and every behavior is covered. A gate, not authoring. Judges it against a single-sourced 10-condition bar: every handed-in upstream behavior (feature-spec/api-spec ops+errors, else PRD) has >=1 TRACEABLE case; functional levels fit; entry/exit testable (coverage floor + open-defect threshold); environments + test data specified; each case has preconditions + steps + observable result (a metric-threshold-on-a-dataset for ML) + traces-to; the catalog is RISK-WEIGHTED (coverage gap, padded/thin, OR combinatorial blow-up = a finding); each warranted non-functional type (perf/security/WCAG 2.2 AA/compat/i18n) carries a target; an amend is reviewed delta-scoped; nothing fabricated. Emits exactly `VERDICT: approve|revise` + actionable findings; approves a proportionally-sized plan, revises only on a named gap. Not for authoring it, the release runbook, design-review, or the test scripts.4---56# `reviewing-test-plan` — SKILL.md78> **Variant:** standard · **When to use:** judging a finished (or amended) QA/verification test plan as an acceptance gate — checking a tester can execute it, every upstream behavior has a traceable case, the catalog is risk-weighted not combinatorial, and the warranted non-functional testing carries numeric targets, then emitting `VERDICT: approve|revise` with actionable findings.910## Overview1112This skill is the *review* half of an authoring/judging test-plan pair. Loaded by a reviewer who holds a **finished QA/verification test plan** — the document stating what to test, at what level, in what environment, with what data, to what done-criteria, plus the case catalog to run — it judges that document against one question: **can a tester execute this plan with no questions, does every behavior in the handed-in upstreams have at least one traceable test case, and is the catalog sized by risk (not the full input-permutation cross-product, not skeletal)?** It applies a fixed **10-condition coverage + testability checklist** — the same bar a test-plan author produces to (`authoring-test-plan` Step-7), so the produce-bar and the review-bar do not drift — then emits a single machine-parseable verdict plus findings the author can act on in one revision pass. It is an acceptance gate: it does **not** author, fix, or rewrite the plan; it judges and returns findings, and the producer revises.1314The **single most load-bearing checks** are **coverage completeness** (enumerate every upstream behavior/operation/error and confirm each has >=1 traceable case — a behavior with no case is the highest-impact defect) and **catalog sizing** (risk-weighted, not a combinatorial blow-up and not thin/padded). Both are easy to miss when the plan *looks* thorough.1516## When to activate1718- A finished QA/verification test plan needs an accept/revise decision before testing begins or before it feeds a release runbook's exit criteria.19- You are the independent reviewer / gate for a test plan a producer just authored, and you have the upstreams (feature-spec / api-spec / PRD) to check coverage against.20- Re-judging a revised test plan after a prior `revise` verdict, or reviewing an **amend** (a change request handed in against an approved plan — judge it delta-scoped, cond. 10).2122**Do NOT activate when:**2324- Authoring or repairing a test plan -> use `authoring-test-plan` (it produces to the same bar this skill asserts). This skill never writes the document.25- Reviewing the **release/deployment runbook** — the go-to-production procedure (deploy steps, verification, rollback) -> use a release-runbook-review skill. The runbook *reuses* this plan's exit criteria; the bars differ (executability/rollback vs coverage/testability).26- Reviewing **engineering design documents** — a spec, plan, design doc, RFC, or ADR -> use a design-review skill that verifies design claims against the codebase. That gates the design; this gates the verification plan derived downstream of it.27- Judging or running the **executable test scripts** (pytest / Playwright / etc.) — those are implementation, downstream of this plan. This gate judges the plan *document*, not the automation code or a test run's results.28- Checking template/section conformance -> that is a template concern. This skill judges *quality against the bar*, not whether every heading is present.2930## Workflow3132### Step 1: Read the whole plan with fresh eyes — and pull up the upstreams3334Read the test plan end to end as if you were the tester who must execute it tomorrow, without the author's framing. Your stance is a gatekeeper for that tester: a finding carries weight only when it shows the tester **cannot execute a case, cannot decide whether done-criteria are met, or finds a behavior with no case**. Identify the **project archetype** the plan is sized to (a thin CLI vs a broad UI product) — Step 2's proportionality calibration depends on it. Critically, **load the handed-in upstreams** (feature-spec / api-spec / PRD / NFRs — whatever the project actually produced): they are your **coverage checklist**. Enumerate every behavior / acceptance criterion (feature-spec), every operation + error case (api-spec), or — if those weren't produced — every requirement (PRD); note the NFRs that warrant non-functional testing. Never assume a fixed input; enumerate from **whatever upstream was handed in**. If an upstream was **not** handed in, record that now — flag it as an assumption in Step 4 and judge coverage on what you have; never invent an expectation of a document the project didn't produce, and never default to approve because the checklist couldn't be fully run. If a **change request** was handed in against an existing plan, this is an **amend** — run cond. 10 delta-scoped (Step 2).3536### Step 2: Run the coverage + testability checklist — judge each condition3738For each condition below, decide **pass** or **gap**. A condition fails only on a *real, named* deficiency — "I'd have ordered the cases differently" is not a gap. For each gap, capture the exact location and what is missing (Step 4 turns it into an actionable finding). These ten conditions are the **single-sourced bar** (the same conditions `authoring-test-plan` Step-7 produces to); do not add private ones. Depth + worked pass/gap signals: `references/coverage-testability-bar.md`.39401. **Complete coverage.** Every behavior / acceptance criterion in the handed-in feature-spec, and every operation + error case in the handed-in api-spec (else every requirement in the PRD), has **>=1 traceable test case**. *Gap* when an enumerated upstream behavior/operation/error has **no** case pointing back to it — the highest-impact defect class. (Binds at any size.)412. **Appropriate functional levels.** The functional levels & types chosen fit the project — unit/integration/e2e/acceptance present as the system warrants; regression/smoke as warranted; any omission justified, not silent. *Gap* when a level the system clearly warrants is absent with no rationale (e.g. no integration cases for a multi-service system). *(Non-functional testing is cond. 9, not here.)* Proportionality: a thin project collapses the levels it doesn't need.423. **Testable entry/exit criteria.** Entry and exit ("done") criteria are observable/measurable — a reader can **mechanically** decide each (e.g. "all High-priority cases pass; every behavior has a passing traceable case; no open Critical/High defect"). The exit ties to a **coverage floor + an open-defect threshold**; coverage phrased against requirements/risk, not a bare code-coverage %. *Gap* when a criterion is vague ("testing looks good") so two readers could disagree. Proportionality: a thin plan has a short criteria list, still decidable.434. **Environments + test data specified.** Each level states **where** it runs and the **data/fixtures** it needs + how they're provisioned/reset + how sensitive data (PII/PHI) is handled. *Gap* when a level names no environment, or cases assume fixtures the plan never specifies. Proportionality: a thin plan = one env, simple fixtures.445. **Each catalog case is executable + traceable.** Every case has **preconditions**, **single-action steps**, an **observable expected result** (the exact message/error for negatives; for an ML/probabilistic case a **metric-threshold on a named dataset** or a metamorphic relation — "the model is accurate"/"results are relevant" is the un-runnable result this rejects), and a **traces-to**. *Gap* when a case lacks preconditions, has vague/multi-action steps, has a non-observable expected result, or has no traces-to. (Binds at any size — the executability floor.)456. **Risk-prioritized + risk-weighted.** The plan prioritizes by **Likelihood x Impact**, and catalog **depth follows risk** — more cases (boundaries, equivalence partitions, decision-table/state-transition/pairwise selections, negative paths) on high-risk areas, fewer on trivial ones — **NOT** the full input-permutation cross-product. *Gap* in three directions: a **coverage gap** (too few cases for the risk), a **combinatorial blow-up** (every permutation — e.g. all 1,024 combinations of a 10-switch module instead of risk + pairwise), **or** a **padded/thin catalog** (cases that don't add coverage, or a high-risk area with only a happy-path case). The case-design techniques are author aids — judge the *outcome*, never "draw a decision table".467. **No fabrication.** Every case traces to a **real** upstream; any coverage gap (an untestable requirement, a missing NFR) is surfaced as an **explicit assumption**, never filled with an **invented** behavior. *Gap* when a case tests a behavior **no upstream declares**. **Spot-check** a sample of cases' traces-to against the actual upstreams. (Binds at any size.)478. **Proportional to the archetype.** The catalog and the level set are sized to the project — a thin CLI gets a handful of cases and may collapse non-functional testing; a large UI product gets many. *Gap* only when the plan is **skeletal** for its archetype or **combinatorial** (cond. 6). Right-sizing is not a gap.489. **Non-functional testing (warranted types carry numeric targets).** Each non-functional type the **NFRs / archetype warrant** is present with a checkable approach + a **numeric/standard target**: performance (load profile + p95/throughput), security (a threat-derived set), accessibility (**WCAG 2.2 AA**), usability, compatibility (a matrix), i18n/l10n. *Gap* when a warranted type is present with no approach/target ("we'll test performance" with no profile/target), or an NFR exists with no non-functional testing covering it. **Proportionality (load-bearing):** a thin project with no NFR warrants **none** — its absence is NOT a gap; never demand a non-functional type the archetype doesn't warrant, and never fabricate a target. (This condition owns the non-functional axis; cond. 2 is functional-only — a missing warranted perf level is ONE finding here, not two.)4910. **Delta-scoped amend (only when a change request is handed in).** When the input includes a change request/delta against an existing plan, judge **delta-scoped**: the delta is in-scope + edit-not-redraw; the coverage map was **re-traced** (changed behaviors re-mapped, removed ones retired, no behavior left without a case); the **regression set was selected by impact + risk** (not all, not none); a discovered-defect amend added a **traced regression case**; the plan's **own version + changelog** is present and superseded cases marked; the touched cases still meet conds. 5–6 — **NOT** a full re-review of the unchanged plan. *Gap* when the delta is a silent redraw, leaves a changed behavior without a re-traced case, skips/over-runs regression selection, or lacks the version/changelog. **Proportionality:** on a greenfield first build (no change request) this condition is **n/a** — never a gap.5051**Proportionality.** "Can a tester execute it and is every behavior covered" scales with the project. A thin project's plan legitimately **collapses what it doesn't need** — no non-functional testing without an NFR (cond. 9 n/a), no integration tier without seams, a short catalog if there are few behaviors, no amend section greenfield (cond. 10 n/a). That is correct sizing, not a gap. Judge the **tester's ability to execute and the coverage of the enumerated behaviors**, not case count. A small, complete plan that satisfies every *applicable* condition **passes**; do not manufacture a gap from brevity. (Conditions 1, 5, 7 still bind at any size.)5253### Step 3: Decide the verdict5455- **approve** — every applicable condition passes. A tester can execute the plan as written, every enumerated upstream behavior has a traceable case, the catalog is risk-weighted, the warranted non-functional testing carries targets, and nothing is fabricated. Approve even if you can imagine stylistic improvements; the bar is coverage + testability, not perfection — and not maximalism.56- **revise** — one or more applicable conditions have a real, named gap.5758Do not revise to signal effort or to request nice-to-haves. A condition is either met or it isn't.5960### Step 4: Emit the verdict + actionable findings6162Emit the verdict as a single line — the literal text `VERDICT: approve` or `VERDICT: revise`, on its own line, with **no** surrounding code fences, quotes, or extra words (the fences here are illustration only):6364```65VERDICT: approve66```6768Then, on the following lines, list findings. On `revise`, every finding is **actionable** — the failed condition, the exact location, and **how to fix it**. On `approve`, findings are optional non-blocking notes; do not let them imply a revision is required.6970If an **upstream was not handed in**, state that as an explicit assumption (e.g. "api-spec not provided — operation/error coverage (cond. 1) judged only against the feature-spec") and judge the other conditions on what you have. Do not silently pass over the un-runnable check, and do not default to approve.7172Good findings name the gap and the fix:7374> **revise** — Complete coverage (cond. 1), feature-spec behavior "user can reset password via email link": no case traces to it. Fix: add a case (happy path + the expired/invalid-link negative) with a traces-to back to this behavior.7576> **revise** — Non-functional testing (cond. 9): NFR-PERF requires p95 <= 200ms but the plan's performance row states no load profile or target. Fix: add a load profile (concurrency/duration) + the p95 target + the tool, or flag the NFR as unverifiable.7778> **revise** — Delta-scoped amend (cond. 10): the change request alters "checkout applies a coupon" but the catalog wasn't re-traced and no regression set was selected. Fix: re-map the coupon coverage row, add/adjust its case, and select the impact+risk regression set (the cart + pricing cases that depend on coupons).7980A bad finding is vague and unactionable:8182> The coverage could be more thorough. *(Which behavior? Which case? What fixes it?)*8384## Rules8586**Hard rules (never violate):**8788- **Emit exactly one verdict line, `VERDICT: approve` or `VERDICT: revise`** — that literal token, on its own line, nothing else on it. Downstream tooling parses it. No alternate verdict vocabulary.89- **Judge, never author.** Return findings; do not rewrite, fix, or fill in the plan. The producer revises.90- **Single-sourced bar.** Judge against the ten conditions in Step 2 — the same bar the author produces to (`authoring-test-plan` Step-7). Do not invent extra conditions or apply a stricter private standard.91- **Coverage completeness is load-bearing.** Enumerate every behavior/operation/error from the **handed-in upstreams** and confirm each has >=1 traceable case (cond. 1). Enumerate from whatever upstream was handed in — never assume a fixed input.92- **Risk-weighted, not combinatorial, not thin.** A coverage gap, a full input-permutation cross-product, **and** a padded/thin catalog are each a `revise` (cond. 6). The case-design techniques are author aids judged by outcome — never demand a named technique.93- **Non-functional is targeted + proportional.** A warranted non-functional type with no approach/target is a gap (cond. 9); a non-functional type the archetype doesn't warrant is NOT demanded, and no target is ever fabricated. Cond. 9 owns the non-functional axis; cond. 2 is functional-only — never double-count a missing perf level across both.94- **ML cases use a metric-threshold, not a fixed oracle.** An ML/probabilistic case's expected result is a metric-threshold on a named dataset (or a metamorphic relation); "the model is accurate" is the un-runnable result cond. 5 rejects — recognize the probabilistic case, don't impose a new bar.95- **Amend is reviewed delta-scoped (cond. 10), by input signal.** Run cond. 10 ONLY when a change request is handed in; greenfield -> n/a. Judge the delta + coverage/trace integrity + regression selection, not the unchanged plan.96- **No fabrication.** A case testing a behavior no upstream declares is a defect (cond. 7) — a real gap is flagged as an assumption. Spot-check traces-to against the actual upstreams.97- **No false-revise.** A plan meeting every *applicable* condition is approved, even a thin one. Proportional sizing that still covers every enumerated behavior is not a defect. Revise only on a real, named gap.98- **No false-approve.** Never approve over a genuine gap to be agreeable. A blocking gap is a `revise`.99- **Untestable done-criteria is a gap.** An exit criterion two readers could disagree on fails cond. 3 — done-criteria must be mechanically decidable (a coverage floor + an open-defect threshold).100- **Missing upstream is flagged, not silently passed.** Surface it as an explicit assumption; judge the rest on what you have. Never default to approve.101- **Judge against the upstreams the document was given.** A **not-produced** upstream is **never** a revise trigger. But a plan that **ignored a produced upstream** (a handed-in feature-spec whose behaviors have no cases) **is** a fair finding.102- **Every revise finding is actionable** — failed condition + location + concrete fix. No vague notes.103104**Preferences (override-able):**105106- Order findings by severity — coverage gaps and fabrication first, then catalog-sizing + non-functional, then amend, then minor ones.107- Reference the condition number/name in each finding so the author maps it back to the bar.108- Keep approve-notes few and clearly non-blocking.109110## Gotchas111112- **Approving for completeness instead of executability.** Every section can be present and the plan still un-executable (cases with no preconditions, vague steps, an unobservable expected result, no traces-to). Judge whether a tester can *execute and trace it*, not whether the *template is filled*.113- **The behavior with no case.** The plan can look thorough — a long catalog, a coverage matrix — while silently missing a case for one upstream behavior. The only catch is to **enumerate the upstream behaviors and tick each** (cond. 1). A long catalog is not proof of coverage.114- **The combinatorial blow-up that reads as rigor.** A catalog enumerating every permutation looks exhaustive but is unmaintainable and misses risk-weighting — 1,024 cases for a 10-switch module is a defect (cond. 6). Check high-risk areas get *depth* and trivial areas get happy-path-only.115- **The thin/padded catalog.** Cases that restate each other (padding), or a high-risk area with only a happy-path case (thin). Both fail cond. 6 even though the count looks fine. Judge depth against *risk*.116- **The untestable exit criterion.** "Testing complete when coverage is good" can't be mechanically decided (cond. 3). A real exit criterion ties to passing cases + an open-defect threshold.117- **"The model is accurate" as an ML expected result.** A non-deterministic system has no fixed oracle — a deterministic pass/fail is un-runnable (cond. 5). Accept a metric-threshold-on-a-named-dataset or a metamorphic relation; don't invent a new bar beyond cond. 5.118- **Non-functional double-count or maximalism.** Don't flag a missing perf level under both cond. 2 and cond. 9 — cond. 9 owns it. And don't demand a non-functional type a thin project's archetype doesn't warrant (cond. 9 is proportional; no NFR -> n/a).119- **The fabricated case.** A case can test a plausible behavior **no upstream declares** (cond. 7). Spot-check traces-to; a case with no real upstream backing is a defect, not coverage.120- **Amend judged as a full review.** On a change request, judge the delta + coverage/trace integrity + regression selection (cond. 10) — not a fresh full review of the unchanged plan; conversely, don't wave through an amend that didn't re-trace coverage or select a regression set.121- **Systematic over-flagging (false-revise).** A reviewer asked to find problems over-corrects, judging sound plans as defective. Calibrate to the bar: a condition is a gap only on a *named, real* deficiency, not a case order or a level choice you'd have made differently.122- **False-revise on a proportionally-sized plan.** A thin project's plan is correctly small — a handful of cases, no non-functional testing without an NFR, no integration tier without seams. That is right-sizing (conds. 1, 5, 7 still bind).123- **Confusing this with the release-runbook or design-review gate.** This judges the **QA/verification plan**. A release-runbook-review judges the operational procedure that *reuses* this plan's exit criteria; design-review gates engineering design docs against the codebase.124- **Verdict token drift.** "Approved", "LGTM", "needs work", or a verdict buried mid-paragraph will not parse. Emit the literal `VERDICT: approve|revise` on its own line.125126## Anti-patterns127128- **Rubber-stamp approve.** Skimming the catalog's length and approving — the gate exists to catch plans a tester can't execute or that miss a behavior.129- **Skipping the upstream enumeration.** "The catalog is long, so coverage must be fine" — without enumerating the upstream behaviors and ticking each, you miss the highest-impact defect class (cond. 1).130- **Counting cases instead of weighting by risk.** A bigger catalog is not better. The bar is risk-weighted coverage (cond. 6).131- **Inventing conditions.** Adding a private requirement the bar does not carry ("it should include a traceability-tool export / a specific test-management format / a literal decision table / an exploratory tier"). Judge the ten conditions only — the case-design techniques, exploratory/SBTM, and metamorphic testing are author aids judged by OUTCOME, never demanded. This is the load-bearing guard under the new aids.132- **Maximalism.** Demanding a non-functional type, an integration tier, or a fuller catalog from a thin project that doesn't warrant them (cond. 9 is proportional).133- **Nit-pick revise.** Blocking on case-ordering taste or nice-to-haves dressed up as gaps. Revise is for real coverage/executability blockers only.134- **Silent rewrite.** Authoring inside a review collapses the produce/judge separation.135- **Hedged verdict.** "Mostly approve but…" or two verdict lines. Exactly one decision, exactly one token.136137## Output138139A single review result for one test plan:140141- **One verdict line** — `VERDICT: approve` or `VERDICT: revise`, verbatim, on its own line.142- **Findings** — on `revise`, one actionable finding per blocking gap (failed condition + location + concrete fix); on `approve`, optional non-blocking notes.143144The plan under review is **textual** today — strategy prose + a coverage matrix + a non-functional matrix + a test-case catalog (markdown via the local docs backend); the review **method + bar are medium-independent** (a future test-management-tool export changes only the medium). The **abstract consumer** is whatever orchestrates the produce->review loop: `approve` accepts the plan for execution (and lets a release runbook reuse its exit criteria); `revise` returns the findings for a bounded revision pass.145146## Related147148- **`authoring-test-plan`** — the produce half of the pair; it writes the plan to the same coverage + testability bar this skill judges against (its Step-7 = these ten conditions). Pairing them single-sources the bar so produce and review do not drift.149- The upstream **feature-spec / api-spec / PRD / NFRs** — the documents every case derives from; this gate **enumerates their behaviors/operations/errors and checks each has a traceable case** (cond. 1) and that the NFRs are covered (cond. 9). Gated at their own authoring time, not here.150- A **release-runbook-review** skill — the gate for the operational go-to-production runbook that *reuses* this plan's exit criteria. Distinct doc, distinct bar.151- A **design-review** skill — the gate for engineering design documents (spec, plan, RFC, ADR), which verifies claims against the codebase. Distinct gate, distinct artifact; not the verification plan.152- A **test-plan template / content-template** tool — owns the section *structure*; this skill judges *quality against the bar*, not structural conformance.153154## Progressive disclosure155156- `references/coverage-testability-bar.md` — per-condition pass/gap signals + worked findings for the ten conditions (esp. the deepened cond. 3/4/5 and the new cond. 9 non-functional + cond. 10 amend), and the no-false-revise / inventing-conditions discipline. Load to apply the bar at depth.157- `references/sources.md` — research provenance for the review method (the single-sourced coverage + testability bar; the ISTQB / ISO-IEC-IEEE 29119 / WCAG 2.2 / OWASP / NIST grounding; the reviewer-overcorrection basis for the no-false-revise discipline). Load only to audit where the guidance came from.158159## Body budget160161- `description` <= 1,024 chars (agentskills.io cap). Claude truncates the combined `description` + `when_to_use` at 1,536 chars in the listing.162- Body <= ~500 lines / 5,000 tokens — kept in context every turn.163- Per reference file: warn >10k tokens, error >25k. Total references: warn >25k tokens, error >50k.164165## Changelog166167- **1.1.0** (2026-06-15) — single-sourced restructure to the 10-condition bar matching `authoring-test-plan` 1.1.0: cond. 2 narrowed to FUNCTIONAL levels; new cond. 9 non-functional testing (warranted types carry numeric targets — perf/security/WCAG 2.2 AA/compat/i18n; subsumes the old cond. 2 non-functional clause, no double-count) and cond. 10 delta-scoped amend; deepened cond. 3 (coverage floor + open-defect threshold), cond. 4 (test-data management), cond. 5 (ML metric-threshold recognition); the case-design techniques + exploratory/SBTM + metamorphic testing held as author aids judged by outcome (inventing-conditions guard reinforced). `VERDICT` contract + input contract unchanged.168- **1.0.0** (2026-06-05) — initial reviewed release.