eval-driven-development — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited eval-driven-development (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Eval-driven development is the practice of building LLM-integrated systems by writing evaluations before and alongside the system, with each eval defining a behavioral criterion the system must satisfy on a representative input set, and the suite's aggregated signal gating every change to prompt, model, retrieval, context assembly, scaffolding, tooling, or orchestration. Five primitives: (1) eval dataset — curated input examples representing production plus edge cases, prior failures, and held-out slices, typically JSONL of {input, reference} records checked into version control; (2) evaluation function — per-example grader producing a score, with mechanism chosen from programmatic, model-graded, human-graded, preference comparison, trace check, or hybrid; (3) aggregation — statistical summary across the dataset (pass-rate, weighted pass-rate, stratified slice scores, distribution) with sample size and either a confidence interval or a defined minimum-detectable-change threshold, plus cost/latency side metrics; (4) iteration loop — eval → diagnose → change one meaningful variable → re-eval → compare, with the suite stable while the system changes; (5) regression budget — per-eval/per-slice merge policy: gating (no regression allowed), optimizing (improvement gates merge), watchful (tracked, not gated), human-signoff, or cost-aware threshold (a pass-rate gain only counts if it clears the eval's cost/latency budget — a 1pp quality gain at 3× inference cost is a regression).
Replaces "ship LLM systems based on how the model feels at the desk" (and benchmark shopping) with empirical measurement that distinguishes "the new prompt works better" from "the new prompt works better on the five examples I happened to try." Solves the problem that LLM system behavior is stochastic (every run is a sample, not a deterministic pass/fail), the input space is open-ended (the developer's pet examples are not a representative sample of what users will throw at it), model behavior changes across releases (a feature that failed last quarter may now be viable), and traditional binary unit tests do not capture the distributional nature of LLM outputs. The eval suite is the empirical measurement instrument that makes shipping decisions defensible and changes gateable: each change has a baseline, a representative private eval set, a comparison method, and a documented decision policy. The discipline's hard part is not writing evals — it is choosing what to measure, encoding the choice into a grader the team agrees with, sampling a dataset that represents production, distinguishing a real improvement from sampling noise, tracking high-risk slices separately from the average, calibrating model-graders against humans, feeding sanitized production failures back into the next eval version, and resisting Goodhart's Law as the eval suite becomes the optimization target. Teams that get this right ship systems whose quality matches their stated definition of "good"; teams that get this wrong ship systems that ace evals and disappoint users.
Distinct from testing-strategy, which owns deterministic-software testing where every run is binary pass/fail and the main decision is the cheapest honest test level — this skill owns LLM evaluation where every run is a sample from a distribution and pass-rate (or a score distribution) is the unit of judgment; the disciplines share vocabulary (suite, gate, regression) but the math underneath differs. The exact construction of eval task sets, rubrics, graders, hard negatives, trace schemas, and thresholds is separate from this skill; this skill owns the development discipline that uses those artifacts to gate whether prompt/model/retrieval/tool/orchestration changes ship. Distinct from evaluation, which owns general scoring frameworks and result interpretation — this skill owns the repeated LLM-system change gate. Distinct from tool-call-flow, which owns the protocol cycle by which a model invokes tools — this skill owns the discipline of measuring whether that cycle produces correct behavior; tool-call and trajectory evals are a specialization of the general pattern. Distinct from prompt-injection-defense, which owns the security property and threat model — this skill owns the measurement of whether the property holds (red-team evals against an injection corpus are one application). Distinct from error-tracking and observability-modeling, which own runtime measurement of deployed systems — this skill owns offline pre-deployment measurement while using production signals as inputs for dataset refresh; one is not used as a substitute for the other. Eval-driven development is to LLM system engineering what crash-test ratings are to automotive safety — you do not ship a car based on how well it parked in your driveway; you ship it after a battery of standardized tests on representative crash scenarios, with the pass-rate against named criteria as the gating signal. A score of 4.3 stars across the suite is the only defensible claim of 'safer'; a developer's intuition that 'the new model feels smarter' is the unmeasured equivalent of 'I drove it home, it seemed fine.' And just as a crash lab that the manufacturer trains its cars to detect stops measuring real safety, an eval the model can recognize as a test stops measuring real behavior. The wrong mental model is that LLM evals are "unit tests for prompts" — binary pass/fail, written once, checked in CI, ship on green. They are not. The fundamental property is distributional and lifecycle-based: every run is a sample from a stochastic system, and the unit of judgment is pass-rate over a sampled population with a sample size and confidence interval. A test that runs once and "passes" tells you nothing about the distribution; pass-rate at n=20 has huge uncertainty; pass-rate at n=500 starts to be informative. Adjacent misconceptions: that a higher headline pass-rate is a real improvement (it is not until the delta's confidence interval excludes zero — a paired bootstrap on a shared dataset is the cheap default, McNemar's test is the right check for paired pass/fail outcomes, and halving the effect you want to detect costs four times the samples); that a single headline number is sufficient (it is not — it can hide a high-risk slice regressing while the average improves; a panel of independent measures and slices is harder to over-fit, and HELM's multi-metric framing exists precisely as a counter to single-metric Goodharting); that public benchmarks (MMLU, HumanEval, BIG-bench, GAIA, MT-Bench, τ-bench) gate system-specific shipping decisions (they do not — benchmarks predict how a model will do on the exact tasks they contain, not on your system's user inputs; use them for model-selection grounding, and treat a sudden benchmark jump as a contamination hypothesis, not an automatic capability win); that higher eval scores are always improvements (they are not — Goodhart's Law: when the eval becomes the optimization target, it ceases to be a good measure; a 100% pass-rate is a measurement failure on a capability/gating suite, not a victory, because a suite the system aces has stopped discriminating — though a regression suite near 100% is doing its job, see the carve-out in § The 100% Pass-Rate Trap); that model-graded evals are reliable without calibration (they are not — model-graders have verbosity bias, position bias in pairwise comparisons, self-preference bias toward their own family's outputs, and correlated error with the system being graded; the fix is mechanical — judge from a different top-tier family, swap positions, ensemble across families — not a "be objective" instruction in the grader prompt, because the bias lives in the embedding distribution, not the surface style); that you can trust a metric without reading the transcripts (you cannot — error analysis on the actual traces is how you learn whether the grader itself is working and what the failures really are); that final-output grading is sufficient for multi-step agents (it is not — an agent that reaches the right answer through a broken or unsafe trajectory will pass a final-output eval and fail in production; multi-step systems need trajectory-aware evals that score planning, tool selection, and execution); that the model under test is fixed (it is not — every model upgrade or vendor switch changes the system under test and must be re-gated against the private suite, including high-risk slices, cost, and latency); and that offline evals replace production telemetry (they do not — production telemetry measures the actual user-facing system under actual load, and every production incident is a candidate eval case after sanitization; the two are complementary, not substitutable). Public benchmarks, vendor dashboards, and LLM judges are useful inputs, not shipping authority by themselves.
The practice of building language-model-integrated systems by writing evaluations before and alongside the system, then using the eval suite's measured signal to gate every meaningful change. Covers:
pass@k ("at least one success in k attempts") versus pass^k ("all k attempts succeed"), and why the product promise — one good candidate vs reliable-every-time behavior — decides which one gates.Building LLM-integrated systems without evals is shipping airplanes based on how good the model feels at the desk. The system's behavior is stochastic, the input space is open-ended, the model may change under you, and the developer's pet examples are not a representative sample of what users will throw at it. An eval suite is the empirical measurement instrument that lets a team distinguish "the new system is better" from "the new system is better on the five examples I happened to inspect."
The discipline's hard part is not writing evals. It is choosing what to measure, encoding the choice into a grader the team agrees with, sampling a dataset that represents production, distinguishing a real improvement from sampling noise, calibrating subjective graders, holding the suite stable while the system changes, and resisting the gravitational pull of Goodhart's Law as the eval suite becomes the optimization target. Teams that get this right ship systems whose quality matches their team's stated definition of "good." Teams that get this wrong ship systems that ace evals and disappoint users.
Eval-driven development is not test-driven development with extra noise. It is empirical engineering applied to systems whose behavior is a distribution rather than a value. The vocabulary overlaps with testing — suite, gate, regression, CI — but the unit of judgment differs. A deterministic unit test asks "did this exact behavior happen?" An LLM eval asks "how often, under which slices, at what cost, with what uncertainty, and against whose definition of quality?"
Start small; do not wait for a perfect suite. The barrier to entry is low and the cost of delay is high: a starter set of 20–50 tasks drawn from real failures is a legitimate beginning, not a placeholder (Anthropic's agent-eval guidance). Early in development the effect sizes of changes are large, so even a small suite separates good from bad; the statistical machinery below matters most later, when the easy wins are gone and you are arguing over single percentage points. The failure mode is not "started with too few cases" — it is "never grew the suite, and never read the transcripts."
| Primitive | What it is | Common encoding | Failure mode if neglected |
|---|---|---|---|
| Eval dataset | Curated input examples representing real use, edge cases, prior failures, and held-out slices | JSONL/CSV/dataset table of inputs, references, expectations, metadata, or trace expectations; checked into version control | "It works for me" with no shared evidence |
| Evaluation function | Per-example grader producing a score | Code scorer, exact/semantic match, model-graded prompt, pairwise preference, human-review UI, trace checker, hybrid scorer | Implicit, undocumented definition of "good" |
| Aggregation | Statistical summary across examples and slices | Pass-rate, weighted pass-rate, mean score, win rate, stratified slice table, distribution, confidence interval | Headline number hides regressions or variance |
| Iteration loop | Baseline → diagnose → change → re-run → compare | CI job, experiment run, dashboard, PR comment, eval ledger | Changes ship without measured comparison |
| Regression budget | Merge policy per metric/slice, including cost/latency tradeoffs | Per-eval policy: "must not regress" / "improvement gates merge" / "watchful" / "human signoff required" / "cost-aware threshold" | Every change becomes a debate about the headline number |
Three invariants keep the loop honest:
The first primitive — the dataset — is only as good as its representativeness, and origin determines what population the result can speak for and which blind spots the suite will have. Six common origins, ordered roughly from closest-to-deployment to furthest:
| Origin | What it is | Strength | Limitation |
|---|---|---|---|
| Production log sampling | Real user inputs (and outputs) sampled from the deployed system, then sanitized and labeled | Highest deployment fidelity; cannot be contaminated by public benchmark leakage | Requires a deployed system + capture pipeline; PII/privacy review before use; references are often retroactive; survivorship bias toward inputs that already worked |
| User-feedback capture | Inputs flagged by thumbs-down, escalation, support tickets, or correction | Direct link from real user pain to future gates | Skewed toward known failure shapes; noisy feedback is not automatically a valid eval case; under-samples silent failures users never report |
| Prior failures | Incidents, bad traces, complaints, and regression bugs converted into named cases | Makes fixes durable; keeps high-risk cases visible; the natural seed for the starter suite (20–50 real failures) | Reactive; over-represents known problems if not balanced |
| Hand-authored | Cases written by domain experts to encode the spec and edge cases | Precise coverage of intended behavior and boundary conditions | Reflects what authors imagine users do, not what they actually do; small and labor-bound |
| Adversarial generation | Cases deliberately constructed to break the system (red-team, hard negatives, injections, ambiguity, tool misuse) | Surfaces failure modes positive sampling misses; the source of red-herring cases | Not representative of typical-traffic distribution; over-weighting it distorts headline pass-rate |
| Synthetic generation | Cases produced by a model from a spec or seed set | Cheap volume; fills coverage gaps fast | Inherits the generator model's blind spots; can drift from real input distribution; can make the eval easy to game; needs human spot-checks |
A healthy suite blends origins and labels each case with provenance: production-sampled inputs anchor representativeness, hand-authored + adversarial cases pin the spec and the boundaries, prior-failure cases prevent regressions, and synthetic generation fills volume — with the mix and each stratum's weight chosen deliberately, not by whichever data was easiest to collect.
The "start small" point from § Philosophy has a discipline attached: the claim a suite can support must match its sample. A starter set of 20–50 well-chosen tasks from real failures, manual smoke checks, support issues, and product requirements is enough to expose coarse regressions and make the team's definition of success concrete — it is a development steering wheel, not a certification instrument. A bootstrap suite can justify "this change fixed the obvious failure class" or "the new model is worth deeper evaluation"; it cannot justify "a 2pp lift is real" unless the design's minimum detectable effect supports that claim (see § The Statistics of "Is This Better?"). Effects worth shipping shrink as the system improves, so mature systems need larger, harder, stratified suites, repeated trials, or paired comparisons.
The operational rule is to label every suite with its use posture — this is the epistemic-warrant companion to the cadence/gating view in § Eval Lifecycle Archetypes:
| Suite posture | Typical size | What it can support | What it cannot support |
|---|---|---|---|
| Bootstrap | 20–50 high-signal tasks | Coarse iteration, task concretization, early model/prompt comparison | Fine-grained significance claims or broad population quality |
| Regression | Named prior failures and must-not-break cases | Backsliding detection; usually expects near-100% pass | Frontier capability measurement |
| Capability / quality | Larger and hard enough to leave room to improve | Product-quality hill climbing and model-upgrade decisions | Permanent comparability if the suite changes without re-baselining |
| Launch gate | Stratified, calibrated, costed, with high-risk slices | Ship/no-ship decision under a regression budget | Replacement for production monitoring |
"Run the evals" is underspecified until you name which surface each eval scores. For simple LLM features, final-output quality may be enough; for agents it is usually too shallow. A complete LLM system has several distinct evaluable surfaces, and grading only the final response — the most common mistake — leaves the others unmeasured.
| Surface | What it scores | Typical mechanism | Skipping it costs you |
|---|---|---|---|
| Final response | Correctness/quality of the user-facing output | Programmatic + model-graded (reference, rubric, pairwise, factuality) | (the baseline; rarely skipped) |
| Trajectory (for agents) | Whether the path — plans, tool selection, arguments, sequence — was correct, efficient, safe | Trajectory-aware grading — see § Evaluating Multi-Step Agents | Right answers reached by broken or unsafe paths that fail in production |
| Retrieval / context (for RAG) | Whether the right context was fetched and faithfully used | Programmatic + model-graded — see § RAG Eval Surfaces | Hallucinations and wrong answers blamed on the generator that are actually retrieval failures |
| Safety / policy | Whether the system refused, redacted, or stayed in policy where required | Programmatic gates + red-team evals — see § Safety And Red-Team Eval Gates | Silent policy violations that only surface as incidents |
| Side effects | Whether destructive or external actions (writes, sends, payments) were correct and authorized | End-state assertions + trajectory action checks | An agent that "succeeded" by taking an action it should not have |
| Cost / latency | Per-request token cost and wall-clock time | Programmatic measurement | Quality gains that quietly triple the bill or the p95 latency (see the cost-aware regression budget) |
A suite that covers only the first row reports a single number that hides failures on every other surface. Decide which surfaces your system actually has, and put at least one eval on each that matters. This skill decides how those surfaces become a change gate; constructing the exact rubrics and trace schemas is a task-specific artifact concern.
Retrieval-augmented systems have a distinct, well-named set of eval dimensions because a RAG answer can fail in two independent places — the retriever fetched the wrong passages, or the generator ignored/contradicted the right ones. A green final answer can hide an unreliable retriever, and a faithful answer can still be useless if the retriever missed the necessary source. Naming the layers separately localizes the failure instead of blaming "the model" (RAGAS framing):
| RAG metric | Question it answers | Gate implication |
|---|---|---|
| Context precision | Are the retrieved chunks relevant, and are the most useful chunks ranked early? | Low precision forces the model to sift noise; tune chunking, retrieval query, reranker, or top-k policy |
| Context recall | Did retrieval include the evidence needed to answer the task? | Low recall is usually a release blocker for knowledge-heavy workflows, even if the generator sometimes guesses correctly; a faithfulness failure with low recall is a retriever bug, not a generator bug |
| Faithfulness / groundedness | Are the answer's claims actually supported by the retrieved context? | Unsupported claims block merge for high-risk domains; this is the RAG-specific hallucination measure |
| Answer relevance | Does the answer address the question asked, independent of grounding? | Low relevance points to prompt, routing, context packing, or instruction-following issues |
| Citation support | Do cited passages actually support the statement they are attached to? | Citation failures are separate from answer correctness; a correct answer with bad support still erodes trust |
Report the failure location: retrieval miss, ranking/noise problem, context-packing loss, synthesis hallucination, bad refusal, or citation mismatch. The regression budget should say which layer blocks merge and which only triggers diagnosis. These are eval surfaces to name and measure, not a RAG-metric construction manual — building the retrieval corpus, the rubric, and the graders is the task-specific work of building the retrieval corpus, rubric, and graders.
Safety evals need named gates, not just a generic "safety score." Separate attack success from false-positive refusal and severity.
| Safety signal | What it measures | Gate style |
|---|---|---|
| Attack success rate | How often adversarial or near-miss inputs bypass the intended boundary | Critical-severity successes veto merge |
| False-positive refusal rate | How often safe, in-scope requests are incorrectly refused | Blocks if user-visible utility falls below the product threshold |
| Severity-weighted failure count | Whether failures are cosmetic, recoverable, policy-relevant, data-exposing, or irreversible | High-severity failures are slice vetoes even when average quality improves |
| Boundary trace correctness | Whether tool calls, approvals, data access, and refusals followed the intended control path | Protocol violations block merge even if the final response looks acceptable |
This skill owns making those signals part of the change gate. The threat model, attack taxonomy, and defense mechanism belong to prompt-injection-defense or the relevant safety/security skill.
| Mechanism | Best for | Cost per example | Reliability | Watch for |
|---|---|---|---|---|
| Programmatic | Outputs with mechanical correctness: code tests, JSON schema, exact labels, allowed transitions, tool-call sequence | $0 (near zero) | Deterministic when the oracle is valid | Narrow applicability; can miss semantic failures |
| Model-graded | Open-output tasks at scale: summarization, classification, Q&A, instruction following, style, safety classification | $0.001-$0.10 per grade, model-dependent | Useful when calibrated; not self-validating | Verbosity bias, position bias in pairwise, self-preference, correlated error; calibrate against humans |
| Human-graded | Subjective criteria, calibration runs, high-risk slices, ambiguous outputs | $1-$50 per grade, annotator-dependent | Highest validity; lowest scale | Inter-rater agreement must be measured; one rater is not "humans think"; fatigue and inconsistent rubrics matter |
| Preference comparison | Variant selection, model/prompt comparisons | Low to high depending on judge | Often more reliable than absolute scoring — LLMs discriminate between options better than they generate open scores | Randomize order; blind variant labels; inspect ties and slice regressions |
| Trace / program hybrid | Agent workflows, tool use, side effects, retrieval quality | Mixed | Strong when deterministic invariants catch protocol errors and judges score open semantics | Trace logs can show "tool succeeded" while context quality was insufficient |
A practical default: programmatic checks for invariants, model judges for semantic scale, preference comparison for variants, and human review for calibration and high-risk decisions.
Cost is a design axis, not an afterthought. Per-grade cost multiplied by suite size multiplied by run frequency is a real budget, and it shapes which mechanism goes where. A 500-example suite graded by a model at ~$0.05/grade is ~$25 per run — runnable on every PR; the same suite under human grading at ~$5/grade is ~$2,500 per run — a quarterly-calibration activity, not a CI gate. The design rule that falls out: put the highest-frequency runs (per-commit gates) on the cheapest adequate mechanism (programmatic, then model-graded), and reserve human grading for the low-frequency calibration and ambiguous-case sampling that only humans can do. Cost also belongs in the gating decision itself — see the "cost-aware threshold" regression-budget policy and § Cost-Aware Evaluation.
A metric is a summary, and a summary you have not traced back to specific transcripts is a number you do not yet understand. Before trusting any aggregate — and especially before trusting a model-graded aggregate — read a sample of the actual traces: the inputs, the full output, the tool calls and intermediate state, and the grade the grader assigned. This is error analysis, and it is the diagnostic engine of the iteration loop, not an optional polish step. "You won't know if your graders are working well unless you read the transcripts and grades from many trials" (Anthropic's agent-eval guidance).
Error analysis answers questions a pass-rate cannot:
The loop is: read traces → name failure modes → encode them as cases/graders → then optimize the metric. Skipping straight to "the number went up" is how teams optimize a metric they have never grounded in reality.
A pass-rate is an estimate, not a measurement. "Version B scored 3 points higher" is not a shipping argument until you have asked whether the gap survives sampling noise. This is the single most common place eval-driven development degrades into eval-flavored vibes: a team reads two numbers, declares a winner, and ships a change the data does not actually support. (The statistics matter most once the suite is past its starter phase — early, large-effect changes are visible even at n=20; single-percentage-point arguments are where the machinery below earns its keep.)
Report sample size with every pass-rate, mean score, or win rate. A bare number with no n is not interpretable.
Compare the delta, not two separate intervals. The decision rule is whether the *confidence interval on the difference (B − A) excludes zero* (or clears the predeclared regression budget) — not whether A's and B's individual intervals fail to overlap (the overlap check is needlessly conservative and throws away power).
Prefer a paired test on a shared dataset. Run both system versions on the same eval examples and analyze the per-example score differences. Because scores on the same question are positively correlated across versions, the paired estimator removes that shared variance "for free" — a paired t-test or Wilcoxon signed-rank produces a substantially tighter confidence interval on the delta than the unpaired equivalent, at the cost of roughly 2× inference (you run both arms). How much tighter is not a fixed quantity: it scales with the within-example correlation between the two arms, so the gain is large when versions agree on most examples and modest when they do not — there is no universal "orders of magnitude" multiplier to quote. When you cannot pair (different datasets), fall back to the unpaired interval and expect to need far more data.
For paired binary pass/fail outcomes, name the test. McNemar's test (or an exact binomial test on the discordant pairs) is the usual check for whether B fixes more cases than it breaks. The interesting count is not total wins; it is A fail / B pass versus A pass / B fail.
Bootstrap the delta when assumptions are shaky. For small, skewed, or non-normal datasets, compute delta_i = score_B_i − score_A_i for each shared example, resample the delta vector with replacement (e.g. 1,000–10,000 resamples), recompute the mean/pass-rate delta, and use the 2.5th and 97.5th percentiles as the approximate 95% interval. Ship only when that CI sits entirely on one side of zero. When central-limit assumptions hold and n is a few hundred or more, a closed-form paired interval (Δ ± 1.96 × SE(difference)) is sufficient and bootstrapping is optional.
Know your minimum detectable effect (MDE) before you run. Sample size scales quadratically with the inverse of the effect you want to detect: detecting a gap half as large requires 4× the samples. There is no universal "N examples per 1% gap" constant — the requirement depends on the design and the pass-rate. For an unpaired one-sample 95% CI with ±1pp half-width, the normal approximation needs roughly 1.96² · p(1−p) / 0.01² examples: ≈9,600 at p=0.5, ≈6,100 at p=0.8, ≈3,500 at p=0.9 — thousands, not hundreds, to pin a single percentage point. As a rough feel for smaller suites, a binary pass-rate at n=100 has a 95% half-width of about ±8pp near 80% pass-rate and about ±10pp near 50%; n=400 cuts those roughly in half. *These figures are the unpaired case — and they are why teams that actually ship on small eval suites run paired comparisons, which need far fewer examples for the same MDE (how many fewer depends entirely on the arm correlation, so no fixed per-1pp number is defensible for either design). The practical consequence: a small eval resolves only coarse effects — treat any delta below your design's MDE as "no signal," not "small improvement," and compute that MDE for your* design and pass-rate rather than trusting a rule of thumb. For finer MDE you need more examples, repeated runs, or token-probability scoring.
Account for correlated examples (clustered standard errors). If your dataset contains groups of related examples — multiple questions from one document, paraphrases, translations, repeated tasks from one user — the effective sample size is the number of clusters, not the number of rows. Naively treating correlated rows as independent can understate the true standard error by ~3×, turning noise into a false "significant" result. Cluster the standard error on the grouping variable, or treat the cluster count as the effective n.
Shrink within-question noise with repeats. A stochastic system gives a different score on the same input across runs. Generating K samples per question and averaging reduces the within-question variance by a factor of K; when token-probability scores are available, that within-question noise can be eliminated entirely. Repeat runs whenever the system, tools, environment, or judge is stochastic enough that one run can flip the result.
Choose the repeated-trial metric that matches the product promise (`pass@k` vs `pass^k`). For stochastic agents, repeated runs can answer two opposite questions. pass@k asks whether at least one of k attempts succeeds; it rises as k increases and is appropriate when the product can cheaply try multiple candidates and keep the first valid one. pass^k asks whether all k attempts succeed; it falls as k increases and is the right consistency metric when a user expects the agent to work every time. A change can improve pass@10 while making pass^3 worse — it found more lucky successes but became less reliable. Record which repeated-trial metric gates the change before running the eval, because the two reward opposite behaviors.
Report slices separately, and treat high-risk slices as veto gates. Break results out by task type, difficulty, user segment, language, tool path, safety class, context source, model family, and known prior failures. A +5-point average does not justify a critical privacy, safety, tool-side-effect, or grounding regression on a slice.
Reporting standard. A defensible eval result reports: mean score, standard error (CLT-based or clustered), the 95% CI on the delta, sample size n, cluster count, the slice table, the MDE or threshold, the repeat-run policy, the cost/latency delta, and — for a paired comparison — the correlation between the paired arms. A bare "B scored higher" with none of these is an unverified claim.
Boundary note: constructing the rubric, hard negatives, and acceptance thresholds is the task-specific work of constructing the rubric, hard negatives, and acceptance thresholds; interpreting whether the delta is real and gating the change on it is this skill's. The statistics live here because they are the gating decision.
The eval-driven iteration loop is the development cycle. Run the suite, diagnose failures and slices, choose one meaningful change, re-run the same suite, gate the change on the regression budget.
baseline eval
-> diagnose failures and slices (READ THE TRANSCRIPTS, not just the score)
-> choose one meaningful change
-> re-run the same eval suite
-> compare against regression budget
-> merge, iterate, or revertThe "diagnose" step is error analysis, not metric-watching (see § Read The Transcripts). Allowed system changes include prompt wording, system/developer instructions, retrieval query strategy, context packing, tool schema, tool-call policy, model choice, reasoning effort, output format, guardrail policy, and orchestration. The suite should remain stable during the comparison. Change one thing per iteration so the eval delta is attributable; if the budget allows multiple changes, gate them as a batch but expect harder root-causing when the batch regresses.
Pre-register the decision rule before you run (spec-first, anti-p-hacking). The structural defense against fooling yourself is to write down what you will measure, the threshold, and the ship/no-ship rule before you see the result — not after. Before a candidate run, write the eval spec as if it were a test plan: baseline system, candidate change, dataset version, primary metric, secondary metrics, slice vetoes, judge/grader version, sample size or repeat count, MDE, cost/latency ceiling, and merge rule. After the run, record whether the predeclared rule passed. An iteration loop that decides the metric and cutoff after looking at the numbers is p-hacking with extra steps: with enough sliced views (this subset, that stratum, this rephrased grader) some comparison will always cross significance by chance, and a team that picks the favorable slice post-hoc ships noise. Treat any post-hoc slice that "looks better" as a hypothesis for the next pre-registered run, not as evidence for this one — that is a new experiment, not the same comparison.
*Iterating on the gate set silently over-fits it. A documented 2026 failure mode: when prompt edits are tuned against the same eval set that decides whether they ship, "better" eval scores can correspond to worse* production behavior — the prompt has learned the eval, not the task ("When Better Prompts Hurt," 2026). The defense is structural: keep a held-out slice the iteration never sees (see § Goodhart defenses), and connect offline scores to online outcomes so an offline gain that does not show up in production is caught.
When you must change both the system and the eval:
"The eval suite" is usually several suites doing different jobs, and conflating them into a single headline number is a recurring failure: a regression suite and a red-team suite answer opposite questions, and averaging them tells you nothing. Name the archetype each eval belongs to and run it on its own cadence:
| Archetype | Question it answers | When it runs | Gating posture |
|---|---|---|---|
| Acceptance | Does the system meet the bar to ship at all? (a planned capability the system cannot yet pass) | Once per release candidate | Hard gate — starts low; merge requires reaching the product threshold |
| Capability / quality | What can the system do well, and is it improving? | During active development | Watchful/decision-input — designed to start at a low pass-rate so future model/system gains are visible; near-100% here means the suite has gone blunt |
| Regression | Did this change break anything that worked? | Every change / PR | Gating — named case or slice must not regress; this suite should sit near 100% (that is its job — see the 100%-pass-rate carve-out) |
| Calibration | Does the model-grader/rubric still agree with humans or a trusted reference? | Periodic cadence (e.g. quarterly) | Watchful — drift triggers re-anchoring, not a block |
| Red-team / adversarial | Can the system be made to fail, leak, or violate policy? | Pre-release + on cadence | Gating on critical cases; tracked otherwise |
| Cross-model | How do candidate models compare on our tasks (a model upgrade, reasoning-effort change, vendor switch, or fallback strategy)? | At model-selection decisions | Decision input — compare quality, cost, latency, and high-risk slices; not a merge gate |
| Drift-refresh | Has production behavior or requirements moved since the dataset was written? | When telemetry surfaces drift | New cases are added; old-vs-new comparability is recorded |
The point is not the exact list — it is that a single fragile number conflates jobs that need different datasets, cadences, and gating rules. Splitting the suite by archetype is how you stop a calibration drift from silently masquerading as a quality regression, and how you avoid reading a regression suite's healthy near-100% as a capability suite's saturation failure.
Model-graded evals are the workhorse of open-output evaluation, but the judge is itself a stochastic, biased instrument — another model with its own error distribution. Treat it as a measurement instrument that needs calibration, not as neutral authority. Naming the biases and fixing them mechanically is operational hygiene, not optional polish. (And calibration starts with reading graded transcripts — see § Read The Transcripts — because a bias you have not seen in a trace is a bias you cannot size.)
Known biases of an LLM judge. The effect-size column gives illustrative ranges — they vary widely by judge model, task, and study, so treat them as "big enough to flip a close call," not as fixed constants; measure the effect on your own setup before trusting any number here. (2026 systematic studies report frontier judges failing the majority of standardized bias probes, so assume the biases are present until your own calibration data says otherwise.)
| Bias | What it is | Illustrative effect size | Mechanical fix |
|---|---|---|---|
| Position bias | In pairwise comparison, the judge favors the response in a particular slot regardless of content; strongest when candidates are close in quality | Can shift win-rates by ~10+ points on close calls; ~40% verdict-flip inconsistency reported for some frontier judges | Swap positions (A-then-B and B-then-A), average; treat swap-inconsistent verdicts as low-confidence |
| Verbosity / length bias | Longer answers score higher even when the extra content adds nothing | One of the larger, most consistently reported effects | Length-control the candidates, or penalize/normalize for length; include length-matched calibration pairs |
| Self-preference bias | A judge rates its own model family higher (genuine quality and bias are conflated in raw win-rates) | Reported single-digit to low-double-digit win-rate shifts | Judge from a different top-tier family; detect empirically (below); never let a model be the sole judge of its own family |
| Format bias | Superficial structure (markdown, headers, citation style, confident tone) sways the score independent of substance | Varies; close-call magnitude | Strip/normalize formatting before grading where feasible; rubric anchored to substance; include format-variant calibration examples |
| Calibration drift | A judge anchored to human judgment diverges over time, or a silent provider-side model update shifts scores with a byte-identical prompt | Accumulates until re-anchored | Pin judge versions where possible; recalibrate against humans on a cadence; re-run calibration on every judge-model version bump |
Treat the bias table as a checklist, not a universal ranking. There is no fixed hierarchy of which bias dominates: recent LLM-as-judge debiasing work found style bias dominating position bias in its experimental setup, while other work emphasizes position, verbosity, and self-preference — and debiasing strategies are themselves model-dependent (a mitigation that helps one judge can be neutral or harmful for another). The safe operational move is local measurement: build calibration pairs that hold substance fixed while varying style, length, format, model family, and answer order, then estimate which bias is large enough to flip your gate. Record the calibration receipt rather than importing a generic bias hierarchy.
The fixes are mechanical, not prompt-level. Adding "evaluate objectively, ignore writing style" to the grader prompt does not remove these biases, because they live in the model's embedding distribution, not in surface style. What works:
Unknown / cannot determine when the transcript does not contain enough information to grade the criterion, rather than forcing a pass/fail guess (Anthropic's agent-eval guidance). A forced binary on an under-specified case manufactures noise; an explicit abstain bucket both reduces that noise and surfaces under-specified cases for rubric repair. (This is a grader-contract fix, distinct from "be objective" prose — it changes the output space, not the instruction tone.)Estimate judge-bias magnitude on the local calibration slice in score points or win-rate points. Do not import universal bias ranges as if they were constants; the size depends on task, rubric, judge model, candidate model, answer length, and how close the variants are.
Boundary note: this section is the measurement-hygiene application of calibration inside the iteration loop. The design of the grader rubric and its anchors belongs with the task-specific work of constructing the grader rubric and anchors; the general result-interpretation framework is evaluation.The five primitives describe the general pattern, but for a multi-step agent (one that plans, calls tools, reads results, and iterates) the unit being graded shifts. Grading only the final answer is insufficient and actively dangerous: an agent can reach a correct final answer through a broken, wasteful, or unsafe path — calling the wrong tool, fabricating an intermediate result, taking a destructive action that happened not to matter this time — and pass a final-output-only eval while being unfit for production.
Two complementary metric families:
| Metric family | Question answered | Examples |
|---|---|---|
| Final-output / outcome | Did the agent end in the correct end state? | Task success, goal completion, end-state assertion |
| Trajectory-aware | Was the path correct, efficient, and safe? | Tool-selection accuracy, tool-call argument correctness, plan validity, step efficiency (no needless loops), absence of unsafe intermediate actions |
A complete agent eval scores both, because a high outcome score with a poor trajectory score is a strong predictor of brittle production behavior (the agent succeeded by luck or memorization, not by sound process). The grading unit here is the transcript (also called a trace or trajectory): the complete record of a trial — outputs, tool calls, reasoning, intermediate results, and interactions — and grading it well requires reading a sample of those transcripts (see § Read The Transcripts), not only scoring the end state.
*Reference benchmarks for the shape of agent evals* (cited for grounding, never for gating your system): τ-bench and τ²-bench (multi-turn tool-use agents in policy-constrained environments with shared world-state), BFCL (function/tool-calling correctness across languages and modes), GAIA and Terminal-Bench (end-to-end multi-step assistant tasks), and the trajectory-aware benchmarks that explicitly score the sequence of tool calls rather than only the final state. Use these to understand what trajectory grading looks like; build your own trajectory eval against your agent's actual tools and policies.
§ Read The Transcripts establishes why you read traces (validate the grader, find the real failures); this subsection is the agent-specific workflow that turns that reading into a gate. For agents, the fastest path from "something is wrong" to "we know what to measure" is often trace grading: a trace captures the model calls, tool calls, handoffs, guardrails, intermediate state, and final output for one run. Grading traces is excellent for diagnosing whether the agent chose the wrong tool, skipped a handoff, violated a policy, looped wastefully, or reached the right answer through a fragile path (OpenAI's agent-evals guidance: start with trace grading while debugging, then move to datasets/eval runs when you need repeatability).
But a graded trace is not automatically a release gate. A single trace is evidence for a failure mode; a versioned dataset of traces or tasks is the comparable measurement instrument. The promotion loop:
inspect representative trace
-> identify failure mode
-> turn it into a task / trace expectation
-> add it to a versioned dataset
-> rerun baseline and candidate
-> gate on the predeclared regression budgetUse trace tooling to find and localize failures; use datasets and eval runs to compare system versions. This keeps trace inspection from becoming another form of anecdotal "vibe eval."
Benchmarks measure cross-system capability against a shared standard. They predict how a model will do on the exact tasks the benchmark contains. They do not prove your specific system — with your prompt, tools, retrieval, latency budget, and user population — is good enough to ship.
| Benchmark | Measures | Cited for |
|---|---|---|
| MMLU (Hendrycks et al., 2021) | 57 subjects of multiple-choice general knowledge | Breadth of general capability (now saturated at the frontier — see note below) |
| HumanEval (Chen et al., 2021) | 164 programming problems graded by test execution | Code-generation correctness baseline |
| BIG-bench (Srivastava et al., 2022) | 200+ tasks across the long tail of NLP | Breadth of niche capabilities |
| GAIA (Mialon et al., 2023) | General-assistant multi-step tasks with tool use | Realistic agentic-task baseline |
| MT-Bench / Chatbot Arena (Zheng et al., 2023) | Pairwise preference comparison for chat | Human-aligned preference signal |
| HELM (Liang et al., 2022) | Multi-scenario, multi-metric model evaluation | Reminder that single metrics are incomplete |
| SimpleQA | Short fact-seeking questions | Factuality and calibration-style checks |
| SWE-bench family | Real software-issue resolution | Coding-agent capability baseline — only with an explicit benchmark member/version and current contamination/retirement status; OpenAI no longer treats SWE-bench Verified as suitable for frontier progress (flawed tests + contamination) and recommends SWE-bench Pro while new uncontaminated evals are built (known contamination vector — see § Benchmark Validity Is Decaying) |
| τ-bench / τ²-bench (2024–2025) | Multi-turn tool-use agents under explicit policies, shared world-state | Agentic / trajectory-task baseline |
The right use: pick a model partly on benchmark performance (and to notice upstream movement), then build system-specific evals to gate the actual deployment. Note that several headline benchmarks are now saturated at the frontier
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.