Lance Martin, of Anthropic, publishes a guide on the claude.dev blog about designing evaluations and improving an application or skill against them without fooling yourself. He announces the addition of two subcommands to Claude Code's claude-api skill: /claude-api build-eval builds an evaluation in the repository, /claude-api hillclimb improves the application against it, one change at a time, with a held-out set of examples to detect overfitting.
The first part states four properties of a good evaluation. Tasks reflect production. Scores rise with a more capable model and higher effort; otherwise, ambiguous tasks or a miscalibrated grader are to blame. The best model remains clearly below 100%, without the gap being due to impossible tasks: a task that fails on every run is suspect, and a good task is one on which two experts reach the same verdict. Finally, variance is low, which requires a stable grader, effort applied consistently, and an environment free of residual state. The author adds a caution about adversarial sampling: choosing the cases the current model fails measures its failure footprint rather than real difficulty. He recommends cases judged difficult by a human, real failures drawn from tickets or bugs, while noting that raw traffic can skew toward the easy.
build-eval questions the user, then builds the evaluation with approval pauses. Inputs come, in order, from production transcripts, tickets, five to ten hand-written cases, then synthesized cases. The grader is the cheapest one that fits: programmatic when outputs are constrained, otherwise a judge model with a checklist of verifiable claims. Claude scores a few cases and asks whether the user would have judged them differently, then runs the baseline with a confidence interval and three checks: grader stability, plumbing, headroom.
The second part covers hillclimbing. It suits surfaces that are cheap to change, whose score is attributable, with a bounded objective; cost is a good one. Against overfitting, three safeguards: separate train and test, never paste failures into the prompt, keep answers out of reach. The command splits the evaluation, checks that noise is lower than the targeted gain, proposes one patch per round, and reverts it if train rises alone. On stagnation, it classifies failures by cause before editing.
Two examples illustrate all this. On a 44-ticket support benchmark, moving from Opus 4.8 to Opus 5.5 then to Sonnet 5 at low effort, with an improved prompt, yields 90.5% versus 78.6% on the held-out tickets, for about a fifth of the cost. On the claude-api skill, the evaluation rises from 66% to about 88%: missing sections, type tables, a table of deprecated API forms, and fixes to flawed tasks and graders.