docs(prd): independent verification — the closer never self-certifies

Operator addition to the closure protocol: the QA gate is held by an
independent verifier subagent — context-free, prompted to REFUTE, repo
+ issues + journals as its only inputs; verdict posted on the milestone,
unresolved refutation blocks. New qa-strategy section extends no-self-
grading to POC exit gates and autonomy promotions (verdict attached to
the artifact it gates), mirroring at process level what the pipelines
do at data level (dual extraction, seeded-wrong fixtures).

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
2026-07-11 20:19:19 +02:00
co-authored by Claude Fable 5
parent e15a6d68c5
commit d16f7164cb
3 changed files with 6 additions and 2 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ Every phase is decomposed into **self-contained issues** (context, deliverables,
The resume protocol tells a session where to pick up work; this one keeps the doc surface **currently true** when work lands. Docs describe intent; **this file + git describe reality**. A Gitea milestone is closed only after the sweep — and the sweep starts with QA, because nothing gets documented as done before it is *proven* done:
1. **QA gate — verify before documenting.** (a) Every closed issue's **acceptance criteria re-verified** with evidence linked (eval scores, run journals, exit-gate results — not memory of them); (b) the milestone's **test suites green**: golden-set regressions at their bars, injection fixtures quarantined, linter suites behaving (forbidden manifests rejected, seeded-wrong provenance fixtures FAIL), idempotency replay no-op, watchdog/heartbeat checks where the milestone ships standing loops ([QA strategy](qa-strategy.md)); (c) any 🧪→✅ flip in the [agent-catalog](agent-catalog.md) backed by its proving-protocol evidence. A milestone that can't pass its own QA doesn't close — it sheds scope back into open issues.
1. **QA gate — verify before documenting, and never by yourself.** The gate is run by an **independent verifier subagent**: context-free (no conversation inherited from the closer), prompted to *refute* — "find why this milestone is NOT actually done" — with the repo, the issues and the run journals as its only inputs ([no self-grading](qa-strategy.md#independent-verification--no-self-grading)). It checks: (a) every closed issue's **acceptance criteria re-verified** with evidence linked (eval scores, run journals, exit-gate results — not memory of them); (b) the milestone's **test suites green**: golden-set regressions at their bars, injection fixtures quarantined, linter suites behaving (forbidden manifests rejected, seeded-wrong provenance fixtures FAIL), idempotency replay no-op, watchdog/heartbeat checks where the milestone ships standing loops ([QA strategy](qa-strategy.md)); (c) any 🧪→✅ flip in the [agent-catalog](agent-catalog.md) backed by its proving-protocol evidence. Its verdict is posted on the milestone before closure; a refutation the closer cannot resolve **with evidence** blocks. A milestone that can't pass its own QA doesn't close — it sheds scope back into open issues.
2. **Flip the phase row** above (✅ + date + PR links) and prune the backlog map of closed issues.
3. **Re-baseline the [roadmap](roadmap.md)** at the boundary: mark the stream done, re-date downstream engineering bars if they slipped — regulatory diamonds never move; slips shed scope instead. Bump its Last Updated.
4. **Truth-pass the affected leaves** (no-tombstone — rewrite as currently true, no "previously/now"): the [task inventory](task-inventory.md) `Today:`/`Target:` lines the milestone changed; the agent-catalog matrix; `not yet`/candidate claims in [architecture](agent-architecture.md), [model-fleet](model-fleet.md), [compliance](compliance.md). Bump Last Updated **only on files whose claims changed**.