← All sessionsHomeSearch
AI Sprints (Live Weekend Programs)·Building & Shipping Reliable AI·4:11:00

AI Sprint: AI Evals & Reliability — Day 2 (Testing Systems That Never Answer Twice)

Sugam Guest mentor — head of engineering at Outskill, returning from Day 1; teaches the whole eval curriculum through one running analogy (the driving test) and one running demo app (his self-built support bot). Self-positioning kept humble: 'I am not a mentor... I'm just like you, like a developer.' · Sumedha Sprint host — runs the final hour: LMS/recordings walkthrough, the new self-serve certificate tool demo, program pitches, and the community stories segment

The short version

  1. The sprint's day-2 thesis, set up by running the same ChatGPT prompt twice and getting two different valid answers: 'Evals are test for system that does not give the same answer twice.' Traditional testing dies with it — 'assert equal is dead' — because 'you are not testing a value anymore. You are measuring a spread.'
  2. The why-now is a moat argument: everyone can call the same frontier model, but 'almost nobody can measure them for their own use case. That's the gap' — and the vibe-check alternatives (try-and-see, ship-and-watch, ask-another-AI) get named and executed one by one. 'Luck is not a strategy, dude.'
  3. The whole curriculum runs on one analogy — the driving test. Anatomy of an eval: dataset (the route), golden (the correct answer, HUMAN-written), runner (your app), scorer (the examiner), report (the license). Two iron rules: inputs come from real users ('real people phrase things in a way you will never phrase it') and goldens are written or checked by a human — AI-written goldens just measure 'an AI against an AI and calling it truth.'
  4. Three scoring strategies, demoed live on his support bot: exact match (cheap, deterministic, works once you force fixed-schema JSON output — 'the cheapest quality lever there is, and almost nobody pulls it'), LLM-as-judge (for tone/politeness/open-ended answers, with four design rules), and trajectory (grade the DECISION PATH of an agent — which tools were called in what order — because an agent can produce 'the right answer for the wrong reason').
  5. The judge problem gets the session's sharpest reframe: a judge never certifies correctness — the only honest metric is 'how often does the judge agree with a human?' The calibration protocol: 5 human raters × 40 outputs as ground truth, run the judge on the same set, report agreement ('87% agreement across 200 human-labeled cases' is a boardroom-defensible sentence), recalibrate whenever the model changes. A jury of judges beats one judge; same-family judges favor their own model's outputs.
  6. The single most important practice, per Sugam: the error-analysis loop. 'Nobody ever improve a system by staring at an average number' — run the eval, READ every failure, cluster them, name them, count them, fix the largest cluster, rerun. Demoed live: his bot scored 66.7% (8/12) across 3 named clusters. And every fixed bug 'become a permanent test route' — a dataset row that can never silently regress.
  7. The closing distinctions: eval overfitting ('you taught it the route... not the learning') with four mitigations, and evals vs guardrails — 'an eval is a driving test. Guardrail is the examiner's second brake pedal': pre-ship vs live-traffic, minutes vs milliseconds, which is why a guardrail can never be a slow LLM judge.

The concepts

01

Assert equal is dead: testing systems that never answer twice

He types the same one-line apology prompt into ChatGPT twice, live. Two different answers come back. Both are fine. Every testing instinct you have just broke.

Traditional software is deterministic — add(2,3) returns 5 every time, so testing is assert-equal. An LLM system returns a different, equally valid answer on every run, so 'you are not testing a value anymore. You are measuring a spread.' Evals are simply testing rebuilt for that reality: run many cases, score each against a standard, read the distribution.

The urgency is framed as four questions the room cannot answer: which model is best FOR YOUR USE CASE, by how much, is the new model actually better, and is a 1-in-1000 failure acceptable? Public leaderboards answer none of them 'because they haven't seen your data.' His refrain: 'the answer to every question tonight is testing.' The moat framing follows — everyone calls the same models; measurement is the differentiator, and 'it won't stay open always.'

