RecourseA compiler for delivery promises
Live run · local anvil · block 31

Payment becomes final only if nobody can prove the delivery broke its promise.

An agent buys a data feed. The file is new, signed and correctly shaped, and every check an agent runs today passes. The records inside it are yesterday’s. Recourse settles that difference with one cryptographic counterexample, and no arbiter.

Order value0.01 USDC
Records delivered500
Records in breach251
Proofs required1
Today’s normal

Every check passes. The money is gone.

This is an unprotected purchase, settled directly to the seller. The buyer’s agent verifies the row count, the schema, and an independent timestamp over the delivered file.

Acceptance checksAll passed
row count500 records, expected 500
schema shapeevery record parses and carries pair, seq, priceE8
file hash matches timestamp0xf86dba436b4be560...
signed blob timestamp authenticsigned by 0x9965…A4dc
blob timestamp inside windowfile existed 0s ago, window is 60s
Settled to seller
0.01 USDC
Transaction
0x2e4b716c…7cc6ba
Timestamp countersigned by
0x996550…B0A4dc

Final and irreversible. The timestamp is authentic and the signer had nothing to gain.

Per-record generation timenobody checked this
#022 Aug 2026, 22:3720s
#18622 Aug 2026, 22:3720s
#18721 Aug 2026, 20:3726 hours
#18821 Aug 2026, 20:3726 hours
#49921 Aug 2026, 20:3726 hours
251 of 500 records predate the 1 min window

The first 187 records are current, so the head of the file looks clean. Oldest record is 26 hours old. Blob existence time is not record generation time, and that gap is the whole attack.

So the buyer states a requirement

every record generated within the last 60 seconds

subject RECORDproperty GENERATION_TIMEthreshold 60sclock AGREEMENT TIME
The compiler

A promise either compiles to something checkable, or it does not.

Two pieces of text go in. Three compilations run in sequence. A failure is a typed error against an exact span of the source it is about.

seller promise

Real-time and historical cryptocurrency market data via CoinGecko: prices, market-cap rankings, charts, OHLC candles, token lookup, exchanges, categories, trending searches, and news.

buyer requirement

every record generated within the last 60 seconds

1the seller's promise, on its own

seller promiseReal-time and historical cryptocurrency market data via CoinGecko: prices, market-cap rankings, charts, OHLC candles, token lookup, exchanges, categories, trending searches, and news.

NO_EXECUTABLE_PROPOSITION / missing THRESHOLDseller promise[0..9] "Real-time"

found the phrase names freshness but carries no comparable value, so it compiles to no executable proposition, required a value the requirement states, which a predicate can compare

Failed
2the buyer's requirement, against the evidence this endpoint offers

buyer requirementevery record generated within the last 60 seconds

compiles to RECORD · GENERATION_TIME · TIMESTAMP_GTE 1787438194

SUBJECT_MISMATCHrequirement[0..12] "every record"

found x402-receipt is about the transaction, required a fact about each record

SUBJECT_COLLAPSErequirement[0..12] "every record"

found coingecko-markets-last_updated is per response in fact (4 calls, 400 records, 2026-08-22T01:03:30Z to 01:51:22Z, identical 100-coin basket), required per record

PROPERTY_REFUTEDrequirement[13..22] "generated"

found coingecko-tickers-is_stale asserted is_stale = false, and last_traded_at 2026-08-21T23:59:48+00:00 against last_fetch_at 2026-08-22T01:34:40+00:00, 5692 seconds, required a measurement, not a verdict

ISSUER_UNSIGNEDpolicy.permittedIssuer

found coingecko-tickers-last_traded_at is unsigned, required a signature from 0x90F79bf6EB2c4f870365E785982E1f101E93b906

Failed
3the same requirement, against a bound delivery commitment

buyer requirementevery record generated within the last 60 seconds

compiles to RECORD · GENERATION_TIME · TIMESTAMP_GTE 1787438194

Guarantee compiled
breach witness spec

A record whose generatedAt is TIMESTAMP_LT 1787438194.

falsifier
TIMESTAMP_LT negation of TIMESTAMP_GTE
threshold
1787438194 requirement[39..41] “60”, a 60s window
required binding
PREIMAGE
permitted issuer
0x90F79bf6EB2c4f870365E785982E1f101E93b906
witnessId0x18687631e32b9d6dc02e3d7b378edec7fc231697c1f3b2ac71ea0a290a2c5a36

