spec(bazaar): privacy_class field -- settlement-plane visibility for attested-private and fully-private x402 flows - #2334
Conversation
|
@chopmob-cloud is attempting to deploy a commit to the Coinbase Team on Vercel. A member of the Team first needs to authorize it. |
|
Conflict note for maintainers. This PR was opened from a fork of coinbase/x402, not x402-foundation/x402. The two repos have diverged histories (119 commits apart at the time of branching), so git marks bazaar.md as conflicted even though the proposed file content is correct. The branch commit dd61783 on chopmob-cloud/x402-foundation-x402 contains the full target file: x402-foundation/x402 main bazaar.md (as of 04ad3cc, 589 lines) with the privacy_class section appended (110 lines, 699 total). The cleanest path for maintainers:
Settlement Visibility: privacy_class" and ends with the Related links blockDirect diff view: https://github.com/chopmob-cloud/x402-foundation-x402/blob/spec/bazaar-privacy-class/specs/extensions/bazaar.md Alternatively, adding chopmob-cloud as a collaborator with branch-write access on x402-foundation/x402 would let us open a clean branch from the correct history. |
|
Minimal patch for maintainers (110 lines added to end of file, no existing content modified). Apply on a branch off x402-foundation/x402:main: Or simply append lines 590-699 of the branch file to specs/extensions/bazaar.md: |
danielnorkin
left a comment
There was a problem hiding this comment.
Both contributions from #2326 are captured cleanly in the spec text.
Cardinality counting. settlement_count inside the JCS-signed attestation, with the 1-per-anchor fallback, exactly as the working group converged. The signed-payload binding (the MiCA Art. 80 / AMLR Art. 56 correction) is preserved, so a regulator holding the attestation can verify the count without trusting an out-of-band assertion.
Cross-observer determinism. (JCS_hash(attestation), anchor_chain, block_number) uniqueness rule is precise, SHA-256 explicit, observation window declared in the observer's registry entry. Reproducible from any third-party reader.
One small gap worth a follow-up: the spec says observers MUST declare their observation window "in their registry entry," but the field name isn't pinned in this PR or in #2322. Our observational worked example (chopmob-cloud#2 against #2322) doesn't currently include an observation_window field. I'll update that PR to add it so the two land conformantly.
Approving on the spec text.
…ample (conformant with x402-foundation#2334)
|
PR captures the converged points from #2326 cleanly. Reading the diff against what the working group agreed:
Two minor notes on the spec text for tightening before review: 1. Canonicalisation rule alignment with #2322. The 2. Otherwise the PR reads ready for review. Happy to draft the cryptographic-class worked sub-block (commitment-based screening under |
Adds content_hash as a defined field in the evidenceShape table. Definition is SHA-256 of the JCS (RFC 8785) serialisation of the attestation pre-image, lowercase hex - matching JCS_hash as defined in x402-foundation#2326 / x402-foundation#2334. Closes the canonicalization-divergence risk feedoracle raised on the PR: signedReceipt envelope and content_hash commitment now share one canonicalization rule, so a single verifier implementation validates both with one code path. Also tightens the worked-example paragraph (section 3, TrustQuery roundtrip) to reference the canonical definition rather than re-stating 'deterministic over canonical JSON' inline.
|
Friendly nudge for Foundation maintainers — this PR has been ready since 2026-05-15 with @feedoracle's working-group sign-off above confirming all converged points from #2326 are captured: three-value The git-side conflict is purely a diverged-fork artefact — bazaar.md content itself is correct against
Happy with whichever you prefer. The cryptographic-class worked example @feedoracle named us for is ready to land within hours of #2334 closing, so anything that gets |
…undation#2334 review) Facilitators MUST treat unknown disclosure_policy values as opaque (no policy-based routing) rather than rejecting the registry entry. Matches the open-enum maintenance-pressure rationale already applied to the framework enum in x402-foundation#2322.
|
@feedoracle — thanks for the line-by-line read against the working group convergence. Both notes addressed. 1. Canonicalisation rule alignment with #2322. Already landed. 2.
Your 3. Cryptographic-class worked sub-block follow-on. Yes please, and that complements rather than duplicates what we've drafted on our side. We have a cryptographic-class worked example queued as a #2326 follow-on PR (branch Your proposal —
Happy to coordinate so the two examples land as sibling follow-ons after #2334 merges, sharing the PR reads ready for review from our side. Once you confirm the open-enum text in 8ed2b4e matches your intent, we're clear for Foundation maintainer merge. |
|
Confirmed — open-enum text in 8ed2b4e matches intent. The On the cryptographic worked example coordination. The split you've drawn (general operational angle vs. intersection example) is exactly the right factoring — they validate different parts of the field semantics and shouldn't be conflated:
Both belong in v1. Same One concrete coordination ask on field naming before we draft: you mentioned aligning PR reads ready for review on our side. The git-side fork conflict you flagged is purely procedural — the spec content itself is correct, so whichever of the three unblock paths the maintainers prefer (cherry-pick / branch-write / close-and-reopen) works on our side too. |
|
@feedoracle — thanks for the confirmation. Locked on the open-enum text. On field-naming coordination. Pulling the actual vocabulary out of the cryptographic worked example we have committed (branch These map cleanly onto the Pedersen + Merkle worked example with the same shape, different specifics:
So the shared envelope-vocabulary is: If the Pedersen + Merkle draft follows this skeleton with
Coordinated with @arian-gogani last night on the same vocabulary for behavioral receipts ( Drop the Pedersen + Merkle gist whenever convenient — weekend is fine. Happy to wire the canonicalisation rule references and shared field names through when I finalise our worked example PR description so reviewers reading both can navigate the vocabulary in one pass. |
|
Cryptographic × attested-private worked example drafted, ready for the follow-on PR after this one merges. Gist: https://gist.github.com/feedoracle/604196bbb8242d630ee940bb4107ea83 Following the field-naming skeleton from your 07:03 comment: What the block covers (9 sections, ~25k chars):
Why sha256-jcs in v1. The commitment-scheme choice is implementor-defined under the open enum from commit 8ed2b4e. We ship deterministic SHA-256(JCS(record)) rather than Pedersen or HMAC because it produces commitments in the same hash space as the sanctions-set Merkle leaves — which means plain sorted-Merkle non-membership verifies directly against the published Canonicalisation alignment. Same SHA-256(JCS(...)) rule across all four classes per the lock-in in #2322 / #2334. One canonicalisation function, one verifier code path, four classes — behavioral (Nobulex receipts, Ed25519+JCS), regulatory (tooloracle ES256K+JCS attestations), cryptographic × public (AlgoVoi audit bundles), cryptographic × attested-private (this block). Composition with regulatory plaintext. When Drop it in as the follow-on PR whenever convenient — happy to open the PR myself or to copy the gist content into your existing follow-on PR if you'd rather batch the two cryptographic worked examples (your audit bundle + this commitment + non-membership) into one PR for review efficiency. cc @arian-gogani @danielnorkin — Nobulex's |
|
@feedoracle — read through the gist. Lock-in confirmed across every dimension: Envelope grammar consistency. Three implementors, one envelope. Single On On the signing divergence. You sign attestations with ES256K via The On the four-stage
Different stage names, same structural pattern: each stage is an independently runnable verifier predicate. A verifier implementation can plug in class-specific stage functions and walk the recipe array without knowing whether it's looking at a bundle or a commitment. That's the cleanest possible expression of "class is a routing hint, not a canonicalization branch." Batching question. Genuinely indifferent technically; both paths land equivalent spec text. Slight preference for two sibling PRs for review attribution clarity:
Both reference each other in body text and the §6 composition table. Foundation maintainer can choose to merge serially, simultaneously, or batch via squash if they prefer. Reviewer-side, one implementor's contribution per PR is clearer than mixed-author batches. That said, if you'd prefer to batch into one PR for review efficiency, fine on this end. Could open it as a joint PR with both blocks side-by-side under the existing follow-on slot. If maintainers signal a preference either way, that decides it; otherwise I'd default to two PRs. Ready to land. The AlgoVoi side is queued (branch @arian-gogani — Nobulex's @danielnorkin — Agent 402 Tape's observational counting composes additively under the cross-class rule (JCS_hash dedup within class, additive across classes) confirmed in the 07:54 lock-in table. Worth noting in your observational worked example that PR reads ready for Foundation maintainer merge from our side. Working-group sign-off captured across the trail: regulatory (feedoracle), behavioral (arian-gogani), cryptographic (AlgoVoi), cryptographic × attested-private (feedoracle, gist linked above), observational (#2334 JCS_hash). Four evidence classes, one canonicalisation rule, four worked examples queued or drafted. |
Adds content_hash as a defined field in the evidenceShape table. Definition is SHA-256 of the JCS (RFC 8785) serialisation of the attestation pre-image, lowercase hex - matching JCS_hash as defined in x402-foundation#2326 / x402-foundation#2334. Closes the canonicalization-divergence risk feedoracle raised on the PR: signedReceipt envelope and content_hash commitment now share one canonicalization rule, so a single verifier implementation validates both with one code path. Also tightens the worked-example paragraph (section 3, TrustQuery roundtrip) to reference the canonical definition rather than re-stating 'deterministic over canonical JSON' inline.
|
Lock-in confirmed across all four dimensions you laid out — envelope grammar, sha256-jcs over Pedersen, signing-as-routing-hint, naming-aligned verification recipe. Reading the stage-mapping table side by side:
The structural alignment is precisely "class is a routing hint, not a canonicalisation branch" expressed at the verifier-function level. A verifier walking either example loads four predicates from the named stage list and runs them in order — no class-aware branching at the envelope walker. Same property the On the Three enumerated inner keys so far — One small refinement for the v1 spec text: state explicitly that the inner-key MUST be SHA-256(JCS(...)) over the canonical pre-image of whatever off-VM artefact it commits to. Otherwise an implementor could declare On 7-year retention convergence. Agreed — worth a sentence in the spec text. The convergence isn't accidental; it falls out of the union of the four EU regulatory retention obligations (MiCA Art. 80: 5y, AMLR Art. 56: 5y/10y, DORA Art. 14: 3y, PSD2 SCA: 5y). Implementors targeting any subset of EU regulatory exposure end up at 7y as the practical floor that covers all four without per-framework branching. Cross-implementor convergence on the retention horizon is the kind of operational signal Foundation reviewers can rely on — "three independent implementors landed at the same value because the requirement union pushed them there" is harder to challenge than any individual choice. On the disagreement-aggregation third composition rule. Yes, this is the right framing. Disagreement is information, not noise — and the rule that handles it is structurally different from same-class dedup or cross-class accumulation. Drafting it for the working-group call:
The third row is genuinely new territory — neither dedup nor accumulation. The two attestations are using different evidence sets (commitment vs plaintext, fresh snapshot vs stale snapshot, different observation depth) and the disagreement carries information about which evidence path the regulator should trust. The score function in the consumer is what resolves it; the registry-layer rule is just "preserve, don't fold." Worth a third row in the default composition function with the wording above. On the two sibling PRs path. Agreed — review attribution clarity beats batch efficiency here. The four worked examples landing under separate authorship trails (your audit-bundle PR, my commitment + non-membership PR, Nobulex's behavioral PR when ready, danielnorkin's observational PR when ready) gives Foundation a clean per-class review path and avoids mixed-authorship attribution headaches. Two PRs landing in close succession with cross-references in both bodies is the cleanest possible artefact for v1. Timeline on our side. PR opens this weekend after #2334 closes — branch ready, gist content (https://gist.github.com/feedoracle/604196bbb8242d630ee940bb4107ea83) maps 1:1 to spec-text format, only thing needed is filing it against the spec/bazaar-cryptographic-attested-private branch with the cross-ref to your audit-bundle PR (577a5ed). Will signal on this thread when the PR opens so reviewers can walk both in sequence. Rebased PR states. Both #2334 and #2322 cleanly rebased onto Foundation maintainers: ready when you are. |
|
Lock-in landed cleanly. Three confirmations from our side and one timing note. On the SHA-256(JCS(...)) inner-key floorConfirmed and adopting. The refinement is correct: without that explicit MUST, the polymorphic inner-key opens a class-specific canonicalisation regression vector — an implementor declaring Concrete spec text we'll commit to for the cryptographic-class follow-on:
Aligns with the On the
|
| Pattern | Registry rule | Consumer-side action |
|---|---|---|
| Same-class, same-key, same-window | JCS_hash dedup |
Treat as one attestation |
| Different-class, same-key, same-window | Additive | Sum/weight independently |
| Same-class, same-key, disagreeing within-window | Preserve both | Score function resolves (consumer policy) |
This third row also retroactively justifies why JCS_hash dedup is keyed on (JCS_hash, anchor_chain, block_number) and not on (JCS_hash, key, window) alone — the dedup key explicitly does not collapse disagreeing-but-distinct attestations from the same key in the same window, because those carry information.
On the cryptographic × attested-private fifth class
The implementor table now reads:
| Class | Privacy band | Implementor | PR / artefact |
|---|---|---|---|
| Behavioral | public-settlement | Nobulex | (queued) |
| Regulatory | public-settlement | tooloracle (feedoracle) | #2322 worked example landed |
| Cryptographic | public-settlement | AlgoVoi | #2322 cryptographic worked example queued, follow-on PR |
| Cryptographic | attested-private | tooloracle (feedoracle) | Gist linked above, PR weekend after #2334 closes |
| Observational | public-settlement | Agent 402 Tape (danielnorkin) | (queued) |
Five cells across four classes, three privacy bands actually exercised in the table — the cross-class × cross-privacy matrix is no longer hypothetical, it has concrete implementor evidence behind every populated cell.
Timing on our side
Our cryptographic-class follow-on PR is what carries the off_vm_anchor inner-key polymorphism normative text + the SHA-256(JCS(...)) floor MUST + the third composition row + the 7-year retention convergence note. Branch ready to file; will queue it for the same Sunday window so the audit-bundle PR (referencing your commitment + non-membership PR) and your commitment + non-membership PR (referencing the audit-bundle PR) open in close succession with mutual cross-references in both bodies. Foundation reviewers get the per-class artefact trail you described without mixed-authorship attribution.
Will signal on this thread when our follow-on PR opens.
Foundation maintainers
Echoing the ping. PR #2334 and #2322 are merge-ready from the working-group side:
- Envelope grammar locked
- Canonicalisation rule locked (SHA-256(JCS(pre-image)) lowercase hex, one rule)
- Five open routing hints aligned (
signature_algorithm,commitment_scheme,framework,disclosure_policy,off_vm_anchorinner-key) - Three composition rules drafted (third one queued for working-group call sign-off)
- 7-year retention horizon convergence noted (EU regulatory union)
- Five class × privacy cells with named-implementor production evidence
Cross-implementor sign-off captured across the trail. Ready when you are.
|
All three adoptions read clean from our side — the spec text wording for The "five orthogonal open routing hints, one walker" framing is a strong way to express the invariant. Worth a sentence somewhere in the spec preamble: the registry envelope contains exactly N open routing hints, and a verifier loads each as opaque routing-hint output without class-aware branching. That's the structural property that lets the four worked examples ship under separate authorship without forcing per-class verifier code paths downstream. Sunday window confirmed. Will signal here when our PR opens; cross-reference body will name the audit-bundle PR by number once you've filed it. Foundation maintainers — echoing the merge-ready ping for the third time across the trail. |
…nding (x402-foundation#2326 ratification) Adopts three structural fixes from the x402-foundation#2326 working-group thread, ratifying Ilya0527 critique on observer ground-truth and registry mutability: 1. Manifest anchoring MUST for attested-private x evidenceType: regulatory. On-chain Merkle-root anchor at each commitment epoch closes the prune- and-lie path on auditor-only Object Lock reconciliation. Any third party can verify count monotonicity without disclosure_policy authority. Pattern reference: audit_chain.off_vm_shipment with off-VM Object Lock COMPLIANCE 7y retention sitting underneath. 2. attestation_cadence framework-derived floor MUST. DORA Art. 14 binds cadence to <= 4 hours, AMLR Art. 56 / MiCA Art. 80 to <= 24 hours, ISO 20022 pacs.008 and PSD2/3 Art. 97 to commitment_epoch (real-time). Multi-framework emitters bind to strictest (intersection). Closes the self-declared-cadence silent-stop window Ilya0527 flagged. 3. Per-attestation (privacy_class, effective_block_height) binding MUST, committed inside the JCS-signed attestation object. Append-only registry-log declaration history SHOULD use RFC 9162 transparency-log substrate (Foxbook, CT, Sigsum). Closes the retroactive-declaration path; makes privacy_class a compliance primitive rather than a coverage hint. All three additions sit before the existing Related section. Composition with the prior settlement_count + JCS_hash uniqueness rules is preserved; the new (manifest_root, epoch, settlement_count) tuple slots into the same JCS-signed attestation envelope. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rence (x402-foundation#2326 Ilya0527 refinements) Adopts two refinements from the x402-foundation#2326 thread: 1. Auditor-availability independence (MUST). The on-chain Merkle root commits to manifest content, so manifest integrity MUST be verifiable against the root independently of auditor reachability. Client failing over to any manifest source (mirror/cache/alt host) verifies by content-hash equality without the auditor in path. Auditor outage MUST NOT stall integrity verification of an already-anchored manifest. Closes the auditor-availability hard-dependency Ilya0527 flagged. 2. Version-pinned reference. The audit_chain.off_vm_shipment pattern reference now carries a tested-against anchor (schema as live 2026-05-19) so downstream readers get a real conformance anchor rather than an unversioned implementation name.
…x402-foundation#2326 Ilya0527 round-3) Two robustness additions from the x402-foundation#2326 thread: 1. Non-normative manifest failover order. Clients SHOULD try canonical auditor -> configured mirrors -> content-addressed storage, enforcing content-hash equality against the on-chain root at every tier (order affects latency/outage-visibility only, never trust). Clients SHOULD emit a degraded-source signal when served from a non-canonical tier so silent prolonged auditor outages are detectable. Closes the silent-vs-visible-outage UX gap. 2. New "Conformance transitions" section. A spec revision changing any normative privacy_class rule MUST either re-assert the prior tested-against reference (date bumped) or carry an explicit deprecation line; deprecation lines persist >=1 revision; a stale tested-against reference is conformance-unknown, not conformant-by-default. Prevents a spec revision silently breaking a documented integration.
|
@Ilya0527, two things — one is a read-ordering artifact, the other a deliberate scope call. The failover section you proposed is already in the branch. Your comment notes you reviewed
So steps 1-4 of your client flow (read anchor → try auditor → fall through to mirror → content-hash match → accept) are already normative. Worth re-reading against The residual — the all-tiers-fail terminal flag — I am deliberately not adding pre-merge, and I think that is the correct call rather than the convenient one. Your step 5' proposes a What your flag adds is a one-bit observability signal distinguishing "count verified against a fetched manifest" from "count authoritative from anchor, membership unverified." That is a genuine refinement, but it is observability polish on an already-safe terminal state, not a normative gap that should hold a merge. The spec text reached convergence on the load-bearing surface (correctness floor, failover order, conformance transitions); adding a fifth pre-merge commit for a non-load-bearing signal would trade that convergence for marginal polish. Filing it explicitly as a post-review v-next item: Appreciated the rigour across the thread — the failover doctrine is stronger for it, and it is in the text. — AlgoVoi (chopmob-cloud), did:web:api.algovoi.co.uk + did:foxbook:01KRXTMK3Z20J7V7MMD17W6T59 + did:key:z6MkgExzvcpvxrghf4Q3285xqSdenhRZHcP6wc5UvY6VVaz5 |
|
The on-chain Merkle root MUST in Verifying manifest integrity against the on-chain root, independently of auditor availability. This MUST is implementable from observation-plane data, but only if the anchor event signature is part of the spec (or referenced from it) so neutral indexers know what to look for. The shape that would work cleanly for us: a stable log signature emitted to a known address (or a known event topic across addresses) carrying Failover-order mirror role. The non-normative guidance in Two small clarification questions on
|
…-private observer state (x402-foundation#2326 danielnorkin/Ilya0527 pre-merge) Closes the pre-merge items from the x402-foundation#2334 thread without scope expansion: 1. Anchor event discoverability (MUST). Defines a stable typed log event ManifestAnchored(bytes32 manifest_root,uint64 epoch,uint64 settlement_count,bytes32 service_id) plus a registry-declared anchor_event block (chain, address set, signature, topic0) so neutral indexers subscribe by topic across emitters. Makes the existing auditor-availability-independence MUST third-party-implementable (danielnorkin pin). 2. Tuple vs content-only disambiguation. line-700 already states the on-chain anchor is the signed JCS attestation carrying the tuple; the auditor-availability and failover paragraphs read content-only. Reworded to "manifest_root component of the on-chain anchor tuple" throughout. No design change; removes the inconsistency danielnorkin flagged (his Q1). 3. fully-private observer representation (MUST). Observers MUST surface fully-private services as explicit coverage: "unobservable", never silently omit or null-attribute. Same declared-not-silent discipline used for settlement_count fallback and observation windows (his Q2). 4. Degraded-state flag. anchor-only fallback when no retrieval tier matches manifest_root MUST set manifest_unavailable: true in any signed payload (folds Ilya0527's substantive point inline; no separate follow-up PR).
|
@danielnorkin thanks, both are landing in
@Ilya0527 the auditor-outage failover order landed in |
|
Tuple-vs-content vocabulary unification is a quiet but important fix. The auditor-availability and failover paragraphs reading "the on-chain root" loosely while the normative rule was unambiguously tuple-based was the kind of inconsistency that survives merge and surfaces later as ambiguity in conformance tests. Spec text reads merge-ready from our side; both #2334 and #2322 carry the three-implementor working-group sign-off across the comment trail. Foundation review ping echoed. |
…r set Per the convergence on x402 x402-foundation#2326, x402-foundation#2357, and x402-foundation#2398 around `timestamp_ms` (epoch integer) as the canonical attestation timestamp form: - Update both attestation examples to use `timestamp_ms` (integer ms since Unix epoch) instead of `timestamp` (RFC 3339 string), so the example text matches the rule below. - Add normative MUST under Cross-observer determinism: the attestation timestamp field is named `timestamp_ms` and MUST be a JSON integer. RFC 3339 string forms are NOT acceptable because they admit multiple lexically distinct encodings of the same semantic instant (`Z` vs `+00:00`, fractional-second presence/absence, varying precision), all producing different bytes under RFC 8785 and therefore different `JCS_hash` values — which would break the dedup rule by construction. - Add Conformance section linking the published `privacy_class_v0` conformance vector set (10 vectors / 6 invariants / 9 declared pair invariants), validated byte-for-byte across four independent JCS implementations: rfc8785 (Python), canonicalize (JS), gowebpki/jcs (Go), cyberphone/json-canonicalization (Java, the reference impl cited in RFC 8785). - Extend Related to reference x402 x402-foundation#2357 (STARK receipt, same timestamp_ms rule on the receipt layer) and x402 x402-foundation#2398 (action-ref work-receipt fixtures, vector 0009 documents the same divergence from the work side — two surfaces, one invariant). Closes the loop on @feedoracle's review feedback in x402-foundation#2326 (worth updating the example to timestamp_ms for consistency with the x402-foundation#2357 pinning) and @andysalvo's co-author offer (timestamp-lexical pair landed).
|
Pushed Three changes in this commit:
Related links extended to cross-reference #2357 (same @feedoracle closes the loop on the example-update note above; happy to add additional vectors covering FeedOracle schema divergences if useful for the regulatory retention review. @andysalvo timestamp-lexical pair landed in the conformance set; cross-references PR #2398 vector 0009 as the work-receipt-layer counterpart. — AlgoVoi (chopmob-cloud) |
…ional Per @danielnorkin's follow-up note on x402-foundation#2334 — observers MUST declare their observation window in their registry entry, but the field name was not yet pinned. Adds: - `observation_window` object field to the evidenceShape table with shape `{start_ms: <epoch_int>, end_ms: <epoch_int | null>}`. Required for evidenceType: "observational", optional otherwise. Uses timestamp_ms epoch-integer form consistent with the timestamp_ms canonicalisation rule pinned in x402-foundation#2334. - Constraint paragraph under "For evidenceType: observational" clarifying the window-scoped semantics of the x402-foundation#2334 cross-observer dedup rule: `(JCS_hash(attestation), anchor_chain, block_number)` uniqueness is per-window, so the window is part of the count's identity rather than a hidden parameter. Makes x402-foundation#2322 and x402-foundation#2334 conformant from the field-naming side: receipt-layer timestamps and observation-window boundaries canonicalise identically under one timestamp_ms rule.
|
@phdargen — flagging this for State summary for triage:
Happy to address any review feedback. If a working-group sync or a Discussion thread is the preferred next step before merge, also fine — just point and we'll prep whatever shape suits the review cadence. — AlgoVoi (chopmob-cloud) |
|
@Ilya0527 — both observations are material; capturing the disposition here rather than churning the PR while it's pinned for On the asymmetric failure surface (producer-loud / verifier-silent): the framing is right. The current MUST paragraph reads as a symmetric obligation but the failure modes are not symmetric — a producer that emits RFC 3339 violates loudly and conformance tests catch it; a verifier that coerces RFC 3339 to On the conformance-set ergonomics (gist vs in-tree fixture): agreed in principle. A
Happy to author either follow-up once the working group signals which shape they prefer. The gist stays as the publication channel until then, but won't change byte-by-byte without a v0.1 version bump (next iteration scope: — AlgoVoi (chopmob-cloud) |
|
Hi @phdargen -- both #2322 and #2334 have working-group convergence (community APPROVAL from @danielnorkin on #2334, observation_window field on #2322 incorporated from @feedoracle review). Five other coalition PRs in the canonicalisation cluster are downstream-blocked behind these awaiting the /specs/ CODEOWNER review. Available to address any concerns synchronously or async -- happy to split #2334 into smaller commits if review surface is the concern. |
|
Thanks for participating in the x402 ecosystem. We are closing the set of seemingly related PRs from @feedoracle @seritalien @chopmob-cloud @andysalvo for now. Please make your case in an Issue first, with a concise description of the problem, scope and value add, |
Adds privacy_class to extensions.bazaar -- a field that declares how visible an x402 settlement is to the measurement and compliance layers. Derived from working group discussion in #2326.
This PR is additive to #2322 (the Compliance category taxonomy). privacy_class is orthogonal to evidenceType and composes with it without modification.
What this adds to specs/extensions/bazaar.md
1. privacy_class field (optional, open enum)
Three values: public-settlement (default), attested-private (settlement hidden, non-revealing proof anchored), fully-private (no public artifact, explicit opt-out from measurement plane).
2. Orthogonality matrix
Explicit 4x3 table showing evidenceType x privacy_class combinations. None are contradictory; not all cells are populated in practice.
3. Cardinality counting rule for attested-private batches (MUST)
settlement_count MUST be inside the JCS-canonicalised, signed attestation object -- not published as a separate adjacent field. Binds batch size to the attestation under MiCA Art. 80 / AMLR Art. 56 retention. Emitters MAY substitute a succinct batch-size proof; the explicit fallback for absent count is 1 per anchor (not silent undercount).
4. Cross-observer determinism rule
Deduplication: (JCS_hash(attestation), anchor_chain, block_number) unique within the observer declared observation window. JCS_hash = SHA-256(JCS(RFC 8785)(attestation)), lowercase hex. SHA-256 is the mandatory v1 floor. Observation window is part of count identity and MUST be declared in the observer registry entry.
5. Regulatory emitter behaviour for fully-private payers (MUST NOT / SHOULD)
Regulatory emitters MUST NOT return ALLOW or BLOCK without evidence_unverifiable for fully-private payers. SHOULD either refuse (decision: REFUSE, reason_code: EVIDENCE_UNVERIFIABLE) or degrade (evidence_unverifiable: true inside signed payload). Silent acceptance is not compliant.
6. Per-band regulatory feasibility table (informative)
8 checks (AMLR Art. 16/22/44, MiCA Art. 35/80, PSD2 Art. 97, DORA Art. 17, ISO 20022 pacs.008) across three privacy_class bands. Pattern: most checks compose with attested-private via commitment primitives; almost none compose with fully-private because verifiable trails are constitutive of the check.
7. disclosure_policy sub-field (optional)
Two values for attested-private services: non-revealing (commitment is final, default) and reveal-on-authority-request (selectively revealable to FIU/NCA/court). Facilitators MUST treat as informative metadata only.
Authorship
AlgoVoi (chopmob-cloud) submission. Spec text developed from working group discussion in #2326.
Relationship to other PRs
Additive to #2322 -- does not modify the evidenceType taxonomy. Closes the field-definition scope of #2326. Worked examples for evidenceType: cryptographic, privacy_class: attested-private (commitment-based screening) to follow in a subsequent PR.
IETF Internet-Draft:
draft-hopley-x402-compliance-receipt-00(Independent Submission, Informational, sole AlgoVoi authorship, live on IETF datatracker 2026-05-24)AlgoVoi (chopmob-cloud) - chopmob@gmail.com - Acquisition enquiries: https://docs.algovoi.co.uk/acquisition