How to Execute, Verify, and Roll Back Agent Actions: Enterprise Agent Control Plane Series, Part 4

TL;DR

An agent action is not complete when the MCP server returns a successful response. It is complete only when the runtime proves that the intended post-condition exists in the authoritative system and that no unapproved side effect occurred.

The execution runtime should:

revalidate identity, policy, approval, target state, and tool version immediately before execution

acquire a bounded execution lease

generate and enforce a trusted idempotency key

isolate code, processes, files, credentials, and network access

classify timeouts and unknown outcomes before retrying

verify post-conditions through an authoritative read path

record evidence for the action and every recovery step

distinguish retry, rollback, compensation, forward recovery, containment, and manual intervention

stop at explicit points of no return unless the action has stronger approval and recovery planning

The governing principle is:

The runtime does not trust that an action succeeded. It proves what changed, decides whether the outcome is acceptable, and contains the workflow when certainty is not available.

Introduction

Part 1 of this series placed MCP beneath an enterprise agent control plane. Part 2 defined the trusted controller that owns identity, workflow state, policy, approvals, budgets, retries, and termination. Part 3 governed the MCP gateway and server layer through admission control, dynamic tool exposure, schema enforcement, credential separation, routing, and domain authorization.

Part 4 follows an authorized request beyond the MCP server boundary.

This is the point where an agent stops being an information system and starts becoming an operational actor. A ticket is created. A service is restarted. A firewall rule changes. A customer receives a message. A deployment begins. A refund is issued. Data is deleted.

The model may have selected the right tool. The controller may have authorized the request. The gateway may have routed it correctly. The MCP server may have validated the input and returned a valid result.

None of those conditions alone prove that the business outcome occurred safely.

Distributed systems fail between request and response. A timeout can hide a completed side effect. A retry can duplicate a change. A server can report success before an asynchronous job finishes. A downstream API can acknowledge a request that later fails. A cancellation can stop the client from waiting without stopping the external action. A rollback can overwrite a legitimate concurrent change. A compensation step can fail after the original action succeeded.

The execution runtime must own that uncertainty.

Where Part 4 Fits in the Series

The five-part series separates related concerns so that one protocol or service is not expected to perform every control function.

Part
Control boundary
Primary responsibility

Part 1
Architecture boundary
Separate agent reasoning, controller authority, MCP access, runtime execution, and system-of-record state

Part 2
Trusted controller
Own identity, durable state, policy, approvals, budgets, retries, cancellation, and termination

Part 3
MCP gateway and servers
Govern server admission, tool exposure, schemas, credentials, routing, and domain authorization

Part 4
Execution and recovery runtime
Enforce preconditions, idempotency, isolation, verification, evidence, compensation, and rollback boundaries

Part 5
MCP and A2A architecture
Separate agent-to-tool access from agent-to-agent delegation and collaboration

Part 4 is where authorization becomes controlled side effect execution.

Scope and Assumptions

This article assumes that:

the trusted controller has already authorized an action

any required human approval is valid and scoped to the exact action

the MCP gateway has resolved an approved server and tool contract

the MCP server still performs domain authorization and business validation

the enterprise system remains authoritative for the resource state

the runtime can persist execution and recovery evidence

the workflow may span synchronous and asynchronous operations

The article does not assume that every tool supports native rollback or idempotency.

When the downstream capability lacks those properties, the runtime must compensate through stronger preconditions, narrower authority, external deduplication, reconciliation, staged execution, or manual recovery.

A Successful Tool Call Is Not the Success Condition

MCP gives clients and servers structured ways to invoke tools, return results, report errors, track progress, cancel requests, and, in the stable November 25, 2025 specification, represent some long-running work as experimental Tasks.

These protocol outcomes are useful, but they describe the interaction with the MCP server. The enterprise workflow needs a separate success definition.

Consider a tool that requests a rolling restart of a production service.

A successful MCP response might mean:

the request was valid

the server accepted the operation

the downstream API returned an operation identifier

the server created an asynchronous job

The business success condition might require:

only the approved service was targeted

no more than one instance was unavailable at a time

the deployment version remained unchanged

service health returned within the approved window

error rate did not exceed the threshold

no duplicate restart job was created

the system reached a stable final state

Those conditions cannot be inferred from a generic success flag.

