- what outcome VerifiedX reached
- whether the side effect is safe to execute
- how the workflow should continue
- where a replan should happen
- what would have to change before retrying
What a receipt contains
| Field | Description |
|---|---|
receipt_type | Always verifiedx_decision_receipt |
decision_id | Stable identifier for this decision |
outcome | One of allow, allow_with_warning, replan_required, or goal_fail_terminal |
action_class | The protected class involved, such as memory_write, record_mutation, system_change, or external_message_send |
safe_to_execute | Whether the requested boundary is allowed to execute now |
reasons | Structured reasons for the decision |
safe_next_steps | Safe next steps the system can take without pretending the blocked effect happened |
viewer_guidance | Extra guidance for reviewer or operator-facing views |
what_would_change_this | What new evidence, approvals, or context would change the decision |
disposition | How the workflow should continue |
routing | Where the result should go next: downstream, local, upstream, human, or stop |
resume_contract | Whether to retry this node, pass the receipt upstream, and what must change before retry |
runtime_loopback | Runtime loopback details when the boundary should not or did not complete |
metadata | Optional adapter or runtime metadata |
Disposition modes
The most important part of the receipt is usuallydisposition.mode.
| Mode | What it means |
|---|---|
continue_downstream | The boundary is allowed and the workflow can continue normally |
local_replan | The current node should keep working locally toward the same goal without executing the denied effect |
upstream_replan | The current node should stop local work and return the receipt upstream so missing support or approvals can be gathered |
human_review | The workflow should pause for human review |
terminal_block | The current path is terminally blocked |
Example receipt
This is a representativereplan_required receipt for a composed workflow that needs upstream recovery:
How to use receipts
Receipts are synchronous outputs of the protected-boundary flow. Your system should branch on the receipt, not guess from prose. Typical handling looks like this:-
continue_downstream- The boundary is allowed.
- The side effect may execute.
- The workflow can continue normally.
-
local_replan- Do not execute the denied side effect.
- Keep the receipt local.
- Replan inside the same node or agent using
reasons,safe_next_steps, andwhat_would_change_this.
-
upstream_replan- Do not keep pushing locally.
- Return the receipt upstream.
- Let the parent orchestrator or supervisor gather the missing evidence, approval, or context before retrying this node.
-
human_review- Surface the receipt to a reviewer.
- Use
viewer_guidance,reasons, andresume_contractto drive the review step.
-
terminal_block- Do not claim success.
- Fail truthfully.
- Hand off to a human or upstream workflow if appropriate.
Receipts and loopback results
When a protected boundary is blocked at runtime, VerifiedX usually returns a structured blocked tool result as well as the receipt. That blocked result typically includes:ok: falseblocked: trueboundary_outcomesafe_next_stepsdecision_receipt
Key idea
A receipt is not just an audit artifact. It is the machine-readable contract that lets your system continue safely:- downstream when execution is allowed
- locally when replanning should stay on the current node
- upstream when the blocker must be resolved by a parent stage
- truthfully when the workflow has to pause or stop