Worked example · from the session

The rejected alternatives, each named: 'try it and see,' 'ship it and watch,' and asking another AI to check the first AI naively. A/B testing is granted validity but 'not a starting point' — it experiments on live paying customers first.

Why it matters

Everything else in the session — anatomy, scorers, judges, error analysis — is the machinery this diagnosis demands.

People get this wrong

AI outputs can't be tested because they're never the same twice.

They can't be ASSERT-EQUAL tested. They can absolutely be scored against standards across many runs — that's the entire discipline the session teaches.

For your projects

This KB's own extraction pipeline is a non-deterministic system — the validate.py 0/0 gate is a deterministic scorer; concept quality has no eval. His 3-case starter kit would apply.

Go deeper

In one line: An eval = a repeatable test harness for non-deterministic systems: many real inputs, a scoring standard, and a distribution read — replacing assert-equal, which requires determinism that LLMs do not offer.

'Evals are test for system that does not give the same answer twice' ()

Same ChatGPT prompt run twice live -> two different valid apologies ()

'Assert equal is dead... you are measuring a spread' ()

Leaderboards can't answer 'good for YOU' - they haven't seen your data ()

The moat: 'almost nobody can measure them for their own use case. That's the gap' ()

Try it now

Run your most important prompt 5 times and diff the outputs. If they differ (they will), you have a spread, not a value — and a testing gap.

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

Why can't a leaderboard tell you whether to upgrade models?

It measures generic benchmarks, not your inputs, your goldens, or your failure tolerance. Only an eval on your own dataset answers 'better for us, by how much, at what risk.'

02

Anatomy of an eval: dataset, golden, runner, scorer, report — the driving test

A driving test doesn't ask the examiner to vibe-check you. It has a route, a definition of correct, a candidate, an examiner, and a license. So does every real eval.

Five parts, one analogy. DATASET = the test route: real customer messages ('my payment failed twice' -> billing; 'canceling, this is unusable' -> churn risk, highest severity, route to a human). GOLDEN = the correct answer — 'the right answers are golden because a human wrote them.' RUNNER = the application under test. SCORER = the examiner. REPORT = the license.

Two iron rules carry the section. Rule 1: inputs must come from REAL users, because 'real people phrase things in a way you will never phrase it.' Rule 2: goldens are human-written or at least human-checked — otherwise you are measuring 'an AI against an AI and calling it truth.' The sanctioned division of labor: AI may generate input VARIETIES; a human owns every golden. And the dataset must include negative examples — questions with no valid answer ('what's the weather on Mars?', 'what's my account balance?') — because 'a bot that makes up a balance is worse than one that says I cannot see that.'

Sizing doctrine kills the perfectionism excuse: the jump from 0 to 3 cases matters more than 3 to 50. 'A small eval beats no eval.' Start at 3-10, grow to 50 when it matters.

Worked example · from the session

The support-bot dataset table walked on screen: input message, expected category, expected severity — including the churn-risk row that must route to a human agent.

Why it matters

Every scoring strategy and the whole error-analysis loop operate ON this structure; get the dataset and goldens wrong and everything downstream measures noise.

People get this wrong

An eval isn't credible until it has hundreds of cases.

The credibility threshold is real inputs + human goldens, not volume. Three honest cases catch regressions that zero cases never will.

Anatomy of an eval — five parts, one driving test DATASET the test route real user inputs + negative examples GOLDEN the correct answer written by a HUMAN RUNNER the candidate your app, as shipped SCORER the examiner exact match, judge, or trajectory REPORT the license score + failures, not just a % The two iron rules: inputs from REAL users - goldens human-written or human-checked. AI may generate input varieties; "an AI against an AI... called truth" is not an eval. Start at 3 cases - "a small eval beats no eval" - grow to ~50 when it matters
The five parts of an eval, mapped to the driving test that teaches them
Go deeper