The controller should define the expected post-condition before execution, and the runtime should test it afterward.

The Execution Runtime at a Glance

The runtime should treat every consequential tool invocation as a stateful operation with preconditions, an execution envelope, a result classification, verification, and a recovery decision.

The runtime should not allow the model to skip any of these stages by claiming that an action is safe, reversible, already approved, or complete.

The Trusted Execution Envelope

The controller should hand the runtime a versioned execution envelope. The envelope binds the authorized intent to the exact technical action.

A practical envelope contains:

run ID

action ID

authenticated requester

agent workload identity

tenant and organization

target environment

target resource

approved operation

normalized arguments or argument hash

MCP server identity and version

MCP tool identity and contract hash

policy version

approval identifier and expiration

authority budget

idempotency key

preconditions

expected post-conditions

timeout and deadline

retry policy

cancellation behavior

compensation reference

evidence requirements

The runtime must reject the envelope when material values no longer match the current system.

Examples include:

the approval expired

the tool schema changed

the server version changed

the target resource version changed

the environment entered a freeze window

the user or workload identity was revoked

the policy version is no longer compatible

the authority budget was consumed by another branch

the requested operation no longer matches the original plan

An approval is not permission to execute any later variation of the action.

Revalidate Preconditions Immediately Before Execution

Planning and approval can occur seconds or hours before execution. The target system can change during that time.

The runtime should perform a fresh authoritative read immediately before a consequential write.

Useful preconditions include:

target exists

target belongs to the expected tenant

current resource version matches the reviewed version

current state allows the operation

no conflicting job is active

maintenance or change window is open

dependent systems are healthy

capacity is available

backup or restore point exists when required

rollback artifact is still valid

policy and approval are still current

Use optimistic concurrency fields such as record versions, entity tags, generation numbers, or revision IDs where the downstream system supports them.

A precondition failure should normally return the workflow to planning or approval. The runtime should not silently update the action to fit the new state.

That would turn a previously approved action into a different unapproved action.

Idempotency Is a Contract, Not a Retry Flag

Retries are unavoidable in distributed systems. Duplicate side effects are not.

An idempotent operation allows the same authorized intent to be submitted more than once without creating additional mutation. The implementation typically relies on a client-provided idempotency token or an equivalent deduplication record.

The runtime should generate the key, not the model.

A useful idempotency identity binds to:

tenant

workflow type

run ID

action ID

target resource

normalized operation

normalized argument hash

approval version

The server should persist enough information to distinguish:

the first accepted request

a legitimate retry of the same request

a conflicting request that reused the key with different arguments

an expired key outside the allowed replay window

Do not use timestamps as idempotency keys

Timestamps do not reliably identify business intent. Clock skew, parallel requests, and retries from different workers can produce collisions or false uniqueness.

Do not generate a new key for every retry

A new key converts a retry into a new side effect request.

Do not assume an idempotent label proves behavior

MCP tool annotations are advisory unless the server is trusted, and even a trusted server may implement the behavior incorrectly. Idempotency needs tests against the real downstream effect.

Test the unknown-outcome path

The most important test is not two immediate identical calls.

It is:

submit the action

interrupt the response path after the downstream system receives it

retry using the same idempotency key

prove that only one side effect exists

prove that the original result can be recovered

Use Execution Leases to Control Concurrency

A workflow can be delivered more than once by a queue, resumed by a second worker, or retried after a timeout while the original operation is still running.

The runtime should acquire a lease before performing consequential work.

A lease should identify:

action ID

owning worker

acquisition time

expiration time

heartbeat or renewal time

target resource

operation class

Leases prevent two runtime workers from advancing the same action concurrently.

They do not automatically prevent two unrelated workflows from changing the same resource. For that case, use a resource-level lock, optimistic concurrency check, domain conflict rule, or downstream transaction mechanism.

A lease expiration should not immediately trigger another execution. The runtime must first reconcile whether the previous worker produced a side effect.

Isolate the Execution Environment

The execution runtime should receive only the access needed for one bounded action.

For code, shell, file, browser, data-processing, or deployment tools, use controls such as:

ephemeral sandbox or job

non-root execution

read-only base file system

explicit writable working directory

restricted mounted paths

no inherited developer credentials

no container-engine socket

outbound network deny by default

