learn-model-evaluation-with-phoebe / Practitioner session 9 of 10
Learn Model Evaluation with Phoebe · Practitioner track · Session 9 of 10

Drift + continuous evaluation

Eight sessions of metrics, and every one of them was a snapshot. Tonight the snapshot becomes a film: capability evals that climb, regression evals that guard every merge, a golden set that grows from real production failures, and Rule #37's ladder that tells you WHO owns each offline-online gap. This is the session about the third project killer - static evals in a drifting world - and the loop that defeats it. b10 will write the plan onto the eval sheet; tonight you build the loop the plan describes.

🔴 Practitioner track DS · analysts · ML + AI engineers Python · live evaluator on key pages 45 min
0-3 · Welcome 3-18 · Evals as a process 18-42 · Build-along: the continuous loop 42-45 · Q&A
Part 1 · covers Anthropic "Demystifying evals for AI agents" + develop-tests

The third project killer 8 min live

The course spine names three project killers, and this is the last one: static evals in a drifting world. The story is always the same. The system passed its eval at launch. Then the data drifted, the vendor silently upgraded the model underneath it, and users found phrasings nobody had tested. Six months later a ticket arrives: "the AI stopped working" - and nobody can say when it stopped, or why, because after launch day nothing was measuring. The fix is not a better metric. It is turning evaluation from an event into a loop.

THE CONTINUOUS LOOP THE ONE-SHOT EVAL GOLDEN SET 20-50 real failures CI GATE dip = blocked merge SHIP version pinned PRODUCTION SAMPLING score a live slice nightly NEW FAILURES feed the golden set around again - every merge, every night EVAL AT LAUNCH passed once - shipped data drifts vendor upgrades new phrasings THE INCIDENT "the AI stopped working" Left: failures grow the golden set - the evals move with the world. Right: nothing measured, nothing known.
🔍 Click to zoom - the continuous loop vs the one-shot eval
Same number, opposite verdicts - which suite produced it? Both suites report a percentage. Only one of them is allowed to sit below 100. Capability eval 35% starts low and climbs as you build - a roadmap, not a failure Regression eval must hold at ~100% 96% any dip blocks the merge - 96% is an alarm, not a pass Capability evals ask what it can do; regression evals ask whether it still works. Yesterday's hardest capability cases graduate into today's regression suite.
🔍 Click to zoom - 35% can be healthy and 96% can be an emergency
LiveAnthropic's split: capability vs regression evals5 min▶

Anthropic's agent-eval guidance draws one line through every test you will ever write, and the line is the question the test answers:

  • Capability evals ask "what can it do?" They start at low pass rates and climb as you build - a capability eval at 35% is a roadmap, not a failure.
  • Regression evals ask "does it still work?" They hold at ~100%, and any dip blocks the merge. A regression eval at 96% is not "pretty good" - it is an alarm.

Most teams only ever build the first kind, run it once, and call the project evaluated. The second kind is what keeps b1-b8's numbers true next quarter: yesterday's hardest capability cases graduate into today's regression suite, and the suite runs on every change - your code, your prompts, your data, and (Part 2's point) the vendor's model.

The same guidance names the working posture: eval-driven development - write the evals BEFORE building the capability, the way test-driven developers write the test before the function. The eval defines "done"; the build chases it. Teams that eval after building inevitably eval what they built instead of what was needed.

LiveGolden-set-first, and the pass@k recap5 min▶

If you adopt one habit from tonight, adopt this one: before any build or fix, spend one hour collecting 20-50 cases from real failures into a golden set. It is the highest-ROI hour in applied ML - it converts "the AI seems off" into a number you can watch move, and it is the seed the whole loop above grows from. The first project killer (no golden set before building) and the third (static evals) have the same cure: the set exists early, and it keeps growing.

For agents, recall the two aggregate scores from the agents course - same data, opposite questions:

  • pass@k: at least one of k trials succeeds - the capability CEILING. "Can it ever do this?"
  • pass^k: all k trials succeed - the reliability FLOOR. "Can I depend on it?"

Capability evals naturally report pass@k flavors; regression evals should think in pass^k, because production does not get k attempts.

Real world