In one line: Eval = dataset (real inputs + negative examples) + goldens (human-written) + runner (your app) + scorer + report. Iron rules: real inputs, human goldens; AI generates varieties only. 0->3 cases is the big jump; 3-10 to start, ~50 when it matters.

Five parts mapped to the driving test (1:09:00-1:11:00)

Rule 1 real inputs, Rule 2 human goldens - else 'AI against an AI... called truth' (1:14:00-1:15:00)

Negative examples test refusal: 'a bot that makes up a balance is worse' ()

'A small eval beats no eval' - 0->3 beats 3->50 ()

His closing '$3 eval' recipe: 3 real inputs, hand-made goldens, no AI-written answers ()

Try it now

Write 3 rows tonight: 3 real inputs (from real users or your own real usage), 3 hand-written goldens, 1 negative example. That is a functioning eval dataset.

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

Your teammate proposes generating 50 eval cases with GPT, goldens included. What's your line?

AI-generated INPUTS are fine as varieties of real messages; AI-generated GOLDENS are forbidden — a human writes or verifies every correct answer, or the eval measures model-vs-model agreement, not truth.

03

Three scorers: exact match, LLM-as-judge, trajectory — and the work-down-the-list rule

Golden: '25'. Output: 'the result of 5 times 5 is 25.' Pass or fail? Your answer decides which scorer you need.

EXACT MATCH: free, instant, deterministic — and 'weak against unstructured text' (the 5x5 answer above fails a string compare while being right). The fix is upstream: force the model to answer in fixed-schema JSON, which converts open text into exact-matchable fields — 'the cheapest quality lever there is, and almost nobody pulls it.' The scorer taxonomy runs Boolean, scale, label, deterministic code, LLM-judge, with one rule: work DOWN the list — '2+2 is 4, don't ask an LLM.'

LLM-AS-JUDGE: for what code can't check — tone, politeness, helpfulness. Demoed on an angry customer message with a criteria rubric. Four design rules: force structured judge output (1/0, not a paragraph); give an escape hatch ('if you can't tell, say so'); write a real rubric, not 'is this good?'; and the judge should be cheaper/lighter than the model it judges.

TRAJECTORY: for agents, grade the DECISION PATH, not the answer — did it call lookup_order before issue_refund, did it check eligibility, 'did you check the mirror before you signal.' The threat it catches is the false positive: an agent that reaches the right answer without verifying — 'right answer for the wrong reason' — which exact match happily passes. The advanced form keeps a hand-maintained substitute-tool list (tools that legitimately do the same job) and optionally a judge assessing tool-intent equivalence, closing with a cost/hallucination-risk/best-use comparison table of all three.

Worked example · from the session

The smallest possible eval, live-coded in Cursor: a Python list of {input, expected, category} plus a one-line exact_match function. 'A couple of inputs, the expected answer, and a one line check that compares them. That's a real eval.'

Why it matters

Scorer choice is where eval budgets explode or stay at pennies — the work-down-the-list rule and the JSON lever keep 80% of checks deterministic and free.

People get this wrong

LLM-as-judge is the default modern scorer.

It's the LAST resort on the list — expensive, non-deterministic, needing calibration. Structure your outputs and most checks become free exact matches; save the judge for tone and open-ended quality.

Go deeper

In one line: Scorer selection = cheapest sufficient check: exact match on structured JSON where possible; LLM-judge (structured output, escape hatch, real rubric, cheaper model) for open-ended quality; trajectory scoring of tool-call paths for agents, with substitute-tool tiers for legitimate variation.

The 5x5=25 quiz: intent passes, string compare fails - know which you're measuring (1:30:00-1:32:00)

Fixed-schema JSON output = 'the cheapest quality lever there is' (1:32:00-1:33:00)

Judge rules: structured verdict, escape hatch, real rubric, judge cheaper than judged (1:42:00-1:45:00)

Trajectory catches 'right answer for the wrong reason' - the agent false positive (1:52:00-1:54:00)

