<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="exp"
     docName="draft-laxsharma-pact-01" ipr="trust200902"
     tocInclude="true" symRefs="true" sortRefs="false">
  <front>
    <title abbrev="PACT">PACT: Liability and Settlement for Autonomous Agent Contracts</title>
    <seriesInfo name="Internet-Draft" value="draft-laxsharma-pact-01"/>
    <author fullname="Laxmikant Sharma" initials="L." surname="Sharma">
      <organization>Independent</organization>
      <address><email>laxsharma79@gmail.com</email></address>
    </author>
    <date year="2026" month="September" day="4"/>
    <keyword>autonomous agents</keyword>
    <keyword>agent commerce</keyword>
    <keyword>escrow</keyword>
    <keyword>liability</keyword>
    <keyword>verification</keyword>

    <abstract>
      <t>A growing family of specifications lets autonomous agents establish
      identity, delegate authority, record what they did, and move money.
      None of them makes one party financially answerable to another for a
      result that was not delivered. This document specifies PACT, which adds
      liability as a required, co-signed member of an agent contract and
      propagates it through a subcontract tree.</t>

      <t>PACT defines the Verifiable Task Contract, a signed JSON object
      binding parties, scope, price, verification profile, and an explicit
      allocation of liability; the Delivery object that a contract is judged
      against; an escrowed settlement procedure whose release is conditioned
      on a stated assurance level rather than on elapsed time; and a
      subcontract tree in which a parent's Work Attestation commits to its
      children by Merkle root and liability cascades upward.</t>

      <t>PACT does not define an identity format, an authorization model, an
      audit architecture, a transparency service, a payment rail, or a
      reputation system. It composes existing work for all of these. Its
      settlement loop is an instance of optimistic fair exchange, and its
      bond-sizing rule is the classical deterrence bound; both are cited
      rather than reintroduced.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="intro"><name>Introduction</name>

      <section anchor="motivation"><name>Motivation</name>
        <t>By late 2026 an autonomous agent can prove who it is, show whose
        authority it acts under, discover another agent, call it, record what
        happened in a tamper-evident receipt, and pay for the call. Each of
        those is the subject of active standardisation, and several are
        specified in more detail than this document specifies anything.</t>

        <t>What no specification in that family states is who owes whom, and
        how much, when the work is wrong. Receipts record that an action
        occurred. Audit records establish whether behaviour matched intent.
        Payment schemes move value on the payer's instruction. None of them
        binds a party to a consequence.</t>

        <t>That gap is not an oversight in those documents; it is outside
        their scope, and correctly so. It is the gap this document
        addresses.</t>
      </section>

      <section anchor="scope"><name>What This Document Specifies, and What It Does Not</name>
        <t>PACT specifies exactly four things: liability as a required member
        of a co-signed contract object (<xref target="liability"/>); the
        Delivery object against which that contract is judged
        (<xref target="delivery"/>); a settlement procedure whose release is
        conditioned on a declared assurance level (<xref target="settlement"/>);
        and a subcontract tree through which liability cascades
        (<xref target="trees"/>).</t>

        <t>Everything else PACT needs, it composes and cites. In particular
        this document does not specify, and implementations MUST obtain
        elsewhere: agent identity and key distribution; delegation of
        authority from a human or organisational principal; agent discovery;
        a transport; an audit or accountability architecture; a transparency
        service; a payment rail or settlement network; a general reputation
        system; or a dispute forum.</t>

        <t>Two mechanisms present in
        <xref target="I-D.laxsharma-pact-00"/> have been removed rather than
        revised. Contract channels are withdrawn because the -00 text
        specified no channel state object, no sequence rule, and no
        termination condition, and payment channels for agent commerce are
        specified elsewhere. The sealed-bid second-price award procedure is
        withdrawn from this document because it is separable from settlement,
        is fully treated in the multi-agent systems literature, and made the
        -00 a document about two unrelated things. Neither removal is a
        judgement that the mechanism is wrong.</t>
      </section>

      <section anchor="related"><name>Relationship to Existing Work</name>
        <t>PACT's agree, perform, verify, settle loop is an instance of
        optimistic fair exchange <xref target="ASOKAN98"/>, in which a third
        party is contacted only when the exchange fails. The revocable-item
        case, developed in <xref target="ASOKAN98THESIS"/>, in which value
        moves and is later reversed on a third party's affidavit, is
        optimistic release in substance. What that
        literature establishes is what a third party must be able to do for an
        exchange to be fair. What it does not address, and what
        <xref target="assurance"/> addresses, is who pays to produce the
        evidence a dispute is decided on.</t>

        <t>The bond-sizing rule in <xref target="assurance"/> is the classical
        deterrence bound. It is stated for public enforcement generally in
        <xref target="POLINSKY99"/>, which traces it to Bentham, and for
        outsourced computation specifically in <xref target="BELENKIY08"/>,
        whose Theorem 1 sets a fine-to-reward ratio of (1-p)/p, where p is the
        probability that an incorrect result is checked, with the fine posted
        in advance as a deposit. It is
        stated for rollup validators in <xref target="MAMAGEISHVILI23"/>. This
        document adds one term to it, for value released before verification
        concludes, and claims nothing further.</t>

        <t>Two adjacent Internet-Drafts address agent commerce settlement
        directly. <xref target="I-D.hood-agtp-commerce"/> carries Work
        Completion Records and an audit-verified settlement timing;
        <xref target="I-D.stone-vcap-ap2-binding"/> binds verified commerce
        settlement to the Agent Payments Protocol. Neither allocates
        liability between the parties, and PACT is designed to be usable
        alongside either.</t>

        <t>Verification evidence formats are specified in
        <xref target="RFC9334"/> and <xref target="RFC9711"/>. Signed,
        hash-chained action receipts
        <xref target="I-D.sahu-agent-action-receipts"/>, composition of
        accountability records
        <xref target="I-D.mih-sato-agent-accountability-composition"/>,
        delegation chains
        <xref target="I-D.asor-wimse-agent-delegation-chain"/>, and
        contestability bindings
        <xref target="I-D.pinto-agent-authz-contestability"/> are each
        specified elsewhere, and PACT consumes rather than restates them.</t>
      </section>

      <section anchor="experiment"><name>The Experiment</name>
        <t>This document is Experimental. The question it tests is whether a
        settlement layer that makes liability a co-signed contract term, and
        conditions release on a declared detection probability rather than
        on elapsed time, can be implemented independently by more than one
        party and produce settlements each can verify. The experiment
        succeeds if two independent Facilitator implementations settle
        contracts whose Buyers and Sellers use different client
        implementations, through every terminal state in
        <xref target="fig-states"/>, with attestations either can check. It
        fails, and that would itself be a result worth recording, if the
        constraint in <xref target="assurance"/> proves unworkable at the
        prices and verification costs real deployments exhibit. Experience
        should be reported to the author and to the repository named in
        <xref target="implstatus"/>.</t>
      </section>

      <section anchor="changes"><name>Changes from -00</name>
        <t>This revision is a narrowing. The -00 attempted the surface area of
        a protocol suite in under five thousand words and did not close.
        Substantive changes:</t>
        <ul>
          <li>Liability is promoted from a member of the contract to the
          subject of the document (<xref target="liability"/>).</li>
          <li>A Delivery object is added. The -00 specified no object for the
          thing being judged, so absent evidence was not a fraud proof and
          non-delivery had no remedy (<xref target="delivery"/>).</li>
          <li>The remedy waterfall is reordered to pay restitution before any
          bounty or burn. Under the -00 a defrauded buyer recovered nothing
          from a slashed bond (<xref target="waterfall"/>).</li>
          <li>Release is conditioned on a declared assurance level, and
          <tt>on-verification</tt> replaces optimistic release as the default
          and the only mode required of conformant implementations
          (<xref target="release"/>).</li>
          <li>An Assurance Constraint is stated that a facilitator can check
          before locking funds (<xref target="assurance"/>).</li>
          <li>Bond release on contract finality is specified. The -00 had no
          rule returning a seller's bond.</li>
          <li>Subcontract finality is bottom-up, resolving the -00's
          requirement that a parent commit to child attestations that could
          not yet exist (<xref target="trees"/>).</li>
          <li>Protocol endpoints are specified. The -00 defined objects and no
          operations, so no two implementations could exchange a message
          (<xref target="endpoints"/>).</li>
          <li>Conformance requirements are stated
          (<xref target="conformance"/>). Several rules enforced by the
          reference validator for -00 had no normative text, including the JWS
          algorithm allowlist, which left an implementation built from the
          document alone open to algorithm confusion.</li>
          <li>A worked example is carried in the document and committed by hash
          (<xref target="example"/>). The -00 contained no numeric example and
          no digest, so it made no verifiable claim about its own reference
          implementation.</li>
          <li>Contract channels and the sealed-bid award procedure are removed
          (<xref target="scope"/>).</li>
        </ul>
      </section>
    </section>

    <section anchor="conventions"><name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
      "OPTIONAL" in this document are to be interpreted as described in
      BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only
      when, they appear in all capitals, as shown here.</t>
      <t>All JSON objects defined here are canonicalized with JCS
      <xref target="RFC8785"/> before hashing or signing. Implementations MUST
      order object keys by UTF-16 code unit as
      <xref target="RFC8785"/> Section 3.2.3 requires. Sorting by Unicode code
      point is a common substitution; it agrees with the required order
      throughout the Basic Multilingual Plane and diverges above it.</t>

      <t>Version. The <tt>pact</tt> member carries a version of the form
      major.minor; this document defines 0.1. Every object defined here is
      hash-committed and signed, so a member an implementation does not
      recognise is inside the commitment and cannot be ignored safely. An
      implementation MUST reject an object whose <tt>pact</tt> version it
      does not implement, and MUST reject an object carrying a member this
      document does not define for it. Extension is by a new version, not
      by adding members.</t>

      <t>Time. Every timestamp is an RFC 3339 date-time
      <xref target="RFC3339"/> in UTC with the "Z" designator. The
      Facilitator's clock governs every deadline and window in this
      document: the instant at which the Facilitator records an object is
      the instant that counts, and parties SHOULD allow for skew when
      acting near a boundary.</t>

      <t>Money. An amount is a decimal string with no exponent and a
      fractional part of two to eighteen digits; comparisons are exact and
      no rounding is implied. A currency is an asset identifier whose
      namespace is defined by the settlement binding named in
      <tt>price.settlement</tt>, and need not be an ISO 4217 code. A
      network is a ledger identifier in the form the same binding defines;
      the <tt>pact-escrow</tt> binding uses <xref target="CAIP-2"/> chain
      identifiers.</t>
    </section>

    <section anchor="terminology"><name>Terminology</name>
      <dl>
        <dt>Buyer:</dt><dd>The party that commissions work and locks the price.</dd>
        <dt>Seller:</dt><dd>The party that performs the work and posts the Bond.</dd>
        <dt>Facilitator:</dt><dd>A service that holds value and executes the
        contract's settlement terms without discretion over its outcome. It
        checks that objects conform and applies rules fixed in advance. It
        MUST NOT decide whether delivered work was acceptable; that is the
        Verifier's role, and a Facilitator MUST NOT act as Verifier for a
        contract it settles.</dd>
        <dt>Verifier:</dt><dd>The party that evaluates a Delivery against the
        committed acceptance instrument for release purposes. Independence
        requirements are in <xref target="independence"/>.</dd>
        <dt>Challenger:</dt><dd>Any party that submits a fraud proof within
        the challenge window.</dd>
        <dt>Bond:</dt><dd>Seller-posted collateral, sized per
        <xref target="assurance"/>, from which restitution and penalties are
        paid.</dd>
        <dt>Verification Fund:</dt><dd>Value posted at Agree, separate from the
        Bond, that pays for verification actually performed.</dd>
        <dt>VTC:</dt><dd>Verifiable Task Contract (<xref target="vtc"/>).</dd>
        <dt>Delivery:</dt><dd>The object a Seller submits, and the only object
        a contract is judged against (<xref target="delivery"/>).</dd>
        <dt>Verdict:</dt><dd>A signed statement by a Verifier that a Delivery
        was evaluated against the committed instrument, and with what outcome
        (<xref target="ep-verdict"/>).</dd>
        <dt>Challenge:</dt><dd>A signed fraud proof submitted within the
        challenge window (<xref target="challenge-object"/>).</dd>
        <dt>Work Attestation:</dt><dd>The Facilitator-signed record of a
        contract's terminal outcome (<xref target="attestations"/>).</dd>
      </dl>
    </section>

    <section anchor="overview"><name>Protocol Overview</name>
      <t>A contract passes through four phases. Propose establishes terms.
      Agree co-signs them and funds the three value pools. Complete produces a
      Delivery and a Verdict on it. Trust records what happened in a Work
      Attestation. The ordering below is normative; in particular a Verdict
      precedes release under the default release mode.</t>

      <figure anchor="fig-flow">
        <name>Contract flow under the default on-verification release mode</name>
        <artwork type="ascii-art"><![CDATA[
 Buyer            Facilitator         Seller         Verifier
   |                   |                 |               |
   |<== VTC negotiated and co-signed ===>|               |
   |                   |                 |               |
   |--- lock(P) ------>|                 |               |
   |                   |<--- bond(B) ----|               |
   |                   |<--- fund(F) ----|               |
   |                   |                 |               |
   |                   |     [ Seller performs ]         |
   |                   |                 |               |
   |                   |<-- Delivery ----|               |
   |                   |                 |               |
   |                   |-- Delivery + criteria_hash ---->|
   |                   |<-- Verdict (signed) ------------|
   |                   |                 |               |
   |                   |-- release(P) -->|               |
   |                   |  [ window ] [ children final ]  |
   |                   |-- return(B,F) ->|               |
   |                   |                 |               |
   |<-- Attestation ---|-- Attestation ->|               |
        ]]></artwork>
      </figure>

      <t>The challenge window opens when the Verdict is recorded under
      <tt>on-verification</tt> release, and when the contract enters
      DELIVERED under <tt>on-window</tt> and <tt>optimistic</tt> release; it
      closes <tt>challenge.window_seconds</tt> later by the Facilitator's
      clock. Under
      <tt>on-verification</tt> the Buyer's price is released once the Verdict
      is PASS; the Bond is not returned until the window closes and every
      descendant contract is final (<xref target="trees"/>).</t>

      <figure anchor="fig-states">
        <name>Contract states under on-verification release</name>
        <artwork type="ascii-art"><![CDATA[
                  +------------+
                  |  PROPOSED  |
                  +------------+
                        | both signatures present
                        v
                  +------------+  deadline,   +-----------+
                  |   FUNDED   |------------->| ABANDONED |
                  +------------+  no Delivery +-----------+
                        | Delivery accepted
                        v
                  +------------+
                  | DELIVERED  |
                  +------------+
                        | Verdict recorded
             +----------+----------+
       PASS  |                     |  FAIL
             v                     v
      +------------+        +------------+
      | RELEASING  |        |  DISPUTED  |
      +------------+        +------------+
             |                     |
   window    |                     | remedy applied
   closed,   |                     | (Section 7.4)
   children  v                     v
   final +------------+     +------------+
         |   FINAL    |     |  SETTLED   |
         +------------+     +------------+
        ]]></artwork>
      </figure>

      <t>Under <tt>optimistic</tt> release DELIVERED proceeds directly to
      RELEASING and a Verdict, if one arrives, does so inside the window.
      Under <tt>on-window</tt> release DELIVERED proceeds to RELEASING when
      the window closes with no successful Challenge. Under
      <tt>unsecured</tt> release DELIVERED proceeds to RELEASING and no
      window opens. FINAL, SETTLED and ABANDONED are terminal, and each
      produces a Work Attestation. The -00 had no path to either: expiry of
      <tt>task.deadline</tt> had no stated consequence, so escrow could lock
      permanently, and a negative outcome required the signature of the party
      it convicted.</t>
    </section>

    <section anchor="vtc"><name>The Verifiable Task Contract</name>
      <t>A VTC is a JSON object, media type
      <tt>application/pact-contract+json</tt>, carrying the members below. A
      VTC is valid only if every REQUIRED member is present, the parties are
      distinct, and both the Buyer and the Seller have contributed at least
      one signature that verifies against a key bound to its identifier. The
      Facilitator and any Verifier do not sign the VTC; their assent is
      expressed by acting on it, and a Facilitator that will not act on a
      contract refuses it at <xref target="ep-propose"/>.</t>

      <dl>
        <dt><tt>pact</tt>:</dt><dd>REQUIRED. Protocol version.</dd>
        <dt><tt>type</tt>:</dt><dd>REQUIRED. The string
        <tt>VerifiableTaskContract</tt>.</dd>
        <dt><tt>id</tt>:</dt><dd>REQUIRED. Contract identifier, unique for the
        Facilitator named in <tt>settlement</tt>.</dd>
        <dt><tt>parties</tt>:</dt><dd>REQUIRED. Object with <tt>buyer</tt>,
        <tt>seller</tt> and <tt>facilitator</tt> identifiers, and OPTIONAL
        <tt>verifier</tt>. Buyer and seller MUST differ. Where
        <tt>verifier</tt> is absent, the Verdict MUST come from a party
        satisfying <xref target="independence"/>.</dd>
        <dt><tt>task</tt>:</dt><dd>REQUIRED. Object with <tt>spec_hash</tt>,
        <tt>deadline</tt>, and OPTIONAL <tt>spec_uri</tt>.</dd>
        <dt><tt>price</tt>:</dt><dd>REQUIRED. Object with <tt>amount</tt>,
        <tt>currency</tt>, <tt>settlement</tt> binding identifier, and
        <tt>network</tt>.</dd>
        <dt><tt>verification</tt>:</dt><dd>REQUIRED. Object with
        <tt>tier</tt>, <tt>profile</tt> (<xref target="profiles"/>),
        <tt>criteria_hash</tt>, and OPTIONAL <tt>arbiter</tt>.</dd>
        <dt><tt>assurance</tt>:</dt><dd>REQUIRED. Object with <tt>mode</tt>
        and <tt>q_min</tt> (<xref target="assurance"/>).</dd>
        <dt><tt>release</tt>:</dt><dd>REQUIRED. Release mode
        (<xref target="release"/>). Absent an explicit value a Facilitator
        MUST treat the contract as <tt>on-verification</tt>.</dd>
        <dt><tt>liability</tt>:</dt><dd>REQUIRED
        (<xref target="liability"/>).</dd>
        <dt><tt>challenge</tt>:</dt><dd>REQUIRED. Object with
        <tt>window_seconds</tt>, which MUST be greater than zero, and
        <tt>max_dispute_seconds</tt>.</dd>
        <dt><tt>signatures</tt>:</dt><dd>REQUIRED. Array of JWS signatures
        over the JCS-canonical form of the VTC excluding the
        <tt>signatures</tt> member, per <xref target="conformance"/>.</dd>
      </dl>

      <t>The <tt>settlement</tt> identifier, the network and the asset are all
      carried inside <tt>price</tt> so that a co-signed VTC is bound to one
      venue. The -00 omitted them, which made a signed contract replayable
      against any facilitator, chain or token contract.</t>

      <figure anchor="fig-vtc">
        <name>A Verifiable Task Contract, signatures abbreviated</name>
        <sourcecode type="json" name="vtc.json"><![CDATA[
{
  "pact": "0.1",
  "type": "VerifiableTaskContract",
  "id": "vtc_7f3a91",
  "parties": {
    "buyer":       "did:web:acme.example",
    "seller":      "did:web:dataforge.example",
    "facilitator": "did:web:settle.example",
    "verifier":    "did:web:audit.example"
  },
  "task": {
    "spec_hash": "sha256:bb0e87ce522479b7c2f7bcfa26df7ecd7ff67aeb8b4
                  15bbd70c22d97c47adf35",
    "deadline":  "2026-11-14T00:00:00Z"
  },
  "price": {
    "amount":     "180.00",
    "currency":   "USDC",
    "settlement": "pact-escrow",
    "network":    "eip155:8453"
  },
  "verification": {
    "tier":          "T0-reexec",
    "profile":       "acceptance",
    "criteria_hash": "sha256:d9205d4f2922afd55c0a2dc4ab00d8ee5a5123
                      43430bcf5e9abf0c76d66c69f7"
  },
  "assurance": { "mode": "certain", "q_min": 1.0 },
  "release":   "on-verification",
  "liability": {
    "seller_bond":       "18.00",
    "verification_fund": "0.50",
    "cap":               "180.00",
    "restitution_basis": "released"
  },
  "challenge": {
    "window_seconds": 3600,
    "max_dispute_seconds": 86400
  },
  "signatures": [ { "protected": "...", "signature": "..." },
                  { "protected": "...", "signature": "..." } ]
}
        ]]></sourcecode>
      </figure>

      <t>Hash values are wrapped here for page width only; they are single
      JSON strings with no embedded whitespace.</t>

      <section anchor="hashes"><name>Hash Commitments and Content Conveyance</name>
        <t>Every URI carried inside hash-committed content MUST be accompanied
        by a sibling hash over the dereferenced bytes. The -00 committed
        <tt>harness_uri</tt> as a string while leaving the bytes at that URI
        uncommitted, which permitted a Buyer to substitute the acceptance
        instrument after signature, run the substituted instrument, and submit
        the failure as a valid fraud proof.</t>
        <t>Where the committed content is a bundle of files rather than a
        single octet stream, the commitment MUST be computed as
        <tt>SHA-256(JCS(M))</tt> where M is an object mapping each file's
        path, relative to the bundle root and expressed with "/" separators,
        to <tt>SHA-256</tt> of its bytes. A manifest of per-file digests is
        specified rather than an archive digest because archive formats carry
        ordering, timestamp and permission metadata that is not stable across
        producers.</t>
      </section>

      <section anchor="taskspec"><name>The Task Specification</name>
        <t>The content committed by <tt>spec_hash</tt> is a TaskSpec: a JSON
        object, canonicalized per <xref target="RFC8785"/> before hashing,
        with the members below.</t>
        <dl>
          <dt><tt>description</tt>:</dt><dd>REQUIRED. Natural-language
          statement of the work.</dd>
          <dt><tt>inputs</tt>:</dt><dd>OPTIONAL. Object carrying
          <tt>schema_uri</tt> with its <tt>schema_hash</tt>, and where a
          representative sample is published, <tt>sample_uri</tt> with its
          <tt>sample_hash</tt>.</dd>
          <dt><tt>deliverable</tt>:</dt><dd>REQUIRED. Output format and
          <tt>schema_uri</tt> with <tt>schema_hash</tt>.</dd>
          <dt><tt>acceptance</tt>:</dt><dd>REQUIRED. The verification
          instrument, with members conditional on tier as below, plus
          machine-readable <tt>thresholds</tt> and <tt>harness_hash</tt>
          equal to the contract's <tt>criteria_hash</tt>.</dd>
          <dt><tt>constraints</tt>:</dt><dd>OPTIONAL. Tool prohibitions,
          confidentiality and compliance conditions.</dd>
        </dl>

        <t>The <tt>acceptance</tt> object MUST carry the members REQUIRED for
        the contract's tier: <tt>harness_uri</tt> and <tt>harness_hash</tt>
        for re-execution tiers, enclave and model policy for attestation
        tiers, a proof statement with its verifying key for proving tiers, or
        <tt>rubric_uri</tt> and <tt>rubric_hash</tt> for judgment tiers. An
        empty <tt>acceptance</tt> object MUST be rejected. The -00's schema
        permitted one, which made every fraud proof impossible and quietly
        converted conditional release into unconditional payment.</t>

        <t>Thresholds MUST be stated so that they cannot be satisfied by
        returning almost nothing. A threshold expressed only as a rate over
        returned rows is satisfied by returning one correct row out of
        millions; a completeness condition relative to the committed input is
        therefore REQUIRED wherever the deliverable is a transformation of
        that input.</t>
      </section>

      <section anchor="liability"><name>Liability</name>
        <t>The <tt>liability</tt> member is REQUIRED in a VTC. It states, in
        advance and with both parties' signatures over it, what each party
        owes the other when the contract is not performed. A contract that
        does not allocate liability is not a PACT contract.</t>
      <dl>
        <dt><tt>seller_bond</tt>:</dt><dd>REQUIRED. Collateral the Seller
        posts before performance, sized per <xref target="assurance"/>. It is
        the source of restitution, not a fine.</dd>
        <dt><tt>verification_fund</tt>:</dt><dd>REQUIRED. Value posted at
        Agree that pays for verification actually performed and for a
        successful Challenger's documented costs. It is separate from the Bond
        because paying verifiers out of the Bond caps reimbursement at the
        Bond, which for any re-execution profile is an order of magnitude too
        little.</dd>
        <dt><tt>cap</tt>:</dt><dd>REQUIRED. The maximum protocol-native
        remedy. A Facilitator MUST NOT move more than <tt>cap</tt> from the
        Seller under this contract.</dd>
        <dt><tt>restitution_basis</tt>:</dt><dd>REQUIRED. One of
        <tt>released</tt>, restoring the Buyer up to value already released,
        or <tt>price</tt>, restoring the full price. Determines the second
        rank of the waterfall in <xref target="waterfall"/>.</dd>
        <dt><tt>parent</tt>:</dt><dd>OPTIONAL. Present only in a subcontract.
        Object with the parent's <tt>vtc_id</tt> and <tt>vtc_hash</tt>
        (<xref target="tree-binding"/>).</dd>
        <dt><tt>remainder_to</tt>:</dt><dd>OPTIONAL. Where slashed value
        remaining after rank 4 of <xref target="waterfall"/> is directed:
        <tt>buyer</tt> or <tt>sink</tt>. Absent, <tt>sink</tt>. A sink is a
        Facilitator-designated destination that is not a party to the
        contract. <tt>buyer</tt> is permitted but rewards a Buyer beyond its
        loss, which is an incentive to manufacture challenges; the default
        exists for that reason.</dd>
      </dl>

      <t>Liability under PACT is bounded by <tt>cap</tt> and is discharged in
      the contract's own currency. This document creates no cause of action
      and displaces no other remedy: consequential loss beyond <tt>cap</tt>,
      and any obligation arising outside this contract, are out of band. A
      specification that implied otherwise would be claiming to settle
      questions it has no standing to settle.</t>

      <t>A <tt>parent</tt> member is authenticated not by a separate
      countersignature but by the rule in <xref target="tree-binding"/>: the
      child's Buyer must be the parent's Seller. Since <tt>liability</tt> is
      inside the bytes the Buyer signs, the Buyer's signature on the child is
      itself the authorisation to attach it.</t>
      </section>
    </section>

    <section anchor="delivery"><name>The Delivery Object</name>
      <t>The Delivery is the object a contract is judged against. The -00
      specified none, with three consequences: a Seller that attached no
      evidence presented nothing that could be shown invalid, so absence of
      evidence was not a fraud proof; release fired on "delivery", an event
      the Facilitator had no defined way to observe; and non-delivery had no
      remedy at all, so escrow could lock permanently.</t>

      <t>A Delivery is a JSON object, media type
      <tt>application/pact-delivery+json</tt>.</t>

      <dl>
        <dt><tt>pact</tt>, <tt>type</tt>:</dt><dd>REQUIRED. Version, and the
        string <tt>Delivery</tt>.</dd>
        <dt><tt>vtc_id</tt>, <tt>vtc_hash</tt>:</dt><dd>REQUIRED. Identify and
        commit to the contract being performed. <tt>vtc_hash</tt> is computed
        over the JCS-canonical VTC including its <tt>signatures</tt> member,
        so the commitment covers who agreed and not merely what was
        written.</dd>
        <dt><tt>work_hash</tt>:</dt><dd>REQUIRED. Digest over the delivered
        bytes, or a manifest digest per <xref target="hashes"/> where the
        deliverable is a bundle.</dd>
        <dt><tt>work_uri</tt>:</dt><dd>OPTIONAL. Where the bytes may be
        fetched. Integrity comes from <tt>work_hash</tt>, never from the
        transport.</dd>
        <dt><tt>input_hash</tt>:</dt><dd>REQUIRED for tiers whose fraud proof
        re-executes. Commits the production input actually consumed. Without
        it a Challenger chooses what to re-execute against and an honest
        Seller can be convicted on an input it never saw.</dd>
        <dt><tt>evidence</tt>:</dt><dd>REQUIRED. Object whose members are
        profiled by <tt>verification.tier</tt>. Its conformance to the tier
        profile is a validity condition, not a quality judgement.</dd>
        <dt><tt>signature</tt>:</dt><dd>REQUIRED. Seller JWS over the
        JCS-canonical Delivery excluding this member.</dd>
      </dl>

      <t>A Facilitator MUST reject a Delivery whose <tt>evidence</tt> is
      absent or does not conform to the profile named in the VTC, and MUST
      apply <xref target="waterfall"/> as though a FAIL Verdict had been
      recorded. This is a conformance rejection, not a judgement on the work:
      the Facilitator has checked shape, not substance, which is why it does
      not breach the separation in <xref target="terminology"/>. This is the rule that makes silence
      expensive: under the -00 the cheapest attack was to deliver
      nothing verifiable and be paid anyway.</t>

      <t>Where <tt>task.deadline</tt> passes with no conformant Delivery
      recorded, the Facilitator MUST move the contract to ABANDONED, return
      the escrowed price to the Buyer, and slash the Bond to the extent of
      <tt>liability.restitution_basis</tt>. No challenge window opens, because
      there is nothing to challenge.</t>

      <figure anchor="fig-delivery">
        <name>A Delivery for a T0-reexec contract, acceptance profile</name>
        <sourcecode type="json" name="delivery.json"><![CDATA[
{
  "pact": "0.1",
  "type": "Delivery",
  "vtc_id":   "vtc_7f3a91",
  "vtc_hash": "sha256:b2cccae00fc7b97ba2b6ef6356ff42c006ba661e0249
               d7eaa8baff3de553870b",
  "work_hash":  "sha256:9c1f...",
  "work_uri":   "https://cdn.dataforge.example/o/9c1f",
  "input_hash": "sha256:41ab...",
  "evidence": {
    "profile":        "acceptance",
    "instrument_hash":"sha256:d9205d4f...",
    "results_hash":   "sha256:7e02...",
    "results_uri":    "https://cdn.dataforge.example/o/7e02"
  },
  "signature": { "protected": "...", "signature": "..." }
}
        ]]></sourcecode>
      </figure>

      <t>A Buyer countersignature over the same canonical bytes constitutes a
      receipt and moves the contract to DELIVERED without waiting for the
      Facilitator's own conformance check. A Buyer is not obliged to
      countersign, and withholding a countersignature is not a Verdict.</t>
    </section>

    <section anchor="settlement"><name>Settlement</name>
      <section anchor="pools"><name>Value Pools</name>
        <t>A contract funds three pools, which the -00 conflated into one.
        The Escrow holds the Buyer's price. The Bond is Seller collateral and
        is the source of restitution. The Verification Fund pays for
        verification performed and for a successful Challenger's documented
        costs.</t>

        <t>Separating the second and third is not tidiness. Under the -00 a
        Challenger was reimbursed from the slashed Bond, so reimbursement was
        capped by the Bond; for any re-execution profile the cost of producing
        a fraud proof approximates the cost of the work itself, which exceeds
        any plausible fraction of a Bond by roughly an order of magnitude. The
        -00's MUST to reimburse documented verification costs was therefore
        unsatisfiable in the ordinary case.</t>

        <figure anchor="fig-pools">
        <name>The three pools and which waterfall rank draws on which</name>
        <artwork type="ascii-art"><![CDATA[
   Escrow (P)           Bond (B)           Verification Fund (F)
   buyer's price        seller collateral  pays for checking
        |                    |                      |
 1      |-- unreleased ----> Buyer                  |
 2      |                    |         costs <------|-> Challenger
 3      |                    |-- restitution -> Buyer
 4      |                    |-- bounty -----> Challenger
 5      |                    |-- remainder --> remainder_to
        ]]></artwork>
      </figure>

      <t>A Facilitator MUST NOT permit cumulative release before a recorded
        Verdict to exceed the Bond. Value released before verification is
        value the mechanism can no longer recover, so releasing more than the
        Bond makes defection profitable by construction, independently of
        every other parameter.</t>
      </section>
      <section anchor="assurance"><name>The Assurance Constraint</name>
        <t>Let P be the price, C the Seller's cost of performing honestly, B
        the Bond, E the cumulative amount released before a Verdict is
        recorded, and q the probability that a defection is detected, proven,
        and adjudicated within the contract's own time bounds. Honest
        performance is a Seller's best response exactly when:</t>

        <artwork type="ascii-art"><![CDATA[
        q * ( (P - E) + B )  >=  C
        ]]></artwork>

        <t>A Facilitator cannot evaluate that directly, because C is private
        to the Seller. It can evaluate a sufficient condition. A Seller that
        bids rationally has C no greater than P, so requiring the expected
        recoverable exposure to cover P suffices, and gives a constraint in
        observable quantities alone:</t>

        <artwork type="ascii-art"><![CDATA[
        B  >=  P * (1 - q) / q  +  E
        ]]></artwork>

        <t>A Facilitator MUST evaluate this constraint against the contract's
        declared <tt>assurance.q_min</tt> before locking funds, and MUST
        refuse a contract that does not satisfy it.</t>

        <t>Read as a requirement on q rather than on B, and with E set to
        zero, this is q at least P/(P+B). A Bond of ten percent of price, the
        conventional figure, is therefore a wager that better than nine in ten
        defections are detected and proven and adjudicated in time. The -00
        stated no such requirement and funded no mechanism that would produce
        such a rate.</t>

        <t>This inequality is not new and is not claimed as new. It is the
        classical deterrence bound, stated for public enforcement in
        <xref target="POLINSKY99"/>, which traces it to Bentham, and for
        outsourced computation, with the fine posted in advance as a deposit
        held by the principal, in <xref target="BELENKIY08"/> Theorem 1. Its
        form for rollup validators is <xref target="MAMAGEISHVILI23"/>. The
        only term this document contributes is E. Every prior statement
        withholds the reward until checking has had its opportunity, so none
        of them has a notion of value released before verification concludes.
        Optimistic release both pays a defecting Seller and puts that payment
        beyond recovery, so the required Bond rises with it one for one. That
        is why a contract can satisfy the classical bound at Agree and violate
        it by the time judgment arrives.</t>

        <t>The <tt>assurance.mode</tt> member states how q is produced:</t>
        <dl>
          <dt><tt>certain</tt>:</dt><dd>Every Delivery is verified before
          release. q is 1 by construction.</dd>
          <dt><tt>committed-sample</tt>:</dt><dd>A declared fraction,
          <tt>sample_rate</tt>, is verified. The draw MUST derive from a Buyer seed committed before
          the Delivery is submitted, combined with the Delivery commitment, so
          that neither party can bias which contracts are checked.</dd>
          <dt><tt>open</tt>:</dt><dd>Detection relies on third-party
          challenge. A contract MUST NOT declare <tt>open</tt> as its sole
          source of assurance. Open challenge is a backstop against verifier
          failure, not a source of q: no party is obliged to look, and
          <xref target="waterfall"/> shows that a bounded reward is
          dominated by silence.</dd>
        </dl>
      </section>
      <section anchor="release"><name>Release Modes</name>
        <t>The <tt>release</tt> member takes one of four values. A
        conformant Facilitator MUST implement <tt>on-verification</tt>; the
        others are OPTIONAL.</t>
        <dl>
          <dt><tt>on-verification</tt>:</dt><dd>REQUIRED to implement, and the
          default. Release follows a recorded PASS Verdict.</dd>
          <dt><tt>on-window</tt>:</dt><dd>Release follows expiry of the
          challenge window, which opens at DELIVERED, with no successful
          Challenge.</dd>
          <dt><tt>optimistic</tt>:</dt><dd>Release follows Delivery, before
          any Verdict, subject to the cap in <xref target="pools"/>.</dd>
          <dt><tt>unsecured</tt>:</dt><dd>Release follows Delivery with no
          bound tying released value to the Bond. This is the honest name for
          extending credit to a counterparty. A Facilitator MUST record it as
          such, and no protocol-native remedy exists above the Bond for the
          unsecured portion.</dd>
        </dl>
        <t>The -00 made optimistic release the only mode. Its benefit to the
        Seller is the time value of the price over the challenge window; its
        cost is the carry on collateral sized to make it safe. On ordinary
        parameters the second exceeds the first by more than an order of
        magnitude, so correctly collateralized optimistic release is close to
        a null transaction and under-collateralized it is a transfer from
        Buyer to defecting Seller. It is retained as an option because some
        deployments will want it, and named honestly.</t>
      </section>
      <section anchor="waterfall"><name>Challenge and Remedy</name>
        <t>On a FAIL Verdict or a successful challenge, a Facilitator MUST
        apply the following in order, and MUST NOT proceed to a later rank
        while an earlier one is unsatisfied:</t>
        <ol>
          <li>Reverse any unreleased escrow to the Buyer.</li>
          <li>Reimburse the successful Challenger's documented verification
          and submission costs, <strong>from the Verification Fund</strong>.</li>
          <li>Restore the Buyer from the Bond, up to
          <tt>liability.restitution_basis</tt>.</li>
          <li>Pay the Challenger bounty from the remaining Bond.</li>
          <li>Direct any remainder per <tt>liability.remainder_to</tt>.</li>
        </ol>

        <t>Ranks 2 and 3 are the correction of the -00, whose waterfall paid
        the Challenger and then directed the remainder to a neutral sink
        "rather than to any party to the dispute". Since the Buyer is a party
        to the dispute, a defrauded Buyer recovered nothing. That mechanism
        binds work to punishment, not work to payment, and the words
        restitution, refund, compensation and damages appeared nowhere in
        it.</t>

        <t>The bounty at rank 4 MUST NOT be capped at a fraction of the Bond
        chosen for tidiness. Let X be the Seller's exposure at judgment, the
        Bond plus unreleased price. A party that discovers a fraud and reports
        it receives the bounty; a Seller facing X will pay up to X to avoid
        judgment. Wherever the bounty is less than X there exists a private
        payment leaving both strictly better off than reporting, so silence
        dominates the designed mechanism. <xref target="BELENKIY08"/> Theorem
        6 gives the corresponding lower bound in its own setting: a bounty of
        at least r/(1-a), where r is the reward and a is the accuracy a
        cheating contractor can reach by cheaper means, so never less than
        the reward itself. The symbol a is used here to avoid a collision
        with this document's q.</t>

        <t>Raising the bounty to X is not the answer either, since that leaves
        nothing for rank 3 and maximises the incentive to manufacture
        challenges. Two mitigations are specified instead. The reward MUST be
        non-exclusive: where K parties independently discover the same fraud
        each receives the full bounty, so buying silence costs K times what
        reporting pays once. And the Buyer MUST be admissible as a Challenger
        in its own contract, since a Buyer that recovers restitution by
        challenging will not accept a bribe below the restitution it
        forgoes, which places a floor under any bribe a Seller must pay.</t>

        <figure anchor="fig-dispute">
          <name>The dispute path: a Challenge overturns a PASS Verdict</name>
          <artwork type="ascii-art"><![CDATA[
  Buyer        Facilitator       Verifier      Challenger
    |              |                 |               |
    |              |<-- Verdict PASS |               |
    |              |-- release(P) -> Seller          |
    |              |   [ window opens ]              |
    |              |<------------- Challenge --------|
    |              |-- Challenge + Delivery -------->|
    |              |<-- Verdict FAIL |               |
    |              |   (supersedes PASS)             |
    |<- rank 1 ----|   unreleased escrow             |
    |              |-- rank 2 (from F) ------------->|
    |<- rank 3 ----|   restitution (from B)          |
    |              |-- rank 4 (from B) ------------->|
    |              |-- rank 5 --> remainder_to       |
    |              |   SETTLED, Attestation issued   |
        ]]></artwork>
        </figure>
      </section>
      <section anchor="challenge-object"><name>The Challenge Object</name>
        <t>A Challenge is a JSON object, media type
        <tt>application/pact-challenge+json</tt>, by which any party submits a
        fraud proof within the window. Members: <tt>pact</tt>, <tt>type</tt>
        (the string <tt>Challenge</tt>), <tt>vtc_id</tt>,
        <tt>delivery_hash</tt>, a <tt>proof</tt> object whose members are
        profiled by <tt>verification.profile</tt>, and the Challenger's
        <tt>signature</tt>. A Facilitator MUST reject a Challenge received
        outside the window, one whose <tt>proof</tt> does not conform to the
        profile, or one whose <tt>delivery_hash</tt> does not match the
        recorded Delivery. A Challenge that is accepted is evaluated by a
        party satisfying <xref target="independence"/>, whose finding is a
        Verdict; the Challenger's own assertion is not.</t>

        <t>The Challenger is the party identified by the <tt>kid</tt> of the
        Challenge's signature. A Verdict issued on a Challenge supersedes any
        earlier Verdict on the same Delivery, and a Facilitator MUST record
        both. A Facilitator MAY require a deposit with each Challenge, stated
        as <tt>challenge_deposit</tt> in its capability document
        (<xref target="wellknown"/>), returned if the Challenge succeeds and
        forfeited to the Verification Fund if it does not; this is the
        protocol's defence against challenge spam, and
        <xref target="sec-dos"/> discusses its limits.</t>

        <figure anchor="fig-challenge">
          <name>A Challenge under the acceptance profile</name>
          <sourcecode type="json" name="challenge.json"><![CDATA[
{
  "pact": "0.1",
  "type": "Challenge",
  "vtc_id":        "vtc_7f3a91",
  "delivery_hash": "sha256:5d7c...",
  "proof": {
    "profile":         "acceptance",
    "instrument_hash": "sha256:d9205d4f...",
    "results_hash":    "sha256:a91e...",
    "results_uri":     "https://watch.example/o/a91e",
    "failing_checks":  ["schema_valid_rate", "row_count_min"]
  },
  "signature": { "protected": "...", "signature": "..." }
}
          ]]></sourcecode>
        </figure>
      </section>

      <section anchor="bondrelease"><name>Bond Release</name>
        <t>The Bond enters the -00 in its Phase A and never leaves it: no
        rule anywhere returns it. A Facilitator MUST return the Bond, less any
        amount applied under <xref target="waterfall"/>, when the contract
        reaches FINAL or SETTLED, and MUST record the return. It MUST NOT
        return the Bond while any descendant contract remains non-final
        (<xref target="trees"/>), because cascading liability requires the
        parent's collateral to remain exposed until the subtree has
        settled.</t>
      </section>
    </section>

    <section anchor="wellknown"><name>Facilitator Capability Discovery</name>
      <t>Before a Buyer and Seller can co-sign a VTC they must agree on a
      Facilitator and know what it supports. This document registers one
      well-known URI for that purpose, per <xref target="RFC8615"/>.</t>

      <t>This is deliberately narrower than agent discovery, which is the
      subject of separate work and is not restated here. What is discovered
      is a settlement service's capabilities, not an agent's identity, skills,
      or endpoints.</t>

      <t>A Facilitator SHOULD publish a JSON document, media type
      <tt>application/pact-facilitator+json</tt>, at the path
      <tt>/.well-known/pact-facilitator</tt> of its origin. The document MUST
      be served over HTTPS. It MUST be signed, and the signature MUST verify
      against a key bound to the identifier in <tt>facilitator</tt>. An
      unsigned capability document is not usable for contract formation,
      because the members below determine what a party is agreeing to when it
      signs.</t>

      <dl>
        <dt><tt>facilitator</tt>:</dt><dd>REQUIRED. The identifier that will
        appear in <tt>parties.facilitator</tt>.</dd>
        <dt><tt>settlement_bindings</tt>:</dt><dd>REQUIRED. Array of binding
        identifiers, each with the networks and assets it serves.</dd>
        <dt><tt>release_modes</tt>:</dt><dd>REQUIRED. Array of supported
        modes; MUST contain <tt>on-verification</tt>.</dd>
        <dt><tt>verification_profiles</tt>:</dt><dd>REQUIRED. Array of
        supported profiles from the registry in
        <xref target="iana"/>.</dd>
        <dt><tt>assurance_modes</tt>:</dt><dd>REQUIRED. Array of supported
        modes.</dd>
        <dt><tt>max_contract_value</tt>:</dt><dd>OPTIONAL. Object with
        <tt>amount</tt> and <tt>currency</tt>.</dd>
        <dt><tt>challenge_deposit</tt>:</dt><dd>OPTIONAL. Object with
        <tt>amount</tt> and <tt>currency</tt>, required with each Challenge
        (<xref target="challenge-object"/>). Absent, no deposit is
        required.</dd>
        <dt><tt>endpoints</tt>:</dt><dd>REQUIRED. Object mapping each
        endpoint name in <xref target="endpoints"/> to an absolute URI.</dd>
        <dt><tt>signature</tt>:</dt><dd>REQUIRED. JWS over the JCS-canonical
        document excluding this member.</dd>
      </dl>

      <figure anchor="fig-wellknown">
        <name>https://settle.example/.well-known/pact-facilitator</name>
        <sourcecode type="json" name="pact-facilitator.json"><![CDATA[
{
  "pact": "0.1",
  "facilitator": "did:web:settle.example",
  "settlement_bindings": [
    { "id": "pact-escrow",
      "networks": ["eip155:8453"],
      "assets":   ["USDC"] }
  ],
  "release_modes":         ["on-verification", "on-window"],
  "verification_profiles": ["acceptance", "bisection"],
  "assurance_modes":       ["certain", "committed-sample"],
  "max_contract_value":    { "amount": "50000.00",
                             "currency": "USDC" },
  "endpoints": {
    "contract":    "https://settle.example/pact/v1/contracts",
    "delivery":    "https://settle.example/pact/v1/deliveries",
    "verdict":     "https://settle.example/pact/v1/verdicts",
    "challenge":   "https://settle.example/pact/v1/challenges",
    "attestation": "https://settle.example/pact/v1/attestations"
  },
  "signature": { "protected": "...", "signature": "..." }
}
        ]]></sourcecode>
      </figure>

      <t>A client MUST NOT infer any capability from the absence of a member.
      A Facilitator that does not publish a capability document can still be
      named in a VTC by prior arrangement; discovery is a convenience, not a
      precondition.</t>
    </section>

    <section anchor="profiles"><name>Verification Profiles</name>
      <t>A contract names both a <tt>tier</tt>, which says what class of
      evidence is produced, and a <tt>profile</tt>, which says what is
      actually done to check it. Four tier labels are used in this document:
      <tt>T0-reexec</tt>, deterministic re-execution; <tt>T1-tee</tt>,
      hardware attestation per <xref target="RFC9334"/>; <tt>T2-zkml</tt>, a
      proof of inference; and <tt>T3-jury</tt>, staked arbitration. Tiers are
      a vocabulary, not a registry; profiles are the registered quantity
      (<xref target="iana-profiles"/>). The distinction matters because the tier name
      does not determine the security of the contract and the profile
      largely does.</t>

      <t>Consider one task, a bulk data transformation, under two profiles at
      the same nominal tier. Re-executing the whole computation and comparing
      outputs costs approximately what performing it cost. Running a committed
      acceptance instrument against the delivered artifact costs a small
      fraction of a percent. Those two differ by more than two orders of
      magnitude in what verification costs relative to the price, and by
      <xref target="assurance"/> they give opposite answers about whether any
      Bond a Seller would post makes third-party challenge rational.</t>

      <t>Three regimes follow, and the boundaries are consequences of
      <xref target="assurance"/> rather than stipulations. Where verification
      costs a small fraction of a percent of price, every Delivery can be
      checked, <tt>assurance.mode</tt> of <tt>certain</tt> is affordable, and
      the Bond need only cover harm. Where it is of order one percent,
      sampling is efficient but the Bond required to sustain a low fraud rate
      approaches the price. Where it exceeds roughly ten percent, no Bond a
      Seller would rationally post makes third-party challenge worthwhile, and
      a contract at that profile MUST NOT declare <tt>open</tt> assurance,
      because it would be declaring a detection probability nothing
      produces.</t>

      <t>Implementations SHOULD select the cheapest profile that detects the
      failures they actually care about, rather than the strongest-sounding
      one. A committed acceptance instrument that is adequate is worth more
      than a re-execution profile that nobody can afford to run.</t>

      <dl>
        <dt><tt>acceptance</tt>:</dt><dd>Run the instrument committed by
        <tt>criteria_hash</tt> against the Delivery. The fraud proof is a
        failing evaluation. Deterministic by construction, since the
        instrument is fixed before work begins.</dd>
        <dt><tt>bisection</tt>:</dt><dd>Interactive narrowing to a single
        disputed step, which is then checked directly. Verification cost grows
        logarithmically in the size of the computation rather than linearly,
        which is what makes disputes affordable at scale.</dd>
        <dt><tt>full-reexec</tt>:</dt><dd>Re-execute and compare byte for
        byte. Sound only where the computation is deterministic and the
        environment is pinned; see <xref target="sec-determinism"/>.</dd>
      </dl>
      <section anchor="independence"><name>Verifier Independence</name>
        <t>Independence is a relation between the attesting party and the
        parties to the contract. It MUST be derived by the evaluator and MUST
        NOT be satisfied by a field in which a record declares itself
        independent. Party identifiers MUST be normalized before comparison,
        and the normalization MUST fold toward identifying the same party:
        strip leading and trailing whitespace; lower-case the scheme and, for
        <tt>did:web</tt> and <tt>https</tt> identifiers, the host; remove any
        fragment (a "#" and everything after it) and any trailing "/" or
        ".". Percent-encoding
        MUST NOT be decoded, since an open-ended decoder is its own attack
        surface. An identifier that does not parse after normalization is not
        evaluable and MUST NOT be treated as outside the parties.
        An independence claim reaches exactly as far as the record's own
        commitments; a settlement-scoped attestation carries no delivery or
        acceptance evidence. These rules are stated for evaluation after the
        fact in <xref target="X402COMPLIANCE"/>; PACT binds them at contract
        formation, constraining who may be named as Verifier before work
        begins.</t>
      </section>
    </section>

    <section anchor="trees"><name>Contract Trees and Cascading Liability</name>
      <t>An agent that accepts work may subcontract part of it. The
      subcontract is an ordinary PACT contract whose Buyer is the parent's
      Seller. What this section adds is the binding between the two, so that a
      failure below is recoverable above and cannot be hidden.</t>

      <figure anchor="fig-tree">
        <name>A contract tree. B is Seller above and Buyer below.</name>
        <artwork type="ascii-art"><![CDATA[
                    A (Buyer)
                        |
                    vtc_7f3a91          cap 180.00
                        |
                    B (Seller)
                        |
          +-------------+-------------+
          |                           |
      vtc_c1a2                    vtc_c2b7    cap 60.00 each
          |                           |
      C (Seller)                  D (Seller)
        ]]></artwork>
      </figure>

      <section anchor="tree-binding"><name>Binding a Child to Its Parent</name>
        <t>A subcontract carries <tt>liability.parent</tt>, an object with the
        parent's <tt>vtc_id</tt> and <tt>vtc_hash</tt>. Because
        <tt>liability</tt> is inside the bytes both parties sign, the child's
        Buyer signature is itself the authorisation to attach that child to
        that parent.</t>

        <t>A Facilitator MUST verify, before accepting a child contract, that
        the child's Buyer is the parent's Seller:</t>

        <artwork type="ascii-art"><![CDATA[
   child.parties.buyer  ==  parent.parties.seller
        ]]></artwork>

        <t>after the normalization in <xref target="independence"/>, where
        <tt>parent</tt> is the contract whose canonical form hashes to
        <tt>liability.parent.vtc_hash</tt>. A Facilitator MUST reject a child
        whose parent it cannot resolve and verify.</t>

        <t>Without this check any party may name any contract as its parent.
        The attack is cheap and asymmetric: name a competitor's contract as
        parent, subcontract a trivial task to yourself, fail it, and cause the
        competitor's Bond to be slashed and its Work Attestation to record a
        loss. The -00 carried <tt>liability.parent</tt> as a bare string with
        no hash and no check, so the attack cost one signature.</t>

        <t>A Facilitator MUST reject a child whose parent chain already
        contains the child's own <tt>vtc_id</tt>, and MUST enforce a maximum
        tree depth. Absent explicit configuration that maximum is 8. Both
        limits exist so that resolving a chain terminates.</t>
      </section>

      <section anchor="tree-liability"><name>What Cascades, and What Does Not</name>
        <t>Liability cascades upward as recovery. It does not cascade
        downward as discharge.</t>

        <t>Concretely: when a child fails, its Bond is applied under
        <xref target="waterfall"/> with the parent's Seller as the Buyer being
        restored. The parent's Seller may then be in a position to perform, or
        to settle its own contract from those proceeds. But a Facilitator MUST
        NOT reduce the parent Seller's obligation to the parent Buyer by
        reason of a subcontract's failure, and MUST NOT make the parent
        Buyer's recovery conditional on any child settling. The parent Buyer
        contracted with the parent Seller and has no privity below it.</t>

        <figure anchor="fig-cascade">
        <name>A child fails. Recovery flows up; the obligation does not flow down.</name>
        <artwork type="ascii-art"><![CDATA[
   A (parent Buyer)
     ^
     |  B still owes A the full parent remedy      (Section 10.2)
     |
   B (parent Seller, child Buyer)
     ^
     |  C's Bond restores B under rank 3           (Section 7.4)
     |
   C (child Seller)  -- fails --
        ]]></artwork>
      </figure>

      <t>This is the rule that stops subcontracting from being a liability
        laundry. Absent it, a Seller facing a large obligation could
        subcontract to a thinly capitalised identity it controls, let the
        child fail, and offer the child's small Bond as the whole remedy.</t>

        <t>A parent Seller SHOULD ensure that the sum of its children's
        <tt>cap</tt> values is at least its own exposure under the parent
        contract. Where it is not, the parent Seller carries the difference
        itself. This is stated as advice rather than a requirement because a
        Seller is entitled to take that risk knowingly; what it is not
        entitled to do is transfer it to its Buyer without consent.</t>
      </section>

      <section anchor="tree-finality"><name>Finality Is Bottom-Up</name>
        <t>A parent's Work Attestation MUST carry
        <tt>children_merkle_root</tt>, a Merkle root over the attestation
        hashes of its immediate children, computed as in
        <xref target="attestations"/>. A parent therefore cannot be attested
        until its children have been.</t>

        <t>The -00 required that same commitment while ordering only
        <tt>task.deadline</tt> between parent and child. Challenge windows are
        not deadlines, so a child whose window outlasted its parent's
        finalised after the parent, and a conformant implementation deadlocked
        on its own requirement: commit to an attestation that does not yet
        exist, or violate the MUST.</t>

        <figure anchor="fig-finality">
          <name>The ordering the -00 permitted, and the rule that forbids it</name>
          <artwork type="ascii-art"><![CDATA[
  PERMITTED BY -00 (deadlock):

  parent  |=== work ===|== window ==|
          |                         ^ parent final, must commit
          |                           to a child attestation that
  child   |==== work ====|== window ==|  does not exist yet
                                      ^ child final

  REQUIRED BY -01:

  parent  |=== work ===|===== window =====|
                                          ^ parent final
  child   |=== work ===|== window ==|
                                    ^ child final, in time
          ]]></artwork>
        </figure>

        <t>A Facilitator MUST reject a child contract unless the latest
        instant at which the child can become final precedes the earliest
        instant at which the parent's challenge window can close:</t>

        <artwork type="ascii-art"><![CDATA[
   child.task.deadline
     + child.challenge.window_seconds
     + child.challenge.max_dispute_seconds
   <
   parent.task.deadline
     + parent.challenge.window_seconds
        ]]></artwork>

        <t>A Facilitator MUST NOT move a contract to FINAL, and MUST NOT
        return a Bond under <xref target="bondrelease"/>, while any descendant
        remains non-final. Cascading recovery requires the parent's collateral
        to remain exposed until the subtree has settled; releasing it earlier
        would make the cascade a rule about value that no longer exists.</t>

        <t>These two requirements together mean a subcontract must be agreed
        early enough in the parent's life to finish inside it. That is a real
        constraint on how deep a tree can be with short windows, and it is
        stated here rather than discovered at runtime.</t>
      </section>
    </section>

    <section anchor="attestations"><name>Work Attestations</name>
      <t>A Work Attestation records what a contract did. It is the input to
      any reputation system built on PACT, though this document defines no
      such system and takes no position on how the records should be
      weighed.</t>

      <t>The -00's attestation recorded that money moved. It named no party,
      distinguished no role, carried no Facilitator signature, and committed
      no work product. Three attacks followed, each cheap: present another
      agent's attestations as your own, since nothing required the presenter
      to be a signer; present your Buyer records as Seller records, since no
      role label distinguished payer from performer; or manufacture a history
      outright with two identities you control, since nothing proved a
      Facilitator was ever involved.</t>

      <dl>
        <dt><tt>vtc_id</tt>, <tt>vtc_hash</tt>:</dt><dd>REQUIRED.</dd>
        <dt><tt>parties</tt>:</dt><dd>REQUIRED. The same object as the
        contract's, so that every attestation names its subject and states
        which side of it each identifier was on.</dd>
        <dt><tt>subject</tt>:</dt><dd>REQUIRED. The identifier this
        attestation is evidence about, which MUST appear in
        <tt>parties</tt>.</dd>
        <dt><tt>role</tt>:</dt><dd>REQUIRED. The subject's role, one of
        <tt>buyer</tt> or <tt>seller</tt>. A Buyer record and a Seller record
        are different evidence and MUST NOT be interchangeable.</dd>
        <dt><tt>outcome</tt>:</dt><dd>REQUIRED. One of <tt>performed</tt>,
        <tt>cured</tt>, <tt>slashed</tt>, <tt>abandoned</tt>.</dd>
        <dt><tt>work_hash</tt>:</dt><dd>REQUIRED where a Delivery was
        recorded. Binds the attestation to what was produced rather than only
        to what was paid.</dd>
        <dt><tt>amounts</tt>:</dt><dd>REQUIRED. Settled, restituted and
        slashed values.</dd>
        <dt><tt>children_merkle_root</tt>:</dt><dd>REQUIRED where the contract
        has children (<xref target="tree-finality"/>).</dd>
        <dt><tt>signatures</tt>:</dt><dd>REQUIRED. MUST include a Facilitator
        signature.</dd>
      </dl>

      <t>The Facilitator signature is what makes the record evidence. Without
      it an attestation is a claim by interested parties about themselves.
      With it, forging a settlement history requires a Facilitator's key
      rather than two identities, which is the property the economic argument
      for settlement-derived reputation assumed all along.</t>

      <t>A Facilitator MUST issue an attestation for every terminal contract,
      including SETTLED and ABANDONED, and MUST NOT require the signature of a
      party whose loss the attestation records. Under the -00 a slashed Seller
      simply declined to co-sign its own conviction, which made the reputation
      layer structurally incapable of recording a negative outcome.</t>



      <figure anchor="fig-attestation">
        <name>A Work Attestation for a slashed contract</name>
        <sourcecode type="json" name="attestation.json"><![CDATA[
{
  "pact": "0.1",
  "type": "WorkAttestation",
  "vtc_id":   "vtc_7f3a91",
  "vtc_hash": "sha256:b2cccae0...",
  "parties": {
    "buyer":       "did:web:acme.example",
    "seller":      "did:web:dataforge.example",
    "facilitator": "did:web:settle.example"
  },
  "subject": "did:web:dataforge.example",
  "role":    "seller",
  "outcome": "slashed",
  "work_hash": "sha256:9c1f...",
  "amounts": {
    "settled":    "0.00",
    "restituted": "18.00",
    "slashed":    "18.00",
    "currency":   "USDC"
  },
  "signatures": [
    { "protected": "...", "signature": "..." }
  ]
}
        ]]></sourcecode>
      </figure>

      <t>The example carries one signature, the Facilitator's. That is
      sufficient and is the point: the Seller did not consent to this record
      and its consent is not required.</t>

      <section anchor="merkle"><name>The Children Merkle Root</name>
        <t>Let D be the list of 32-byte SHA-256 digests of each immediate
        child's Work Attestation in JCS-canonical form, sorted ascending as
        byte strings. <tt>children_merkle_root</tt> is MTH(D) exactly as
        defined in <xref target="RFC9162"/> Section 2.1.1, with SHA-256 as
        the hash: a leaf is
        SHA-256(0x00 || d), an interior node is SHA-256(0x01 || left ||
        right), and for n greater than one the list is split at k, the
        largest power of two smaller than n. The shape is therefore fixed by
        n alone, and two implementations that agree on D agree on the
        root.</t>
        <t>The domain separation is not optional. Without distinct prefixes an
        attacker can present an interior node as though it were a leaf, and so
        claim an inclusion proof for a subtree that never existed.</t>
        <t>Where a contract has no children the member is omitted. It MUST NOT
        be present with an empty or zero value, which would be
        indistinguishable from a tree whose children were withheld.</t>
      </section>
    </section>

    <section anchor="endpoints"><name>Protocol Endpoints</name>
      <t>The -00 defined objects and no operations, so two independent
      implementations of it could not exchange a single message. This section
      specifies the operations a Facilitator exposes. Base URIs are not fixed
      by this document; they are discovered from the <tt>endpoints</tt> member
      of the capability document (<xref target="wellknown"/>), so a
      Facilitator may mount them anywhere on its origin.</t>

      <table anchor="tab-endpoints">
        <name>Operations</name>
        <thead>
          <tr><th>Operation</th><th>Method</th><th>Target</th></tr>
        </thead>
        <tbody>
          <tr><td>Propose a contract</td><td>POST</td>
              <td><tt>{contract}</tt></td></tr>
          <tr><td>Retrieve a contract</td><td>GET</td>
              <td><tt>{contract}/{id}</tt></td></tr>
          <tr><td>Submit a Delivery</td><td>POST</td>
              <td><tt>{delivery}</tt></td></tr>
          <tr><td>Record a Verdict</td><td>POST</td>
              <td><tt>{verdict}</tt></td></tr>
          <tr><td>Open a challenge</td><td>POST</td>
              <td><tt>{challenge}</tt></td></tr>
          <tr><td>Retrieve an Attestation</td><td>GET</td>
              <td><tt>{attestation}/{id}</tt></td></tr>
        </tbody>
      </table>

      <t>All requests and responses use the media types defined in
      <xref target="iana"/>. All requests MUST be made over HTTPS, following
      the recommendations of <xref target="RFC9325"/>. Status codes are as
      defined in <xref target="RFC9110"/>.</t>

      <table anchor="tab-ops">
        <name>Request, success response, and body per operation</name>
        <thead><tr><th>Operation</th><th>Request body</th><th>Success</th>
          <th>Response body</th></tr></thead>
        <tbody>
          <tr><td>Propose</td><td>pact-contract+json</td><td>201</td>
              <td>the VTC, plus <tt>state</tt></td></tr>
          <tr><td>Retrieve contract</td><td>none</td><td>200</td>
              <td>the VTC, plus <tt>state</tt></td></tr>
          <tr><td>Submit Delivery</td><td>pact-delivery+json</td><td>202</td>
              <td>the Delivery, plus <tt>state</tt></td></tr>
          <tr><td>Record Verdict</td><td>pact-verdict+json</td><td>201</td>
              <td>the Verdict</td></tr>
          <tr><td>Open challenge</td><td>pact-challenge+json</td><td>202</td>
              <td>the Challenge, plus <tt>state</tt></td></tr>
          <tr><td>Retrieve Attestation</td><td>none</td><td>200</td>
              <td>pact-attestation+json</td></tr>
        </tbody>
      </table>

      <t>The <tt>state</tt> member in a response is the current value from
      <xref target="fig-states"/>; it is added by the Facilitator, is not
      part of the signed object, and MUST NOT be included when the object is
      canonicalized or hashed.</t>

      <t>A Facilitator authenticates the sender of a POST by the signature
      on the body: it MUST reject a Delivery not signed by the contract's
      Seller, a Verdict not signed by a party admissible under
      <xref target="ep-verdict"/>, and a Challenge whose signer it cannot
      resolve. This document requires no additional HTTP-layer
      authentication; a Facilitator MAY require one. Retrieval by GET is
      unauthenticated by this document, and a Facilitator MAY restrict it to
      the parties of the contract.</t>

      <section anchor="ep-propose"><name>Proposing a Contract</name>
        <t>The request body is a VTC carrying the signatures of every party
        required to sign it. A Facilitator MUST perform the checks in
        <xref target="conformance"/> and <xref target="assurance"/> before
        creating the resource, and MUST refuse otherwise.</t>

        <sourcecode type="http-message"><![CDATA[
POST /pact/v1/contracts HTTP/1.1
Host: settle.example
Content-Type: application/pact-contract+json

{ "pact": "0.1", "type": "VerifiableTaskContract",
  "id": "vtc_7f3a91", ... }
        ]]></sourcecode>

        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Location: /pact/v1/contracts/vtc_7f3a91