The vendor upgrade nobody announced. A support-bot team saw resolution quality slide over a weekend. No deploy, no data change - the API provider had upgraded the underlying model in place. The team had no regression suite pinned to a model version, so the first detector was a customer complaint thread. A 40-case golden set on a nightly cron would have caught it Saturday morning, with the delta labeled and dated. That suite now exists; it was written the following Monday, which is the expensive way to schedule it.

Part 2 · covers Google Rules of ML #37 + #24

Three gaps, three owners 10 min live

"Offline says 0.83, production feels broken" is not one mystery - it is three possible gaps stacked in a ladder, and Rule #37 of Google's Rules of ML names each rung. Measure the same metric at four checkpoints - training data, holdout, next-day data, live traffic - and the LOCATION of the gap tells you which team owns the fix. Debugging all three rungs as one blob is how a two-day fix becomes a two-month standoff.

GapWhat it meansWho owns itThe fix lives in
1 · Train vs holdoutOverfitting - the model memorized instead of learningModelingRegularization, simpler models, more data
2 · Holdout vs next-dayDrift or stale features - the world moved since the snapshotDataFeature freshness, retraining cadence, drift checks
3 · Next-day vs liveServing skew - the pipeline itself disagrees with trainingPlatformThe serving path: logging, transforms, feature parity
LiveRung 3 is the strange one - and the quote to keep4 min▶

Rungs 1 and 2 are statistics; rung 3 is not. A gap between next-day data and live traffic, in Rule #37's words, "typically signals engineering errors, since identical inputs should produce identical outputs." The model is fine, the data is fine - the serving pipeline is computing a feature differently than training did, dropping a field, or applying yesterday's encoder. That is why the ladder assigns it to platform, not to the modelers: no amount of retraining fixes a transform that disagrees with itself.

The diagnostic discipline: three gaps, three owners, three different fixes - never debug all three as one mystery. When someone says "the model got worse in prod," your first question is now: worse at which rung?

LiveVersion pinning, or: your vendor is on the ladder too4 min▶

The classic ladder assumed the model only changes when YOU change it. LLM systems break that assumption - the model can change under your feet. The discipline that restores it:

  • Pin model versions - exact version strings in config, never "latest". An unpinned model is an unowned rung 3.
  • Re-run the full suite on ANY model change - yours or the vendor's. A version bump is a deploy; treat it like one. Rule #24's companion habit applies: measure the delta between the new model and the current one on the same data before swapping.
  • Judge models too - b7 made the judge a measurement instrument with a calibration number. A judge-model upgrade silently re-calibrates every score it has ever produced, so the judge's version is pinned and its human-agreement number is re-measured on change, same as any other model.
Part 3 · covers Google Rules of ML #39, Anthropic production practice

The two-hop chain, completed ★ build-along · 14 min

b5 planted the flag; tonight the full picture. Rule #39: your launch metrics are proxies. The chain is eval score -> online metric -> business goal, and each hop breaks independently, which makes it a diagnostic tool and not just a humility exercise. Offline up, revenue flat is usually hop 1-2: drift or serving skew (Part 2's ladder), or an eval metric detached from real user pain. Engagement up, satisfaction down is hop 2-3: the classic clickbait failure, where the online metric itself stopped meaning what you hoped. Name the hop before proposing the fix.

The two-hop chain, used as a diagnostic hop 1-2 hop 2-3 Eval score your offline suite Online metric what users actually do Business goal the money and the mission Offline up, revenue flat the eval-to-online link broke drift, serving skew, or a metric detached from real user pain Engagement up, satisfaction down the online metric itself stopped meaning what you hoped - the classic clickbait failure Each hop breaks on its own, which is what makes the chain a diagnostic and not just humility. Name the hop before proposing the fix - the two symptoms point at two different teams.
🔍 Click to zoom - the symptom tells you which hop broke, and who owns it
LiveProduction sampling in practice5 min▶