Substitute-tool tier list + judge-assessed tool-intent equivalence for advanced agents (1:59:00-2:03:00)

Claude Sonnet 4.5 as the live demo's judge model ()

Try it now

Take one AI output you check by eye. Write the JSON schema that would make it exact-matchable. That schema change alone usually improves the output too.

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

An agent issued a correct refund but never called the eligibility check. Exact match passes it. What flags it?

Trajectory scoring — the expected tool-call path includes the eligibility check, so the run fails on path even though the outcome matched. That's the false positive trajectory exists to catch.

04

The judge problem: agreement rate, the 5×40 protocol, and the jury

'What's wrong with using an LLM to judge an LLM?' The room answers: bias, hallucination, lost context. All true — and all missing the actual mistake.

The reframe: 'the mistake is thinking a judge certifies correctness. It does not. It never claimed to.' If you need correctness, use a deterministic check. A judge is a MEASUREMENT INSTRUMENT, and instruments get calibrated: the honest question is 'how often does the judge agree with a human?'

The calibration protocol, four steps: (1) build human ground truth — 5 raters across 40 outputs; (2) run the candidate judge on the same set; (3) report the agreement rate — his worked example: 174/200 = 87%, producing the boardroom-defensible sentence '87% agreement across 200 human-labeled cases'; (4) recalibrate every time the underlying model changes. Two structural upgrades: a JURY of judges 'almost always beats a single judge... independent errors partly cancel out,' and never let the judge share a model family with the generator — self-recognition bias makes models favor their own outputs.

He grounds the pattern's legitimacy in production reality: this exact architecture runs today at DoorDash, Uber, and Dropbox, publicly documented (his claim, flagged as dating).

Worked example · from the session

Outskill's own setup in Langfuse — datasets, goldens, and judge calibration on their real support tickets pulled via the Freshdesk MCP; he offers to demo the production instance but the clock wins.

Why it matters

Without calibration, an LLM-judge eval is an opinion with decimals. With it, the judge becomes a defensible instrument with a known error rate.

People get this wrong

A smarter judge model makes calibration unnecessary.

Capability doesn't equal alignment with YOUR rubric. Any judge, however smart, only earns trust through measured agreement with your human raters.

Go deeper

In one line: LLM-judge validity = judge-human agreement rate, measured on a human-labeled sample (5 raters × 40 outputs), reported as N/M agreement, recalibrated on every model change; strengthened by multi-model juries and cross-family judge selection.

'A judge certifies correctness' is the mistake - it measures, it doesn't certify ()

Protocol: 5 raters x 40 outputs -> run judge -> agreement rate -> recalibrate on model change (2:26:00-2:27:00)

'87% agreement across 200 human-labeled cases' as the defensible claim shape (2:24:00-2:26:00)

Jury of judges: independent errors partly cancel ()

Self-recognition bias: same-family judges favor their own generator ()

In production at DoorDash/Uber/Dropbox per Sugam, publicly documented (2:20:00-2:21:00)

Try it now

Before trusting any judge prompt: hand-label 20 outputs yourself, run the judge, count agreements. Under 80% agreement, rewrite the rubric before believing a single score.

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

Your judge says quality improved after a model swap. What must be true before you report that upstairs?

The judge was recalibrated against human labels AFTER the swap — model changes invalidate prior calibration, and an uncalibrated judge's delta is noise with confidence.

05

The error-analysis loop: read every failure, fix the largest cluster

His bot scored 66.7%. The number tells you nothing. The four failures, read one by one, tell you everything — 'nobody ever improve a system by staring at an average number.'

The practice he names as the single most important takeaway. A failed driving test doesn't return a percentage — it returns a breakdown sheet. The loop: run the eval -> READ every failure ('actually read them') -> cluster the failures -> NAME each cluster -> count them -> fix the LARGEST cluster -> rerun. Priority is by count, not by which failure annoys you.

