Skip to content

Add CI validation that eval case annotations reference valid judges #374

Description

@fullsend-ai-retro

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:

  1. Parses eval.yaml to extract the set of defined judge names from the judges list.
  2. 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).
  3. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions