<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-hopley-x402-compliance-receipt-01" submissionType="IETF" category="info" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="x402-compliance-receipt">Categorical Compliance Screening Receipt Format for Agentic-Payment Flows</title><seriesInfo value="draft-hopley-x402-compliance-receipt-01" stream="IETF" status="informational" name="Internet-Draft"></seriesInfo>
<author initials="C." surname="Hopley" fullname="Christopher Hopley"><organization>AlgoVoi</organization><address><postal><street></street>
</postal><email>chopmob@gmail.com</email>
</address></author><date year="2026" month="May" day="30"></date>
<area>Independent Submission</area>
<workgroup>Independent Submission</workgroup>
<keyword>x402</keyword>
<keyword>agentic payments</keyword>
<keyword>compliance</keyword>
<keyword>JCS</keyword>
<keyword>RFC 8785</keyword>
<keyword>audit chain</keyword>
<keyword>categorical receipt</keyword>

<abstract>
<t>This document specifies a categorical compliance screening receipt format
for agentic-payment flows. The format is designed for use by AI agents and
agentic-payment gateways that perform regulatory screening at admission
time and must retain the screening decision under framework-bound
retention obligations (UK Money Laundering Regulations 2017; Proceeds of
Crime Act 2002 Section 330; EU Anti-Money Laundering Directives 5 and 6;
Markets in Crypto-Assets Regulation Article 80; Anti-Money Laundering
Regulation Article 56; Digital Operational Resilience Act Article 14).</t>
<t>The receipt format uses a closed enumeration of categorical outcomes
(ALLOW, REFER, DENY) rather than a continuous score or tier projection.
The categorical outcome is load-bearing for downstream regulatory
obligations: under UK POCA 2002 Section 330, a REFER carries a mandatory
Suspicious Activity Report obligation that a DENY does not. A score or
tier projection collapses this distinction.</t>
<t>Receipts are canonicalised under RFC 8785 (JSON Canonicalization Scheme)
with an in-band canonicalisation rule pin (canon_version). The pin
enables year-five re-verification from retained bytes alone, without
dependence on an out-of-band rule registry that the operator must
continue to publish.</t>
<t>This document is complementary to draft-vauban-x402-stark-receipts: that
document covers cryptographic settlement-time payment-condition proofs;
this document covers admission-time compliance screening receipts. The
two compose via the composite trust-query algorithm specified in
specs/composite-trust-query.md in x402-foundation/x402.</t>
</abstract>

</front>
<middle>
<section anchor="sect-1-introduction"><name>Introduction</name>

<section anchor="sect-1-1-motivation"><name>Motivation</name>
<t>Agentic-payment flows are payment transactions initiated or routed by
autonomous AI agents acting on behalf of a principal (a natural person
or legal entity). Where these payments cross regulated payment rails,
the payment gateway is obligated to perform compliance screening at
admission time: sanctions screening, anti-money-laundering checks, and
jurisdictional eligibility checks against the payer and the receiving
counterparty.</t>
<t>The output of compliance screening is a categorical decision: either the
payment is allowed to proceed, it is allowed but flagged for enhanced due
diligence and a regulatory report, or it is refused. This document
specifies a receipt format for recording that categorical decision in a
manner suitable for retention under framework-bound retention
obligations.</t>
</section>

<section anchor="sect-1-2-scope"><name>Scope</name>
<t>In scope:</t>

<ul spacing="compact">
<li>The categorical receipt format (Section 3)</li>
<li>The canonicalisation rule applicable to the receipt (Section 4)</li>
<li>Audit-chain composition properties (Section 5)</li>
<li>Year-five auditability properties (Section 6)</li>
<li>Composition with other x402 substrate specifications (Section 7)</li>
</ul>
<t>Out of scope:</t>

<ul spacing="compact">
<li>The screening algorithm itself. The specific business logic that
produces ALLOW / REFER / DENY (the sanctions feeds consulted, the
anti-money-laundering rules applied, the jurisdictional risk-scoring
methodology) is implementation-defined per screening provider.</li>
<li>The retention storage backend. Object Lock COMPLIANCE retention on
S3-compatible storage is recommended (informative, Section 5.4) but
the specific backend is deployment-defined.</li>
<li>Identity proofing. The payer's identity is referenced through a
content-addressed reference (Section 3.1); how the identity is
established and proofed is the subject of separate work.</li>
</ul>
</section>

