AISEvals & testing

Your eval score might be lying: the grader can be the bug

An AI eval score can jump without the agent getting any better. Here's where the grader hides bugs, how Anthropic's own tuning loop catches them, and a checklist to copy.

The short version
  • Anthropic's Sep 28 eval post: a score went from 66.1% to 87.9%, and part of that came from fixing broken graders, not a smarter model.
  • Check the checker first: run the grader twice, check the plumbing, and keep a held-out test set.
  • Then check your tests: break your code on purpose and see if a test goes red.
Diagram: test cases, your agent, test runner, grader (highlighted), score, tuning loop, with notes: hand-write sneaky cases, crash detector dead code, run it twice, keep some test cases out, Anthropic 66.1% to 87.9%, break your code on purpose, 15 of 34 slipped past
The image from the LinkedIn post (tap to open full size)
Fig 1 · The tuning loop, and where the checking can break

Check the checker: mutation testing
01

Test cases

Tap any box (or the orange arrow) to see what it does. Switch views above.

The number worth knowing

Anthropic's Sep 28 post on automating eval design walks through tuning one of their own skills against an eval. The score went from 66.1% to 87.9% in three phases of work. The last phase was fixing graders, plus more skill edits.

66.1%where the skill started
74% → 77%added missing sections for eight features, then fixed C# and Java type tables
80%fixed how the skill tells Claude to write code (it kept writing older API shapes)
87.9%fixed broken graders, plus more skill edits

Two of the broken pieces, as they describe them: one task asked for code that catches one error type, while its grader wanted a chain of at least three. Another grader's instructions contradicted their own docs, and testing the real API showed the docs were right.

The point The thing grading your agent can be the bug. A higher score after a grader fix isn't a smarter agent. It's a more honest measurement.

How to spot a broken grader (or case)

  • A case that fails every run, no matter how many times you repeat it. Anthropic calls that a common tell of an impossible or ambiguous task.
  • A case that never improves, even after you fix the obvious gaps. That one is a tell that the case or the grader is flawed.
  • Verdicts that flip. Their eval builder runs the grader twice on the same output and reports whether the verdict changed.
  • Infrastructure noise. Timeouts, API errors and cut-off answers can pass as model variance if nobody checks the plumbing.

Anthropic's January guide to agent evals says the same thing from the other side: you won't know if your graders are working unless you read the transcripts and grades from many trials.

Keep some cases out of the loop

Tuning against an eval is a loop: read the failures, make one change, run it again, keep it or revert it. The danger is fitting the cases you can see. The fix is a split: a train set the loop may read, and a test set it never sees.

  1. Each round makes one change, aimed at the most common failure.
  2. Train and test both go up: keep it. Train up, test flat: that's overfitting, so revert.
  3. Score stalls for two or three rounds: read every remaining failure and sort it by cause first.
  4. Finish on the version that did best on the test set, not the train set.

Their cost example shows why it matters. A support benchmark had 44 tickets: 30 for the search, 14 held out. On the 14 it never saw, the final setup scored 90.5% vs 78.6% for the original, at about a fifth of the cost.

Break your code on purpose

Graders aren't the only checks that can check nothing. Your tests can too. Mutation testing finds out: make small deliberate bugs in your code (mutants) and see whether a test goes red. Google wrote up running it inside code review back in 2018, for 6,000 engineers on the changes they author or review.

I hit both problems on a personal project. The crash detector in my mutation runner was dead code, so a crash could get counted as a caught bug (fixed since: a crash never counts). And 15 of 34 hand-made subtle mutants slipped past my first tests. Each one now has a test that catches it.

Here's what a subtle mutant looks like. This is a made-up example, not from that project:

# the code
if retries > max_retries: stop()
# the mutant: one operator changed
if retries >= max_retries: stop()
# a test that only checks "it stops eventually" passes both.
# the test that catches it checks the edge:
assert not stopped_after(retries=max_retries)

The checklist to copy

  • Run the grader twice. If it disagrees with itself, fix the grader first.
  • A crash is a fail, never a pass.
  • Keep some test cases out of the tuning loop.
  • Break your code on purpose (mutation testing) and see if a test goes red.
  • Hand-write a few sneaky cases, not just obvious ones.

A score is only as honest as the grader behind it. What's the last check you found that was checking nothing? Tell me on LinkedIn.

Sources and further reading

Every number on this page comes from these. The personal-project details are my own.

  1. Automating eval design and hillclimbing with Claude Lance Martin · claude.dev blog (Anthropic) · Sep 28, 2026 · the 66.1% → 87.9% example, grader checks, train/test loop, cost example
  2. Demystifying evals for AI agents M. Grace, J. Hadfield, R. Olivares, J. De Jonghe · Anthropic Engineering · Jan 9, 2026 · read transcripts before trusting graders
  3. State of Mutation Testing at Google G. Petrović, M. Ivanković · ICSE (SEIP track) · 2018 · mutation testing at code-review time
AIS

← All breakdowns

Detailed breakdowns of AI and data architecture, diagrams included.

Next breakdown

The agent said done. The database said no.

Microsoft's ThinkingBox grades agents on the records they leave behind.