An agent that “seems to work” is an agent nobody has measured. LLMs are non-deterministic and fail quietly: the demo shines, then week two produces a nonsense answer nobody saw coming. Evaluation and observability are how you replace “it seems fine” with numbers.

The analogy

The dashboard and the crash test. Observability is the dashboard: speed, fuel, warning lights — you see what the system is doing while it drives. Evals are the crash tests: before shipping a change, you run it into the same wall as last time and check it survives. No carmaker ships on “the test driver felt good about it”.

The principle

flowchart LR
    P["prompt or code change"] --> E["run the eval set"]
    E --> S{"scores vs baseline"}
    S -->|better or equal| SHIP([ship])
    S -->|regression| P
    PROD["production traces"] -->|"failures become new test cases"| E

Two habits, one loop:

  • Observe everything. Log each step of every run: the exact prompt, the tool calls and their results, tokens spent, the final output. When something breaks, the trace tells you which step drifted — without it you’re debugging a black box.
  • Evaluate on a fixed set. A few dozen real cases with expected outcomes. Score them the same way after every change. Where checks can’t be programmatic (“is this summary faithful?”), use a second model as judge — an evaluator with an explicit rubric, spot-checked by a human.

A concrete example

A team maintains a contract-analysis assistant:

eval set → 50 real contracts + expected key clauses
change   → someone "improves" the extraction prompt
run      → clause recall drops 92% → 71% on renewal dates
verdict  → the new prompt is better at summaries,
           worse at dates — rejected, fixed, re-run: 94%

Without the eval set, that regression ships silently and a customer finds it.

The starter kit

  • Start with 20 cases, not 500 — real inputs, drawn from actual usage, including the ugly ones.
  • Every production failure becomes a test case. Your eval set grows from reality, like a regression suite.
  • Score simply: exact-match where possible, rubric-based judge where not, human sampling to calibrate the judge.
  • Track cost and latency too — a prompt that’s 2% better and 3× more expensive is usually a regression (see budgets & limits).

The classic trap

Grading on vibes — including the model grading itself. “I read three answers and they looked good” doesn’t survive contact with a prompt change. And an LLM judging with no rubric says “looks good” almost as often as a human skimming. Fixed set, explicit criteria, same measurement every time — that’s the whole trick.