Apply to my task
arXiv:2610.21088 ★ 90 Oct 15, 2026

Probe-and-Resume: check an agent's work by running things at the moment it says "done," not along the way

Key result

Evaluating an agent as it works is almost useless: in early steps the critic predicts the outcome only slightly better than a coin flip. The Probe-and-Resume method lets you check an agent's work once, at the "done" moment, and raises the share of solved tasks from 63% to 72%. The twist: the critic doesn't read the log, it runs checks on a disposable copy. It gets a copy of the final state and a copy of the initial one. Found holes? The agent continues from the same spot instead of starting over.

01

TL;DR

Probe-and-Resume is a setup where the agent works undisturbed. When it declares "done," a separate critic (a second, reviewing model) receives a copy of the final state and a copy of the initial one. The critic doesn't read the log; it runs checks: commands, tests, comparisons. If it finds holes, the agent picks up from the same spot with the feedback in hand. It doesn't start over.

The main finding: evaluating an agent's work as it goes is almost useless. At early stages, the critic predicts how a task will end only slightly better than a coin flip. A critic that only reads files and the log rejects more than half of correct solutions with "insufficient evidence." The agent's log records commands and output, while the actual system state (files, processes, packages) stays off-screen. The critic can't see it and can't verify it. Afraid of being wrong, it rejects.

The method comes down to three decisions. When: the critic is called only on a "done" claim. How: it's allowed to execute commands, including destructive ones, on a disposable copy. What we provide: a copy of the initial state, so it can check requirements like "this file must not change." As a result, the share of solved tasks rose from 63% to 72%. Cost roughly doubled, but stayed at half that of an off-the-shelf competitor agent on the same model.

Want this for your own case? Apply this study to your task: AI adapts its method to what you are working on and writes the prompt.

02

Method Blueprint

STEP 1: The agent works alone, unaware of the critic → declares "done"
STEP 2: The critic extracts requirements from the task → requirements list
STEP 3: The critic verifies EACH requirement by running something
        on a copy of the final state + a copy of the initial one → per-item verdict
STEP 4a: Everything satisfied → submit the result
STEP 4b: Failures found → the agent returns TO THE SAME state
        + receives: what's wrong, why, how it was checked
        + request: fix it OR prove with a command that the requirement is met
        → back to STEP 1 (the critic continues THE SAME conversation, rechecks the whole list)
Stop: critic accepts / 6 rounds / budget runs out

Steps 2–3 are done by a single critic in a single conversation. The copies are disposable; anything the critic breaks in them gets thrown away. Only the text of the feedback reaches the agent.

03

Example

Task: You own a small Amazon store. An agent in Claude Code is rewriting the nightly script that exports stock levels from QuickBooks to the Amazon Selling Partner API. Conditions: don't change the stocks.csv file format, don't touch the .env config, and if the API goes down the script must not overwrite yesterday's stock levels. The agent writes "done, everything works." Previously you took its word for it and found zeroed-out inventory in the morning.

Prompt (for a reviewer subagent you invoke once the agent says "done"):

You are the critic. The agent has claimed the task is complete. Your job is not to believe it
but to verify by running things.

The task, exactly as the agent received it:
Rewrite the sync_stocks.py script (exports stock levels from QuickBooks to the Amazon Selling Partner API).
Requirements: 1) the stocks.csv format does not change; 2) the .env file is unchanged;
3) on an API error the script does not overwrite yesterday's stock levels; 4) the script runs
from cron with no interactive input.

Where to check: a copy of the current project is /work/candidate,
a copy of the project before work began is /work/initial.
Don't be afraid to break anything: both folders are disposable.

Procedure:
1. List all requirements from the task, including implicit ones.
2. For each requirement, design a check you can RUN,
   and run it. Reading the code is not enough.
   Example for #3: point the API address at a nonexistent host, run the script,
   see what happened to the stock file.
3. For "unchanged" requirements, compare /work/candidate with /work/initial
   (hash, diff).
4. If something can't be checked, write "not verified"; don't invent a verdict.

Answer format for each requirement:
- Requirement:
- How I checked (command):
- What I got:
- Verdict: met / not met / not verified

At the end: ACCEPTED (all met) or REJECTED + a list of failures.

Result: The critic produces a numbered list of requirements. For each one you see the check command, its output and the verdict. For #3 it will most likely run the script with a "broken" API address. For #2 it will compare the hashes of .env in the two folders. If something fails, you get a rejection text that you hand to the agent in full: "fix it or prove with a command that the requirement is met." The agent continues in the same project.

04

Why it works

