Plugin-side half of protoLabsAI/protoLab#26 (see the design comment there: the model-swap gate runs the panel end-to-end, not the raw model). The lab side is done — scorer, run-output contract, and a pinned replay manifest live at protoLab:evals/review-eval/. What's missing is the runner: a way to invoke the panel outside the live-PR path.
What replay mode is
Run the full panel (finders + verify pass + guards, unchanged) against a checkout + diff at a pinned SHA, with:
- findings emitted as JSON instead of posted to GitHub — contract in
protoLab:evals/review-eval/SCHEMA.md (run header, per-review findings with severity/file/line/disposition, plus telemetry)
- model resolved from a gateway alias passed per-run (e.g.
protolabs/fast vs protolabs/smart) — this is the entire A/B knob
- telemetry carried through: the #34 guard fields (
grounding_checked, unaccounted, converge_reason) plus token accounting and a truncated flag. Truncation is first-class: findings=[] && truncated must be distinguishable from a clean pass — the fast incident (6k reasoning tokens, no final answer) is exactly what the scorer needs to see.
Input
protoLab:evals/review-eval/replay_manifest.jsonl — currently 6 pinned rounds, all SHAs verified against the protoreview[bot] review markers:
- protoAgent#2208 r1
7e62cd80 (FAIL — the planted event-loop major, catch probe) and r2 a71d2ec8 (the hallucinated PASS with the defect still present → shipped as #2210; false-negative + honesty probe)
- protoAgent#2141 r3
d139f4d0 (PASS that shipped the null-edit-prompt orphan, #2143; false-negative probe)
- protoAgent#2138 r1
550c5497 / r2 4790614 (the disregarded-evidence escalation; honesty probe)
- protoAgent#2150 r2
fb6b98d5 (fabricated finding refuted by its own sibling finding; false-positive probe)
Grows toward ~20 from the #24 dataset. The reviewed SHA is pinned per round — ground truth is only valid against the blob it was graded on.
Non-goals
- No new grounding/verification logic — the point is to measure the panel as deployed.
- No GitHub writes. Replay must be side-effect-free so it can run repeatedly (per model, per trial) from CI or a cron.
- Determinism is not expected; the scorer treats small deltas as noise. A
trial field in the run header is enough.
Scoring happens lab-side (score_ab.py — precision with the #24 grounding-method exclusions, recall incl. false-negative rows, dishonest-disposition + disregarded-evidence counters, severity split, truncation rate). First milestone once this lands: fast vs smart over the manifest.
Plugin-side half of protoLabsAI/protoLab#26 (see the design comment there: the model-swap gate runs the panel end-to-end, not the raw model). The lab side is done — scorer, run-output contract, and a pinned replay manifest live at
protoLab:evals/review-eval/. What's missing is the runner: a way to invoke the panel outside the live-PR path.What replay mode is
Run the full panel (finders + verify pass + guards, unchanged) against a checkout + diff at a pinned SHA, with:
protoLab:evals/review-eval/SCHEMA.md(run header, per-review findings with severity/file/line/disposition, plus telemetry)protolabs/fastvsprotolabs/smart) — this is the entire A/B knobgrounding_checked,unaccounted,converge_reason) plus token accounting and atruncatedflag. Truncation is first-class:findings=[] && truncatedmust be distinguishable from a clean pass — thefastincident (6k reasoning tokens, no final answer) is exactly what the scorer needs to see.Input
protoLab:evals/review-eval/replay_manifest.jsonl— currently 6 pinned rounds, all SHAs verified against theprotoreview[bot]review markers:7e62cd80(FAIL — the planted event-loop major, catch probe) and r2a71d2ec8(the hallucinated PASS with the defect still present → shipped as #2210; false-negative + honesty probe)d139f4d0(PASS that shipped the null-edit-prompt orphan, #2143; false-negative probe)550c5497/ r24790614(the disregarded-evidence escalation; honesty probe)fb6b98d5(fabricated finding refuted by its own sibling finding; false-positive probe)Grows toward ~20 from the #24 dataset. The reviewed SHA is pinned per round — ground truth is only valid against the blob it was graded on.
Non-goals
trialfield in the run header is enough.Scoring happens lab-side (
score_ab.py— precision with the #24 grounding-method exclusions, recall incl. false-negative rows, dishonest-disposition + disregarded-evidence counters, severity split, truncation rate). First milestone once this lands:fastvssmartover the manifest.