<section anchor="sect-1-3-relationship-to-other-internet-drafts"><name>Relationship to other Internet-Drafts</name>
<t>This document is one of a coordinated suite of five AlgoVoi-authored
receipt and response format Internet-Drafts, all anchoring to the
canonicalisation discipline specified in
draft-hopley-x402-canonicalisation-jcs:</t>

<ul spacing="compact">
<li>draft-hopley-x402-canonicalisation-jcs -- the JCS canonicalisation
discipline pinned by Section 4 of this document.</li>
<li>draft-hopley-x402-settlement-attestation -- the per-settlement
categorical attestation format. A compliance receipt admitting a
payment is followed by zero or more settlement attestations on the
audit chain.</li>
<li>draft-hopley-x402-cancellation-receipt -- the mandate cancellation
receipt format. A compliance receipt admitting a recurring-payment
mandate is followed on the audit chain by a cancellation receipt
when the mandate terminates.</li>
<li>draft-hopley-x402-refund-receipt -- the post-settlement refund
receipt format.</li>
<li>draft-hopley-x402-composite-trust-query -- the verifier-side
composite-trust-query response format. A verifier walking an audit
chain composed of compliance, settlement, cancellation, and refund
receipts emits a single composite-trust-query response.</li>
</ul>
<t>The five formats share the same canonicalisation pin, audit-chain
row shape, integer-millisecond timestamp encoding, and content-addressed
reference convention. A verifier walking the full payment lifecycle
requires only one implementation of the canonicalisation discipline.</t>
<t>This document also relates to draft-vauban-x402-stark-receipts
(individual Internet-Draft on the IETF datatracker targeted for the
Independent Submission stream), which covers cryptographic
settlement-time payment-condition proofs using STARK receipts. Both
documents pin the same <tt>urn:x402:canonicalisation:jcs-rfc8785-v1</tt>
canonicalisation discipline; the two receipt families compose
cleanly via draft-hopley-x402-composite-trust-query.</t>
</section>
</section>

<section anchor="sect-2-conventions-and-definitions"><name>Conventions and Definitions</name>

<section anchor="sect-2-1-notation"><name>Notation</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and
&quot;OPTIONAL&quot; 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.</t>
</section>

<section anchor="sect-2-2-definitions"><name>Definitions</name>
<t><strong>screening provider</strong>: an entity that performs compliance screening on
an agentic-payment transaction at admission time and emits a categorical
receipt as the screening decision record.</t>
<t><strong>payer_ref</strong>: a content-addressed reference to the payer's identity.
Typically of the form &quot;sha256:&lt;lowercase-hex&gt;&quot; where the hash is taken
over the JCS-canonical bytes of an identity object held by the
screening provider. The receipt does not carry cleartext identity
content -- only the content-addressed reference -- so the screening
provider's retention layer is GDPR Article 5(1)(c) minimal by
construction.</t>
<t><strong>screen_result</strong>: the categorical screening outcome. One of ALLOW,
REFER, or DENY. The closed set is load-bearing (Section 3.2).</t>
<t><strong>screen_timestamp_ms</strong>: an integer giving the number of milliseconds
since the Unix epoch (1970-01-01T00:00:00Z) at which the screening
decision was recorded. See Section 3.3.</t>
<t><strong>screen_provider_did</strong>: a Decentralised Identifier (DID) identifying
the screening provider. See Section 3.4.</t>
<t><strong>jurisdiction_flags</strong>: an ordered list of regulatory jurisdictions
under which the screening was performed. See Section 3.5.</t>
<t><strong>canon_version</strong>: an in-band string identifying the canonicalisation
rule under which the receipt was canonicalised. See Section 3.6.</t>
<t><strong>audit chain</strong>: a monotonic hash-linked sequence of receipts retained
by the screening provider; see Section 5.</t>
</section>
</section>

<section anchor="sect-3-receipt-format-specification"><name>Receipt Format Specification</name>
<t>A compliance screening receipt is a JSON object containing exactly the
following required fields. Implementations MUST reject receipts that
omit any required field or include fields not listed below.</t>

<artwork><![CDATA[{
  "payer_ref":           "<string>",
  "screen_result":       "<enum: ALLOW | REFER | DENY>",
  "screen_timestamp_ms": <integer>,
  "screen_provider_did": "<DID URI>",
  "jurisdiction_flags":  ["<jurisdiction-code>", ...],
  "canon_version":       "jcs-rfc8785-v1"
}
]]></artwork>
<t>The JSON Schema (draft-07) for this format is published at
<eref target="https://json.schemastore.org/algovoi-compliance-receipt-v1.json"> target="https://json.schemastore.org/algovoi-compliance-receipt-v1.json"</eref>.</t>

