v0.7.0 — eval scorecard, opt-in majority-vote verifier, dismissed-finding digest
Three additive / opt-in improvements, each validated for non-regression against the eval suite.
📊 Eval scorecard (scripts/eval-scorecard.py)
Aggregates the headless runner's per-case PASS/FAIL into a suite-level recall % / precision % / F1 / SNR scorecard, so a prompt change can be A/B'd against an aggregate precision number, not just per-case pass rates. The headless runner now emits SCORE lines (from the report's severity tally) and accepts a REVIEW_ALL_CONFIG_JSON hook so config-driven features can be A/B'd at all. The SNR is an honest suite-derived proxy, documented as such — not a per-comment metric.
🗳️ Opt-in majority-vote verifier (verifierVotes, default 1)
Set an odd N > 1 (e.g. 3) in .claude/review-all.json and each 🔴 CRITICAL / 🟠 IMPORTANT finding reaches the main report only if a majority of N independent hostile verifiers keep it (per-batch, median score, ties demote to appendix). Scoped to top severity — debt/suggested/question stay single-pass — and off by default, since it multiplies verifier cost on the highest-stakes findings. Targets single-verifier mis-scoring on borderline findings.
{ "verifierVotes": 3 }🔁 Dismissed-finding digest
The finding agents now receive a <previously_dismissed> digest of the team's wontfix / non-expired-snoozed decisions (from state.json) and skip re-deriving them at unchanged locations — saving generation and verifier spend. The Phase 2.5 central drop remains the guarantee.
🧪 Testing
Two new doc-invariant gates (check-verifier-votes.sh, check-dismissed-digest.sh) guard the headlessly-untestable prompt behaviors, wired into tests/run.sh alongside the existing menu gate.
Validation
A headless A/B (verifierVotes:3 vs default, via claude -p) confirmed non-regression: recall and precision held at 100% on the tested subset. A beyond-the-diff "blast radius" feature (grep callers of changed exports) was prototyped and evaluated but removed before release — the review already performs cross-file caller analysis (the control arm caught a designed cross-file break and executed the code to confirm the runtime error), so the feature was redundant.
Full changelog: v0.6.1...v0.7.0