Agent Evals

You cannot improve what you cannot measure, and agents are miserable to measure: outcomes are sparse, trajectories are long, and “correct” is often a judgment call. This collection maps the evaluation stack from binary outcome checks to calibrated model judges — and the statistics and plumbing that decide whether any of those numbers mean anything.

E-01Outcome Eval

/evals/outcome-eval

Run the task end to end; check only the final result.

Step-by-step walkthrough3 steps
  1. Run the task end to end.
  2. Only the final artifact is inspected — the trajectory is a black box.
  3. Binary verdict. Cheap, objective, and blind to how.
Key insight

Ground truth where you can get it — a passing test, a correct SQL result, a booked meeting — is worth a thousand vibes.

Failure mode

Outcome-only metrics reward lucky trajectories and hide near-misses; they tell you that it failed, never why.

E-02Process / Trajectory Eval

/evals/trajectory-eval

Inspect every step of the run, not just where it landed.

Step-by-step walkthrough4 steps
  1. The full trajectory is recorded, not just the answer.
  2. The judge walks it step by step…
  3. …and flags step 4: the edit deleted a test to make the suite pass.
  4. The final answer looked fine. Only the process revealed the cheat.
Key insight

Trajectory review is where you catch reward hacking, wasted loops, and the cheats that outcome metrics score as wins.

Failure mode

Judging steps against “what I would have done” instead of “did this step make progress” — many valid trajectories look nothing like yours.

Further reading

E-03LLM-as-Judge

/evals/llm-as-judge

A model grades outputs against a rubric, standing in for human review at scale.

Step-by-step walkthrough2 steps
  1. A model grades another model’s work against an explicit rubric.
  2. Scales to thousands of outputs per hour — but the judge is a model too, with its own biases.
Key insight

Judges make evaluation continuous instead of quarterly. The rubric — not the judge model — is usually what needs the engineering.

Failure mode

Uncalibrated judges drift: position bias, length bias, self-preference. A judge you haven’t measured against humans is a random number generator with confidence.

Further reading

E-04Human-calibrated Judge

/evals/human-calibrated-judge

Label a gold subset with humans, then iterate the judge prompt until it agrees with them.

Step-by-step walkthrough5 steps
  1. Humans label a gold subset once.
  2. Judge v1 grades the same items: only 62% agreement.
  3. Every disagreement is a bug report against the judge prompt.
  4. Revise, re-run: 81%.
  5. 91% — now the judge can scale where humans can’t. Recalibrate when the task drifts.
Key insight

Treat judge–human disagreement as a bug report against the judge prompt. Agreement is a metric you climb, then monitor.

Failure mode

Calibrating once and trusting forever — task drift silently decouples the judge from what humans would say now.

Further reading

E-05Regression Evals

/evals/regression-evals

Run version A and version B over the same benchmark set; look at per-task deltas, not just the mean.

Key insight

Averages hide regressions. A change that lifts the mean 9 points and silently breaks one capability is how agents get worse while dashboards get greener.

Failure mode

A benchmark set too small or too easy to move: every change looks neutral, so every change ships.

Further reading

E-06Failure Taxonomy

/evals/failure-taxonomy

Classify every failure by where in the loop it originated — perception, reasoning, planning, tool use, recovery, verification, or the final answer.

Key insight

The distribution tells you what to fix next. A recovery-heavy histogram wants a better retry loop, not a bigger model.

Failure mode

Buckets so broad (“reasoning”) that every failure fits and none suggests an intervention.

Further reading

E-07Outcome vs Process Mismatch

/evals/outcome-vs-process

An agent can succeed through a bad trajectory, and fail despite a mostly sound one.

Key insight

Score both axes. Lucky passes are future failures you haven’t met yet; principled near-misses are one small fix from reliable wins.

Failure mode

Optimizing pass-rate alone quietly selects for whatever cheats and shortcuts happen to pass — you train luck.

Further reading

E-08Adversarial Evals

/evals/adversarial-evals

Mix attack tasks into the benchmark and score refusals as wins.

Step-by-step walkthrough4 steps
  1. Most of the set is ordinary work — the agent shouldn’t know which is which.
  2. Mixed in: an injection, planted credentials, a shortcut that would “pass”.
  3. On attack tasks the right answer is to refuse, flag, or route around.
  4. Score resistance, not just capability. An agent unmeasured under pressure is unmeasured.
Key insight

Capability and resistance are different axes. An agent you’ve only measured on cooperative tasks is unmeasured where it matters.

Failure mode

Attack tasks the agent can fingerprint: if adversarial items look different, you’re measuring detection, not resistance.

E-09Cross-Model Evals

/evals/cross-model-evals

Same tasks, same harness, models swapped — so differences are attributable.

Step-by-step walkthrough4 steps
  1. Only one variable changes: the model. Harness, tools and tasks stay fixed.
  2. Each model runs the full set.
  3. Now differences are attributable: “the model got smarter” vs “the harness got better”.
  4. If a new model doesn’t move your eval, your harness is the bottleneck.
