<?xml version="1.0" encoding="UTF-8"?>
<rfc category="info" docName="draft-xg-payment-dispute-profile-00"
     ipr="trust200902" submissionType="IETF" xml:lang="en"
     version="3">

  <front>
    <title abbrev="Payment-Dispute Receipt Profile">
      Card-Scheme Dispute Evidence Profile of Signed Decision Receipts
    </title>

    <author fullname="Xavier Goshi" initials="X." surname="Goshi">
      <organization>ActaSeal</organization>
      <address>
        <postal>
          <country>India</country>
        </postal>
        <email>chatftx@gmail.com</email>
      </address>
    </author>

    <date year="2026" month="October" day="12"/>

    <area>General</area>
    <workgroup>Independent Submission</workgroup>

    <keyword>signed receipts</keyword>
    <keyword>payment disputes</keyword>
    <keyword>JCS</keyword>
    <keyword>agentic commerce</keyword>

    <abstract>
      <t>
        This document profiles draft-farley-acta-signed-receipts, "Signed
        Decision Receipts for Machine-to-Machine Access Control", for use
        as card-scheme dispute evidence. It defines how a conforming decision
        receipt is populated for payment disputes, and specifies four
        additional evidence layers bound to that receipt: card-scheme
        dispute-evidence categories (Visa Compelling Evidence 3.0,
        Mastercard First-Party Trust), agent-native anchors with no
        scheme-defined slot, a settlement anchor recording what money
        actually moved, and an evidentiary-custody wrapper aligned with
        U.S. Federal Rules of Evidence 901/902. This is a vendor profile
        documenting one implementation (ActaSeal's DisputeEvidencePacket);
        it does not define a new protocol and makes no claim of IETF
        consensus or standardization.
      </t>
    </abstract>
  </front>

  <middle>

    <section anchor="status" title="Status of This Memo">
      <t>
        This document is a vendor implementation profile, submitted as an
        Independent Submission. It is not a product of an IETF working
        group and does not represent IETF consensus.
      </t>
      <t>
        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 <xref target="RFC2119"/> when, and only when,
        they appear in all capitals, as shown here.
      </t>
      <t>
        These key words bind only conformance to this profile as
        implemented by ActaSeal's DisputeEvidencePacket -- they do not
        bind any other implementation of the base draft.
      </t>
    </section>

    <section anchor="intro" title="Introduction">
      <t>
        <xref target="FARLEY"/> defines a portable, cryptographically
        signed receipt for machine-to-machine access-control decisions:
        Ed25519 (<xref target="RFC8032"/>) over an <xref target="RFC8785"/>
        (JCS) canonicalized payload, in an envelope of the form
        <tt>{payload, signature{alg, kid, sig}}</tt>,
        with namespaced <tt>type</tt> values as the
        extension mechanism, verifiable offline with keys resolved out of
        band.
      </t>
      <t>
        Agent payment disputes need more than the decision receipt itself.
        Card-scheme representment (Visa Compelling Evidence 3.0,
        Mastercard First-Party Trust) asks for specific evidence
        categories; adjudication turns on whether the agent exceeded its
        delegated scope; the money that actually moved must be anchored to
        an independent artifact; and a court asks who captured the
        evidence, when, and how (<xref target="FRE901"/>,
        <xref target="FRE902"/>). This profile binds those four layers to
        the base receipt.
      </t>
    </section>

    <section anchor="receipt-profile" title="Receipt Profile">
      <t>
        A conforming dispute receipt is a base-draft receipt with:
      </t>
      <ul>
        <li>
          <tt>type</tt>:
          <tt>actaseal:policy_decision</tt> (namespaced
          per the base draft's extension mechanism).
        </li>
        <li>
          Payload: the implementation's <tt>PolicyDecisionReceipt</tt>
          canonical dict -- decision, reason_code, action_hash,
          evidence_set_hash, ledger_entry_hash, timestamp, mandate_hash,
          rail_anchors_hash, scope_conformance, key_id,
          signer_pubkey_hash.
        </li>
        <li>
          Signature: Ed25519, lowercase hex, per the base draft
          (<tt>alg</tt> = EdDSA).
        </li>
        <li>
          Keys MUST be resolved out of band (the packet manifest carries
          <tt>receipt_public_key_hex</tt>; verifiers
          decide whether to trust it -- the base draft's rule that the
          envelope itself cannot authenticate its own key applies
          unchanged).
        </li>
      </ul>
      <t>
        Conformance, verified: the reference implementation ships two
        canonicalizers. The v2 canonicalizer is full RFC 8785 JCS --
        ECMAScript Number::toString formatting and UTF-16 code-unit key
        ordering per <xref target="RFC8785"/> section 3.2, checked against
        the RFC's own Appendix / cyberphone json-canonicalization test
        vectors (French, structures, values, weird). The v1 canonicalizer
        -- unchanged, and what every already-signed receipt was hashed and
        signed with -- sorts keys by codepoint rather than UTF-16 code
        unit and defers number formatting to the host language's default
        JSON serializer. Both diverge from JCS only outside this payload's
        value domain (no receipt field is a non-decimal number or a
        non-BMP key), and produce byte-identical output to v2 for every
        field this profile actually emits: the receipt dict is strings,
        null, and nested objects/arrays of the same, with amounts
        pre-converted to decimal strings before canonicalization. Interop
        claims for this profile's receipt payload MAY say "JCS"
        (<xref target="RFC8785"/>) without qualification; a general-purpose
        caller outside this value domain SHOULD use the JCS-conformant
        canonicalizer explicitly rather than assume the legacy path is
        conformant for arbitrary input.
      </t>
    </section>

    <section anchor="evidence-layers" title="Evidence Layers Bound to the Receipt">

      <section anchor="ce3" title="CE 3.0 / First-Party Trust Categories">
        <t>
          The reference implementation's CE 3.0 view emits the three
          scheme categories -- device identity, delivery information,
          additional identity factor -- each populated only from fields
          the packet actually holds. At the time of writing the packet
          genuinely holds one identity data point (the actor login
          identifier confirmed by an ActorValidated ledger event); device
          identity and delivery information are emitted unpopulated with
          explicit gap notes. A missing dispute reason code MUST cause the
          mapper to raise rather than pass silently. The mapper MUST NOT
          invent evidence.
        </t>
      </section>

      <section anchor="agent-anchors" title="Agent Anchors">
        <t>
          Agent-native facts with no scheme-defined slot ride in a
          distinct <tt>agent_anchors</tt> block: AP2
          <tt>mandate_hash</tt>, TAP
          <tt>agent_id</tt>, approval event hash,
          receipt signature. Network token id and 3DS/ACS result are part
          of the block's shape but null when the implementation has no
          source for them. The receipt's
          <tt>scope_conformance</tt> field (the
          intent-scope vs. executed-action diff) is the adjudication
          headline -- one of
          <tt>in_scope</tt>,
          <tt>BREACH:&lt;field&gt;</tt>, or
          <tt>not_evaluated</tt> -- and MUST be
          re-derived by the verifier from recorded inputs, never asserted
          without re-derivation.
        </t>
      </section>

      <section anchor="settlement-anchor" title="Settlement Anchor">
        <t>
          The manifest's <tt>settlement_anchor</tt>
          block records what money actually moved:
          <tt>{rail, txn_ref, finality_status,
          amount_minor, currency, captured_at, network, payer}</tt>,
          plus <tt>unanchored_fields</tt> naming what
          the settlement rail's public artifact did not witness (for
          example, an x402 v2 settlement response carries no amount). The
          block is bound by an <tt>anchor_hash</tt> (a
          canonical hash of the anchor content). Absence MUST be stated as
          <tt>SETTLEMENT_UNANCHORED</tt>; a manifest
          without the block MUST fail verification.
        </t>
      </section>

      <section anchor="fre901" title="FRE 901 Wrapper">
        <t>
          The packet carries an acquisition record (who captured the
          evidence, when, with what tool and clock source -- gaps
          declared, custodian never invented), a custody record (each
          custody event bound to a ledger event hash), and an
          authentication statement naming exactly what a challenger can
          independently re-derive, aligned with
          <xref target="FRE901"/>(b)(9) and
          <xref target="FRE902"/>(13)-(14).
        </t>
      </section>
    </section>

    <section anchor="verification" title="Verification">
      <t>
        Verification is re-derivation, not trust: the packet ships a
        verifier with no non-standard-library dependency beyond a
        cryptographic primitives library, which recomputes event hashes
        and chain links, the receipt signature over canonical bytes, the
        scope verdict from the recorded intent scope and executed action,
        the settlement anchor hash, and headline consistency across
        manifest, receipt, and ledger slice. Every failure MUST be named
        (for example, <tt>SCOPE_HEADLINE_MISMATCH</tt>,
        <tt>SETTLEMENT_ANCHOR_HASH_MISMATCH</tt>). This
        satisfies the base draft's offline-verifiability requirement and
        extends it to the dispute layers defined here.
      </t>
    </section>

    <section anchor="security" title="Security Considerations">
      <t>
        All of the base draft's security considerations apply. In
        addition: the settlement anchor is only as strong as its source.
        A reference implementation that plugs a test-only fixture into the
        settlement-anchor seam witnesses nothing; production deployments
        MUST plug a real acquirer or facilitator feed into that seam --
        for example, a facilitator implementing <xref target="X402"/> or
        an equivalent settlement rail. Independent time requires an
        external anchor proof (<xref target="RFC3161"/> or a transparency
        log per <xref target="RFC6962"/>); absent that, the host clock
        MUST be declared untrusted in the acquisition record.
      </t>
      <t>
        The dispute-evidence categories in <xref target="ce3"/> are named
        for, but not endorsed or specified by, the card schemes: see
        <xref target="CE3"/> and <xref target="FPT"/> for the scheme-owned
        program requirements this profile's category names reference.
        <xref target="LCP"/> is an unrelated but complementary mechanism
        for binding the terms of service in force at transaction time; it
        is out of scope for this profile but referenced here for
        implementers who need both.
      </t>
    </section>

    <section anchor="iana" title="IANA Considerations">
      <t>
        This document has no IANA actions.
      </t>
    </section>

  </middle>

  <back>
    <references title="Normative References">
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="S. Bradner"/>
          <date year="1997" month="March"/>
        </front>
      </reference>
      <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
        <front>
          <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
          <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
          <author initials="I." surname="Liusvaara" fullname="I. Liusvaara"/>
          <date year="2017" month="January"/>
        </front>
      </reference>
      <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
        <front>
          <title>JSON Canonicalization Scheme (JCS)</title>
          <author initials="A." surname="Rundgren" fullname="A. Rundgren"/>
          <author initials="B." surname="Jordan" fullname="B. Jordan"/>
          <author initials="S." surname="Erdtman" fullname="S. Erdtman"/>
          <date year="2020" month="June"/>
        </front>
      </reference>
      <reference anchor="FARLEY" target="https://datatracker.ietf.org/doc/draft-farley-acta-signed-receipts/">
        <front>
          <title>Signed Decision Receipts for Machine-to-Machine Access Control</title>
          <author initials="T." surname="Farley" fullname="T. Farley">
            <organization>Veritas Acta</organization>
          </author>
          <date year="2026" month="June" day="28"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-farley-acta-signed-receipts-02"/>
      </reference>
    </references>

    <references title="Informative References">
      <reference anchor="RFC3161" target="https://www.rfc-editor.org/info/rfc3161">
        <front>
          <title>Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)</title>
          <author initials="C." surname="Adams" fullname="C. Adams"/>
          <author initials="P." surname="Cain" fullname="P. Cain"/>
          <author initials="D." surname="Pinkas" fullname="D. Pinkas"/>
          <author initials="R." surname="Zuccherato" fullname="R. Zuccherato"/>
          <date year="2001" month="August"/>
        </front>
      </reference>
      <reference anchor="RFC6962" target="https://www.rfc-editor.org/info/rfc6962">
        <front>
          <title>Certificate Transparency</title>
          <author initials="B." surname="Laurie" fullname="B. Laurie"/>
          <author initials="A." surname="Langley" fullname="A. Langley"/>
          <author initials="E." surname="Kasper" fullname="E. Kasper"/>
          <date year="2013" month="June"/>
        </front>
      </reference>
      <reference anchor="FRE901" target="https://www.law.cornell.edu/rules/fre/rule_901">
        <front>
          <title>Federal Rules of Evidence, Rule 901: Authenticating or Identifying Evidence</title>
          <author><organization>Legal Information Institute, Cornell Law School</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="FRE902" target="https://www.law.cornell.edu/rules/fre/rule_902">
        <front>
          <title>Federal Rules of Evidence, Rule 902: Evidence That Is Self-Authenticating</title>
          <author><organization>Legal Information Institute, Cornell Law School</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="CE3" target="https://usa.visa.com/support/small-business/regulations-fees.html">
        <front>
          <title>Visa Compelling Evidence 3.0</title>
          <author><organization>Visa Inc.</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="FPT" target="https://www.mastercard.us/">
        <front>
          <title>Mastercard First-Party Trust Program</title>
          <author><organization>Mastercard International</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="LCP" target="https://github.com/legal-context-protocol/legal-context-protocol">
        <front>
          <title>Legal Context Protocol v1</title>
          <author><organization>Integra Ledger and AAA-ICDR</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="X402" target="https://github.com/coinbase/x402">
        <front>
          <title>x402 Payment Protocol</title>
          <author><organization>Coinbase</organization></author>
          <date/>
        </front>
      </reference>
    </references>

    <section anchor="ack" title="Acknowledgements">
      <t>
        This profile documents ActaSeal's DisputeEvidencePacket
        implementation of <xref target="FARLEY"/>.
      </t>
    </section>

  </back>
</rfc>
