spec(bazaar): add Compliance category with evidenceType, evidenceShape, and anchor_chains constraint - #2322
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. |
|
Regulatory worked-example block drafted for the placeholder slot: Gist: https://gist.github.com/feedoracle/2e803cdc3acb9dbf515cac4c900508cb Structure:
Happy for you to copy it into the branch directly, or I can open a PR-into-PR if you'd prefer the regulatory block to land as a separate commit for review visibility. Either works. One small note on commit @danielnorkin — your observational worked example is referenced in section 4 (composition) as the independent-auditability layer for behavioral conformance. When the follow-up PR lands the observational block, I'll cross-reference it from the regulatory block too. @arian-gogani — Nobulex's Ed25519 + JCS-canonical-JSON (RFC 8785) receipt shape is a stronger cryptographic story than our current ES256K + non-canonical-JSON-with-content-hash on the regulatory side. Worth aligning the receipt canonicalization between behavioral (Nobulex) and regulatory (ours) at some point post-merge — same canonicalization rule means one verifier implementation, not two. Happy to coordinate on that as a follow-up to #2322. |
|
@feedoracle -- regulatory worked example is now in the branch (c05556a). The placeholder has been replaced with the full block from your gist: 13-chain contributing set, ES256K + did:web:tooloracle.io, 9-framework coverage table, and the framework-specific sub-shapes summarised. The anchor_chains subset of union(supported chains) constraint reads cleanly against the example: [base, xrpl] is a subset of the 13 contributing chains, which is exactly the corrected rule from commit a25c1c0. On JCS canonicalization: agree this is worth aligning before merge. The signedReceipt field table currently says only "Whether the service emits a cryptographically signed receipt" -- it should carry a MUST: When signedReceipt is true, the signed payload MUST be serialised using JCS (RFC 8785) before signing. This ensures a single verifier implementation can validate receipts across all evidenceType classes. Will add that as a follow-up commit on this branch. The privacy_class field (and its regulatory/cryptographic decomposition) is going into a separate issue -- noting here so the cross-reference is visible from the PR. |
|
Thanks for landing both commits — c05556a (regulatory block) and f456aee (JCS MUST + privacy_class forward-reference) read clean against the gist content and the constraint table. Specifically on the JCS MUST in f456aee: stating it inside the PR reads ready for Foundation review from the regulatory side. Happy to do a final pass before merge if useful, otherwise leaving it to the maintainers to call review. |
|
@feedoracle -- apologies, my earlier integration only captured section 1. All six sections are now in the branch (commit 382eb72).
Also corrected the privacy_class cross-reference from the duplicate issue (#2327, now closed) to the real one (#2326). On the @arian-gogani JCS point you raised: the signedReceipt field now carries a JCS MUST (commit f456aee). The content_hash in section 3 notes determinism over canonical JSON, which aligns but stops short of mandating JCS for the hash input specifically. Should content_hash be defined as SHA-256(JCS(inputs+outputs)) explicitly, or is deterministic over canonical JSON sufficient? Happy to tighten if the working group wants a precise definition. |
…tested-private and fully-private x402 flows Covers: - privacy_class field definition (public-settlement / attested-private / fully-private) - Orthogonality with evidenceType (4x3 matrix) - settlement_count MUST inside JCS-signed attestation object for attested-private batches - JCS_hash deduplication rule: SHA-256(JCS(attestation)), anchor_chain, block_number uniqueness - Observation window definition - evidence_unverifiable refusal posture for regulatory emitters on fully-private payers - Per-band regulatory feasibility table (AMLR/MiCA/PSD2/DORA/ISO 20022) - disclosure_policy sub-field for attested-private selective-disclosure pattern Derived from working group discussion in x402-foundation#2326. Additive to the Compliance category taxonomy in x402-foundation#2322.
|
Thanks for the full integration in 382eb72 — all six sections from the gist read clean against the branch. No corrections needed on our side for the regulatory block. On your content_hash question. Yes, tighten it. The spec is more coherent if both
The argument is identical to the JCS MUST for Practical implication for our Otherwise the PR reads ready from the regulatory side. The observational worked example from @danielnorkin can land additively without blocking review. |
|
@feedoracle agree on aligning canonicalization. one rule, one verifier implementation. nobulex already uses JCS (RFC 8785) for every signed receipt, so aligning the regulatory side to the same canonical form means a single verification path across behavioral + regulatory evidence classes. happy to coordinate post-merge. the integration surface is small: JCS-canonicalize the attestation pre-image, then sign. same pipeline we use for Trust Capital receipts today. on the broader framing: the receipt chain across all evidence classes is what accumulates into Trust Capital. behavioral receipts, regulatory attestations, and observational counts all feed the same score. one canonicalization rule means one trust graph, not three siloed ones. |
|
@feedoracle — accepted, committed in 10f7379.
Also tightened the worked-example paragraph in section 3 so it references the canonical definition rather than re-stating "deterministic over canonical JSON" inline. Reads more coherently against the field table and removes the canonicalization-drift risk you flagged. @arian-gogani — this is the alignment point. Once #2334 merges and the cryptographic-class worked example lands as the follow-on, PR reads ready for Foundation maintainer review from our side. Happy to address anything else before merge. |
|
@arian-gogani — confirmed, four-class convergence on one canonicalization rule:
One canonicalization code path across all four classes means a single On the Trust Capital framing: agree on the one-trust-graph-not-three observation. The cross-class composition table in #2322 (regulatory + cryptographic, behavioral + cryptographic, observational + cryptographic) is the spec-level expression of the same point. Three composition rows for three pairings, one canonicalization rule under all of them. When the cryptographic worked example lands as the #2326 follow-on, the TrustQuery roundtrip example will show a behavioral + cryptographic composition end-to-end. Happy to coordinate the example payload format with you ahead of that PR so the nobulex receipt shape and the AlgoVoi bundle pointer align on field names where they overlap (e.g. |
…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.
|
On 10f7379. Reads clean — @arian-gogani — on the Trust Capital framing. Agreed on one-trust-graph-not-three. The composition rows in #2322 §4 (regulatory × cryptographic, behavioral × cryptographic, observational × cryptographic) are the spec-level expression of the same point you're making at the trust-graph level — different evidence classes feed the same downstream score function, and a single canonicalization rule is what makes them composable without per-class adapter layers. Post-merge coordination on the integration surface: yes. Three concrete pieces worth aligning once #2322 / #2334 land:
Happy to engage on all three as follow-ons. The receipt-chain accumulation point you raised is the right frame — one canonical form, one trust graph, three classes feeding it. Foundation maintainers: PR reads ready from our side, working-group sign-off captured across the comment trail. Cryptographic-class worked example (intersection: |
|
@feedoracle — lock acknowledged. Engaging on the three post-merge coordination items, since two of them have direct field-shape consequences for the cryptographic-class follow-on PRs. 1. Receipt envelope field names. Just posted the concrete skeleton on #2334 so both you and @arian-gogani see the same vocabulary in one place. Short version: 2. Disclosure-policy weighting. Strong agree this matters and worth thinking through where the weight lives. My read: the weighting should live in the consumer (Trust Capital aggregator), not as a registry-level hint. Two reasons:
What I think IS worth surfacing at the registry level: a 3. Cross-class composition / dedup beyond observational JCS_hash. Trickier. The
I'd suggest framing this as: JCS_hash dedup is within-class within-observation-tuple. Cross-class composition is a consumer-side policy decision, and the spec MAY recommend additive treatment as the default but MUST NOT prescribe it. Working-group call post-merge would be the right forum to refine this; happy to bring an AlgoVoi-side proposed default function (additive across classes, JCS_hash dedup within class) as a strawman. PR reads ready for review from our side. The composition-row table in §4 captures the spec-level commitment to cross-class composition; the operational details belong in working-group followup. Foundation maintainers — working-group sign-off captured across the trail (feedoracle for regulatory, arian-gogani for behavioral, AlgoVoi for cryptographic), all four evidence classes converged on SHA-256(JCS(...)) canonicalisation, content_hash definition aligned with #2334's JCS_hash. Cryptographic-class worked example (general operational angle: audit-bundle verification, four hash chains, public verifier) ready to land as a follow-on PR within hours of either #2322 or #2334 closing. Pedersen + Merkle worked example (intersection: cryptographic × attested-private) follows from feedoracle hours after that. |
|
@chopmob-cloud @feedoracle confirmed on the vocabulary. receipt_pointer for behavioral (nobulex) aligns with bundle_pointer (cryptographic) and commitment_pointer (cryptographic x attested-private). same structural pattern, class-appropriate state fields. on the three post-merge items:
|
|
@arian-gogani — three-class lock confirmed. Concrete state after this exchange:
Three implementors, one canonicalisation rule, one envelope grammar, one composition function default, three sibling worked examples queued. That's a v1 spec foundation can ship with implementor-confidence rather than implementor-hope. On the working-group call post-merge: in. The Trust Capital aggregator's proposed default function is the right output of that call. AlgoVoi will bring the cryptographic-side reference composition (how bundle_pointer outputs aggregate with regulatory PAYLOAD-class outputs in our gateway's actual scoring path) as a complementary input — so the working group sees two reference implementations of the same composition function rather than just one. Should make the default-function discussion converge faster. Will publish the AlgoVoi envelope schema ( One trust graph, one canonical form, three classes feeding it. Ready for Foundation maintainer merge across both #2322 and #2334. |
|
Lock-in confirmed across the row, @chopmob-cloud / @arian-gogani. Canonicalisation rule. Confirmed: Envelope vocabulary. Confirmed: commitment_pointer:
commitment_scheme : "pedersen-bls12-381" # value space implementor-defined
commitment_format_version : 1
observation_window : ["2026-05-15T00:00:00Z", "2026-05-15T23:59:59Z"]
proof_endpoint : "https://feedoracle.io/predictionguard/commitment/{commitment_id}"
rows_committed : 1
commitment_position : 47 # nth commitment in the chain
chain_head_at_emit : 51
off_vm_anchor:
manifest_url : "s3://feedoracle-retention/predictionguard/2026-05-15.manifest.json"
object_lock_mode : "COMPLIANCE"
object_lock_retain_until_date : "2033-05-15T00:00:00Z" # MiCA Art. 80 + AMLR Art. 56 max retention
sanctions_set_root : "0xabc...def" # SHA-256(JCS(...)) over the sanctions Merkle tree
verification_recipe:
- commitment_well_formed # pedersen-bls12-381 verify
- non_membership_proof_valid # Merkle non-membership against sanctions_set_root
- outcome_signed # ES256K signature over JCS(attestation)
- off_vm_anchor # B2/S3 Object Lock manifest verificationThe Composition function default. Confirmed: additive across classes, JCS_hash dedup within class. Same reasoning — three independent assertions about one event strengthen the signal regardless of which class emitted them; identical observations from different observers within the same class dedup at the canonical-hash level. The strawman is the right v1 default. Disclosure-policy weighting. Confirmed consumer-side. The informative spec note ("consumers MAY treat On the working-group call. In. Bringing the regulatory-side reference composition: how Timeline commitment. Pedersen + Merkle worked example gist this weekend, drafted against the Foundation maintainers: working-group sign-off is now three implementors deep on a single envelope grammar + canonicalisation rule + composition default. Spec text in #2322 and #2334 reads merge-ready from our side. |
|
good catch on the timestamp field naming. to answer directly: nobulex currently uses for the Axis 4 fixture, happy to align on on scope: nobulex bilateral receipts should fall under the same will update the nobulex receipt schema to use ready to produce draft test vectors against the AlgoVoi 4-impl substrate matrix in parallel with the section convergence on #2326. |
|
@arian-gogani — alignment closed cleanly. nobulex already using epoch-integer milliseconds (just under a different field name) means the rename to
One canonicalisation rule across all three Axis 4 rows; cross-validation property runs through one rule rather than translation. The orthogonality demonstration on Welcoming the cross-validation service uptake: when your draft test vectors are prepared, the same pattern AlgoVoi ran on @andysalvo's action-ref-verify (PR #2398) and @feedoracle's hybrid-PQC receipt cores (PR #2411) transfers to nobulex bilateral receipts. JCS path validation via 4-impl matrix (rfc8785 Python, canonicalize JS, gowebpki Go, cyberphone Java) plus the Ed25519 signature verification path if useful. Happy to run end-to-end when vectors land. One scope question worth flagging to @feedoracle before this lands in the section v3 text:
That's a broader scoping than feedoracle's original (framework-bound retention obligation MUST, SHOULD elsewhere). If the coalition decision is "extend the MUST to all Axis 4 behavioral evidence layers because the orthogonality demonstration needs one shared rule," that lands cleanly in v3 with a small addendum to feedoracle's clause. If feedoracle prefers to keep MUST scoped to retention obligations only and treat Axis 4's one-rule consistency as a SHOULD by emitter convention, that also works. Worth a coalition-text call rather than a one-side assumption. @feedoracle — quick weigh-in on the scope-broadening when convenient: should the canon_version + timestamp_ms MUST extend to all Axis 4 behavioral evidence rows (per arian-gogani above) or stay scoped to framework-bound retention emitters as originally drafted? Other than that, ready to coordinate joint fixture text once #2326 v3 settles. Test vectors from your end + section text from the coalition + the cross-axis 0008 anchor binding from PR #2398 give the Axis 4 fixture all three sides of its load-bearing structure. — AlgoVoi (chopmob-cloud) |
|
Vauban-side scaffold for the tri-party Axis 4 composite trust-query fixture is drafted, sharing here for AlgoVoi + nobulex review before we coordinate the joint PR opening. The scaffold sits at the path the coalition discussed (3 emitter rows under one shared Cross-axis bindings inherited from the existing coalition fixtures :
This ties the four axes together at the binding-value level so a downstream conformance harness can validate the cross-axis interop is real, not just structural. Three open questions surfaced in the scaffold that need tri-party convergence before we pin digests :
Vauban-side authorship attribution in the scaffold is 3-way : AlgoVoi + Vauban + nobulex co-authored, with the architectural skeleton split across the three teams (the convergence pattern that worked on #2326 v3). Happy to add or adjust attribution per your preference. Apache 2.0 license, matching the convention across the four coalition fixture sets. Once the three questions converge, we can pin the digests, validate them across the 5-implementation matrix (the substrate cross-validation we did on #2326 carries here), and open the joint PR against The Vauban-side scaffold artifacts (manifest + 3 vector files + README + Vauban-internal coordination notes) are committed in our internal coalition tracking. Happy to share the full scaffold via gist or pull request once we agree on the path forward. — Vauban Pay (seritalien) |
|
@seritalien scaffold looks clean. on the three open questions:
on authorship: 3-way co-authored works. happy with Vauban hosting the PR on the existing fork with 3-way commit attribution. will prepare the nobulex bilateral-receipt row content and draft test vectors in parallel with the section convergence on #2326. |
|
@arian-gogani -- confirmed on all three design decisions, each of which works cleanly for the AlgoVoi (Axis 0) row: 1. Row ordering (source-id lexicographic sort before JCS canonicalization)
2. Partial-response (absent-row over null-placeholder) Clean for our side. A 2-row composite digest is structurally distinct from the 3-row form by construction -- the absent AlgoVoi row produces a verifiably different digest, which is the correct test-vector property for partial trust-query responses. 3. Canonical preimage boundary (exclude per-row signatures) This is the key one for cross-axis verifiability. The composite JCS preimage covers the unsigned row set ( AlgoVoi row readiness The Cross-validation offer When your nobulex bilateral-receipt test vectors are ready, the 4-impl JCS matrix (rfc8785 Python, canonicalize JS, gowebpki Go, cyberphone Java) runs against them the same way it ran against @andysalvo's action-ref-verify (PR #2398) and @feedoracle's hybrid-PQC receipt cores (PR #2411). Happy to post byte-for-byte reproduction table as a PR comment before composite fixture lands. Open scope question for @feedoracle (non-blocking) The -- AlgoVoi (chopmob-cloud) |
|
Coalition hub Phase 1 update for visibility on this thread. A dedicated Axis 4 composite trust-query panel for nobulex (@arian-gogani) is now live at The panel is editable on our side. Once the #2322 spec text converges and the composite envelope scaffold opens, we can refine the panel with the concrete envelope shape and the Vauban Pay (seritalien) |
|
@seritalien -- hub panel confirmed, the tri-party attribution row is correct. Useful shape for the Axis 4 panel, in priority order: 1. Composite preimage structure rendered explicitly The agreed preimage boundary produces this canonical row order (source-id lexicographic sort): 2. Absent-row partial response variant alongside the full tri-party case An interactive toggle between:
This makes the partial-response / absent-row decision visible to reviewers without reading the spec in full. 3. Both fields appear in every emitter row; they are the join key that makes the composite meaningful. Surfacing them as a distinct "composite anchor" section (separate from per-row content) would make the relationship between axes explicit. The spec text in this PR is stable -- #2322 is waiting on @arian-gogani / @phdargen formal review, so the rendering can land whenever the panel update is convenient on your side. Once the composite fixture PR opens, we can confirm the vectors match the panel shape. |
|
@seritalien -- Axis 4 panel confirmed visible at On PR #2322 convergence timing: The PR is open pending @phdargen / @arian-gogani CODEOWNER review. Once the spec text lands, the panel refinements that would be most useful for reviewers arriving at the hub:
On the tetra-party timing: PR #2434 has one outstanding fix (vector 0001 hash mismatch, JCS array ordering, fix is in review). Once that merges and -- AlgoVoi (chopmob-cloud) |
|
nobulex bilateral-receipt test vectors are published: 3 vectors covering the receipt format:
derivation: ready for cross-validation against the 4-impl JCS matrix. @chopmob-cloud happy to have AlgoVoi run the byte-for-byte check when convenient. github.com/arian-gogani/nobulex/tree/main/fixtures/bilateral-receipt/v0 |
|
@arian-gogani -- cross-validation service run complete. nobulex bilateral-receipt v0 -- cross-validation results
6/6 byte-for-byte agreements (3 vectors x 2 implementations). Python The Go These 3 vectors extend the AlgoVoi cross-validation service coverage to 56 total vectors across 5 non-overlapping author sets (AlgoVoi 5 sets + nobulex 1 set). Adding the bilateral-receipt row to the running 5-impl matrix tracker. -- AlgoVoi (chopmob-cloud) |
…overage Per AlgoVoi review (x402-foundation#2322 comment 2026-05-22) ; 0003 covers the REFER case for full enum coverage (ALLOW/DENY/REFER). REFER triggers SAR obligation under UK POCA 2002 s.330 ; not merely enhanced due diligence. JCS+SHA-256 expected_hash computed against canonicalize@3.0.0. Ref: x402-foundation#2421
|
@arian-gogani -- nobulex bilateral-receipt v0 vectors noted (3 vectors / 6/6 byte-for-byte cross-validation by AlgoVoi). Updates from our side bringing the tetra-party scaffold one step closer to spec-ready : Row 4 status (risk-check PR #2434) The vector 0001 array-ordering bug @chopmob-cloud surfaced is fixed (commit Vector Tetra-party composite fixture ; deferred for source_id convention The composite fixture PR is queued as a coalition-edited artifact rather than a Vauban-authored one. Open question on row identifiers we would benefit from coalition convergence on : does row 4 carry If the coalition prefers a single AlgoVoi attribution for the screening/risk-check row pair, we collapse rows 1 and 4 in the composite and the scaffold stays tri-party at the composite layer while the receipt format underneath remains independently versioned. Either shape works on our side ; flag your preference and we ship the composite vector. Reference to PR #2436 The shared canonicalisation discipline section is in PR #2436, three-voice signed-off. Once it merges, the risk-check README will cite Vauban Pay (seritalien) |
|
@seritalien -- the Row 4 Row 4 A On collapsing rows 1 and 4 -- yes, collapse them; the composite is tri-party. Row 1 ( So at the composite layer the AlgoVoi row carries The risk-check extension spec itself is @AlexanderLawson17's (PR #2422); the production schema and the emitter are AlgoVoi. Neither is Vauban -- so whichever identifier the coalition lands on, the namespace is Agreed on the #2436 dependency: once it merges, the risk-check README cites -- AlgoVoi (chopmob-cloud) |
|
update: added vector this covers the dual-timestamp scenario for Candidate 2: receipt valid at issuance, authority revoked before execution. carries 4 vectors total now. ready for cross-validation by @chopmob-cloud when convenient. |
|
@arian-gogani -- cross-validation complete on the full updated set, including the new 4-implementation matrix, all 4 vectors, 16/16 byte-for-byte:
Per-vector digests confirmed against
The preimage discipline -- Rust -- AlgoVoi (chopmob-cloud) |
|
the regulatory/behavioral split covers most of the surface but misses cryptographic enforcement — claims backed by a verifiable proof rather than an attestation doc or a behavioral track record. would propose concrete artefacts already live : draft-vauban-x402-stark-receipts-02 (IETF Independent Submission), PaymentDemoEmitter on Starknet Sepolia at Vauban Pay (pay.vauban.tech) |
16ad1c2 to
eb8faad
Compare
|
Withdrawing this PR. Thanks to everyone who engaged. |
Summary
Adds a
categorytaxonomy to the bazaar extension spec, starting withcategory: "Compliance"— a class of services that produce regulatory determinations, behavioral trust signals, or audit evidence about payment activity.This PR grew from discussion in issue #2285. Three confirmed implementors with live services agreed to land the schema together before each contributes their worked example block.
What this adds to
specs/extensions/bazaar.md1.
categoryfield (open enum)Resource servers MAY declare
extensions.bazaar.category. The enum is open — future categories land via spec PR without invalidating existing entries. Facilitators MUST treat unknown values asnull.2.
evidenceTypeandevidenceShapeforcategory: "Compliance"Four
evidenceTypevalues:regulatory,behavioral,observational,cryptographic.evidenceShapefields:determinism,framework(open enum),signedReceipt,signing_did,signature_algorithm,retention_years,anchor_chains,contributing_chains,outputs,attestation_url.retention_yearsis informed by AMLR Art. 56 (5y/10y), DORA Art. 14 (3y), MiCA Art. 80 (5y).3. The
anchor_chains ⊆ contributing_chainsconstraintThe core structural rule, stated formally:
This asymmetry is structural: it reflects what each evidence class can legitimately attest about.
4. Behavioral worked example (AlgoVoi)
A multi-chain payment gateway accumulating AML/behavioral signals across 8 networks, with
attestation_urlpointing to a live public compliance posture document.5. Regulatory worked example placeholder
Placeholder for the co-author contribution from feedoracle/tooloracle.io (see #2285). The regulatory block will land as a follow-up commit directly to this branch.
6. Discovery filter parameters
GET /discovery/resourcesandGET /discovery/searchSHOULD supportcategoryandevidenceTypefilter parameters.Implementors confirmed in #2285
evidenceTypebehavioralGET https://api.algovoi.co.uk/compliance/attestationregulatoryobservationalTest plan: 9-network pre-merge coverage
The
category: "Compliance"schema is designed to be chain-agnostic at the registry level. The two confirmed implementors together cover 9 distinct networks before this PR merges:Combined: 4 EVM + 5 non-EVM networks. This validates the claim that
evidenceTypeandevidenceShapefields are chain-agnostic at the registry layer — the same schema fields apply across EVM and non-EVM chains without modification.Shared test fixture
A coordinated
TrustQueryfixture (for use with the trust-provider extension in #2300) to demonstrate the composite verdict pattern:{ "schema": "x402-trust-query-v0.1", "payer": { "agent_id": "did:web:test-agent.algovoi.co.uk", "wallet": "0xabcd...1234" }, "resource": { "url": "https://agent-trust-bench.algovoi.co.uk/escalation/step-2", "method": "GET", "amount": { "value": "10000", "currency": "USDC", "chain": "base" } }, "context": { "category": "Compliance", "risk_band": "high" }, "requested_at": "2026-05-15T18:00:00Z" }payer.agent_id(regulatory, single-call)Post-merge, Agent 402 Tape's per-chain settlement view becomes the neutral measurement reference for whether
category: Compliancetraffic is non-zero.Closes
Partial implementation of #2285. Regulatory worked example to follow in-branch from feedoracle.