Stated before any money moves.

Purchasing policy

The buyer decides. Deterministically.

maxPrice
$0.012 per call
requiredClaim
every record generated within the last 60 seconds
protectionMandatory
true
selectionRule
Among offers satisfying every mandatory requirement and the price bound, choose the lowest priced offer. If none satisfy the policy, purchase nothing.
AIsa/apis/v1/coingecko/coins/markets
$0.008
Policy not satisfied

Real-time and historical cryptocurrency market data via CoinGecko: prices, market-cap rankings, charts, OHLC candles, token lookup, exchanges, categories, trending searches, and news.

price within bound

$0.008 against a maximum of $0.012

the required claim is establishable

no artifact offered for this endpoint reaches the fourth gate for "every record generated within the last 60 seconds"

protection is mandatory and satisfied

the policy requires enforceable protection for this claim

The requirement asked for "every record generated within the last 60 seconds". The evidence available at this endpoint cannot establish that claim. Policy result: do not purchase.
Recourse-compatible feed provider/apis/v1/coingecko/coins/markets
$0.010
Selected by the policy

The same feed, delivered under a signed Protection Manifest naming the upstream issuer whose per-record commitments the escrow will accept.

price within bound

$0.010 against a maximum of $0.012

the required claim is establishable

one artifact reaches ENFORCEABLE and settles by counterexample

protection is mandatory and satisfied

the policy requires enforceable protection and it is available

signed protection manifest, served at /api/manifest
claim
every record generated within the last 60 seconds
subject
RECORD
property
GENERATION_TIME
thresholdSeconds
60
expectedSourceId
COINBASE_ETH_USD_FEED
priceMicrosUsd
10000
seller signed0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
permittedIssuer named inside0x90F79bf6EB2c4f870365E785982E1f101E93b906

Two different keys. The seller signs what is promised. The issuer signs what was observed, and only the issuer's signature is what the escrow checks at settlement.

0x4f1f66d1287d083e7970f3d9c75ad5553c22194088719639f81b1689877bff523bb1512723dc4df511d1dab2f19ead318b7fe6a33e85aa30683a86ccbb516a651c
Policy result: eligible. Lowest priced offer satisfying the policy.
policy resultPURCHASE

1 of 2 offers satisfy the policy. The lowest priced of those is $0.010.

The escrow funds $0.010, which is 10000 base units of a six decimal asset, and that is the advertised price of the selected offer.

Protection manifest

One path is enforceable. This is what gets signed.

every record generated within the last 60 seconds

claim type
RECORD_GENERATION_TIME
quantifier
UNIVERSAL
opcode
TIMESTAMP_GTE
settles by
counterexample
threshold
60
requirement[39..41] “60
permitted issuer
0x90F79bf6EB2c4f870365E785982E1f101E93b906
policy.permittedIssuer
semantic source
COINBASE_ETH_USD_FEED
policy.expectedSourceId
required evidence
GENERATION_TIME
binding PREIMAGE, signed by 0x90F79bf6EB2c4f870365E785982E1f101E93b906
the commitment binds
specHash conditionId merkleRoot leafCount sourceId payloadRef
REFUSED

high quality investment research

No protected payment opens. The dimensions it is missing are named. No value is proposed for any of them.

  • missing SUBJECTno phrase in the requirement names a record, a response or a transaction
  • missing PROPERTYno phrase in the requirement names an observable property
  • missing THRESHOLDno comparable value appears in the requirement
the complete vocabulary, which never grows to fit a term
{UINT_GTEUINT_EQTIMESTAMP_GTEBYTES32_EQ}
Evidence screening

The contract refuses the same evidence, before any money moves.

The x-ray is an analysis. This is the escrow. The seller offered a signed timestamp over the delivered file, and openPurchase reverted.

Condition 1 · offer rejectedClaimTypeMismatch

It verifies. It is simply not evidence of the thing that was promised.

Escrow balance after the rejection: 0.00 USDC. Nothing was taken.

Compare what was offered against what was required

Evidence offered establishes

blob existence time

When the delivered file existed. A seller can put yesterday’s records into a new file this morning and have it timestamped honestly.

Condition requires

record generation time