<section anchor="sect-3-1-payer-ref"><name>payer_ref</name>
<t>The payer_ref field MUST be a non-empty string identifying the payer by
content-addressed reference. The recommended form is
&quot;sha256:&lt;lowercase-hex&gt;&quot; where the hex is the lowercase hexadecimal
representation of the SHA-256 digest of the JCS-canonical bytes of the
underlying identity object.</t>
<t>The receipt MUST NOT carry cleartext identity content. This ensures
that the screening provider's retention layer is GDPR Article 5(1)(c)
minimal by construction; identity content can be re-presented to the
receipt holder out-of-band when necessary.</t>
</section>

<section anchor="sect-3-2-screen-result-closed-enumeration"><name>screen_result Closed Enumeration</name>
<t>The screen_result field MUST be exactly one of the following three
string values:</t>
<table>
<thead>
<tr>
<th>Value</th>
<th>Meaning</th>
</tr>
</thead>

<tbody>
<tr>
<td>ALLOW</td>
<td>The transaction is cleared to proceed under the regulatory gate at the screening provider's jurisdictions.</td>
</tr>

<tr>
<td>REFER</td>
<td>The transaction is flagged for enhanced due diligence. Depending on the screening provider's jurisdictions (jurisdiction_flags) this MAY trigger a mandatory Suspicious Activity Report or equivalent regulatory filing obligation.</td>
</tr>

<tr>
<td>DENY</td>
<td>The transaction is refused under a sanctions or anti-money-laundering rule.</td>
</tr>
</tbody>
</table><t>The closed three-value enumeration is load-bearing. Under UK Proceeds of
Crime Act 2002 Section 330, a REFER outcome triggers a mandatory
Suspicious Activity Report obligation to the UK National Crime Agency
for institutions in the regulated sector. A DENY outcome does not trigger
the same obligation: it refuses the transaction but does not by itself
require a SAR.</t>
<t>A receipt format that compresses screen_result to a continuous score or
to a coarser tier set (e.g. &quot;high / medium / low&quot;) loses this load-bearing
distinction. A year-five auditor reading a retained receipt under such a
projection cannot determine, from the retained bytes alone, whether the
historical decision triggered a mandatory regulatory report. This
document REQUIRES the closed three-value enumeration for that reason.</t>
<t>Future extensions to the receipt format MAY add additional fields
alongside the categorical screen_result (e.g. a continuous score for
internal monitoring use), but MUST NOT remove or alter the closed
enumeration on screen_result itself.</t>
</section>

<section anchor="sect-3-3-screen-timestamp-ms"><name>screen_timestamp_ms</name>
<t>The screen_timestamp_ms field MUST be a non-negative integer giving the
number of milliseconds elapsed since 1970-01-01T00:00:00Z (Unix epoch).</t>
<t>The field MUST NOT be a floating-point number, MUST NOT be a
JSON-formatted string, and MUST NOT be in RFC 3339 ISO-8601 format.
Implementations that receive a non-integer value MUST reject the
receipt at the validation layer before canonicalisation; silent
type-cast from float to integer is forbidden.</t>
<t>The integer-only restriction is required because RFC 8785 canonicalises
floating-point numbers and integers differently. A receipt whose
timestamp was emitted as an integer and later re-canonicalised after a
type-cast from float would produce different canonical bytes and a
different content_hash -- which would fail the year-five auditability
property (Section 6).</t>
</section>

<section anchor="sect-3-4-screen-provider-did"><name>screen_provider_did</name>
<t>The screen_provider_did field MUST be a Decentralised Identifier (DID)
URI conforming to the DID syntax: &quot;did:&quot; followed by one or more
alphanumeric characters identifying the DID method, followed by a
method-specific identifier.</t>
<t>Implementations MAY use any DID method, including but not limited to
did:web, did:key, did:ion, did:peer. The did:web method is RECOMMENDED
where the screening provider operates a stable HTTPS-resolvable
endpoint, because did:web allows verifiers to retrieve the screening
provider's public key directly from a well-known URI without consulting
any external registry.</t>
</section>

