Before you write a single eval, read a hundred real traces and open-code the failures: what actually went wrong, in your own words, clustered into a counted taxonomy. This is the foundational AI-quality skill — Husain and Shankar's loop, done as PM work with a spreadsheet, no code required.
Workflow area: Evals & AI Quality · Tier: Advanced · Hands-on time: ~45 minutes to learn, ~half a day to run
Teams that skip error analysis build eval sets that measure imagined failures while production burns with real ones. The instinct is to jump straight to metrics — "let's track accuracy" — but accuracy against what? The only trustworthy source of what your AI feature gets wrong is the record of it getting things wrong: production traces, read one at a time, by someone who understands the product deeply enough to judge them. That someone is the PM. A hundred traces sounds like grunt work; it is the highest-information-density half-day in AI product management, and everything downstream — the eval set, the failure catalog, the launch bars — inherits its quality.
Pull a defensible sample. Export ~100 traces (full input, retrieved context if any, output, and user signal where available) from Braintrust, LangSmith or your logs. Sample mostly at random — random sampling is what makes counts meaningful — and optionally add a labeled oversample of complaint-linked traces. Note the split; never let the oversample contaminate the frequency claims.
Open-code each trace in a sheet — your words, no schema yet. One row per trace: trace ID/link, verdict (pass/fail/partial), and a free-text note on what went wrong. "Open coding" means writing what you see before deciding categories — pre-imposed categories at this stage are how real failure modes get squeezed into wrong boxes:
#014 | FAIL | cited the 2023 refund policy; 2024 doc exists
in KB but wasn't retrieved
#015 | PASS |
#016 | PARTIAL | answer correct but opens by apologizing 3 times,
reads unconfident
#017 | FAIL | user asked two questions, model answered only
the first, no acknowledgment
#018 | FAIL | invented a "premium support tier" we don't sell
#019 | FAIL | refused a completely benign billing question
Expect 60–90 minutes for a hundred traces. Do not batch this into an LLM — the entire value is your judgment making contact with reality. (AI gets a role in step 4.)
Cluster the notes into a taxonomy with counts. Group your free-text notes into failure modes, keeping the level useful: "retrieval missed the current doc version" and "invented an entity we don't sell" are actionable; "wrong answer" is not. Count occurrences and tag severity:
FAILURE MODE COUNT SEVERITY
Retrieval missed / stale doc grounded 14 S1
Invented entity, plan or commitment 8 S1
Partial answer to multi-part question 9 S2
Wrong refusal of benign request 6 S2
Tone: unconfident / over-apologetic 7 S3
Formatting drift from spec 4 S3
(failing traces: 41 of 100 sampled)
Use AI as a second coder, then reconcile. Now — after your own pass — feed the failing traces' notes to Claude: "Cluster these failure notes into a taxonomy; propose names and counts." Compare with yours. Where the model splits a cluster you merged (or vice versa), decide deliberately. This catches your blind spots without ever having outsourced the judgment.
Name the top three fix candidates in a one-page memo. For each dominant mode: hypothesized cause (retrieval config? prompt gap? model capability? missing knowledge?), the cheapest probe to confirm, and who owns it. The memo's punchline is usually humbling — the top mode is rarely the one leadership talks about, and it's frequently fixable in a week (a retrieval-freshness bug, one prompt paragraph) rather than a model swap.
Feed everything downstream. The taxonomy becomes pb-37's eval-set backbone (every mode gets cases), pb-39's failure-catalog rows, and pb-41's monitoring priorities. Version the taxonomy with a date — next quarter's pass will diff against it, and the diff is your quality trend.
Production traces contain real user messages — names, account details, sometimes health or financial content. Do the coding inside your observability tool or approved tenant, scrub PII before any trace text goes to an external model as a second coder, and respect retention limits when archiving the coded sheet.
A hundred traces, read by the person who owns the product, is the ground truth everything else is built on — the eval set measures what the taxonomy found, the launch bars protect against it, and no dashboard metric substitutes for having looked.