Read the Scorecard: Intervals, Gates and a Frozen Baseline
A scorecard that says 87% can hide that 60 cases cannot support it. An LLM evaluation scorecard in ai-eval: every rate with its 95% interval, gates on the lower bound, and a regression gate on the largest drop in the total or any failure mode.
Key takeaways
- Every rate carries a 95% Wilson interval, and a gate compares the lower bound, so 52 of 60 against a 0.80 gate is NOT-EVALUABLE, not a pass.
- A suite is FAIL if any gate fails, PASS only if every gate passes, and NOT-EVALUABLE otherwise, including for a gate the runner cannot measure.
- The runner exits 0 for PASS, 1 for FAIL or a preflight STOP, 3 for NOT-EVALUABLE and 4 when aborted on the budget.
- A frozen baseline records the system, model, prompt, dataset, judges and each failure mode's rate, and the regression gate fails on the largest drop in the total or any one mode.
- From ai-eval 1.4.0, a layer the profile's risk tier makes mandatory but its layer table leaves off is lint error E024; production monitoring, L6, is specified but not built.
Contents
FAQ
Why not just report the pass rate?
A pass rate without an interval hides how many cases it rests on. 52 of 60 is 0.867, but its lower bound is 0.758, so against a 0.80 gate the run cannot answer.
What does /eval-audit check?
Whether the numbers are safe to act on: an unvalidated judge in a gated suite, a gate on a point estimate, too few cases, leakage from the dataset into a prompt, an open failure mode with no case, and a suite that has stopped discriminating.
Sources
Only you and the owner see your answer and rating. Send private feedback
Enjoyed it? Support fx-blog with a coffee.
Related posts
Who Checks the AI Judge? Calibrate It Before It Gates
A judge that agrees with your reviewers 60% of the time produces numbers that look like a good one. LLM judge validation in ai-eval: held-out labels, rates computed by calibrate.py, and a lint that fails any gate on an unvalidated judge.
Read 100 Real Traces Before You Write One Test
Most LLM test suites measure failures their author imagined. LLM error analysis in ai-eval: read real traces, name failure modes that need three trace references each, and build a dataset with at least 30% real inputs.
An AI Eval Pipeline That Can Say NOT-EVALUABLE
A quality number for an AI feature means little when nobody can say who checked the judge, how many cases it rests on or how sure it is. Five questions to ask of any setup, and the route ai-eval takes from traces to a scorecard that can say NOT-EVALUABLE.
Comments
Oldest firstNo comments yet. Start the conversation.
Part 3, Who Checks the AI Judge? Calibrate It Before It Gates, ended with both judges validated and the orders support assistant ready to run on 220 cases (sample). This part reads what that run reports, and when it still says NOT-EVALUABLE.
This series, in four parts:
Every number labelled "sample" comes from the illustrative scenario in the bundle's showcase,
docs/showcase/pipeline.html, not from a measured product.A rate is a range, so three runs get three verdicts
Take one gate, 0.80, and three sample runs.
stats.pycomputes each interval with the Wilson method.A dashboard showing only 87% would call run B a pass. Its lower bound is 0.758, so the run could not answer. More cases fix that, not a rerun.
Declare every gate, and each one counts
Gates live in the suite file, each on the metric its name says. The seed suite carries these lines commented out, ready to switch on:
Every declared gate is evaluated. The suite is
FAILif any gate fails,PASSonly if all pass, andNOT-EVALUABLEotherwise, including for a gate the runner cannot measure. The exit codes follow: 0 PASS, 1 FAIL or a preflight STOP, 3 NOT-EVALUABLE, 4 aborted on the budget. A gated suite must also name itssystem_version(the runner never fills it in), and below 30 cases it is refused, as part 1'sSTOPshowed.A frozen baseline catches what a total hides
/eval-report --freezewritesBASE-<id>, a record of the system, model, prompt, dataset and judges, plus the rate of each failure mode. A later change is compared to it:The comparison is paired, case against itself, so the answer is a difference with its interval: no change we can detect. The regression gate takes the drop in the total and in each failure mode, and fails on the largest one. A steady total can hide one failure mode collapsing while another improves.
Where it stops: layers, board and limits
The profile sets a risk tier, and the tier's table names the layers that are mandatory:
The README and the profile said a mandatory layer left off was an error. While checking this post against the code I found lint never looked, so I fixed the code rather than the sentence: from ai-eval 1.4.0, a mandatory layer left off in
§Layersis lint error E024. The orders support assistant is tiermedium, and the profile template ships with L3 and L4 off, so setting the tier is enough to see it:L4 gets the same error. The npm bundle is still 1.3.0 and does not check this yet.
Start with L0: it makes no model calls, runs in under ten seconds and is gated at 100%. The VS Code board reads
.evals/state.json, never writes a file, and shows NOT-EVALUABLE as itself. L6, production monitoring, is not built:/eval-monitorstops with a phase note.Try it
/eval-auditasks one question: are these numbers safe to act on? Run it before you trust a suite someone else wrote, and once a quarter after that.Read this with your AI