feat(scorecard): sweep every model config into one committed table (G4) - #6
Merged
Conversation
`vpcopilot bench <repo> --all-configs` runs the same scan and the same answer key through every config/agents*.yaml into out-<tag>, and writes benchmarks/RESULTS.md with one row per config. A config whose run fails gets a row carrying its error rather than vanishing — a four-way run is expensive, and losing the other three because one provider 404s would be the worst failure mode. Closes both halves of the old BACKLOG per-stage-metrics item, which G4's note had half-right: - verify PRECISION is new work (real-over-reported: matched key or bonus entries over everything the verifier let through). Recall already existed as bench.discovery_recall and answers a different question — a run can find every labelled vuln and still bury them in false positives. - discovery duplicates were logged by _dedup_findings but never reached metrics.json. They do now, as discovery.duplicates_dropped, and land in the scorecard as a column. MODELS.md now links the table instead of restating numbers, keeping the qualitative findings — the "trusted the comments" hardening win — that no table captures. Two acceptance criteria answered honestly rather than faked: - "re-running with the same seed reproduces the score" is not achievable across these providers; Anthropic accepts no seed and none guarantee determinism. RESULTS.md states the run date, says scores vary, and tells the reader to re-run before reading into a small difference. - token cost is absent by the decision of 2026-07-27; the table says so rather than leaving a reader to wonder. Verified against a real scored run (out-claude, --rescore, no model calls): precision, noise and wall time all populate. 12 new tests; 262 pass, coverage 73%. The roadmap box stays UNCHECKED: benchmarks/RESULTS.md needs a real four-way run, which spends live Gemini and OpenAI quota and is the maintainer's call to start. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Roadmap G4, built but not yet run — see the last section.
vpcopilot bench <repo> --all-configsruns the same scan and answer key through everyconfig/agents*.yamlintoout-<tag>, and writesbenchmarks/RESULTS.mdwith one row per config.Closes both halves of the old BACKLOG item
G4's note had this half-right, and reconciling it against the code corrected it:
everything the verifier let through). Recall already existed as
bench.discovery_recallandanswers a different question: a run can find every labelled vuln and still bury them in false
positives.
_dedup_findingsbut never reachedmetrics.json. Theydo now, as
discovery.duplicates_dropped, and appear as a scorecard column.Failure handling is the point, not a detail
A four-way run is expensive. A config whose run fails gets a row carrying its error rather than
vanishing from the table — losing the other three because one provider 404s would be the worst
possible failure mode, and a table that silently omits the provider that crashed reads as if it was
never tried. Pinned by a test.
Two acceptance criteria answered honestly rather than faked
"Re-running with the same seed and model reproduces the score" is not achievable here. Anthropic
accepts no seed at all, and none of the four providers guarantee determinism. Rather than add seed
plumbing that would imply a guarantee it can't make,
RESULTS.mdstates the run date, says scoresvary between runs, and tells the reader to re-run before reading anything into a small difference.
Token cost is absent by the decision of 2026-07-27 — and the table says so, rather than leaving
a reader to wonder whether it was measured and omitted.
MODELS.mdnow links the table instead of restating numbers, keeping the qualitative findings (the"gpt-4o trusted the 'intentional' comments" hardening win) that no table captures.
Verification
Against a real scored run —
out-claudewith--rescore, so no model calls and no quota:(That run scanned a different target than the Nimbus key, so the numbers are meaningless — it
proves the plumbing populates, which is what a rescore can prove.)
12 new tests · 262 pass · coverage 73% ·
ruffclean.Why the roadmap box is still unchecked
benchmarks/RESULTS.mddoes not exist yet, and the acceptance requires it. Producing it means areal four-way run that spends live Gemini and OpenAI quota and takes a while — a deliberate start
for the maintainer, not something to kick off unasked. The capability is complete and tested; the
table is one command away.
🤖 Generated with Claude Code