Recourse
Honored
Read from eval/cases.json
000
Promise linter

RECOURSE

A promise that costs something to break.

Agents can spend money in milliseconds. Nothing in the stack lets them get it back.

Nothing you paste here is stored. It is sent to the judge once and discarded.

Adjudicated on GenLayer - payments - - disputes - - not honored - - median, pay to dispute Reading studio-next - Escrow - Dispute
02
The gap

Three layers shipped. The fourth was never built.

x402 settles machine payments in milliseconds and finally. Once settlement confirms there is no chargeback path, no dispute window and no pull back. That is by design: a push payment with no reversal is precisely what lets machines transact without accounts or credit relationships.

01
Payments Linux Foundation

Settlement in milliseconds. Governance moved under the Linux Foundation, with Visa, Mastercard, American Express, Stripe and Google among its members.

Shipped
02
Identity Mastercard, OpenAI

Agent tokens and delegated credentials. Mastercard's preserve dispute rights. OpenAI's preserve dispute rights.

Shipped
03
Interoperability x402, across chains

One rail across chains and providers. Sixty nine thousand active agents and one hundred and sixty five million x402 transactions reported by April 2026.

Shipped
04
Dispute right no owner

No chargeback path. No dispute window. No pull back.

Missing

The companies that spent fifty years building the modern chargeback now sit on the board of a payment rail that has none.

03
The failures

Three ways an endpoint takes the money and returns nothing

These are the only failures Recourse exists for. Each returns HTTP 200, settles payment, and passes every deterministic check that exists today.

Stale
200 OK
{"pair": "ETH-USD","price": 4182.10,"sources": 3,"ts": "2026-09-04T05:11:07Z"}

Correct shape, expired content. Nine hours old against a five second promise.

Hollow
200 OK
{"pair": "ETH-USD","results": [],"count": 0}

Well formed, carrying nothing. An empty result set returned as success.

Substituted
200 OK
{"pair": "BTC-USD","price": 118400.00,"sources": 3,"ts": "2026-09-04T14:11:12Z"}

Answers a different question than the one paid for. ETH-USD was requested.

Every deterministic check passes

04
How it works

No judgment in the paid path

Five steps, no human in the loop

01
Call

The agent pays and receives the response immediately. No judgment in this path, no latency added.

02
Hold

Funds enter escrow, not the seller balance. The settlement window runs for 300 seconds, read from contracts/FROZEN.json.

03
Contest

The agent posts a fixed bond of 1 GEN and opens a case. No human is involved.

04
Judge

Validators receive three frozen strings and answer one question independently. Nothing is read from the live internet.

05
Settle

The verdict is written, and the settlement moves when that transaction finalizes. Two transactions, deliberately, so a successful appeal cannot arrive after the money has gone. On studio-next the verdict is written and the payment and the bond stay in escrow: consensus v0.6 accepts a value transfer only at the root of a transaction's fee allocation tree, and settle's payouts sit two messages below the transaction that funds them.

Settlement window
300 s
Uncontested
auto release
Dispute to money back, median
does not move
05
Live feed

Read only - escrow and dispute contracts

Every payment, every case, public

-
Payments
-
Disputes opened
-
Not honored
-
Median pay to dispute
Reading the chain

Studio answers in one to ten seconds; the page is not waiting on anything else. If it has not answered in twenty, the recorded snapshot takes over and says so.

TimeCase / sellerAmountStatusVerdictTo dispute
Escrow, studionetIn the record

studionet, frozen at ccc470a

Dispute, studionetIn the record

studionet, frozen at ccc470a

Escrow, studio-nextReading

studio-next, deployed from 44111a3

Dispute, studio-nextReading

studio-next, deployed from 44111a3

The Clerk

Put the judge on the stand

The clerk takes the same three frozen strings a validator receives and answers the same single question. Load a committed case or write your own, and put it to the same judge, one case at a time.

One model, not the committee