Content-Type: application/pact-contract+json

{ "pact": "0.1", "type": "VerifiableTaskContract",
  "id": "vtc_7f3a91", "state": "PROPOSED", ... }
        ]]></sourcecode>
      </section>

      <section anchor="ep-idempotency"><name>Idempotency</name>
        <t>Every object this protocol carries is committed by a hash of its
        own canonical form, so no separate idempotency key is needed and none
        is defined. A Facilitator MUST treat a POST whose body canonicalizes
        to a hash it has already accepted as a request for the existing
        resource, and MUST respond <tt>200 (OK)</tt> with that resource rather
        than creating a second one or reporting a conflict.</t>

        <t>Where a POST carries the same object <tt>id</tt> as an existing
        resource but a different hash, the Facilitator MUST respond
        <tt>409 (Conflict)</tt>. Retrying a submission is therefore always
        safe, and altering one never is.</t>
      </section>

      <section anchor="ep-errors"><name>Error Responses</name>
        <t>A Facilitator MUST report failures using
        <xref target="RFC9457"/> problem details, media type
        <tt>application/problem+json</tt>, with a <tt>type</tt> drawn from the
        registry in <xref target="iana"/>. Error responses MUST name the rule
        that was violated, because a conformance failure a caller cannot
        locate in this document is a failure of this document.</t>

        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 422 Unprocessable Content
