ProveCartVerified Agent
Download this spec: Markdown · PDF · Conformity JSON Schema (v0.2): acf-v0.2.schema.json · Profile declaration example: profile-declaration-example.json · Conformance fixtures: fixtures/README.md (8 fixtures + v0.2 projections) · Fixture validator: validate_fixtures.py · Reference consumer: reference-consumer.py · Previous version: ACF v0.1 (archived) · Reference implementation: api.provecart.com

Conformity Corrections for Agent Checkout — ACF v0.2

Agent Correction Format (ACF), version 0.2.0 — DISCUSSION DRAFT.

Status: discussion draft, published for implementer feedback. This is not a request for adoption into any dev.ucp.* namespace, and no adoption or endorsement is implied. The extension described here is self-hosted under its publisher's namespace, as UCP's contributing guide prescribes for vendor extensions.

Publisher of this draft: ProveCart (author and reference implementation). The format is vendor-agnostic in substance: any checker can conform, and nothing in conformance requires the publisher's API, scoreboard, or any credential issuer (Section 14).

License. This document and the JSON Schema may be copied and shared freely, with attribution to ProveCart. The format is free to implement: ProveCart commits that any patent claim it owns or controls that is necessarily infringed by implementing the format as published — an essential claim — is licensed royalty-free to anyone, for the purpose of implementing the format (a RAND-Z style commitment). The commitment is stated in full in Section 16 and identically in Section 13 of ACF v0.1. The commitment covers the format only; it does not license ProveCart's verification service, checker, certification exam, evidence store, or brand, and it does not extend to patent claims that are not essential to implementing the format. (Decided by the publisher 2026-11-04.)

What changed from v0.1. Version 0.1 defined a standalone verdict object with a parallel corrections array. Independent review against the UCP specification showed that UCP checkout already carries the channel this format needs, so v0.2 is reshaped onto UCP's own primitives and its delta is deliberately smaller:

Normative schema: acf-v0.2.schema.json (JSON Schema Draft 2020-12), published alongside this document. Conformance fixtures: fixtures/ in this package. Profile declaration example: profile-declaration-example.json.

The key words MUST, MUST NOT, SHOULD and MAY are to be read as in RFC 2119.


1. Purpose, stated against what already exists

This format does not claim an empty field, and it is written against what the host standards already provide:

What those mechanisms do not carry, and what this extension adds, is narrow: when an independent check compares a built checkout against the buyer's signed instructions and finds a mismatch, the repair guidance is today free text a person can read and a program cannot reliably act on. This extension adds, on top of messages[]:

  1. the expected and actual values, so a repair is a computation, not an interpretation;
  2. a closed action vocabulary, so the class of fix is enumerable and testable;
  3. a retry budget, so the correction loop terminates by rule;
  4. one conformity object on the checkout carrying the verdict and a pointer to a sealed evidence record, so the outcome is auditable after the fact.

Framing, stated plainly: this document is a profile for how a checker reports conformity against an AP2 Intent Mandate. It defines the reporting shape. It does not define the mandate, the comparison, or the checkout.

2. Roles, the emitter, and where the instruction comes from

3. Extension declaration, discovery and negotiation

4. The conformity object

One namespaced object on the checkout, under the single key com.provecart.conformity — nested under one key the way the AP2 extension nests under ap2, so canonicalization and signature-exclusion rules have exactly one place to apply.

Field Meaning
verdict MATCH, REVIEW or BLOCK (Section 6).
record_id Identifier of the sealed evidence record for this check. Also the idempotency anchor: a replayed check of the same checkout under the same instruction reference returns this same record_id; a verdict is never silently re-issued as a new record.
verdict_token Short-lived signed token binding the verdict to its record. Single-use and hold-bound: it authorizes at most one downstream action (one payment capture, one ticket issuance) against exactly this record, verified against the hold record itself, never against values supplied in the request. Required when the object is presented to authorize a downstream action.
evidence_url Where the sealed record can be retrieved by an authorized party. Retrieval is access-controlled; public exports are redacted (Section 10).
mandate_ref Reference to the buyer's signed instructions: an identifier and scheme, and a digest of the exact instruction artifact checked. Never the instructions themselves.
subject_digest Canonical digest of the checkout as checked. With mandate_ref.digest it binds the verdict to exactly one checkout state and one instruction version; any change to either requires a new check.
issued_at / expires_at The verdict's validity window. After expires_at the verdict MUST NOT be acted on; a stale verdict presented downstream MUST be refused and the checkout re-checked.
previous_record_id The record this submission supersedes, on a corrected resubmission (Section 7).
max_attempts The retry budget for the correction loop (reference value 3).