The loop's fourth box, concretely: score a slice of live traffic on the SAME metrics as your offline eval, and alert on deltas against the eval baseline. Not all traffic - a sample; not new metrics - the same ones, so a delta means the world moved, not the ruler. Practical shape:

  • Sample 100-500 interactions a day (stratify by segment if b5's constraints are per-segment).
  • Score with the same graders the offline suite uses - code graders directly; LLM judges with the pinned judge version from b7.
  • Alert when a metric leaves its band vs the eval baseline; route the alert by the skew ladder's owner map.
  • User feedback (thumbs up/down) is a cheap online signal with known biases - angry users click more than happy ones, and most users click nothing. Use it as a trend line and a failure-case miner, never as the metric itself.

Now build the nightly job - the whole session in one pseudo-snippet. This is deliberately boring code: a cron, a sample, a comparison, an alert. The value is not in the cleverness; it is in the fact that it runs every night, forever.

Sample yesterday's traffic and score it with the exact metrics and graders the offline suite uses. Same ruler, new data.

Load the eval baseline recorded against the PINNED model version. If nobody wrote the baseline down at ship time, tonight's first action item writes it down.

Compare, and alert on any metric outside its band - routing by owner: modeling, data, or platform, per the ladder.

Queue the failures for golden-set review. This line is the loop closing: production's surprises become next week's regression cases.

# nightly_eval.py - the continuous loop as a cron job
sample   = sample_production_traffic(n=200, day="yesterday")
scores   = run_metrics(sample, metrics=SAME_METRICS_AS_OFFLINE)
baseline = load_baseline(model_version=PINNED)   # written at ship time

for name, value in scores.items():
    delta = value - baseline[name]
    if abs(delta) > ALERT_BAND[name]:
        page_the_owner(name, delta)              # skew ladder decides who

queue_for_golden_set(scores.failures)            # the loop closes here
Setting the alert band Run the job for two quiet weeks before wiring the pager - the day-to-day wobble you observe IS the band. Alerting on every wiggle trains everyone to ignore the alerts, which rebuilds the one-shot eval with extra steps.
Homework

Try it yourself - this week ◐ 30-40 min total

Source material

Official sources covered

Certificates and graded assessments stay with the official providers (linked each session). This page covers:

✓Anthropic - "Demystifying evals for AI agents" + develop-testsCapability vs regression, eval-driven development, golden-set-first, pass@k vs pass^k
✓Google Rules of ML - Rules #24, #37, #39The skew ladder + measuring model deltas · #39's chain, previewed in b5, completes here
◐OpenAI evals guide - the continuous-eval framingConcepts only - the platform is deprecating Nov 30, 2026; taxonomy stays with b7
◐learn-ai-evals-with-phoebe (sibling course)Tracing, observability, and CI wiring hands-on live there - this course owns the metrics
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · In Anthropic's split, which statement describes a REGRESSION eval?

Capability evals ("what can it do?") start low and climb; regression evals ("does it still work?") hold ~100% and gate every change. Option C is the one-shot pattern - the third project killer this whole session exists to kill.

2 · Holdout metrics look fine, but the same metric sags on next-day data. On Rule #37's ladder, who owns the fix?

Rung 2 (holdout vs next-day) belongs to data: freshness, retraining cadence, drift checks. A is rung 1 (train vs holdout); B is rung 3 (next-day vs live), which "typically signals engineering errors." Three gaps, three owners.

3 · The offline eval score improved for a quarter, but revenue is flat. Which hop of the two-hop chain most likely broke?

Offline-up-revenue-flat is the signature of hop 1-2: the eval score moved but the online metric never followed. Hop 2-3's signature is different - engagement up, satisfaction down. Name the hop first; the fix follows from the location.

Practitioner session 9 cheat sheet · pin this

Capability vs regression"What can it do?" starts low and climbs. "Does it still work?" holds ~100% - any dip blocks the merge. Build both.
Eval-driven developmentWrite the evals BEFORE building the capability. The eval defines done; the build chases it.
Golden-set-first20-50 cases from real failures, collected in one hour, before any fix. The highest-ROI hour in applied ML.
pass@k vs pass^kAt least one of k = capability ceiling. All k = reliability floor. Regression thinking is pass^k - production gets one attempt.
The skew ladder (Rule #37)Train-vs-holdout = overfitting (modeling) · holdout-vs-next-day = drift (data) · next-day-vs-live = engineering error (platform).
Version pinningPin every model incl. the judge; re-run the full suite on ANY change, yours or the vendor's. Measure the delta before swapping (Rule #24).
Two-hop chain (Rule #39)Eval -> online -> business. Offline-up-revenue-flat = hop 1-2. Engagement-up-satisfaction-down = hop 2-3.
Production samplingScore a live slice nightly on the SAME metrics, alert on band exits, feed failures back to the golden set. Thumbs = trend line, not metric.