Content-Type: application/problem+json

{
  "type":   "https://pact-spec.github.io/problem/
             assurance-constraint-unsatisfied",
  "title":  "Assurance constraint not satisfied",
  "status": 422,
  "detail": "Bond 18.00 is below the minimum 20.00 required
             for q_min 0.90 at price 180.00 with E 0.00.",
  "section": "7.2",
  "required_bond": "20.00"
}
        ]]></sourcecode>

        <t>The <tt>section</tt> member is REQUIRED on any problem arising from
        a rule in this document and carries the section number stating that
        rule.</t>
      </section>

      <section anchor="ep-verdict"><name>Recording a Verdict</name>
        <t>A Verdict is a signed statement that a Delivery was evaluated
        against the committed acceptance instrument, and with what outcome. A
        Facilitator MUST reject a Verdict whose signer does not satisfy
        <xref target="independence"/> for the contract named, and MUST NOT
        accept a Verdict for a contract that has no recorded Delivery.</t>

        <figure anchor="fig-verdict">
          <name>A Verdict</name>
          <sourcecode type="json" name="verdict.json"><![CDATA[
{
  "pact": "0.1",
  "type": "Verdict",
  "vtc_id":        "vtc_7f3a91",
  "delivery_hash": "sha256:5d7c...",
  "outcome":       "PASS",
  "profile":       "acceptance",
  "instrument_hash": "sha256:d9205d4f...",
  "results_hash":    "sha256:7e02...",
  "evaluated_at":  "2026-11-10T09:14:22Z",
  "signature": { "protected": "...", "signature": "..." }
}
          ]]></sourcecode>
        </figure>

        <t>The Verifier is the party identified by the <tt>kid</tt> of the
        Verdict's signature. Where the contract names
        <tt>parties.verifier</tt>, the Verdict MUST be signed by that party;
        otherwise the Facilitator evaluates <xref target="independence"/>
        against the signer.</t>

        <t>A Verdict commits to the instrument it ran and to the results it
        produced. Without <tt>instrument_hash</tt> a Verifier could run
        something other than the committed instrument and the contract would
        have no way to tell; that is the substitution attack described in
        <xref target="hashes"/>, arriving from the verification side rather
        than the acceptance side.</t>
      </section>

      <section anchor="ep-flow"><name>Exchange</name>
        <figure anchor="fig-http">
          <name>HTTP exchange for the flow in Figure 1</name>
          <artwork type="ascii-art"><![CDATA[
 Buyer/Seller            Facilitator             Verifier
      |                       |                      |
      |-- POST {contract} --->|                      |
      |<-- 201 Created -------|                      |
      |                       |                      |
      |-- POST {delivery} --->|                      |
      |<-- 202 Accepted ------|                      |
      |                       |                      |
      |                       |-- GET work_uri ----->|
      |                       |<-- POST {verdict} ---|
      |                       |                      |
      |<-- 200 OK ------------|                      |
      |                       |                      |
      |-- GET {attestation} ->|                      |
      |<-- 200 Attestation ---|                      |
          ]]></artwork>
        </figure>

        <t>A Delivery is answered <tt>202 (Accepted)</tt> rather than
        <tt>201</tt> because acceptance of the bytes is not acceptance of the
        work. The contract moves to DELIVERED; whether it moves on to
        RELEASING depends on a substantive Verdict, which the Facilitator
        does not itself produce.</t>
      </section>
    </section>

    <section anchor="conformance"><name>Conformance</name>
      <t>Every rule a PACT conformance checker enforces is stated in this
      document as normative text. This section collects the rules that a
      schema language cannot express, so that an implementation built from this
      document alone passes a conformance suite built from it. A rule that
      lives only in a test suite is not a requirement, and an implementer who
      cannot find it in the specification will not implement it.</t>

      <section anchor="conf-sig"><name>Signatures</name>
        <t>Every signature carried by a VTC, Delivery, Verdict, Challenge,
        Work Attestation, or capability document is a JWS
        <xref target="RFC7515"/> in the General JSON Serialization of
        Section 7.2.1 of that document, with the payload detached as its
        Appendix F describes. The payload is BASE64URL of the JCS-canonical
        bytes of the object with the signing member removed, so the JWS
        Signing Input is ASCII(BASE64URL(UTF8(protected)) || "." ||
        BASE64URL(JCS(object))) exactly as Section 5.1 of
        <xref target="RFC7515"/> defines it. The payload is never
        transmitted; a verifier reconstructs it from the object it holds.
        The following constraints apply.</t>
        <ul>
          <li>The protected header MUST carry <tt>alg</tt>, <tt>kid</tt> and
          <tt>typ</tt>.</li>
          <li><tt>alg</tt> MUST be <tt>ES256</tt> or <tt>ES384</tt>
          <xref target="RFC7518"/>, or <tt>EdDSA</tt> <xref target="RFC8037"/>
          with an Ed25519 key; a verifier MAY also accept Ed448. A verifier
          MUST reject any other value, and MUST reject <tt>none</tt>. Absent an allowlist an attacker selects the
          algorithm, which permits both unsigned acceptance and confusion of a
          public key for a symmetric secret.</li>
          <li><tt>kid</tt> MUST appear inside the protected header and MUST
          NOT be carried as a sibling of it. A key identifier outside the
          signed bytes is rewritable in transit, which allows an attacker who
          can publish a key document to re-attribute a genuine signature to
          itself.</li>
          <li><tt>typ</tt> MUST be the full media type of the object signed,
          including the <tt>application/</tt> prefix, so that a signature
          over one object type cannot be replayed as a signature over
          another. Section 4.1.9 of <xref target="RFC7515"/> recommends
          omitting the prefix; this document requires the full form so that
          <tt>typ</tt> equals the registered media type character for
          character. Explicit typing follows Section 3.11 of
          <xref target="RFC8725"/>.</li>
        </ul>

        <section anchor="keyres"><name>Key Resolution</name>
          <t>A <tt>kid</tt> is a URI naming a public key. A verifier MUST
          resolve it as follows, and MUST reject a signature whose
          <tt>kid</tt> it cannot resolve.</t>
          <ul>
            <li>A <tt>did:</tt> identifier is a DID URL
            <xref target="DID-CORE"/>. The verifier resolves the DID document
            by the method the identifier names and selects the verification
            method its fragment identifies. Examples in this document use
            <tt>did:web</tt> <xref target="DID-WEB"/>; no method is
            required or excluded.</li>
            <li>An <tt>https:</tt> identifier dereferences, over TLS, to a
            JWK Set <xref target="RFC7517"/>; the verifier selects the key
            whose <tt>kid</tt> member equals the fragment.</li>
          </ul>
          <t>The part of a <tt>kid</tt> before its fragment MUST equal, after
          the normalization in <xref target="independence"/>, the party
          identifier the signature is attributed to. Verifying a signature
          establishes that the holder of that key signed; that the key
          belongs to the party is a property of the identity method, and this
          document does not add to it.</t>
        </section>
      </section>

      <section anchor="conf-rules"><name>Rules Not Expressible in a Schema</name>
        <ul>
          <li><tt>parties.buyer</tt> and <tt>parties.seller</tt> MUST be
          distinct after the normalization in
          <xref target="independence"/>.</li>
          <li>Both the Buyer and the Seller MUST contribute at least one
          verifying signature. A count of signatures is not sufficient: two
          signatures from one party MUST be rejected.</li>
          <li><tt>challenge.window_seconds</tt> MUST be greater than
          zero.</li>
          <li>Every URI member inside hash-committed content MUST have a
          sibling hash member, and a validator MUST reject content carrying
          <tt>harness_uri</tt> without <tt>harness_hash</tt>, or
          <tt>rubric_uri</tt> without <tt>rubric_hash</tt>.</li>
          <li>An <tt>acceptance</tt> object MUST carry the members REQUIRED
          for the contract's tier. An empty <tt>acceptance</tt> object MUST be
          rejected, since it makes every fraud proof impossible and converts
          conditional release into unconditional payment.</li>
          <li>A Facilitator MUST reject a contract that does not satisfy
          <xref target="assurance"/> against its declared
          <tt>q_min</tt>.</li>
        </ul>
      </section>

      <section anchor="conf-vectors"><name>Test Vectors</name>
        <t>Each rule above has an accepting and a rejecting form. A
        conformance suite built from this section alone, with no reference to
        any implementation, should reach the same verdicts. Rejecting vectors
        name the rule they violate.</t>

        <table anchor="tab-vectors">
          <name>Conformance vectors</name>
          <thead>
            <tr><th>ID</th><th>Mutation from a valid object</th>
                <th>Expect</th></tr>
          </thead>
          <tbody>
            <tr><td>V-01</td><td>unmodified valid VTC</td><td>accept</td></tr>
            <tr><td>V-02</td><td><tt>alg</tt> set to <tt>none</tt></td>
                <td>reject</td></tr>
            <tr><td>V-03</td><td><tt>alg</tt> set to <tt>HS256</tt></td>
                <td>reject</td></tr>
            <tr><td>V-04</td><td><tt>kid</tt> moved outside the protected
                header</td><td>reject</td></tr>
            <tr><td>V-05</td><td><tt>typ</tt> of a Delivery on a VTC
                signature</td><td>reject</td></tr>
            <tr><td>V-06</td><td>buyer and seller set to the same
                identifier</td><td>reject</td></tr>
            <tr><td>V-07</td><td>buyer and seller differing only by trailing
                "/"</td><td>reject</td></tr>
            <tr><td>V-08</td><td>two signatures, both from the buyer</td>
                <td>reject</td></tr>
            <tr><td>V-09</td><td><tt>window_seconds</tt> of 0</td>
                <td>reject</td></tr>
            <tr><td>V-10</td><td><tt>acceptance</tt> as an empty object</td>
                <td>reject</td></tr>
            <tr><td>V-11</td><td><tt>harness_uri</tt> with
                <tt>harness_hash</tt> removed</td><td>reject</td></tr>
            <tr><td>V-12</td><td>B 18.00, P 180.00, q_min 0.90</td>
                <td>reject</td></tr>
            <tr><td>V-13</td><td>B 18.00, P 180.00, q_min 1.00</td>
                <td>accept</td></tr>
            <tr><td>V-14</td><td>Delivery with <tt>evidence</tt> absent</td>
                <td>reject as FAIL</td></tr>
            <tr><td>V-15</td><td>child whose buyer is not the parent's
                seller</td><td>reject</td></tr>
            <tr><td>V-16</td><td>child finalising after the parent's window
                closes</td><td>reject</td></tr>
            <tr><td>V-17</td><td>Verdict signed by the seller</td>
                <td>reject</td></tr>
            <tr><td>V-18</td><td>object keys ordered by code point, with a
                supplementary-plane key</td><td>digest mismatch</td></tr>
          </tbody>
        </table>

        <t>V-07 and V-18 are the two most often got wrong. V-07 fails wherever
        party comparison is a string equality on unnormalized identifiers.
        V-18 fails wherever canonicalization sorts keys by Unicode code point,
        which agrees with the required UTF-16 order for every ASCII key and so
        passes every vector an implementer would think to write.</t>
      </section>
    </section>

    <section anchor="example"><name>Worked Example</name>
      <t>The -00 carried no numeric example and no digest anywhere in its
      text. Every concrete value lived in a separate repository with no link
      from the document to it, so the specification made no verifiable claim
      about its own reference implementation. This section fixes that. The
      tables and digests below are the reference repository's. The object
      figures in earlier sections use short illustrative identifiers for page
      width; the repository examples carry the full ones, and the digests
      here are computed over those.</t>

      <t>A buyer commissions a data transformation. The agreed price is
      180.00 USDC and the seller posts a bond of 18.00, ten percent, which is
      the conventional figure.</t>

      <table anchor="tab-example">
        <name>The worked contract</name>
        <thead><tr><th>Quantity</th><th>Symbol</th><th>Value</th></tr></thead>
        <tbody>
          <tr><td>Price</td><td>P</td><td>180.00 USDC</td></tr>
          <tr><td>Seller bond</td><td>B</td><td>18.00 USDC</td></tr>
          <tr><td>Verification fund</td><td>F</td><td>0.50 USDC</td></tr>
          <tr><td>Released before Verdict</td><td>E</td><td>0.00</td></tr>
          <tr><td>Challenge window</td><td></td><td>3600 s</td></tr>
        </tbody>
      </table>

      <t>Apply <xref target="assurance"/>. With E of zero the constraint
      B &gt;= P(1-q)/q reduces to a requirement on q of at least P/(P+B):</t>

      <artwork type="ascii-art"><![CDATA[
   q  >=  180.00 / (180.00 + 18.00)  =  0.9091
      ]]></artwork>

      <t>So this contract is only incentive-compatible if better than
      ninety-one percent of defections are detected, proven and adjudicated
      inside 3600 seconds. That is the whole argument against a ten percent
      bond in one line, and it is why the example declares
      <tt>assurance.mode</tt> of <tt>certain</tt>: at q of 1 the required bond
      is zero and the bond covers harm rather than deterrence.</t>

      <table anchor="tab-assurance">
        <name>Required bond at this price, by declared q</name>
        <thead><tr><th>q</th><th>Required B</th><th>18.00 suffices?</th></tr></thead>
        <tbody>
          <tr><td>1.00</td><td>0.00</td><td>yes</td></tr>
          <tr><td>0.9091</td><td>18.00</td><td>exactly</td></tr>
          <tr><td>0.90</td><td>20.00</td><td>no</td></tr>
          <tr><td>0.50</td><td>180.00</td><td>no</td></tr>
        </tbody>
      </table>

      <t>The digests carried by the reference TaskSpec and contract
      are:</t>

      <artwork type="ascii-art"><![CDATA[
 spec_hash
   sha256:bb0e87ce522479b7c2f7bcfa26df7ecd7ff67aeb8b415bbd70c22d
          97c47adf35

 criteria_hash
   sha256:d9205d4f2922afd55c0a2dc4ab00d8ee5a512343430bcf5e9abf0c
          76d66c69f7
      ]]></artwork>

      <t><tt>criteria_hash</tt> is the manifest digest of
      <xref target="hashes"/> over the acceptance instrument bundle, and the
      same value appears as <tt>acceptance.harness_hash</tt> inside the
      TaskSpec, so the instrument is committed both by the contract and from
      within the specification it belongs to.</t>

      <t>And the contract's own commitment, computed over the signed
      contract per <xref target="delivery"/>:</t>

      <artwork type="ascii-art"><![CDATA[
 vtc_hash
   sha256:b2cccae00fc7b97ba2b6ef6356ff42c006ba661e0249d7eaa8baff3d
          e553870b
      ]]></artwork>

      <t>This value differs from the one the -00 examples carried, and the
      difference is semantic rather than incidental: the -00 excluded the
      signature set from the commitment, so its digest proved what was
      written and not who agreed to it. <tt>spec_hash</tt> and
      <tt>criteria_hash</tt> are unchanged in construction.</t>
    </section>

    <section anchor="implstatus"><name>Implementation Status</name>
      <t>This section records the status of known implementations of this
      document per <xref target="RFC7942"/>, and is to be removed before
      publication as an RFC.</t>
      <t>A reference implementation of the object schemas, the examples in
      <xref target="example"/>, and a conformance validator is maintained at
      https://github.com/pact-spec/spec under the Revised BSD licence. As of
      the date of this document the validator runs sixty-six checks: schema
      conformance for every object, JCS canonicalization including the
      UTF-16 key-order vector of <xref target="conf-vectors"/>, every hash
      commitment in <xref target="example"/>, the constraint of
      <xref target="assurance"/> on the worked figures, the Merkle
      construction of <xref target="merkle"/> against the definition in
      <xref target="RFC9162"/>, and the vectors of
      <xref target="conf-vectors"/>. No Facilitator, Buyer or Seller
      exchanging messages over the endpoints of <xref target="endpoints"/> is
      known to the author.</t>
    </section>

    <section anchor="security"><name>Security Considerations</name>
      <t>Most of what follows was found by adversarial review of
      <xref target="I-D.laxsharma-pact-00"/> rather than anticipated when it
      was written. Each subsection states the attack, why it worked, and the
      requirement in this document that closes it. Where a threat is only
      mitigated rather than closed, that is said.</t>

      <section anchor="sec-verifier"><name>Verifier Capture</name>
        <t>A verification tier states how strongly work is checked. It does
        not state who checked it, and those fail separately. A re-execution
        transcript produced by the Seller and the same transcript produced by
        an independent Challenger are the same method and different evidence.
        Where a proof is generated and verified entirely inside one party,
        the tier is satisfied and the contract is unprotected.</t>
        <t><xref target="independence"/> requires that independence be
        derived by the evaluator from the parties named in the contract, and
        forbids satisfying it with a self-asserted field. A criterion
        satisfiable by writing a string reproduces the defect it was meant to
        catch.</t>
      </section>

      <section anchor="sec-alg"><name>Algorithm and Key Confusion</name>
        <t>Absent an algorithm allowlist an attacker chooses the algorithm.
        The two consequences are <tt>alg</tt> of <tt>none</tt>, which makes
        every signature check vacuous, and presenting an ECDSA public key as
        an HMAC secret, which lets anyone holding the public key forge.
        <xref target="conf-sig"/> fixes the permitted set.</t>
        <t>A <tt>kid</tt> carried as a sibling of the protected header rather
        than inside it is outside the signed bytes and is rewritable in
        transit. An attacker who can publish a key document can then
        re-attribute a victim's genuine signature to an identifier it
        controls, without breaking any cryptography.
        <xref target="conf-sig"/> requires <tt>kid</tt> inside the protected
        header.</t>
        <t>A signature over one object type replayed as a signature over
        another is prevented by the <tt>typ</tt> requirement in the same
        section.</t>
      </section>

      <section anchor="sec-substitution"><name>Substitution of Committed Content</name>
        <t>The -00 committed <tt>harness_uri</tt> as a string. The bytes at
        that URI were covered by nothing. A Buyer could therefore sign a
        contract, replace the acceptance instrument afterwards, run the
        replacement, and submit its failure as a textbook-valid fraud proof:
        the Seller's Bond is slashed, its attestation records a loss, and the
        Buyer keeps the work. Cost of the attack: one file overwrite. The
        mirror attack works against a Seller that hosts the input sample.</t>
        <t><xref target="hashes"/> requires a sibling hash over the
        dereferenced bytes for every URI inside committed content, and
        <xref target="ep-verdict"/> requires a Verdict to commit to the
        instrument it actually ran, which closes the same attack from the
        verification side.</t>
      </section>

      <section anchor="sec-parent"><name>Unauthenticated Parent Attachment</name>
        <t>Naming a parent contract cost one signature in the -00 and was
        checked against nothing. An attacker could attach a failing child to a
        competitor's contract and cause that competitor's Bond to be slashed.
        <xref target="tree-binding"/> requires the child's Buyer to be the
        parent's Seller, verified against the parent's hash.</t>
        <t>The converse abuse, a Seller subcontracting to an identity it
        controls in order to offer that identity's small Bond as the whole
        remedy, is addressed by <xref target="tree-liability"/>: cascade is
        recovery for the parent Seller and never discharge of its obligation
        to the parent Buyer.</t>
      </section>

      <section anchor="sec-bribe"><name>Buying Silence from a Challenger</name>
        <t>Where the reward for reporting a fraud is bounded below the
        defaulting Seller's exposure, there is always a private payment that
        leaves both the discoverer and the Seller better off than reporting,
        and silence dominates the mechanism the protocol designed. This is not
        closed by raising the bounty to the full exposure, which leaves
        nothing for restitution and maximises the incentive to manufacture
        challenges.</t>
        <t><xref target="waterfall"/> mitigates rather than closes it, by
        making the reward non-exclusive so that buying silence scales with the
        number of independent discoverers while reporting pays once, and by
        admitting the Buyer as a Challenger in its own contract so that any
        bribe has a floor at the restitution the Buyer would forgo.
        Implementers should understand that a determined Seller facing a
        single discoverer can still buy silence.</t>
      </section>

      <section anchor="sec-nondelivery"><name>Non-Delivery and Escrow Lock</name>
        <t>Under the -00 a contract in which nothing was ever delivered had no
        remedy: the deadline carried no stated consequence, no challenge
        window opened because there was nothing to challenge, and escrow could
        remain locked indefinitely. This is the most common real failure in
        commerce and it had no code path.</t>
        <t><xref target="delivery"/> makes deadline expiry an automatic Buyer
        remedy producing the ABANDONED state. Note the asymmetry this creates:
        a Seller that delivers nothing is worse off than one that delivers
        something non-conformant only if the Bond exceeds the value of the
        work, which is a reason to size Bonds by harm rather than by a
        percentage of price.</t>
      </section>

      <section anchor="sec-replay"><name>Cross-Venue Replay</name>
        <t>A VTC that does not name its Facilitator, network and asset is a
        signed instrument replayable against any of them. The -00 carried
        none of the three. <xref target="vtc"/> requires all three inside the
        signed content.</t>
        <t>Relatedly, a hash computed over a contract excluding its
        signatures proves what was written and not who agreed to it, so
        entries can be appended or stripped without invalidating the
        commitment. <xref target="delivery"/> requires
        <tt>vtc_hash</tt> to be computed over the contract including its
        signature set.</t>
        <t>A Delivery, Verdict or Challenge replayed against a different
        contract fails because each carries <tt>vtc_id</tt> and a hash that
        binds it to one contract and one Delivery, and the
        <tt>typ</tt> rule of <xref target="conf-sig"/> stops a signature over
        one object type standing for another.</t>
      </section>

      <section anchor="sec-determinism"><name>Nondeterminism as Shield and as Weapon</name>
        <t>A re-execution profile that does not state what determinism it
        assumes cuts both ways. An honest Seller doing model-assisted work is
        convicted by a re-execution that differs for ordinary reasons. A
        cheating Seller escapes any fraud proof by asserting nondeterminism,
        unfalsifiably. Registration under
        <xref target="iana-profiles"/> requires a profile to state whether it
        is deterministic and what tolerance applies; a profile that does not
        should not be registered, and a contract naming one is not
        safely enforceable.</t>
      </section>

      <section anchor="sec-history"><name>Fabricated Settlement History</name>
        <t>The economic argument for settlement-derived reputation is that
        faking a history requires funding real contracts. That argument fails
        if attestations do not name the parties, do not distinguish the payer
        from the performer, and carry no Facilitator signature, since two
        cooperating identities can then manufacture history at the cost of two
        signatures, and a party can present its Buyer records as Seller
        records. <xref target="attestations"/> requires all three.</t>
        <t>It fails in the other direction too if a negative outcome requires
        the signature of the party it convicts. Reputation that is
        structurally incapable of recording a loss is not evidence of
        anything.</t>
      </section>

      <section anchor="sec-facilitator"><name>Trust in the Facilitator</name>
        <t>The Facilitator holds the price, the Bond and the Verification
        Fund of every contract it settles. Nothing in this protocol stops a
        Facilitator from keeping them. What the protocol does is make that
        theft attributable: every movement of value is recorded in a Work
        Attestation the Facilitator signs, every party holds a co-signed
        contract stating what should have happened, and a Facilitator that
        deviates has produced its own evidence. Whether that evidence has
        consequences is a matter of reputation, contract or law, all of which
        are outside this document. Deployments that cannot accept a single
        custodian should look to multi-party custody, which this document
        does not specify and does not preclude.</t>
      </section>

      <section anchor="sec-keys"><name>Key Compromise and Rotation</name>
        <t>A signature here is a long-lived commitment, and a compromised key
        signs contracts the party never agreed to. Rotation and revocation
        belong to the identity method behind the <tt>kid</tt>
        (<xref target="keyres"/>), and this document does not restate them.
        Two things it does require: a Facilitator MUST record, with each
        object it accepts, the key material or its digest as resolved at the
        time of acceptance, so that a later rotation does not make an earlier
        signature unverifiable; and a Facilitator MUST NOT accept an object
        whose <tt>kid</tt> resolves to a key the identity method marks as
        revoked at the time of acceptance.</t>
      </section>

      <section anchor="sec-dos"><name>Denial of Service by Challenge</name>
        <t>Every accepted Challenge costs an independent evaluation. Without a
        cost to the Challenger, a party can exhaust the Verification Fund or
        the Facilitator's capacity by challenging every Delivery. The
        <tt>challenge_deposit</tt> of <xref target="challenge-object"/> is
        the defence, and it is a MAY because a deposit also deters the honest
        challenger the open model relies on. A Facilitator that requires no
        deposit SHOULD rate-limit Challenges per Challenger and per contract,
        and SHOULD publish that it does so.</t>
      </section>
    </section>

    <section anchor="privacy"><name>Privacy Considerations</name>
      <t>PACT moves contracts and evidence about work, and both leak.</t>

      <section anchor="priv-sample"><name>Input Disclosure Before Contract Formation</name>
        <t>Publishing a representative input sample so that a counterparty can
        price the work discloses production data to parties with whom no
        contract exists and who may be in unknown jurisdictions. Samples
        SHOULD be synthetic or de-identified. Where a real sample is
        necessary, it SHOULD be disclosed only after a confidentiality
        undertaking, and the <tt>constraints</tt> member SHOULD carry the
        retention and deletion terms. This document cannot enforce any of
        that and does not pretend to.</t>
      </section>

      <section anchor="priv-graph"><name>The Settlement Graph</name>
        <t>A Facilitator that publishes its log of locks, releases and slashes
        makes the contract graph public. From it a reader can reconstruct an
        organisation's suppliers, spend and cadence, which is commercially
        sensitive even when no individual is identifiable. Transparency and
        counterparty privacy are in genuine tension here, and this document
        resolves it in favour of neither: a Facilitator MAY publish
        aggregates, and SHOULD NOT publish per-contract records identifying
        both parties without their agreement.</t>
        <t>Work Attestations leak the same graph by construction, since each
        names both parties and the counterparty retains a signed copy
        indefinitely. Selective disclosure over attestations, so that a
        holder can prove a settled contract without revealing the
        counterparty, is possible with the mechanisms cited in
        <xref target="attestations"/> and is not specified here.</t>
      </section>

      <section anchor="priv-challenger"><name>Challenger Access</name>
        <t>An open challenge model requires that some party outside the
        contract can obtain the deliverable and the input in order to build a
        fraud proof. That is in direct conflict with confidentiality of both.
        The conflict is real and this document does not dissolve it. What it
        does is make the choice explicit: a contract whose content cannot be
        disclosed to a Challenger MUST NOT declare <tt>open</tt> assurance,
        because there is no population able to produce the detection
        probability such a declaration asserts.</t>
      </section>

      <section anchor="priv-retention"><name>Retention</name>
        <t>Retention duties stated for dispute purposes can conflict with
        erasure rights asserted by a data subject. Contracts SHOULD state a
        retention period, and implementers should be aware that a hash
        commitment survives deletion of the content it commits to, which is
        usually the property they want and occasionally the one they must
        explain.</t>
      </section>
    </section>

    <section anchor="iana"><name>IANA Considerations</name>
      <t>This document asks IANA to register six media types, one
      well-known URI, and two registries. It defines problem types but
      does not ask for a registry of them (<xref target="iana-problems"/>).</t>

      <section anchor="iana-media"><name>Media Types</name>
        <t>IANA is requested to register the following in the "Media Types"
        registry, per <xref target="RFC6838"/>. The template below is given
        once in full; the six registrations differ only in the subtype name
        and the object they carry.</t>

        <dl>
          <dt>Type name:</dt><dd>application</dd>
          <dt>Subtype name:</dt><dd>see <xref target="tab-media"/></dd>
          <dt>Required parameters:</dt><dd>N/A</dd>
          <dt>Optional parameters:</dt><dd>N/A</dd>
          <dt>Encoding considerations:</dt><dd>binary; the content is JSON
          text as defined in <xref target="RFC8259"/>, encoded in UTF-8</dd>
          <dt>Security considerations:</dt><dd>See
          <xref target="security"/> of this document. In particular these
          media types carry signed objects whose signatures MUST be verified
          under the constraints in <xref target="conf-sig"/>; accepting one
          without algorithm restriction permits signature forgery.</dd>
          <dt>Interoperability considerations:</dt><dd>Objects MUST be
          canonicalized per <xref target="RFC8785"/> before hashing or
          signing. Implementations that canonicalize by sorting object keys
          on Unicode code point rather than UTF-16 code unit will produce
          divergent digests for keys outside the Basic Multilingual
          Plane.</dd>
          <dt>Published specification:</dt><dd>This document</dd>
          <dt>Applications that use this media type:</dt><dd>Settlement
          services and autonomous agents forming contracts under this
          specification</dd>
          <dt>Fragment identifier considerations:</dt><dd>As specified for
          <tt>application/json</tt></dd>
          <dt>Additional information:</dt><dd>Deprecated alias names: none.
          Magic numbers: none. File extensions: .json. Macintosh file type
          code: TEXT</dd>
          <dt>Person &amp; email address to contact:</dt><dd>Laxmikant Sharma
          &lt;laxsharma79@gmail.com&gt;</dd>
          <dt>Intended usage:</dt><dd>COMMON</dd>
          <dt>Restrictions on usage:</dt><dd>None</dd>
          <dt>Author:</dt><dd>Laxmikant Sharma</dd>
          <dt>Change controller:</dt><dd>IETF</dd>
        </dl>

        <table anchor="tab-media">
          <name>Media types registered by this document</name>
          <thead>
            <tr><th>Subtype name</th><th>Object</th><th>Defined in</th></tr>
          </thead>
          <tbody>
            <tr><td>pact-contract+json</td><td>Verifiable Task Contract</td>
                <td><xref target="vtc"/></td></tr>
            <tr><td>pact-delivery+json</td><td>Delivery</td>
                <td><xref target="delivery"/></td></tr>
            <tr><td>pact-verdict+json</td><td>Verdict</td>
                <td><xref target="ep-verdict"/></td></tr>
            <tr><td>pact-challenge+json</td><td>Challenge</td>
                <td><xref target="challenge-object"/></td></tr>
            <tr><td>pact-attestation+json</td><td>Work Attestation</td>
                <td><xref target="attestations"/></td></tr>
            <tr><td>pact-facilitator+json</td><td>Capability document</td>
                <td><xref target="wellknown"/></td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="iana-wellknown"><name>Well-Known URI</name>
        <t>IANA is requested to register the following in the "Well-Known
        URIs" registry, per <xref target="RFC8615"/>.</t>
        <dl>
          <dt>URI suffix:</dt><dd>pact-facilitator</dd>
          <dt>Change controller:</dt><dd>IETF</dd>
          <dt>Specification document(s):</dt><dd>This document,
          <xref target="wellknown"/></dd>
          <dt>Status:</dt><dd>permanent</dd>
          <dt>Related information:</dt><dd>The resource is served with media
          type <tt>application/pact-facilitator+json</tt> and MUST be
          signed.</dd>
        </dl>
      </section>

      <section anchor="iana-profiles"><name>PACT Verification Profiles Registry</name>
        <t>IANA is requested to create a registry named "PACT Verification
        Profiles". The registration policy is Specification Required
        <xref target="RFC8126"/>.</t>

        <t>Instructions for the designated expert. A profile determines what
        a fraud proof consists of and, through
        <xref target="assurance"/>, what a Bond must cover, so a registration
        that leaves either underdetermined is not usable. The expert SHOULD
        confirm that the submitted specification states, for the profile:
        what artifact is evaluated and what it is evaluated against; what
        constitutes a valid fraud proof, including whether absence of
        evidence is one; an order-of-magnitude estimate of verification cost
        relative to contract price, since that quantity and not the profile
        name determines whether any Bond makes third-party challenge
        rational; and whether the profile is deterministic, and if not, what
        tolerance applies. The expert SHOULD reject a profile whose fraud
        proof cannot be evaluated by a party other than the Seller, since
        such a profile cannot satisfy <xref target="independence"/>.</t>

        <table anchor="tab-profiles">
          <name>Initial contents</name>
          <thead>
            <tr><th>Name</th><th>Description</th><th>Reference</th></tr>
          </thead>
          <tbody>
            <tr><td>acceptance</td>
                <td>Run the committed instrument against the Delivery</td>
                <td>This document</td></tr>
            <tr><td>bisection</td>
                <td>Interactive narrowing to a disputed step</td>
                <td>This document</td></tr>
            <tr><td>full-reexec</td>
                <td>Re-execute and compare outputs byte for byte</td>
                <td>This document</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="iana-bindings"><name>PACT Settlement Bindings Registry</name>
        <t>IANA is requested to create a registry named "PACT Settlement
        Bindings", registration policy Specification Required. A binding
        determines how value is locked, released and reversed, so the expert
        SHOULD confirm that the submitted specification states how each of
        those three operations maps onto the underlying rail, and what
        happens when a reversal is requested after the rail's own finality.
        A binding whose rail cannot reverse MUST say so, since
        <xref target="waterfall"/> then has no rank 1.</t>

        <table anchor="tab-bindings">
          <name>Initial contents</name>
          <thead>
            <tr><th>Identifier</th><th>Description</th><th>Reference</th></tr>
          </thead>
          <tbody>
            <tr><td>pact-escrow</td>
                <td>An x402 payment scheme carrying PACT escrow semantics</td>
                <td>This document</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="iana-problems"><name>Problem Types</name>
        <t>This document creates no registry for its problem types.
        <xref target="RFC9457"/> Section 4.2 establishes the "HTTP Problem
        Types" registry for types intended for reuse across applications;
        the types below are specific to this protocol and are identified by
        URIs in a namespace this document defines, which that specification
        permits without registration. Each is the identifier in the table
        appended to the prefix <tt>https://pact-spec.github.io/problem/</tt>.
        Per Section 3.1.1 of <xref target="RFC9457"/> a consumer uses the
        URI as an identifier and SHOULD NOT dereference it automatically;
        dereferencing SHOULD yield human-readable documentation, which the
        author maintains at that prefix. Each entry carries the identifier,
        the HTTP status it accompanies, and the section stating the rule it
        reports.</t>

        <table anchor="tab-problems">
          <name>Problem types defined by this document</name>
          <thead>
            <tr><th>Identifier</th><th>Status</th><th>Defined in</th></tr>
          </thead>
          <tbody>
            <tr><td>assurance-constraint-unsatisfied</td><td>422</td>
                <td><xref target="assurance"/></td></tr>
            <tr><td>evidence-nonconformant</td><td>422</td>
                <td><xref target="delivery"/></td></tr>
            <tr><td>parent-unresolvable</td><td>422</td>
                <td><xref target="tree-binding"/></td></tr>
            <tr><td>finality-ordering-violation</td><td>422</td>
                <td><xref target="tree-finality"/></td></tr>
            <tr><td>parties-not-distinct</td><td>422</td>
                <td><xref target="conf-rules"/></td></tr>
            <tr><td>algorithm-not-permitted</td><td>400</td>
                <td><xref target="conf-sig"/></td></tr>
            <tr><td>verifier-not-independent</td><td>422</td>
                <td><xref target="independence"/></td></tr>
            <tr><td>release-exceeds-bond</td><td>409</td>
                <td><xref target="pools"/></td></tr>
          </tbody>
        </table>
      </section>
    </section>

  </middle>

  <back>
    <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.8785.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9711.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7515.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8615.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6838.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9162.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7518.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8037.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7517.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.9110.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9325.xml"/>
    </references>

    <references><name>Informative References</name>
      <reference anchor="ASOKAN98" target="https://doi.org/10.1109/secpri.1998.674826">
        <front>
          <title>Asynchronous Protocols for Optimistic Fair Exchange</title>
          <author initials="N." surname="Asokan"/>
          <author initials="V." surname="Shoup"/>
          <author initials="M." surname="Waidner"/>
          <date year="1998"/>
        </front>
        <refcontent>Proceedings of the IEEE Symposium on Security and Privacy</refcontent>
      </reference>

      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.hood-agtp-commerce.xml"/>
      <reference anchor="I-D.stone-vcap-ap2-binding" target="https://datatracker.ietf.org/doc/html/draft-stone-vcap-ap2-binding-00">
        <front>
          <title>VCAP-AP2 Binding: Verified Commerce Settlement for the Agent Payments Protocol</title>
          <author initials="B." surname="Stone"/>
          <date day="17" month="March" year="2026"/>
        </front>
        <refcontent>Work in Progress, Internet-Draft, draft-stone-vcap-ap2-binding-00</refcontent>
      </reference>
      <reference anchor="I-D.sahu-agent-action-receipts" target="https://datatracker.ietf.org/doc/html/draft-sahu-agent-action-receipts-00">
        <front>
          <title>Signed, Hash-Chained Action Receipts for AI Agents</title>
          <author initials="N." surname="Sahu"/>
          <date day="16" month="August" year="2026"/>
        </front>
        <refcontent>Work in Progress, Internet-Draft, draft-sahu-agent-action-receipts-00</refcontent>
      </reference>
      <reference anchor="I-D.mih-sato-agent-accountability-composition" target="https://datatracker.ietf.org/doc/html/draft-mih-sato-agent-accountability-composition-01">
        <front>
          <title>Agent Accountability: Composition and Conformance</title>
          <author initials="S." surname="Mih"/>
          <author initials="T." surname="Sato"/>
          <author initials="I." surname="Schrock"/>
          <author initials="S." surname="Bu"/>
          <author initials="A." surname="Sokolov"/>
          <date day="16" month="August" year="2026"/>
        </front>
        <refcontent>Work in Progress, Internet-Draft, draft-mih-sato-agent-accountability-composition-01</refcontent>
      </reference>
      <reference anchor="I-D.asor-wimse-agent-delegation-chain" target="https://datatracker.ietf.org/doc/html/draft-asor-wimse-agent-delegation-chain-01">
        <front>
          <title>Verifiable Attenuated Delegation for AI Agent Chains</title>
          <author initials="R." surname="Asor"/>
          <date day="3" month="September" year="2026"/>
        </front>
        <refcontent>Work in Progress, Internet-Draft, draft-asor-wimse-agent-delegation-chain-01</refcontent>
      </reference>
      <reference anchor="I-D.pinto-agent-authz-contestability" target="https://datatracker.ietf.org/doc/html/draft-pinto-agent-authz-contestability-00">
        <front>
          <title>Contestability Bindings for Authorized Agent Actions</title>
          <author initials="T." surname="Pinto"/>
          <date day="29" month="August" year="2026"/>
        </front>
        <refcontent>Work in Progress, Internet-Draft, draft-pinto-agent-authz-contestability-00</refcontent>
      </reference>

      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8725.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml"/>
      <reference anchor="DID-CORE" target="https://www.w3.org/TR/2022/REC-did-core-20220719/">
        <front><title>Decentralized Identifiers (DIDs) v1.0</title>
          <author><organization>W3C</organization></author>
          <date day="19" month="July" year="2022"/></front>
        <refcontent>W3C Recommendation</refcontent>
      </reference>
      <reference anchor="DID-WEB" target="https://w3c-ccg.github.io/did-method-web/">
        <front><title>did:web Method Specification</title>
          <author><organization>W3C Credentials Community Group</organization></author>
          <date year="2026"/></front>
      </reference>
      <reference anchor="CAIP-2" target="https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md">
        <front><title>CAIP-2: Blockchain ID Specification</title>
          <author><organization>Chain Agnostic Standards Alliance</organization></author>
          <date day="5" month="December" year="2019"/></front>
        <refcontent>Status: Final</refcontent>
      </reference>
      <reference anchor="ASOKAN98THESIS" target="https://uwspace.uwaterloo.ca/">
        <front>
          <title>Fairness in Electronic Commerce</title>
          <author initials="N." surname="Asokan"/>
          <date year="1998"/>
        </front>
        <refcontent>PhD thesis, University of Waterloo. Chapter 2 defines
        generatable and revocable items and the affidavit token by which a
        third party reverses a completed transfer</refcontent>
      </reference>

      <reference anchor="BELENKIY08" target="https://doi.org/10.1145/1403027.1403046">
        <front>
          <title>Incentivizing Outsourced Computation</title>
          <author initials="M." surname="Belenkiy"/>
          <author initials="M." surname="Chase"/>
          <author initials="C.C." surname="Erway"/>
          <author initials="J." surname="Jannotti"/>
          <author initials="A." surname="Kupcu"/>
          <author initials="A." surname="Lysyanskaya"/>
          <date year="2008"/>
        </front>
        <refcontent>Proceedings of the 3rd International Workshop on Economics
        of Networked Systems (NetEcon '08), pp. 85-90</refcontent>
      </reference>

      <reference anchor="POLINSKY99">
        <front>
          <title>Public Enforcement of Law</title>
          <author initials="A.M." surname="Polinsky"/>
          <author initials="S." surname="Shavell"/>
          <date year="1999"/>
        </front>
        <refcontent>Encyclopedia of Law and Economics, entry 8000,
        Edward Elgar. The result is attributed therein to Bentham (1789)</refcontent>
      </reference>

      <reference anchor="MAMAGEISHVILI23" target="https://arxiv.org/abs/2308.02880">
        <front>
          <title>Incentive Schemes for Rollup Validators</title>
          <author initials="A." surname="Mamageishvili"/>
          <author initials="E.W." surname="Felten"/>
          <date year="2023"/>
        </front>
        <refcontent>arXiv:2308.02880</refcontent>
      </reference>

      <reference anchor="X402COMPLIANCE" target="https://github.com/x402-foundation/x402/pull/2853">
        <front>
          <title>Compliance fields: an extension for x402</title>
          <author><organization>x402 Foundation</organization></author>
          <date year="2026"/>
        </front>
        <refcontent>Pull request 2853, specs/extensions/compliance_fields.md</refcontent>
      </reference>

      <reference anchor="I-D.laxsharma-pact-00" target="https://datatracker.ietf.org/doc/draft-laxsharma-pact/">
        <front>
          <title>PACT: A Contract Layer for Autonomous Agent Commerce</title>
          <author initials="L." surname="Sharma"/>
          <date year="2026" month="July"/>
        </front>
        <refcontent>Internet-Draft, draft-laxsharma-pact-00</refcontent>
      </reference>
    </references>

    <section anchor="acks" numbered="false"><name>Acknowledgements</name>
      <t>The UTF-16 key-ordering vector that exposed a latent
      canonicalization defect in the reference validator, and the
      formulation of verifier independence as a relation the evaluator
      derives rather than a field the record declares, came from Tersign
      (wowlegend) on x402-foundation/x402 issue 3065. The observation that
      verification tiers say how work is checked and never who checks it,
      which set off the adversarial review this revision rests on, came from
      msaleme on the same thread. Rich Smith's A2A Settlement Extension was
      the clearest instance of the pattern <xref target="settlement"/>
      corrects, and he engaged with the critique on a2aproject/A2A
      discussion 1576.</t>
    </section>
  </back>
</rfc>
