Can a decision model find where an agent failed?

6 October 2026 · Jev on 257 human-labelled failed runs, against published results and a frontier model

See the results in Colab · Code on GitHub

When an AI agent fails a task, a person must read the run and find the step where it went wrong. That work is slow. Jev is a decision model: it does not write text, and it answers typed questions with probabilities for a fraction of a cent. I did a test of Jev on 257 failed agent runs that people annotated by hand. On runs that fit in its window, it finds the failing step approximately as often as a frontier model. It cannot name the kind of failure, but its confidence tells you which answers to trust.

This post is the practical half of a pair. Confident and wrong uses a toy world to examine when you can trust the confidence of a decision model. This post does a test of a real decision model on a real job.

The claim

Decision models are sold as a cheap layer for routing and classification. You give the model some text and a closed set of options, and it returns a choice with a probability, in milliseconds. The pitch is that this covers the many small decisions in a software system that do not need a text-generating model.

Reading a failed agent run is not a small decision. A run has dozens of steps, tool calls and tool outputs. To find the step where it went wrong, a reader must read the plan. The reader must compare each action with the policy and find the point of no return. This is the kind of task that usually goes to a large reasoning model, or to a person. The claim under test is that a decision model can do a useful part of it.

There is a practical reason for this test. A team with an agent in production has hundreds of failed runs a week and nobody to read them. A model that costs cents could point at the right step in a good share of runs, and say when it is unsure. Then the team gets triage for free.

Hypothesis

I expected four things.

Setup

The task

A failed run comes in. The reader gets the task, the policy if there is one, and every step in order. The reader answers three questions:

An answer counts as correct when it is the same as the human annotation. For the step I also report “within 1 step”.

The human-labelled runs

In two public datasets, people marked the answers on failed runs:

That is 257 runs. The runs are short in the customer-service and generated-team sets, and long in the Magentic-One sets: the longest has approximately 300,000 characters. I did not use MAST, because an LLM judge made the labels of its 1,642 traces, not people.

Jev

Jev is a decision model from TypeSafe. A request has a state and a map of typed questions. A choice question returns the chosen option and a probability for each option. A noul question returns the probability of yes. The model reads at most 32,000 tokens per request.

I called it through its API, model jev-1.13.0. The list price is $0.042 per million input tokens. Everything in this post cost $0.44.

For each run, the state held the task, the policy if any, and the steps as a list of {step, who, content} objects. The step question was a choice over all step ids. The agent question was a choice over the agent names. The category question was a choice over the 9 categories. When a run did not fit, I cut every step to the same maximum length, the largest that fit. This affected 33 of the 257 runs.

The comparators

Baselines. Chance, and “always answer the most common step in this dataset”, which is a strong baseline when runs are short and failures come early.

Published results. The AgentRx paper (2026) reports GPT-5 and o3 as judges on its runs, and its own method. The Who&When paper (2025) reports GPT-4o with three methods. I quote their numbers with the caveats they need.

Claude. To get a like-for-like competitor, Claude (Fable 5.1) read 130 of the runs in full and answered the same questions, with the same category definitions. It did not see the human labels. It read the runs in batches, several per session.

The tuning protocol

I cannot train Jev's weights. I can change how I ask the questions. To keep that honest, I split the 257 runs in half by a hash of the run id. The tuning half has 127 runs and the test half has 130. I tried changes on the tuning half, chose by the mean accuracy across the four datasets, and scored the test half once. All Claude comparisons are on the test half.

Experiment

1. Jev, untuned, on all 257 runs

I wrote each question once and did not change it.

datasetrunsstep: Jevstep: most commonstep: chanceagent: Jevcategory: Jev
AgentRx, tau-bench retail2912 (41%)14%3%–2 (7%)
AgentRx, Magentic-One448 (18%)14%5%25 (57%)12 (27%)
Who&When, Magentic-One5812 (21%)17%4%22 (38%)–
Who&When, generated teams12663 (50%)27%12%77 (61%)–

Four things stand out.

2. Published results from stronger models

