| id | course-llm-features-l04 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| type | course | |||||||||||||||
| title | Lesson 4: Read the eval honestly | |||||||||||||||
| summary | A green suite proves the contract; the eval measures the feature. Run all three skins, accept the one that fails its threshold, and write down what a handful of recorded replies can and cannot tell you. | |||||||||||||||
| lang | en-US | |||||||||||||||
| content_version | 1 | |||||||||||||||
| status | reviewed | |||||||||||||||
| reviewed_on | 2026-10-11 | |||||||||||||||
| hints |
|
Both suites pass, you have run the eval on every skin, and you hold a written record of what the numbers prove and what they do not.
In Lesson 1 the starter's eval said 100% on a skin where one case in six had crashed. That is the most common way model features get shipped too early: not a bad model, an eval that hides its failures. Now that the eval divides by every case, the numbers can go down — and that is the point.
Run the maintainer pair in a terminal yourself:
python verify.py starter
python verify.py solutionThen run your eval on every skin:
python starter/ticket_triage.py scenario/shop-support
python starter/ticket_triage.py scenario/it-helpdesk
python starter/ticket_triage.py scenario/saas-feedbackYou should see:
| Skin | Result | Exit |
|---|---|---|
shop-support |
accuracy=0.750 correct=6/8 fallbacks=1 |
1 |
it-helpdesk |
accuracy=0.833 correct=5/6 fallbacks=1 |
0 |
saas-feedback |
accuracy=0.800 correct=4/5 fallbacks=0 |
0 |
Compare it-helpdesk with Lesson 1: the starter said 1.000, your eval says
0.833. Same recorded replies, honest denominator.
Now read each failure line as a reviewer:
shop-supportfails its threshold — correctly. Cases08got a valid but wrong category;s07fell back to a human after two prose replies. Nothing in your code is wrong. The feature, on this data, is below the bar you set. Try--min-accuracy 0.7and watch it "pass" — then write down why that is not a fix.- A fallback is safe but not free.
h06fell back because both replies broke the 120-character summary limit. Count fallbacks separately: a feature that falls back on half the tickets is safe and useless. - Look at what the eval does not score. Correctness here is
category+needs_human.priorityandsummaryare validated for shape but never compared to a label. Decide whether that is acceptable for your feature. - Check the edges the suite skips. What happens if
cases.jsonis empty? Ifrecordings.jsonhas fewer replies than the loop asks for? (ReplayClientraises — your loop should let it.) Run one and write down what happened.
Write the three-line evidence record for this feature:
- Verified: the commands you ran and what they proved.
- Not verified: at least — live model behavior, traffic you have not recorded, unscored fields, and anything the recordings do not imitate.
- Known limits: the threshold each skin missed or barely met, and the fallback rate.
Run python verify.py. This checkpoint's code prints once the starter
suite passes; the maintainer pair above must both be green for the gate to
mean what it says. You pass the lesson when you can answer:
- Why is
shop-supportexiting 1 the correct behavior of your code? - What does
accuracy=0.833on six hand-written cases tell you about a live model on live tickets? - Which field would you add to the eval's scoring first, and why?
Both green runs, the three eval lines, and your three-line evidence record.