<section anchor="sect-3-5-jurisdiction-flags"><name>jurisdiction_flags</name>
<t>The jurisdiction_flags field MUST be a non-empty JSON array of strings.
Each string identifies a regulatory jurisdiction under which the
screening was performed.</t>
<t>Recommended values follow ISO 3166-1 alpha-2 country codes (e.g. &quot;UK&quot;,
&quot;DE&quot;, &quot;JP&quot;). Aggregate jurisdiction codes such as &quot;EU&quot; MAY also be
used.</t>
<t>The array element ORDER is SIGNIFICANT and load-bearing. RFC 8785
Section 3.2.3 specifies that JSON array element order is preserved
during canonicalisation. The array [&quot;UK&quot;, &quot;EU&quot;] and the array [&quot;EU&quot;,
&quot;UK&quot;] therefore canonicalise to different bytes and produce different
content_hash values.</t>
<t>Producer-side ordering MUST match the order in which the regulatory
rules were applied. Verifiers SHOULD validate ordering consistency
across a screening provider's retained chain.</t>
</section>

<section anchor="sect-3-6-canon-version"><name>canon_version</name>
<t>The canon_version field MUST be the string &quot;jcs-rfc8785-v1&quot; for receipts
emitted under the canonicalisation discipline specified by this version
of this document.</t>
<t>Future revisions of the canonicalisation discipline MAY introduce
successor pin values (&quot;jcs-rfc8785-v2&quot;, etc.). Implementations
re-canonicalising a retained receipt MUST consult the receipt's
canon_version field and apply the corresponding canonicalisation rule.</t>
<t>The in-band pin enables year-five re-verification: the rule active at
emission is recorded in the retained bytes themselves and does not
require an out-of-band rule registry that the screening provider must
continue to publish.</t>
</section>
</section>

<section anchor="sect-4-canonicalisation"><name>Canonicalisation</name>
<t>Compliance receipts are canonicalised using JSON Canonicalization
Scheme (JCS) as specified in [RFC8785]. The canonicalisation discipline
applicable to this document is identified by the URN:</t>
<t>urn:x402:canonicalisation:jcs-rfc8785-v1</t>
<t>The discipline imposes the following rules on receipt content:</t>

<ul spacing="compact">
<li>RFC 8785 canonical JSON for the receipt object.</li>
<li>Object keys are sorted lexicographically by Unicode code-point order
(per RFC 8785 Section 3.2.3).</li>
<li>Array element order is preserved (per RFC 8785 Section 3.2.3).</li>
<li>Numeric values are canonicalised per RFC 8785 Section 3.2.2.3.</li>
<li>The integer-only restriction on screen_timestamp_ms (Section 3.3) is
applied at the validation layer before canonicalisation.</li>
</ul>
<t>The discipline applies to:</t>

<ul spacing="compact">
<li>The receipt object itself, for computation of the content_hash
(Section 5).</li>
<li>The bundle of receipts emitted as a selective-disclosure audit
bundle (out of scope for this document; see related work in
Section 5.4).</li>
</ul>
</section>

<section anchor="sect-5-audit-chain-composition"><name>Audit Chain Composition</name>
<t>A screening provider that emits compliance receipts under this format
SHOULD compose those receipts into a monotonic hash-linked audit chain.</t>

<section anchor="sect-5-1-chain-row-shape"><name>Chain Row Shape</name>
<t>Each row in the audit chain MUST carry the following three fields in
addition to the receipt itself:</t>

<ul spacing="compact">
<li>chain_position: a non-negative integer that increases monotonically
with each new row, starting at zero for the chain head.</li>
<li>content_hash: the lowercase hexadecimal SHA-256 hash of the
JCS-canonical bytes of the receipt object.</li>
<li>prev_hash: the content_hash of the previous chain row, or null for
the chain head (chain_position = 0).</li>
</ul>
</section>

<section anchor="sect-5-2-linkage-verification"><name>Linkage Verification</name>
<t>A verifier walking the chain MUST confirm:</t>

<ul spacing="compact">
<li>chain_position increases by exactly one between successive rows.</li>
<li>prev_hash on row N equals content_hash on row (N - 1).</li>
<li>content_hash on each row recomputes to SHA-256(JCS(receipt_object))
from the retained bytes.</li>
</ul>
<t>Any linkage break MUST cause the verifier to reject the chain.</t>
</section>

