| Internet-Draft | PACT | September 2026 |
| Sharma | Expires 8 March 2027 | [Page] |
- Workgroup:
- Network Working Group
- Internet-Draft:
- draft-laxsharma-pact-01
- Published:
- Intended Status:
- Experimental
- Expires:
PACT: Liability and Settlement for Autonomous Agent Contracts
Abstract
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.¶
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.¶
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.¶
Status of This Memo
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 8 March 2027.¶
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
1. Introduction
1.1. Motivation
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.¶
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.¶
That gap is not an oversight in those documents; it is outside their scope, and correctly so. It is the gap this document addresses.¶
1.2. What This Document Specifies, and What It Does Not
PACT specifies exactly four things: liability as a required member of a co-signed contract object (Section 5.3); the Delivery object against which that contract is judged (Section 6); a settlement procedure whose release is conditioned on a declared assurance level (Section 7); and a subcontract tree through which liability cascades (Section 10).¶
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.¶
Two mechanisms present in [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.¶
1.4. The Experiment
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 Figure 2, with attestations either can check. It fails, and that would itself be a result worth recording, if the constraint in Section 7.2 proves unworkable at the prices and verification costs real deployments exhibit. Experience should be reported to the author and to the repository named in Section 15.¶
1.5. Changes from -00
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:¶
- Liability is promoted from a member of the contract to the subject of the document (Section 5.3).¶
- 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 (Section 6).¶
- 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 (Section 7.4).¶
- Release is conditioned on a declared assurance level, and
on-verificationreplaces optimistic release as the default and the only mode required of conformant implementations (Section 7.3).¶ - An Assurance Constraint is stated that a facilitator can check before locking funds (Section 7.2).¶
- Bond release on contract finality is specified. The -00 had no rule returning a seller's bond.¶
- Subcontract finality is bottom-up, resolving the -00's requirement that a parent commit to child attestations that could not yet exist (Section 10).¶
- Protocol endpoints are specified. The -00 defined objects and no operations, so no two implementations could exchange a message (Section 12).¶
- Conformance requirements are stated (Section 13). 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.¶
- A worked example is carried in the document and committed by hash (Section 14). The -00 contained no numeric example and no digest, so it made no verifiable claim about its own reference implementation.¶
- Contract channels and the sealed-bid award procedure are removed (Section 1.2).¶
2. Conventions and Definitions
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 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
All JSON objects defined here are canonicalized with JCS [RFC8785] before hashing or signing. Implementations MUST order object keys by UTF-16 code unit as [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.¶
Version. The pact 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 pact 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.¶
Time. Every timestamp is an RFC 3339 date-time [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.¶
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
price.settlement, and need not be an ISO 4217 code. A
network is a ledger identifier in the form the same binding defines;
the pact-escrow binding uses [CAIP-2] chain
identifiers.¶
3. Terminology
- Buyer:
- The party that commissions work and locks the price.¶
- Seller:
- The party that performs the work and posts the Bond.¶
- Facilitator:
- 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.¶
- Verifier:
- The party that evaluates a Delivery against the committed acceptance instrument for release purposes. Independence requirements are in Section 9.1.¶
- Challenger:
- Any party that submits a fraud proof within the challenge window.¶
- Bond:
- Seller-posted collateral, sized per Section 7.2, from which restitution and penalties are paid.¶
- Verification Fund:
- Value posted at Agree, separate from the Bond, that pays for verification actually performed.¶
- VTC:
- Verifiable Task Contract (Section 5).¶
- Delivery:
- The object a Seller submits, and the only object a contract is judged against (Section 6).¶
- Verdict:
- A signed statement by a Verifier that a Delivery was evaluated against the committed instrument, and with what outcome (Section 12.4).¶
- Challenge:
- A signed fraud proof submitted within the challenge window (Section 7.5).¶
- Work Attestation:
- The Facilitator-signed record of a contract's terminal outcome (Section 11).¶
4. Protocol Overview
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.¶
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 ->| |
The challenge window opens when the Verdict is recorded under
on-verification release, and when the contract enters
DELIVERED under on-window and optimistic release; it
closes challenge.window_seconds later by the Facilitator's
clock. Under
on-verification 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 (Section 10).¶
+------------+
| 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 |
+------------+ +------------+
Under optimistic release DELIVERED proceeds directly to
RELEASING and a Verdict, if one arrives, does so inside the window.
Under on-window release DELIVERED proceeds to RELEASING when
the window closes with no successful Challenge. Under
unsecured 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
task.deadline had no stated consequence, so escrow could lock
permanently, and a negative outcome required the signature of the party
it convicted.¶
5. The Verifiable Task Contract
A VTC is a JSON object, media type
application/pact-contract+json, 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 Section 12.1.¶
-
pact: - REQUIRED. Protocol version.¶
-
type: - REQUIRED. The string
VerifiableTaskContract.¶ -
id: - REQUIRED. Contract identifier, unique for the
Facilitator named in
settlement.¶ -
parties: - REQUIRED. Object with
buyer,sellerandfacilitatoridentifiers, and OPTIONALverifier. Buyer and seller MUST differ. Whereverifieris absent, the Verdict MUST come from a party satisfying Section 9.1.¶ -
task: - REQUIRED. Object with
spec_hash,deadline, and OPTIONALspec_uri.¶ -
price: - REQUIRED. Object with
amount,currency,settlementbinding identifier, andnetwork.¶ -
verification: - REQUIRED. Object with
tier,profile(Section 9),criteria_hash, and OPTIONALarbiter.¶ -
assurance: - REQUIRED. Object with
modeandq_min(Section 7.2).¶ -
release: - REQUIRED. Release mode
(Section 7.3). Absent an explicit value a Facilitator
MUST treat the contract as
on-verification.¶ -
liability: - REQUIRED (Section 5.3).¶
-
challenge: - REQUIRED. Object with
window_seconds, which MUST be greater than zero, andmax_dispute_seconds.¶ -
signatures: - REQUIRED. Array of JWS signatures
over the JCS-canonical form of the VTC excluding the
signaturesmember, per Section 13.¶
The settlement identifier, the network and the asset are all
carried inside price 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.¶
{
"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": "..." } ]
}
Hash values are wrapped here for page width only; they are single JSON strings with no embedded whitespace.¶
5.1. Hash Commitments and Content Conveyance
Every URI carried inside hash-committed content MUST be accompanied
by a sibling hash over the dereferenced bytes. The -00 committed
harness_uri 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.¶
Where the committed content is a bundle of files rather than a
single octet stream, the commitment MUST be computed as
SHA-256(JCS(M)) where M is an object mapping each file's
path, relative to the bundle root and expressed with "/" separators,
to SHA-256 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.¶
5.2. The Task Specification
The content committed by spec_hash is a TaskSpec: a JSON
object, canonicalized per [RFC8785] before hashing,
with the members below.¶
-
description: - REQUIRED. Natural-language statement of the work.¶
-
inputs: - OPTIONAL. Object carrying
schema_uriwith itsschema_hash, and where a representative sample is published,sample_uriwith itssample_hash.¶ -
deliverable: - REQUIRED. Output format and
schema_uriwithschema_hash.¶ -
acceptance: - REQUIRED. The verification
instrument, with members conditional on tier as below, plus
machine-readable
thresholdsandharness_hashequal to the contract'scriteria_hash.¶ -
constraints: - OPTIONAL. Tool prohibitions, confidentiality and compliance conditions.¶
The acceptance object MUST carry the members REQUIRED for
the contract's tier: harness_uri and harness_hash
for re-execution tiers, enclave and model policy for attestation
tiers, a proof statement with its verifying key for proving tiers, or
rubric_uri and rubric_hash for judgment tiers. An
empty acceptance object MUST be rejected. The -00's schema
permitted one, which made every fraud proof impossible and quietly
converted conditional release into unconditional payment.¶
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.¶
5.3. Liability
The liability 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.¶
-
seller_bond: - REQUIRED. Collateral the Seller posts before performance, sized per Section 7.2. It is the source of restitution, not a fine.¶
-
verification_fund: - 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.¶
-
cap: - REQUIRED. The maximum protocol-native
remedy. A Facilitator MUST NOT move more than
capfrom the Seller under this contract.¶ -
restitution_basis: - REQUIRED. One of
released, restoring the Buyer up to value already released, orprice, restoring the full price. Determines the second rank of the waterfall in Section 7.4.¶ -
parent: - OPTIONAL. Present only in a subcontract.
Object with the parent's
vtc_idandvtc_hash(Section 10.1).¶ -
remainder_to: - OPTIONAL. Where slashed value
remaining after rank 4 of Section 7.4 is directed:
buyerorsink. Absent,sink. A sink is a Facilitator-designated destination that is not a party to the contract.buyeris permitted but rewards a Buyer beyond its loss, which is an incentive to manufacture challenges; the default exists for that reason.¶
Liability under PACT is bounded by cap and is discharged in
the contract's own currency. This document creates no cause of action
and displaces no other remedy: consequential loss beyond cap,
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.¶
A parent member is authenticated not by a separate
countersignature but by the rule in Section 10.1: the
child's Buyer must be the parent's Seller. Since liability is
inside the bytes the Buyer signs, the Buyer's signature on the child is
itself the authorisation to attach it.¶
6. The Delivery Object
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.¶
A Delivery is a JSON object, media type
application/pact-delivery+json.¶
-
pact,type: - REQUIRED. Version, and the
string
Delivery.¶ -
vtc_id,vtc_hash: - REQUIRED. Identify and
commit to the contract being performed.
vtc_hashis computed over the JCS-canonical VTC including itssignaturesmember, so the commitment covers who agreed and not merely what was written.¶ -
work_hash: - REQUIRED. Digest over the delivered bytes, or a manifest digest per Section 5.1 where the deliverable is a bundle.¶
-
work_uri: - OPTIONAL. Where the bytes may be
fetched. Integrity comes from
work_hash, never from the transport.¶ -
input_hash: - 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.¶
-
evidence: - REQUIRED. Object whose members are
profiled by
verification.tier. Its conformance to the tier profile is a validity condition, not a quality judgement.¶ -
signature: - REQUIRED. Seller JWS over the JCS-canonical Delivery excluding this member.¶
A Facilitator MUST reject a Delivery whose evidence is
absent or does not conform to the profile named in the VTC, and MUST
apply Section 7.4 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 Section 3. This is the rule that makes silence
expensive: under the -00 the cheapest attack was to deliver
nothing verifiable and be paid anyway.¶
Where task.deadline 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
liability.restitution_basis. No challenge window opens, because
there is nothing to challenge.¶
{
"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": "..." }
}
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.¶
7. Settlement
7.1. Value Pools
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.¶
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.¶
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
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.¶
7.2. The Assurance Constraint
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:¶
q * ( (P - E) + B ) >= C
¶
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:¶
B >= P * (1 - q) / q + E
¶
A Facilitator MUST evaluate this constraint against the contract's
declared assurance.q_min before locking funds, and MUST
refuse a contract that does not satisfy it.¶
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.¶
This inequality is not new and is not claimed as new. It is the classical deterrence bound, stated for public enforcement in [POLINSKY99], which traces it to Bentham, and for outsourced computation, with the fine posted in advance as a deposit held by the principal, in [BELENKIY08] Theorem 1. Its form for rollup validators is [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.¶
The assurance.mode member states how q is produced:¶
-
certain: - Every Delivery is verified before release. q is 1 by construction.¶
-
committed-sample: - A declared fraction,
sample_rate, 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.¶ -
open: - Detection relies on third-party
challenge. A contract MUST NOT declare
openas 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 Section 7.4 shows that a bounded reward is dominated by silence.¶
7.3. Release Modes
The release member takes one of four values. A
conformant Facilitator MUST implement on-verification; the
others are OPTIONAL.¶
-
on-verification: - REQUIRED to implement, and the default. Release follows a recorded PASS Verdict.¶
-
on-window: - Release follows expiry of the challenge window, which opens at DELIVERED, with no successful Challenge.¶
-
optimistic: - Release follows Delivery, before any Verdict, subject to the cap in Section 7.1.¶
-
unsecured: - 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.¶
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.¶
7.4. Challenge and Remedy
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:¶
- Reverse any unreleased escrow to the Buyer.¶
- Reimburse the successful Challenger's documented verification and submission costs, from the Verification Fund.¶
- Restore the Buyer from the Bond, up to
liability.restitution_basis.¶ - Pay the Challenger bounty from the remaining Bond.¶
- Direct any remainder per
liability.remainder_to.¶
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.¶
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. [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.¶
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.¶
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 |
7.5. The Challenge Object
A Challenge is a JSON object, media type
application/pact-challenge+json, by which any party submits a
fraud proof within the window. Members: pact, type
(the string Challenge), vtc_id,
delivery_hash, a proof object whose members are
profiled by verification.profile, and the Challenger's
signature. A Facilitator MUST reject a Challenge received
outside the window, one whose proof does not conform to the
profile, or one whose delivery_hash does not match the
recorded Delivery. A Challenge that is accepted is evaluated by a
party satisfying Section 9.1, whose finding is a
Verdict; the Challenger's own assertion is not.¶
The Challenger is the party identified by the kid 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 challenge_deposit in its capability document
(Section 8), 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
Section 16.12 discusses its limits.¶
{
"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": "..." }
}
7.6. Bond Release
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 Section 7.4, 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 (Section 10), because cascading liability requires the parent's collateral to remain exposed until the subtree has settled.¶
8. Facilitator Capability Discovery
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 [RFC8615].¶
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.¶
A Facilitator SHOULD publish a JSON document, media type
application/pact-facilitator+json, at the path
/.well-known/pact-facilitator 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 facilitator. An
unsigned capability document is not usable for contract formation,
because the members below determine what a party is agreeing to when it
signs.¶
-
facilitator: - REQUIRED. The identifier that will
appear in
parties.facilitator.¶ -
settlement_bindings: - REQUIRED. Array of binding identifiers, each with the networks and assets it serves.¶
-
release_modes: - REQUIRED. Array of supported
modes; MUST contain
on-verification.¶ -
verification_profiles: - REQUIRED. Array of supported profiles from the registry in Section 18.¶
-
assurance_modes: - REQUIRED. Array of supported modes.¶
-
max_contract_value: - OPTIONAL. Object with
amountandcurrency.¶ -
challenge_deposit: - OPTIONAL. Object with
amountandcurrency, required with each Challenge (Section 7.5). Absent, no deposit is required.¶ -
endpoints: - REQUIRED. Object mapping each endpoint name in Section 12 to an absolute URI.¶
-
signature: - REQUIRED. JWS over the JCS-canonical document excluding this member.¶
{
"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": "..." }
}
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.¶
9. Verification Profiles
A contract names both a tier, which says what class of
evidence is produced, and a profile, which says what is
actually done to check it. Four tier labels are used in this document:
T0-reexec, deterministic re-execution; T1-tee,
hardware attestation per [RFC9334]; T2-zkml, a
proof of inference; and T3-jury, staked arbitration. Tiers are
a vocabulary, not a registry; profiles are the registered quantity
(Section 18.3). The distinction matters because the tier name
does not determine the security of the contract and the profile
largely does.¶
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 Section 7.2 they give opposite answers about whether any Bond a Seller would post makes third-party challenge rational.¶
Three regimes follow, and the boundaries are consequences of
Section 7.2 rather than stipulations. Where verification
costs a small fraction of a percent of price, every Delivery can be
checked, assurance.mode of certain 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 open assurance,
because it would be declaring a detection probability nothing
produces.¶
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.¶
-
acceptance: - Run the instrument committed by
criteria_hashagainst the Delivery. The fraud proof is a failing evaluation. Deterministic by construction, since the instrument is fixed before work begins.¶ -
bisection: - 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.¶
-
full-reexec: - Re-execute and compare byte for byte. Sound only where the computation is deterministic and the environment is pinned; see Section 16.8.¶
9.1. Verifier Independence
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
did:web and https 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 [X402COMPLIANCE]; PACT binds them at contract
formation, constraining who may be named as Verifier before work
begins.¶
10. Contract Trees and Cascading Liability
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.¶
A (Buyer)
|
vtc_7f3a91 cap 180.00
|
B (Seller)
|
+-------------+-------------+
| |
vtc_c1a2 vtc_c2b7 cap 60.00 each
| |
C (Seller) D (Seller)
10.1. Binding a Child to Its Parent
A subcontract carries liability.parent, an object with the
parent's vtc_id and vtc_hash. Because
liability is inside the bytes both parties sign, the child's
Buyer signature is itself the authorisation to attach that child to
that parent.¶
A Facilitator MUST verify, before accepting a child contract, that the child's Buyer is the parent's Seller:¶
child.parties.buyer == parent.parties.seller¶
after the normalization in Section 9.1, where
parent is the contract whose canonical form hashes to
liability.parent.vtc_hash. A Facilitator MUST reject a child
whose parent it cannot resolve and verify.¶
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 liability.parent as a bare string with
no hash and no check, so the attack cost one signature.¶
A Facilitator MUST reject a child whose parent chain already
contains the child's own vtc_id, and MUST enforce a maximum
tree depth. Absent explicit configuration that maximum is 8. Both
limits exist so that resolving a chain terminates.¶
10.2. What Cascades, and What Does Not
Liability cascades upward as recovery. It does not cascade downward as discharge.¶
Concretely: when a child fails, its Bond is applied under Section 7.4 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.¶
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 --
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.¶
A parent Seller SHOULD ensure that the sum of its children's
cap 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.¶
10.3. Finality Is Bottom-Up
A parent's Work Attestation MUST carry
children_merkle_root, a Merkle root over the attestation
hashes of its immediate children, computed as in
Section 11. A parent therefore cannot be attested
until its children have been.¶
The -00 required that same commitment while ordering only
task.deadline 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.¶
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
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:¶
child.task.deadline
+ child.challenge.window_seconds
+ child.challenge.max_dispute_seconds
<
parent.task.deadline
+ parent.challenge.window_seconds
¶
A Facilitator MUST NOT move a contract to FINAL, and MUST NOT return a Bond under Section 7.6, 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.¶
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.¶
11. Work Attestations
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.¶
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.¶
-
vtc_id,vtc_hash: - REQUIRED.¶
-
parties: - 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.¶
-
subject: - REQUIRED. The identifier this
attestation is evidence about, which MUST appear in
parties.¶ -
role: - REQUIRED. The subject's role, one of
buyerorseller. A Buyer record and a Seller record are different evidence and MUST NOT be interchangeable.¶ -
outcome: - REQUIRED. One of
performed,cured,slashed,abandoned.¶ -
work_hash: - REQUIRED where a Delivery was recorded. Binds the attestation to what was produced rather than only to what was paid.¶
-
amounts: - REQUIRED. Settled, restituted and slashed values.¶
-
children_merkle_root: - REQUIRED where the contract has children (Section 10.3).¶
-
signatures: - REQUIRED. MUST include a Facilitator signature.¶
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.¶
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.¶
{
"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": "..." }
]
}
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.¶
11.1. The Children Merkle Root
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. children_merkle_root is MTH(D) exactly as
defined in [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.¶
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.¶
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.¶
12. Protocol Endpoints
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 endpoints member
of the capability document (Section 8), so a
Facilitator may mount them anywhere on its origin.¶
| Operation | Method | Target |
|---|---|---|
| Propose a contract | POST |
{contract}
|
| Retrieve a contract | GET |
{contract}/{id}
|
| Submit a Delivery | POST |
{delivery}
|
| Record a Verdict | POST |
{verdict}
|
| Open a challenge | POST |
{challenge}
|
| Retrieve an Attestation | GET |
{attestation}/{id}
|
All requests and responses use the media types defined in Section 18. All requests MUST be made over HTTPS, following the recommendations of [RFC9325]. Status codes are as defined in [RFC9110].¶
| Operation | Request body | Success | Response body |
|---|---|---|---|
| Propose | pact-contract+json | 201 | the VTC, plus state
|
| Retrieve contract | none | 200 | the VTC, plus state
|
| Submit Delivery | pact-delivery+json | 202 | the Delivery, plus state
|
| Record Verdict | pact-verdict+json | 201 | the Verdict |
| Open challenge | pact-challenge+json | 202 | the Challenge, plus state
|
| Retrieve Attestation | none | 200 | pact-attestation+json |
The state member in a response is the current value from
Figure 2; 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.¶
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 Section 12.4, 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.¶
12.1. Proposing a Contract
The request body is a VTC carrying the signatures of every party required to sign it. A Facilitator MUST perform the checks in Section 13 and Section 7.2 before creating the resource, and MUST refuse otherwise.¶
12.2. Idempotency
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 200 (OK) with that resource rather
than creating a second one or reporting a conflict.¶
Where a POST carries the same object id as an existing
resource but a different hash, the Facilitator MUST respond
409 (Conflict). Retrying a submission is therefore always
safe, and altering one never is.¶
12.3. Error Responses
A Facilitator MUST report failures using
[RFC9457] problem details, media type
application/problem+json, with a type drawn from the
registry in Section 18. 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.¶
The section member is REQUIRED on any problem arising from
a rule in this document and carries the section number stating that
rule.¶
12.4. Recording a Verdict
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 Section 9.1 for the contract named, and MUST NOT accept a Verdict for a contract that has no recorded Delivery.¶
{
"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": "..." }
}
The Verifier is the party identified by the kid of the
Verdict's signature. Where the contract names
parties.verifier, the Verdict MUST be signed by that party;
otherwise the Facilitator evaluates Section 9.1
against the signer.¶
A Verdict commits to the instrument it ran and to the results it
produced. Without instrument_hash 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
Section 5.1, arriving from the verification side rather
than the acceptance side.¶
12.5. Exchange
Buyer/Seller Facilitator Verifier
| | |
|-- POST {contract} --->| |
|<-- 201 Created -------| |
| | |
|-- POST {delivery} --->| |
|<-- 202 Accepted ------| |
| | |
| |-- GET work_uri ----->|
| |<-- POST {verdict} ---|
| | |
|<-- 200 OK ------------| |
| | |
|-- GET {attestation} ->| |
|<-- 200 Attestation ---| |
A Delivery is answered 202 (Accepted) rather than
201 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.¶
13. Conformance
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.¶
13.1. Signatures
Every signature carried by a VTC, Delivery, Verdict, Challenge, Work Attestation, or capability document is a JWS [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 [RFC7515] defines it. The payload is never transmitted; a verifier reconstructs it from the object it holds. The following constraints apply.¶
- The protected header MUST carry
alg,kidandtyp.¶ -
algMUST beES256orES384[RFC7518], orEdDSA[RFC8037] with an Ed25519 key; a verifier MAY also accept Ed448. A verifier MUST reject any other value, and MUST rejectnone. Absent an allowlist an attacker selects the algorithm, which permits both unsigned acceptance and confusion of a public key for a symmetric secret.¶ -
kidMUST 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.¶ -
typMUST be the full media type of the object signed, including theapplication/prefix, so that a signature over one object type cannot be replayed as a signature over another. Section 4.1.9 of [RFC7515] recommends omitting the prefix; this document requires the full form so thattypequals the registered media type character for character. Explicit typing follows Section 3.11 of [RFC8725].¶
13.1.1. Key Resolution
A kid is a URI naming a public key. A verifier MUST
resolve it as follows, and MUST reject a signature whose
kid it cannot resolve.¶
- A
did:identifier is a DID URL [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 usedid:web[DID-WEB]; no method is required or excluded.¶ - An
https:identifier dereferences, over TLS, to a JWK Set [RFC7517]; the verifier selects the key whosekidmember equals the fragment.¶
The part of a kid before its fragment MUST equal, after
the normalization in Section 9.1, 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.¶
13.2. Rules Not Expressible in a Schema
-
parties.buyerandparties.sellerMUST be distinct after the normalization in Section 9.1.¶ - 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.¶
-
challenge.window_secondsMUST be greater than zero.¶ - Every URI member inside hash-committed content MUST have a
sibling hash member, and a validator MUST reject content carrying
harness_uriwithoutharness_hash, orrubric_uriwithoutrubric_hash.¶ - An
acceptanceobject MUST carry the members REQUIRED for the contract's tier. An emptyacceptanceobject MUST be rejected, since it makes every fraud proof impossible and converts conditional release into unconditional payment.¶ - A Facilitator MUST reject a contract that does not satisfy
Section 7.2 against its declared
q_min.¶
13.3. Test Vectors
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.¶
| ID | Mutation from a valid object | Expect |
|---|---|---|
| V-01 | unmodified valid VTC | accept |
| V-02 |
alg set to none
|
reject |
| V-03 |
alg set to HS256
|
reject |
| V-04 |
kid moved outside the protected
header |
reject |
| V-05 |
typ of a Delivery on a VTC
signature |
reject |
| V-06 | buyer and seller set to the same identifier | reject |
| V-07 | buyer and seller differing only by trailing "/" | reject |
| V-08 | two signatures, both from the buyer | reject |
| V-09 |
window_seconds of 0 |
reject |
| V-10 |
acceptance as an empty object |
reject |
| V-11 |
harness_uri with
harness_hash removed |
reject |
| V-12 | B 18.00, P 180.00, q_min 0.90 | reject |
| V-13 | B 18.00, P 180.00, q_min 1.00 | accept |
| V-14 | Delivery with evidence absent |
reject as FAIL |
| V-15 | child whose buyer is not the parent's seller | reject |
| V-16 | child finalising after the parent's window closes | reject |
| V-17 | Verdict signed by the seller | reject |
| V-18 | object keys ordered by code point, with a supplementary-plane key | digest mismatch |
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.¶
14. Worked Example
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.¶
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.¶
| Quantity | Symbol | Value |
|---|---|---|
| Price | P | 180.00 USDC |
| Seller bond | B | 18.00 USDC |
| Verification fund | F | 0.50 USDC |
| Released before Verdict | E | 0.00 |
| Challenge window | 3600 s |
Apply Section 7.2. With E of zero the constraint B >= P(1-q)/q reduces to a requirement on q of at least P/(P+B):¶
q >= 180.00 / (180.00 + 18.00) = 0.9091¶
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
assurance.mode of certain: at q of 1 the required bond
is zero and the bond covers harm rather than deterrence.¶
| q | Required B | 18.00 suffices? |
|---|---|---|
| 1.00 | 0.00 | yes |
| 0.9091 | 18.00 | exactly |
| 0.90 | 20.00 | no |
| 0.50 | 180.00 | no |
The digests carried by the reference TaskSpec and contract are:¶
spec_hash
sha256:bb0e87ce522479b7c2f7bcfa26df7ecd7ff67aeb8b415bbd70c22d
97c47adf35
criteria_hash
sha256:d9205d4f2922afd55c0a2dc4ab00d8ee5a512343430bcf5e9abf0c
76d66c69f7
¶
criteria_hash is the manifest digest of
Section 5.1 over the acceptance instrument bundle, and the
same value appears as acceptance.harness_hash inside the
TaskSpec, so the instrument is committed both by the contract and from
within the specification it belongs to.¶
And the contract's own commitment, computed over the signed contract per Section 6:¶
vtc_hash
sha256:b2cccae00fc7b97ba2b6ef6356ff42c006ba661e0249d7eaa8baff3d
e553870b
¶
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. spec_hash and
criteria_hash are unchanged in construction.¶
15. Implementation Status
This section records the status of known implementations of this document per [RFC7942], and is to be removed before publication as an RFC.¶
A reference implementation of the object schemas, the examples in Section 14, 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 Section 13.3, every hash commitment in Section 14, the constraint of Section 7.2 on the worked figures, the Merkle construction of Section 11.1 against the definition in [RFC9162], and the vectors of Section 13.3. No Facilitator, Buyer or Seller exchanging messages over the endpoints of Section 12 is known to the author.¶
16. Security Considerations
Most of what follows was found by adversarial review of [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.¶
16.1. Verifier Capture
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.¶
Section 9.1 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.¶
16.2. Algorithm and Key Confusion
Absent an algorithm allowlist an attacker chooses the algorithm.
The two consequences are alg of none, which makes
every signature check vacuous, and presenting an ECDSA public key as
an HMAC secret, which lets anyone holding the public key forge.
Section 13.1 fixes the permitted set.¶
A kid 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.
Section 13.1 requires kid inside the protected
header.¶
A signature over one object type replayed as a signature over
another is prevented by the typ requirement in the same
section.¶
16.3. Substitution of Committed Content
The -00 committed harness_uri 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.¶
Section 5.1 requires a sibling hash over the dereferenced bytes for every URI inside committed content, and Section 12.4 requires a Verdict to commit to the instrument it actually ran, which closes the same attack from the verification side.¶
16.4. Unauthenticated Parent Attachment
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. Section 10.1 requires the child's Buyer to be the parent's Seller, verified against the parent's hash.¶
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 Section 10.2: cascade is recovery for the parent Seller and never discharge of its obligation to the parent Buyer.¶
16.5. Buying Silence from a Challenger
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.¶
Section 7.4 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.¶
16.6. Non-Delivery and Escrow Lock
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.¶
Section 6 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.¶
16.7. Cross-Venue Replay
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. Section 5 requires all three inside the signed content.¶
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. Section 6 requires
vtc_hash to be computed over the contract including its
signature set.¶
A Delivery, Verdict or Challenge replayed against a different
contract fails because each carries vtc_id and a hash that
binds it to one contract and one Delivery, and the
typ rule of Section 13.1 stops a signature over
one object type standing for another.¶
16.8. Nondeterminism as Shield and as Weapon
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 Section 18.3 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.¶
16.9. Fabricated Settlement History
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. Section 11 requires all three.¶
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.¶
16.10. Trust in the Facilitator
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.¶
16.11. Key Compromise and Rotation
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 kid
(Section 13.1.1), 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 kid resolves to a key the identity method marks as
revoked at the time of acceptance.¶
16.12. Denial of Service by Challenge
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
challenge_deposit of Section 7.5 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.¶
17. Privacy Considerations
PACT moves contracts and evidence about work, and both leak.¶
17.1. Input Disclosure Before Contract Formation
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 constraints member SHOULD carry the
retention and deletion terms. This document cannot enforce any of
that and does not pretend to.¶
17.2. The Settlement Graph
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.¶
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 Section 11 and is not specified here.¶
17.3. Challenger Access
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 open assurance,
because there is no population able to produce the detection
probability such a declaration asserts.¶
17.4. Retention
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.¶
18. IANA Considerations
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 (Section 18.5).¶
18.1. Media Types
IANA is requested to register the following in the "Media Types" registry, per [RFC6838]. The template below is given once in full; the six registrations differ only in the subtype name and the object they carry.¶
- Type name:
- application¶
- Subtype name:
- see Table 6¶
- Required parameters:
- N/A¶
- Optional parameters:
- N/A¶
- Encoding considerations:
- binary; the content is JSON text as defined in [RFC8259], encoded in UTF-8¶
- Security considerations:
- See Section 16 of this document. In particular these media types carry signed objects whose signatures MUST be verified under the constraints in Section 13.1; accepting one without algorithm restriction permits signature forgery.¶
- Interoperability considerations:
- Objects MUST be canonicalized per [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.¶
- Published specification:
- This document¶
- Applications that use this media type:
- Settlement services and autonomous agents forming contracts under this specification¶
- Fragment identifier considerations:
- As specified for
application/json¶ - Additional information:
- Deprecated alias names: none. Magic numbers: none. File extensions: .json. Macintosh file type code: TEXT¶
- Person & email address to contact:
- Laxmikant Sharma <laxsharma79@gmail.com>¶
- Intended usage:
- COMMON¶
- Restrictions on usage:
- None¶
- Author:
- Laxmikant Sharma¶
- Change controller:
- IETF¶
| Subtype name | Object | Defined in |
|---|---|---|
| pact-contract+json | Verifiable Task Contract | Section 5 |
| pact-delivery+json | Delivery | Section 6 |
| pact-verdict+json | Verdict | Section 12.4 |
| pact-challenge+json | Challenge | Section 7.5 |
| pact-attestation+json | Work Attestation | Section 11 |
| pact-facilitator+json | Capability document | Section 8 |
18.2. Well-Known URI
IANA is requested to register the following in the "Well-Known URIs" registry, per [RFC8615].¶
18.3. PACT Verification Profiles Registry
IANA is requested to create a registry named "PACT Verification Profiles". The registration policy is Specification Required [RFC8126].¶
Instructions for the designated expert. A profile determines what a fraud proof consists of and, through Section 7.2, 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 Section 9.1.¶
| Name | Description | Reference |
|---|---|---|
| acceptance | Run the committed instrument against the Delivery | This document |
| bisection | Interactive narrowing to a disputed step | This document |
| full-reexec | Re-execute and compare outputs byte for byte | This document |
18.4. PACT Settlement Bindings Registry
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 Section 7.4 then has no rank 1.¶
| Identifier | Description | Reference |
|---|---|---|
| pact-escrow | An x402 payment scheme carrying PACT escrow semantics | This document |
18.5. Problem Types
This document creates no registry for its problem types.
[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 https://pact-spec.github.io/problem/.
Per Section 3.1.1 of [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.¶
| Identifier | Status | Defined in |
|---|---|---|
| assurance-constraint-unsatisfied | 422 | Section 7.2 |
| evidence-nonconformant | 422 | Section 6 |
| parent-unresolvable | 422 | Section 10.1 |
| finality-ordering-violation | 422 | Section 10.3 |
| parties-not-distinct | 422 | Section 13.2 |
| algorithm-not-permitted | 400 | Section 13.1 |
| verifier-not-independent | 422 | Section 9.1 |
| release-exceeds-bond | 409 | Section 7.1 |
19. Normative References
- [RFC2119]
- Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
- [RFC8174]
- Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
- [RFC8785]
- Rundgren, A., Jordan, B., and S. Erdtman, "JSON Canonicalization Scheme (JCS)", RFC 8785, DOI 10.17487/RFC8785, , <https://www.rfc-editor.org/info/rfc8785>.
- [RFC9457]
- Nottingham, M., Wilde, E., and S. Dalal, "Problem Details for HTTP APIs", RFC 9457, DOI 10.17487/RFC9457, , <https://www.rfc-editor.org/info/rfc9457>.
- [RFC9334]
- Birkholz, H., Thaler, D., Richardson, M., Smith, N., and W. Pan, "Remote ATtestation procedureS (RATS) Architecture", RFC 9334, DOI 10.17487/RFC9334, , <https://www.rfc-editor.org/info/rfc9334>.
- [RFC9711]
- Lundblade, L., Mandyam, G., O'Donoghue, J., and C. Wallace, "The Entity Attestation Token (EAT)", RFC 9711, DOI 10.17487/RFC9711, , <https://www.rfc-editor.org/info/rfc9711>.
- [RFC7515]
- Jones, M., Bradley, J., and N. Sakimura, "JSON Web Signature (JWS)", RFC 7515, DOI 10.17487/RFC7515, , <https://www.rfc-editor.org/info/rfc7515>.
- [RFC8615]
- Nottingham, M., "Well-Known Uniform Resource Identifiers (URIs)", RFC 8615, DOI 10.17487/RFC8615, , <https://www.rfc-editor.org/info/rfc8615>.
- [RFC6838]
- Freed, N., Klensin, J., and T. Hansen, "Media Type Specifications and Registration Procedures", BCP 13, RFC 6838, DOI 10.17487/RFC6838, , <https://www.rfc-editor.org/info/rfc6838>.
- [RFC8126]
- Cotton, M., Leiba, B., and T. Narten, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 8126, DOI 10.17487/RFC8126, , <https://www.rfc-editor.org/info/rfc8126>.
- [RFC8259]
- Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/info/rfc8259>.
- [RFC9162]
- Laurie, B., Messeri, E., and R. Stradling, "Certificate Transparency Version 2.0", RFC 9162, DOI 10.17487/RFC9162, , <https://www.rfc-editor.org/info/rfc9162>.
- [RFC7518]
- Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, DOI 10.17487/RFC7518, , <https://www.rfc-editor.org/info/rfc7518>.
- [RFC8037]
- Liusvaara, I., "CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)", RFC 8037, DOI 10.17487/RFC8037, , <https://www.rfc-editor.org/info/rfc8037>.
- [RFC7517]
- Jones, M., "JSON Web Key (JWK)", RFC 7517, DOI 10.17487/RFC7517, , <https://www.rfc-editor.org/info/rfc7517>.
- [RFC3339]
- Klyne, G. and C. Newman, "Date and Time on the Internet: Timestamps", RFC 3339, DOI 10.17487/RFC3339, , <https://www.rfc-editor.org/info/rfc3339>.
- [RFC9110]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., "HTTP Semantics", STD 97, RFC 9110, DOI 10.17487/RFC9110, , <https://www.rfc-editor.org/info/rfc9110>.
- [RFC9325]
- Sheffer, Y., Saint-Andre, P., and T. Fossati, "Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)", BCP 195, RFC 9325, DOI 10.17487/RFC9325, , <https://www.rfc-editor.org/info/rfc9325>.
20. Informative References
- [ASOKAN98]
- Asokan, N., Shoup, V., and M. Waidner, "Asynchronous Protocols for Optimistic Fair Exchange", Proceedings of the IEEE Symposium on Security and Privacy, , <https://doi.org/10.1109/secpri.1998.674826>.
- [I-D.hood-agtp-commerce]
- Hood, C., "AGTP-Commerce: Open Commerce Specification for Agent-to-Agent Transactions", Work in Progress, Internet-Draft, draft-hood-agtp-commerce-00, , <https://datatracker.ietf.org/doc/html/draft-hood-agtp-commerce-00>.
- [I-D.stone-vcap-ap2-binding]
- Stone, B., "VCAP-AP2 Binding: Verified Commerce Settlement for the Agent Payments Protocol", Work in Progress, Internet-Draft, draft-stone-vcap-ap2-binding-00, , <https://datatracker.ietf.org/doc/html/draft-stone-vcap-ap2-binding-00>.
- [I-D.sahu-agent-action-receipts]
- Sahu, N., "Signed, Hash-Chained Action Receipts for AI Agents", Work in Progress, Internet-Draft, draft-sahu-agent-action-receipts-00, , <https://datatracker.ietf.org/doc/html/draft-sahu-agent-action-receipts-00>.
- [I-D.mih-sato-agent-accountability-composition]
- Mih, S., Sato, T., Schrock, I., Bu, S., and A. Sokolov, "Agent Accountability: Composition and Conformance", Work in Progress, Internet-Draft, draft-mih-sato-agent-accountability-composition-01, , <https://datatracker.ietf.org/doc/html/draft-mih-sato-agent-accountability-composition-01>.
- [I-D.asor-wimse-agent-delegation-chain]
- Asor, R., "Verifiable Attenuated Delegation for AI Agent Chains", Work in Progress, Internet-Draft, draft-asor-wimse-agent-delegation-chain-01, , <https://datatracker.ietf.org/doc/html/draft-asor-wimse-agent-delegation-chain-01>.
- [I-D.pinto-agent-authz-contestability]
- Pinto, T., "Contestability Bindings for Authorized Agent Actions", Work in Progress, Internet-Draft, draft-pinto-agent-authz-contestability-00, , <https://datatracker.ietf.org/doc/html/draft-pinto-agent-authz-contestability-00>.
- [RFC8725]
- Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best Current Practices", BCP 225, RFC 8725, DOI 10.17487/RFC8725, , <https://www.rfc-editor.org/info/rfc8725>.
- [RFC7942]
- Sheffer, Y. and A. Farrel, "Improving Awareness of Running Code: The Implementation Status Section", BCP 205, RFC 7942, DOI 10.17487/RFC7942, , <https://www.rfc-editor.org/info/rfc7942>.
- [DID-CORE]
- W3C, "Decentralized Identifiers (DIDs) v1.0", W3C Recommendation, , <https://www.w3.org/TR/2022/REC-did-core-20220719/>.
- [DID-WEB]
- W3C Credentials Community Group, "did:web Method Specification", , <https://w3c-ccg.github.io/did-method-web/>.
- [CAIP-2]
- Chain Agnostic Standards Alliance, "CAIP-2: Blockchain ID Specification", Status: Final, , <https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md>.
- [ASOKAN98THESIS]
- Asokan, N., "Fairness in Electronic Commerce", 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, , <https://uwspace.uwaterloo.ca/>.
- [BELENKIY08]
- Belenkiy, M., Chase, M., Erway, C.C., Jannotti, J., Kupcu, A., and A. Lysyanskaya, "Incentivizing Outsourced Computation", Proceedings of the 3rd International Workshop on Economics of Networked Systems (NetEcon '08), pp. 85-90, , <https://doi.org/10.1145/1403027.1403046>.
- [POLINSKY99]
- Polinsky, A.M. and S. Shavell, "Public Enforcement of Law", Encyclopedia of Law and Economics, entry 8000, Edward Elgar. The result is attributed therein to Bentham (1789), .
- [MAMAGEISHVILI23]
- Mamageishvili, A. and E.W. Felten, "Incentive Schemes for Rollup Validators", arXiv:2308.02880, , <https://arxiv.org/abs/2308.02880>.
- [X402COMPLIANCE]
- x402 Foundation, "Compliance fields: an extension for x402", Pull request 2853, specs/extensions/compliance_fields.md, , <https://github.com/x402-foundation/x402/pull/2853>.
- [I-D.laxsharma-pact-00]
- Sharma, L., "PACT: A Contract Layer for Autonomous Agent Commerce", Internet-Draft, draft-laxsharma-pact-00, , <https://datatracker.ietf.org/doc/draft-laxsharma-pact/>.
Acknowledgements
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 Section 7 corrects, and he engaged with the critique on a2aproject/A2A discussion 1576.¶