Applied GenAI Curriculum for AI PMs · Depth Layer · Eval Thread 3/5
Systematic error analysis — open coding, axial coding, criteria drift, strategic sampling — and why looking at your data beats building infrastructure. The highest-ROI unit in the series.
The core claim of the entire eval discipline compresses to three words: look at your data. Not dashboards, not generic metrics, not an off-the-shelf eval framework — read your actual production traces and catalog how the product fails. Teams that adopt this consistently find their highest-ROI improvements here, and in real projects 60–80% of development time goes to error analysis and evaluation, not building automated checks. This unit is a DEPTH one, but it's the one to reach for first — ideally right after you've designed the pipeline in Unit 09.
It's a four-step loop borrowed from qualitative research. It is low-tech on purpose — a notebook or a simple custom viewer, a human, and real traces.
Gather representative traces of real user interactions. No data yet? Generate structured synthetic traces to bootstrap (more on that below).
A human reads each trace and writes open-ended notes on what went wrong — like journaling. Focus on the first failure in a trace, since upstream errors cause downstream ones. A domain expert must do this step.
Group those raw notes into a failure taxonomy — distinct categories — then count how many traces fall in each. An LLM can help cluster, but you own the categories.
Keep reading traces until you hit theoretical saturation — new traces stop revealing new failure modes. Rule of thumb: review at least 100; if ~20 in a row surface no new category, you can stop.
The counts are the payoff: they tell you which failure to fix first. The goal isn't to catalog every possible failure — it's to prioritize the ones that actually happen most.
Use one domain expert who understands your users as the single quality decision-maker — a "benevolent dictator." This matters because error analysis builds the product intuition that only comes from systematically seeing failures. Outsourcing it to people without domain expertise produces superficial or wrong labels and is usually a serious mistake. For a PM, this is often your seat, or one you sit in beside the expert.
The single biggest enabler is a custom trace viewer that removes all friction from looking at data and renders traces in domain-specific ways — pulling everything you need onto one screen. These can be built in well under a day with a notebook or an AI coding assistant. If reading a trace is annoying, the team won't do it, and the whole flywheel stalls.
No production traffic yet? Generate synthetic traces — but structured, not "give me test queries" (which yields generic mush). Define dimensions of user variation, then combine them:
| 1. Define dimensions | Axes of variation — e.g. for support: Issue Type × Customer Mood × Prior Context. |
| 2. Write ~20 tuples by hand | Specific combos like (billing, frustrated, follow-up) — this teaches you the problem space. |
| 3. Scale in two steps | LLM generates more tuples, then a separate prompt turns each into natural language (avoids repetitive phrasing). |
| 4. Run & sample | Push queries through the real system, capture traces, sample ~100 for error analysis. |
Two cautions: fix obvious problems directly rather than generating tests for them, and distrust synthetic data in complex/high-stakes/low-resource domains where it misses the real edge cases.
Error analysis isn't one-and-done. Re-run it whenever you make significant changes (new feature, prompt update, model switch, big bug fix), aiming for 100+ fresh traces per cycle (typically every 2–4 weeks), with 10–20 outlier traces reviewed weekly in between. Over time you develop a "nose" for where failures hide, and strategic sampling (outliers, user-feedback sorting, clustering) makes each pass sharper.
Error analysis surfaces failures; some you fix directly, others you automate with an evaluator. When that evaluator is an LLM judge, it has to be validated — which is exactly the next unit.