approved destination allowlist

CPU, memory, process, and storage limits

maximum output size

execution deadline

secret injection immediately before use

secret removal after completion

artifact scanning before promotion

cleanup after termination

Isolation should be selected by consequence, not by convenience.

A read-only service status query may need only a narrow API identity. A generated script that changes infrastructure should run inside a disposable sandbox with no ambient authority and should invoke a separately governed deployment interface.

The model should not receive a general shell simply because the desired outcome is difficult to express through a narrow tool.

Separate Prepare, Commit, and Verify When Possible

High-impact tools are easier to govern when execution is divided into phases.

Prepare

The server validates inputs, reads current state, calculates the proposed change, checks dependencies, and returns a change plan or preview.

Commit

The runtime submits the exact approved plan using the same target version, plan hash, tool version, and approval context.

Verify

The runtime queries the authoritative system and tests the defined post-conditions.

This pattern reduces the gap between what the reviewer saw and what the tool executed.

The prepare response should contain a stable plan identifier or hash. The commit operation should reject the request if the underlying resource state or plan inputs changed.

Not every platform supports a native two-phase operation. A domain-specific MCP server can still implement an application-level equivalent by separating simulation, proposal, execution, and status tools.

Timeouts Limit Waiting, Not Necessarily Work

A timeout answers one question:

How long will this caller wait?

It does not automatically answer:

Did the external operation stop?

The stable MCP lifecycle specification recommends configurable request timeouts and cancellation after a request exceeds its timeout. MCP cancellation is intentionally limited. A receiver may ignore a cancellation when the request is unknown, already complete, or cannot be canceled.

This distinction matters operationally.

When a timeout occurs, the runtime should classify the action as an unknown outcome until it can determine whether the side effect started or completed.

Do not immediately retry a timed-out write.

Use one of these reconciliation methods:

query the operation ID

query by idempotency key

read the target resource version

search an authoritative audit log

check the downstream job queue

query the domain-specific status tool

ask an operator when the system provides no reliable status path

A progress notification can show that work is still active, but progress should never extend execution indefinitely. Enforce an absolute deadline even when progress continues.

MCP Tasks Help Track Work, but the Runtime Still Owns Outcome

The stable November 25, 2025 MCP specification describes Tasks as experimental durable state machines for deferred request execution. The protocol includes task status, result retrieval, progress, authorization-context requirements, expiration, and cancellation behavior.

Those capabilities help a runtime track long-running MCP operations.

They do not replace the runtime’s business execution ledger.

An MCP Task can report completed while the enterprise post-condition remains false. A Task can report canceled while the underlying work continues. The stable specification explicitly keeps a canceled task in the canceled state even if execution later completes or fails.

That means the controller and runtime still need to record:

what business action the task represented

which target and approval it was bound to

whether the action produced a side effect

whether the post-condition was verified

whether compensation is required

whether the task record expired before evidence was retained

Current MCP work is also moving the experimental Tasks design toward an extension model. Enterprises should isolate their business workflow state from protocol-version changes and treat MCP task identifiers as one execution reference within a broader run.

Classify the Outcome Before Choosing Recovery

The runtime should not reduce every failure to success or error.

Use a richer result model.

Result class
Meaning
Default runtime response

Not started
Validation or authorization failed before any side effect
Record denial or failure, do not compensate

Accepted
Downstream system accepted asynchronous work
Track operation, do not mark workflow complete

Completed and verified
Expected post-condition exists and no prohibited change was found
Commit success and advance workflow

Completed but unverified
Server reports success, but authoritative verification is unavailable
Pause, retry verification, or escalate

Partially completed
Some approved steps occurred, others did not
Contain and evaluate compensation or forward recovery

Failed before side effect
No mutation occurred
Retry only when the failure is transient and policy allows

Failed after side effect
Mutation occurred but later processing failed
Verify current state and choose recovery

Unknown outcome
Response path failed and side-effect state is uncertain
Reconcile before retry

Compensated
Recovery action restored an acceptable business state
Close as recovered, not as original success

Compensation failed
Recovery action did not reach a safe state
Escalate with evidence and block further automation

This classification should come from trusted runtime and domain logic, not the model’s interpretation of a message.

Verify Against the Authoritative System

Verification is a separate operation with a separate question:

Does the system of record now satisfy the approved post-condition?

The verification path should be independent from the write path where practical.

Examples include:

use a read tool after a write tool

query the enterprise API directly through a read-only identity

inspect the asynchronous operation record

compare the current resource revision with the expected revision

validate health through the monitoring system rather than the deployment system

confirm an external message through the communication platform’s delivery state

verify a financial operation through the ledger rather than the submission API

The verification identity should normally be read-only and should not be able to repair the result silently.

Define expected, tolerated, and prohibited outcomes

Verification should compare more than one value.

For a service restart:

expected: all instances healthy and operation complete

tolerated: one instance still warming within the approved period

prohibited: version changed, capacity reduced, or unrelated service restarted

For a firewall change:

expected: exact rule exists in the approved policy section

tolerated: policy compilation still pending for a bounded period

prohibited: broader source, destination, port, or scope than approved

For a customer message:

expected: one message created for the intended recipient using approved content

tolerated: delivery pending

prohibited: duplicate message, wrong recipient, or unapproved attachment

Verification can also fail

A verification API may be unavailable, stale, or eventually consistent.

The runtime needs a verification policy containing:

maximum verification duration

polling interval

expected consistency delay

independent data sources

required confidence level

escalation threshold

behavior when evidence conflicts

Do not convert lack of evidence into evidence of success.

Practical Post-Condition Examples

Action
Precondition
Authoritative post-condition
Recovery option

Create service ticket
No existing ticket for the idempotency key
One ticket exists with expected fields and owner
Close duplicate or correct bounded fields

Restart service
No deployment or restart already active
Approved instances are healthy and version unchanged
Restore capacity, restart failed instance, or escalate

Change firewall rule
Current policy revision matches reviewed revision
Exact rule exists and effective policy matches approved scope
Remove exact rule or apply compensating policy revision

Send external email
Recipient, content hash, and approval are current
One message record exists for the intended recipient
Send correction or recall when supported

Issue refund
Transaction is eligible and not already refunded
Ledger contains one refund for approved amount
Corrective debit or finance-led compensation

Delete record
Retention, legal hold, and backup checks pass
Record is absent and deletion evidence exists
Restore from protected copy when policy permits

Deploy application
Artifact digest and target revision match approval
Approved digest is running and service objectives pass
Redeploy prior approved artifact or forward-fix

The recovery option is not automatically safe. It requires its own policy, authority, idempotency, verification, and evidence.

Rollback, Compensation, and Forward Recovery Are Different

Teams often use rollback as a generic word for every recovery action. That hides important differences.

Retry

Repeat the same forward operation because the failure is classified as transient and the action is idempotent.

Native rollback

Use a platform mechanism to restore a prior version or transaction state. Examples include redeploying a previous artifact, restoring a configuration revision, or rolling back a database transaction that has not committed.

Compensation

Perform a new business action that offsets an earlier successful action. Cancel a reservation, issue a correcting transaction, remove a created access grant, or send a corrective message.

Compensation does not necessarily restore the exact original state. Concurrent activity or legal and business rules may make that impossible or undesirable.

Forward recovery

Move the system from the failed intermediate state to a valid target state without undoing completed work. This may be safer than reversal when the original action is partially complete.

Containment

Stop further damage while preserving the current state for investigation. Disable the agent, revoke the credential, block the route, isolate the workload, or pause the workflow.

Manual recovery

Transfer control to a qualified operator with the evidence needed to complete or reverse the work safely.

The controller should store the chosen recovery type explicitly. A compensated workflow is not the same as a workflow that never failed.

Choose Recovery Through a Deterministic Decision Path

The model may recommend a recovery path. Trusted policy and domain logic must select and authorize it.

Define Points of No Return

Some operations cannot be safely or meaningfully undone.

Examples include:

releasing sensitive information to an external party

sending a legally binding communication

executing a market transaction

deleting data after the recovery window closes

rotating a credential that immediately invalidates active systems

triggering a physical process

publishing a public statement

The workflow should identify these points before execution.

Before a point of no return, require stronger evidence that:

all reversible validation steps have completed

the target and payload are exact

authorization and approval remain valid

dependencies are healthy

the expected outcome is measurable

the incident and escalation owner is known

compensation limitations are visible to the approver

Place irreversible steps as late as possible in the workflow.

