What outcome verification checks that other controls do not

Most of the controls emerging around production AI agents verify something about the agent or its execution. Identity and authorization checks establish that the agent was allowed to act. Pre-action approval gates hold a risky action until a person or a policy engine clears it. Signed execution receipts provide tamper-evident evidence of what the signer recorded about a tool call: they can establish who signed the record and that it was not altered afterward. Observability traces show how the run unfolded, and evaluations score the quality of the model's output.

All of these are useful, and none of them answers the question the business will actually be asked: did the refund settle, did the account change, was the claim closed, for the right customer, at the right amount? Outcome verification is the control that answers it. After the agent acts, it reads the system the business treats as the source of truth for that result, compares what the system shows against the outcome the agent intended, and classifies the action accordingly. The other controls verify the agent and the record. Outcome verification verifies the business reality.

Why a successful tool call is not proof

The write path reports on its own operation, not on the final business state. When an agent calls issue_refund and receives a 200 OK, the request succeeded according to that endpoint's contract. What the contract covers varies by API: the response may confirm the immediate operation while the downstream outcome is still in motion. Between that response and the final business state, several things can still go wrong, and in production systems they regularly do:

  • The request is accepted but queued for batch processing that has not run yet.
  • The payment is held for fraud or compliance review and later released or rejected.
  • A downstream system rejects or reverses the transaction after the initial acceptance.
  • Only part of the intended change is applied, such as one field of an account update.
  • An integration or transformation bug changes a material value between the agent's decision and the executed request, so the wrong amount succeeds cleanly.
  • The action lands on the wrong entity: a different customer, order, or transaction.

In every one of these cases the agent's own report, and the observability trace built from it, shows a successful run. What a complete record of the attempt should capture is covered in the audit trail guide; this article covers the step that comes after the record: confirming what actually happened. That confirmation has four steps.

Step 1: Define the expected outcome before the action executes

Verification starts before the action runs, because you cannot confirm an outcome you never stated. At decision time, the record should capture not just what the agent decided but what the world should look like if the action succeeds. That expected outcome comes from the decision itself and the policy that supported it, which is why it belongs in the same record as the decision-time context and the policy snapshot that business evidence preserves.

An expected outcome is specific enough to check mechanically. For a refund:

ElementExample for a refund
System of recordThe billing platform that settles the payment
Record locatorPayment or order identifier, and customer identifier C-18472
Material valuesAmount $150.00, currency USD, the original transaction it refunds
Expected final stateRefund settled, not merely created or accepted
Verification windowHow long the outcome may stay pending before a person looks at it

Writing this down before execution has a second benefit: it forces precision about what "success" means for each action type. "Refund called" is not an outcome. "This refund, for this customer, at this amount, settled in the billing platform" is, and the difference between the two is exactly what verification exists to check.

Step 2: Read the system of record, not the write response

The verification result must be independent of the write response, not blind to it. The read may locate the record using a durable identifier the write returned, such as a refund or transaction ID, but it must retrieve the authoritative current state from the destination system rather than treating the write response itself as proof of the outcome. If the agent updated the CRM, verification queries the CRM afterward and looks at the account as it now stands. If the agent issued a refund, verification fetches the payment record and reads its status, amount, and recipient.

Which system counts as the system of record is a business question, not a technical one: it is the system the organization would consult, and expect to prevail, if the result were disputed. The billing or payment platform for refunds and charges. The CRM for account and subscription changes. The claims platform for claim decisions. The ticketing system for support actions. The ERP for orders and inventory. It is never the agent's own database, a cache, or the log of the tool call, because those record what the agent believes it did, and the entire point of verification is to not take the agent's word for it.

Authoritative events and webhooks from the destination system can carry real outcome evidence, and they can trigger a verification check earlier than a scheduled read would. Where the source supports an independent read, the preferred anchor is still a direct read of the authoritative record, because a read at a point in time is an artifact a reviewer or an auditor can later reproduce. Where the source is event-driven and offers no suitable read, authenticated and retained source events can serve as the evidence, provided their provenance, delivery, and correlation to the action can be demonstrated.

Step 3: Compare material fields, not just existence

Finding a record is not the same as confirming the outcome. A refund record can exist with the wrong amount, and an account update can exist with only some of the intended fields changed. Once the read returns, verification matches the record to the action and compares the fields that matter:

Match the record to the action. The strongest link is an identifier written at execution time, such as an idempotency key or a reference stored in the destination system's metadata. Where that is not available, the record is located by the durable identifiers in the expected outcome: the customer, the original transaction, the amount, the time range. If the search returns two plausible candidate records, or none, the action is not verified, and the ambiguity itself is the finding.

Normalize before comparing. Systems disagree about representation: amounts in cents versus dollars, timestamps in different time zones, status vocabularies that use "settled", "completed", and "succeeded" for the same terminal state. Verification logic maps each source's representation into one comparable form, and the mapping is part of the configuration a reviewer can inspect, not an assumption buried in code.

Compare with explicit tolerances. For identifiers, and for monetary fields the business defines as invariant, comparison is exact: customer C-18472 is not customer C-18473, and an expected $150.00 refund is not satisfied by $105.00. Where the process legitimately transforms the amount (currency conversion, fees, tax, rounding, an expected partial settlement), those transformations belong in the comparison as explicit rules, not hidden tolerances. For timestamps, a bounded window is normal. What matters is that every rule and tolerance is stated, so a mismatch is a fact about the world rather than a judgment call made silently by the comparison code.

Step 4: Treat time as part of the answer