Live on the support bot: 12 cases, 8 passed, 66.7%, three named clusters — including a severity underrate ('the app crashed and I lost an hour of work' scored 4, humans say 5) and an out-of-scope miss ('what is my account balance' answered instead of refused). Then the compounding rule that turns debugging into an asset: every fixed bug 'become a permanent test route' — a new dataset row forever, so the regression 'can never silently come back.' The failure-mode catalog doubles as the handoff artifact a departing developer owes the next one.

Worked example · from the session

The two live failures dissected on screen: severity-4-should-be-5 on the crash complaint; the account-balance question that should have hit the refusal path from the anatomy section's negative examples.

Why it matters

This loop is the entire improvement engine — scorers only produce numbers; reading failures produces fixes, and the permanent-row rule makes each fix cumulative.

People get this wrong

A rising eval score means the system is improving.

Only if the dataset is also growing with every fixed failure. A static dataset with a tuned prompt can rise while production gets worse — that's the overfitting trap next door.

The error-analysis loop - "nobody ever improved a system staring at an average" RUN the eval suite READ every failure CLUSTER group alike NAME + COUNT each cluster FIX largest cluster RERUN and compare Every fixed bug becomes a PERMANENT dataset row - "it can never silently come back" demo: 8/12, 3 clusters Priority is by cluster COUNT, not by which failure annoys you
The six-step loop — and every fixed bug becomes a permanent dataset row
For your projects

Paul's update-filter memo for the LWP pilot is a failure catalog by another name — course practices that failed the current-version check, named and counted.

Go deeper

In one line: Error analysis = run -> read every failure -> cluster -> name -> count -> fix largest -> rerun; failures prioritized by cluster size; every fix appended to the dataset permanently; the failure catalog is the developer handoff artifact.

'Nobody ever improve a system by staring at an average number' ()

Six steps, priority by cluster count (2:37:00-2:38:00)

Live: 66.7%, 8/12, three named clusters ()

'Every bug you fix become a permanent test route' - no silent regressions (2:42:00-2:43:00)

Failure-mode doc = the handoff artifact between developers (2:43:00-2:44:00)

Try it now

Next time any AI workflow of yours misfires, don't just fix it: write the failing input + correct output into a cases file. Ten misfires later you own a regression suite you never scheduled time to build.

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

Two clusters: one failure that embarrasses you in demos, four failures of a duller kind. Which gets fixed first?

The four — the loop fixes the LARGEST cluster first. Count, not embarrassment, sets priority; the demo bug goes in the dataset and waits its turn.

06

Beyond the basics: RAG splits, session-level grading, adversarial suites

'A RAG system sits on an open book exam' — so failing it has two completely different meanings: couldn't find the page, or found it and invented the answer anyway.

Three extensions, briefly but sharply drawn. RAG: evaluate retrieval ('did it open the right page?') SEPARATELY from generation ('did it answer from the book or make it up?') because the two failures 'need completely different fixes' — a retrieval fix is chunking/embedding work, a generation fix is prompting/grounding work.

MULTI-TURN: a bot can pass every individual turn and still fail the conversation — so conversational systems need SESSION-LEVEL grading on task completion, resolution, and recovery, not per-turn scores alone.

ADVERSARIAL: a deliberate attack suite — prompt injection, jailbreaks, PII leakage, tool misuse, off-topic drift — with the stakes escalating by system type: 'a chatbot that gets injected says something embarrassing. An agent that gets injected takes an action.'

Worked example · from the session

The account-balance failure from the error-analysis demo doubles as the adversarial seed: an out-of-scope probe that should route to refusal, not invention.

Why it matters

These are the eval categories Paul's actual systems will need first — every client RAG bot needs the retrieval/generation split, and anything with tool access needs the injection suite.

People get this wrong

A RAG bot's wrong answer means the model is hallucinating.

Half the time the retriever never surfaced the right context — and that failure needs chunking/embedding work, not a better model. Split the eval or you fix the wrong layer.

Go deeper

