What happened
PR #197 added a new eval case 002-line-accuracy whose annotations.yaml referenced a line_accuracy judge. This judge does not exist in eval/review/eval.yaml, which defines only 5 judges (review_quality, required_labels, forbidden_labels, max_turns, max_cost). The expected_findings block in the annotations also had no consumer — no judge reads or validates it. The human Review Squad caught this as a HIGH finding; the automated review agent did not detect it across 4 review runs. The PR was ultimately closed without merging, but the structural issue would have made the eval case non-functional even if merged.
What could go better
Eval cases are configuration that references other configuration (judges defined in eval.yaml). When a case references a nonexistent judge, it silently measures nothing — there is no runtime error, just a gap in coverage that looks like it's covered. This is analogous to a test file that imports a nonexistent test fixture: it should fail at lint/CI time, not pass silently.
Currently, eval case YAML files are not structurally validated against the eval framework definition. The Makefile has lint targets for other config (harness configs, schemas) but not for eval cases. Confidence is high that this gap exists — I verified eval/review/eval.yaml contains no line_accuracy judge, and no CI job validates judge name references in annotation files.
Proposed change
Add a CI validation step (e.g., a make lint-eval target or a script in scripts/) that, for each eval suite:
- Parses
eval.yaml to extract the set of defined judge names from the judges list.
- Scans each case's
annotations.yaml for judge-name references (keys under thresholds, fields referencing judges, or any identifier that should match a judge name).
- Fails with a clear error if any annotation references a judge not defined in
eval.yaml.
The script should be added to the CI workflow (alongside existing lint targets) so it runs on every PR that modifies files under eval/. The validation should also check that thresholds keys in eval.yaml reference defined judges (bidirectional consistency).
File locations: new script at scripts/lint-eval-cases.sh (or Python equivalent), with a lint-eval target in Makefile, wired into the CI workflow.
Validation criteria
After implementation: (1) Creating an eval case that references a nonexistent judge name should cause CI to fail with a descriptive error message. (2) The existing empty eval cases directory (just .gitkeep) should pass validation. (3) If/when eval cases from agents#209 or agents#245 are reintroduced, this check should validate their judge references before merge.
Generated by retro agent from #197
What happened
PR #197 added a new eval case
002-line-accuracywhoseannotations.yamlreferenced aline_accuracyjudge. This judge does not exist ineval/review/eval.yaml, which defines only 5 judges (review_quality,required_labels,forbidden_labels,max_turns,max_cost). Theexpected_findingsblock in the annotations also had no consumer — no judge reads or validates it. The human Review Squad caught this as a HIGH finding; the automated review agent did not detect it across 4 review runs. The PR was ultimately closed without merging, but the structural issue would have made the eval case non-functional even if merged.What could go better
Eval cases are configuration that references other configuration (judges defined in
eval.yaml). When a case references a nonexistent judge, it silently measures nothing — there is no runtime error, just a gap in coverage that looks like it's covered. This is analogous to a test file that imports a nonexistent test fixture: it should fail at lint/CI time, not pass silently.Currently, eval case YAML files are not structurally validated against the eval framework definition. The
Makefilehas lint targets for other config (harness configs, schemas) but not for eval cases. Confidence is high that this gap exists — I verifiedeval/review/eval.yamlcontains noline_accuracyjudge, and no CI job validates judge name references in annotation files.Proposed change
Add a CI validation step (e.g., a
make lint-evaltarget or a script inscripts/) that, for each eval suite:eval.yamlto extract the set of defined judge names from thejudgeslist.annotations.yamlfor judge-name references (keys underthresholds, fields referencing judges, or any identifier that should match a judge name).eval.yaml.The script should be added to the CI workflow (alongside existing lint targets) so it runs on every PR that modifies files under
eval/. The validation should also check thatthresholdskeys ineval.yamlreference defined judges (bidirectional consistency).File locations: new script at
scripts/lint-eval-cases.sh(or Python equivalent), with alint-evaltarget inMakefile, wired into the CI workflow.Validation criteria
After implementation: (1) Creating an eval case that references a nonexistent judge name should cause CI to fail with a descriptive error message. (2) The existing empty eval cases directory (just
.gitkeep) should pass validation. (3) If/when eval cases from agents#209 or agents#245 are reintroduced, this check should validate their judge references before merge.Generated by retro agent from #197