POST /v1/evals with eval_kind: "criterion") grades each model’s fresh answers pass/fail and reports two
numbers per model: the judge’s observed pass rate, and the Rogan–Gladen
corrected rate, what a human would most likely have scored given the
judge’s measured error rates, each with a 95%
interval. When a judge has no usable signal (TPR + TNR ≈ 1), Omnia refuses
to correct rather than amplify noise.
Assertions are the deterministic half: json_valid, json_schema
(full JSON Schema: minItems, pattern, additionalProperties and the
rest are enforced), regex_match, contains, not_contains, max_length,
min_length, and completed. Free, exact, validated at creation, and run
against every generated response.
completed fails any output cut off by the token limit
(finish_reason: length) or a reasoning trace that never produced a final
answer. This is the failure every text-reading judge misses (a truncated
answer is usually fluent right up to the cliff), so results also report
a mechanical cut-off count per model whether or not you add the
assertion.
The CI gate
GET /v1/evals/{id}/gate turns any finished run into a deploy decision:
The certified switch test
When the decision is “replace the model behind this traffic”, run the comparison in its strictest shape: set the baseline to the literal__stored__. Your logged answers become the incumbent arm; the judge grades
what you actually shipped against fresh candidate answers on the same prompts,
and three extra rules apply:
- A calibrated judge is required. No trusted instrument, no run.
- Population matching is strict. Where an ordinary run warns when the judge’s calibration population and the sampled traffic don’t match, a certified run refuses: a switch decision must be measured on the population it will affect, not a blend.
- The gate is a noninferiority test, not a raw comparison. The margin is scaled by
the judge’s own measured error (its Youden index), so a noisier judge must
clear a wider bar. If the sample is too small to conclude at that bar, the
gate answers
412(underpowered, refused) instead of pretending.