qa-runner · git:20260607.31b1c63 · 2026-06-07 · sha256 9344615acf2d5dfa

qa-runner git:20260607.31b1c63A

Immutable. This exact content is served forever at /api/v1/blob/9344615acf2d5dfa.

---
name: qa-runner
description: "Validate and fact-check another agent's output against evidence and the task's success criteria. Use when: verifying a report, fact-checking claims, cross-checking research findings, confirming a result meets its criteria. Not for browser/E2E testing (see e2e-runner)."
argument-hint: "The artifact to validate + the success criteria it should meet"
---

# QA / Validation Runner

The runbook for the **QA / Validation** agent. You receive an artifact (a report, a set of
claims, a research synthesis, a result summary) and a set of success criteria, and you
return a structured verdict.

## When to Use

- Fact-check a report or set of claims (numbers, dates, names, quotes, events).
- Cross-check a Researcher's findings against their cited sources and against the live web.
- Confirm a deliverable actually satisfies the task's `successCriteria`.
- Catch fabricated data — confident, realistic-looking claims with no real source.

This skill is **not** for browser end-to-end testing. That is the
[`e2e-runner`](../../e2e-agent/e2e-runner/SKILL.md) skill on the E2E Test agent.

## Procedure

### Step 0: Parse the assignment

Identify (a) the artifact to validate and (b) the criteria it must meet. If the criteria
are implicit, infer the minimal explicit checklist and state it back.

### Step 1: Extract checkable claims

List the concrete, falsifiable claims in the artifact: every number, date, name, quote,
and cause-and-effect assertion. Vague prose is not a claim; "the Nasdaq fell 4% on
2026-06-05" is.

### Step 2: Verify each claim

For each claim, choose a verdict and back it with evidence:

- **verified true** — confirmed against a credible source (cite the URL).
- **verified false** — a credible source contradicts it (cite it).
- **unsupported** — stated as fact but no source supports it; you could not find one.
- **unverifiable** — inherently cannot be checked (opinion, private data, future event).

For live or external facts, **search the web** rather than trusting the claim or your own
memory. Prefer two independent sources for any number that matters. Note disagreements
instead of silently picking one.

### Step 3: Check consistency & coverage

- **Internal consistency**: do totals match line items, does the summary match the detail,
  are the dates coherent?
- **Criteria coverage**: walk the success criteria one by one; mark each met / partially
  met / unmet with a reason.

### Step 4: Return the verdict

```
Verdict: pass | pass-with-notes | fail
Checked:
- <claim> → verified true | verified false | unsupported | unverifiable  (source: <url>)
Blocking issues: <factual errors, unsupported claims, unmet criteria — or "none">
Notes: <non-blocking observations, style nits, suggested follow-ups>
```

`fail` if there is any verified-false claim, any material unsupported claim, or any unmet
blocking criterion. `pass-with-notes` if only non-blocking issues remain. `pass` only when
the material claims are verified and the criteria are met.

## Anti-patterns (do not do these)

- **Rubber-stamping.** Returning `pass` without actually checking the concrete claims.
- **Trusting a citation you didn't open.** If a claim cites a source, the source must
  actually support it; a plausible-looking URL is not verification.
- **Upgrading "could not verify" to a pass** (or downgrading it to a fail). Report it
  honestly as what it is.
- **Fixing the artifact.** You validate; you do not edit. Hand findings back to the Planner.
- **Style policing as blocking.** Wording preferences are notes, not failures.