<section anchor="sect-5-3-selective-disclosure"><name>Selective Disclosure</name>
<t>A screening provider MAY emit a selective-disclosure audit bundle
containing a subset of the retained chain (typically filtered by a
selection_criteria such as tenant_id, payer_ref, screen_result, or a
time range). Such bundles MAY include &quot;bridging_rows&quot; that fill chain
gaps between selected rows so that the verifier can confirm
linkage continuity across the disclosed subset.</t>
<t>The specific bundle envelope format is out of scope for this document.
A reference implementation of the selective-disclosure bundle format and
the corresponding verifier is published at
<eref target="https://github.com/chopmob-cloud/algovoi-audit-verifier"> target="https://github.com/chopmob-cloud/algovoi-audit-verifier"</eref> (MIT licensed).</t>
</section>

<section anchor="sect-5-4-retention-storage"><name>Retention Storage</name>
<t>The retention storage backend for the chain is out of scope for this
document. An S3-compatible Object Lock COMPLIANCE retention is
RECOMMENDED where the screening provider is subject to retention
obligations of seven years or more (e.g. UK MLR 2017 Regulation 40(3)).</t>
</section>
</section>

<section anchor="sect-6-year-five-auditability-properties"><name>Year-Five Auditability Properties</name>
<t>This receipt format is designed to satisfy the following auditability
properties:</t>

<ol>
<li><t><strong>Re-verification from retained bytes alone.</strong> A year-five verifier
reading a retained chain can recompute every content_hash from the
row's payload and confirm linkage against prev_hash without consulting
any external service. The in-band canon_version pin identifies which
canonicalisation rule to apply.</t>
</li>
<li><t><strong>Operator-continuity independence.</strong> Verification does NOT require
the screening provider to continue to publish a canonicalisation
rule registry, a sanctions feed snapshot, or any other out-of-band
resource. The receipt is self-contained.</t>
</li>
<li><t><strong>Cross-implementation verifiability.</strong> The JCS RFC 8785
canonicalisation discipline has been byte-for-byte cross-validated
across multiple independent reference implementations including
Python rfc8785, JavaScript canonicalize, Go gowebpki/jcs, Java
cyberphone/json-canonicalization, and Rust serde_jcs. A verifier
built with any of these implementations produces identical canonical
bytes for any compliance receipt under this format.</t>
</li>
<li><t><strong>Tamper detection.</strong> Per-row content_hash and chain prev_hash
linkage detect single-row tampering and chain truncation /
reordering respectively.</t>
</li>
<li><t><strong>Regulatory distinction preserved.</strong> The closed enumeration on
screen_result (Section 3.2) preserves the load-bearing distinction
between REFER (mandatory SAR under UK POCA 2002 s.330) and DENY for
the full retention period.</t>
</li>
</ol>
</section>

<section anchor="sect-7-composition-with-other-x402-substrate"><name>Composition with Other x402 Substrate</name>
<t>This receipt format composes with other elements of the x402 substrate:</t>

