Generated data and executable requests
A structured output follows an explicit machine-readable contract. A tool call names an operation and supplies arguments. Application code or a delegated runtime executes that request; generating it does not perform the operation.
In a constructed ticket service, assigning ticket T-42 to user U-9 involves four distinct representations. Their similar contents conceal different evidential roles.
From proposal to observed outcome
ExampleExecution requires a gate; reporting requires evidence.
Read the diagram as text
- Assignment request.
- Generated proposal.
- Application checks.
- Authoritative write. Effect boundary
- Observed result.
- Final response.
- Rejected without invocation.
- Assignment request → Generated proposal: Data: requested intent.
- Generated proposal → Application checks: Data: arguments.
- Application checks → Authoritative write: Control: valid and permitted.
- Application checks → Rejected without invocation: Control: invalid or denied.
- Authoritative write → Observed result: Data: operation outcome.
- Observed result → Final response: Data: reporting evidence.
| Representation | Example | What it establishes |
|---|---|---|
| Prose claim | T-42 is assigned to U-9. | The model asserted an outcome; execution remains unestablished. |
| Assignment data | {"ticket_id":"T-42","assignee_id":"U-9"} | A record describes an assignment. Extraction can stop here without executing a tool. |
| Proposed call | assign_ticket with those arguments | An operation was requested; the executor still decides whether to invoke it. |
| Observed result | A correlated service result confirms the persisted assignee. | The service reports an effect, subject to its documented result contract. |
Tools can request reads as well as writes. A workflow can also combine tool calls with a structured final answer.
Output contracts and missing information
A schema describes admissible data. JSON represents values; JSON Schema expresses constraints on those values. Declaring a property does not require its presence: required does that. Unrecognized properties remain allowed unless constrained, for example with additionalProperties: false.
The assignment contract must also explain field meanings. An assignee identifier names a user record, not a display name; an expected revision identifies the state on which a proposed change depends. Descriptions communicate these meanings to the model and maintainers, while executable validators enforce the checkable rules.
| Field or structure | Constraint | Interpretation |
|---|---|---|
| kind | enum: ["proposal"] | A fixed tag identifies this result variant. |
| ticket | Nested object containing ticket_id and project_id | Apply required-field and extra-property rules inside this object too. |
| assignee_id | type: "string" | The representation is textual; existence and eligibility need separate checks. |
| expected_revision | type: "integer", minimum: 0 | Reject negative revisions and numeric strings; validation does not prescribe coercion. |
| missing_fields in a needs-input result | items restricts names; minItems: 1 | Element constraints alone allow an empty array. A length constraint requires an actual missing-field entry. |
| Instance condition | Contract consequence |
|---|---|
| assignee_id is absent | Fails if required; otherwise the consumer needs an explicit omission policy. |
| assignee_id is null | Present but null; accepted only by a schema permitting null. Define whether it means unassignment or unavailable information. |
| assignee_id is an empty string | Still a string. Reject it explicitly when identifiers cannot be empty. |
| An undeclared field appears | A closed object rejects it instead of silently giving it an accidental meaning. |
| A default is declared | JSON Schema treats default as an annotation; validation does not insert it. Framework transformations are separate behavior. |
A tagged union uses a distinguishing field to select a result shape. Here, proposal requires complete arguments, needs_input identifies information to request, and unknown explains unavailable evidence. Mutually exclusive tags prevent overlap: oneOf requires exactly one matching branch, whereas anyOf permits several. This design represents insufficiency without inventing an assignee.
A schema dialect defines keyword semantics; a root $schema identifies it. A generation engine may implement only a subset. Record both the intended dialect and supported generation constraints: declaring a dialect does not install missing capabilities. Keep producer instructions, validators, and consumers on the same contract.
Constraints during generation
A token references an entry in the model vocabulary. During generation, the model produces logits, relative scores for possible next tokens; a selection procedure chooses a continuation. Tokenization explains reconstruction of text from tokens. LLM Inference covers general selection and serving behavior.
| Method | Where it operates | What it supplies |
|---|---|---|
| Formatting instructions | Prompt | Guidance to produce a format; instructions alone do not mask invalid continuations. |
| JSON mode | Generation interface | JSON syntax under its documented conditions, without adherence to a particular schema. |
| Schema-constrained generation | Supported generation contract | Adherence to supported constraints for eligible completed responses; refusals and incomplete responses require separate handling. |
An escape changes legal continuations
ExampleCharacter meaning depends on retained parser state.
Read the diagram as text
- String: escape pending.
- Candidate quote. Remains inside string.
- Candidate u. Four hexadecimal digits follow.
- Candidate q rejected.
- Select permitted token.
- Advance prefix and state.
- String: escape pending → Candidate quote: Quote: legal escape.
- String: escape pending → Candidate u: u: Unicode escape.
- String: escape pending → Candidate q rejected: q: invalid escape.
- Candidate quote → Select permitted token: Retain candidate.
- Candidate u → Select permitted token: Retain candidate.
- Select permitted token → Advance prefix and state: Append selected token.
Constrained decoding removes next-token choices that cannot continue the requested structure. A grammar specifies legal compositions; a schema constrains completed values. An engine can compile supported schema rules into a grammar, track the generated prefix, and mask invalid choices before selection. OpenAI's described implementation preprocesses the grammar into a reusable artifact.
Token boundaries need not coincide with grammar boundaries. One token can contain several structural characters, so checking it may require several parser transitions. Nested structures require remembering unfinished enclosing structures. XGrammar's implementation combines live parser stacks with cached token-validity information; it does not precompute every possible complete stack.
- Generation work — Constraints can avoid explanatory filler, and some implementations skip predictable structural choices. Preprocessing and per-token checking also require work. Measure the complete workload rather than assuming either universal overhead or universal acceleration.
- Changed content probabilities — Masking and renormalizing legal next tokens generally differs from conditioning the model on an entire valid completion. Exact conditioning also accounts for each continuation's future probability of remaining valid. Structural enforcement can therefore change content preferences without universally improving or worsening task accuracy.
Runtime support is part of the contract. The llama.cpp grammar documentation warns that unsupported schema features may be skipped during conversion and that output constraints do not automatically explain the task in the prompt. Inspect conversion warnings and test the generated language; an accepted schema file alone does not establish enforcement.
Completion, parsing and runtime validation
The response envelope carries status and payload information; the application value is inside it. Inspect completion status before treating that payload as final. A refusal, token-limit cutoff, cancellation, or transport failure needs its own outcome path rather than an assumption that the requested record exists.
Parsing converts serialized text into values. Runtime validation checks those values against the contract. A TypeScript annotation performs neither operation: type annotations disappear from emitted JavaScript. Incoming model data needs executable checks before a consumer relies on its declared type.
Preview and final eligibility
ExampleA preview precedes completion and validation.
Partial data is provisional.
Read the diagram as text
- Response R.
- Partial snapshot.
- Provisional preview.
- Completion recorded.
- Runtime validation accepted.
- Final consumer.
- Response R → Partial snapshot: Yields prefix.
- Partial snapshot → Provisional preview: May render.
- Response R → Completion recorded: Completion evidence.
- Completion recorded → Runtime validation accepted: Final checks pass.
- Runtime validation accepted → Final consumer: Eligible value.
- Preview. Partial data is provisional. Active: Response R, Partial snapshot, Provisional preview. New: Response R, Partial snapshot, Provisional preview.
- Completed. Completion evidence arrives. Active: Response R, Partial snapshot, Provisional preview, Completion recorded. New: Completion recorded.
- Validated. Final checks permit consumption. Active: Response R, Partial snapshot, Provisional preview, Completion recorded, Runtime validation accepted, Final consumer. New: Runtime validation accepted, Final consumer.
- Duplicate members — Choose an explicit parsing policy. JSON consumers can reject duplicate names, preserve multiple pairs, or retain one value; successful parsing does not guarantee agreement.
- Coercion — Document accepted conversions. Pydantic demonstrates that strict JSON parsing can accept representations rejected by strict validation of corresponding Python objects. The input path matters.
- Resource limits — Bound accepted size and nesting for the chosen parser. Braces inside strings and escaped quotation marks require grammatical recognition; counting punctuation is insufficient.
- Repair — Treat repaired text as a new candidate requiring validation. Restructuring an answer can change its meaning, including when a smaller model performs the repair.
A published partial-parsing example retains two completed strings while discarding an unfinished third; ordinary parsing rejects the incomplete array. Another incomplete object can already validate against a model. These examples establish that obtaining a valid value does not establish that the original response finished.
Streaming completed records and streaming partial previews serve different consumers. A UI may display an evolving object, while an executor waits for the call's completion signal and final checks. Keep previews explicitly provisional so defaults or omitted unfinished fields cannot silently become final action arguments.
Meaning beyond schema acceptance
Semantic validation checks values in their business context. A string can have the correct representation while identifying the wrong ticket. A domain invariant is a consistency rule that valid application states must preserve. A referential check establishes that an identifier points to an existing eligible record.
| Obligation | Evidence | Remaining limitation |
|---|---|---|
| Representation | Runtime validation accepts the argument object. | Well-typed identifiers can still identify the wrong records. |
| Reference and membership | Authoritative lookup finds the ticket and an assignee eligible for its project. | Eligibility does not establish the requesting user's permission. |
| Cross-field rule | The proposed project agrees with the ticket's project. | Internal consistency does not establish intended meaning. |
| Intent | The request identifies which of two similarly named users should receive the ticket. | Without distinguishing information, clarification is more defensible than guessing. |
A system of record is the designated authoritative source for a business fact. Privacy and Data Governance explains its ownership and field meanings. Checks against that system establish facts such as current membership; they cannot reconstruct an ambiguous intention that the user never supplied.
A precondition is an obligation before invocation; a postcondition states what successful execution owes. Schema acceptance establishes only specified properties of a value. It does not establish the intended state change. Acceptance criteria connect success to observable outcomes rather than attractive representations.
- Consistency without fidelity — Receipt line items can reconcile with an extracted total while all values were misread from the image. A cross-field validator catches inconsistency, not every extraction error.
- Evidence without support — Requiring a verification trail helps block unsupported claims. Merely attaching a source still leaves the separate obligation to establish that it supports the assertion.
Tool contracts and operation selection
A tool definition gives the model a stable name, purpose, and argument contract. Its result contract and operational behavior tell the executor and downstream consumers what to expect. Descriptions guide selection; application code enforces the operation. Interfaces differ in which of these elements they expose directly.
| Contract element | read_ticket | assign_ticket |
|---|---|---|
| Purpose | Retrieve current ticket state. | Change the assigned user. |
| Arguments | Ticket identifier. | Ticket, assignee, and expected revision. |
| Result | Visible fields and observed revision. | Confirmed change, rejection, or a pending-operation handle. |
| Operational obligation | Enforce read access. | Enforce write access and stated preconditions before mutation. |
Select according to the information needed
ExampleMissing information changes the appropriate operation.
Read the diagram as text
- Request and available evidence.
- Answer without a call.
- Request clarification.
- Read authoritative state.
- Propose assignment.
- Request and available evidence → Answer without a call: No operation needed.
- Request and available evidence → Request clarification: Intent or target ambiguous.
- Request and available evidence → Read authoritative state: Intent clear; current facts missing.
- Request and available evidence → Propose assignment: Change specified; facts established.
Command-query separation separates operations intended to change state from requests for information. That distinction helps callers reason about effects; it does not exempt reads from permission checks or resource limits. Credentials and the identity being represented belong in trusted execution context, rather than fields that the model may invent.
- Fixed orchestration — Application code can choose a mandatory operation directly. A known prerequisite need not become another model-selection task.
- Model selection — The application supplies eligible tools; the model chooses among their declarations. Larger catalogues introduce more alternatives to distinguish. Broader planning belongs in Agent Engineering.
- Selection controls — Depending on the interface, controls permit no call, require a call, or restrict eligible tools. Forcing selection does not supply missing facts.
Model Context Protocol, or MCP, standardizes exchanges between a host application's clients and capability servers. Those exchanges can discover and invoke tools. The model-facing proposal and the application's server invocation remain different interfaces; neither connectivity nor discovery grants execution authority. Model Context Protocol covers roles, transport, and lifecycle.
Authorized dispatch and call identity
A principal is the person or service whose authority is exercised. Authorization determines permitted operations on particular resources. A trust boundary is a crossing where incoming data or claimed authority needs checking. Obtain identity from trusted application context, not a generated claim of consent. Access governance and AI Security explain the broader boundaries.
When policy requires approval, bind it to the operation's significant details, identity, and lifetime. Changing the target or arguments invalidates the prior approval. Recheck relevant permissions and current state at execution: time-of-check to time-of-use failures occur when the checked operation differs from the one actually performed.
Generated data meets trusted authority
ExampleArguments do not supply their own permission.
Read the diagram as text
- Validated arguments.
- Trusted principal.
- Policy and required approval.
- Execution gate.
- Denied: no invocation.
- Atomic revision check.
- Conflict: no change.
- Apply assignment.
- Validated arguments → Execution gate: Data: proposed change.
- Trusted principal → Execution gate: Authority: actor.
- Policy and required approval → Execution gate: Authority: conditions.
- Execution gate → Denied: no invocation: Control: requirements unmet.
- Execution gate → Atomic revision check: Control: permitted.
- Atomic revision check → Conflict: no change: Control: revision differs.
- Atomic revision check → Apply assignment: Control: revision matches.
- Approval placement — Put mandatory review in the execution path, rather than exposing a separate review tool the model can skip. The n8n demonstration describes intercepting ordinary tool invocations before execution.
- Approver authority — An approval does not override missing permission. Kim Maida's demonstration rejects an approved restart when the approver lacks the required role.
- Streaming assembly — Accumulate argument fragments separately by call identity and wait for documented completion before reconstructing and executing a call.
Argument validation applies parsing, schema, and domain checks to a proposed invocation. A registry maps permitted names to implementations. Dispatch through that registry instead of evaluating generated text. Return results with the originating call identifier; completion order and function name cannot reliably distinguish several outstanding calls.
# Interface-neutral: pre-invocation checks raise typed rejections.
def dispatch(call, context):
require(call.status == "complete")
handler = registry.require_known(call.name)
args = parse_json(call.arguments, reject_duplicates=True)
handler.validate_schema(args)
handler.validate_domain(args, context)
authorize(context.principal, handler, args)
require_current_approval_if_needed(context, handler, args)
result = handler.invoke(args, context)
# Post-invocation validation: effects may already have completed.
# Failure here does not establish that execution was prevented.
handler.validate_result(result)
return tool_result(call.id, result)For the constructed service, assignment checks the expected revision atomically with the write. An earlier read alone leaves a race. This is optimistic concurrency control: reject a change based on stale state. HTTP If-Match provides an analogous precondition when the endpoint supports it; a failed comparison prevents applying the method.
Independent reads may execute concurrently. A write whose arguments require a read must wait for its actual result. Several proposals emitted together do not establish independence, and a model-generated guess cannot substitute for the prerequisite observation.
Results and justified completion claims
A result envelope associates an observation with its operation and status. Validate returned values before downstream use. Tool execution errors can be represented separately from protocol errors; neither should be converted into success merely because a response arrived. The versioned MCP tools contract explicitly distinguishes these error paths.
| Observation | Permitted report | Unsupported inference |
|---|---|---|
| Accepted for processing | The operation was accepted and remains pending. | The assignment finished. HTTP 202 does not establish completion. |
| Operation handle | Track this operation for its eventual result. | A visible handle or provisional resource is ready for use. |
| Confirmed completed assignment | The service confirmed the ticket's new assignee. | Every downstream notification or user interface also updated. |
| Authoritative rejection before execution | The requested change was rejected. | The rejection is a successful assignment. |
| Timeout without authoritative outcome | The outcome remains unconfirmed. | The write failed and can safely be replaced with a new operation. |
An empty body also needs interpretation through the endpoint contract. HTTP 204 indicates successful fulfillment without response content. For asynchronous operations, distinguish errors that prevent starting from failures occurring after acceptance; a start response cannot stand in for the eventual operation result.
Large results can be stored outside model context and summarized. Keep the authoritative identifier, outcome status, retrieval reference, and explicit omissions in the representation supplied downstream. A shorter summary must not turn partial evidence into a complete answer. Context Engineering covers selection and compaction.
- Data versus authority — Returned content is input to interpret, not permission to perform its embedded instructions. Protocol interoperability leaves access controls and trust decisions with implementers; AI Security develops this distinction.
- Final reporting — Construct the final answer from observed results. A proposal, dispatch attempt, and confirmed effect are separate events even when the model can describe all three fluently.
Boundary failures and bounded correction
Recovery depends on both the failed boundary and whether execution could already have occurred. A model refusal, an application rejection, and a tool failure are different outcomes. A repair request changes candidate data; it does not establish permission or resolve an uncertain external effect.
| Failed boundary | Execution knowledge | Recovery |
|---|---|---|
| Refusal or incomplete generation | No complete dispatchable proposal. | Expose that outcome; do not manufacture missing arguments. |
| Parsing or schema | Rejected before invocation. | Return actionable errors and allow bounded regeneration. |
| Meaning or selection | The proposed action is unsuitable or underspecified. | Obtain authoritative information or clarification instead of forcing a call. |
| Authorization | Execution is prohibited. | Stop or use an explicit escalation path; formatting retries cannot grant permission. |
| Write precondition | The attempted change was rejected as stale. | Read current state and reassess the intended operation. |
| Execution or result delivery | An effect may already exist. | Determine status before deciding whether repeating the operation is safe. |
| Result validation | An observation arrived but violates its contract. | Withhold unsupported completion claims and investigate the operation. |
Useful validation feedback identifies the rejected field and violated rule. In Samuel Colvin's extraction demonstration, a date validator rejects an interpretation, the framework returns the error, and another final-result call supplies a corrected value. That trace demonstrates repair for one case, rather than guaranteed convergence.
Preserve the original request and relevant errors across correction attempts. Set attempt or elapsed-time limits and retain exhausted-attempt information. Instructor documents both bounded stopping and contextual re-asking. General retry scheduling belongs in Harness Engineering; the invocation boundary must still expose an explicit terminal outcome.
- Correction trace — A candidate violates a deterministic rule; feedback describes the violation; a replacement candidate is generated; validation runs again. Passing the replacement onward requires the normal execution gate.
- Fail closed — When permission cannot be established, do not execute. Every corrected proposal requires permission checks again; changing the candidate does not inherit authority from a rejected attempt.
Uncertain effects and safe retries
A ticket write can commit before its response is lost. The caller then lacks knowledge of the outcome; the service has not necessarily failed. Durable execution has the same gap when an external effect completes before its result is recorded. Replaying recorded history cannot recover a completion that was never recorded.
Idempotency means repeated attempts have no additional intended effect beyond one execution. An idempotency key identifies the same logical operation across retries. Duplicate prevention depends on the receiving service coordinating that identity with the mutation; merely writing the key into a client log does not protect the external effect.
Committed state, uncertain caller
ExampleLosing a response changes knowledge, not the committed effect.
A carries operation O.
Read the diagram as text
- Operation O.
- Attempt A.
- Service: assignment committed.
- Response lost.
- Caller: outcome unknown. Historical observation after loss.
- Keyed status confirms completion.
- Caller: completion established.
- Operation O → Attempt A: Submitted as.
- Attempt A → Service: assignment committed: Produces effect.
- Service: assignment committed → Response lost: Reply lost afterward.
- Response lost → Caller: outcome unknown: Leaves uncertainty.
- Operation O → Keyed status confirms completion: Correlates lookup.
- Service: assignment committed → Keyed status confirms completion: Recorded outcome.
- Keyed status confirms completion → Caller: completion established: Resolves uncertainty.
- Submitted. A carries operation O. Active: Operation O, Attempt A. New: Operation O, Attempt A.
- Committed. The service applies the assignment. Active: Operation O, Attempt A, Service: assignment committed. New: Service: assignment committed.
- Uncertain. The caller loses the response. Active: Operation O, Attempt A, Service: assignment committed, Response lost, Caller: outcome unknown. New: Response lost, Caller: outcome unknown.
- Reconciled. Authorized status lookup establishes completion. Active: Operation O, Attempt A, Service: assignment committed, Response lost, Caller: outcome unknown, Keyed status confirms completion, Caller: completion established. New: Keyed status confirms completion, Caller: completion established.
| Identity | Purpose | Across a retry |
|---|---|---|
| Call identifier | Match a model request with its tool-result message. | A new model proposal can have a different call identifier. |
| Operation identifier | Represent one business intent for service-side deduplication. | Preserve it when retrying that same intent. |
| Attempt identifier | Distinguish individual submissions and observations. | Each submission is a separate attempt, even when the operation is unchanged. |
Assume the constructed ticket service scopes keys to the caller, rejects changed parameters, atomically records each key with its mutation, and retains operation results throughout the retry window. It also exposes an authorized status lookup. These are explicit service requirements, not properties supplied by the schema or client library.
Reconciliation resolves uncertainty using authoritative evidence. Look up the operation by its retained identifier. A completed result supports reporting completion without another mutation. A read showing the desired assignee is weaker when another actor could have made that change. Inconclusive evidence leaves the operation unresolved.
- Duplicate-protection limits — Provider retention and parameter rules matter. Stripe can prune keys after they are at least 24 hours old; reusing a pruned key creates a new request. It also replays stored failures, including HTTP 500. Replacing an uncertain operation's key is not a safe way to bypass that response.
- Changed intent — Changing the assignee creates a different proposed action. Reassess preconditions and required approval instead of reusing authorization for the earlier arguments.
- Cancellation — A cancellation request does not establish rollback. One documented Google API uses best-effort asynchronous cancellation and requires checking the operation afterward; it can complete despite the request. Treat the actual service's cancellation contract as authoritative.
- Recovery scope — A task may execute again if its effect occurred before checkpoint completion. Harness Engineering covers durable recovery; saved execution state still does not replace external duplicate protection.
Interface verification through state and failures
A fixture supplies controlled initial data; a trial executes a task; a trajectory records observations and actions. Executable evaluation cases explain these foundations. For an interface, inspect required calls as well as resulting state: a read can be essential while leaving the database unchanged.
BFCL V3 combines state checks with required execution-path checks on each turn. This illustrates why final state alone can miss skipped information gathering. The ticket cases below are a proposed test design: they specify what the boundary should preserve, rather than report measured reliability.
| Injected condition | Required observation | Forbidden effect |
|---|---|---|
| Malformed or truncated output | Explicit parse or completion failure. | No dispatch from a partial candidate. |
| Well-typed nonexistent identifier | Reference validation rejects it. | No mutation using an invented record. |
| Ambiguous assignee | Clarification or explicit unresolved result. | No guessed assignment. |
| Unknown operation name | Registry rejection. | No dynamically evaluated generated code. |
| Denied resource access | Permission rejection. | No unauthorized read or write. |
| Stale expected revision | Conflict without applying the proposed change. | No overwrite based on stale state. |
| Malformed tool result | Result-contract failure is retained. | No unsupported success report. |
| Response lost after commit | Reconciliation preserves operation identity. | No replacement mutation merely because of timeout. |
| Duplicate delivery | Same keyed operation remains one intended effect. | No extra effect within the service's deduplication contract. |
| Cancellation races with completion | Report the eventual observed outcome. | No inferred rollback from cancellation acknowledgment. |
| Authorized successful assignment | Required reads, persisted state, and final report agree. | No claim beyond the observed result. |
Deterministic boundary tests inject fixed proposals and failures, then assert allowed transitions and forbidden effects. Property-based testing generates many inputs against an executable predicate—for example, supported values survive serialization round trips. Generating unusual inputs is not itself an oracle, and reproducing a validator's implementation in its test can reproduce the same defect.
Repeated model trials assess different behavior: selection, argument meaning, clarification, and final reporting. Keep structural acceptance separate from task success. Retain refusals, rejections, and unresolved outcomes in the results rather than evaluating only completed successes. A passing deterministic dispatcher test does not establish that the model chooses appropriate actions.
- Investigable failures — Retain the failed gate, violated contract, and reason. Connect call, operation, and attempt identities so an investigator can distinguish regeneration from repeated execution. Observability explains identity across those boundaries.
- Contract changes — Prompt, schema, validator, or tool changes can break downstream assumptions. Re-run boundary tests and relevant model trials together; a newly valid shape can still violate the consumer's substantive requirements.
Open questions
Portable constraint enforcement remains difficult when validators and generation engines support different schema features. Silent omissions can weaken an accepted contract. Progress would be a versioned conformance corpus that exposes unsupported constraints explicitly and tests identical boundary instances across engines.
The effect of grammar constraints on task meaning remains workload-dependent. Locally legal token selection differs from conditioning on complete valid outputs. Progress requires matched evaluations that separate structural acceptance from content correctness while controlling the schema, model, and selection procedure.
Meaning-preserving repair remains harder than satisfying another validator. A correction can remove an error while altering supported facts. Progress would track original evidence, changed fields, and independently judged task correctness across bounded retries, including exhausted cases.
Recovery remains unresolved when a provider offers neither durable duplicate protection nor operation-specific status evidence. A checkpoint cannot determine an unrecorded external effect. Progress requires a receiver contract that resolves late retries, or an explicit unresolved outcome that prevents automatic duplicate submissions.


























































































































































