In one line: RAG evals split retrieval from generation; conversational evals grade sessions, not turns; adversarial evals attack with injection/jailbreak/PII/tool-misuse/drift cases — with agents facing action-level, not embarrassment-level, stakes.

'A RAG system sits on an open book exam' - two failure types, two fix families (2:44:00-2:45:00)

Session-level grading: pass every turn, fail the conversation (2:45:00-2:46:00)

Adversarial categories: injection, jailbreak, PII, tool misuse, drift (2:46:00-2:47:00)

'A chatbot... says something embarrassing. An agent... takes an action' ()

Try it now

For any RAG system you run: log which chunks were retrieved for 5 real questions and check them by hand before blaming the model for a bad answer.

▶ Watch this taught:

07

Overfitting the test route, and the guardrail on the other side of the ship line

He tuned a prompt to 96% on the eval set. Production got worse. '96 percent, then worse' — the eval had become the thing being learned.

EVAL OVERFITTING is the driving-school scandal: 'you taught it the route. You have not taught the learning to the system.' Tuning against a fixed set optimizes for those 50 cases — 'you did not build a better system, you built one that's good at your 50 cases.' Four mitigations: hold out a test set you never tune against; refresh the dataset from live traffic; delete production leakage out of the eval; grow the dataset from newly discovered failures (which the error-analysis loop does automatically).

EVALS VS GUARDRAILS is the ship-line distinction: 'an eval is a driving test. Guardrail is the examiner's second brake pedal.' Eval: before ship, fixed dataset, minutes, outputs a score and a ship/no-ship decision. Guardrail: after ship, live traffic, MILLISECONDS, and it acts — blocks, rewrites, escalates to a human. The latency budget dictates the tooling: 'you cannot use a slow LLM judge as a guardrail' — guardrails run on exact match, schema validation, tool-call allow-lists, PII redaction, refusal detection, and cost ceilings.

Worked example · from the session

The guardrail shopping list he closes with — PII redactor, refusal detector, tool allow-list, cost ceiling — all deterministic, all millisecond-fast, all buildable from the scorers taught two hours earlier.

Why it matters

These two distinctions keep the whole discipline honest: overfitting mitigation protects the eval's meaning; the guardrail split stops teams from shipping a 3-minute judge as a 'safety check' that melts under live traffic.

Go deeper

In one line: Overfitting mitigations: hold-out set, live-traffic refresh, leakage deletion, failure-driven growth. Evals (pre-ship, dataset, minutes, score) vs guardrails (live, per-request, milliseconds, action) — guardrails must be deterministic-fast, never slow LLM judges.

'You taught it the route' - 96% on evals, worse in production (2:47:00-2:48:00)

Four mitigations incl. hold-out set and failure-driven growth ()

'An eval is a driving test. Guardrail is the examiner's second brake pedal' ()

Guardrails: milliseconds, deterministic - 'you cannot use a slow LLM judge' ()

Guardrail types: PII redaction, refusal detection, allow-lists, cost ceilings (2:52:00-2:53:00)

Try it now

Split any eval dataset you build 80/20 today - tune on the 80, report on the 20, and never look at the 20 while prompting.

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

Your team wants the calibrated judge from earlier to screen every live response. What's the objection?

Latency and role: a judge is an eval-time instrument measured in minutes; guardrails must act in milliseconds on live traffic, so they use deterministic checks - schema validation, allow-lists, redaction - not judges.

Every concept, three clicks deep

The same concepts as a quick reference: the closed row is the glance, open is the study card, and every timestamp jumps into the recording.

01Assert equal is dead: testing systems that never answer twiceAn eval = a repeatable test harness for non-deterministic systems: many real inputs, a scoring standard, an…

An eval = a repeatable test harness for non-deterministic systems: many real inputs, a scoring standard, and a distribution read — replacing assert-equal, which requires determinism that LLMs do not offer.

'Evals are test for system that does not give the same answer twice' ()

Same ChatGPT prompt run twice live -> two different valid apologies ()