<section anchor="sect-7-1-composite-trust-query"><name>Composite Trust-Query</name>
<t>Multiple emitters' attestations -- including compliance receipts under
this format, STARK payment-condition receipts under
draft-vauban-x402-stark-receipts, and service-reputation receipts from
other providers -- compose into a single canonical composite_hash via
the composite trust-query algorithm specified in
specs/composite-trust-query.md (in x402-foundation/x402 pull request
#2440):</t>
<t>composite_hash = SHA-256(JCS([rows sorted by source_id, sig excluded]))</t>
<t>A downstream verifier consuming a composite_hash sees one emitter row
per provider, each row containing or referencing the JCS-canonical
bytes of the provider's underlying receipt.</t>
</section>

<section anchor="sect-7-2-privacy-class-field"><name>privacy_class Field</name>
<t>A receipt MAY carry an additional privacy_class field (per the
x402-foundation/x402 pull request #2334) declaring the settlement-plane
visibility of the receipt. The field is not part of the required-fields
set of this document but is interoperable with it.</t>
</section>

<section anchor="sect-7-3-compliance-category"><name>Compliance Category</name>
<t>This receipt format is one of the evidenceShape options under the
Compliance evidenceType category proposed in x402-foundation/x402 pull
request #2322. The Compliance category framework provides the broader
extension mechanism by which Bazaar registries may surface compliance
attestations.</t>
</section>
</section>

<section anchor="sect-8-iana-considerations"><name>IANA Considerations</name>

<section anchor="sect-8-1-urn-namespace-registration"><name>URN Namespace Registration</name>
<t>This document requests IANA register the following URN namespace per
the procedures of [RFC8141]:</t>

<ul spacing="compact">
<li>URN namespace: urn:x402:canonicalisation:jcs-rfc8785-v1</li>
<li>Purpose: identifies the JCS RFC 8785 canonicalisation discipline
applied to receipts under this document and companion documents.</li>
</ul>
</section>

<section anchor="sect-8-2-receipt-format-identifier"><name>Receipt Format Identifier</name>
<t>This document does not request the registration of a new media type.
Receipts under this format use the application/json media type with
the structural constraints specified in Section 3.</t>
</section>
</section>

<section anchor="sect-9-security-considerations"><name>Security Considerations</name>

<section anchor="sect-9-1-receipt-tampering"><name>Receipt Tampering</name>
<t>The per-row content_hash provides single-row tamper detection. A
verifier recomputing content_hash from the receipt's JCS-canonical
bytes detects any modification to the receipt content (including
modification to a single field, byte, or whitespace).</t>
</section>

<section anchor="sect-9-2-chain-truncation-and-reordering"><name>Chain Truncation and Reordering</name>
<t>The prev_hash linkage detects chain truncation, row removal, and
reordering. A verifier walking the chain confirms that prev_hash on
each row equals content_hash on the previous row; any break in the
walk indicates tampering, truncation, or reordering.</t>
</section>

<section anchor="sect-9-3-bundle-forgery"><name>Bundle Forgery</name>
<t>A screening provider MAY sign a selective-disclosure audit bundle with
an HMAC-SHA256 over the JCS-canonical bytes of the bundle (minus the
signature field). The shared signing key is the proof-of-emission
secret; verifiers possessing the key can confirm that the bundle was
emitted by the holder of the key.</t>
<t>This document does not REQUIRE bundle signing -- the per-row content
hashes and chain linkage already provide tamper detection -- but it
RECOMMENDS bundle signing for selective-disclosure exchanges where
the verifier must distinguish &quot;bundle emitted by the screening
provider&quot; from &quot;bundle reconstructed from elsewhere.&quot;</t>
</section>

<section anchor="sect-9-4-operator-continuity-loss"><name>Operator Continuity Loss</name>
<t>The in-band canon_version pin (Section 3.6) ensures that re-verification
does not require operator continuity. If the screening provider ceases
operations, retained chains remain verifiable: the rule named by
canon_version is publicly documented and stable.</t>
</section>

<section anchor="sect-9-5-did-resolution-compromise"><name>DID Resolution Compromise</name>
<t>The screen_provider_did is a Decentralised Identifier. Verifiers
SHOULD resolve it through multiple resolvers (where the DID method
supports multi-resolver patterns) and confirm consistency before
accepting public key material for signature verification on
selective-disclosure bundles.</t>
</section>

<section anchor="sect-9-6-privacy"><name>Privacy</name>
<t>The payer_ref content-addressed reference does not by itself leak
identity content. A receipt holder presenting the receipt out-of-band
can also present the underlying identity object; the receipt holder
chooses when and to whom to disclose identity. This is the
selective-disclosure pattern that justifies the content-addressed
reference design.</t>
<t>Implementations MUST NOT log cleartext identity content alongside
receipts in the chain. Implementations MUST NOT recover the underlying
identity object from payer_ref alone -- the reference is a one-way
hash.</t>
</section>
</section>

</middle>
<back>
<section anchor="sect-10-references"><name>References</name>

<section anchor="sect-10-1-normative-references"><name>Normative References</name>

<ul spacing="compact">
<li>[RFC2119] Bradner, S., &quot;Key words for use in RFCs to Indicate
Requirement Levels&quot;, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March
1997.</li>
<li>[RFC8174] Leiba, B., &quot;Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words&quot;, BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017.</li>
<li>[RFC8259] Bray, T., Ed., &quot;The JavaScript Object Notation (JSON) Data
Interchange Format&quot;, STD 90, RFC 8259, DOI 10.17487/RFC8259, December
2017.</li>
<li>[RFC8785] Rundgren, A., Jordan, B., and S. Erdtman, &quot;JSON
Canonicalization Scheme (JCS)&quot;, RFC 8785, DOI 10.17487/RFC8785, June
2020.</li>
<li>[RFC8141] Saint-Andre, P. and J. Klensin, &quot;Uniform Resource Names
(URNs)&quot;, RFC 8141, DOI 10.17487/RFC8141, April 2017.</li>
</ul>
</section>

<section anchor="sect-10-2-informative-references"><name>Informative References</name>

<ul spacing="compact">
<li>draft-hopley-x402-canonicalisation-jcs
Hopley, C., &quot;JCS Canonicalisation Discipline for Agentic-Payment
Receipts&quot;, draft-hopley-x402-canonicalisation-jcs-v1, May 2026.</li>
<li>draft-hopley-x402-settlement-attestation
Hopley, C., &quot;Categorical Settlement Attestation Format for
Agentic-Payment Flows&quot;, draft-hopley-x402-settlement-attestation-00,
May 2026.</li>
<li>draft-hopley-x402-cancellation-receipt
Hopley, C., &quot;Categorical Mandate Cancellation Receipt Format for
Agentic-Payment Flows&quot;, draft-hopley-x402-cancellation-receipt-00,
May 2026.</li>
<li>draft-hopley-x402-refund-receipt
Hopley, C., &quot;Categorical Refund Receipt Format for Agentic-Payment
Flows&quot;, draft-hopley-x402-refund-receipt-00, May 2026.</li>
<li>draft-hopley-x402-composite-trust-query
Hopley, C., &quot;Composite Trust Query Response Format for
Agentic-Payment Audit Chains&quot;,
draft-hopley-x402-composite-trust-query-00, May 2026.</li>
<li>draft-vauban-x402-stark-receipts
draft-vauban-x402-stark-receipts (companion document on STARK
receipt format).</li>
<li>[AlgoVoi-Substrate-Authorship]
AlgoVoi, &quot;Substrate Authorship and Provenance&quot;,
<eref target="https://docs.algovoi.co.uk/substrate-authorship-provenance"> target="https://docs.algovoi.co.uk/substrate-authorship-provenance"</eref></li>
<li>[AlgoVoi-Adopters-Registry]
AlgoVoi, &quot;Substrate Adopters Registry&quot;,
<eref target="https://docs.algovoi.co.uk/adopters"> target="https://docs.algovoi.co.uk/adopters"</eref></li>
<li>x402-foundation/x402 pull request #2440 -- composite trust-query
algorithm.</li>
<li>x402-foundation/x402 pull request #2334 -- privacy_class field.</li>
<li>x402-foundation/x402 pull request #2322 -- Compliance category
proposal with evidenceType, evidenceShape, anchor_chains constraint.</li>
<li>x402-foundation/x402 pull request #2434 -- compliance-receipt-fixture
(the reference fixture for this receipt format in the x402 Foundation
conformance suite).</li>
<li>UK Money Laundering Regulations 2017.</li>
<li>UK Proceeds of Crime Act 2002, Section 330.</li>
<li>EU Anti-Money Laundering Directive 5 (Directive (EU) 2018/843).</li>
<li>EU Anti-Money Laundering Directive 6 (Directive (EU) 2018/1673).</li>
<li>EU Markets in Crypto-Assets Regulation (MiCA, Regulation (EU)
2023/1114), Article 80.</li>
<li>EU Anti-Money Laundering Regulation (AMLR, Regulation (EU) 2024/1624),
Article 56.</li>
<li>EU Digital Operational Resilience Act (DORA, Regulation (EU)
2022/2554), Article 14.</li>
</ul>
</section>
</section>

<section anchor="appendix-a-examples-informative"><name>Appendix A. Examples (Informative)</name>
<t>The following example receipts illustrate the format. All three are
syntactically valid under the JSON Schema at
<eref target="https://json.schemastore.org/algovoi-compliance-receipt-v1.json"> target="https://json.schemastore.org/algovoi-compliance-receipt-v1.json"</eref>.</t>

<section anchor="a-1-allow-under-uk-eu-joint-jurisdiction"><name>A.1. ALLOW under UK + EU joint jurisdiction</name>

<sourcecode type="json"><![CDATA[{
  "payer_ref": "sha256:0dd5d0b76c9b9281fdeb2509ad38ab132b16a17385ca01d976ff9e6e12563a0f",
  "screen_result": "ALLOW",
  "screen_timestamp_ms": 1716460800000,
  "screen_provider_did": "did:web:api.algovoi.co.uk",
  "jurisdiction_flags": ["UK", "EU"],
  "canon_version": "jcs-rfc8785-v1"
}
]]></sourcecode>
</section>

<section anchor="a-2-refer-under-uk-with-mandatory-sar-obligation"><name>A.2. REFER under UK with mandatory SAR obligation</name>

<sourcecode type="json"><![CDATA[{
  "payer_ref": "sha256:4b781b0d3f8a82c5e6e91077928d3c9156b1ab51c19d7eef03f1d2956b1a3e72",
  "screen_result": "REFER",
  "screen_timestamp_ms": 1716460800050,
  "screen_provider_did": "did:web:api.algovoi.co.uk",
  "jurisdiction_flags": ["UK"],
  "canon_version": "jcs-rfc8785-v1"
}
]]></sourcecode>
<t>Per Section 3.2: institutions in the regulated sector emitting a
REFER under a UK jurisdiction MUST file a SAR with the UK National
Crime Agency per UK POCA 2002 Section 330.</t>
</section>

<section anchor="a-3-deny-under-sanctions-match-across-uk-eu-us"><name>A.3. DENY under sanctions match across UK + EU + US</name>

<sourcecode type="json"><![CDATA[{
  "payer_ref": "sha256:10779e0aeb2e1d3aa2c419c91d1e0cd0c14d9a8a3f6c2f25b3d0aa1075c3e438",
  "screen_result": "DENY",
  "screen_timestamp_ms": 1716460800100,
  "screen_provider_did": "did:web:api.algovoi.co.uk",
  "jurisdiction_flags": ["UK", "EU", "US"],
  "canon_version": "jcs-rfc8785-v1"
}
]]></sourcecode>
</section>
</section>

<section anchor="appendix-b-reference-implementations-informative"><name>Appendix B. Reference Implementations (Informative)</name>
<t>The following open-source packages implement the format specified in
this document. None of these implementations is privileged; the format
is fully specified by Section 3.</t>

<ul>
<li><t>algovoi-substrate (Python) on PyPI:
<eref target="https://pypi.org/project/algovoi-substrate/"> target="https://pypi.org/project/algovoi-substrate/"</eref>
Provides build_compliance_receipt(), action_ref(), and the JCS
canonicalisation primitive. Apache 2.0 licensed.</t>
</li>
<li><t>@algovoi/substrate (TypeScript) on npm:
<eref target="https://www.npmjs.com/package/@algovoi/substrate"> target="https://www.npmjs.com/package/@algovoi/substrate"</eref>
Byte-for-byte parity with the Python sibling. Apache 2.0 licensed.</t>
</li>
<li><t>algovoi-audit-verifier (Python) on PyPI:
<eref target="https://pypi.org/project/algovoi-audit-verifier/"> target="https://pypi.org/project/algovoi-audit-verifier/"</eref>
Implements the audit-chain verification logic (Section 5.2)
including per-row content_hash recomputation and chain linkage walk.
MIT licensed.</t>
</li>
<li><t>@algovoi/audit-verifier (TypeScript) on npm:
<eref target="https://www.npmjs.com/package/@algovoi/audit-verifier"> target="https://www.npmjs.com/package/@algovoi/audit-verifier"</eref>
Byte-for-byte parity with the Python verifier. MIT licensed.</t>
</li>
</ul>
<t>Cross-implementation conformance vectors are published at:</t>
<t><eref target="https://github.com/chopmob-cloud/algovoi-jcs-conformance-vectors"> target="https://github.com/chopmob-cloud/algovoi-jcs-conformance-vectors"</eref></t>
<t>The JSON Schema (draft-07) at
<eref target="https://json.schemastore.org/algovoi-compliance-receipt-v1.json"> target="https://json.schemastore.org/algovoi-compliance-receipt-v1.json"</eref> is
mirrored at the same repository.</t>
</section>

<section anchor="appendix-c-acknowledgments"><name>Appendix C. Acknowledgments</name>
<t>This document builds on the canonicalisation discipline formalised in
x402-foundation/x402 pull request #2436, co-signed by the document
author with seritalien (Vauban Pay) and arian-gogani (Arian Gogani).
The framework-bound-retention scoping clause in the discipline was
contributed by feedoracle (FeedOracle). The receipt-format fixture in
x402-foundation/x402 pull request #2434 was authored by seritalien
(Vauban Pay) and explicitly references the AlgoVoi production schema
as its source.</t>
</section>
</back>

</rfc>