Replay rule: a verdict is a statement about one digest pair. A checkout that differs from subject_digest, an instruction that differs from mandate_ref.digest, or a time after expires_at makes the verdict void, not merely stale — the remedy is a new check, and the new check seals a new record linked by previous_record_id where it is a resubmission.

5. Messages: the code vocabulary and the extension fields

5.1 Shape

Each failing dimension produces one entry in the checkout's messages[], in the host's own shape — type, code, severity, path (JSONPath into the checkout object), content — with the extension's additions carried as extra fields on that same entry:

Field Source Meaning
code extension From the vocabulary in 5.2: com.provecart.conformity.<failure_code>, one code per failing dimension.
expected extension The value the instruction requires. Subject to the disclosure rules of Section 10.
actual extension The value found in the checkout as built. Same disclosure rules.
action extension The fix to perform, from the closed vocabulary in 5.4.
uncertain extension true when the checker could not positively determine conformity (an indeterminate determination); false when the violation is positively established.
requires_buyer_approval extension true when no repair within the buyer's existing authorization is available. Section 8 governs. The host severity for such a message is requires_buyer_review in any case; this flag states the same rule per correction.

content remains the human-readable rendering of the same structured values; where the two disagree, the structured fields govern and the disagreement is a defect in the emitter.

5.2 Code vocabulary (initial set)

One code per failing dimension, drawn from the reference implementation's result codes, lowercased under the namespace:

price_over_ceiling, price_below_floor, quantity_over_max, quantity_below_min, item_mismatch, item_indeterminate, item_excluded, variant_mismatch, currency_mismatch, merchant_excluded, date_mismatch, date_outside_window, time_outside_tolerance, party_size_mismatch, name_mismatch, cabin_mismatch, fare_terms_mismatch, deposit_over_limit, cancellation_terms_mismatch, mandate_expired, mandate_signature_invalid, standing_budget_exceeded, engine_error.

The vocabulary is versioned with the extension. New codes are added by minor version; a code's meaning never changes within the vocabulary.

5.3 Unknown codes and actions

A consumer that meets a code it does not recognize, or an action outside the vocabulary it implements, MUST NOT auto-apply the entry, MUST NOT guess its meaning, and MUST NOT treat it as a pass. The conformity object governs the outcome; the unknown entry escalates to the buyer. Fixture f08 in this package pins this behavior.

5.4 Action vocabulary (closed)

Carts: remove_item, replace_item, change_variant, reduce_quantity, reduce_total, change_currency. Bookings: correct_traveler_name, change_airport, change_travel_date, change_departure_time, add_itinerary, rebuild_itinerary, change_cabin, change_fare_terms, add_hotel_stay, change_room, reduce_total, change_currency. Reservations: change_provider, change_location, change_date, change_time, change_party_size, correct_reservation_name, reduce_deposit, reduce_total, change_cancellation_terms.

5.5 Non-correctable failures

Some failures have no repair by editing the checkout, and a conforming checker MUST NOT emit an action for them: an expired or invalidly-signed mandate, an excluded merchant, a standing budget or standing instruction that itself forbids the purchase, and a checker engine error. Their messages carry severity unrecoverable (or requires_buyer_review where a fresh buyer decision is the remedy), and the outcome escalates. A checker engine error fails safe to REVIEW and is itself sealed in the evidence record; an error is never a pass.

6. Verdict semantics and the mapping to the host lifecycle

The verdict is the checker's summary; the host status is what the platform acts on. They correspond as follows (this table is the normative mapping):

Checker verdict Host checkout state Platform action
MATCH status ready_for_complete, no conformity-coded messages Complete the checkout
BLOCK, with a fix status incomplete + message(s), severity recoverable, with path Modify inputs per the extension fields, resubmit as a new check
REVIEW status requires_escalation + message(s), severity requires_buyer_review Hand off to the buyer (via continue_url); capture MUST NOT proceed
Non-correctable failure message(s), severity unrecoverable New inputs, a new instruction, or hand off; no edit of this checkout repairs it

Rules that bind the mapping:

7. The retry contract

Status note (updated 2026-11-04): the security verification this section awaited is closed. An independent code audit had flagged that previous_record_id must be validated for ownership and mandate binding; the reference implementation now validates the link at intake (the prior record must exist, belong to the same API key and the same mandate, and still head its attempt chain), enforces the retry budget of 3 attempts per chain rather than merely advertising it, and refuses capture against superseded verdicts. The attack battery (foreign record, cross-mandate record, fabricated record id, over-budget chain, superseded-token capture) passes against the production code, which was deployed and hash-verified on 2026-11-04.

  1. A resubmission after repair is a new check: a new checkout state, a new subject_digest, a new sealed record, carrying previous_record_id so the attempt chain is auditable. Earlier records are never rewritten.
  2. The chain keeps the same instruction reference. A resubmission under different instructions is not a retry; it is a new purchase decision.
  3. max_attempts bounds the loop (reference value 3). Exhausting it is not a verdict: the agent stops, and the matter goes to the buyer or the merchant. A conforming consumer MUST NOT loop past the budget, and a conforming checker MUST NOT raise it silently mid-chain.
  4. Only repairs within the buyer's existing authorization are applied automatically (Section 8).

