RECOURSE
A promise that costs something to break.
Agents can spend money in milliseconds. Nothing in the stack lets them get it back.
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.
Settlement in milliseconds. Governance moved under the Linux Foundation, with Visa, Mastercard, American Express, Stripe and Google among its members.
Agent tokens and delegated credentials. Mastercard's preserve dispute rights. OpenAI's preserve dispute rights.
One rail across chains and providers. Sixty nine thousand active agents and one hundred and sixty five million x402 transactions reported by April 2026.
No chargeback path. No dispute window. No pull back.
The companies that spent fifty years building the modern chargeback now sit on the board of a payment rail that has none.
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.
{"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.
{"pair": "ETH-USD","results": [],"count": 0} Well formed, carrying nothing. An empty result set returned as success.
{"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
No judgment in the paid path
Five steps, no human in the loop
Read only - escrow and dispute contracts
Every payment, every case, public
studionet, frozen at ccc470a
studionet, frozen at ccc470a
studio-next, deployed from 44111a3
studio-next, deployed from 44111a3
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.
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.
18 committed cases
Three strings in, one verdict out. Command or control and enter submits
No case submitted
Load a committed case or write your own, then submit it for judgment.
Did this response honor that promise, for this request?
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.
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.
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.
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.
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.
Three limits, each with its reason
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.
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.
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.