A rollback plan that says “undo the action” is not a recovery plan when the action is irreversible.

Compensation Is Another Production Workflow

A compensating transaction can fail, be retried, conflict with concurrent changes, or create its own side effects.

Treat compensation as a first-class workflow with:

its own action ID

authorization and approval policy

idempotency key

preconditions

bounded credential

execution lease

timeout

result classification

post-condition verification

evidence

escalation path

The runtime must retain the information needed to compensate each completed step. That may include:

previous resource version

created record identifier

original value

reservation identifier

financial transaction identifier

prior artifact digest

approved removal rule

downstream operation ID

Do not attempt to reconstruct recovery information from the model transcript after the failure.

Cancellation Must Reconcile External State

A cancellation request should stop new scheduling and signal in-flight work, but the runtime must not mark the business action canceled until it understands the external state.

A safe cancellation sequence is:

record who requested cancellation and why

stop creating new model and tool operations

send protocol or runtime cancellation signals

revoke the execution lease when appropriate

prevent additional side effects

query the downstream operation state

verify the authoritative resource

compensate or contain partial work when required

record the final disposition

A user closing a window or a client abandoning a request is not proof that the action stopped.

This is especially important for asynchronous jobs and task-based execution.

Build an Execution Ledger

The runtime should preserve an append-only execution ledger that can reconstruct the action and its recovery.

Useful records include:

run and action identifiers

parent workflow state

requester and workload identity

target and environment

server, tool, and contract versions

policy and approval versions

normalized argument hash

idempotency key

lease history

precondition snapshot

start and end times

MCP request and task identifiers

downstream operation identifier

progress events

timeout and cancellation events

structured result classification

verification queries and findings

compensation actions

final post-condition

operator interventions

terminal reason code

The ledger should not contain raw secrets, tokens, or unrestricted sensitive content.

Evidence payloads may need a restricted forensic store separate from ordinary operational telemetry.

Trace the Complete Action Path

OpenTelemetry provides a vendor-neutral foundation for traces, metrics, and logs. Current GenAI conventions can describe agent, model, and tool operations, but the enterprise still needs a runtime telemetry contract for policy, execution, verification, and recovery.

A useful trace contains spans or events for:

controller authorization

runtime preflight

lease acquisition

precondition read

MCP tool execution

downstream operation

progress or task polling

verification

retry decision

compensation

final workflow transition

Record low-cardinality attributes such as:

agent name and version

workflow type

tool name

server version

environment

result class

recovery type

error category

verification outcome

Keep prompts, tool arguments, tool results, customer data, and secrets disabled by default. Capture them only through explicit policy in a protected evidence store.

The goal is not to log everything.

The goal is to preserve enough evidence to prove what was authorized, what executed, what changed, and how the final state was determined.

Example Runtime Policy

The following YAML is an application-level policy example, not an MCP protocol object. It shows how the controller and runtime can define execution, verification, and recovery requirements around a consequential tool.

agent_execution_policy:
version: 5

action:
type: service.restart.execute
risk_tier: high
environment: production

preflight:
revalidate_identity: true
revalidate_policy: true
revalidate_approval: true
require_current_resource_version: true
require_no_conflicting_operation: true
acquire_execution_lease: true
reserve_authority_budget: true

execution:
sandbox_profile: api_only
credential_source: workload_identity
require_idempotency_key: true
maximum_attempts: 2
request_timeout_seconds: 30
absolute_deadline_seconds: 300
maximum_concurrent_actions: 1
retry_unknown_outcome: false

progress:
accept_protocol_progress: true
progress_may_extend_request_timeout: true
progress_may_extend_absolute_deadline: false

verification:
required: true
authoritative_read_tool: service.health.read
maximum_duration_seconds: 180
poll_interval_seconds: 10
expected:
operation_state: completed
healthy_instances: all
application_version: unchanged
prohibited:
duplicate_operation: true
unrelated_service_change: true

recovery:
transient_failure: retry_same_idempotency_key
unknown_outcome: reconcile
partial_completion: contain_then_evaluate
verification_failure: manual_or_compensate
compensation_workflow: service.restart.recover.v2
irreversible_step: false