Business systems are eventually consistent. A refund settles minutes or days after it is accepted. A CRM synchronizes from an upstream source on a delay. A claims platform moves a case through states over hours. Verification that demands an instant pass or fail will mislabel normal latency as failure, or worse, will mark accepted-but-pending outcomes as successful to keep the numbers clean.

The alternative is to make time explicit. An outcome that has not reached its final state is pending, and pending is a first-class verification state, not a failure. The verifier re-reads the system of record on a schedule, with backoff, inside a verification window set per action type: minutes for a CRM update, longer for a payment that settles in batches. Two boundaries keep the states honest. An outcome that resolves inside the window becomes verified or mismatch on the evidence. An outcome that does not resolve inside the window escalates to a person instead of being assumed successful. And a system of record that cannot be queried at all is recorded as source unavailable, which says nothing about the outcome and everything about the evidence: the action may well have succeeded, but the organization cannot yet prove it.

The rule that makes it safe: verification reads, it never re-executes

One property separates verification that can run unattended at scale from verification that quietly creates new incidents: the verifier must be unable to repeat the business action. If a refund's status is unclear, the verifier reads the payment record again. It never calls the refund endpoint again. A verification retry is always a repeated read, never a repeated write.

This is worth enforcing by construction rather than by convention. The verifier holds its own credentials, scoped to read the systems of record and nothing more, separate from the credentials the agent uses to execute. Idempotency keys on the write path are a valuable guard against duplicate execution by the agent itself, but verification should not need them, because verification should have no way to write at all. The reasoning is the same one behind any independent control: a check that can modify the system it is checking is not independent, and an unverified refund is a smaller problem than a refund issued twice by the process that was supposed to confirm it.

Classify every action, then route by state

Verification itself produces one of five evidence states: verified, outcome mismatch, pending, and two kinds of unverifiable, source unavailable and insufficient evidence. A pending action whose verification window expires does not fail quietly and does not resolve on its own; it escalates to review. That human review is then tracked as its own lifecycle, from review required to resolved, alongside the evidence state rather than in place of it. The definitions behind these states are covered in the audit trail guide. What makes them operational is what each one triggers next:

StateWhat happens next
VerifiedThe evidence packet is completed and sealed; no human attention is needed.
PendingThe verifier re-reads the system of record on a schedule; if the window expires unresolved, the case escalates to review rather than being assumed successful.
Source unavailableThe read is retried; persistent unavailability escalates to review.
Outcome mismatchThe case is routed to human review with the complete evidence.
Insufficient evidenceRouted to review, and usually also an instrumentation fix.

Because most actions verify cleanly, the review queue this produces is small and every item in it arrives with a stated reason and the full record behind it. That is the foundation of exception-based human review: automated verification absorbs the routine volume, and people spend their attention only where the evidence says something is off.

A worked example: the $150 refund that settled at $105

Here is the full pipeline on one action, the same case used across these guides. A support agent approves a refund; a transformation bug in the integration drops a discount adjustment on the way to the billing platform.

TimeEvent
10:04:12The agent approves a $150.00 refund for customer C-18472 under the refund policy version in force; the expected outcome is recorded.
10:04:13The executed call sends $105.00 to the billing platform.
10:04:13The billing API returns 200 OK; the trace records a successful run.
10:09First read-back: the refund exists, amount $105.00, status pending.
12:04Second read-back: status settled, amount $105.00.
12:04Comparison: expected $150.00, observed $105.00. The action is classified as an outcome mismatch and routed to review.
12:31A reviewer confirms the gap, issues a corrective $45.00 refund through the normal channel (with its own evidence record), and marks the case resolved.

Note what did not happen. The verifier never called the refund endpoint a second time; its retries were reads. And note when the problem surfaced: about two hours after the action, on the organization's initiative, with the full evidence attached. Without verification, this mismatch surfaces when the customer notices $45 missing, or when finance reconciles the period, and the investigation starts from nothing.

What verified outcomes give the business

The immediate return is operational: disputes are answered from an evidence packet instead of a reconstruction project, and integration bugs like the one above surface in hours rather than at month-end reconciliation. The structural return is a number most agent programs do not have: the share of consequential actions whose outcomes are confirmed in the systems of record. That verified outcome rate is an honest basis for deciding how much autonomy an agent has earned, in a way that self-reported success rates are not.

For compliance, verification records demonstrate something governance documentation alone cannot: not just that controls exist, but that on each individual action reality matched them, which is the distinction drawn in governance versus business evidence. Frameworks such as the EU AI Act, the NIST AI RMF, and ISO/IEC 42001 converge on traceability and records that show your controls working; verified, action-level outcomes are a strong form of exactly that record.

How Pruvz verifies agent outcomes

Pruvz is being built as a business evidence layer for production AI agents, and outcome verification is its core loop. For each consequential action it captures the decision-time context and the applicable policy version, records the expected outcome alongside the executed action, then reads the relevant system of record independently, outside the agent's critical path, and compares the result. Confirmed outcomes are sealed into evidence packets; mismatches, missing evidence, and expired windows are routed to human review with the complete record attached; and the verifier is read-only by design, so verification can never repeat a business action. The verified results roll up into a business view, so operations, compliance, and leadership can see outcome and exception trends and drill from any number down to the evidence for a single action. How this works in the product, with the demo and evidence assets behind each claim, is on the AI agent outcome verification solution page.

This article is general technical and governance information, not legal advice. Your obligations depend on your jurisdiction, industry, and specific use case.