Verifying the Plan Is Not the Same as Verifying the Outcome

An agent that confirms every step was executed has told you nothing about whether the goal was actually achieved. That distinction is where most production verification fails.

B

Balagei G Nagarajan

4 MIN READ


TRAIL (arXiv:2505.08638, 2025): plan-completion rate 81%, goal-achievement rate 47%, a 34-point gap across 200 multi-step agent task trials. Not a model failure. A measurement failure: the verification layer checked whether steps ran, not whether the goal was reached.
Plan vs outcome verification hero
Multi-step workflows where step N+1 needs the persisted output of step N.
— from “Verifying the Plan Is Not the Same as Verifying the Outcome”

Key facts.

  • TRAIL (2505.08638, 2025): plan-completion rate 81%, goal-achievement rate 47% - a 34-point gap across 200 multi-step agent task trials.
  • The gap is largest in tasks with external state dependencies: file system changes, API side effects, or database writes that appear to succeed but don't persist or propagate correctly.
  • Most agentic frameworks expose step-completion hooks but provide no built-in mechanism for goal-state evaluation after all steps complete.
  • Plan verification is cheap (did step N execute?); outcome verification is expensive (did the world change as intended?). Teams choose the cheap check and call it done.

The structural difference

Plan verification asks: "Did the agent do what it said it would do?" It checks logs, confirms tool calls fired, and validates that each step returned a success code. it's necessary but not sufficient.

Outcome verification asks: "Is the world in the state we wanted?" It checks downstream systems, reads back persisted data, validates that the user-facing effect is present. it's sufficient - but teams skip it because it requires knowing what "correct state" looks like before the agent runs.

The difference surfaces most painfully in tasks with delayed effects. An agent sends a payment instruction. Payment API returns 200. Plan marked complete. Six hours later, the payment processor rejects it, a validation error not surfaced in the sync response. Plan verification saw success. Outcome verification - checking the settlement record 24 hours later - would have caught the rejection. Neither framework ran the second check.

Where the gap appears

Database writes that appear to succeed but violate constraints at commit time. The INSERT returns OK from the ORM layer; the database rolls back a parent transaction. The agent saw success. The row was never written.

API calls that return 202 Accepted but process asynchronously. The agent moves on, assuming completion. The async job fails silently. No callback was registered. The downstream state never updates.

Multi-step workflows where step N+1 needs the persisted output of step N. Step N looks like it completed. Step N+1 runs on stale or default data, the output wasn't persisted in time. Both steps report success. The composed outcome is wrong.

Designing outcome verification

Outcome verification requires a goal specification written before the agent runs. Not a list of steps - a description of the intended world state after completion. This specification becomes the test that runs after the last step.

For synchronous effects, a read-back check immediately after the write is usually sufficient: insert a record, then query it; send an instruction, then confirm receipt. For asynchronous effects, a polling loop or event listener with a defined timeout is required. For multi-system workflows, each system boundary needs its own state check - not just the final system in the chain.

# Outcome verification pattern
def verify_outcome(goal_spec, timeout_s=60):
 deadline = time.time() + timeout_s
 while time.time() < deadline:
 current_state = read_world_state(goal_spec.scope)
 if goal_spec.satisfied_by(current_state):
 return VerificationResult.SUCCESS
 time.sleep(5)
 return VerificationResult.TIMEOUT # escalate, never silently pass
Plan completion vs goal achievement gap diagram

Verification approach comparison

ApproachWhat it checksCatchesMisses
Step-completion logsTool calls firedExecution errorsAsync failures, state mismatch
API response codesImmediate responseSync rejectionsDeferred failures, constraint violations
Outcome read-backPersisted world stateWrite failures, async errorsDelayed effects past read window
Goal-spec evaluationFull intended stateAll of the aboveNothing detectable at verification time

The Pattern Intelligence Layer encodes goal specifications alongside action patterns. Each pattern specifies not just what the agent should do, but what the world should look like when it's done. Outcome verification is built into every pattern execution, not something a developer has to remember to add.

Frequently asked questions

Will a more capable model close the gap between steps run and goal met?
TRAIL ran every step 81% of trials, hit the goal 47%; a stronger model leaves that rework. (arXiv:2505.08638)


Share this post

Join the discussion

Have a take, a war story, or a question? Sign in with GitHub to comment and react. Comments are powered by GitHub Discussions, ad-free and yours to moderate.

Continue Reading

Find where your agent breaks, before you build it

Faultmap maps where your agent will fail from the goal and your data, then hands you the first test suite it has to pass.