evidence:
record_precondition_snapshot: true
record_tool_contract_hash: true
record_downstream_operation_id: true
record_verification_result: true
record_recovery_actions: true
capture_raw_credentials: false
capture_sensitive_content: false

emergency:
action_kill_switch: true
tool_kill_switch: true
credential_revocation: true
operator_handoff: true

The values must be changed for the actual tool, platform, service objectives, and recovery capability.

Successful enforcement means a timeout cannot trigger a blind duplicate restart, a stale approval cannot execute, a changed application version fails verification, and operators receive enough evidence to determine the final state.

Example Deterministic Execution Function

The following Python-like example shows the runtime order. It is intentionally framework-neutral.

from dataclasses import dataclass
from enum import Enum
from typing import Any

class Outcome(str, Enum):
VERIFIED = “verified”
NOT_STARTED = “not_started”
UNKNOWN = “unknown”
PARTIAL = “partial”
FAILED = “failed”

@dataclass(frozen=True)
class ExecutionEnvelope:
run_id: str
action_id: str
tool_name: str
arguments: dict[str, Any]
idempotency_key: str
approval_id: str
expected_postcondition: dict[str, Any]

def execute_action(envelope: ExecutionEnvelope) -> Outcome:
runtime_policy.revalidate(envelope)

with execution_leases.acquire(envelope.action_id) as lease:
current = authoritative_reader.read_target(envelope)
preconditions.assert_valid(envelope, current)

prior = idempotency_store.lookup(envelope.idempotency_key)
if prior is not None:
return reconcile_existing(envelope, prior)

idempotency_store.reserve(
key=envelope.idempotency_key,
action_id=envelope.action_id,
argument_hash=hash_arguments(envelope.arguments),
)

evidence.record_preflight(envelope, current, lease)

try:
result = mcp_executor.call_tool(
name=envelope.tool_name,
arguments=envelope.arguments,
idempotency_key=envelope.idempotency_key,
)
except RequestTimeout as exc:
evidence.record_timeout(envelope, exc)
return reconcile_unknown_outcome(envelope)
except TransientFailure as exc:
if retry_policy.permits(envelope, exc):
return retry_same_intent(envelope)
evidence.record_failure(envelope, exc)
return Outcome.FAILED

classified = result_classifier.classify(result)
evidence.record_execution_result(envelope, result, classified)

if classified.requires_reconciliation:
return reconcile_unknown_outcome(envelope)

verification = verifier.check(
envelope=envelope,
observed=authoritative_reader.read_target(envelope),
)
evidence.record_verification(envelope, verification)

if verification.passed:
idempotency_store.complete(
envelope.idempotency_key,
verification,
)
return Outcome.VERIFIED

recovery = recovery_policy.choose(envelope, verification)
recovery_runtime.execute(recovery)
return Outcome.PARTIAL

A production implementation must also handle cancellation, lease expiry, asynchronous task polling, approval revocation, policy changes, circuit breakers, secure credential injection, telemetry, and compensation verification.

The important property is that the model does not decide whether the operation started, whether a timeout is retryable, whether the post-condition passed, or whether compensation is authorized.

Common Execution and Recovery Failure Modes

Failure mode
What happens
Corrective control

Success equals HTTP or MCP success
Workflow advances before the business outcome exists
Define and verify authoritative post-conditions

Blind retry after timeout
Duplicate side effects occur
Classify as unknown outcome and reconcile first

New idempotency key on retry
Every retry becomes a new action
Reuse one trusted key for the same authorized intent

Model-generated idempotency key
Duplicate detection depends on probabilistic output
Generate keys in trusted runtime code

No precondition recheck
Approved action executes against stale state
Read authoritative state immediately before commit

Cancellation equals stopped
Client exits while external work continues
Reconcile downstream state before terminal cancellation

Compensation treated as simple undo
Recovery overwrites concurrent legitimate changes
Use domain-specific compensating actions and verification

Rollback plan stored only in prompt
Required recovery data is missing during failure
Persist recovery metadata in the execution ledger

Verification uses the write response
Server validates its own claim of success
Use an independent authoritative read path

Progress extends forever
Misbehaving work consumes resources indefinitely
Enforce an absolute deadline

Shared long-lived credential
One action has broad reusable authority
Inject short-lived action-scoped credentials

Sandbox has ambient access
Generated code reaches files, networks, or sockets outside scope
Use explicit mounts, egress deny, and ephemeral execution

