Eval-Driven Agent Development
Anthropic's guidance: "start with simple prompts, optimize them with comprehensive evaluation, and add multi-step agentic systems only when needed." Evaluation isn't the last step. It's the outer loop that drives every other choice in Phase 14.
Learning Objectives
- Name the three evaluation layers — static benchmarks, custom offline, online production — and what each is for.
- Explain the evaluator-optimizer tight loop.
- Describe the 2026 best practice: evals live next to code, run in CI, gate PRs.
- Connect every Phase 14 lesson to the eval case it generates.
The Problem
Agents pass demos. They fail in production in ways a demo can't predict. A benchmark tells you whether a model is broadly capable, not whether this agent is shipping the right patches for your product. The fix is evaluation at three layers, running continuously, with every guardrail and learned rule mapped to an eval case.
The Concept
Three evaluation layers
Agent evaluation runs at three layers: static benchmarks, custom offline evals, and online evals in production. Each answers a different question.
-
Static benchmarks are off-the-shelf suites: SWE-bench Verified for code (Lesson 19), WebArena/OSWorld for browsing and desktop (Lesson 20), GAIA for generalist tasks (Lesson 19), BFCL V4 for tool use (Lesson 06). Use them for cross-model comparison and regression gating. Contamination is real: SWE-bench+ found 32.67% solution leakage. Always report Verified or audited scores.
-
Custom offline evals are shaped like your product:
- LLM-as-judge (Langfuse, Phoenix, Opik, Lesson 24).
- Execution-based: run the patch, check the tests.
- Trajectory-based: compare action sequences against a gold run. OSWorld-Human shows top agents taking 1.4-2.7x the gold step count.
-
Online evals watch production:
- Session replays (Langfuse).
- Guardrail-triggered alerts (Lesson 16, 21).
- Per-step cost and latency tracking (Lesson 23 OTel spans).
Evaluator-optimizer (Anthropic)
Evaluator-optimizer is a tight loop in which one component proposes output and another judges it, and you refine until the judge passes:
- Proposer generates output.
- Evaluator judges.
- Refine until the evaluator passes.
This is Self-Refine (Lesson 05) generalized. Any agent flow you care about can be wrapped in it for reliability.
2026 best practice
- Evals live next to the code.
- They run in CI on every PR.
- Merges are gated on eval scores (e.g. "no regression > 5% vs main").
- Every guardrail maps to an eval case.
- Every learned rule (Reflexion, pro-workflow learn-rule) maps to a failure case.
Tying Phase 14 together
Every lesson in Phase 14 generates eval cases:
| Lesson | Eval case it generates |
|---|---|
| 01 Agent Loop | Budget-exhausted, infinite-loop guard |
| 02 ReWOO | Planner replans correctly when a tool fails |
| 03 Reflexion | Learned reflections apply on retry |
| 05 Self-Refine/CRITIC | Judge passes refined output |
| 06 Tool Use | Argument coercion works; unknown tools rejected |
| 07-10 Memory | Retrieval citations match sources; stale facts invalidate |
| 12 Workflow Patterns | Each pattern produces correct output |
| 13 LangGraph | Resume reproduces state exactly |
| 14 AutoGen Actors | DLQ catches crashed handlers |
| 16 OpenAI Agents SDK | Guardrail trips on the right inputs |
| 17 Claude Agent SDK | Subagent results return to orchestrator |
| 19-20 Benchmarks | SWE-bench Verified score, WebArena success rate, OSWorld efficiency |
| 21 Computer Use | Per-step safety catches injected DOM |
| 23 OTel | Spans emit required attributes |
| 26 Failure Modes | Detectors tag known failures |
| 27 Prompt Injection | PVE refuses poisoned retrievals |
| 28 Orchestration | Supervisor routes to the right specialist |
| 29 Runtime Shapes | DLQ handles N% failure |
If your eval suite has a case for each row, you've covered Phase 14.
Where eval-driven development fails
- No baseline. Without a last-known-good, eval scores are unreadable. Store baselines.
- LLM-judge without grounding. Judges hallucinate too. Use the CRITIC pattern (Lesson 05) so the judge grounds its verdict on external tools.
- Over-fitting to evals. Optimizing for the eval set drifts away from what's useful in production. Rotate cases.
- Flaky evals. Non-deterministic cases cause false alarms. Pin seeds and snapshot state.
Build It
code/main.py is a stdlib eval harness with four parts:
- A case registry with categories (benchmark, custom, online).
- A scripted agent under test.
- An evaluator-optimizer loop: propose, judge, refine until pass or max rounds.
- A CI gate: aggregate pass rate plus regression against baseline.
Run it:
python3 code/main.py
The output is per-case pass/fail, a regression flag, and the CI gate verdict.
Use It
- Write eval cases in the same repo as your agent code.
- Run them on every PR via CI.
- Fail the build on regression.
- Track pass rate over time.
- Tie every production failure to a new case.
Ship It
outputs/skill-eval-suite.md is a skill that builds a three-layer eval suite for an agent product, with CI gates and regression tracking.
My bet is that the eval suite belongs ahead of the agent's structure, not after it. The motto puts evaluation before multi-step agentic systems, and I take that literally: I treat a missing eval case as a missing feature. I'd want every production failure to land in the repo as a case, and I'd want the CI gate failing the build on regression before I trusted a new agent design. I'd also keep a stored baseline, because without a last-known-good the scores can't tell me whether a change helped. And I wouldn't rely on an ungrounded judge to decide any of this, since judges hallucinate too.
Exercises
- Take one of your production failures. Write an eval case that reproduces it. Does your agent pass it now?
- Build an LLM-judge rubric for your domain with three dimensions (factual, tone, scope). Score 50 sessions.
- Wire the eval suite into CI. Fail the build on >=5% regression.
- Add a trajectory-efficiency metric: how many steps did the agent take vs a gold trajectory?
- Map every Phase 14 lesson to an eval case in your suite. Anything missing is a gap to close.
Key Terms
| Term | What people say | What it actually means |
|---|---|---|
| Static benchmark | "Off-the-shelf eval" | SWE-bench, GAIA, AgentBench, WebArena, OSWorld |
| Custom offline eval | "Domain eval" | LLM-as-judge / exec / trajectory on your product shape |
| Online eval | "Production eval" | Session replay, guardrail alerts, cost/latency tracking |
| Evaluator-optimizer | "Propose-judge-refine" | Iterate until judge passes |
| CI gate | "Merge blocker" | Fail the build on eval regression |
| Baseline | "Last-known-good" | Reference score to detect regression |
| Trajectory efficiency | "Steps over gold" | Agent step count divided by gold-trajectory step count |
Further Reading
- Anthropic, Building Effective Agents: "start simple, optimize with evals"
- OpenAI, SWE-bench Verified: the curated benchmark
- Berkeley Function Calling Leaderboard: tool-use benchmark
- Langfuse docs: evals + session replay in practice
Code
- main.py (python, 180 lines)