| Internet-Draft | ADRP | April 2026 |
| stone | Expires 27 October 2026 | [Page] |
This document defines the Agent Dispute Resolution Protocol (ADRP), a wire protocol and state machine for resolving disputes that arise from cryptographically-attested agent-to-agent (A2A) transactions. ADRP is the companion specification to ATXN (draft-stone-atxn-00), which defines what an A2A transaction is. ADRP defines what happens when a party contests one.¶
ADRP severs an equivalence that every prior agentic commerce design has implicitly assumed: that a valid cryptographic proof bundle equals contractual satisfaction. It does not. Conduit-style cryptographic verifiers prove that an agent took specified actions; they do not prove that those actions satisfied the principal's Intent Mandate. ADRP bifurcates disputes into a cryptographic class (resolvable by code from the proof bundle and mandate chain) and a semantic class (resolvable only against pre-committed machine-readable acceptance criteria, with arbitration escalation when those criteria are absent or under-specified).¶
ADRP introduces the Arbitration Mandate as a fourth element of the AP2 mandate chain (Intent / Cart / Payment / Arbitration), pre-signed by the principal at agent-deployment time. The Arbitration Mandate is the FAA Section 2-compliant written agreement that anchors the entire protocol legally without statutory change.¶
ADRP defines a counter-attestation override pattern in which a signed RulingBundle supersedes a Conduit ProofBundle by a signing-time precedence rule rather than by mutation. Both the original attestation and the override are preserved forever in the hash chain; "override" is a verification-time computation, not a write.¶
Companion specifications (all co-submitted as Internet-Drafts, work in progress):¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 27 October 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
Conduit and similar cryptographic browser-automation verifiers produce SHA-256 hash-chained audit trails of agent task delivery. The proof bundles they produce are self-verifiable: any third party can replay the chain and confirm the recorded events occurred in the recorded order with the recorded signatures.¶
This is necessary but not sufficient.¶
A proof bundle attests that an agent took actions X, Y, and Z. It does not attest that X, Y, and Z satisfied the principal's Intent Mandate. Empirical data from Kleros (~40% of decentralized arbitration cases turn on spec ambiguity, not on whether action occurred) and from Upwork, Stripe Connect, and eBay (auto-resolve ceilings of 60-95% with all systems hitting walls below 95%) demonstrates that cryptographic proof of execution does not eliminate disputes — it relocates them to spec interpretation.¶
ADRP addresses the relocated dispute surface without breaking the cryptographic substrate.¶
A five-layer protocol stacked on the existing Conduit + AP2 + ATXN stack:¶
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174].¶
H_c throughout this document.¶
verify_resolution.¶
verify_resolution. Consumed by the AP2 Payment Mandate
executor (or VCAP escrow rail) to release, refund, or split funds.¶
TRUSTED_REGISTRIES. v0.1 mechanism.¶
Terms imported from ATXN (draft-stone-atxn-00): Bundle (the five-element ATXN primitive, ATXN Section 3), Standing Token (ATXN Section 4), Tier (L1/L2/L3, ATXN Section 5), Principal, Agent, Operator, Mandate Framework, Commitment Event, Revocation Beacon (all ATXN Section 2).¶
ADRP sits on top of the following existing layers:¶
+--------------------------------------+ | ADRP (this spec) | | - Arbitration Mandate | | - DisputeFlag / DisputeFiling | | - RulingBundle (counter-attestation) | | - EscrowDirective | +--------------------------------------+ | ATXN (draft-stone-atxn-00) | | - Bundle (5 elements) | | - Standing Token | | - Tier / Profile | +--------------------------------------+ | AP2 / ACP / TAP / x402 | | - Intent / Cart / Payment Mandates | +--------------------------------------+ | Conduit / AIVS | | - SHA-256 hash-chained ProofBundles | | - Ed25519 signatures | +--------------------------------------+¶
A dispute is the transition of an ATXN Bundle from delivered to
disputed (per ATXN Section 8). ADRP defines what happens after that
transition.¶
The Arbitration Mandate is the FAA Section 2 / NY Convention written, consensual arbitration agreement that makes ADRP enforceable without statutory change.¶
| Field | Type | Description |
|---|---|---|
arb_mandate_id
|
UUID | Unique identifier |
principal_did
|
DID | Principal's DID |
arbitrator_pool_ref
|
URI | Reference to the curated arbitrator pool (v0.1) |
governing_law
|
String | E.g., "FAA + Delaware seat" |
fee_schedule_ref
|
URI | Reference to filing fee schedule |
tier_thresholds
|
Object | L1/L2/L3 transaction-value boundaries |
appeal_panel_size
|
Integer | Default 5 |
language_of_proceedings
|
ISO 639-1 | Default "en" |
principal_signature
|
Ed25519 base64 | Principal's signature over canonical JSON |
The Arbitration Mandate's SHA-256 hash MUST be referenced in the
principal's Standing Token (per ATXN Section 4) under a new field
arb_mandate_hash. A Standing Token without an anchored Arbitration Mandate
hash MUST NOT participate in an L2 or L3 ATXN Bundle.¶
The Arbitration Mandate MAY be replaced by the principal at any time, but the replacement MUST NOT apply retroactively to in-flight Bundles.¶
The parties to any ADRP dispute are always principal-A and principal-B. Never agents. This preserves the A2A executor-not-party model from UETA Section 14 and Restatement (Third) of Agency.¶
Agents MAY emit DisputeFlags — advisory, low-cost (1 KB JSON max), signed by the agent's Standing Token. A DisputeFlag is non-binding and does not initiate the dispute state machine.¶
Only principals MAY emit DisputeFilings — binding, fee-posting, claim-coded events that initiate the dispute state machine.¶
| Tier | Ratification Window |
|---|---|
| L1 | N/A (no dispute) |
| L2 | 72h |
| L3 | 14d |
After expiration, the flag is preserved in the audit log but cannot anchor a DisputeFiling.¶
Resolved by code from (DisputeBundle, RulingBundle, Standing Token chain) without arbitration.¶
| Code | Description |
|---|---|
bundle_integrity
|
SHA-256 chain breaks; signature verification fails |
mandate_scope
|
Agent acted outside Cart Mandate scope (deterministic predicate) |
token_authority
|
Standing Token revoked or expired pre-execution |
timestamp_skew
|
Attestation timestamps violate ordering invariants |
oracle_contradiction
|
Third-party oracle data contradicts attestation |
A cryptographic-class dispute MUST NOT be routed to arbitration.¶
Resolved by arbitration against the Cart Mandate's acceptance criteria.¶
| Code | Description |
|---|---|
quality_mismatch
|
Deliverable doesn't satisfy acceptance_criteria.checks
|
spec_ambiguity
|
Acceptance criteria absent, under-specified, or contradictory |
timing_breach
|
SLA missed |
fitness_for_purpose
|
Deliverable formally compliant but unfit for principal's purpose |
The DisputeFiling's claim_code field declares the class. ADRP verifiers
MUST validate that the declared class matches the evidence.¶
ATXN (Section 10.3) defines a dispute_class field set at Bundle handoff.
The normative mapping is:¶
| ATXN dispute_class | ADRP Claim Code(s) | ADRP Class |
|---|---|---|
fact_dispute
|
bundle_integrity, timestamp_skew,
oracle_contradiction
|
Cryptographic |
terms_dispute
|
mandate_scope, quality_mismatch,
spec_ambiguity, timing_breach,
fitness_for_purpose
|
Semantic |
capacity_dispute
|
out of scope — see Section 6.5 | — |
framework_dispute
|
out of scope — see Section 6.5 | — |
When a DisputeFiling arrives with an ATXN dispute_class, the ADRP
verifier MUST map it to the corresponding claim_code bucket
using this table before routing.¶
| Class | Reason | Disposition |
|---|---|---|
capacity_dispute
|
Principal-level adjudication; agent action set aside entirely | Bypass ADRP entirely; executing platform MUST freeze settlement and refund-to-buyer; route to regulatory or Principal-level forum outside ADRP |
framework_dispute
|
Mandate framework validity contested | Bypass ADRP entirely; executing platform MUST freeze settlement; ADRP MUST NOT process until upstream framework forum resolves validity |
| Cross-border consumer disputes | Reg E / PSD2 / GDPR overlap not yet resolved | Defer to v0.2 |
The Conduit ProofBundle's tip hash H_c is never modified. No byte of the
original ProofBundle is rewritten. Override is a verification-time precedence rule,
not a mutation.¶
R = {
type: "RulingBundle",
supersedes: H_c,
dispute_chain_tip: H_d,
verdict: "release" | "refund" | "partial",
partial_split: { to_buyer: 0.30, to_seller: 0.70 },
rationale_hash: H_rationale,
arbitrator_did: "did:web:...",
arbitrator_vc_hash: H_vc,
signing_time: "<RFC3339>",
prev_hash: H_d
}
sig = Ed25519(arbitrator_priv, JCS(R))
¶
The latest valid RulingBundle (by signing_time) whose
supersedes equals the underlying ProofBundle's tip hash AND whose signing
arbitrator was authorized at signing_time, with chain integrity verified,
is the verification winner.¶
Hash-chain immutability is preserved. Verification is offline and deterministic.
Arbitrator authority is anchored to signing_time. The chain becomes a
precedent corpus indexed by Cart Mandate template hash.¶
| Number | Type | Emitter | Purpose |
|---|---|---|---|
| 1 | DisputeFlag | Agent | Advisory anomaly notification (non-binding) |
| 2 | DisputeFiling | Principal | Binding dispute initiation; posts filing fee |
| 3 | EvidenceSubmission | Either party | Hash-chained artifact append |
| 4 | ArbitratorAssignment | Registry | Binds arbitrator DID to dispute |
| 5 | RulingBundle | Arbitrator | Signed verdict + escrow directive |
| 6 | EscrowDirective | Verifier (derived) | Consumed by AP2 Payment Mandate or VCAP rail |
{
"msg_type": "<one of the six>",
"msg_id": "<UUID>",
"prev_hash": "<SHA-256 of prior chain event>",
"submitter_did": "<DID>",
"submitter_signature": "<Ed25519 base64 over JCS of preceding fields>",
"timestamp": "<RFC3339>",
"payload": { ... type-specific ... }
}
¶
All signatures MUST be over the JCS ([RFC8785]) canonicalization of the signed object minus the signature field itself.¶
Pre-FILED: FLAGGED (agent-emitted; expires if not ratified)
FILED (principal-emitted; fee posted)
|
v
ASSIGNED (arbitrator bound to dispute)
|
v
EVIDENCE_OPEN (parties submit evidence)
|
v
UNDER_REVIEW (arbitrator deliberating)
|
v
RULED (RulingBundle signed)
|
v
SETTLED (EscrowDirective consumed by payment rail)
Terminal: WITHDRAWN (filer withdraws; fee partial-refunded)
EXPIRED (filing or evidence window expired)
¶
The ADRP internal state machine is entered from ATXN's
disputed state. The normative join points are:¶
disputed → ADRP FLAGGED: agent-emitted DisputeFlag
(advisory; principal must ratify within tier window to proceed)¶
disputed → ADRP FILED: principal-emitted DisputeFiling
(skips FLAGGED)¶
RULED + ADRP SETTLED → ATXN adjudicated then
finalized: EscrowDirective consumed by payment rail¶
WITHDRAWN or EXPIRED → ATXN finalized: dispute
resolved without ruling; escrow released per Profile default¶
| ID | Invariant |
|---|---|
| I1 |
PaymentMandate.escrow_state == HOLD until SETTLED, WITHDRAWN, or
EXPIRED |
| I2 | No state mutates a prior attestation; transitions are new signed events |
| I3 |
prev_hash of every event = SHA-256 of canonical-JSON of the
immediately prior event |
| I4 |
dispute_chain[0].prev_hash == ProofBundle.tip_hash
|
| I5 | Only an arbitrator authorized by the Arbitration Mandate's pool may emit RulingBundle |
| I6 | EscrowDirective MUST be derivable from (DisputeBundle,
RulingBundle) by verify_resolution
|
| Parameter | L1 | L2 | L3 |
|---|---|---|---|
| Dispute window | 0 (atomic) | 72h | 14d |
| Filing fee | N/A | 10% of value, $1-$100 | 10% of value, $50-$1,000 |
| Arbitrator SLA | N/A | 4h | 24h |
| Arbitrator pool | N/A | Curated AI panel (3 of 5) | Curated human pool (3 of 5) + optional legal review |
| Override threshold | N/A | 4-of-5 supermajority | 4-of-5 supermajority |
| Max txn auto-arb | unlimited | $1,000 | unlimited |
| Default if SLA missed | N/A | refund-to-buyer | refund-to-buyer |
| Frivolous slash | N/A | 100% fee forfeited | 100% fee forfeited |
| Novel-but-lost slash | N/A | 50% fee forfeited | 50% fee forfeited |
| Appeal window | N/A | 12h | 48h |
| Appeal panel | N/A | 5 (up from 3) | 5 + legal review |
| Appeal quorum | N/A | 4 of 5 | 4 of 5 |
| Escrow hold | 0 | 7 days | 21 days |
| Evidence file size cap | N/A | 10 MB total, max 20 files | 10 MB total, max 20 files |
Tier is determined by the ATXN Bundle's Tier (per ATXN Section 5) AND by the
transaction value relative to the max_txn_auto_arb ceiling. A Bundle
declared L2 with transaction value greater than $1,000 MUST
auto-escalate to L3 dispute processing. This is a dispute-processing escalation rule
only and does not retroactively change the Bundle's declared formation Tier (see ATXN
Section 5.2).¶
If the arbitrator pool fails to produce a RulingBundle within the SLA, the dispute MUST default to refund-to-buyer.¶
The Cart Mandate MUST contain:¶
{
"acceptance_criteria": {
"schema_version": "1",
"checks": [
{ "type": "regex", "selector": "$.output", "pattern": "..." },
{ "type": "json_schema", "selector": "$.deliverable", "schema": { ... } },
{ "type": "deterministic_function", "function_hash": "sha256:..." },
{ "type": "human_review_required", "reason": "..." }
],
"default_window_hours": 72,
"silence_equals": "release"
}
}
¶
| Type | Evaluation |
|---|---|
regex
|
Deterministic regex match against JSON-path selector |
json_schema
|
JSON Schema validation against selector |
deterministic_function
|
Pure function (referenced by hash, fetched from registry) executed against deliverable |
human_review_required
|
Auto-routes to arbitration; flags spec as deliberately not auto-evaluable |
Conduit attests against acceptance_criteria.checks at delivery time. If
all checks pass deterministically, the dispute path auto-resolves cryptographically.
If checks include human_review_required OR are missing, dispute auto-routes
to L2 semantic arbitration.¶
v0.1 ships with a SwarmSync-curated arbitrator pool — a centralized list of vetted
human-or-model arbitrators registered as DIDs in TRUSTED_REGISTRIES.¶
Arbitrator selection MUST use a verifiable random function (VRF) seeded by the DisputeFiling's hash.¶
| Tier | Pool Composition |
|---|---|
| L2 | AI arbitrator panels (model + curated checker) |
| L3 | Human arbitrators (vetted, jurisdictionally-licensed where relevant) + optional legal review |
Every arbitrator MUST hold a Verifiable Credential that names the
arbitrator's DID, states valid_from and valid_until timestamps,
names qualifications, and is signed by a registry in TRUSTED_REGISTRIES.¶
Decentralized stake-weighted arbitrator pools are deferred to v0.2.¶
| Parameter | Value |
|---|---|
| Fee rate | 10% of transaction value |
| Floor | $1 (L2) / $50 (L3) |
| Ceiling | $100 (L2) / $1,000 (L3) |
| Denomination | USD (fiat or USDC stablecoin) |
| Refund | To prevailing party only |
The fee is non-refundable to the filer, non-transferable, and denominated in USD. It yields no return. It is not a security under Howey.¶
| Outcome | Filer's Fee |
|---|---|
| Filer prevails | 100% refunded |
| Filer loses; novel evidence | 50% forfeited |
| Filer loses; frivolous | 100% forfeited |
| Filer withdraws before EVIDENCE_OPEN | 75% refunded |
| Filer withdraws after EVIDENCE_OPEN | 25% refunded |
Forfeited fees MAY fund the arbitrator pool and a public dispute-quality dataset.¶
Arbitrators are compensated 2% of transaction value (min $0.50) from the losing party's escrow.¶
Either party MAY file an appeal within the tier-specific appeal window (12h L2, 48h L3). Appeals require a fresh filing fee at 1.5x the original rate.¶
A 5-arbitrator panel selected via VRF from a different pool slice than the original ruling. Quorum: 4 of 5.¶
An appeal RulingBundle supersedes the original RulingBundle by the same signing-time precedence rule (Section 7.3). Both are preserved forever.¶
Every signed RulingBundle is content-addressed and indexed by: Cart Mandate
template hash; dispute claim_code; verdict; arbitrator DID; signing
time.¶
Future arbitrators MUST query the precedent corpus for prior rulings on similar Cart Mandate templates and either cite or distinguish them.¶
v0.1 ships the data layer. v0.2 ships the search and citation infrastructure.¶
def verify_resolution(db: DisputeBundle, rb: RulingBundle) -> Result:
# 1. Anchor checks
assert db.conduit_proof_ref == rb.supersedes
assert rb.prev_hash == db.chain_tip
# 2. Chain integrity
h = db.conduit_proof_ref
for ev in [db.filing, *db.evidence_chain, db.arbitrator_assignment]:
assert ev.prev_hash == h
assert verify_sig(ev.submitter_did, ev.sig, jcs(ev))
h = sha256(jcs(ev))
assert h == db.chain_tip
# 3. Arbitrator authority at signing_time (not now)
vc = fetch_vc(rb.arbitrator_vc_hash)
assert vc.subject == rb.arbitrator_did
assert vc.issuer in TRUSTED_REGISTRIES
assert vc.valid_from <= rb.signing_time <= vc.valid_until
assert verify_sig(vc.issuer, vc.sig, jcs(vc))
# 4. Ruling signature
assert verify_sig(rb.arbitrator_did, rb.sig, jcs(rb_minus_sig))
# 5. Verdict well-formed
assert rb.verdict in {"release", "refund", "partial"}
if rb.verdict == "partial":
assert sum(rb.partial_split.values()) == 1.0
# 6. Derive directive
return Result(valid=True, escrow_directive=EscrowDirective(
payment_mandate_ref=db.payment_mandate_ref,
action=rb.verdict,
split=rb.partial_split,
ruling_ref=sha256(jcs(rb))
))
¶
Two honest verifiers given the same inputs MUST reach the same EscrowDirective.¶
verify_resolution MUST NOT require network access except
to fetch the arbitrator's Verifiable Credential by hash.¶
A conformant ADRP v0.1 SDK MUST expose at minimum six methods, implementable in 500 LOC total:¶
emit_flag(agent_standing_token, claim_code, evidence_ref) -> DisputeFlag
file_dispute(payment_mandate, claim_code, claim_detail, flag_ref) -> DisputeBundle
submit_evidence(dispute_id, artifact_bytes, mime_type) -> EvidenceLink
query_status(dispute_id) -> {state, chain_tip, latest_event}
render_ruling(dispute_id, verdict, partial_split, rationale) -> RulingBundle # arbitrator-only
verify_resolution(dispute_bundle, ruling_bundle) -> {valid, escrow_directive}
¶
An appeal is file_dispute with the prior_ruling_ref field
set.¶
| Number | Case | Expected Behavior |
|---|---|---|
| 1 |
clear_release
|
No flag, no filing, window expires → release |
| 2 |
clear_refund
|
DisputeFiling with valid bundle_integrity claim → refund |
| 3 |
partial_split
|
Semantic dispute, partial_split: {to_buyer: 0.30, to_seller: 0.70} |
| 4 |
attestation_override
|
Original ProofBundle preserved; latest valid RulingBundle wins |
| 5 |
frivolous_dispute
|
Filer loses without novel evidence → 100% fee forfeited |
| 6 |
malicious_requester_reject
|
Principal-A files invalid claim → fee forfeited, escrow releases to seller |
| 7 |
expired_dispute
|
DisputeFiling outside tier window → EXPIRED |
| 8 |
flag_ratification
|
DisputeFlag emitted, principal files within window → promoted |
| 9 |
flag_expiration
|
DisputeFlag emitted, no action within window → preserved but cannot anchor filing |
| 10 |
appeal_supersedes
|
Appeal RulingBundle supersedes original by signing-time precedence |
| Lock | Reason |
|---|---|
| US-only B2B | No consumer / cross-border / Reg E / PSD2 / GDPR overlap |
| Partnered custody | No SwarmSync-held escrow; relies on Stripe Connect, Bridge, Modern Treasury, or equivalent |
| Curated arbitrator pool | No token-staked decentralized pool (Howey) |
| Filing fee, not stake | Non-refundable, non-transferable, USD-denominated |
| Reputation logged but not modulating | Avoids bootstrap-circular trust dependency in v0.1 |
| Per-principal preference model deferred | Data collection pipeline ships in v0.1; productized search ships in v0.2 |
The greater than 90% auto-resolution target is a deployment-conditional target,
not a protocol property. Empirical base rates (Kleros, eBay, Upwork, Mechanical Turk)
cap auto-resolution at 60-95%. Implementations MUST: ship a normative
NLP-to-checks authoring helper; run a 90-day shadow-mode pilot before GA; measure
check-coverage and auto-resolution rate as primary metrics; pivot to mandatory
human_review_required flag if check coverage is less than 30% at day
30.¶
Adversaries will probe the seam between cryptographic-class and semantic-class disputes. The classification validation in Section 6.3 is REQUIRED.¶
A 4-of-5 threshold is compromisable via collusion of 4 arbitrators. Mitigations: diversify the curated pool across non-correlated risk profiles; monitor for arbitrator-pair correlation in rulings; periodically audit a random sample of rulings.¶
Mitigations: per-principal rate limit (max 0.5% of rolling 30-day transaction count); frivolous slash; account suspension after N frivolous filings.¶
A revoked Standing Token MUST NOT anchor a new DisputeFiling.¶
Mitigations: threshold-signature timestamps for L2 and L3 rulings (3-of-5 from a
federated timestamping authority); reject rulings with signing_time more than
5 minutes in the future.¶
Implementations SHOULD seek a written legal opinion in the deployment jurisdiction before relying on the Arbitration Mandate to defeat a court filing.¶
Every party receiving funds via an EscrowDirective MUST be screened against OFAC and equivalent sanctions lists.¶
If a principal's capacity attestation expires or is revoked mid-dispute, the
dispute MUST be halted and routed to a capacity_dispute,
defaulting to refund-to-buyer.¶
URI: https://swarmsync.ai/spec/adrp/v1¶
A new IANA registry "ADRP Claim Codes" is requested. Registration policy: Specification Required (per [RFC8126]).¶
Initial entries:¶
| Code | Class | Description |
|---|---|---|
bundle_integrity
|
cryptographic | SHA-256 chain breaks; signature verification fails |
mandate_scope
|
cryptographic | Agent acted outside Cart Mandate scope |
token_authority
|
cryptographic | Standing Token revoked or expired pre-execution |
timestamp_skew
|
cryptographic | Attestation timestamps violate ordering invariants |
oracle_contradiction
|
cryptographic | Third-party oracle data contradicts attestation |
quality_mismatch
|
semantic | Deliverable doesn't satisfy acceptance_criteria.checks |
spec_ambiguity
|
semantic | Acceptance criteria absent or under-specified |
timing_breach
|
semantic | SLA missed |
fitness_for_purpose
|
semantic | Deliverable formally compliant but unfit |
A new IANA registry "ADRP Verdicts" is requested.¶
| Value | Description |
|---|---|
release
|
Funds released to seller (counterparty) |
refund
|
Funds returned to buyer (filer) |
partial
|
Funds split per partial_split (must sum to 1.0) |
A new IANA registry "ADRP Trusted Arbitrator Registries" is requested.¶
This specification synthesizes the output of the Ultimate Brainstorm v2.2 Agent Dispute Resolution Protocol session (2026-04-25). The author thanks: EpistemicAuditor (cryptographic/semantic bifurcation); Archaeologist (empirical base-rate floor); Quantifier (tier parameters); ConstraintCartographer (Arbitration Mandate as FAA anchor; v0.1 scope locks); socratic-mentor (principal-only standing); DarkMirror (flag/file distinction); IdeaMatrix (tiered hybrid architecture); RemixForge (Cart Mandate acceptance_criteria); SoSpec (wire protocol, state machine, SDK surface, verify_resolution algorithm); SpiderSpark (three-tier bonded-escalation structure).¶
Three formal dissents: Archaeologist assigns less than 40% probability to the greater than 90% auto-resolution target. EpistemicAuditor assigns 25% probability to median Cart Mandates having sufficient acceptance_criteria coverage. RemixForge considers deferring per-principal preference model to v0.2 a 70%-probability strategic mistake.¶
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://swarmsync.ai/spec/adrp/v1/dispute-filing.schema.json",
"title": "DisputeFiling",
"type": "object",
"required": [
"msg_type", "msg_id", "prev_hash", "submitter_did",
"submitter_signature", "timestamp", "payload"
],
"properties": {
"msg_type": { "const": "DisputeFiling" },
"msg_id": { "type": "string", "format": "uuid" },
"prev_hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"submitter_did": { "type": "string" },
"submitter_signature": { "type": "string" },
"timestamp": { "type": "string", "format": "date-time" },
"payload": {
"type": "object",
"required": [
"payment_mandate_ref", "claim_code", "claim_detail", "filing_fee"
],
"properties": {
"payment_mandate_ref": { "type": "string" },
"claim_code": { "type": "string" },
"claim_detail": { "type": "string", "maxLength": 4096 },
"flag_ref": { "type": "string" },
"prior_ruling_ref": { "type": "string" },
"filing_fee": {
"type": "object",
"required": ["amount", "currency", "transaction_id"],
"properties": {
"amount": { "type": "number", "minimum": 1, "maximum": 1000 },
"currency": { "enum": ["USD", "USDC"] },
"transaction_id": { "type": "string" }
}
}
}
}
}
}
¶
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://swarmsync.ai/spec/adrp/v1/ruling-bundle.schema.json",
"title": "RulingBundle",
"type": "object",
"required": [
"type", "supersedes", "dispute_chain_tip", "verdict",
"rationale_hash", "arbitrator_did", "arbitrator_vc_hash",
"signing_time", "prev_hash", "sig"
],
"properties": {
"type": { "const": "RulingBundle" },
"supersedes": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"dispute_chain_tip": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"verdict": { "enum": ["release", "refund", "partial"] },
"partial_split": {
"type": "object",
"properties": {
"to_buyer": { "type": "number", "minimum": 0, "maximum": 1 },
"to_seller": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"rationale_hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"arbitrator_did": { "type": "string" },
"arbitrator_vc_hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"signing_time": { "type": "string", "format": "date-time" },
"prev_hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"sig": { "type": "string" }
}
}
¶
A small business principal (did:web:smb.example) dispatches an agent to
book a $250 hotel reservation. The agent books in Portland, ME instead of Portland,
OR due to an ambiguous Cart Mandate.¶
claim_code quality_mismatch.¶
quality_mismatch, filing_fee $25.00
USDC.¶
acceptance_criteria.checks is
empty.¶
spec_ambiguity. Verdict: partial, split 70/30 to
buyer/seller.¶
Any third party, given (DisputeBundle, RulingBundle), can run
verify_resolution deterministically.¶
RulingBundle indexed in precedent corpus by Cart Mandate template hash.¶
| Number | Question | Falsification Threshold |
|---|---|---|
| 1 | Will principals author Cart Mandates with 3+ acceptance_criteria.checks? | Less than 30% coverage at day 30 → ship NLP-to-checks helper as mandatory |
| 2 | Will the auto-resolution rate hit 60%+? | Less than 60% at day 60 → escalate to architectural review |
| 3 | Will the frivolous filing rate stay below 2%? | Greater than 2% at day 60 → tighten filing fee floor |
| 4 | Will the curated arbitrator pool meet SLA at scale? | Greater than 5% SLA breaches at day 90 → expand pool or accelerate v0.2 |
| 5 | Will the Arbitration Mandate be challenged in court? | Any court challenge → seek immediate written legal opinion |
| 6 | Will the precedent corpus accumulate fast enough? | Less than 100 corpus queries by arbitrators at month 3 → revisit |
| 7 | Are tier thresholds calibrated correctly? | Filing rate greater than 5% or less than 0.05% → recalibrate |
GA is gated on: auto-resolution rate greater than or equal to 60% AND frivolous filing rate less than or equal to 2% AND zero court challenges AND arbitrator SLA breaches less than or equal to 5% AND median Cart Mandate has at least 1 non-trivial acceptance_criteria.check.¶