Recovery has no idempotency
Compensation repeats and creates new damage
Treat recovery as a first-class idempotent workflow

Irreversible action occurs early
Later validation failure cannot be recovered
Place points of no return after reversible checks

Evidence records only final status
Operators cannot reconstruct partial work
Store preflight, execution, verification, and recovery events

A Practical Implementation Sequence

Select one bounded action

Begin with one action that has clear preconditions, a measurable post-condition, and a realistic recovery path.

Good starting actions include creating a draft, opening a ticket, adding a bounded label, or restarting one noncritical service instance.

Do not begin with arbitrary shell execution or broad production changes.

Define the action contract

Document:

target type

allowed arguments

expected side effects

preconditions

post-conditions

prohibited outcomes

idempotency scope

timeout

retry classification

cancellation behavior

recovery options

point of no return

evidence requirements

Add an execution ledger

Persist one action record before invoking the tool. Store state transitions and evidence as the operation advances.

Implement preflight reads

Query the authoritative system, compare versions, check conflicts, and reserve the authority budget.

Add idempotency and leases

Prove that duplicate queue delivery, worker restart, and response loss do not create duplicate side effects.

Isolate the runtime

Remove ambient credentials and network access. Inject only the short-lived identity required for the action.

Add result classification

Distinguish accepted, completed, partial, failed-before-side-effect, failed-after-side-effect, and unknown outcomes.

Implement independent verification

Create a read path that does not depend on the model or the write response.

Implement one recovery workflow

Test a native rollback, compensating action, forward fix, or manual handoff using the same control discipline as the original action.

Test cancellation and timeouts

Interrupt execution at every boundary:

before downstream receipt

after downstream receipt but before response

during asynchronous processing

after side effect but before verification

during compensation

Add observability and alerts

Alert on unknown outcomes, verification failures, compensation failures, lease expiry, duplicate suppression, and irreversible actions requiring manual review.

Expand authority gradually

Move through read, simulate, propose, approved execution, and bounded autonomy only after evidence shows that the runtime controls failure correctly.

Runtime Validation Tests

A production readiness test suite should include:

duplicate delivery with the same idempotency key

duplicate delivery with conflicting arguments

timeout before downstream receipt

timeout after downstream receipt

lost response after successful mutation

stale resource version

expired approval

revoked workload identity

changed tool contract

concurrent action against the same target

task record expiration

ignored cancellation

progress notification flood

partial multi-step completion

verification API outage

eventual consistency delay

compensation retry

compensation failure

operator kill switch

forensic reconstruction from evidence

A workflow that passes only the happy path is not production-ready.

Operating Metrics for Agent Execution

Measure the runtime as a production service.

Useful metrics include:

authorized actions started

precondition failures

duplicate actions suppressed

idempotency conflicts

execution lease conflicts

timeouts by action type

unknown-outcome rate

verification latency

verification failure rate

retries by classified cause

cancellation-to-containment latency

partial completion rate

compensation attempts

compensation success rate

manual recovery rate

irreversible action count

sandbox policy violations

post-condition regressions

cost per verified action

The most important denominator is often verified business outcomes, not tool calls.

A low tool error rate can hide a high verification failure rate.

Operational Ownership

Capability
Primary owner
Evidence required

Action contract
Business service owner and application owner
Allowed outcomes, prohibited outcomes, recovery requirements

Runtime engine
AI platform or workflow platform team
Availability, state recovery, leases, limits, release history

Idempotency
Tool owner and runtime owner
Key scope, retention, conflict tests, duplicate suppression results

Sandbox and execution identity
Platform security and identity teams
Runtime profile, scopes, egress policy, credential lifetime

Preconditions and verification
Enterprise system owner
Authoritative read path, consistency behavior, success criteria

Compensation workflow
Business and application owners
Recovery steps, authority, tests, manual fallback

Telemetry and evidence
SRE, security operations, and compliance
Trace contract, retention, redaction, access controls

Incident response
Agent service owner and operations
Kill switches, escalation path, recovery runbook

Final business outcome
Named agent service owner
Verified result, residual risk, acceptance criteria

The team that owns the MCP server may not own the complete business recovery. That ownership must be assigned before production deployment.

Execution, Verification, and Recovery Checklist

