Network Working Group F. H. D. Milan Internet-Draft 15 October 2026 Intended status: Experimental Expires: 18 April 2027 Agent Decision Commitments for Payments draft-milan-agent-decision-commitment-00 Abstract Software agents increasingly select and initiate payments on behalf of people and organizations. Existing agent payment protocols record what a principal authorized and that value moved, but not what information the agent relied on when it chose. This document defines the Agent Decision Commitment (ADC): a salted hash commitment to a decision record that identifies the content the agent provided to the model interface (after any agent-side transformation), the model calls made, and the resulting answer and action. The commitment is carried as a single selectively disclosable claim in an existing payment mandate or payment payload and is, by default, registered with a transparency service before the payment is authorized. The decision record and its content remain with the holder and are disclosed only to dispute participants, who can verify them against the mandate and the transparency service and can inspect the content the agent provided to the model. This document defines the data model, the commitment and anchoring procedures, a disclosure and verification procedure that reports attestation levels rather than verdicts, and bindings to three agent payment protocols and to account-to-account credit transfers. It also defines a witnessed reciprocal exchange by which two parties' agents evidence what passed between them: the receiver signs over the committed bytes, independent witnesses fix the time of each step, a failure to answer by a deadline is recorded, and arbiters resolve stalled exchanges. About This Document This note is to be removed before publishing as an RFC. This document is an individual submission. Discussion is invited on the DISPATCH mailing list (dispatch@ietf.org), and on the SCITT (scitt@ietf.org) and OAuth (oauth@ietf.org) working group lists, since this document uses the SCITT architecture [RFC9943] and SD-JWT [RFC9901]. Milan Expires 18 April 2027 [Page 1] Internet-Draft Agent Decision Commitments October 2026 Status of This Memo This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet- Drafts is at https://datatracker.ietf.org/drafts/current/. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." This Internet-Draft will expire on 18 April 2027. Copyright Notice Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/ license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License. Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2. Liability Neutrality . . . . . . . . . . . . . . . . . . 5 1.3. What ADC Does Not Establish . . . . . . . . . . . . . . . 5 1.4. Requirements Language . . . . . . . . . . . . . . . . . . 5 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 5 3. Roles and Responsibilities . . . . . . . . . . . . . . . . . 7 4. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5. Data Model . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.1. Conventions . . . . . . . . . . . . . . . . . . . . . . . 8 5.2. Context Items and the Context Receipt . . . . . . . . . . 9 5.3. Decision Record . . . . . . . . . . . . . . . . . . . . . 11 5.4. Commitment and Decision Context Claim . . . . . . . . . . 12 5.5. Holder Chain and Anchoring . . . . . . . . . . . . . . . 12 5.6. Outcome and Erasure Entries . . . . . . . . . . . . . . . 14 Milan Expires 18 April 2027 [Page 2] Internet-Draft Agent Decision Commitments October 2026 5.7. CDDL . . . . . . . . . . . . . . . . . . . . . . . . . . 15 6. Disclosure and Verification . . . . . . . . . . . . . . . . . 19 6.1. Disclosure Request . . . . . . . . . . . . . . . . . . . 19 6.2. Release . . . . . . . . . . . . . . . . . . . . . . . . . 19 6.3. Transfer Confidentiality . . . . . . . . . . . . . . . . 20 6.4. Verification Procedure . . . . . . . . . . . . . . . . . 20 6.5. Attestation Levels . . . . . . . . . . . . . . . . . . . 21 6.6. Errors . . . . . . . . . . . . . . . . . . . . . . . . . 22 6.7. Verification Reports and Their Audit . . . . . . . . . . 23 7. Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . 23 7.1. Verifiable Intent . . . . . . . . . . . . . . . . . . . . 23 7.2. Agent Payments Protocol . . . . . . . . . . . . . . . . . 24 7.3. x402 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 7.4. Account-to-Account Credit Transfers . . . . . . . . . . . 25 7.5. Card Authorization Messages . . . . . . . . . . . . . . . 25 8. Witnessed Reciprocal Exchange . . . . . . . . . . . . . . . . 25 8.1. Common Rules . . . . . . . . . . . . . . . . . . . . . . 26 8.2. Objects . . . . . . . . . . . . . . . . . . . . . . . . . 26 8.3. Witnesses . . . . . . . . . . . . . . . . . . . . . . . . 29 8.4. State Machine . . . . . . . . . . . . . . . . . . . . . . 30 8.5. Arbiters . . . . . . . . . . . . . . . . . . . . . . . . 32 8.6. Binding to Decision Records . . . . . . . . . . . . . . . 33 8.7. Security and Privacy of the Exchange . . . . . . . . . . 33 9. Related Work . . . . . . . . . . . . . . . . . . . . . . . . 34 10. Security Considerations . . . . . . . . . . . . . . . . . . . 35 10.1. Trust Assumptions . . . . . . . . . . . . . . . . . . . 35 10.2. Threats and Mitigations . . . . . . . . . . . . . . . . 36 10.3. Replay and Attribution . . . . . . . . . . . . . . . . . 39 10.4. Cryptographic Considerations . . . . . . . . . . . . . . 39 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . 39 12. Operational Considerations . . . . . . . . . . . . . . . . . 41 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 41 13.1. JSON Web Token Claims Registration . . . . . . . . . . . 41 13.2. Media Type Registrations . . . . . . . . . . . . . . . . 42 14. Implementation Status . . . . . . . . . . . . . . . . . . . . 43 15. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 15.1. Normative References . . . . . . . . . . . . . . . . . . 43 15.2. Informative References . . . . . . . . . . . . . . . . . 45 Appendix A. Test Vectors . . . . . . . . . . . . . . . . . . . . 51 Appendix B. Example Mapping to Dispute Evidence . . . . . . . . 55 Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 56 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 56 Milan Expires 18 April 2027 [Page 3] Internet-Draft Agent Decision Commitments October 2026 1. Introduction Payment agents increasingly choose rather than merely execute: which bill to pay, which merchant to buy from, whether a request is legitimate. Mandate formats such as Verifiable Intent [VI] and the Agent Payments Protocol [AP2] bind a principal's authorization to an agent key. Merchant-signed checkout objects record what was bought, and payment receipts and settlement record that value moved. None of these records what the agent relied on when it chose. That question matters in two recurring situations. The first is the authorized but wrong purchase: a payment that satisfies the principal's signed constraints but results from a misread invoice or a fraudulent payee that fits the budget. The second is the manipulated agent: content the agent read, including text embedded in images, has been shown to redirect deployed agents [TOB] [BRAVE]. Media is a particular problem because model providers may resize images or sample video frames before the model sees them, and an attack can be constructed to appear only after such resampling [TOB]. A log of original files is therefore not a record of what the model received. This document records the bytes the agent sent to the model interface; transformations applied by a provider after receipt are visible only through provider attestation (Section 6.5). This document defines a minimal mechanism. The holder of the agent's records computes a decision record that identifies, by salted digests, every item provided to the deciding model, together with the model calls, the answer and the action. The holder commits to the record with a salted hash, places the commitment in the payment mandate or payload, and, by default, registers it with a transparency service [RFC9943] before the payment is authorized. In a dispute, the holder discloses the record, the salts and the content to authorized verifiers, who check them against the mandate and the transparency service. Where the agent's decision depends on what a counterparty sent, or a counterparty is to acknowledge what the agent sent, the two parties use the witnessed reciprocal exchange (Section 8), so that what passed between them is evidenced as well. 1.1. Scope This document specifies the decision record, the context receipt, the commitment, the holder chain and anchoring, outcome and erasure entries, disclosure and verification, bindings, and the witnessed reciprocal exchange between parties. It does not specify how an agent decides, how content is selected for a model, how dispute participants are credentialed, or what consequence follows from a verification result. Milan Expires 18 April 2027 [Page 4] Internet-Draft Agent Decision Commitments October 2026 1.2. Liability Neutrality ADC produces evidence. It does not allocate liability among principals, holders, merchants, issuers, acquirers, networks, or model providers, and it does not define the consequence of a missing, withheld, or failed record. Those consequences are matters for the applicable scheme rules, contracts, and law. Verifiers report the attestation level and step results defined in Section 6.5, not a verdict. 1.3. What ADC Does Not Establish ADC establishes the integrity and timing of evidence, not its truth. It does not establish that recorded inputs were authentic or accurate, that the model's answer was correct, that the action reflected the principal's intent beyond what the mandate states, which item caused an outcome, that the context receipt is complete, or that the holder recorded honestly at decision time. ADC imports no facts about the world and therefore relies on no external oracle; facts enter only as recorded content whose stated origin a verifier can assess. Every verification step is a finite computation over released data (hash recomputation, signature verification, and comparison) and terminates. ADC does not evaluate properties of the agent's program or behavior. 1.4. Requirements Language The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. 2. Terminology Agent Decision Commitment (ADC): The mechanism defined in this document, comprising the decision record, context receipt, commitment, anchoring, and disclosure procedures. Agent: Software that selects and initiates a payment on behalf of a principal. Principal: The person or organization on whose behalf the agent acts. Holder: The party that stores decision records and context and responds to disclosure requests; typically the operator of the agent. Milan Expires 18 April 2027 [Page 5] Internet-Draft Agent Decision Commitments October 2026 Verifier: A dispute participant (for example an issuer, acquirer, merchant, network, or arbiter) that checks a disclosed record. Context item: One byte sequence provided to a model for a decision, after all agent-side transformation (rendering, resizing, frame sampling, optical character recognition, transcription), or the original from which such an item was derived. Item descriptor: A JSON object that identifies a context item by content digest and describes its media type, role, origin, and any transformation. Context receipt: A JSON object listing the salted digests of all item descriptors for one decision. Not to be confused with a mandate receipt or a transparency receipt. Decision record: A JSON object binding a context receipt, the question asked, the model calls, the answer, the action, and the transaction. Commitment: The salted hash of a decision record defined in Section 5.4. Decision context claim: The JSON object carrying a commitment inside a mandate or payment payload, registered as the JWT claim "decision_context". Mandate receipt: A receipt defined by a payment protocol, such as the AP2 Checkout Receipt. Transparency service, signed statement: As defined in [RFC9943]. Transparency receipt: A Receipt as defined in [RFC9943], called "transparency receipt" here to distinguish it from mandate receipts and context receipts. Exchange: The witnessed reciprocal exchange of a payload between a sender and a recipient defined in Section 8. Witness: A service, independent of the parties, that countersigns the hash of an exchange object with its own time (Section 8.3). Arbiter: One of the parties named in an offer that hold shares of the exchange key and resolve stalled exchanges (Section 8.5). Not to be confused with a dispute arbiter acting as verifier. Rail: The payment protocol or scheme that carries the payment. Milan Expires 18 April 2027 [Page 6] Internet-Draft Agent Decision Commitments October 2026 Covered decision: A decision of a type that the holder's profile designates as subject to this document. Profile: A set of choices made by a community of holders and verifiers (for example a payment scheme or a dispute program): the decision types covered, the transparency services and their trust anchors, the maximum anchoring interval, the credentials accepted for disclosure requests, the request and release transport, retention periods, and the attestation levels accepted for each purpose. A claim or record identifies its profile by URI in the "profile" member. Abbreviations: JCS, JSON Canonicalization Scheme [RFC8785]; NFC, Unicode Normalization Form C [UAX15]; SD-JWT, Selective Disclosure for JWTs [RFC9901]; CDDL, Concise Data Definition Language [RFC8610]. 3. Roles and Responsibilities +==============+===================================================+ | Role | Responsibilities in this document | +==============+===================================================+ | Holder | Records context items, computes receipts, records | | | and commitments, maintains the holder chain, | | | registers anchor and entry statements, stores | | | content for the retention period, authenticates | | | disclosure requests, releases evidence under the | | | principal's authorization policy. | +--------------+---------------------------------------------------+ | Agent | Places the decision context claim in the mandate | | | or payload it signs or submits. | +--------------+---------------------------------------------------+ | Principal | Sets the authorization policy that governs | | | disclosure; may access its own records. | +--------------+---------------------------------------------------+ | Transparency | Registers signed statements and issues | | service | transparency receipts that bound when a | | | commitment existed. | +--------------+---------------------------------------------------+ | Model | Optionally attests to model calls (Section 6.5, | | provider | level A3). | +--------------+---------------------------------------------------+ | Verifier | Requests disclosure under a credential accepted | | | by the holder's profile, runs the procedure in | | | Section 6.4, and reports results. | +--------------+---------------------------------------------------+ | Counterparty | In an exchange, signs held, key_received, | | | received, mismatch, accepted, or refused over | | | exactly the committed bytes (Section 8). | Milan Expires 18 April 2027 [Page 7] Internet-Draft Agent Decision Commitments October 2026 +--------------+---------------------------------------------------+ | Witness | Countersigns exchange object hashes with its own | | | time; sees hashes only. | +--------------+---------------------------------------------------+ | Arbiter | Holds an escrowed share of an exchange key and | | | delivers the key when an exchange stalls; never | | | acknowledges or accepts on the recipient's | | | behalf. | +--------------+---------------------------------------------------+ | Merchant, | Carry and present the mandate according to the | | issuer, | rail's own rules; no new obligations are defined | | acquirer, | for them. | | network | | +--------------+---------------------------------------------------+ Table 1: Roles 4. Overview Holder/Agent Transparency Rail / Merchant | Service | 1. record items, compute | | receipt, record, | | commitment C | | 2. register anchor(C) ------>| | |<-- transparency receipt | 3. mandate/payload carrying decision_context(C) -->| | | | ... later, a dispute ... | | | | Verifier | |<-------- 4. disclosure request (credential) | 5. release record, salts, | | receipt, items ---------------------------------> 6. verify: | | mandate, C, |<---------------------- inclusion/time check - receipt, | | items, level Figure 1: Issuance and Dispute 5. Data Model 5.1. Conventions * All objects are JSON [RFC8259]. Before hashing, every string member name and value MUST be normalized to NFC [UAX15], and the object MUST be serialized with JCS [RFC8785]. The result is denoted CANON(object). Milan Expires 18 April 2027 [Page 8] Internet-Draft Agent Decision Commitments October 2026 * Digests are SHA-256 [SHS] unless the object's "alg" member states otherwise, and are encoded as base64url without padding [RFC4648]. DIGEST(x) denotes BASE64URL(SHA-256(x)), where x is CANON(x) when x is a JSON value and the octets themselves otherwise. Verifiers MUST reject objects whose "alg" value they do not support. * Every salt defined by this document is exactly 32 octets from a cryptographically secure random number generator, fresh for each use. (SD-JWT disclosure salts are governed by [RFC9901].) The fixed length makes the concatenation salt || CANON(object) unambiguous. * Timestamps are strings in the format of [RFC3339] with a "Z" offset. * Each top-level object (receipt, record, statement payload, release) carries "type" and "v"; the decision context claim carries "v"; nested objects carry neither. This document defines version 1. A verifier that does not support a version MUST report the object as unsupported. * Unknown members MUST be included when an object is canonicalized and hashed, and MUST be ignored when interpreting it. An object that contains duplicate member names, before or after NFC normalization, MUST be rejected. * Amounts are strings containing a non-negative decimal integer in the smallest unit of the asset on the rail (minor units for fiat currencies, base units for tokens), so that large values survive JCS. * Numbers are canonicalized by JCS, which can change their textual form. Where the exact bytes returned by a model provider matter, they are recorded as a context item with role "response" (Section 5.2). 5.2. Context Items and the Context Receipt For each context item i, in the order in which items were provided to the model, the holder constructs an item descriptor D_i and a fresh salt s_i, and computes the item digest: item_digest_i = BASE64URL(SHA-256(s_i || CANON(D_i))) An item descriptor has the following members: content_digest (REQUIRED): BASE64URL(SHA-256(item bytes)). Milan Expires 18 April 2027 [Page 9] Internet-Draft Agent Decision Commitments October 2026 media_type (REQUIRED): The media type of the item bytes. role (REQUIRED): One of "instructions", "tool_definition", "prior_turn", "as_sent", "original", "request", "response", "exchange", "witness", or an extension value in the form of a URI. Role "request" denotes the complete request body as sent to the provider. Roles "exchange" and "witness" denote an exchange object body and a witness statement (Section 8.6). calls (REQUIRED): The array of zero-based indexes, into the record's "models" array, of the model calls to which the item was input or, for role "response", from which it was returned; empty for an item with role "original". derived_from (OPTIONAL): The zero-based index of the item from which this item was derived. transform (OPTIONAL): A string identifying the transformation and the implementation and version that performed it. source (REQUIRED): An object with "kind" and, where applicable, "uri" and "fetched_at". The holder MUST list every input to every model call covered by the decision, including instructions, tool definitions, prior turns, retrieved content, and media, and MUST include the raw provider response for each call with role "response". Where the agent transformed an item, the item as provided to the model has role "as_sent" and a "derived_from" member giving the index of its source item. The source item SHOULD also be listed; it has role "original" if it was not itself provided to the model, and role "as_sent" otherwise. Agents SHOULD perform media transformations themselves and stay within provider limits, so that the bytes recorded are the bytes the model received. The context receipt is: type, v, alg (REQUIRED): "adc-receipt", 1, and the digest algorithm. items (REQUIRED): The non-empty array of item digests, in model- input order. item_count (REQUIRED): The number of items, at least 1. retention_until (REQUIRED): The time until which the holder commits to retain the descriptors, salts, and items (Section 12). selector (OPTIONAL): An object naming the component that selected Milan Expires 18 April 2027 [Page 10] Internet-Draft Agent Decision Commitments October 2026 the items and a digest of its configuration. receipt_digest = BASE64URL(SHA-256(CANON(receipt))). Because each descriptor is hidden behind its own salt, the receipt reveals neither the content digests nor the origins of the items, and a descriptor and its salt can later be deleted without changing receipt_digest (Section 5.6). 5.3. Decision Record type, v, alg (REQUIRED): "adc-record", 1, and the digest algorithm. chain (REQUIRED): An object with "id", an opaque identifier of the holder chain that is independent of any signing key; "seq", this record's sequence number in the chain; and "prev", the commitment of the record with sequence number seq - 1, or 32 zero octets encoded in base64url for the first record of a chain (Section 5.5). receipt_digest (REQUIRED): As defined in Section 5.2. question (REQUIRED): An object with "name", "kind" (for example "choice", "score", "probability", or "freeform"), and "schema_digest", DIGEST of the question definition (a JSON object). profile (OPTIONAL): The URI of the profile under which the record was made. models (REQUIRED): An array with one entry per model call, each with "provider", "id" (a resolved model version, not an alias), "request_id", "request_digest" (DIGEST of the request body as sent to the provider), and optionally "params_digest" (digest of the decoding parameters, if the interface exposes them) and "attestation", a provider-issued attestation over the request and response, for example an Attested Inference Receipt [I-D.tsyrulnikov-rats-attested-inference-receipt], encoded as the base64url encoding of the attestation token (Section 6.5). answer (REQUIRED): The model output, as a JSON object. action (REQUIRED): An object with "taken", the action decided: "pay", "decline", or an extension value in the form of a URI. It MUST NOT reference the mandate, which does not yet exist when the record is committed. transaction (REQUIRED when the action initiates a payment): An Milan Expires 18 April 2027 [Page 11] Internet-Draft Agent Decision Commitments October 2026 object with "rail", "payee", "amount", "currency", and, where the rail defines one, "checkout_digest", each encoded and compared as defined for the rail in Section 7. "currency" is an ISO 4217 [ISO4217] code for fiat currencies and a CAIP-19 asset identifier [CAIP19] for tokens. issued_at (REQUIRED): The time the record was completed. One decision record MUST correspond to at most one transaction. Outcomes and erasures are not part of the record; they are separate entries (Section 5.6). 5.4. Commitment and Decision Context Claim C = BASE64URL(SHA-256(salt || CANON(record))) The decision context claim is: {"v":1,"alg":"sha-256","commitment":"","receipt_uri":"", "profile":""} "receipt_uri" is an https URI at which disclosure requests for this record are made; its path is an opaque value chosen by the holder. It MUST NOT embed content, digests, or identifiers that link the principal across transactions. "profile" (OPTIONAL) identifies the profile; if it is absent, the verifier obtains the applicable profile out of band, and without one reports no level above A1. Rails that cannot carry the claim object carry only C, as defined in Section 7. In JWT-based mandates, the claim is carried as an ordinary SD-JWT disclosure [RFC9901]: it is not canonicalized, its member order is whatever the issuer serialized, and its digest is computed over the base64url-encoded disclosure string as RFC 9901 specifies. Verifiers MUST use the received disclosure string and MUST NOT re-serialize the claim. On rails that are not JWT-based, the claim is carried as a plain JSON object or reduced to C, as defined in Section 7. The commitment salt is distinct from any SD-JWT disclosure salt and is released only under Section 6. 5.5. Holder Chain and Anchoring The holder MUST create a decision record for every covered decision, including decisions whose action is "decline", and MUST assign consecutive sequence numbers per chain. The "prev" member links each record to its predecessor, so that a missing record appears as a gap. Hash chains are common in audit-log designs (Section 9); the chain here is kept per chain id, independent of signing keys, and covers declined decisions, so that a verifier can detect a withheld decision, not only a withheld payment. Milan Expires 18 April 2027 [Page 12] Internet-Draft Agent Decision Commitments October 2026 A chain is not tied to a signing key. The key that signs a chain's first anchor is the chain's initial key. To rotate, the holder registers a rotation statement of type "adc-rotation", signed with the current key, that names the chain and the successor key; statements signed with the successor key then continue the same chain id and sequence. Verifiers MUST consider only statements whose signing key is the chain's initial key or a successor established by such rotation statements; statements by any other issuer that use the same "sub" are ignored. The holder MUST NOT start a new chain to replace an existing one except under the profile's rules, and a new chain's first anchor MUST be reported to verifiers on request. A deletion at the tail of a chain, after the last anchor a verifier sees, is not detectable by the chain alone. Unless the profile permits late registration, the holder MUST register an anchor statement with at least one transparency service [RFC9943] before the mandate or payment payload that carries the claim is signed. The anchor is a Signed Statement as defined in [RFC9943]: a COSE_Sign1 message [RFC9052] whose protected header carries a "kid" identifying the signing key (unless "x5t" or "x5chain" is present) and CWT claims [RFC8392] with "iss" identifying the holder and "sub" set to the chain id, and whose payload, of content type application/adc-anchor+json, is: {"type":"adc-anchor","v":1,"commitment":"","chain":"", "seq":,"prev":"","issued_at":"