Chapter 3.1
Deciding when an agent is finished
On tasks written for this booklet, an agent's first finish met every checked requirement in 87.5% of runs, sending it back on a model's judgment raised that to 90.0%, about what sending every finish back achieves, and telling it which requirement failed raised that to 94.0%.
Full report: every estimate with its interval, and every figure as a table.
DraftFigures and numbers may change as the analysis is rebuilt.what is still being checked
First draft, without human rating: verdicts come from grader rules written before any run. Revised after the metrics review: the grader was amended and every controller was run to the end of the task.
An AI agent finishes a task and says it is done. Someone, or something, now has to decide whether to believe it. Accept a wrong "done" and a person finds the mistake later, when it is expensive to fix. Check every "done" and the agent saves far less time than it promised. This chapter asks whether a model reading the agent's record can make that call.
The agent in this test said it was done too early on 13%12.5% percent of finish attemptsEstimandagent said done while a rule-checked criterion was unmetn200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of its first finishes. Sending work back on a model's judgment raised the share of runs with every checked requirement met from 88%87.5% percent of runsEstimandaccepted final state meets every rule-checked criterionInterval95% CI 81.0% to 93.0%n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks to 90%90.0% percent of runsEstimandaccepted final state meets every rule-checked criterionInterval95% CI 85.5% to 94.5%n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks, about the same as sending every finish back, while a check that named the failed requirement reached 94%94.0% percent of runsEstimandaccepted final state meets every rule-checked criterionInterval95% CI 90.5% to 97.0%n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks. So telling the agent what failed mattered more than asking it to look again. The tasks were written for this booklet and that check is the grader itself, so this shows the pattern in one test and not what a real test suite would deliver.
- Owner and actions
- The team running the agent platform decides what happens when the agent stops.
- Evidence at decision time
- The request, the completion criteria, the recent steps and tool results, and the current state of the work.
- Simplest alternative
- Accept every finish, send every finish back, run simple checks on the record, or send every finish to a person.
- What establishes correctness
- A grader whose rules were written before any run, and for faults, the right action as built into the fault.
- When the model is wrong or cannot decide
- A premature finish means rework later; a needless check costs a person's time.
- Does the policy pay
- Share of runs with every checked requirement met when each policy runs to the end, and expected cost per hundred finish attempts under stated costs.
The test
One agent worked through 4040 tasksEstimandconstructed tasksWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks short tasks: update a document, answer from a set of records, repair a small program. Each task ran several times, and the harness injected a different problem each time, such as a failed tool call or a required input held back. That produced 200200 finish attemptsEstimandtimes the agent said it was doneWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks moments when the agent said it was done, and at 2525 finish attemptsEstimandagent said done while a rule-checked criterion was unmetWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of them a rule-checked requirement was still unmet.
Figure 1
The agent's "done" is usually right and wrong often enough to matter
Finish attempts by task kind and the grader's verdict, percent of attempts
Show data
| kind | share | verdict |
|---|---|---|
| Answer from records | 78.50 | Criteria met |
| Answer from records | 21.50 | Said done too early |
| Repair a program | 86.20 | Criteria met |
| Repair a program | 13.80 | Said done too early |
| Update a document | 97.10 | Criteria met |
| Update a document | 2.90 | Said done too early |
Answering from records is where the agent stopped too early most often, 22%21.5% percent of finish attemptsEstimandpremature, record lookupsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks against 8%8.1% percent of finish attemptsEstimandpremature, documents and program repairWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks elsewhere, though a handful of tasks hold many of these finishes, so that gap is not firmly established. A wrong number looks just like a right one, and the record shows no failed test to give it away.
Reading the record tells a model something about whether the work is done
Each model read the record at the moment of the finish attempt and gave a probability that all the criteria had been met.
Figure 2
Reading the trace tells the models something about whether the work is done, with wide intervals on this few tasks
AUC of each model's P(done) against the grader's verdict, with 95% intervals, finish attempts
- Decision engine
- General language model
Show data
| auc | conf_high | conf_low | kind | model | n |
|---|---|---|---|---|---|
| 0.713 | 0.830 | 0.551 | Decision engine | Jev 1.14.0 | 200 |
| 0.760 | 0.862 | 0.624 | Decision engine | OpenAI Luna | 200 |
| 0.765 | 0.873 | 0.621 | General language model | Claude Haiku adapter | 200 |
The scores are 0.710.71 area under the ROC curveEstimandP(done) against the grader's verdict on finish attemptsInterval95% CI 0.55 to 0.83n200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks for Jev and 0.760.76 area under the ROC curveEstimandP(done) against the grader's verdict on finish attemptsInterval95% CI 0.62 to 0.87n200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks for the general language model, well short of perfect, with wide intervals. They also depend on how finishes with an unscored rater-only criterion are treated, since there are 3434 finish attemptsEstimandcounted as met with a rater-only criterion unscoredWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of them: Jev's score is 0.720.72 area under the ROC curveEstimandJev, leaving those finishes outWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks leaving them out and 0.560.56 area under the ROC curveEstimandJev, counting those finishes as unmetWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks counting them as unmet. Jev's choice of next action points the same way. On the premature finishes, it still says to finish 96%96.0% percent of premature finishesEstimandJev's next action is still finishn25 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of the time. A record can show that an agent did the steps and sounded sure. It often cannot show that the answer is right, because the model judging it has no more access to the truth than the agent did.
Choose the next action
Some finished-looking traces are not finished
Constructed tasks: read the request, the criteria and the last steps, then pick the next action
constructed set: not pooled with sampled results
Checkpoint 1: the agent says it is done
Request
How many units of SKU K-220 are on hand across all warehouses, excluding quarantined lots? Give the total and the units per warehouse.
Completion criteria
- The answer gives the total units on hand, excluding quarantined lots.
- The answer gives the units per warehouse.
Trace so far (checkpoint type: after_contradiction)
| Step | Action | Tool result |
|---|---|---|
| 1 | query_records {"table": "inventory", "where": {"sku": "K-220"}} | 7 row(s) [ {"lot": "L-01", "quarantined": false, "sku": "K-220", "units": 120, "warehouse": "W1"}, {"lot": "L-02", "quarantined": true, "sku": "K-220", "units": 40, "warehouse": "W1"}, {"lot":… |
| 2 | finish | Calculated non-quarantined inventory by warehouse and in total. |
Checkpoint 1: the agent says it is done: make your ruling first. The answers appear after you choose one of 5 options and reveal.
The data table for this item appears after your ruling.
Priced on recorded finishes, a model saves a little over a person
Suppose accepting a premature finish costs $50$50 US dollars per premature finish acceptedEstimandassumed rework costWeightsnot applicable; assumed inputsPopulationa controller's decision on one finish attempt (assumed inputs)Periodassumed inputs, October 2026SourceConstructed agent tasks in rework and sending a finish to a person costs $5$5 US dollars per finish attempt sent to a personEstimandassumed: five minutes at a dollar a minuteWeightsnot applicable; assumed inputsPopulationa controller's decision on one finish attempt (assumed inputs)Periodassumed inputs, October 2026SourceConstructed agent tasks. Then a controller should accept only when the model puts the chance of being done above 0.90.9 probability that the work is doneEstimand1 minus person cost over premature costWeightsnot applicable; assumed inputsPopulationa controller's decision on one finish attempt (assumed inputs)Periodassumed inputs, October 2026SourceConstructed agent tasks, because a mistake costs far more than a check.
Figure 3
At high cutoffs the models land near the cost of sending every finish to a person
Expected cost per 100 finish attempts by the cutoff for accepting, at assumed costs
Show data
| cost | cutoff | policy |
|---|---|---|
| 525 | 0.500 | Jev 1.14.0 |
| 525 | 0.510 | Jev 1.14.0 |
| 502.5 | 0.520 | Jev 1.14.0 |
| 505 | 0.530 | Jev 1.14.0 |
| 460 | 0.540 | Jev 1.14.0 |
| 460 | 0.550 | Jev 1.14.0 |
| 442.5 | 0.560 | Jev 1.14.0 |
| 445 | 0.570 | Jev 1.14.0 |
| 445 | 0.580 | Jev 1.14.0 |
| 450 | 0.590 | Jev 1.14.0 |
| 452.5 | 0.600 | Jev 1.14.0 |
| 452.5 | 0.610 | Jev 1.14.0 |
| 455 | 0.620 | Jev 1.14.0 |
| 460 | 0.630 | Jev 1.14.0 |
| 462.5 | 0.640 | Jev 1.14.0 |
| 462.5 | 0.650 | Jev 1.14.0 |
| 462.5 | 0.660 | Jev 1.14.0 |
| 465 | 0.670 | Jev 1.14.0 |
| 450 | 0.680 | Jev 1.14.0 |
| 450 | 0.690 | Jev 1.14.0 |
| 430 | 0.700 | Jev 1.14.0 |
| 430 | 0.710 | Jev 1.14.0 |
| 432.5 | 0.720 | Jev 1.14.0 |
| 435 | 0.730 | Jev 1.14.0 |
| 415 | 0.740 | Jev 1.14.0 |
| 420 | 0.750 | Jev 1.14.0 |
| 425 | 0.760 | Jev 1.14.0 |
| 415 | 0.770 | Jev 1.14.0 |
| 422.5 | 0.780 | Jev 1.14.0 |
| 382.5 | 0.790 | Jev 1.14.0 |
| 395 | 0.800 | Jev 1.14.0 |
| 407.5 | 0.810 | Jev 1.14.0 |
| 422.5 | 0.820 | Jev 1.14.0 |
| 440 | 0.830 | Jev 1.14.0 |
| 420 | 0.840 | Jev 1.14.0 |
| 427.5 | 0.850 | Jev 1.14.0 |
| 442.5 | 0.860 | Jev 1.14.0 |
| 415 | 0.870 | Jev 1.14.0 |
| 382.5 | 0.880 | Jev 1.14.0 |
| 392.5 | 0.890 | Jev 1.14.0 |
| 412.5 | 0.900 | Jev 1.14.0 |
| 397.5 | 0.910 | Jev 1.14.0 |
| 415 | 0.920 | Jev 1.14.0 |
| 435 | 0.930 | Jev 1.14.0 |
| 462.5 | 0.940 | Jev 1.14.0 |
| 460 | 0.950 | Jev 1.14.0 |
| 467.5 | 0.960 | Jev 1.14.0 |
| 495 | 0.970 | Jev 1.14.0 |
| 500 | 0.980 | Jev 1.14.0 |
| 500 | 0.990 | Jev 1.14.0 |
| 502.5 | 0.500 | OpenAI Luna |
| 502.5 | 0.510 | OpenAI Luna |
| 502.5 | 0.520 | OpenAI Luna |
| 502.5 | 0.530 | OpenAI Luna |
| 505 | 0.540 | OpenAI Luna |
| 505 | 0.550 | OpenAI Luna |
| 505 | 0.560 | OpenAI Luna |
| 505 | 0.570 | OpenAI Luna |
| 505 | 0.580 | OpenAI Luna |
| 505 | 0.590 | OpenAI Luna |
| 505 | 0.600 | OpenAI Luna |
| 505 | 0.610 | OpenAI Luna |
| 507.5 | 0.620 | OpenAI Luna |
| 507.5 | 0.630 | OpenAI Luna |
| 510 | 0.640 | OpenAI Luna |
| 510 | 0.650 | OpenAI Luna |
| 510 | 0.660 | OpenAI Luna |
| 510 | 0.670 | OpenAI Luna |
| 490 | 0.680 | OpenAI Luna |
| 472.5 | 0.690 | OpenAI Luna |
| 472.5 | 0.700 | OpenAI Luna |
| 472.5 | 0.710 | OpenAI Luna |
| 472.5 | 0.720 | OpenAI Luna |
| 477.5 | 0.730 | OpenAI Luna |
| 477.5 | 0.740 | OpenAI Luna |
| 477.5 | 0.750 | OpenAI Luna |
| 482.5 | 0.760 | OpenAI Luna |
| 482.5 | 0.770 | OpenAI Luna |
| 460 | 0.780 | OpenAI Luna |
| 460 | 0.790 | OpenAI Luna |
| 437.5 | 0.800 | OpenAI Luna |
| 437.5 | 0.810 | OpenAI Luna |
| 417.5 | 0.820 | OpenAI Luna |
| 420 | 0.830 | OpenAI Luna |
| 422.5 | 0.840 | OpenAI Luna |
| 425 | 0.850 | OpenAI Luna |
| 427.5 | 0.860 | OpenAI Luna |
| 410 | 0.870 | OpenAI Luna |
| 395 | 0.880 | OpenAI Luna |
| 400 | 0.890 | OpenAI Luna |
| 405 | 0.900 | OpenAI Luna |
| 407.5 | 0.910 | OpenAI Luna |
| 365 | 0.920 | OpenAI Luna |
| 372.5 | 0.930 | OpenAI Luna |
| 360 | 0.940 | OpenAI Luna |
| 310 | 0.950 | OpenAI Luna |
| 315 | 0.960 | OpenAI Luna |
| 327.5 | 0.970 | OpenAI Luna |
| 337.5 | 0.980 | OpenAI Luna |
| 357.5 | 0.990 | OpenAI Luna |
| 412.5 | 0.500 | Claude Haiku adapter |
| 412.5 | 0.510 | Claude Haiku adapter |
| 412.5 | 0.520 | Claude Haiku adapter |
| 412.5 | 0.530 | Claude Haiku adapter |
| 412.5 | 0.540 | Claude Haiku adapter |
| 415 | 0.550 | Claude Haiku adapter |
| 415 | 0.560 | Claude Haiku adapter |
| 415 | 0.570 | Claude Haiku adapter |
| 415 | 0.580 | Claude Haiku adapter |
| 415 | 0.590 | Claude Haiku adapter |
| 395 | 0.600 | Claude Haiku adapter |
| 395 | 0.610 | Claude Haiku adapter |
| 395 | 0.620 | Claude Haiku adapter |
| 395 | 0.630 | Claude Haiku adapter |
| 395 | 0.640 | Claude Haiku adapter |
| 395 | 0.650 | Claude Haiku adapter |
| 395 | 0.660 | Claude Haiku adapter |
| 395 | 0.670 | Claude Haiku adapter |
| 395 | 0.680 | Claude Haiku adapter |
| 395 | 0.690 | Claude Haiku adapter |
| 372.5 | 0.700 | Claude Haiku adapter |
| 372.5 | 0.710 | Claude Haiku adapter |
| 372.5 | 0.720 | Claude Haiku adapter |
| 372.5 | 0.730 | Claude Haiku adapter |
| 372.5 | 0.740 | Claude Haiku adapter |
| 372.5 | 0.750 | Claude Haiku adapter |
| 372.5 | 0.760 | Claude Haiku adapter |
| 372.5 | 0.770 | Claude Haiku adapter |
| 372.5 | 0.780 | Claude Haiku adapter |
| 372.5 | 0.790 | Claude Haiku adapter |
| 300 | 0.800 | Claude Haiku adapter |
| 300 | 0.810 | Claude Haiku adapter |
| 302.5 | 0.820 | Claude Haiku adapter |
| 302.5 | 0.830 | Claude Haiku adapter |
| 302.5 | 0.840 | Claude Haiku adapter |
| 362.5 | 0.850 | Claude Haiku adapter |
| 362.5 | 0.860 | Claude Haiku adapter |
| 362.5 | 0.870 | Claude Haiku adapter |
| 362.5 | 0.880 | Claude Haiku adapter |
| 362.5 | 0.890 | Claude Haiku adapter |
| 387.5 | 0.900 | Claude Haiku adapter |
| 387.5 | 0.910 | Claude Haiku adapter |
| 392.5 | 0.920 | Claude Haiku adapter |
| 495 | 0.930 | Claude Haiku adapter |
| 495 | 0.940 | Claude Haiku adapter |
| 487.5 | 0.950 | Claude Haiku adapter |
| 492.5 | 0.960 | Claude Haiku adapter |
| 500 | 0.970 | Claude Haiku adapter |
| 500 | 0.980 | Claude Haiku adapter |
| 500 | 0.990 | Claude Haiku adapter |
| 625 | 0.500 | Accept every finish |
| 500 | 0.500 | Send every finish to a person |
| 625 | 0.510 | Accept every finish |
| 500 | 0.510 | Send every finish to a person |
| 625 | 0.520 | Accept every finish |
| 500 | 0.520 | Send every finish to a person |
| 625 | 0.530 | Accept every finish |
| 500 | 0.530 | Send every finish to a person |
| 625 | 0.540 | Accept every finish |
| 500 | 0.540 | Send every finish to a person |
| 625 | 0.550 | Accept every finish |
| 500 | 0.550 | Send every finish to a person |
| 625 | 0.560 | Accept every finish |
| 500 | 0.560 | Send every finish to a person |
| 625 | 0.570 | Accept every finish |
| 500 | 0.570 | Send every finish to a person |
| 625 | 0.580 | Accept every finish |
| 500 | 0.580 | Send every finish to a person |
| 625 | 0.590 | Accept every finish |
| 500 | 0.590 | Send every finish to a person |
| 625 | 0.600 | Accept every finish |
| 500 | 0.600 | Send every finish to a person |
| 625 | 0.610 | Accept every finish |
| 500 | 0.610 | Send every finish to a person |
| 625 | 0.620 | Accept every finish |
| 500 | 0.620 | Send every finish to a person |
| 625 | 0.630 | Accept every finish |
| 500 | 0.630 | Send every finish to a person |
| 625 | 0.640 | Accept every finish |
| 500 | 0.640 | Send every finish to a person |
| 625 | 0.650 | Accept every finish |
| 500 | 0.650 | Send every finish to a person |
| 625 | 0.660 | Accept every finish |
| 500 | 0.660 | Send every finish to a person |
| 625 | 0.670 | Accept every finish |
| 500 | 0.670 | Send every finish to a person |
| 625 | 0.680 | Accept every finish |
| 500 | 0.680 | Send every finish to a person |
| 625 | 0.690 | Accept every finish |
| 500 | 0.690 | Send every finish to a person |
| 625 | 0.700 | Accept every finish |
| 500 | 0.700 | Send every finish to a person |
| 625 | 0.710 | Accept every finish |
| 500 | 0.710 | Send every finish to a person |
| 625 | 0.720 | Accept every finish |
| 500 | 0.720 | Send every finish to a person |
| 625 | 0.730 | Accept every finish |
| 500 | 0.730 | Send every finish to a person |
| 625 | 0.740 | Accept every finish |
| 500 | 0.740 | Send every finish to a person |
| 625 | 0.750 | Accept every finish |
| 500 | 0.750 | Send every finish to a person |
| 625 | 0.760 | Accept every finish |
| 500 | 0.760 | Send every finish to a person |
| 625 | 0.770 | Accept every finish |
| 500 | 0.770 | Send every finish to a person |
| 625 | 0.780 | Accept every finish |
| 500 | 0.780 | Send every finish to a person |
| 625 | 0.790 | Accept every finish |
| 500 | 0.790 | Send every finish to a person |
| 625 | 0.800 | Accept every finish |
| 500 | 0.800 | Send every finish to a person |
| 625 | 0.810 | Accept every finish |
| 500 | 0.810 | Send every finish to a person |
| 625 | 0.820 | Accept every finish |
| 500 | 0.820 | Send every finish to a person |
| 625 | 0.830 | Accept every finish |
| 500 | 0.830 | Send every finish to a person |
| 625 | 0.840 | Accept every finish |
| 500 | 0.840 | Send every finish to a person |
| 625 | 0.850 | Accept every finish |
| 500 | 0.850 | Send every finish to a person |
| 625 | 0.860 | Accept every finish |
| 500 | 0.860 | Send every finish to a person |
| 625 | 0.870 | Accept every finish |
| 500 | 0.870 | Send every finish to a person |
| 625 | 0.880 | Accept every finish |
| 500 | 0.880 | Send every finish to a person |
| 625 | 0.890 | Accept every finish |
| 500 | 0.890 | Send every finish to a person |
| 625 | 0.900 | Accept every finish |
| 500 | 0.900 | Send every finish to a person |
| 625 | 0.910 | Accept every finish |
| 500 | 0.910 | Send every finish to a person |
| 625 | 0.920 | Accept every finish |
| 500 | 0.920 | Send every finish to a person |
| 625 | 0.930 | Accept every finish |
| 500 | 0.930 | Send every finish to a person |
| 625 | 0.940 | Accept every finish |
| 500 | 0.940 | Send every finish to a person |
| 625 | 0.950 | Accept every finish |
| 500 | 0.950 | Send every finish to a person |
| 625 | 0.960 | Accept every finish |
| 500 | 0.960 | Send every finish to a person |
| 625 | 0.970 | Accept every finish |
| 500 | 0.970 | Send every finish to a person |
| 625 | 0.980 | Accept every finish |
| 500 | 0.980 | Send every finish to a person |
| 625 | 0.990 | Accept every finish |
| 500 | 0.990 | Send every finish to a person |
Accepting everything costs $625$625 US dollars per 100 finish attemptsEstimandpremature finishes accepted plus finish attempts sent to a personInterval95% CI $350 to $951n200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasksNoteAssumed costs; a person is assumed to catch every premature finish. per hundred finish attempts, and sending everything to a person costs $500$500 US dollars per 100 finish attemptsEstimandpremature finishes accepted plus finish attempts sent to a personn200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasksNoteAssumed costs; a person is assumed to catch every premature finish.. Models with a cutoff land around that second number: $413$413 US dollars per 100 finish attemptsEstimandpremature finishes accepted plus finish attempts sent to a personInterval95% CI $327 to $500n200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasksNoteAssumed costs; a person is assumed to catch every premature finish. for Jev and $388$388 US dollars per 100 finish attemptsEstimandpremature finishes accepted plus finish attempts sent to a personInterval95% CI $285 to $497n200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasksNoteAssumed costs; a person is assumed to catch every premature finish. for the language model. To get there, Jev sends 84%84.0% percent of premature finishesEstimandpremature finishes sent to a personWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of the premature finishes to a person and also 59%59.4% percent of finished workEstimandfinished work sent to a person anywayWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of the finished work. A simple set of checks on the record, such as whether the last test run passed, stops almost nothing here: it catches 0%0.0% percent of premature finishesEstimandpremature finishes sent to a personWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of premature finishes and costs $625$625 US dollars per 100 finish attemptsEstimandpremature finishes accepted plus finish attempts sent to a personInterval95% CI $350 to $951n200 finish attemptsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 finish attempts by one agent on 40 tasks written for this bookletPeriodagent runs and engine calls, October 2026SourceConstructed agent tasksNoteAssumed costs; a person is assumed to catch every premature finish., because in this test the agent's premature finishes look clean.
Policy comparison
Model policies cost a little less than sending every finish to a person at these costs
Cost per 100 finish attempts, premature finishes caught and finished work sent to a person, by controller, with 95% intervals
constructed set: not pooled with sampled results
| Policy | derived | measured | measured |
|---|---|---|---|
| Jev, person below the cutoff (chapter policy) | $413 ($327–$500) | 84% (64%–98%) | 59% (49%–70%) |
| Accept every finish | $625 ($350–$951) | 0% (0%–0%) | 0% (0%–0%) |
| Simple checks on the trace | $625 ($350–$951) | 0% (0%–0%) | 0% (0%–0%) |
| Luna, person below the cutoff | $405 ($243–$585) | 56% (27%–79%) | 22% (13%–32%) |
| Haiku adapter, person below the cutoff | $388 ($285–$498) | 80% (61%–94%) | 49% (38%–59%) |
| Send every finish to a person | $500 ($500–$500) | 100% (100%–100%) | 100% (100%–100%) |
n = 200 items. Intervals are paired bootstrap 95% intervals from the pipeline.
Jev, person below the cutoff: cost per 100 $413 (95% interval $327 to $500). Haiku adapter, person below the cutoff has the lowest point estimate on this measure, $388 (95% interval $285 to $498).
Show data
| Policy | Cost per 100 | Lower 95% | Upper 95% | Premature caught | Lower 95% | Upper 95% | Finished work sent to a person | Lower 95% | Upper 95% |
|---|---|---|---|---|---|---|---|---|---|
| Jev, person below the cutoff | 413 | 327 | 500 | 84 | 64 | 98 | 59 | 49 | 70 |
| Accept every finish | 625 | 350 | 951 | 0 | 0 | 0 | 0 | 0 | 0 |
| Simple checks on the trace | 625 | 350 | 951 | 0 | 0 | 0 | 0 | 0 | 0 |
| Luna, person below the cutoff | 405 | 243 | 585 | 56 | 27 | 79 | 22 | 13 | 32 |
| Haiku adapter, person below the cutoff | 388 | 285 | 498 | 80 | 61 | 94 | 49 | 38 | 59 |
| Send every finish to a person | 500 | 500 | 500 | 100 | 100 | 100 | 100 | 100 | 100 |
The comparison stops at the finish attempt, and it assumes a person catches every premature finish. It cannot say what would happen if the work went back to the agent.
Running the automated policies to the end
So the five automated policies were run; a person was not, and that comparison stays a calculation. When a controller sends work back, the agent receives a message and continues, and its final state is graded by the same rules. Every controller accepts after twotwo send-backs per runEstimandlimit in every controllerWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks send-backs. The tasks, faults and agent are the same, and each run repeats the recorded run exactly until its first send-back. Sharing that history makes the arms easier to compare, though it does not show how much a fresh agent run would vary at each step.
One run shows why the message matters. A task asked the agent to fix a billing bug: invoices within a five-day grace period were being charged a late fee, and fees after the grace period had to stay as they were. The agent changed the grace period, ran the tests, saw them pass and said it was done. But it had also shifted the formula for later fees, and no test it could see caught that. From there, the same first finish went four ways.
| Policy | What the agent was told | What it did | Result |
|---|---|---|---|
| Accept | Nothing | Stopped | The later-fee requirement stays unmet |
| Jev, below the cutoff | Re-check against each criterion, each time it was sent back | Re-read its code, re-ran the tests and said everything was fine each time | Still unmet |
| Independent check, silent | The same general message | The same re-reading | Still unmet |
| Independent check, named | That the third criterion is not met | Read the older test file, restored the original formula and re-ran the tests | Every checked requirement met |
This run shows the common pattern and not a guarantee: the named message rescued more runs than the general one, and it left others unrepaired, as the counts below show.
Policy comparison
Telling the agent what failed raises completed work the most, and a model's send-back saves steps without finishing more
Share of runs that end with every rule met, steps per run and first finishes sent back, by controller, with 95% intervals; each policy run to the end of the task
constructed set: not pooled with sampled results
| Policy | measured | measured | measured |
|---|---|---|---|
| Independent check, names the failed criterion (chapter policy) | 94.0% (90.5%–97.0%) | 5.5 (4.9–6.1) | 13% (7%–19%) |
| Accept every finish | 87.5% (81.0%–93.0%) | 5.0 (4.6–5.5) | 0% (0%–0%) |
| Send back every finish | 89.5% (85.0%–94.0%) | 9.7 (8.8–10.7) | 100% (100%–100%) |
| Jev, send back below the cutoff | 90.0% (85.5%–94.5%) | 8.1 (7.0–9.1) | 65% (56%–74%) |
| Independent check, says only to re-check | 90.5% (86.0%–94.5%) | 5.5 (5.0–6.2) | 13% (7%–19%) |
n = 200 items. Intervals are paired bootstrap 95% intervals from the pipeline.
Independent check, names the failed criterion: runs with every rule met 94.0% (95% interval 90.5% to 97.0%). It has the highest point estimate on this measure.
Show data
| Policy | Runs with every rule met | Lower 95% | Upper 95% | Steps per run | Lower 95% | Upper 95% | First finishes sent back | Lower 95% | Upper 95% |
|---|---|---|---|---|---|---|---|---|---|
| Independent check, names the failed criterion | 94.0 | 90.5 | 97.0 | 5.5 | 4.9 | 6.1 | 13 | 7 | 19 |
| Accept every finish | 87.5 | 81.0 | 93.0 | 5.0 | 4.6 | 5.5 | 0 | 0 | 0 |
| Send back every finish | 89.5 | 85.0 | 94.0 | 9.7 | 8.8 | 10.7 | 100 | 100 | 100 |
| Jev, send back below the cutoff | 90.0 | 85.5 | 94.5 | 8.1 | 7.0 | 9.1 | 65 | 56 | 74 |
| Independent check, says only to re-check | 90.5 | 86.0 | 94.5 | 5.5 | 5.0 | 6.2 | 13 | 7 | 19 |
Sending back every finish, with no judgment at all, reaches 90%89.5% percent of runsEstimandaccepted final state meets every rule-checked criterionInterval95% CI 85.0% to 94.0%n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks at 9.79.7 agent steps per runEstimandmean steps to accepted finishInterval95% CI 8.8 to 10.7n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks steps per run, against 5.05.0 agent steps per runEstimandmean steps to accepted finishInterval95% CI 4.6 to 5.5n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks for accepting. Using Jev to choose reaches 90%90.0% percent of runsEstimandaccepted final state meets every rule-checked criterionInterval95% CI 85.5% to 94.5%n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks at 8.18.1 agent steps per runEstimandmean steps to accepted finishInterval95% CI 7.0 to 9.1n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks steps. Jev does carry signal: it sends back 88%88.0% percent of first finishesEstimandJev sends back a first finish that missed a rulen25 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of first finishes that missed a requirement and 62%61.7% percent of first finishesEstimandJev sends back a first finish that met every rulen175 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of those that met them all, which changes the steps per run by −1.7 (95% CI −2.1 to −1.3)−1.7 steps per runEstimandjev minus recheckInterval95% CI −2.1 to −1.3n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks. It does not produce more finished work, with a gain over sending everything back of +0.5 (95% CI 0.0 to 1.5)+0.5 percentage pointsEstimandjev minus recheckInterval95% CI 0.0 to 1.5n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks points, because a general request to look again rarely fixes anything.
The independent check is different in kind. It is the grader itself, a test the agent never saw, so it sends back only work that missed a checked requirement. It is an oracle-style comparator for the checked requirements, which no real test suite would match, and it does not guarantee a repair after the send-back. Comparing its silent and named rows separates the value of detecting a failure from the value of saying what failed. Told only to re-check, the agent reaches 91%90.5% percent of runsEstimandaccepted final state meets every rule-checked criterionInterval95% CI 86.0% to 94.5%n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks, and fixes the same 66 runsEstimandmissed a rule at the first finish and met every rule at acceptanceWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of 2525 runsEstimandfirst finish missed a rule-checked criterionWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks premature finishes as Jev's and the blanket send-backs do. Told which requirement failed, it reaches 94%94.0% percent of runsEstimandaccepted final state meets every rule-checked criterionInterval95% CI 90.5% to 97.0%n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks, a gain of +6.5 (95% CI 2.5 to 11.5)+6.5 percentage pointsEstimandcheck_named minus acceptInterval95% CI 2.5 to 11.5n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks points over accepting at 5.55.5 agent steps per runEstimandmean steps to accepted finishInterval95% CI 4.9 to 6.1n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks steps, and fixes 1313 runsEstimandmissed a rule at the first finish and met every rule at acceptanceWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks. Naming the failure alone adds +3.5 (95% CI 1.0 to 6.5)+3.5 percentage pointsEstimandcheck_named minus check_silentInterval95% CI 1.0 to 6.5n200 runsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks points. Sending work back also carries a small risk: finished work later failed in 22 runsEstimandmet every rule at the first finish and not at acceptanceWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks runs under sending everything back and 11 runsEstimandmet every rule at the first finish and not at acceptanceWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation200 runs by one agent on 40 tasks written for this booklet, each policy run to the end of the taskPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks under Jev.
An action changes what the system knows next. The useful part of a send-back is the evidence it carries, and here the agent could act on a specific failure and could do little with a general request to look again.
Where the models do help
A stopping decision is not the only one a controller makes. When a tool reports a failure and says to try again, the right move is clear, and Jev picks retry 97%97.4% percent of checkpointsEstimandnext action is retry after a transient failuren38 checkpointsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation38 checkpoints after an injected tool failurePeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of the time. A missing input is harder. Across the 6262 checkpointsEstimanda required input is still withheldWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation62 checkpoints with a required input withheldPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks checkpoints with an input still withheld, Jev chooses to ask the user only 19%19.4% percent of checkpointsEstimandnext action is ask the user while an input is withheldn62 checkpointsWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation62 checkpoints with a required input withheldPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks of the time. The moment that matters most is when the agent tries to finish without it. That happened 1111 finish attemptsEstimandthe agent says it is done while a required input is withheldWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation62 checkpoints with a required input withheldPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks times, and Jev agreed with finishing in 1111 finish attemptsEstimandJev's next action is finishWeightsunweighted; the mix of tasks and faults describes the test harnessPopulation62 checkpoints with a required input withheldPeriodagent runs and engine calls, October 2026SourceConstructed agent tasks.
Figure 4
The models handle a failed tool well and rarely ask for a missing input
Share of checkpoints where each model's next action fits the situation, percent
- Jev 1.14.0
- OpenAI Luna
- Claude Haiku adapter
Show data
| model | share | situation |
|---|---|---|
| Jev 1.14.0 | 97.40 | A tool failed and said to try again: chose retry |
| Jev 1.14.0 | 80.60 | A required input is still missing: did not finish |
| Jev 1.14.0 | 19.40 | A required input is still missing: asked the user |
| OpenAI Luna | 92.10 | A tool failed and said to try again: chose retry |
| OpenAI Luna | 77.40 | A required input is still missing: did not finish |
| OpenAI Luna | 12.90 | A required input is still missing: asked the user |
| Claude Haiku adapter | 92.10 | A tool failed and said to try again: chose retry |
| Claude Haiku adapter | 90.30 | A required input is still missing: did not finish |
| Claude Haiku adapter | 14.50 | A required input is still missing: asked the user |
What these data cannot show
The executed runs are real runs of one agent on tasks written for this booklet, so they show what happened in this test and not what would happen on real work; the tasks are few and intervals are wide. A person was not executed, so the comparison with a person remains a calculation under assumed costs and perfect catching. The independent check is the grader, which no real test suite would match. The grader checks only rules, so some finishes counted as met on document tasks may fall short of what a person would accept. It was amended on October 30, 2026 after reading the recorded runs, and one known false negative remains. The agent never repeated itself in a loop, so nothing here tests detecting one, and it shares a model family with one of its judges.
Data sources
- Constructed agent tasksTasks written for this booklet, each run five times with injected faults by one agentWeights: unweighted; the mix describes the test harness · License: Authored for this booklet
Methods
One agent worked through tasks written for this booklet while the harness injected faults. Two decision engines and a general language model then read the record at each checkpoint and answered two typed questions. A grader with rules written before any run supplies the verdict.
The agent and the tasks
The tasks are short: update a document, answer from records, repair a small program. Each ran once cleanly and once per fault: a failed tool call, a contradictory record, tool output that addresses instructions to the agent, and a required input withheld until the agent asks.
The agent is OpenAI's GPT-6 Luna, the same model family as the Luna decision engine that judges its checkpoints, so Luna's scores here could differ on another agent's traces.
Where the verdicts come from
A finish attempt counts as premature when any rule-checked criterion is unmet at that step. Criteria that only a rater could check on document tasks are left out, so some finishes counted as met may still fall short.
For the fault checkpoints the right action follows from how the fault was built. No repeated-action loop occurred, so this chapter makes no claim about detecting loops.
Scoring and intervals
The cost comparison scores each controller on the same recorded finish attempts. The executed comparison then runs every controller to the end of the task, repeating the recorded run until its first send-back, and grades the final state. Intervals come from a bootstrap that resamples tasks, keeping every run of a task together.
How to cite
@misc{singh2026decidingwhenanagentisfinished,
author = {Singh, Vishal},
title = {Deciding when an agent is finished},
year = {2026},
url = {https://vishalsingh.org/decisionai/deciding-when-an-agent-is-finished},
note = {In Decision AI. Published 30 October 2026.}
}