Before execution

Identity, policy, approval, and budget are revalidated.

Server, tool, schema, and contract versions match approval.

Current resource state is read from the authoritative system.

Preconditions and concurrency rules pass.

An execution lease is acquired.

The trusted runtime generates the idempotency key.

The short-lived credential and sandbox are prepared.

The post-condition and recovery policy are already defined.

During execution

The request uses the approved target and normalized arguments.

Timeouts and an absolute deadline are enforced.

Progress is correlated but cannot extend work indefinitely.

Output size and resource use are bounded.

Protocol, tool, and downstream operation identifiers are recorded.

Cancellation stops new work and signals in-flight work.

After execution

The result is classified beyond success or failure.

Unknown outcomes are reconciled before retry.

The authoritative system is queried independently.

Expected, tolerated, and prohibited outcomes are evaluated.

Evidence is retained without exposing raw credentials.

The workflow advances only after verified success.

During recovery

Retry, rollback, compensation, forward recovery, containment, and manual recovery are distinguished.

Recovery has its own authority and idempotency key.

Compensation progress is persisted.

Compensation is independently verified.

Irreversible steps trigger stronger review.

Failed recovery blocks further autonomous action and escalates.

Conclusion

The execution runtime is the last control boundary before an authorized agent proposal becomes a real enterprise side effect.

Its job is not merely to send the MCP request. It must revalidate the action, acquire exclusive execution authority, enforce idempotency, isolate the runtime, limit resources, classify uncertain outcomes, verify the authoritative post-condition, preserve evidence, and choose a safe recovery path when the outcome is wrong or unknown.

This is why protocol success cannot be the business success condition.

A tool response may prove that a server accepted or completed a request. It does not prove that the correct resource changed, that the change stayed inside the approved boundary, that an asynchronous job finished, that no duplicate action occurred, or that the service reached a healthy state.

The practical operating model is:

Execute inside a bounded runtime. Verify against the system of record. Retry only when the intent is idempotent. Compensate through a separately governed workflow. Escalate when the final state cannot be proven.

Part 5 will complete the series by placing MCP and A2A into one enterprise architecture. It will show where agent-to-tool execution ends, where agent-to-agent delegation begins, and how identity, task state, artifacts, policy, and observability should cross that boundary without creating a second uncontrolled control plane.

External References

Model Context Protocol: LifecycleCanonical URL: https://modelcontextprotocol.io/specification/2025-11-25/basic/lifecycle

Model Context Protocol: CancellationCanonical URL: https://modelcontextprotocol.io/specification/2025-11-25/basic/utilities/cancellation

Model Context Protocol: ProgressCanonical URL: https://modelcontextprotocol.io/specification/2025-11-25/basic/utilities/progress

Model Context Protocol: TasksCanonical URL: https://modelcontextprotocol.io/specification/2025-11-25/basic/utilities/tasks

Model Context Protocol: ToolsCanonical URL: https://modelcontextprotocol.io/specification/2025-11-25/server/tools

Model Context Protocol: SEP-2663 Tasks ExtensionCanonical URL: https://modelcontextprotocol.io/seps/2663-tasks-extension

Amazon Web Services: REL04-BP04 Make mutating operations idempotentCanonical URL: https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_prevent_interaction_failure_idempotent.html

Microsoft Azure Architecture Center: Compensating Transaction patternCanonical URL: https://learn.microsoft.com/en-us/azure/architecture/patterns/compensating-transaction

OpenTelemetry: Inside the LLM Call: GenAI Observability with OpenTelemetryCanonical URL: https://opentelemetry.io/blog/2026/genai-observability/

How Many AI Workloads Can My GPU Platform Really Support?
TL;DR An expected workload count is not a GPU requirement. Thirty concurrent notebooks, RAG services, inference endpoints, fine-tuning jobs, or distributed training…

Next PostBrownfield vSphere to VMware Cloud Foundation 9.1: Import, Converge, or Rebuild?Introduction The phrase “import an existing vCenter” sounds safer than it really is. It suggests that VMware Cloud Foundation reads an inventory, registers a few objects, and leaves the underlying…
The post How to Execute, Verify, and Roll Back Agent Actions: Enterprise Agent Control Plane Series, Part 4 appeared first on Digital Thought Disruption.