v0.7.1 — claim-class discipline, gate provenance, unverified verdict
Evidence-provenance hardening across the review pipeline. The target is the failure mode where a review reads real code, cites real lines, and is still wrong — because a static read was silently substituted for a claim about runtime behaviour, backend data, or rendered output. Same shape for the gates: an assumed build looks exactly like one that ran.
🧭 Claim classes (agents/_shared.md)
Every finding agent now classifies its core claim as static / runtime / data / rendering, and checks it holds the proof that class demands. Reading a template proves what the template says; it is zero evidence about what the server returned or what the user saw. A runtime/data/rendering claim backed only by a source read is capped at ⚪ QUESTION / MEDIUM confidence and must state the missing observation inline.
| Class | Admissible proof | Not proof |
|---|---|---|
| Runtime | a test exercising the path, a log line from a real run, a documented framework contract | reading the function that would do it |
| Data | an actual payload — fixture, recorded response, network capture | inferring from a schema, model, or DTO |
| Rendering | rendered DOM, snapshot test, screenshot | reading the template |
🔬 The unverified verdict (agents/verifier.md, v5 → v6)
A claim that demands observation, where nobody has one, is neither a false positive nor a confirmed defect — forcing it into keep/drop destroys information either way. The verifier now emits a fourth verdict, unverified, plus claim_class and needs_observation (the specific check that would settle it — "open a row of the variant subtype and assert the resolved URL", not "test it"). It is orthogonal to the score bands, so a well-argued, high-scoring claim still lands there. These render in a new 🔬 Unverified — needs observation report section, never as 🔴/🟠, and are never dropped.
The cross-agent +10 confirmation bonus now requires methodologically independent evidence: N agents re-reading the same file and drawing the same inference is one inference reported N times, and the bonus was rewarding that correlation.
🧾 Gate provenance (SKILL.md Phase 1, references/phase-3-report.md)
Every gate row now records the exact command, its exit code, and the wall-clock time it ran, surfaced as a mandatory Provenance column in the report's gate table. Hard rules: PASS requires a command executed in this run — a result from a log, a prior session, or CI is SKIP(not-run-this-session); a gate that applies but did not run is SKIP(reason), not N/A; one gate never infers another (passing tests do not imply a passing typecheck); and template compilation is not covered by a plain tsc --noEmit. Substituting a running dev server for the build gate now requires a four-point liveness proof — port open this run, log identified, log mtime newer than the newest file in the diff, success marker in the tail.
⚠️ Behaviour change for gate mode
A runtime claim held on static evidence that would previously have blocked as 🔴 now lands in 🔬 and does not block /review-all gate. This is a deliberate precision-over-recall trade for the CI/autonomous-loop path: a blocking oracle should not fire on a claim nobody observed. The finding stays fully visible to human readers.
🧪 Testing
New tests/check-claim-class.sh doc-invariant gate (24 assertions across _shared.md, verifier.md, phase-2.5-verification.md, phase-3-report.md, phase-gate.md, SKILL.md, README.md), wired into tests/run.sh alongside the four existing gates. Like the menu and vote gates, it guards behaviour that is instruction-driven and cannot be exercised headlessly.
Validation
Guarded by the deterministic suite only: shellcheck -S warning clean, tests/run.sh green — 5 doc-invariant gates CLEAN, eval schema validation, shell tests, 60 Python unit tests OK.
No headless eval A/B was run for this release, unlike previous cycles. The precision/recall effect on the 89-case suite is therefore unmeasured. The change is additive and instruction-level — it introduces a new report section and a new verdict rather than altering existing detection heuristics — but that is a reasoned expectation, not a measurement.
Full changelog: v0.7.0...v0.7.1