The weakness. The agent's log records only its thoughts, commands and output. The actual system state (files, processes, packages, data) never makes it into the log. A critic that reads only the log judges "by the story." It can't confirm, and when it can't confirm, it rejects. That's why it throws out more than half of correct solutions. "Halfway" evaluations don't help much either: the outcome isn't settled yet, and you can't see whose solution will make it to the end.

The strength. A model is good at writing and running checks, meaning it can solve a terminal task. The authors put it this way: evaluating a terminal task is itself a terminal task. Give the critic a terminal and it starts proving instead of guessing. False rejections drop from half to about a fifth.

How the method exploits this. It moves verification to the only moment where there's something to verify, the "done" claim. It gives the critic the right to act on a copy, so destructive checks are safe. It adds a copy of the initial state, giving the critic a reference for "preserve" and "restore" requirements. Resuming instead of restarting keeps everything the agent already got right.

Control knobs: - Critic permissions. "Read only" → "run anything on the copy." The main knob: the false-rejection rate depends on it. - Copy of the initial state. Remove it and the critic can't check "must not change." The critic itself decides when to compare, and on such tasks accuracy rises noticeably. - Round limit (6 in the paper) and the agent's move limit after a rejection (50) → lower them to cap costs. - The phrase "or prove it with a command." Lets the agent contest a mistaken rejection instead of guessing what the critic wants. - One critic conversation for all rounds. It remembers its requirements list and rechecks it in full.

05

Prompt Template

This is a reconstruction from the method description in §4.1. The actual prompts from the appendix weren't in the available text. I kept the structure from the paper: requirements list → verification by running on a copy → comparison with the initial state → feedback → return.

Critic prompt:

<Role>
You are the critic of an agent's work output. The agent has declared "done."
Your task is to verify that claim by running things, not by reading.
</Role>

<Task>
{original_task_verbatim}
</Task>

<Environment>
Candidate (the agent's final output): {path_to_final_copy}
Initial state (before work began): {path_to_initial_copy}
Both copies are disposable. You may delete, overwrite, install,
start and stop processes. Changes will not propagate back to the agent.
</Environment>

<Procedure>
1. List all requirements from the task: explicit and implied.
2. For each requirement, design a check you can run,
   and run it. Reading code and files is not enough.
3. For requirements like "preserve / don't change / restore," compare
   the candidate with the initial state.
4. If something can't be checked, write "not verified." Don't invent a verdict.
</Procedure>

<OutputFormat>
For each requirement:
- Requirement:
- Check command:
- Result:
- Verdict: met / not met / not verified
Outcome: ACCEPTED or REJECTED + a list of failures explaining
why each one failed and how you checked it.
</OutputFormat>

Message to the agent after a rejection:

Your result was rejected. The critic checked it and found:
{failures_with_explanations_and_check_commands}

You continue from the same state. Either fix the problems,
or present a command that proves the requirement is met.
When you're finished, report "done" again.

Message to the critic on a repeat round (same conversation):

The agent has revised its result. Here are the commands it ran: {agent_commands}.
Here are fresh copies: {new_paths}.
Go back to your requirements list and recheck all of it from scratch.

What to fill in: {original_task_verbatim} is the brief the agent received, not a paraphrase. The paths are two copies of the project: the final output and the state before work. In git, that's a "before" branch/commit and an "after" working copy. {agent_commands} is what the agent did after the rejection.

🚀 Quick start: paste this into the chat:

Here is a critic template for checking an agent's work with the Probe-and-Resume method.
Adapt it to my task: [describe what the agent did and what the requirements were].
Ask me questions to fill in the fields.

[paste the template above]

The LLM will ask what the task's requirements are, which of them are "don't change" requirements, and how to create copies of the final and initial state (git, a folder copy, a container). That's because the critic's work rests on the requirements list and the two copies: without them it can neither run checks nor compare.

06

Limitations

⚠️ You need copies of the environment: in the paper, the critic works on disposable forks (snapshots) of the system. In a regular chat without tools, the method can't be reproduced. In Claude Code or Cursor you can approximate it with git branches, folder copies and a separate subagent. Destructive checks only on copies: on a "live" project, the critic can break things.

⚠️ The critic stays lenient when the reference is hidden: if the correct answer can't be derived from the environment (a hidden reference value, a client's unstated expectations), the critic tends to agree with the agent. Here false acceptances were noticeably more common than on tasks where the result can be run and checked.

⚠️ Errors don't vanish: a critic that runs checks is still wrong in about a fifth of cases, including accepting wrong solutions. The method raises the success rate, but important tasks still need human review.

⚠️ Cost: token spend roughly doubled compared with an agent without verification. That's cheaper than checking at every step, but not free.