'Assert equal is dead... you are measuring a spread' ()

Leaderboards can't answer 'good for YOU' - they haven't seen your data ()

The moat: 'almost nobody can measure them for their own use case. That's the gap' ()

02Anatomy of an eval: dataset, golden, runner, scorer, report — the driving testEval = dataset (real inputs + negative examples) + goldens (human-written) + runner (your app) + scorer + r…

Eval = dataset (real inputs + negative examples) + goldens (human-written) + runner (your app) + scorer + report. Iron rules: real inputs, human goldens; AI generates varieties only. 0->3 cases is the big jump; 3-10 to start, ~50 when it matters.

Five parts mapped to the driving test (1:09:00-1:11:00)

Rule 1 real inputs, Rule 2 human goldens - else 'AI against an AI... called truth' (1:14:00-1:15:00)

Negative examples test refusal: 'a bot that makes up a balance is worse' ()

'A small eval beats no eval' - 0->3 beats 3->50 ()

His closing '$3 eval' recipe: 3 real inputs, hand-made goldens, no AI-written answers ()

03Three scorers: exact match, LLM-as-judge, trajectory — and the work-down-the-list ruleScorer selection = cheapest sufficient check: exact match on structured JSON where possible;

Scorer selection = cheapest sufficient check: exact match on structured JSON where possible; LLM-judge (structured output, escape hatch, real rubric, cheaper model) for open-ended quality; trajectory scoring of tool-call paths for agents, with substitute-tool tiers for legitimate variation.

The 5x5=25 quiz: intent passes, string compare fails - know which you're measuring (1:30:00-1:32:00)

Fixed-schema JSON output = 'the cheapest quality lever there is' (1:32:00-1:33:00)

Judge rules: structured verdict, escape hatch, real rubric, judge cheaper than judged (1:42:00-1:45:00)

Trajectory catches 'right answer for the wrong reason' - the agent false positive (1:52:00-1:54:00)

Substitute-tool tier list + judge-assessed tool-intent equivalence for advanced agents (1:59:00-2:03:00)

Claude Sonnet 4.5 as the live demo's judge model ()

04The judge problem: agreement rate, the 5×40 protocol, and the juryLLM-judge validity = judge-human agreement rate, measured on a human-labeled sample (5 raters × 40 outputs)…

LLM-judge validity = judge-human agreement rate, measured on a human-labeled sample (5 raters × 40 outputs), reported as N/M agreement, recalibrated on every model change; strengthened by multi-model juries and cross-family judge selection.

'A judge certifies correctness' is the mistake - it measures, it doesn't certify ()

Protocol: 5 raters x 40 outputs -> run judge -> agreement rate -> recalibrate on model change (2:26:00-2:27:00)

'87% agreement across 200 human-labeled cases' as the defensible claim shape (2:24:00-2:26:00)

Jury of judges: independent errors partly cancel ()

Self-recognition bias: same-family judges favor their own generator ()

In production at DoorDash/Uber/Dropbox per Sugam, publicly documented (2:20:00-2:21:00)

05The error-analysis loop: read every failure, fix the largest clusterError analysis = run -> read every failure -> cluster -> name -> count -> fix largest -> rerun;

Error analysis = run -> read every failure -> cluster -> name -> count -> fix largest -> rerun; failures prioritized by cluster size; every fix appended to the dataset permanently; the failure catalog is the developer handoff artifact.

'Nobody ever improve a system by staring at an average number' ()

Six steps, priority by cluster count (2:37:00-2:38:00)

Live: 66.7%, 8/12, three named clusters ()

'Every bug you fix become a permanent test route' - no silent regressions (2:42:00-2:43:00)

Failure-mode doc = the handoff artifact between developers (2:43:00-2:44:00)

06Beyond the basics: RAG splits, session-level grading, adversarial suitesRAG evals split retrieval from generation;