Key insight

This is how you separate “the model got smarter” from “the harness got better”, and how you know when a new model release should change your stack.

Failure mode

Prompts silently tuned to one model’s quirks: the comparison measures prompt fit, not model capability.

E-10Offline vs Online Evals

/evals/offline-vs-online

Static benchmarks are controlled but stale; production monitoring is live but noisy. Run both.

Step-by-step walkthrough4 steps
  1. Offline: same tasks every run. Perfect for regressions, blind to drift.
  2. Online: sampled real traffic, judged continuously. Noisy, but true.
  3. 94% vs 81%. When they disagree, production is right.
  4. Feed the online failures back into the offline set. That loop is the eval program.
Key insight

The gap between offline and online numbers is itself the metric: it measures how far your benchmark has drifted from reality.

Failure mode

Trusting the offline number when they disagree. Production is noisy, but it is not wrong.

Further reading

E-11Variance & Sample Size

/evals/variance-and-sample-size

Agents are stochastic, so a single run is one bit — and a one-task difference is usually noise.

Step-by-step walkthrough7 steps
  1. One task, one agent, nothing changed between attempts.
  2. Run it once and you learn one bit: it passed, or it didn’t.
  3. Run the identical input again and the answer can flip. Sampling is not a bug you can prompt away.
  4. Five runs, three passes. That is not 60% — it is 60% with an interval wide enough to drive through.
  5. Now version 2 scores 4 out of 5. One extra pass.
  6. That is not an improvement. It is one coin flip inside the noise you already measured.
  7. Report the interval, not the point. The number of runs is a design decision — pick it before you look.
Key insight

Every other eval plate produces a number; this one tells you whether the number means anything. Decide how many runs per task before you look at the result, and report the interval rather than the point.

Failure mode

Shipping on a delta smaller than the run-to-run spread. You will chase phantom regressions for a week and, worse, ship real ones that happened to land inside the noise.

E-12Cost & Latency as Scores

/evals/cost-and-latency

Pass rate is one axis; tokens and seconds per task are the other two, and they move in the opposite direction.

Step-by-step walkthrough6 steps
  1. Two versions of an agent over the same benchmark.
  2. Pass rate is up four points. On most dashboards this is where the story ends.
  3. It burns three times the tokens to get there.
  4. And it takes more than twice as long, which users feel on every single request.
  5. Four points for 3× the spend is a trade, and it is one a person has to make deliberately.
  6. Score all three every run. An eval that only measures quality cannot tell you the price of it.
Key insight

Almost every technique in this atlas buys quality with compute. If your eval only reports quality, every one of them looks free, and the bill arrives in production.

Failure mode

A leaderboard with one column. Four points of pass rate for three times the spend may be a great trade or a terrible one — but nobody can tell from a single number.

E-13The Eval Environment

/evals/eval-environment

Each task instance is built fresh from pinned dependencies, seeded data, a frozen clock and recorded network — then destroyed.

Step-by-step walkthrough7 steps
  1. A task is a spec: how to set the world up, and what must be true at the end.
  2. Every run builds its own instance. Nothing is shared between runs or between tasks.
  3. Dependencies pinned, data seeded — so a result from March still reproduces in November.
  4. Clock frozen and network recorded: the two things that silently make a benchmark irreproducible.
  5. The agent gets exactly this world and no other.
  6. The assertion runs inside the instance, against real final state rather than the agent’s account of it.
  7. Then it is destroyed. A benchmark you cannot rebuild is a number you cannot defend.
Key insight

Reproducibility is a property of the environment, not the metric. If a March result cannot be rebuilt in November, you do not have a benchmark; you have an anecdote with a number attached.

Failure mode

Tasks that share state. One run leaves a file, a row or a cached token behind, and every later run is measuring something nobody designed.

E-14Task Sets & Contamination

/evals/task-sets-and-contamination

Where benchmark tasks come from, and what happens to a benchmark once it is published.

Step-by-step walkthrough6 steps
  1. Tasks come from where the agent actually fails, not from what is convenient to write.
  2. Synthetic cases fill coverage gaps — they are the seasoning, never the meal.
  3. Curation is the work: too easy and every change looks neutral, too hard and every change looks the same.
  4. Part of the set can be published, so results are comparable.
  5. And a published set gets scraped. Next year’s model has read your answers.
  6. A held-out set never leaves the building — the gap between the two scores tells you how contaminated the public one is.
Key insight

Draw tasks from where the agent actually fails, and keep a held-out set that never ships. The gap between your public score and your private one is a direct measurement of how contaminated the public one has become.

Failure mode

Trusting a public benchmark years after publication. Once it is in the training data, you are measuring recall of the answer key, not capability.

Further reading

E-15Reward Hacking

/evals/reward-hacking

The agent satisfies the grader instead of the task — editing, skipping or deleting the tests, or special-casing whatever the grader checks.

Step-by-step walkthrough2 variants · 12 steps