⚠️ Limits of the conclusions: the authors themselves write that they didn't prove the "done" moment is optimal. A different search policy or stronger evaluation of intermediate steps might have worked. The main experiment uses one executor model on terminal tasks.

07

How they tested it

The team took Terminal-Bench 2.1: 89 terminal tasks, each run 5 times. The agent ran on a single model. First they tested the obvious idea: give the agent "save/roll back state" tools and run a tree search over options (MCTS) with a critic on intermediate steps. It didn't help: the tools were almost never used (in 3 runs out of 445), and MCTS gave +0.6 points at roughly four times the cost.

Then the authors dug into why the critic fails. They built three variants: no tools (reads the log), "read only," and "can execute anything." The critics were tested on intermediate states. For each state, the agent played the task out to the end 5 times, and that was compared with the critic's assessment. Then they tested on 406 final states against the benchmark's real verification script. On intermediate steps, the critics ranked states only slightly better than random (at 25% of the trajectory, almost a coin flip), and environment access helped little. On final states it's a different story: the executing critic cut the share of wrong verdicts from 36–39% to 22%. The surprise was that even on tasks where the verification script only reads files, the "read only" critic rejected 42% of correct solutions, in 93% of cases for "insufficient evidence." It needs to compute the check, not read it.

A separate experiment showed the value of the initial-state copy. False rejections fell from 24% to 17%, and disagreement between two verdicts from the same critic fell from 18% to 9%. The critic decided on its own when to consult the initial copy (in 25% of assessments), and that's exactly where accuracy rose by almost 10 points. Verification didn't get stricter, it got more accurate.

Final result: 63.4% → 72.4% (improvement on 30 of 89 tasks, regression on 1). With other critic models the gain is comparable (+9.9 and +7.2 points). Restarting the agent from scratch after a rejection instead of resuming came out 1.6 times more expensive and no better. The same result holds on SWE-bench Pro, judging by the paper's text.

08

Adaptations and extrapolations

🔧 Technique: add a "don't say done" rule to the agent's instruction file → self-check before the critic

The paper tested an external critic, not self-checking: the research it cites shows that self-correction without external data can make results worse. So this adaptation is my guess, not a conclusion from the paper. In CLAUDE.md you can add:

Before reporting "done": list the task's requirements.
For each one, run a check and show the command and its output.
If something can't be checked, write "not verified," not "works."

🔧 Technique: remove the initial-state copy from the template → watch the critic start rejecting "out of caution"

A quick test on your own task: run the critic twice, with {path_to_initial_copy} and without. If rejections on "don't change" requirements disappear when the copy is present, the critic was missing a reference, and the agent wasn't actually wrong.

09

Resources

  • Probe-and-Resume: When and How to Evaluate Agent Execution, preprint, Columbia University.
  • Authors: Jiakai Xu, Tiancheng Ge, Tujie Guan, Yusheng Li, Rohan Timmaraju, Eugene Wu, Kostis Kaffes.
  • Benchmark: Terminal-Bench 2.1 (Marten et al., 2026); run via Harbor and the Terminus-2 agent.
  • Branching environment: Waypoint (Xu et al., 2026).
  • Related work: Reflexion (Shinn et al., 2023), Self-Refine (Madaan et al., 2023), CRITIC (Gou et al., 2023), Huang et al. (2023) on self-correction without external feedback.

Research digest

Key result

Evaluating an agent as it works is almost useless: in early steps the critic predicts the outcome only slightly better than a coin flip. The Probe-and-Resume method lets you check an agent's work once, at the "done" moment, and raises the share of solved tasks from 63% to 72%. The twist: the critic doesn't read the log, it runs checks on a disposable copy. It gets a copy of the final state and a copy of the initial one. Found holes? The agent continues from the same spot instead of starting over.

Principle

A process of three decisions. When: the agent works alone, and the critic is called only on "done." How: the critic extracts requirements from the task and verifies each one by running it on a copy, not by the agent's account. What we provide: a copy of the initial state, to check requirements like "this file must not change." Evaluating a terminal task itself becomes a terminal task: the critic needs a terminal, not reading material. If there are failures, the agent returns to the same state. It gets the feedback text and a request: "fix it or prove with a command that the requirement is met." Anything the critic broke in the copies gets thrown away. Only the text reaches the agent. Stop when: the critic accepts, 6 rounds pass, or the budget runs out.

Why it works

The agent writes its thoughts, commands and output to the log. The actual system state (files, processes, packages) never makes it into the log. A reading critic judges by the story. It can't verify, so it's afraid of being wrong and rejects. The upshot: it rejects more than half of correct solutions with "insufficient evidence." A model is good at writing and running checks. Give it a terminal and it starts proving instead of guessing. False rejections drop from half to about a fifth. The initial-state copy provides a reference for "preserve" and "restore" requirements. Resuming instead of restarting keeps everything the agent already got right. The cost: spending roughly doubled. But that's still half the cost of an off-the-shelf competitor agent on the same model.