RAG evals split retrieval from generation; conversational evals grade sessions, not turns; adversarial evals attack with injection/jailbreak/PII/tool-misuse/drift cases — with agents facing action-level, not embarrassment-level, stakes.

'A RAG system sits on an open book exam' - two failure types, two fix families (2:44:00-2:45:00)

Session-level grading: pass every turn, fail the conversation (2:45:00-2:46:00)

Adversarial categories: injection, jailbreak, PII, tool misuse, drift (2:46:00-2:47:00)

'A chatbot... says something embarrassing. An agent... takes an action' ()

07Overfitting the test route, and the guardrail on the other side of the ship lineOverfitting mitigations: hold-out set, live-traffic refresh, leakage deletion, failure-driven growth.

Overfitting mitigations: hold-out set, live-traffic refresh, leakage deletion, failure-driven growth. Evals (pre-ship, dataset, minutes, score) vs guardrails (live, per-request, milliseconds, action) — guardrails must be deterministic-fast, never slow LLM judges.

'You taught it the route' - 96% on evals, worse in production (2:47:00-2:48:00)

Four mitigations incl. hold-out set and failure-driven growth ()

'An eval is a driving test. Guardrail is the examiner's second brake pedal' ()

Guardrails: milliseconds, deterministic - 'you cannot use a slow LLM judge' ()

Guardrail types: PII redaction, refusal detection, allow-lists, cost ceilings (2:52:00-2:53:00)

Tools referenced

ToolCoverageMomentContext
LangfusedemonstratedHis primary eval platform - datasets, goldens, calibration, tracing; Outskill's production setup runs on it
CursordemonstratedLive-coding the smallest possible eval in Python
ChatGPTdemonstratedThe same-prompt-twice non-determinism demo
ClaudedemonstratedSonnet 4.5 as the live demo's LLM judge
OpenRouterdemonstratedBYOK keys powering the support bot's multi-model orchestration
FreshdeskdemonstratedOutskill's ticketing, pulled via a Freshdesk MCP as real eval data
LangChain / LangGraphmentionedOrchestration references; LangGraph suggested for storing and rating dataset/golden records
LangSmithmentionedNamed in the eval-framework alternatives list
DeepEvalmentionedOpen-source eval framework alternative
PromptfoomentionedAs-heard 'Promptful' - eval framework alternative
StripementionedThe refund API behind the support bot's trajectory examples
Claude CodementionedOne of two tools used to build the new certificate generator
CodexmentionedThe other tool behind the certificate generator
GrokmentionedVideo generation in the audience content-automation demo
TelegrammentionedDelivery channel for the audience member's agent product
Google DocsmentionedWhere the audience agent writes its drafts
CalendlymentionedProgram-interview booking in the housekeeping hour
ClickHousementionedNamed as what Langfuse is built on

Action items

    Resources mentioned

    Resources
    • docOpenAI Evals repo + Langfuse docs (his two learning recommendations)
    • docSupport-bot GitHub repo (shared with attendees)
    • docThe closing '$3 eval' checklist
    • docHousekeeping hour + community showcase (3:04:00-4:10:00)

    Extraction notes

    This page was built from an auto-generated transcript, which garbles product and people's names. Those were corrected silently in everything above and logged here for transparency. The warnings flag claims that were true on the recording day but change fast.

    Transcript corrections applied

    The transcript saysThe trainer actually means
    halogenation / halogenatehallucination / hallucinate (throughout)
    LAN fuse / landfills / LanfuseLangfuse
    LAN chain / LAN graph / LandgraphLangChain / LangGraph
    PromptfulPromptfoo (2:58:00)
    Sagam Malya / Sugam / Sagamthe mentor's name (probably Sugam Malya - Day 1's UNVERIFIED note stands)
    GetMultias-heard - product spelling unverified (2:31:00)
    MS / Delhi AI / Leki AIaudience member's agent product - names unverified (3:52:00+)
    civillyunidentified search tool the audience agent connects to, possibly Perplexity (4:00:00)

    True on recording day — verify before relying