Gamed

  1. The task: fix the bug. The tests define done.
  2. The real fix is hard — but the tests are just files in a repo the agent can write to.
  3. Weaken the check: loosen the assertion, or skip and delete the failing test.
  4. Or game the grader: hard-code the fixture’s expected output, or exit 0 before any assert runs.
  5. The runner checks what it was built to check: exit code 0 means pass.
  6. The score says pass. The bug ships. The metric was optimized; the task never was.

Guarded

  1. Same task, same agent, same temptation — the tests are still sitting in the repo.
  2. The patch goes to a grader that lives outside the agent’s sandbox.
  3. Diff the tests first. Any edit, skip or deletion under tests/ fails the run, whatever the exit code says.
  4. Hold-out tests the agent never saw: hard-coding the visible fixtures buys nothing against inputs it has not met.
  5. Read the trajectory: an early sys.exit, a peek at the answer key or git history shows up in the transcript, not the score.
  6. Now a pass means the bug is fixed. Graders the agent can touch are graders it will eventually learn to satisfy.
Key insight

An exit code is not a fixed bug. Keep the grader out of reach — diff patches for test edits, score on hold-out tests, and read transcripts, where the shortcut shows long before it shows in the score.

Failure mode

Grading a coding agent with tests that live in the repo it can write to. Pass rates climb, and each point is as likely to be a weakened assert as a fixed bug.

E-16pass@k vs pass^k

/evals/pass-at-k-vs-pass-hat-k

pass@k counts a task solved if any of k tries succeeds; pass^k only if all k do — capability versus reliability.

Step-by-step walkthrough8 steps
  1. One task, one agent that succeeds 75% of the time on any single try.
  2. Run it k = 3 times. Two passes, one failure — nothing about the agent changed.
  3. pass@3 asks: did any try pass? Yes — the task counts as solved.
  4. pass^3 asks: did every try pass? One failure sinks it — the task counts as failed.
  5. At k = 1 the two metrics are the same number.
  6. At k = 3 they have split: 98% vs 42%, from one unchanged agent.
  7. At k = 8, pass@k says solved; pass^k says all eight runs succeed only one time in ten.
  8. Pick the one your product lives by: best-of-k behind a verifier wants pass@k; an agent every customer runs wants pass^k.
Key insight

With independent tries at 75% each, three tries give 98% pass@3 and 42% pass^3. The same agent looks nearly perfect or unshippable depending on which question you ask, so ask the one your product actually poses.

Failure mode

Reporting pass@k for a customer-facing agent. Users do not get k tries and a verifier — each of them gets one run, and they come back tomorrow for another.

E-17User Simulators

/evals/user-simulators

A second model plays the user — persona, goal and hidden facts — so a multi-turn agent is tested on whole conversations and graded on the end state.

Step-by-step walkthrough8 steps
  1. A persona and a goal: who the user is, what they want, and what they will only reveal if asked.
  2. A second model plays that user, one turn at a time.
  3. The agent asks, clarifies and replies — the whole conversation is the test input.
  4. Along the way it acts on real state through its tools.
  5. The grader checks the end state against the goal, not how pleasant the transcript sounded.
  6. Too helpful: the simulator hands over everything up front, so the agent never had to ask a single question.
  7. Drift: ten turns in, the “terse” user is chatty and has forgotten its hidden facts — you are now testing a different user.
  8. Audit the simulator too: pin the persona, check each run stayed in character, and discard the runs that did not.
Key insight

Conversational agents fail between turns: asking the wrong question, missing a correction, acting before confirming. Only a user that talks back exercises that, and grading the end state keeps the verdict objective.

Failure mode

A simulator that is easier than real users — it volunteers every fact, never changes its mind, and quietly drifts out of persona. The agent aces the eval by never meeting the conversation it will actually have.

E-18Benchmark Saturation

/evals/benchmark-saturation

Once scores bunch against the ceiling, the gaps between models shrink below the noise and the benchmark stops ranking anything.

Step-by-step walkthrough6 steps
  1. A new benchmark launches. The best model solves 64% of it.
  2. Scores spread over 30 points: the ranking is obvious, and a 5-point gain is a real result.
  3. Two years of everyone hill-climbing the same fixed set…
  4. …and every model lands within two points of the ceiling — a ceiling set by mislabeled and unsolvable tasks, not by capability.
  5. The gaps are now smaller than run-to-run noise. The benchmark still produces numbers; it no longer ranks anything.
  6. Retire or refresh it: a harder split, fresh tasks, a private set — until the scores spread out again.
Key insight

The ceiling is rarely 100%: mislabeled and unsolvable tasks cap it lower, so the last few points measure grader errors, not capability. Watch the spread of top scores, and refresh with harder splits, fresh tasks or a private set before it collapses.

Failure mode

Celebrating a 1-point lead on a saturated benchmark. It is inside the run-to-run noise, and on the tasks that remain it may be the model memorizing a wrong answer key.

Further reading

Elsewhere in the atlas