---
name: record-qa
description: >
Write exercise-paths results where they persist — the plan file's Gate, the PR body's "How it
was verified", a Linear comment, and for area passes docs/qa/.md. Reporting only; runs
nothing.
argument-hint: "[LINEAR-ID | slug] [--to=plan,pr,linear,qa-doc]"
---
# record-qa
Runs nothing. No results yet → say so and point at `exercise-paths`.
## Where it goes
| Target | Shape |
|---|---|
| plan file `## Gate` | `qa` checked only when every target is ✓ or explicitly accepted as a gap; device items listed until the user confirms |
| PR body `## How it was verified` | the exercise-paths block verbatim — counts, ✓/✗, handed items. Never rewritten into "tested locally" |
| Linear comment | first line is the count; open items below. On re-QA, edit the same comment |
| `docs/qa/.md` (area passes) | update the "exists today" and lane tables; `[x]` `[ ]` `[~]` `[!]` — keep it honest, stale coverage claims are worse than gaps |
## Format
```
QA — GOLF-123
6 of 8 targets exercised · 1 device · 1 unreachable
✓ api in-round-permissions.contract 6/6
✓ realtime second client converges < 1s
✗ ui score-entry-path.yml — sim not booted
→ device keypad blur hoist
Open: QA-1 four-device tee order — run-order.md
Cleanup: seed round ${SEED_ROUND} restored; e2e phone account removed
```
Scenarios cite the acceptance criterion they cover. Regression checks name what could break
*silently* (the flag-off path, the sibling feature on the same job). A reader of the first line
who stops there must not be misled.