Evaluating AI Products with Eval Suites
The per-trace loop starts by reading individual sampled traces with their actual input and actual output, rather than the dashboard or aggregate numbers.
Two Teams, One Dashboard
Imagine two teams that ship the same AI assistant. Both watch a dashboard full of averages. Both see the numbers drift slightly downward in the third week after launch. The first team responds by tweaking settings and hoping the averages recover. The second team opens a handful of individual conversations, reads what the user actually typed and what the assistant actually answered, and discovers that one kind of request is being handled badly again and again. The second team has begun working through the per-trace loop.
What do you think happens?
Both teams see the same downward drift on their dashboards. Which team is working through the per-trace loop, and what does it do first?
Reveal answer
The second team is working through the per-trace loop. It opens individual conversations and reads what the user actually typed and what the assistant actually answered.
The loop starts with individual sampled traces, not with aggregate numbers. Reading the raw exchanges is what exposed the specific kind of request that was being handled badly.
This article follows that second team's work. It explains how the loop is organized, how a pattern is pulled out of several exchanges, how that pattern becomes a test the team can run again, and why this cycle is what turns a fragile launch into a product people keep using.
Why the Loop Starts With Raw Exchanges
A trace is the record of one exchange between a user and an AI product. A sampled trace is one that you pick out of the stream of real activity rather than inventing yourself.
The discipline asks for something that feels slow. You read the input the user supplied and the output the product produced, in their exact wording. Summary numbers compress many exchanges into one figure, and that compression hides the specific words where a failure lives. A dashboard can tell you that quality dipped; it cannot tell you which request caused the dip or what the product said in response. Reading the raw exchange keeps those words visible, which is why the loop begins there.
The Per-Trace Loop as a Cycle
It helps to see the loop as a sequence in which each stage produces something the next stage uses. Reading sampled traces produces a hypothesis. The hypothesis is encoded as an eval case. The eval case is added to the standing eval suite. The suite is then used to grade a proposed fix. The fix is not the end of the chain: its grade comes from the suite, which already holds everything the team has learned so far. After grading, the team reads traces again, and the cycle repeats.
The return edge is what makes the loop cumulative. Each pass leaves behind a new test, so the next pass of reading starts from a larger body of knowledge and a larger suite than the last one did.
Forming a Working Hypothesis From Several Traces
A single trace rarely tells you enough by itself. The loop asks you to read enough traces in sequence to form a working hypothesis about what is going wrong. The hypothesis is therefore a pattern you notice across several exchanges, not a conclusion drawn from one unusual reply. One odd answer might be a fluke; the same kind of request mishandled across several exchanges points to a shared cause.
Finding the Shared Pattern Across Three Traces
A hypothetical support assistant for a software product is reviewed on sampled traces. Three exchanges are read in sequence. Form a working hypothesis from them. This example is illustrative and not drawn from the source.
- 1Read trace one
The user asks how to export a report as a spreadsheet. The assistant gives a correct, general answer about the export menu. Nothing looks wrong yet.
- 2Read trace two
The user asks how to export a report as a spreadsheet after a recent update. The assistant describes a menu item that the user's message does not mention, and the answer is generic. This is the first trace that looks suspicious, but a single trace is not yet a pattern.
- 3Read trace three
The user asks about exporting a report, this time with a question about a scheduled delivery. The assistant again gives a generic answer that ignores the specific request. Two of the three traces now involve a user question that mentions a particular feature, and the assistant answers the general category instead.
- 4State the hypothesis
Across these exchanges, the assistant appears to answer the broad topic of a request rather than the specific feature the user named. The hypothesis is that feature-specific questions are being collapsed into generic answers. It is a claim about a pattern, to be checked against more traces.
The working hypothesis is a pattern seen across several exchanges: feature-specific requests receive generic answers. Each trace points to the same underlying failure, which is why the three together matter more than any one of them.
Encoding the Hypothesis as an Eval Case
A hypothesis is useful only if it can be checked again later. The loop therefore encodes it as an eval case: a test built from the hypothesis that captures the kind of input that exposed the problem and the behavior a good answer should show. Writing the case is what converts an observation made while reading into something the team can run repeatedly.
The eval case then becomes part of the standing eval suite. The word standing matters. The suite is not rebuilt for each change; it accumulates. A new case written from the hypothesis above would include a feature-specific request like the ones that exposed the problem, along with a description of what a good answer must do, which is address the named feature rather than the general category.
Grading a Fix Against the Standing Suite
When a fix is proposed, it is graded against the suite. The fix must handle the new case and must also keep passing the cases the team wrote earlier. The suite therefore acts as a gate: a proposed change is checked against everything already learned, not only against the failure that prompted it. A fix that solves the new case but breaks an older one has not passed the suite.
- 1Propose a fix aimed at the failure described by the working hypothesis
- 2Run the fix against the new eval case that captures the failure
- 3Run the fix against every earlier case in the standing suite
- 4Accept the fix only if the new case passes and the earlier cases keep passing
- 5Read new traces, and begin the next pass of the loop
Repeating this loop is what produces week-over-week improvement. Each cycle of reading traces, forming a hypothesis, encoding it, and grading a fix adds to what the team knows and what the suite checks. Later fixes are graded against everything already learned, so gains made in earlier weeks are protected rather than quietly lost. The source describes these improvement curves as the thing that separates a deployment customers keep using from one they quietly turn off about six weeks after launch.
Mistakes Teams Make With the Loop
Common mistake Starting from aggregate numbers instead of raw exchanges
What it looks likeA team sees the average quality score drop and begins adjusting settings without reading a single conversation.
Why it failsSummary numbers compress many exchanges into one figure, and that compression hides the specific words where a failure lives.
Do this insteadRead sampled traces first, using the user's exact input and the product's exact output, then consult the aggregate numbers.
Common mistake Forming a hypothesis from one unusual reply
What it looks likeA single strange answer is treated as proof that a whole feature is broken.
Why it failsA single trace rarely tells you enough. One odd exchange may be a fluke rather than a pattern.
Do this insteadRead enough traces in sequence to see the same failure recur, then state the hypothesis as a pattern across them.
Common mistake Keeping the observation in notes instead of encoding it
Why it failsA hypothesis that is not written as a test cannot be run again, so the lesson disappears once the reader moves on.
Do this insteadWrite the hypothesis as an eval case and add it to the standing suite.
Common mistake Grading a fix only against the case that prompted it
Why it failsA fix can solve the new failure while breaking earlier behavior. The suite exists to catch that.
Do this insteadGrade every proposed fix against the full standing suite, not just the newest case.
Common mistake Rebuilding the suite for each change instead of accumulating it
Why it failsIf earlier cases are discarded, later fixes are no longer answerable to what the team already learned.
Do this insteadKeep the standing suite growing, so each round of reading leaves behind a test that later fixes must pass.
Practicing the Read-Then-Encode Move
You are reviewing sampled traces from an AI product. Three exchanges in a row show users asking about a specific billing option and receiving answers about billing in general. Describe, in order, what you would do: which raw details you would read, what working hypothesis you would state, what eval case you would write, and how you would decide whether a proposed fix is accepted.
Hints
- Start with the exact user input and the exact product output, not with any dashboard number.
- A hypothesis should describe a pattern across the three traces, not a conclusion from one.
- Remember that a fix must pass the new case and the earlier cases in the standing suite.
Key Takeaways
- The per-trace loop starts by reading individual sampled traces, with their exact input and exact output, rather than by reading dashboards or aggregate numbers.
- A working hypothesis is a pattern noticed across several traces read in sequence, not a conclusion drawn from one unusual reply.
- The hypothesis is encoded as an eval case and added to the standing eval suite, which accumulates over time rather than being rebuilt.
- A proposed fix is graded against the full suite, so it must handle the new case and keep passing earlier cases before it is accepted.
- Repeating the loop produces week-over-week improvement, which is what keeps customers using a product after launch.