Skip to content
fx-blog

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.

Harry4 min readBeginner
  • Judgment
  • Verification
MarkdownSave

Key takeaways

  • A quality number from an AI feature is a guess unless you know who checked the judge, how many cases it rests on and how sure the number is.
  • Ask five questions of any AI-evaluation setup: were real traces read, was the judge calibrated, does the gate read an interval, is change judged per failure mode, can it say it cannot tell.
  • ai-eval takes your traces and one profile file through seven steps, scope to report, and outputs a scorecard with one verdict per suite.
  • A suite has three verdicts, PASS, FAIL and NOT-EVALUABLE, and the seed suite returns NOT-EVALUABLE with exit code 3 even though 9 of 9 attempts passed.
  • ai-eval measures only: defects and sign-off stay in the QA bundle, and production monitoring is specified but not built.
Contents

TL;DR Your AI feature has a quality number, and nobody can say who checked the judge behind it, how many cases it rests on or how sure it is. ai-eval is an AI evaluation pipeline for Claude Code. Only here: a run can end NOT-EVALUABLE, exit code 3, even when 9 of 9 attempts passed.

Do this: Install with npx agentic-fx@latest install --bundle eval, run the seed suite, and read why 9 of 9 still ends NOT-EVALUABLE.

Your orders support assistant tells a customer that order 881234 is out for delivery. The order tool returned nothing, and the assistant made the id up. You add test prompts, an LLM grades them, the dashboard turns green, and a review quotes the number.

This series, in four parts:

  1. An AI Eval Pipeline That Can Say NOT-EVALUABLE (you are here)
  2. Read 100 Real Traces Before You Write One Test
  3. Who Checks the AI Judge? Calibrate It Before It Gates
  4. Read the Scorecard: Intervals, Gates and a Frozen Baseline

Five questions to ask of any AI-evaluation setup

The usual setup is imagined prompts, a model that grades the answers, and one percentage. Ask these five of it, and of this pipeline:

  1. Did anyone read your real traces first? Otherwise the tests cover failures you imagined.
  2. Was the judge scored against human labels it never saw? An uncalibrated judge produces numbers that look real.
  3. Does every rate carry an interval, and does the gate read its lower bound? Otherwise a lucky run passes.
  4. Is a change judged per failure mode? A flat total can hide one failure collapsing.
  5. Can it answer "I can't tell"? If the only outputs are green and red, it is guessing.

How ai-eval works: input, process, output

Two things go in: your production traces and one config file, .claude/EVAL-PROFILE.md. Then seven slash commands run in Claude Code. Each writes a file the next one reads, and each refuses one shortcut.

Step Command Writes Refuses
1 Scope /eval-scope system-card.md, the rules that must never break a rule nobody can test
2 Explore /eval-explore failure modes coded from about 100 real traces tests for imagined failures
3 Data /eval-data an immutable dataset, at least 30% real traces a dataset made of guesses
4 Judge /eval-judge a code assertion first, a judge only if needed a judge where code would decide
5 Validate /eval-validate validation.md, the judge scored on unseen labels an unproven judge in a gate
6 Run /eval-run repeated cases, every rate with a 95% interval one lucky run
7 Report /eval-report the scorecard; --freeze fixes a baseline a regression hidden in an average

What comes out is one verdict per suite, PASS, FAIL or NOT-EVALUABLE, with the gate that decided it. The board in VS Code shows the same thing.

One real run: nine passes, no PASS

The bundle's seed suite, task-example, has three cases repeated three times on a stub adapter that calls no model. It shows the verdicts, not a model's quality.

textpython3 .evals/scripts/shared/runner.py --suite task-example
NOT-EVALUABLE — task-example 2026-10-30-0537 (decided by no gate declared)
pass^1 1.000 [0.701, 1.000] (n=9)
pass^3 1.000 [0.439, 1.000] (n=3)
flaky  0.000 [0.000, 0.561] (n=3)

Every attempt passed. Exit code 3. Nine attempts cannot rule out a true rate near 70%, and nobody declared what the suite must reach. (pass^1 is the rate per attempt, pass^3 the rate per case.)

I shipped the seed suite with no gates on purpose. A suite earns a gate only once the evaluators that decide it can be trusted, so until then the seed reports numbers and never a PASS. Add a gate to this three-case suite anyway and the runner refuses:

textthe same suite with gates: pass_1_ci_lower: 0.80 (first line of the output)
STOP: gated suite runs on 3 cases. Below 30, a gate cannot distinguish a real regression from sampling noise (EVAL-CONTRACTS 8.3).

The ai-eval board on the seed project after a real run: task-example is NOT-EVALUABLE and ungated, pass^3 100% with a 95% interval of 43.9% to 100% over 3 cases

Install it, and what it does not do

Try it
cd your-project
npx agentic-fx@latest install --bundle eval

You need Node 20+, Python 3 and Claude Code. The installer adds the .evals/ workspace with the seed above, and the VS Code board.

Try it

Try it
python3 .evals/scripts/shared/lint_evals.py
python3 .evals/scripts/shared/runner.py --suite task-example

Then fill .claude/EVAL-PROFILE.md. The assistant invented order 881234 in one trace, but you do not know how often. Part 2, Read 100 Real Traces Before You Write One Test, finds out before a test is written.

Read this with your AI

textPaste into your AI
Read the post "An AI Eval Pipeline That Can Say NOT-EVALUABLE".
1. Summarise it in 5 bullets for an engineer who ships an LLM feature.
2. Ask me 3 questions to check I understood; wait, then correct me.
3. Answer the five questions in the post for my current evaluation setup.

FAQ

Does ai-eval fix the failures it finds?

No. It measures. Defect lifecycle, quarantine and release sign-off stay in the QA bundle, and the evidence is handed over with /eval-signoff.

What do I need to run it?

Node 20 or later, Python 3 and Claude Code. The command npx agentic-fx@latest install --bundle eval adds the commands, the .evals workspace with a seed that lints clean and the VS Code board.

Sources

  1. ai-eval on GitLab
  2. agentic-fx on npm

Was this useful?

Only you and the owner see your answer and rating. Send private feedback

Enjoyed it? Support fx-blog with a coffee.

Comments

Oldest first

No comments yet. Start the conversation.

You sign in first; what you typed stays here. · 0 / 2,000