The AgentRx numbers are from 2026: the paper's first version is from February 2026, and I read the version of August 2026. The Who&When numbers are from 2025: the paper is from April 2025, revised in June 2025. I ran Jev (version 1.13.0) in October 2026.

taskGPT-5 as judge (paper, 2026)o3 as judge (paper, 2026)AgentRx method, GPT-5 (paper, 2026)Jev, untuned (this post, Oct 2026)
tau-bench: step29.9%29.1%42.7%41%
tau-bench: category30.8%32.5%47.0%7%
Magentic-One: step32.6%–36.4%18%
Magentic-One: category35.6%–46.2%27%
Magentic-One: agent––71.2%57%

The Who&When paper (2025) reports GPT-4o with three methods, without the correct answer. The best method gets 16.6 percent on the step and 51.1 percent on the agent for the generated teams. For Magentic-One it gets 8.8 and 53.4 percent. Jev, untuned, gets 50 and 61 percent on the generated teams, and 21 and 38 percent on Magentic-One.

These comparisons are loose, for three reasons. The AgentRx paper's tau-bench set has 39 runs and the public set has 29, so they are not the same runs. The Who&When results are from 2025 and use GPT-4o, an older model than the GPT-5 and o3 in the AgentRx paper. And both datasets are public. It is possible that Jev saw them in training. I cannot check that.

3. Tuning

I tried four changes on the tuning half.

On the 130 held-out runs, the step stayed at 54 correct of 130. The agent went from 59 to 66 correct of 109. The category went from 6 to 13 correct of 42. The tuning cost $0.22. Changing the questions has little left to give.

4. Jev against Claude on the held-out runs

Grouped bar chart. For each of the four datasets, the share of runs where Jev and where Claude name the same failing step as the human. Claude leads on three datasets; Jev leads slightly on the generated teams.
Share of held-out runs where each model names the same step as the human annotator. Jev is tuned as above; Claude reads the full run.
question (130 held-out runs)ClaudeJev, tuned
names the human's step60 (46%)54 (42%)
within 1 step of the human's71 (55%)60 (46%)
names the responsible agent (109 runs)73 (67%)66 (61%)
names the human's category (42 runs)21 (50%)13 (31%)
names the step on the 11 long runs40

On the step, the two results are almost the same. The difference is 6 runs in 130, which chance can produce at this sample size. Both were right on 43 runs, only Claude on 17, only Jev on 11, and neither on 59. They chose the same step in 64 runs. Claude is clearly better where reading matters: on long runs, on the multi-agent runs, and on the category. On the short generated-team runs, Jev was slightly ahead (56 against 52 percent).

Even the frontier model matches the human step in less than half of the runs. Part of that is real error. Part of it is probably disagreement on which step is the decisive one. Each run has one annotation, so I cannot separate the two.

Two bar charts. For Jev and for Claude, the share of correct step answers rises with the confidence the model gave its own answer. Jev goes from 6 percent to 73 percent; Claude from 31 percent to 80 percent.
Confidence means something for both. When Jev gave its answer a probability of 0.7 or more, it was right in 30 of 41 runs. Below 0.3, in 1 of 16.

Cost and speed are the other difference. Jev scored the 130 runs for approximately $0.05, in less than 1 second each. Claude used approximately 2.5 million tokens, in batches that took minutes.

5. A second use: patterns in 159 failed runs of GPT-5

The human-labelled sets measure whether Jev can point at a step. A second question is whether it can detect known failure patterns across many runs. For that I used a set without human labels: the 159 failed runs of GPT-5 on tau2-bench, airline and retail. They come from Sierra's own leaderboard run of August 2025: 656 runs, 4 trials per task. In that run, 73 of the 164 tasks had at least one failure.

Grid of all 656 runs, one cell per run, four trials per task. The failed runs cluster on some tasks.
Every run as one cell. 73 of the 164 tasks account for all 159 failed runs.

Claude read the 159 runs first, with a written brief, and labelled each with what went wrong, whose fault it was, and the cheapest fix. I merged its 48 free-text names into 8 patterns. These are model labels in one pass, with no human check.

