Contract checks
Catches: Malformed output: broken JSON, a missing field, or a tool call with the wrong argument shape.
Blind to: Whether a well-formed answer is correct.
Runs when: Every request, inline, before the response is used
Six layers, 24 named checks, five ways an LLM judge lies, and the numbers worth putting on a dashboard. This is the discipline behind the evaluate stage of the Handbook. It is not a pitch for a tool.
A demo proves a system can work once, on the cases you picked to show it off. An eval proves it works on the cases you do not pick. A real user sends those cases, and they include cases that broke the system before. Most teams ship on vibes and find the regression in production. They cannot say whether the fix helped, because nothing measured the system.
Evaluation isn't one gate. It's a stack of layers, and each one catches a class of failure the layer below it is blind to. Skipping a layer doesn't lower your score. It means you stop measuring that class of failure entirely, and find out about it in production instead.
Each layer catches something the one below it can't see. None of them replace each other.
Catches: Malformed output: broken JSON, a missing field, or a tool call with the wrong argument shape.
Blind to: Whether a well-formed answer is correct.
Runs when: Every request, inline, before the response is used
Catches: A prompt, model, or retrieval change that makes real cases worse without notice.
Blind to: Retrieval quality in isolation, and any case shape the set doesn't include.
Runs when: Every change to a prompt, model, or retrieval config, in CI
Catches: The retriever handing the generator the wrong context, or none at all.
Blind to: How well the generator uses good context once it has it.
Runs when: Alongside golden-set evals, scored as its own number
Catches: An agent that loops, calls the wrong tool, or never terminates.
Blind to: Whether the final answer, once it stops, was any good.
Runs when: Pre-release, against scripted multi-step scenarios
Catches: Everything the offline suite never saw, because this is real traffic.
Blind to: Anything that fails silently and never gets reported or escalated.
Runs when: Continuous, on live production traffic
Catches: Prompt injection, jailbreaks, PII leakage, and tool misuse, under deliberate attack.
Blind to: Ordinary quality; it only answers whether the system can be made to misbehave on purpose.
Runs when: Pre-release, and after any change to tools or the system prompt
Filter by when it runs (pre-merge, pre-release, continuous), then copy the visible list as a Markdown checklist.
Showing all 24 checks
The cheapest layer, and the one most teams already half-have: does the response even parse. A schema check can't tell you the answer is right. It only tells you the answer is shaped the way the next piece of code expects. A wrongly-shaped response breaks that next step, even when the content was good. This check runs on every request, in production and in CI.
The layer most people mean when they say "we have evals." It is a fixed, labelled set of real cases. Each case carries a checkable pass/fail condition, run as a required CI gate. It answers "did this change help or hurt" with a number. A re-run of two examples from an open tab cannot do that. It says nothing about a case shape the set never included. The next four layers exist for that reason.
Retrieval and generation fail independently, so they need separate scores. Otherwise a regression in one hides behind a passing average from the other. Recall@k, precision, and groundedness are measured against the retrieved chunk itself, before the generator ever gets a turn. Only this tells "a bad answer" apart from "a good answer to the wrong context."
Once a system takes more than one step, the run itself needs a grade. That grade is separate from the answer at the end. Did it terminate? How many steps did it take, which tools did it call, at what cost? A trajectory eval catches the run that technically reached a correct answer by way of three unnecessary tool calls and a near-infinite retry. That defect is invisible to the golden-set layer above, because it only grades the final output.
No offline set, however carefully built, covers every input that production sends to the system. This is the layer that measures what happens once it does. It tracks task completion, escalation to a human, and how much a person had to edit an accepted answer. It also tracks cost, latency, and whether any of those numbers drift over time. This is production truth. It is not a proxy.
A system can pass every quality check above and still do something it should not do, because none of those checks tried to attack it. This layer runs the labelled, adversarial equivalent of the golden set: injected instructions, known jailbreak patterns, PII-extraction attempts. It runs against the same tool-enabled path a real user reaches. It answers a narrower question than the rest of the stack.
No checks match that combination. Clear a filter to see more.
One case, wrong then right: a substring guess against deterministic checks with the judge scoped to tone.
One case checks a substring and asks a judge whether the answer is good. The other checks the contract first, and saves the judge for tone.
case: refund_policy_question
input: "How do refunds work?"
assert:
- type: contains
value: "30 days"
judge_prompt: "Is this a good answer?" A single substring assertion, and a judge prompt that asks an open, unscoped question with no rubric behind it.
case: refund_policy_question
input: "How do refunds work?"
assert:
- type: schema
value: refund_answer.schema.json
- type: cites_source
value: refund-policy-v3
- type: tool_called
value: get_refund_policy
judge:
rubric: tone_matches_support_voice
scope: tone_only
weight: advisory Deterministic assertions on the schema, the citation, and the tool call, with the judge scoped to tone only.
Every one of these produces a wrong number that looks right. None looks broken.
Looks like: A judge from the same model family as the generator rates that family's output higher across the board. It gives no stated reason.
Guardrail: Use a judge from a different model family than the generator, or budget for periodic cross-family spot checks.
Looks like: In a side-by-side comparison, the judge favors whichever answer it saw first, or second, regardless of content.
Guardrail: Randomize answer order per comparison and average both orderings before trusting a verdict.
Looks like: The longer answer wins even when it says the same thing at greater length.
Guardrail: Score against a rubric that names length as a non-factor explicitly, and spot-check whether shorter correct answers are losing to longer ones.
Looks like: The same rubric, applied a month apart, grades a static test case differently. The judge model or its default settings changed underneath you.
Guardrail: Pin the judge model and version; treat a judge upgrade as a breaking change that needs re-baselining. It is not a free improvement.
Looks like: The judge's pass rate looks stable, and nobody has checked it against a human rater in months.
Guardrail: Re-run a human-labelled holdout against the judge periodically and confirm agreement, beyond internal consistency.
Every one of these is measurable today. None of them is trustworthy read alone. Pair it with the number next to it.
This page has no invented benchmark numbers and no client names. It uses what this site already documents.
The benchmark suite our check bank draws its evaluation method from. Retrieved 2026-08-24.
The risk-management functions our governance and adoption controls map onto. Retrieved 2026-08-24.
The generative-AI extension to the framework our eval and security controls reference. Retrieved 2026-08-24.
A Ship Audit runs this stack against your specific system and tells you which layers are live risks. It does not list the layers that are only incomplete in theory.
What teams ask us before they scope an eval stack.
50–100 real cases is a reasonable starting bar, pulled from production traffic and past incidents rather than invented. See the golden-set layer above. A held-out slice the prompt author never sees matters more than raw count.
Link to this answer: How big does a golden set need to be?No. Start with contract checks and a golden-set gate in CI. Both are cheap and catch the two failure modes that do the most damage. Add trajectory and adversarial evalsAn eval suite is a versioned set of test cases that measures whether outputs are good. once there's an agent and real tool access worth protecting.
Link to this answer: Do we need all six layers on day one?Yes, with guardrails: pin the judge model and version, randomize comparison order, and calibrate against a human-labelled holdout periodically. See the five ways a judge lies above; each one is a way a judge score can look fine while being quietly wrong.
Link to this answer: Can we use an LLM to judge our own output?Evals catch a regression before it ships. Observability, the online-signals layer, catches the one that got through anyway. Neither replaces the other.
Link to this answer: What's the difference between an eval and observability?Scope it to what the feature can do. A read-only summarizer needs few of the retrieval and trajectory layers. A system that sends messages or issues refunds needs the full stack, with adversarial checks.
Link to this answer: Isn't this a lot of infrastructure for a small feature?That page is the three-step summary. This is the full stack behind it. It has six layers, 24 named checks, the ways a judge lies, and the numbers worth putting on a dashboard.
Link to this answer: How is this different from the eval methodology on Capabilities?Source: https://customlabs.io/evals/