Outcome-Verified Settlement (OVS) — pay for outcome, not tokens
Metered billing answers “did the clock tick?” The buyer’s real question is “did I get what I paid for?” OVS makes that question the settlement condition — one verification gate per metered unit, every verdict re-derivable from the trace.
A failure can hide at three depths: the reply never arrives, the reply arrives damaged, or the reply arrives intact, honestly checksummed — and still isn’t what you bought. Each level is cumulative: it runs every check of the level below it, plus one more. Watch the parcels (top track, seller→buyer) and the dollars (bottom track, buyer→seller): a dollar should only fly when a check passed.
running example — one concrete contract
A buyer agent pays a seller agent $1 per GPU-hour price quote. Committed at stream-open:
criterion = json_schema{name, price, currency} + reference_match(request_id) — the reply must parse with those fields and echo this unit’s request id (so a stale replay can’t settle). The seller always declares a sha256 of whatever it sends; which levels actually verify anything is the whole story below.
speed
Pick a level (L0–L3), then run. Rate: $1 per verified quote.
🏪
sellerearned $0
Deliveries from Seller to BuyerPayments from Buyer to Seller
🧑💻
buyerpaid $0
Paid
$0
Verified value
$0
The space between the two bars is money paid for nothing — the gap this level’s checks cannot see.
Same 6 units, four disciplines — fill this in by running each level
Level
Question it asks
Paid
Verified value
Gap
L0 clock
Did time pass?
—
—
—
L1 ack
Did anything arrive?
—
—
—
L2 checksum
Did it arrive unbroken?
—
—
—
L3 evaluator
Is it what I ordered?
—
—
—
Trace ledger — checks appear only at levels that run them
stream-open:buyer-0:seller-0:rate=1:max_total=20:criterion=json_schema+reference_match
— pick a level and run the stream to print the settlement trace —