The strongest finding across 2026 practitioner postmortems (Hamel Husain's "Your AI Product Needs Evals" line of work) is that unsuccessful AI products share one trait: nobody looked at the data. Not "insufficient metrics" — nobody read the traces.
Tier: Core · Workflow area: Evaluation Engineering
This playbook is the discipline that fixes it: read 100 real traces, open-code failure modes into a taxonomy, and convert what you find into a versioned golden dataset with provenance — the seed asset every other evaluation playbook in this track builds on.
Do not delegate this to a judge model. The first pass is human reading; automation comes after you know what to automate.
Sample 100 traces deliberately. Not the last 100: stratify — ~60 random across the period, ~25 from negative signals (bad ratings, user retries, escalations), ~15 from the longest/most complex inputs. Record the sampling recipe; you will repeat it next quarter.
Set up the error-analysis worksheet. One row per trace, columns: trace_id · date · input summary · output summary · verdict (pass/fail/partial) · open code (free text) · failure category (assigned later) · severity (S1 wrong-and-harmful / S2 wrong / S3 degraded) · slice tags (intent, input length, user type) · candidate for golden set? (y/n) · notes/quote. Freeze the pass/fail definition in writing at the top before reading trace one.
First pass — open coding. Read each trace and write what you see in plain language before inventing categories: "invented a policy number", "ignored the second question", "correct but 4x too long", "retrieved right doc, quoted wrong row". No taxonomy yet — premature categories blind you to failure modes you did not expect. This pass surfaces the surprises, and surprises are the yield.
Second pass — axial coding into a taxonomy. Cluster the open codes into 5–10 named failure modes with one-line definitions and an example trace ID each (e.g., H1 unsupported-claim, R1 retrieval-miss, R2 ignored-context, F1 format-break, I1 instruction-drop, T1 tone/verbosity). Re-tag all 100 rows against the taxonomy. Then build the Pareto: count × severity per mode. The top 2–3 modes are your eval and fix roadmap — everything else is noise for now.
Critique shadowing with a domain expert. Have the expert review 15–20 traces thinking aloud while you take notes; capture their pass/fail judgments and the reasons. Where the expert disagrees with your verdicts, your pass/fail definition is underspecified — tighten it. These expert judgments are gold-standard labels, literally: they anchor judge calibration later (pb-36).
Convert findings into the golden dataset. Select 30–60 traces that exemplify each failure mode plus clear passes. For each: input (and retrieved context), a reference expectation (gold answer, or rubric of must/must-not facts), failure-mode label, severity, provenance (trace_id, date, who labeled it, why included). Add 5–10 synthetic edge cases for modes you know exist but did not appear in the sample — marked synthetic: true.
Version it like code. Store as JSONL in git (or MLflow/Phoenix datasets) with a schema, a README stating the pass/fail definition and taxonomy v1, and a changelog. Rule: the golden set only grows through this pipeline — every new production failure worth catching becomes a new versioned case. That makes it a living eval set, not a stale benchmark.
Metrics tell you that quality moved; only reading traces tells you why — the taxonomy you build in 4 hours of reading determines whether every downstream eval measures something real.
derived: anonymized.Traces are the most sensitive artifact in an LLM system — they contain exactly what users actually typed, including things your PII policy says you do not store.