When to apply

Terminal agents (Claude Code, Cursor and the like) → rewriting scripts, migrations, environment setup, config edits, especially when the task has "don't change" and "don't break the old stuff" requirements. A fit if you can make copies of the project: a git branch, a folder copy, a container. NOT a fit for a regular chat without tools. Also not a fit for tasks with a hidden reference (a client's unstated expectations): there the critic is too lenient and more often accepts wrong solutions. Destructive checks only on copies, never on a live project.

Mini recipe

1. Leave the agent alone: let it work solo, with no intermediate checks. You wait only for "done." 2. Make two copies: the work output and the state before it started. In git, that's a "before" commit and an "after" working copy. 3. Call the critic as a separate subagent: give it the task verbatim, not paraphrased, plus paths to both copies. 4. Give it permission to break things: state outright that the copies are disposable. It may delete, overwrite, start and stop. 5. Demand a list: first all requirements, explicit and hidden. Then a check command and its output for each. 6. Ban making things up: if something can't be checked, have it write "not verified." 7. Send the feedback back to the agent: it continues in the same project. Add the line: `Either fix it, or present a command that proves the requirement is met.` 8. Repeat in the same critic conversation: it will recheck its whole list. Limit the rounds (6 in the paper) and the agent's moves after a rejection (50). 9. Check the important stuff yourself: a critic that runs checks is still wrong in about a fifth of cases.

Examples

[BAD]: `The agent said the script that exports stock levels to Amazon is done. Read its log and tell me whether everything's OK.` [GOOD]: `You are the critic. The agent declared "done." Don't believe it, verify by running things. Requirements: 1) the stocks.csv format does not change; 2) the .env file is unchanged; 3) on an API error the script does not overwrite yesterday's stock levels. Copy of the output: /work/candidate, copy before work: /work/initial. Both folders are disposable, break whatever you want. List the requirements. Run a check for each. For #3, point the API address at a nonexistent host, run the script and see what happened to the stock file. For #1 and #2, compare hashes in the two folders. Format for each item: requirement, command, what you got, verdict (met / not met / not verified). At the end: ACCEPTED or REJECTED with a list of failures.` What you get: instead of "seems to work," here's the command with the "broken" API address. And here's the script that, on an error, zeroed out yesterday's stock levels. That text goes to the agent in full: `Your result was rejected. Fix it or prove with a command that the requirement is met.` The agent fixes it in the same project instead of rewriting everything.

In plain words

Autonomous AI agents routinely fib in their reports, not out of malice, but because their logs are just plain text. When an agent cheerfully reports "I fixed everything", judging it by those notes is pure self-deception. A critic model reads a pretty story without seeing the real files and disk, so it rejects more than half of working solutions or misses a hidden failure. The Probe-and-Resume method breaks this dumb setup: stop taking the agent's word for it and get your hands on the actual result.

It's like hiring a plumber who swears the pipes are fine, but instead of testing the water pressure shows you his personal diary. You took his word for it, and by morning the whole house is flooded. Judging an agent's work by its own log is exactly the same nonsense. The inspector has to turn the valves himself, not read an essay titled "How I successfully tightened the nut".

What actually works: a combo of isolated state verification and targeted resumption. The agent grinds away undisturbed until the very end. As soon as it declares "done", a separate reviewer critic grabs a snapshot of the system and runs tough tests: executes commands, compares files with the originals, hunts for corrupted data. If something's broken, the agent isn't forced to start from scratch; it gets specific feedback and picks up exactly where it messed up.

They tested it on data-sync scripts, but the principle is universal. The method is vital anywhere an agent touches a production environment: automated code refactoring, server configuration, scraping, or pushing catalogs to marketplaces. In any task where a model can quietly wipe out an important config, checking the facts beats reading the logs.

Bottom line: stop smothering the agent with intermediate checks and naively studying its reports at the end. Let the model finish the task, unleash an automated critic with tests on the result, and on failure send it back to work with a ready-made bug report. Adopt Probe-and-Resume, or you'll keep wondering why the logs look perfect while your database lies dead in the water.

AI lab assistant

Apply this study to your task

Describe what you're working on. AI takes the method and the measured results from this paper and adapts them to your case, or writes a ready prompt built on them.

Based on Probe-and-Resume: check an agent's work by running things at the moment it says "done," not along the way arXiv:2610.21088

Sign in to apply this study New accounts get 50 free credits.