8. Buyer approval and reauthorization

A repair is auto-applicable only when it brings the checkout into conformity with the authorization the buyer already gave: a lower total toward the authorized ceiling, the authorized date, the authorized item. A fix that would change the price, the terms, the traveler's or recipient's identity, the destination, or the scope of what the buyer authorized is never a correction — it is a new decision. For such a fix:

9. Determinism

The verdict on a given checkout and a given instruction reference is a function of the two artifacts, not of a model's discretion:

10. Privacy and disclosure

A checker necessarily sees the checkout and the instruction it is checked against. The format constrains what travels and what is published:

11. Evidence

Every check produces a sealed evidence record before its verdict is relied on: the instruction reference and digest, the checkout digest, the per-dimension outcomes, the corrections offered, the verdict, the token issued, and the attempt-chain link. Records are hash-chained in the reference implementation so later tampering with an earlier record is detectable, and export as dispute bundles. What hash chaining does and does not establish is stated without embellishment in Section 13.

12. Conformance

Emitter (checker side). A conforming emitter produces the conformity object and messages per Sections 4–6, binds them per Section 4, applies the consent rule of Section 8 and the determinism rule of Section 9, seals every check per Section 11, and redacts per Section 10.

Consumer (platform/agent side). A conforming consumer acts on the host status per Section 6, applies only in-authorization repairs, escalates on requires_buyer_review and on unknown codes or actions (Section 5.3), honors the retry budget (Section 7), and refuses expired verdicts (Section 4).

Fixtures and harness. This package includes eight fixtures (fixtures/, with a README): seven generated from the reference implementation's production code paths — a clean MATCH, BLOCKs with repairs across a cart, a booking and a reservation, a REVIEW on an indeterminate item, a corrected resubmission that then matches, and a BLOCK on a non-correctable dimension — plus one hand-authored fixture pinning unknown-code consumer behavior. validate_fixtures.py checks the v0.1 invariants on each capture and validates the v0.2 projection of each against acf-v0.2.schema.json; third parties run it with the Python standard library plus jsonschema. The reference implementation's own public test batteries (cart, booking and reservation suites) are linked from the fixtures README. A reference consumer sample — a small platform-side script that acts on the conformity object against the reference API — ships in this package as reference-consumer.py.

Second implementations. Conformance is defined by this document, the schema and the fixtures. An implementer needs nothing from the publisher: no API account, no scoreboard entry, no credential.

13. Known limitations — what this does not claim

14. Governance and neutrality

15. Versioning

This document is ACF 0.2.0. It supersedes v0.1 as the discussion draft; v0.1 remains the emitted format of the reference implementation until a v0.2 emitter ships, and both documents stay published so the delta is inspectable. Pre-1.0, minor versions may reshape fields; the code and action vocabularies only grow within a major line, and a code or action, once published, never changes meaning.

16. Licensing

This specification text and the JSON Schema may be copied and shared freely, with attribution to ProveCart. The format is free to implement: ProveCart commits that any patent claim it owns or controls that is necessarily infringed by implementing the format as published — an essential claim — is licensed royalty-free to anyone, for the purpose of implementing the format (a RAND-Z style commitment). The commitment was decided by the founder on 2026-11-04 and is stated identically in Section 13 of ACF v0.1. No implementer needs ProveCart's permission, account, or service to conform. The commitment covers the format only — the conformity object, the message code vocabulary, the extension fields, and the retry and consent rules defined here; it does not license ProveCart's verification service, checker, certification exam, evidence store, or brand, and it does not extend to patent claims that are not essential to implementing the format.


Version stamp Conformity Corrections for Agent Checkout (Agent Correction Format, ACF) · Version 0.2.0 · Status: discussion draft — current · Published 2026-11-05 · Editor: ProveCart · Canonical page: https://provecart.com/standards/correction-format · JSON Schema: https://provecart.com/standards/acf-v0.2.schema.json · Superseded discussion draft: v0.1, archived at https://provecart.com/standards/correction-format-v0.1 · Reference implementation: the ProveCart verification API (https://api.provecart.com), live (emits v0.1 today) · Implementations known: 1 (the reference implementation).

Changelog