By that reading, 128 of the 159 failed runs were the benchmark's fault, not the agent's. The task expected an action that the policy forbids (49 runs). The simulated customer left its script (39). The script did not specify a detail that the grader checked (14). The expected action contradicted the data (13). The agent's own mistakes were 19 runs, with 12 more shared.

Horizontal bar chart of the eight failure patterns by number of runs, each bar split by whose fault the run was. The three largest patterns are almost entirely the benchmark's fault.
The 8 patterns in the 159 runs, by number of runs, as read by Claude. Colour shows whose fault the reader gave for each run.

One independent check exists. After this run, Amazon published tau2-bench-verified and Sierra revised its own tasks. Of the 67 runs the reader marked as “task definition is wrong”, 60 are on a task that one of the two later changed. Of the 19 runs it marked as the agent's fault, 10 are. The reader did not see the corrections.

Then Jev scored each run against the 8 patterns, with the policy, the customer's script and the grader's expectation in the state. It chose the same pattern as the reader in 92 of 159 runs (58 percent; the most common pattern alone gives 31 percent). For the largest pattern, a yes/no question found 44 of the 49 runs, with 64 flags in total.

When Jev gave its answer a probability of 0.9 or more, it agreed with the reader in 9 of 9 runs. Below 0.5, it agreed in 24 of 63. For the question “whose fault”, Jev agreed with the reader in 130 of 159 runs. But “always answer benchmark” would agree in 128. That single verdict adds nothing. This part compares Jev with a model's labels, not with people; it shows the shape of a use, not a measured accuracy.

Conclusion

Three of the four expectations held, and one did not.

So for this task Jev is a triage tool, not a judge. You run it over every failed run for cents. It says “look at step 17” with a probability. The confident answers are mostly right, and the rest go to a person or a stronger model. It does not tell you what kind of failure you have, and it does not handle runs longer than its window.

Limitations

The human-labelled sets are small. With 21 to 61 runs per dataset on the test half, a few answers move a percentage by several points. Each set has one annotation per run. Both datasets are public, so it is possible that both models saw them in training.

The comparison between Jev and Claude is not equal on input. Claude read the full runs. For Jev, I cut the long runs or scanned them in windows. Each model ran once, so there is no measure of run-to-run variation. Claude judged several runs per session, not one fresh call per run.

The published numbers come from different run sets, methods and models, and I quote them as context, not as a direct comparison.

The tuning was small: four wordings, one window scheme, two structural changes, chosen on 127 runs. A larger tuning set, or a fitted combiner on Jev's probabilities, could move the category result. It cannot move the long-run result, which is a limit of the context window.

The 159 tau2-bench runs have model labels, not human labels. The pattern names are mine. A person who reads the same runs would draw some lines elsewhere. The published sheet has a one-line reason and the decisive evidence for each run, so you can check each label against the run.

On prior work: the AgentRx and Who&When papers define and measure this task for text-generating models, and taxonomies of agent failures exist (MAST, TRAIL). I did not find a test of a decision model on these datasets. My search was limited.

Check it yourself

The quickest way is the notebook. Open it in Colab and it shows the saved results as tables and charts in your browser. It does not call Jev, so you do not need a key.

Jev's answers on the human-labelled runs are in ground_truth_scores.csv (untuned, all 257) and tuned_test_scores.csv (tuned, the 130 held-out). Claude's are in judge_scores.csv. The reference labels for the 159 tau2-bench runs are in reference_labels.csv. The scripts fetch the datasets:

python fetch_annotated.py      # 11 MB: AgentRx and Who&When
python jev_ground_truth.py     # Jev, untuned, on the 257 runs (needs a TypeSafe key)
python jev_tune.py             # tuning on one half, test on the other
python judge_score.py          # Claude's answers against the same labels
python fetch.py                # 27 MB: the tau2-bench traces and task versions
python jev_score.py            # Jev against the 8 patterns on the 159 runs
python figures.py              # the four figures

The code is in the repository on GitHub, with the exact questions in jev_ground_truth.py and patterns.json, and the brief that the reader used.

Sources

Reading a system's failed runs, and building the tools that read them at scale, is usually the first thing I do with a client's agent.

Back to writing