This runs judge() from contracts/dispute.py, unchanged, against a single model on the linter service. On chain the same prompt runs across a validator committee that must reach agreement, and nothing here is written to a receipt. Every verdict below is indicative, and none of it is the published number.

Recorded on chainno
Case file

18 committed cases

Three strings in, one verdict out. Command or control and enter submits

Verdict No case submitted

No case submitted

Load a committed case or write your own, then submit it for judgment.

The one question a validator answers

Did this response honor that promise, for this request?

Honored Not honored Unclear

Field ordering is ignored. Extra undocumented fields do not break a promise, because the promise sets a floor and not a ceiling.

Nothing is read from the live internet. The judge sees only the three strings, frozen at the moment the case was opened.

A promise with nothing measurable in it produces unclear, rather than a standard the seller never agreed to.

Put a case to the judge from a terminal the route this panel calls
$ curl -s -X POST <this site>/api/clerk \ -H "Content-Type: application/json" \ -d '{"promise": "...", "request": "...", "response": "..."}'

The same route this panel calls: three strings in, one verdict out, from the judge the contracts run, on one model rather than a committee. The prompt it asks is committed in contracts/dispute.py and every validator runs it unchanged, so a seller can read exactly what it will be judged against before it publishes a promise.

06
Evaluation

Eighteen cases committed before the run

The number, published whatever it is

Eighteen cases with the correct verdict written down and committed before the dispute contract ran. The git history proves the order. Measured on two networks, studionet on 2026-09-05 and studio-next on 2026-09-14, three runs per case, through real consensus rather than a single model call. One column per network, never merged and never averaged.

Accuracy
studionet17/ 18
studio-next16/ 18
eval/results.json
eval/results.studio-next.json
Stability
studionet17/ 18
studio-next16/ 18
eval/results.json
eval/results.studio-next.json
Landed on unclear
studionet3/ 18
studio-next2/ 18
eval/results.json
eval/results.studio-next.json
Held out set
studionet1/ 3
studio-next2/ 3
eval/results-v2.json
eval/results-v2.studio-next.json
studionet010203040506070809101112131415161718
studio-next010203040506070809101112131415161718

Three runs per case. Green matched the committed answer, red did not. Hover a chip for what it answered and whether it was stable. Full table in eval/RESULTS.md.

Two sets, always together

The first eighteen cases are the set the question was written against, committed in b50757f one commit before the judgment contract existed. The three held out cases were committed alone in 04ca928, with the runner unable to read the file at that commit, so their answers are provably fixed before the measurement. They were chosen to probe the weakness the first set exposed rather than to raise the score, which is why the second figure is the lower one.

Both networks read case 12 as not honored where the committed expectation was unclear: three named venues were promised and three different venues were used, and the promise never settles whether the count or the names govern. Both answered it the same way three times, so it is a consistent reading rather than a wobble. It is counted as a miss on both.

The two pairs of contracts are the same logic, the same prompt and the same strings, with a published diff that touches only API names, running under two runtimes. Seventeen of eighteen cases landed on the same verdict on both networks. Case 07 did not: two validator sets read the same frozen strings and reached different verdicts, which is a finding rather than noise, and it is the extra miss on studio-next.

A dispute layer whose reliability has not been measured is a claim, not infrastructure.

07
What it is not

Three limits, each with its reason

Not sub cent yet

One adjudication is ten model calls, five nodes times two presentation orders. studionet charges nothing for them and studio-next charges a fee in testnet GEN, so the page states the work rather than a price, and the first version targets payments large enough to carry that work. Session batching is the route below it.

Not an adoption driver today

Agents fail at the payment step for want of funded wallets, not for fear of being cheated. This matters once wallets are routine and an agent must choose between two endpoints that will both take its money.

Not perfect judgment

A vague promise produces a vague verdict, and the system says so through the unclear outcome rather than performing confidence it has not earned.

A refund system in which the merchant selects the judge is a refund policy. It is not a dispute right.

08In one line

The rail is finished.The right is missing.