<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     version="3"
     docName="draft-stone-adrp-00"
     ipr="trust200902"
     category="std"
     submissionType="IETF"
     xml:lang="en"
     tocInclude="true"
     sortRefs="true"
     symRefs="true">

  <front>
    <title abbrev="ADRP">ADRP: Agent Dispute Resolution Protocol</title>

    <author fullname="Ben Stone" surname="stone" initials="B.">
      <organization>SwarmSync.AI</organization>
      <address>
        <email>benstone@swarmsync.ai</email>
      </address>
    </author>

    <date year="2026" month="April" day="25"/>

    <area>Applications</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>agent</keyword>
    <keyword>agentic-commerce</keyword>
    <keyword>A2A</keyword>
    <keyword>dispute</keyword>
    <keyword>arbitration</keyword>
    <keyword>escrow</keyword>
    <keyword>Conduit</keyword>
    <keyword>AP2</keyword>
    <keyword>ATXN</keyword>
    <keyword>VCAP</keyword>

    <abstract>
      <t>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.</t>

      <t>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).</t>

      <t>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.</t>

      <t>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.</t>

      <t>Companion specifications (all co-submitted as Internet-Drafts, work in progress):</t>
      <ul>
        <li>ATXN (draft-stone-atxn-00): defines the A2A transaction primitive that ADRP
        resolves disputes over</li>
        <li>AIVS (draft-stone-aivs-01): cryptographic audit-trail substrate for proof
        bundles</li>
        <li>VCAP (draft-stone-vcap-01): verified-commerce escrow rails consumed by ADRP
        EscrowDirectives</li>
        <li>ATEP (draft-stone-atep-01): trust passports referenced by Standing Tokens in
        ADRP</li>
      </ul>
    </abstract>
  </front>

  <middle>

    <!-- ============================================================ -->
    <section anchor="introduction" numbered="true" title="Introduction">

      <section anchor="the-problem" numbered="true" title="The Problem">
        <t>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.</t>

        <t>This is necessary but not sufficient.</t>

        <t>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.</t>

        <t>ADRP addresses the relocated dispute surface without breaking the cryptographic
        substrate.</t>
      </section>

      <section anchor="what-adrp-defines" numbered="true" title="What ADRP Defines">
        <t>A five-layer protocol stacked on the existing Conduit + AP2 + ATXN stack:</t>
        <dl>
          <dt>Layer 5:</dt>
          <dd>Precedent corpus (signed RulingBundles indexed by Cart Mandate template hash)</dd>
          <dt>Layer 4:</dt>
          <dd>Tier router (L1 atomic / L2 mandated / L3 fiduciary)</dd>
          <dt>Layer 3:</dt>
          <dd>Resolution engine (cryptographic-class auto, semantic-class arbitration)</dd>
          <dt>Layer 2:</dt>
          <dd>Counter-attestation primitive (append-only override of Conduit ProofBundle)</dd>
          <dt>Layer 1:</dt>
          <dd>Arbitration Mandate (4th AP2 mandate, FAA Section 2 written agreement)</dd>
        </dl>
      </section>

      <section anchor="what-adrp-does-not" numbered="true" title="What ADRP Deliberately Does NOT Do">
        <ul>
          <li>ADRP does not modify the Conduit ProofBundle.</li>
          <li>ADRP does not grant agents independent dispute standing.</li>
          <li>ADRP does not require statutory change.</li>
          <li>ADRP does not specify how acceptance criteria are authored.</li>
          <li>ADRP does not promise greater than 90% auto-resolution.</li>
        </ul>
      </section>

      <section anchor="design-tenets" numbered="true" title="Design Tenets">
        <dl>
          <dt>Bifurcation:</dt>
          <dd>Cryptographic and semantic disputes require different paths.</dd>
          <dt>Append-only override:</dt>
          <dd>The hash chain is never mutated.</dd>
          <dt>Principal-only standing:</dt>
          <dd>Agents flag; only principals file.</dd>
          <dt>Time-windowed default-resolution:</dt>
          <dd>Silence equals approval.</dd>
          <dt>Economic friction on filing:</dt>
          <dd>Non-refundable filing fee deters spam.</dd>
          <dt>No tokenized stake:</dt>
          <dd>Filing fees are USD-denominated, non-refundable to the filer, refundable to the
          prevailing party.</dd>
          <dt>Pre-committed arbiter:</dt>
          <dd>The arbitration pool is named in the Arbitration Mandate at agent-deployment
          time.</dd>
          <dt>Curated pool for v0.1:</dt>
          <dd>Decentralized token-staked pools deferred to v0.2.</dd>
          <dt>US-only B2B for v0.1:</dt>
          <dd>Cross-border, consumer, and PSD2/Reg E scope deferred.</dd>
        </dl>
      </section>

    </section><!-- end introduction -->

    <!-- ============================================================ -->
    <section anchor="terminology" numbered="true" title="Terminology">
      <t>The key words <bcp14>MUST</bcp14>, <bcp14>MUST NOT</bcp14>, <bcp14>REQUIRED</bcp14>,
      <bcp14>SHALL</bcp14>, <bcp14>SHALL NOT</bcp14>, <bcp14>SHOULD</bcp14>,
      <bcp14>SHOULD NOT</bcp14>, <bcp14>RECOMMENDED</bcp14>, <bcp14>MAY</bcp14>, and
      <bcp14>OPTIONAL</bcp14> in this document are to be interpreted as described in
      BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>.</t>

      <dl>
        <dt>Conduit ProofBundle (H_c):</dt>
        <dd>A SHA-256 hash-chained, Ed25519-signed audit trail produced by a cryptographic
        verifier of agent task delivery. The tip hash of this chain is referenced as
        <tt>H_c</tt> throughout this document.</dd>

        <dt>RulingBundle (R):</dt>
        <dd>A signed attestation by an authorized arbitrator that supersedes an underlying
        Conduit ProofBundle via signing-time precedence.</dd>

        <dt>DisputeBundle:</dt>
        <dd>The append-only chain of dispute events (filing, evidence, arbitrator assignment)
        anchored to a Conduit ProofBundle and consumed by <tt>verify_resolution</tt>.</dd>

        <dt>DisputeFlag:</dt>
        <dd>An advisory, agent-emitted notification that an anomaly has been detected.
        Non-binding. Expires if not ratified by the principal within the tier-specific
        window.</dd>

        <dt>DisputeFiling:</dt>
        <dd>A binding, principal-emitted dispute filing. Posts a filing fee. Anchors a
        DisputeBundle.</dd>

        <dt>EscrowDirective:</dt>
        <dd>The output of <tt>verify_resolution</tt>. Consumed by the AP2 Payment Mandate
        executor (or VCAP escrow rail) to release, refund, or split funds.</dd>

        <dt>Arbitration Mandate:</dt>
        <dd>The fourth element of the AP2 mandate chain, pre-signed by the principal at
        agent-deployment time. Defines the arbitration pool, governing-law clause, fee
        schedule, and L1/L2/L3 thresholds. Hash anchored in Standing Token.</dd>

        <dt>Cart Mandate Acceptance Criteria:</dt>
        <dd>A machine-readable structure embedded in the Cart Mandate that defines the
        deterministic checks Conduit attests against at delivery time.</dd>

        <dt>Cryptographic-class dispute:</dt>
        <dd>A dispute whose resolution is computable deterministically from (DisputeBundle,
        RulingBundle, Standing Token chain).</dd>

        <dt>Semantic-class dispute:</dt>
        <dd>A dispute whose resolution requires arbitration against the Cart Mandate's
        acceptance criteria.</dd>

        <dt>Curated Arbitrator Pool:</dt>
        <dd>A SwarmSync-published list of vetted human-or-model arbitrators registered as
        DIDs in <tt>TRUSTED_REGISTRIES</tt>. v0.1 mechanism.</dd>

        <dt>Filing Fee:</dt>
        <dd>A non-refundable, non-transferable, USD-denominated fee posted at DisputeFiling.
        Refundable only to the prevailing party.</dd>

        <dt>Counter-attestation Override Pattern:</dt>
        <dd>The verification-time precedence rule by which a RulingBundle supersedes a
        Conduit ProofBundle. Both are preserved forever in the hash chain.</dd>
      </dl>

      <t>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).</t>
    </section><!-- end terminology -->

    <!-- ============================================================ -->
    <section anchor="architecture-overview" numbered="true" title="Architecture Overview">
      <t>ADRP sits on top of the following existing layers:</t>

      <artwork type="ascii-art"><![CDATA[
+--------------------------------------+
| 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                 |
+--------------------------------------+
      ]]></artwork>

      <t>A dispute is the transition of an ATXN Bundle from <tt>delivered</tt> to
      <tt>disputed</tt> (per ATXN Section 8). ADRP defines what happens after that
      transition.</t>
    </section><!-- end architecture-overview -->

    <!-- ============================================================ -->
    <section anchor="arbitration-mandate" numbered="true" title="The Arbitration Mandate">

      <section anchor="arb-mandate-purpose" numbered="true" title="Purpose">
        <t>The Arbitration Mandate is the FAA Section 2 / NY Convention written, consensual
        arbitration agreement that makes ADRP enforceable without statutory change.</t>
      </section>

      <section anchor="arb-mandate-fields" numbered="true" title="Required Fields">
        <table>
          <thead>
            <tr>
              <th>Field</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>arb_mandate_id</tt></td>
              <td>UUID</td>
              <td>Unique identifier</td>
            </tr>
            <tr>
              <td><tt>principal_did</tt></td>
              <td>DID</td>
              <td>Principal's DID</td>
            </tr>
            <tr>
              <td><tt>arbitrator_pool_ref</tt></td>
              <td>URI</td>
              <td>Reference to the curated arbitrator pool (v0.1)</td>
            </tr>
            <tr>
              <td><tt>governing_law</tt></td>
              <td>String</td>
              <td>E.g., "FAA + Delaware seat"</td>
            </tr>
            <tr>
              <td><tt>fee_schedule_ref</tt></td>
              <td>URI</td>
              <td>Reference to filing fee schedule</td>
            </tr>
            <tr>
              <td><tt>tier_thresholds</tt></td>
              <td>Object</td>
              <td>L1/L2/L3 transaction-value boundaries</td>
            </tr>
            <tr>
              <td><tt>appeal_panel_size</tt></td>
              <td>Integer</td>
              <td>Default 5</td>
            </tr>
            <tr>
              <td><tt>language_of_proceedings</tt></td>
              <td>ISO 639-1</td>
              <td>Default "en"</td>
            </tr>
            <tr>
              <td><tt>principal_signature</tt></td>
              <td>Ed25519 base64</td>
              <td>Principal's signature over canonical JSON</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="arb-mandate-anchoring" numbered="true" title="Anchoring">
        <t>The Arbitration Mandate's SHA-256 hash <bcp14>MUST</bcp14> be referenced in the
        principal's Standing Token (per ATXN Section 4) under a new field
        <tt>arb_mandate_hash</tt>. A Standing Token without an anchored Arbitration Mandate
        hash <bcp14>MUST NOT</bcp14> participate in an L2 or L3 ATXN Bundle.</t>
      </section>

      <section anchor="arb-mandate-mutability" numbered="true" title="Mutability">
        <t>The Arbitration Mandate <bcp14>MAY</bcp14> be replaced by the principal at any
        time, but the replacement <bcp14>MUST NOT</bcp14> apply retroactively to in-flight
        Bundles.</t>
      </section>

    </section><!-- end arbitration-mandate -->

    <!-- ============================================================ -->
    <section anchor="standing-and-flag-file" numbered="true" title="Standing and the Flag/File Distinction">

      <section anchor="parties" numbered="true" title="Parties">
        <t>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.</t>
      </section>

      <section anchor="agent-flag-rights" numbered="true" title="Agent Flag Rights">
        <t>Agents <bcp14>MAY</bcp14> 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.</t>
      </section>

      <section anchor="principal-file-rights" numbered="true" title="Principal File Rights">
        <t>Only principals <bcp14>MAY</bcp14> emit DisputeFilings — binding, fee-posting,
        claim-coded events that initiate the dispute state machine.</t>
      </section>

      <section anchor="flag-expiration" numbered="true" title="Flag Expiration">
        <table>
          <thead>
            <tr>
              <th>Tier</th>
              <th>Ratification Window</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>L1</td>
              <td>N/A (no dispute)</td>
            </tr>
            <tr>
              <td>L2</td>
              <td>72h</td>
            </tr>
            <tr>
              <td>L3</td>
              <td>14d</td>
            </tr>
          </tbody>
        </table>
        <t>After expiration, the flag is preserved in the audit log but cannot anchor a
        DisputeFiling.</t>
      </section>

      <section anchor="pre-authorized-delegate" numbered="true" title="Pre-Authorized Dispute Delegate">
        <t>A principal <bcp14>MAY</bcp14> pre-authorize a dispute delegate via a
        <tt>delegation</tt> field in the Arbitration Mandate. The delegate's filings are
        treated as principal-filed for standing purposes.</t>
      </section>

    </section><!-- end standing-and-flag-file -->

    <!-- ============================================================ -->
    <section anchor="dispute-taxonomy" numbered="true" title="Dispute Taxonomy">

      <section anchor="cryptographic-class" numbered="true" title="Cryptographic-Class Disputes">
        <t>Resolved by code from (DisputeBundle, RulingBundle, Standing Token chain) without
        arbitration.</t>

        <table>
          <thead>
            <tr>
              <th>Code</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>bundle_integrity</tt></td>
              <td>SHA-256 chain breaks; signature verification fails</td>
            </tr>
            <tr>
              <td><tt>mandate_scope</tt></td>
              <td>Agent acted outside Cart Mandate scope (deterministic predicate)</td>
            </tr>
            <tr>
              <td><tt>token_authority</tt></td>
              <td>Standing Token revoked or expired pre-execution</td>
            </tr>
            <tr>
              <td><tt>timestamp_skew</tt></td>
              <td>Attestation timestamps violate ordering invariants</td>
            </tr>
            <tr>
              <td><tt>oracle_contradiction</tt></td>
              <td>Third-party oracle data contradicts attestation</td>
            </tr>
          </tbody>
        </table>

        <t>A cryptographic-class dispute <bcp14>MUST NOT</bcp14> be routed to
        arbitration.</t>
      </section>

      <section anchor="semantic-class" numbered="true" title="Semantic-Class Disputes">
        <t>Resolved by arbitration against the Cart Mandate's acceptance criteria.</t>

        <table>
          <thead>
            <tr>
              <th>Code</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>quality_mismatch</tt></td>
              <td>Deliverable doesn't satisfy <tt>acceptance_criteria.checks</tt></td>
            </tr>
            <tr>
              <td><tt>spec_ambiguity</tt></td>
              <td>Acceptance criteria absent, under-specified, or contradictory</td>
            </tr>
            <tr>
              <td><tt>timing_breach</tt></td>
              <td>SLA missed</td>
            </tr>
            <tr>
              <td><tt>fitness_for_purpose</tt></td>
              <td>Deliverable formally compliant but unfit for principal's purpose</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="classification" numbered="true" title="Classification">
        <t>The DisputeFiling's <tt>claim_code</tt> field declares the class. ADRP verifiers
        <bcp14>MUST</bcp14> validate that the declared class matches the evidence.</t>
      </section>

      <section anchor="atxn-mapping" numbered="true" title="ATXN dispute_class to ADRP Claim Code Mapping">
        <t>ATXN (Section 10.3) defines a <tt>dispute_class</tt> field set at Bundle handoff.
        The normative mapping is:</t>

        <table>
          <thead>
            <tr>
              <th>ATXN dispute_class</th>
              <th>ADRP Claim Code(s)</th>
              <th>ADRP Class</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>fact_dispute</tt></td>
              <td><tt>bundle_integrity</tt>, <tt>timestamp_skew</tt>,
              <tt>oracle_contradiction</tt></td>
              <td>Cryptographic</td>
            </tr>
            <tr>
              <td><tt>terms_dispute</tt></td>
              <td><tt>mandate_scope</tt>, <tt>quality_mismatch</tt>,
              <tt>spec_ambiguity</tt>, <tt>timing_breach</tt>,
              <tt>fitness_for_purpose</tt></td>
              <td>Semantic</td>
            </tr>
            <tr>
              <td><tt>capacity_dispute</tt></td>
              <td>out of scope — see <xref target="out-of-scope"/></td>
              <td>—</td>
            </tr>
            <tr>
              <td><tt>framework_dispute</tt></td>
              <td>out of scope — see <xref target="out-of-scope"/></td>
              <td>—</td>
            </tr>
          </tbody>
        </table>

        <t>When a DisputeFiling arrives with an ATXN <tt>dispute_class</tt>, the ADRP
        verifier <bcp14>MUST</bcp14> map it to the corresponding <tt>claim_code</tt> bucket
        using this table before routing.</t>
      </section>

      <section anchor="out-of-scope" numbered="true" title="Out of Scope (v0.1)">
        <table>
          <thead>
            <tr>
              <th>Class</th>
              <th>Reason</th>
              <th>Disposition</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>capacity_dispute</tt></td>
              <td>Principal-level adjudication; agent action set aside entirely</td>
              <td>Bypass ADRP entirely; executing platform <bcp14>MUST</bcp14> freeze
              settlement and refund-to-buyer; route to regulatory or Principal-level forum
              outside ADRP</td>
            </tr>
            <tr>
              <td><tt>framework_dispute</tt></td>
              <td>Mandate framework validity contested</td>
              <td>Bypass ADRP entirely; executing platform <bcp14>MUST</bcp14> freeze
              settlement; ADRP <bcp14>MUST NOT</bcp14> process until upstream framework forum
              resolves validity</td>
            </tr>
            <tr>
              <td>Cross-border consumer disputes</td>
              <td>Reg E / PSD2 / GDPR overlap not yet resolved</td>
              <td>Defer to v0.2</td>
            </tr>
          </tbody>
        </table>
      </section>

    </section><!-- end dispute-taxonomy -->

    <!-- ============================================================ -->
    <section anchor="counter-attestation" numbered="true" title="The Counter-Attestation Override Pattern">

      <section anchor="ca-invariant" numbered="true" title="Invariant">
        <t>The Conduit ProofBundle's tip hash <tt>H_c</tt> is never modified. No byte of the
        original ProofBundle is rewritten. Override is a verification-time precedence rule,
        not a mutation.</t>
      </section>

      <section anchor="ruling-bundle-structure" numbered="true" title="RulingBundle Structure">
        <sourcecode type="json"><![CDATA[
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))
        ]]></sourcecode>
      </section>

      <section anchor="verification-rule" numbered="true" title="Verification Rule">
        <t>The latest valid RulingBundle (by <tt>signing_time</tt>) whose
        <tt>supersedes</tt> equals the underlying ProofBundle's tip hash AND whose signing
        arbitrator was authorized at <tt>signing_time</tt>, with chain integrity verified,
        is the verification winner.</t>
      </section>

      <section anchor="why-this-works" numbered="true" title="Why This Works">
        <t>Hash-chain immutability is preserved. Verification is offline and deterministic.
        Arbitrator authority is anchored to <tt>signing_time</tt>. The chain becomes a
        precedent corpus indexed by Cart Mandate template hash.</t>
      </section>

    </section><!-- end counter-attestation -->

    <!-- ============================================================ -->
    <section anchor="wire-protocol" numbered="true" title="Wire Protocol">

      <section anchor="message-types" numbered="true" title="Message Types">
        <table>
          <thead>
            <tr>
              <th>Number</th>
              <th>Type</th>
              <th>Emitter</th>
              <th>Purpose</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>1</td>
              <td>DisputeFlag</td>
              <td>Agent</td>
              <td>Advisory anomaly notification (non-binding)</td>
            </tr>
            <tr>
              <td>2</td>
              <td>DisputeFiling</td>
              <td>Principal</td>
              <td>Binding dispute initiation; posts filing fee</td>
            </tr>
            <tr>
              <td>3</td>
              <td>EvidenceSubmission</td>
              <td>Either party</td>
              <td>Hash-chained artifact append</td>
            </tr>
            <tr>
              <td>4</td>
              <td>ArbitratorAssignment</td>
              <td>Registry</td>
              <td>Binds arbitrator DID to dispute</td>
            </tr>
            <tr>
              <td>5</td>
              <td>RulingBundle</td>
              <td>Arbitrator</td>
              <td>Signed verdict + escrow directive</td>
            </tr>
            <tr>
              <td>6</td>
              <td>EscrowDirective</td>
              <td>Verifier (derived)</td>
              <td>Consumed by AP2 Payment Mandate or VCAP rail</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="common-envelope" numbered="true" title="Common Message Envelope">
        <sourcecode type="json"><![CDATA[
{
  "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 ... }
}
        ]]></sourcecode>
      </section>

      <section anchor="canonicalization" numbered="true" title="Canonicalization">
        <t>All signatures <bcp14>MUST</bcp14> be over the JCS (<xref target="RFC8785"/>)
        canonicalization of the signed object minus the signature field itself.</t>
      </section>

    </section><!-- end wire-protocol -->

    <!-- ============================================================ -->
    <section anchor="state-machine" numbered="true" title="State Machine">

      <section anchor="states" numbered="true" title="States">
        <artwork type="ascii-art"><![CDATA[
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)
        ]]></artwork>
      </section>

      <section anchor="atxn-join-points" numbered="true" title="ATXN State Machine Join Points">
        <t>The ADRP internal state machine is entered from ATXN's
        <tt>disputed</tt> state. The normative join points are:</t>
        <ul>
          <li>ATXN <tt>disputed</tt> → ADRP <tt>FLAGGED</tt>: agent-emitted DisputeFlag
          (advisory; principal must ratify within tier window to proceed)</li>
          <li>ATXN <tt>disputed</tt> → ADRP <tt>FILED</tt>: principal-emitted DisputeFiling
          (skips FLAGGED)</li>
          <li>ADRP <tt>RULED</tt> + ADRP <tt>SETTLED</tt> → ATXN <tt>adjudicated</tt> then
          <tt>finalized</tt>: EscrowDirective consumed by payment rail</li>
          <li>ADRP <tt>WITHDRAWN</tt> or <tt>EXPIRED</tt> → ATXN <tt>finalized</tt>: dispute
          resolved without ruling; escrow released per Profile default</li>
        </ul>
      </section>

      <section anchor="invariants" numbered="true" title="Invariants">
        <table>
          <thead>
            <tr>
              <th>ID</th>
              <th>Invariant</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>I1</td>
              <td><tt>PaymentMandate.escrow_state == HOLD</tt> until SETTLED, WITHDRAWN, or
              EXPIRED</td>
            </tr>
            <tr>
              <td>I2</td>
              <td>No state mutates a prior attestation; transitions are new signed events</td>
            </tr>
            <tr>
              <td>I3</td>
              <td><tt>prev_hash</tt> of every event = SHA-256 of canonical-JSON of the
              immediately prior event</td>
            </tr>
            <tr>
              <td>I4</td>
              <td><tt>dispute_chain[0].prev_hash == ProofBundle.tip_hash</tt></td>
            </tr>
            <tr>
              <td>I5</td>
              <td>Only an arbitrator authorized by the Arbitration Mandate's pool may emit
              RulingBundle</td>
            </tr>
            <tr>
              <td>I6</td>
              <td>EscrowDirective <bcp14>MUST</bcp14> be derivable from (DisputeBundle,
              RulingBundle) by <tt>verify_resolution</tt></td>
            </tr>
          </tbody>
        </table>
      </section>

    </section><!-- end state-machine -->

    <!-- ============================================================ -->
    <section anchor="tier-parameters" numbered="true" title="Tier Parameters">
      <table>
        <thead>
          <tr>
            <th>Parameter</th>
            <th>L1</th>
            <th>L2</th>
            <th>L3</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>Dispute window</td>
            <td>0 (atomic)</td>
            <td>72h</td>
            <td>14d</td>
          </tr>
          <tr>
            <td>Filing fee</td>
            <td>N/A</td>
            <td>10% of value, $1-$100</td>
            <td>10% of value, $50-$1,000</td>
          </tr>
          <tr>
            <td>Arbitrator SLA</td>
            <td>N/A</td>
            <td>4h</td>
            <td>24h</td>
          </tr>
          <tr>
            <td>Arbitrator pool</td>
            <td>N/A</td>
            <td>Curated AI panel (3 of 5)</td>
            <td>Curated human pool (3 of 5) + optional legal review</td>
          </tr>
          <tr>
            <td>Override threshold</td>
            <td>N/A</td>
            <td>4-of-5 supermajority</td>
            <td>4-of-5 supermajority</td>
          </tr>
          <tr>
            <td>Max txn auto-arb</td>
            <td>unlimited</td>
            <td>$1,000</td>
            <td>unlimited</td>
          </tr>
          <tr>
            <td>Default if SLA missed</td>
            <td>N/A</td>
            <td>refund-to-buyer</td>
            <td>refund-to-buyer</td>
          </tr>
          <tr>
            <td>Frivolous slash</td>
            <td>N/A</td>
            <td>100% fee forfeited</td>
            <td>100% fee forfeited</td>
          </tr>
          <tr>
            <td>Novel-but-lost slash</td>
            <td>N/A</td>
            <td>50% fee forfeited</td>
            <td>50% fee forfeited</td>
          </tr>
          <tr>
            <td>Appeal window</td>
            <td>N/A</td>
            <td>12h</td>
            <td>48h</td>
          </tr>
          <tr>
            <td>Appeal panel</td>
            <td>N/A</td>
            <td>5 (up from 3)</td>
            <td>5 + legal review</td>
          </tr>
          <tr>
            <td>Appeal quorum</td>
            <td>N/A</td>
            <td>4 of 5</td>
            <td>4 of 5</td>
          </tr>
          <tr>
            <td>Escrow hold</td>
            <td>0</td>
            <td>7 days</td>
            <td>21 days</td>
          </tr>
          <tr>
            <td>Evidence file size cap</td>
            <td>N/A</td>
            <td>10 MB total, max 20 files</td>
            <td>10 MB total, max 20 files</td>
          </tr>
        </tbody>
      </table>

      <section anchor="tier-routing" numbered="true" title="Tier Routing">
        <t>Tier is determined by the ATXN Bundle's Tier (per ATXN Section 5) AND by the
        transaction value relative to the <tt>max_txn_auto_arb</tt> ceiling. A Bundle
        declared L2 with transaction value greater than $1,000 <bcp14>MUST</bcp14>
        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).</t>
      </section>

      <section anchor="default-ruling-sla" numbered="true" title="Default Ruling on SLA Miss">
        <t>If the arbitrator pool fails to produce a RulingBundle within the SLA, the dispute
        <bcp14>MUST</bcp14> default to refund-to-buyer.</t>
      </section>

    </section><!-- end tier-parameters -->

    <!-- ============================================================ -->
    <section anchor="cart-mandate-acceptance" numbered="true" title="Cart Mandate Acceptance Criteria">

      <section anchor="acceptance-required-field" numbered="true" title="Required Field">
        <t>The Cart Mandate <bcp14>MUST</bcp14> contain:</t>
        <sourcecode type="json"><![CDATA[
{
  "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"
  }
}
        ]]></sourcecode>
      </section>

      <section anchor="check-types" numbered="true" title="Check Types">
        <table>
          <thead>
            <tr>
              <th>Type</th>
              <th>Evaluation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>regex</tt></td>
              <td>Deterministic regex match against JSON-path selector</td>
            </tr>
            <tr>
              <td><tt>json_schema</tt></td>
              <td>JSON Schema validation against selector</td>
            </tr>
            <tr>
              <td><tt>deterministic_function</tt></td>
              <td>Pure function (referenced by hash, fetched from registry) executed against
              deliverable</td>
            </tr>
            <tr>
              <td><tt>human_review_required</tt></td>
              <td>Auto-routes to arbitration; flags spec as deliberately not
              auto-evaluable</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="conduit-attestation-checks" numbered="true" title="Conduit Attestation Against Checks">
        <t>Conduit attests against <tt>acceptance_criteria.checks</tt> at delivery time. If
        all checks pass deterministically, the dispute path auto-resolves cryptographically.
        If checks include <tt>human_review_required</tt> OR are missing, dispute auto-routes
        to L2 semantic arbitration.</t>
      </section>

      <section anchor="authoring-helper" numbered="true" title="The Authoring Helper (Normative for Deployment)">
        <t>A natural-language-to-checks helper that converts a principal's English-language
        description into machine-checkable predicates is <bcp14>REQUIRED</bcp14> for v0.1
        deployment.</t>
      </section>

    </section><!-- end cart-mandate-acceptance -->

    <!-- ============================================================ -->
    <section anchor="arbitrator-pool" numbered="true" title="Arbitrator Pool">

      <section anchor="curated-pool" numbered="true" title="v0.1: Curated Pool">
        <t>v0.1 ships with a SwarmSync-curated arbitrator pool — a centralized list of vetted
        human-or-model arbitrators registered as DIDs in <tt>TRUSTED_REGISTRIES</tt>.</t>
      </section>

      <section anchor="selection-algorithm" numbered="true" title="Selection Algorithm">
        <t>Arbitrator selection <bcp14>MUST</bcp14> use a verifiable random function (VRF)
        seeded by the DisputeFiling's hash.</t>
      </section>

      <section anchor="pool-composition" numbered="true" title="Pool Composition">
        <table>
          <thead>
            <tr>
              <th>Tier</th>
              <th>Pool Composition</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>L2</td>
              <td>AI arbitrator panels (model + curated checker)</td>
            </tr>
            <tr>
              <td>L3</td>
              <td>Human arbitrators (vetted, jurisdictionally-licensed where relevant) +
              optional legal review</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="arbitrator-credentialing" numbered="true" title="Arbitrator Credentialing">
        <t>Every arbitrator <bcp14>MUST</bcp14> hold a Verifiable Credential that names the
        arbitrator's DID, states <tt>valid_from</tt> and <tt>valid_until</tt> timestamps,
        names qualifications, and is signed by a registry in <tt>TRUSTED_REGISTRIES</tt>.</t>
      </section>

      <section anchor="v02-roadmap" numbered="true" title="v0.2 Roadmap">
        <t>Decentralized stake-weighted arbitrator pools are deferred to v0.2.</t>
      </section>

    </section><!-- end arbitrator-pool -->

    <!-- ============================================================ -->
    <section anchor="filing-fee-economics" numbered="true" title="Filing Fee Economics">

      <section anchor="fee-structure" numbered="true" title="Fee Structure">
        <table>
          <thead>
            <tr>
              <th>Parameter</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Fee rate</td>
              <td>10% of transaction value</td>
            </tr>
            <tr>
              <td>Floor</td>
              <td>$1 (L2) / $50 (L3)</td>
            </tr>
            <tr>
              <td>Ceiling</td>
              <td>$100 (L2) / $1,000 (L3)</td>
            </tr>
            <tr>
              <td>Denomination</td>
              <td>USD (fiat or USDC stablecoin)</td>
            </tr>
            <tr>
              <td>Refund</td>
              <td>To prevailing party only</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="why-not-tokenized" numbered="true" title="Why Not a Tokenized Stake">
        <t>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.</t>
      </section>

      <section anchor="slashing" numbered="true" title="Slashing">
        <table>
          <thead>
            <tr>
              <th>Outcome</th>
              <th>Filer's Fee</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Filer prevails</td>
              <td>100% refunded</td>
            </tr>
            <tr>
              <td>Filer loses; novel evidence</td>
              <td>50% forfeited</td>
            </tr>
            <tr>
              <td>Filer loses; frivolous</td>
              <td>100% forfeited</td>
            </tr>
            <tr>
              <td>Filer withdraws before EVIDENCE_OPEN</td>
              <td>75% refunded</td>
            </tr>
            <tr>
              <td>Filer withdraws after EVIDENCE_OPEN</td>
              <td>25% refunded</td>
            </tr>
          </tbody>
        </table>
        <t>Forfeited fees <bcp14>MAY</bcp14> fund the arbitrator pool and a public
        dispute-quality dataset.</t>
      </section>

      <section anchor="arbitrator-compensation" numbered="true" title="Arbitrator Compensation">
        <t>Arbitrators are compensated 2% of transaction value (min $0.50) from the losing
        party's escrow.</t>
      </section>

    </section><!-- end filing-fee-economics -->

    <!-- ============================================================ -->
    <section anchor="appeals" numbered="true" title="Appeals">

      <section anchor="appeal-trigger" numbered="true" title="Trigger">
        <t>Either party <bcp14>MAY</bcp14> 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.</t>
      </section>

      <section anchor="appeal-panel" numbered="true" title="Appeal Panel">
        <t>A 5-arbitrator panel selected via VRF from a different pool slice than the
        original ruling. Quorum: 4 of 5.</t>
      </section>

      <section anchor="finality" numbered="true" title="Finality">
        <t>Appeal rulings are FINAL. There is no second appeal.</t>
      </section>

      <section anchor="appeal-override" numbered="true" title="Appeal Override">
        <t>An appeal RulingBundle supersedes the original RulingBundle by the same
        signing-time precedence rule (<xref target="verification-rule"/>). Both are preserved
        forever.</t>
      </section>

    </section><!-- end appeals -->

    <!-- ============================================================ -->
    <section anchor="precedent-corpus" numbered="true" title="Precedent Corpus">

      <section anchor="indexing" numbered="true" title="Indexing">
        <t>Every signed RulingBundle is content-addressed and indexed by: Cart Mandate
        template hash; dispute <tt>claim_code</tt>; verdict; arbitrator DID; signing
        time.</t>
      </section>

      <section anchor="citation-requirement" numbered="true" title="Citation Requirement">
        <t>Future arbitrators <bcp14>MUST</bcp14> query the precedent corpus for prior rulings
        on similar Cart Mandate templates and either cite or distinguish them.</t>
      </section>

      <section anchor="corpus-versioning" numbered="true" title="v0.1 vs v0.2">
        <t>v0.1 ships the data layer. v0.2 ships the search and citation
        infrastructure.</t>
      </section>

    </section><!-- end precedent-corpus -->

    <!-- ============================================================ -->
    <section anchor="verification-algorithm" numbered="true" title="Verification Algorithm">

      <section anchor="verify-resolution-fn" numbered="true" title="The verify_resolution Function">
        <sourcecode type="python"><![CDATA[
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))
    ))
        ]]></sourcecode>
      </section>

      <section anchor="determinism-requirement" numbered="true" title="Determinism Requirement">
        <t>Two honest verifiers given the same inputs <bcp14>MUST</bcp14> reach the same
        EscrowDirective.</t>
      </section>

      <section anchor="offline-requirement" numbered="true" title="Offline Requirement">
        <t><tt>verify_resolution</tt> <bcp14>MUST NOT</bcp14> require network access except
        to fetch the arbitrator's Verifiable Credential by hash.</t>
      </section>

    </section><!-- end verification-algorithm -->

    <!-- ============================================================ -->
    <section anchor="sdk-surface" numbered="true" title="SDK Surface">
      <t>A conformant ADRP v0.1 SDK <bcp14>MUST</bcp14> expose at minimum six methods,
      implementable in 500 LOC total:</t>

      <sourcecode type="python"><![CDATA[
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}
      ]]></sourcecode>

      <section anchor="appeal-reentry" numbered="true" title="Appeal as Re-Entry">
        <t>An appeal is <tt>file_dispute</tt> with the <tt>prior_ruling_ref</tt> field
        set.</t>
      </section>

      <section anchor="loc-budget" numbered="true" title="LOC Budget">
        <dl>
          <dt><tt>emit_flag</tt>:</dt>
          <dd>~30 LOC</dd>
          <dt><tt>file_dispute</tt>:</dt>
          <dd>~80 LOC</dd>
          <dt><tt>submit_evidence</tt>:</dt>
          <dd>~50 LOC</dd>
          <dt><tt>query_status</tt>:</dt>
          <dd>~30 LOC</dd>
          <dt><tt>render_ruling</tt>:</dt>
          <dd>~80 LOC</dd>
          <dt><tt>verify_resolution</tt>:</dt>
          <dd>~120 LOC</dd>
          <dt>Common envelope, signing, hash chain:</dt>
          <dd>~110 LOC</dd>
          <dt>Total:</dt>
          <dd>~500 LOC</dd>
        </dl>
      </section>

      <section anchor="golden-test-cases" numbered="true" title="Golden Test Cases">
        <table>
          <thead>
            <tr>
              <th>Number</th>
              <th>Case</th>
              <th>Expected Behavior</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>1</td>
              <td><tt>clear_release</tt></td>
              <td>No flag, no filing, window expires → release</td>
            </tr>
            <tr>
              <td>2</td>
              <td><tt>clear_refund</tt></td>
              <td>DisputeFiling with valid <tt>bundle_integrity</tt> claim → refund</td>
            </tr>
            <tr>
              <td>3</td>
              <td><tt>partial_split</tt></td>
              <td>Semantic dispute, partial_split: {to_buyer: 0.30, to_seller: 0.70}</td>
            </tr>
            <tr>
              <td>4</td>
              <td><tt>attestation_override</tt></td>
              <td>Original ProofBundle preserved; latest valid RulingBundle wins</td>
            </tr>
            <tr>
              <td>5</td>
              <td><tt>frivolous_dispute</tt></td>
              <td>Filer loses without novel evidence → 100% fee forfeited</td>
            </tr>
            <tr>
              <td>6</td>
              <td><tt>malicious_requester_reject</tt></td>
              <td>Principal-A files invalid claim → fee forfeited, escrow releases to
              seller</td>
            </tr>
            <tr>
              <td>7</td>
              <td><tt>expired_dispute</tt></td>
              <td>DisputeFiling outside tier window → EXPIRED</td>
            </tr>
            <tr>
              <td>8</td>
              <td><tt>flag_ratification</tt></td>
              <td>DisputeFlag emitted, principal files within window → promoted</td>
            </tr>
            <tr>
              <td>9</td>
              <td><tt>flag_expiration</tt></td>
              <td>DisputeFlag emitted, no action within window → preserved but cannot anchor
              filing</td>
            </tr>
            <tr>
              <td>10</td>
              <td><tt>appeal_supersedes</tt></td>
              <td>Appeal RulingBundle supersedes original by signing-time precedence</td>
            </tr>
          </tbody>
        </table>
      </section>

    </section><!-- end sdk-surface -->

    <!-- ============================================================ -->
    <section anchor="scope-locks" numbered="true" title="Scope Locks for v0.1">
      <table>
        <thead>
          <tr>
            <th>Lock</th>
            <th>Reason</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>US-only B2B</td>
            <td>No consumer / cross-border / Reg E / PSD2 / GDPR overlap</td>
          </tr>
          <tr>
            <td>Partnered custody</td>
            <td>No SwarmSync-held escrow; relies on Stripe Connect, Bridge, Modern Treasury,
            or equivalent</td>
          </tr>
          <tr>
            <td>Curated arbitrator pool</td>
            <td>No token-staked decentralized pool (Howey)</td>
          </tr>
          <tr>
            <td>Filing fee, not stake</td>
            <td>Non-refundable, non-transferable, USD-denominated</td>
          </tr>
          <tr>
            <td>Reputation logged but not modulating</td>
            <td>Avoids bootstrap-circular trust dependency in v0.1</td>
          </tr>
          <tr>
            <td>Per-principal preference model deferred</td>
            <td>Data collection pipeline ships in v0.1; productized search ships in v0.2</td>
          </tr>
        </tbody>
      </table>
    </section><!-- end scope-locks -->

    <!-- ============================================================ -->
    <section anchor="security-considerations" numbered="true" title="Security Considerations">

      <section anchor="auto-resolution-target" numbered="true" title="The &gt;90% Auto-Resolution Target Is NOT a Protocol Property">
        <t>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 <bcp14>MUST</bcp14>: 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
        <tt>human_review_required</tt> flag if check coverage is less than 30% at day
        30.</t>
      </section>

      <section anchor="bifurcation-seam" numbered="true" title="The Bifurcation Seam">
        <t>Adversaries will probe the seam between cryptographic-class and semantic-class
        disputes. The classification validation in <xref target="classification"/> is
        <bcp14>REQUIRED</bcp14>.</t>
      </section>

      <section anchor="arbitrator-collusion" numbered="true" title="Arbitrator Collusion">
        <t>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.</t>
      </section>

      <section anchor="filing-fee-dos" numbered="true" title="Filing Fee as DoS Vector">
        <t>Mitigations: per-principal rate limit (max 0.5% of rolling 30-day transaction
        count); frivolous slash; account suspension after N frivolous filings.</t>
      </section>

      <section anchor="standing-token-replay" numbered="true" title="Standing Token Replay">
        <t>A revoked Standing Token <bcp14>MUST NOT</bcp14> anchor a new
        DisputeFiling.</t>
      </section>

      <section anchor="time-skew-attacks" numbered="true" title="Time-Skew Attacks">
        <t>Mitigations: threshold-signature timestamps for L2 and L3 rulings (3-of-5 from a
        federated timestamping authority); reject rulings with <tt>signing_time</tt> more than
        5 minutes in the future.</t>
      </section>

      <section anchor="jurisdictional-enforceability" numbered="true" title="Jurisdictional Enforceability of the Arbitration Mandate">
        <t>Implementations <bcp14>SHOULD</bcp14> seek a written legal opinion in the
        deployment jurisdiction before relying on the Arbitration Mandate to defeat a court
        filing.</t>
      </section>

      <section anchor="sanctions-screening" numbered="true" title="Sanctions Screening">
        <t>Every party receiving funds via an EscrowDirective <bcp14>MUST</bcp14> be screened
        against OFAC and equivalent sanctions lists.</t>
      </section>

      <section anchor="principal-capacity-mid-dispute" numbered="true" title="Principal Capacity Mid-Dispute">
        <t>If a principal's capacity attestation expires or is revoked mid-dispute, the
        dispute <bcp14>MUST</bcp14> be halted and routed to a <tt>capacity_dispute</tt>,
        defaulting to refund-to-buyer.</t>
      </section>

      <section anchor="residual-risks" numbered="true" title="Acknowledged Residual Risks">
        <ul>
          <li>Hallucinated mandates: partially mitigated by L3 epistemic attestation;
          unsolved for L1/L2.</li>
          <li>Adversarial sub-agency chains: bounded by <tt>sub_delegation_depth</tt> per
          ATXN.</li>
          <li>Arbitrator pool capture: mitigated by VRF selection; v0.2 decentralization is
          the long-term mitigation.</li>
        </ul>
      </section>

    </section><!-- end security-considerations -->

    <!-- ============================================================ -->
    <section anchor="iana-considerations" numbered="true" title="IANA Considerations">

      <section anchor="json-ld-context" numbered="true" title="ADRP JSON-LD Context">
        <t>URI: <tt>https://swarmsync.ai/spec/adrp/v1</tt></t>
      </section>

      <section anchor="claim-code-registry" numbered="true" title="ADRP Claim Code Registry">
        <t>A new IANA registry "ADRP Claim Codes" is requested. Registration policy:
        Specification Required (per <xref target="RFC8126"/>).</t>

        <t>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th>Code</th>
              <th>Class</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>bundle_integrity</tt></td>
              <td>cryptographic</td>
              <td>SHA-256 chain breaks; signature verification fails</td>
            </tr>
            <tr>
              <td><tt>mandate_scope</tt></td>
              <td>cryptographic</td>
              <td>Agent acted outside Cart Mandate scope</td>
            </tr>
            <tr>
              <td><tt>token_authority</tt></td>
              <td>cryptographic</td>
              <td>Standing Token revoked or expired pre-execution</td>
            </tr>
            <tr>
              <td><tt>timestamp_skew</tt></td>
              <td>cryptographic</td>
              <td>Attestation timestamps violate ordering invariants</td>
            </tr>
            <tr>
              <td><tt>oracle_contradiction</tt></td>
              <td>cryptographic</td>
              <td>Third-party oracle data contradicts attestation</td>
            </tr>
            <tr>
              <td><tt>quality_mismatch</tt></td>
              <td>semantic</td>
              <td>Deliverable doesn't satisfy acceptance_criteria.checks</td>
            </tr>
            <tr>
              <td><tt>spec_ambiguity</tt></td>
              <td>semantic</td>
              <td>Acceptance criteria absent or under-specified</td>
            </tr>
            <tr>
              <td><tt>timing_breach</tt></td>
              <td>semantic</td>
              <td>SLA missed</td>
            </tr>
            <tr>
              <td><tt>fitness_for_purpose</tt></td>
              <td>semantic</td>
              <td>Deliverable formally compliant but unfit</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="verdict-enum-registry" numbered="true" title="ADRP Verdict Enum">
        <t>A new IANA registry "ADRP Verdicts" is requested.</t>
        <table>
          <thead>
            <tr>
              <th>Value</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><tt>release</tt></td>
              <td>Funds released to seller (counterparty)</td>
            </tr>
            <tr>
              <td><tt>refund</tt></td>
              <td>Funds returned to buyer (filer)</td>
            </tr>
            <tr>
              <td><tt>partial</tt></td>
              <td>Funds split per <tt>partial_split</tt> (must sum to 1.0)</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="trusted-registries-registry" numbered="true" title="ADRP Trusted Registries List">
        <t>A new IANA registry "ADRP Trusted Arbitrator Registries" is requested.</t>
      </section>

    </section><!-- end iana-considerations -->

    <!-- ============================================================ -->
    <section anchor="acknowledgements" numbered="true" title="Acknowledgements">
      <t>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).</t>

      <t>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.</t>
    </section><!-- end acknowledgements -->

  </middle>

  <back>

    <!-- ============================================================ -->
    <references anchor="normative-references">
      <name>Normative References</name>

      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>

      <reference anchor="W3C-VC-2.0" target="https://www.w3.org/TR/vc-data-model-2.0/">
        <front>
          <title>Verifiable Credentials Data Model 2.0</title>
          <author>
            <organization>W3C</organization>
          </author>
          <date year="2024"/>
        </front>
      </reference>

      <reference anchor="W3C-DID" target="https://www.w3.org/TR/did-core/">
        <front>
          <title>Decentralized Identifiers (DIDs) v1.0</title>
          <author>
            <organization>W3C</organization>
          </author>
          <date year="2022"/>
        </front>
      </reference>

      <reference anchor="draft-stone-atxn-00">
        <front>
          <title>ATXN: Agent-to-Agent Transaction Definition Protocol</title>
          <author fullname="Ben Stone" surname="stone" initials="B.">
            <organization>SwarmSync.AI</organization>
          </author>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-stone-atxn-00"/>
      </reference>

      <reference anchor="draft-stone-aivs-01">
        <front>
          <title>AIVS: Agentic Integrity Verification Standard</title>
          <author fullname="Ben Stone" surname="stone" initials="B.">
            <organization>SwarmSync.AI</organization>
          </author>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-stone-aivs-01"/>
      </reference>

      <reference anchor="draft-stone-vcap-01">
        <front>
          <title>VCAP: Verified Commerce for Agent Protocols</title>
          <author fullname="Ben Stone" surname="stone" initials="B.">
            <organization>SwarmSync.AI</organization>
          </author>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-stone-vcap-01"/>
      </reference>

      <reference anchor="draft-stone-atep-01">
        <front>
          <title>ATEP: Agent Trust and Execution Passport</title>
          <author fullname="Ben Stone" surname="stone" initials="B.">
            <organization>SwarmSync.AI</organization>
          </author>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-stone-atep-01"/>
      </reference>

    </references>

    <references anchor="informative-references">
      <name>Informative References</name>

      <reference anchor="FAA">
        <front>
          <title>Federal Arbitration Act, 9 U.S.C. Sections 1-16</title>
          <author>
            <organization>United States Congress</organization>
          </author>
          <date year="1925"/>
        </front>
      </reference>

      <reference anchor="NY-CONVENTION">
        <front>
          <title>Convention on the Recognition and Enforcement of Foreign Arbitral
          Awards</title>
          <author>
            <organization>United Nations</organization>
          </author>
          <date year="1958"/>
        </front>
      </reference>

      <reference anchor="UETA-14">
        <front>
          <title>Uniform Electronic Transactions Act Section 14</title>
          <author>
            <organization>Uniform Law Commission</organization>
          </author>
          <date year="1999"/>
        </front>
      </reference>

      <reference anchor="REST-AGENCY-3D">
        <front>
          <title>Restatement (Third) of Agency</title>
          <author>
            <organization>American Law Institute</organization>
          </author>
          <date year="2006"/>
        </front>
      </reference>

      <reference anchor="HOWEY">
        <front>
          <title>SEC v. W. J. Howey Co., 328 U.S. 293</title>
          <author>
            <organization>Supreme Court of the United States</organization>
          </author>
          <date year="1946"/>
        </front>
      </reference>

      <reference anchor="AP2" target="https://developers.google.com/wallet/agent-payments">
        <front>
          <title>Agent Payments Protocol</title>
          <author>
            <organization>Google</organization>
          </author>
          <date year="2025"/>
        </front>
      </reference>

      <reference anchor="KLEROS" target="https://kleros.io">
        <front>
          <title>Decentralized Court Protocol</title>
          <author>
            <organization>Kleros</organization>
          </author>
          <date year="2018"/>
        </front>
      </reference>

      <reference anchor="UMA" target="https://uma.xyz">
        <front>
          <title>Optimistic Oracle</title>
          <author>
            <organization>UMA Protocol</organization>
          </author>
          <date year="2020"/>
        </front>
      </reference>

      <reference anchor="STRIPE-CONNECT" target="https://stripe.com/docs/connect/disputes">
        <front>
          <title>Connect Disputes and Chargebacks</title>
          <author>
            <organization>Stripe</organization>
          </author>
          <date year="2024"/>
        </front>
      </reference>

      <reference anchor="UPWORK-MEDIATION" target="https://support.upwork.com/hc/en-us/articles/211062568">
        <front>
          <title>Dispute Process</title>
          <author>
            <organization>Upwork</organization>
          </author>
          <date year="2024"/>
        </front>
      </reference>

      <reference anchor="VISA-CHARGEBACK-CODES" target="https://usa.visa.com/dam/VCOM/download/about-visa/visa-rules-public.pdf">
        <front>
          <title>Visa Chargeback Reason Codes</title>
          <author>
            <organization>Visa Inc.</organization>
          </author>
          <date year="2024"/>
        </front>
      </reference>

      <reference anchor="OFAC-SANCTIONS" target="https://ofac.treasury.gov/specially-designated-nationals-and-blocked-persons-list-sdn-human-readable-lists">
        <front>
          <title>Specially Designated Nationals List</title>
          <author>
            <organization>U.S. Treasury OFAC</organization>
          </author>
          <date year="2024"/>
        </front>
      </reference>

    </references>

    <!-- ============================================================ -->
    <section anchor="appendix-json-schemas" numbered="false" title="Appendix A: JSON Schemas (Informative)">

      <section anchor="dispute-filing-schema" numbered="false" title="A.1 DisputeFiling Schema">
        <sourcecode type="json"><![CDATA[
{
  "$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" }
          }
        }
      }
    }
  }
}
        ]]></sourcecode>
      </section>

      <section anchor="ruling-bundle-schema" numbered="false" title="A.2 RulingBundle Schema">
        <sourcecode type="json"><![CDATA[
{
  "$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" }
  }
}
        ]]></sourcecode>
      </section>

    </section><!-- end appendix-json-schemas -->

    <!-- ============================================================ -->
    <section anchor="appendix-worked-example" numbered="false" title="Appendix B: Worked Example (Informative)">

      <section anchor="example-scenario" numbered="false" title="B.1 Scenario">
        <t>A small business principal (<tt>did:web:smb.example</tt>) 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.</t>
      </section>

      <section anchor="example-sequence" numbered="false" title="B.2 Sequence">
        <ol>
          <li>Agent emits DisputeFlag: <tt>claim_code quality_mismatch</tt>.</li>
          <li>Principal reviews flag within 72h, agrees booking is wrong.</li>
          <li>Principal emits DisputeFiling: <tt>quality_mismatch</tt>, filing_fee $25.00
          USDC.</li>
          <li>Arbitrator assigned via VRF from L2 curated AI pool.</li>
          <li>Principal submits evidence: original Cart Mandate showing "Portland" without
          state qualifier.</li>
          <li>Counterparty submits evidence: <tt>acceptance_criteria.checks</tt> is
          empty.</li>
          <li>Arbitrator finds <tt>spec_ambiguity</tt>. Verdict: partial, split 70/30 to
          buyer/seller.</li>
          <li>RulingBundle signed within 4h SLA.</li>
          <li>EscrowDirective: $175 to buyer, $75 to seller.</li>
          <li>AP2 Payment Mandate executor consumes EscrowDirective, executes split.</li>
          <li>Filing fee: 50% forfeited ($12.50), 50% refunded ($12.50).</li>
        </ol>
      </section>

      <section anchor="example-verification" numbered="false" title="B.3 Verification">
        <t>Any third party, given (DisputeBundle, RulingBundle), can run
        <tt>verify_resolution</tt> deterministically.</t>
      </section>

      <section anchor="example-precedent" numbered="false" title="B.4 Precedent">
        <t>RulingBundle indexed in precedent corpus by Cart Mandate template hash.</t>
      </section>

    </section><!-- end appendix-worked-example -->

    <!-- ============================================================ -->
    <section anchor="appendix-open-issues" numbered="false" title="Appendix C: Open Issues for Shadow-Mode Validation">

      <table>
        <thead>
          <tr>
            <th>Number</th>
            <th>Question</th>
            <th>Falsification Threshold</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>1</td>
            <td>Will principals author Cart Mandates with 3+ acceptance_criteria.checks?</td>
            <td>Less than 30% coverage at day 30 → ship NLP-to-checks helper as
            mandatory</td>
          </tr>
          <tr>
            <td>2</td>
            <td>Will the auto-resolution rate hit 60%+?</td>
            <td>Less than 60% at day 60 → escalate to architectural review</td>
          </tr>
          <tr>
            <td>3</td>
            <td>Will the frivolous filing rate stay below 2%?</td>
            <td>Greater than 2% at day 60 → tighten filing fee floor</td>
          </tr>
          <tr>
            <td>4</td>
            <td>Will the curated arbitrator pool meet SLA at scale?</td>
            <td>Greater than 5% SLA breaches at day 90 → expand pool or accelerate
            v0.2</td>
          </tr>
          <tr>
            <td>5</td>
            <td>Will the Arbitration Mandate be challenged in court?</td>
            <td>Any court challenge → seek immediate written legal opinion</td>
          </tr>
          <tr>
            <td>6</td>
            <td>Will the precedent corpus accumulate fast enough?</td>
            <td>Less than 100 corpus queries by arbitrators at month 3 → revisit</td>
          </tr>
          <tr>
            <td>7</td>
            <td>Are tier thresholds calibrated correctly?</td>
            <td>Filing rate greater than 5% or less than 0.05% → recalibrate</td>
          </tr>
        </tbody>
      </table>

      <t>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.</t>

    </section><!-- end appendix-open-issues -->

  </back>

</rfc>
