Eval Mindset & Golden Sets
- Explain why demos and vibes fail as quality signals and what an eval replaces them with
- Construct a golden set step by step: source, size, coverage, counterfactuals, labels
- Write labeling guidelines that two people would apply the same way
- Version eval data and run the eval-driven development loop (measure โ change โ re-measure)
- Diagnose coverage gaps and add the failure cases your current set is blind to
| Spaced-rep: due Week 19 cards | 10 min |
| ELI5 + tech read; Hamel evals article | 20 min |
| Guided: build the golden set + run the eval loop | 45 min |
| Practice: break your own golden set | 20 min |
| Project: capstone golden set v1 + guidelines | 15 min |
| Quiz + flashcards | 10 min |
Builds on: Day 75 โ Evaluation metrics & choosing them ยท Day 109 โ A/B-ing prompts on cases ยท Day 119 โ Capstone v0 to evaluate
A good teacher writes the final exam before the course starts โ before they know which students will show up. Why? Because if you write the test after meeting the students, you unconsciously write it to flatter the ones you like. Writing it first forces you to decide, coldly, what "knowing the material" actually means, and then the exam judges everyone the same way.
Evals are that exam, written for your AI before you've tuned a single prompt. The temptation is to "test" by chatting with it, seeing nice answers, and shipping โ but that is grading students by whether you enjoyed the conversation. A golden set is a fixed collection of questions with known-good answers, written down in advance, that scores every version of your system identically. When you change a prompt tomorrow, the exam tells you โ with a number โ whether you helped or hurt. Vibes say "feels better." The golden set says "78% to 84%, and here are the three cases you broke." Only one of those is engineering.
The single most common reason AI projects stall is that nobody can tell whether a change helped. Teams tweak prompts for weeks, each change feeling like progress, quality drifting sideways, because their only instrument is "I tried a few things and it seemed good." Evals are the differentiator skill in 2026 hiring precisely because most people skip them: an engineer who arrives with "here's my golden set, here's the eval-driven loop, here's the number your change moved" is instantly credible. For an FDE, the golden set is also the contract โ it's how you and the customer agree, in advance and in writing, what "good enough to ship" means.
The exam written before the student exists โ eval-driven development
step 1 / 5Before improving anything, freeze a golden set: real questions with verified answers. This is your exam.
Guided practice
Construct a golden set for the capstone
25 min- Create
evals/golden_set.jsonl. You will hand-author 12 cases for your Docs-QA service (scale to 40+ for the Day 140 project โ today you learn the method). - For each case write: id, question, a coverage tag (topic + difficulty + intent), and either a reference_answer or a list of must_include / must_not_include criteria. Use the starter schema.
- Deliberately cover all four intents: (a) factual lookup answerable from the docs; (b) comparison/multi-fact; (c) out-of-scope โ must refuse / "not in docs"; (d) adversarial โ an injection attempt from Day 133 that must be ignored. At least two negatives.
- Fill a coverage table in a comment: rows = topics, columns = difficulty, cells = case ids. Find the empty cells โ those are your blind spots. Add one case to fill the biggest gap.
- Commit the set. This file is now the exam every future capstone change sits.
Run the eval-driven loop with a simple scorer
20 min- Create
evals/run.py: load the golden set, run each question through your capstone answer function (or the Day 132 toy RAG), and score with a simple programmatic checker โ must_include substrings present, must_not_include absent. Print pass rate and the list of failing ids. - Record the baseline number and WHICH cases fail. Failures are information, not shame.
- Make ONE change to your system (tighten the system prompt, or add a "say 'not in the docs' if unsure" instruction). Re-run the SAME set.
- Compare: pass rate delta AND which specific cases flipped. Did fixing one case break another? That regression is exactly what vibes-testing never shows you.
- Note the eval-set version (a git hash or a v1 tag) alongside both scores โ scores are only comparable within a version.
On your own
Break your own golden set
20 minAdversarially critique the golden set you just built. Answer, in evals/coverage-audit.md: (1) What real user behavior is completely absent? (typos, multi-part questions, non-English, follow-ups that depend on prior turns, questions where the docs contradict themselves.) (2) Which of your must_include checks are gameable โ could a wrong answer pass by containing the substring "30 days" in a bad sentence? (3) Is your set secretly measuring one thing? Count cases per intent; if 8 of 12 are factual lookups, your number is really "factual-lookup accuracy" wearing a disguise.
Then add three cases that attack your own blind spots, and rewrite one weak must_include check into a stricter criterion or reference answer.
Hints: the substring "not in docs" can appear in "This is definitely not in dispute; the docs say..." โ cheap checkers have cheap failure modes, which is exactly why Day 135 brings in judges.
Capstone golden set v1 + eval loop
Commit evals/golden_set.jsonl (โฅ 20 cases today; you extend to 40+ on Day 140) and evals/run.py to the capstone repo, plus evals/GUIDELINES.md. The golden set must: cover every major topic in your corpus and all four intents (factual, comparison, refusal/out-of-scope, adversarial), include โฅ 3 negatives, and carry a coverage table showing no empty critical cells. GUIDELINES.md states, precisely enough for a second person to reproduce, what counts as a correct answer, how partial credit works, and how to label refusals. Run the eval-driven loop once for real: baseline, one change, re-measure, and record both numbers with the set version in evals/RESULTS.md.
Common mistakes & misconceptions
- Testing by chatting with the system. That grades whether you enjoyed the conversation; a fixed golden set scores every version identically. Vibes are not a measurement.
- A golden set of only easy, in-scope questions. It reports a flattering number that collapses on real traffic; stratify by difficulty and intent and include negatives.
- No negatives or refusal cases. Without them you cannot catch a system that answers everything confidently โ including what it should decline.
- Vague labels. If two reasonable people would grade a case differently, your guidelines are underspecified โ the disagreement, not the model, is your problem (Day 138).
- Changing the eval set and comparing across versions. Scores are only comparable within a set version; version it like code and note the version with every number.
- Writing the set once and freezing it. Golden sets grow from production failures โ every new bug becomes a case, or it will recur.
Q1. Why write the golden set BEFORE tuning prompts, rather than after seeing what the system does?
Q2. Your golden set is 45 cases, all factual lookups the docs clearly answer, and you score 93%. The most honest description of that number isโฆ
Q3. After a prompt change, your pass rate goes 80% โ 82%, but two previously-passing cases now fail. What does eval-driven development say?
Go deeper โ curated resources
- OpenAI Evals framework โ โ A registry-based harness for defining and running evals. Study its structure (samples, eval templates) as a reference for organizing a growing golden set โ but hand-built, domain-specific sets remain the highest-signal evals.
- Golden set built with all four intents and โฅ 3 negatives, coverage table filled
- Eval loop run: baseline โ one change โ re-measure, both scores + version recorded
- Coverage audit written; three blind-spot cases added
- golden_set.jsonl, run.py, GUIDELINES.md committed to the capstone
- Quiz โฅ 2/3
โ Back: This is Day 109's prompt A/B made permanent and Day 75's "choose the metric from the harm model" applied to LLM outputs. The adversarial cases come straight from Day 133's red-team.
Forward โ: Tomorrow (Day 135) replaces brittle substring checks with rubric and LLM-as-judge grading. Day 136 adds RAG-specific metrics, Day 139 puts error bars on these pass rates, and Day 140 scales this set to 40+ as the capstone eval harness.
Unlocks: D135 Graders โ Code, Rubric & LLM-as-Judge ยท D136 RAG Evaluation ยท D137 Agent & Task Evals ยท D138 Human Evaluation