multivon-eval validate also grades your eval. Anthropic’s guidance is blunt about why: a 0% pass rate usually means a broken task or a miscalibrated grader, not an incapable agent. When the CORE-Bench authors ran their own reference solutions through their own harness, only 42% passed — fixing the tasks and graders took it to 95% without touching any model.
The mechanism is the same as a reference solution in a coding benchmark: for every task that carries a known-good output, run the suite’s graders against that output. If the known-good answer fails, the task is unsolvable or the grader is miscalibrated — either way, the agent is innocent.
Two guarantees:
- validate never calls the model under test. It scores references, not generations.
- By default it makes zero LLM calls at all. Judge-backed graders are skipped unless you opt in with
--judges.
reference_output
The reference for each task resolves in order:
EvalCase.reference_output— a new additive field (0.16.0): a string, or a callable(case) -> strinvoked at validate time. A raising callable marks the task BROKEN with the traceback — never a silent skip.EvalCase.expected_output— the field you probably already set.
reference_output exists for tasks where the grading target and the literal expected string differ (e.g. a judge-graded task where any well-formed answer should pass). It is deliberately excluded from the lockfile cases_hash, so adding references does not invalidate historical suite locks.
Tasks with neither field are UNVALIDATABLE — listed with a nudge, never silently dropped.
Running it
Contains(["30 days"]) grader applied to a support-contact task can never pass, no matter how good the agent is. That grader/task combination would have silently dragged the pass rate down forever.
Or from the CLI, pointing at the Python file that defines your suite:
suite.run(...) executes your model at
import time, and the never-calls-your-model guarantee depends on the guard:
What the verdicts mean
| Verdict | Meaning | Breaks CI? |
|---|---|---|
OK | The reference passes every grader that ran. | No |
BROKEN_TASK_OR_GRADER | The known-good reference fails at least one grader. The task is unsolvable or the grader is miscalibrated; the reason carries the grader’s own explanation. | Yes — exit 1 |
NO_DISCRIMINATION | A grader passes both the reference and a known-bad output — it contributes zero information on this task. | No — warning |
UNVALIDATABLE | No reference to check against (add expected_output or reference_output), no grader executed on the case (e.g. all graders judge-backed in offline mode — rerun with --judges), or the judge was unreachable while grading. | No — warning |
NOTHING_VALIDATED and the exit code is 1, never a green PASSED.
The discrimination check
Tasks generated with contrast twins (generate_contrast_pairs, linked via metadata['pair_id']) get a second check for free: the deterministic graders also run against the twin’s known-bad output. A grader that passes both the reference and the known-bad twin cannot tell good from bad on that task — flagged NO_DISCRIMINATION, and the summary reports effective informative cases: N/M validated so you know how much of your suite actually carries signal. Zero LLM calls in the default offline mode — the discrimination rerun excludes judge-backed graders unless you opt in with --judges, in which case their spend is tracked with the rest. Disable with --no-contrast / contrast=False.
Judge-backed graders and cost
LLM-judge graders are skipped by default — validate is a free, offline audit, and the report names what it skipped:--judges (CLI) or suite.validate(include_judges=True) opts in: judge graders run against every reference, and the spend is tracked and printed. Expect the same per-case judge cost as a normal run (QAG graders make several judge calls per task), minus the model calls — you are paying to grade references, not generations.
A suite whose graders are all judge-backed therefore validates nothing in the offline default: every case lands UNVALIDATABLE (“all graders are judge-backed; rerun with —judges”) and the report exits NOTHING_VALIDATED, not PASSED. A judge outage during a --judges run also marks affected cases UNVALIDATABLE (infrastructure), never BROKEN_TASK_OR_GRADER — only genuine grader verdicts may indict a task.
Zero-pass suspects in normal runs
Validation has a companion heuristic in everysuite.run() report (0.16.0): EvalReport.zero_pass_cases lists evaluated tasks that failed every trial under runs > 1 — or every failing task when a single-run suite lands at exactly 0%. The report footer flags them:

