ERC-8471: AI Dispute Resolution Framework (ADRF)

This is ERC-8471 (Draft; ethereum/ERCs#2123), a proposal for the step that the standards around AI systems, resources and services have been leaving to “the parties’ contract”: what happens when someone objects to a record. Participants may be people, organizations, agents or contracts; what a dispute is about (which model, service, output, dataset, evaluation or promise) and how it is resolved (verifier, evidence, human or AI-assisted judgment) are kept apart, and nothing requires that AI be judged by AI or that a party be an agent.

The claim is the object. A dispute is a specific claim about a specific object: an identified record, delivery, settlement, declaration or action does or does not conform to an obligation that was declared before the event. Admission is an algorithmic check of five criteria against what the bound business contract attests — identifiable object and event, accountable respondent, norm declared before the event, a bound method for every sub-question, open window — plus standing, authorized effects, a clock check (the business window must hold the whole procedure plus an enactment margin) and exclusivity (one active binding case per source, obligation and proposition). “Agent A is unreliable” cannot be filed; “delivery S of task T does not meet the criteria pinned at tender time” can.

Roles kept apart. Every case records the object under dispute, the actor that performed the conduct (an agent, a model service process, a human operator, a tool, a contract), the obligor (the party alleged to bear the obligation), the judgment participants and the executors — one participant may hold several roles, the records keep them apart. Identities, qualifications and organizational relations (trustless-agent identities, know-your-agent assertions, agent identity facets, swarm charters) are optional references, never prerequisites; a plain enterprise account and a model API service under ordinary terms can dispute a double charge, and the version the terms committed, the version the provider declared and the version actually used are three different things, the third being a fact for evidence rather than a filing prerequisite.

Four objects, two registries, no funds. A Dispute Policy (content-addressed, versioned through families) binds each (obligation kind, question type) pair to a method contract and declares the effect vocabulary and the procedure track. A Dispute Binding is the obligation source’s own statement of which policy it accepts for its objects, which effects a ruling may authorize (only what it can enact), who may enact and who else has standing — the only source of a ruling’s authority. A Case holds the eight elements a dispute must state, a dependency table of typed sub-questions, the findings with their support kinds, the round decisions and four dimensions read separately (procedure state, substantive result, reason, enactment status per effect). A Ruling is Sustained, NotSustained or NoDecision, with provenance, the one substantive effect it authorizes or the pre-committed disposition it points to, and how the procedure closed. The registries never move funds or execute; executors named by the binding read, check their own authority, enact and report.

Three question types, three method interfaces. FORMAL questions go to a deterministic verifier over inputs pinned at filing (support kind computed). EVIDENCED questions go to an evidence rule (support as the rule declares). JUDGED questions go to a judgment method; the reference profile files one binary question per sub-question as a CONSUMER_FILED issue with an ERC-8436 registry and imports only the Final result, with its issue, policy, source round, round count and adoption flag. Support kinds are a set, not a hierarchy: a finding records what its method supports, a derived conclusion inherits a list of sources, never their proof.

Not deciding has a meaning. NoDecision is distinct from NotSustained; the policy says per claim kind whether an undetermined decisive finding falls on the claimant or ends in no decision; NoDecision routes to the disposition the business committed in advance, never to a consumer’s improvisation. Every window has a consequence and a hard deadline closes every case; under the optional optimistic track, silence adopts a pre-accepted result and proves nothing.

Economics declared, not designed. The kernel fixes what an economic declaration must state (instruments, purposes, flows under every state and result, assumptions, failure handling) and records what executors report; it endorses no loser-pays, bond or reward scheme, and being in the minority of a panel is not a violation.

What is in the reference repository. Two registries (the dispute registry exposes the whole interface at one address and runs six modules by delegatecall on its own storage, so that every deployable unit stays within the per-transaction gas cap of Sepolia’s current schedule), the ERC-8436 bridge, two formal verifiers (duplicate settlement, declared version), an attestor-quorum evidence rule and a model-API-service escrow between plain accounts that is both obligation source and executor; JSON schemas for the policy, binding, case, finding, ruling and enactment documents; vectors cross-checked between ethers and solc; a 70-test Foundry suite that runs the two complete flows (a double charge verified on chain; a delivery-quality dispute judged by an ERC-8436 roster, including a NoDecision and a finality-by-adoption import) and the exception paths (no authority → Advisory, timeouts adopting an earlier decision, Advisory with no disposal, duplicate enactment refused, exclusivity, clock incompatibility); an evidence script rehearsed end to end on Anvil, to be run on Sepolia against the live ERC-8436 registry.

What is deliberately out of the first draft (reserved, named in the text): panel replacement on review, non-binary outcomes, verifiable selection and independence screening, economic modules, private evidence, cross-chain carriage, mirrors into validation or reputation registries.

Questions I would most value feedback on:

  1. The five admission criteria as the boundary of what can be filed as Binding — is anything missing that a consumer would need checked before a ruling can bind it?
  2. Support kinds as an unordered set with per-finding provenance — does anyone see a case where a consumer genuinely needs a kernel-level ordering?
  3. The exclusivity key (source, obligationRef, proposition) within one registry — is per-registry exclusivity the right honest scope, or should the text push consumers harder towards one registry per obligation?
  4. The J-profile’s one-binary-question rule — whether a typed multi-option profile should be specified now or left reserved.

Repository: GitHub - garyyang-finchip/ai-dispute-resolution: AI Dispute Resolution Framework (ADRF) · GitHub · PR: Add ERC: AI Dispute Resolution Framework (ADRF) by garyyang-finchip · Pull Request #2123 · ethereum/ERCs · GitHub

Revision 3 — ERC-8471 assigned; the reference registry made deployable under Sepolia’s gas cap.

The proposal has its number: ERC-8471 (ethereum/ERCs#2123, files renamed from the placeholder). Revision 3 changes the reference implementation only; the specification text, every interface, every identifier and the vectors are unchanged.

What changed and why. Sepolia’s current gas schedule caps a transaction at 16,777,216 gas and prices deployment at roughly 1,500 gas per byte of code, so nothing above about 10.5 KB of runtime code can be deployed there. The revision-2 dispute registry was 14.4 KB with two externally linked libraries of 12.0 and 13.2 KB — none of the three would have deployed. Revision 3 keeps the whole of IADRFDisputeRegistry at one address: a 2 KB registry holds the record in its own storage and runs each function of the interface in one of six modules by delegatecall (bindings; filing and admission; resolution and reviews; decisions and finality; the case reads and the informative entries; the reads of findings, rounds and rulings), each between 3.9 and 8.5 KB. The modules share the registry’s storage layout, are fixed at construction, refuse to run on their own storage, and must have been built for the same policy registry; every entry is logged under the registry’s address and a module’s revert reaches the caller unchanged. supportsInterface and the interface identifier are as before.

The suite is now 70 tests (six new ones for the module mechanics: routing of every interface function, direct-call refusal, foreign-module refusal, unknown selectors, no ether, logs under the registry), and the seven-phase evidence script was rehearsed again on Anvil end to end. The Sepolia run follows; its record will be posted here.

Repository: GitHub - garyyang-finchip/ai-dispute-resolution: AI Dispute Resolution Framework (ADRF) · GitHub · PR: Add ERC: AI Dispute Resolution Framework (ADRF) by garyyang-finchip · Pull Request #2123 · ethereum/ERCs · GitHub

Sepolia evidence — both flows executed against the live ERC-8436 registry.

The reference implementation of ERC-8471 (revision 3) now has its evidence run on Sepolia: 46 transactions on 2026-10-29, blocks 12017706 to 12017916, all successful, 131.3 million gas under Sepolia’s current schedule, 0.0077 ETH in fees. Dispute registry 0x4e27C4728B22c3306f2378b8B421774dc35fE0a9 (one address for the whole IADRFDisputeRegistry, over six modules of at most 8.5 KB; the three largest creations landed at 80% of the 16,777,216-gas cap, as estimated), policy registry 0x071093a38289b5f9578D0162727b05A52E07eed5, bridge 0xeC31cb06CEFCd871Bc36cD5267bC3fe9A21c60EB over the ERC-8436 revision-3 registry 0x3bE57E74f2E7c280073b6B16A1Db3F562758dB01.

Two complete flows, each with a plain-account client and a model API service under ordinary terms, no agent identity anywhere:

  • A double charge (call 1 settled twice): filed, admitted under the five criteria, verified on chain by the duplicate-settlement verifier (TRUE, support computed), decided Sustained, finalized after the review window, refund enacted by the escrow and reported Enacted — case 0x1bc24c2e….
  • A delivery-quality claim (call 2): filed, admitted, one JUDGED sub-question opened as a CONSUMER_FILED issue with the live ERC-8436 registry under a 2-of-3 fast-track policy; two jurors blocked, the round settled, the appeal window lapsed, the Final result (Decided, no) was imported as the finding FALSE with support judged and full provenance (registry, issue, policy, source round 1 of 1), the claim decided Sustained through its own direction, finalized, refund enacted — case 0xee91e703…, issue 0xbe51f9c5….

Every entry was logged under the registry’s address (the modules never appear as emitters), and every read of the record comes back through the same address. The record — addresses, identifiers, every transaction with block, gas and status, the state read back from the chain, the gas schedule observed — is docs/sepolia-evidence.md in the repository, with deployments/sepolia.json, deployments/sepolia.transactions.json and a read-back script anyone can run against a Sepolia RPC. Sourcify verification of the thirteen contracts was submitted from the standard JSON input.

Repository: GitHub - garyyang-finchip/ai-dispute-resolution: AI Dispute Resolution Framework (ADRF) · GitHub · PR: Add ERC: AI Dispute Resolution Framework (ADRF) by garyyang-finchip · Pull Request #2123 · ethereum/ERCs · GitHub

Nice to see the escrow ship as both obligation source and executor, it makes the clock check concrete.

The escrow attests an adoption deadline but doesn’t hold the money to it. settle moves the charge straight into balanceOf[provider] and withdrawBalance has no hold, so a provider that charges twice can withdraw both charges right away. The duplicate settlement case still ends Final and Sustained, since admission only checked the clock, and enact then finds the provider balance short and reports Failed. The clock check covers time, not funds, and the worked example is where readers will see what “commits only effects it can enact” means. Keeping each settlement in a pending balance until lastSettledAt + disputePeriod would line up the attested deadline with the refundable amount, and a line in the source rules saying an attested adoption deadline means keeping the disputed value enactable until then would carry it to other sources.

On your exclusivity question, scope per registry seems fine to me, the unit is what bites. propositionFor(ledger, callId) gives one proposition per call, and file refuses the key for good once its case is Final or Expired. The refund is one charge, so a call settled three times gets one back, and a charge made after the ruling can’t be filed at all (Duplicate). A LIMIT obligation can be breached again after a ruling, so putting the settlement ordinal in the proposition (or in eventRef and the key), or having the verifier return the count so the executor refunds count minus one charges, would give one case per breach instead of one per call.