A signed timestamp over the delivered file establishes when the file existed. It says nothing about when the records inside it were generated.

Settlement

Pay into protection. One counterexample reverses it.

The buyer’s verifier scanned all 500 records locally and found 251 in breach (50%). It submits exactly one, at index 187, with a 9-hash Merkle path.

Challenge window
30s
Delivery deadline
22 Aug 2026, 22:47
Escrow
0xdc64a1…0cf6c9
On-chain verificationCaptured verified run
1
Leaf reconstructed
index, keccak256(recordBytes), generatedAt and sourceId, from the proof's own inputs
2
Inclusion verified
9 sibling hashes checked against the root inside the stored signed commitment
3
Index within committed count
index 187 sits inside the signed leafCount of 500
4
Commitment binding checked
the commitment names this purchase and this obligation
5
Issuer recovered
recovered signer equals the permitted issuer 0x90F79bf6EB2c4f870365E785982E1f101E93b906
6
Source matched
the leaf's sourceId equals the condition's expected source
7
Claim type accepted
record generation time is a property bound leaves can establish
8
Predicate violated
generation time is 93540 seconds short of the threshold
Verdict · BREACH PROVEDCaptured verified run
0.01USDC

Refunded in full to the buyer. One record broke an objective promise, so the payment never became final.

Offending record
index 187
Settled in block
17
Escrow balance
0.00 USDC
Transaction
0x759e5e0761df769a5acc…7d7beefbec4b
witnessId, compiled before payment0x18687631e32b9d6dc02e3d7b378edec7fc231697c1f3b2ac71ea0a290a2c5a36
witnessId, recomputed from what the escrow recorded0x18687631e32b9d6dc02e3d7b378edec7fc231697c1f3b2ac71ea0a290a2c5a36
Identical
the proof at index 187, field by field against that spec
conditionIdfrom the escrow record

spec 1executed 1

claimTypefrom the escrow record

spec RECORD_GENERATION_TIMEexecuted RECORD_GENERATION_TIME

quantifierfrom the escrow record

spec UNIVERSALexecuted UNIVERSAL

threshold.absolutefrom the escrow record

spec 1787438194executed 1787438194

expectedSourceIdfrom the escrow record

spec 0xc53fef9f35628ff5bf2cd4cc96a259445f5e327e5cb0d4c121b014281aa142b7executed 0xc53fef9f35628ff5bf2cd4cc96a259445f5e327e5cb0d4c121b014281aa142b7

permittedIssuerfrom the escrow record

spec 0x90F79bf6EB2c4f870365E785982E1f101E93b906executed 0x90F79bf6EB2c4f870365E785982E1f101E93b906

falsifier TIMESTAMP_LTfrom the escrow record

spec generatedAt TIMESTAMP_LT 1787438194executed 1787344654 < 1787438194

requiredBinding PREIMAGEfixture on both sides

spec generatedAt bound to keccak256(recordBytes) in one preimageexecuted keccak256(abi.encode(index, keccak256(recordBytes), generatedAt, sourceId))

the record the chain namedfrom the escrow record

spec the submitted index is the index the escrow emittedexecuted submitted 187, BreachProved emitted 187

requiredBinding and requiredArtifactId name the artifact class the commitment is, which the chain does not carry as a string. Both sides read the fixture for those. Every other field above is recomputed from what the escrow recorded, and the binding itself is checked against the leaf formula the issuer signed.

BREACH_PROVED · 0x759e5e0761df769a5acc1924890a86bab17e19516727a4c518e07d7beefbec4b

Also verified this run

The other two ways this ends.

Release0.01 USDC to the seller

A compliant delivery: 0 violations across 500 records, and the scalar row count evaluated at 500 against a threshold of 500. Releasing early reverts with ChallengeWindowOpen.

0x18bde1a3…273aec
Stalled0.01 USDC reclaimed

The seller took the order and never delivered: 0 of 2 conditions committed at the deadline. Non-delivery is the trivial breach. Reclaiming early reverts with DeliveryDeadlineNotReached.

0xf2a7ddf2…b8b73c
pricemachine-readable
paymentmachine-verifiable
the promisenot yet
record freshness
data feeds
schema and count
datasets, APIs
deterministic tests
generated code
latency receipts
inference, compute
provenance
training data

One bad record. One proof. No arbiter.