Fills & deadlines

devnet preview — all data is replay

A fill is one unit of delivered work, and it lives on a clock made of block heights — derived from the book's SLA tier, never from anyone's wall clock. Before liability starts, a miss refunds. After it, a miss slashes.

The timeline

1 · authorizedthe fill exists — every deadline below derives from this height or from liability start
2 · activation deadlinethe payload must go live by here: provider ack (soft) or a validator data-availability certificate (hard). Missed → the fill never activates; refund or rematch, no slash — liability never started
3 · liability startsthe height the provider becomes accountable: their ack under soft activation, the DA certificate under hard
4 · ack deadline (hard only)after DA activation the provider must ack, validly reject, or complete by here — silence past it is slashable
5 · completion deadlinethe work must be done. This is the one deadline a deadline-miss challenge can cite — miss it and the slash path opens
6 · receipt deadlinevalid settlement evidence must land by here — no evidence, no payment, and the fill is exposed to fault close
7 · challenge windowopens when evidence lands: anyone may challenge it until here. The provider's payment is held back until every challenge resolves
8 · acceptance window (user-accept only)the user must sign acceptance by here — or the fill refunds, the provider goes unpaid, and nobody's reputation moves

The challenge and acceptance windows both open when evidence lands, and run in parallel. All of these heights are visible on every fill via the read API — the deadlines are data, not promises.

SLA tiers are the only clock

Each book names an SLA tier, and the tier is a list of block-count windows — activation, ack, completion, receipt, challenge, acceptance. Those numbers are the only input to every deadline above. A first-token-latency target exists in the tier as a reputation signal, but it is never slashable: no slash on this protocol can derive from a relay's, provider's, or client's clock.

How a payload activates

SOFT_PROVIDER_ACKpayload travels off-chain; the provider is liable only after signing an ack. No ack → refund and reputation damage, but no slash — liability never began
HARD_DA_ACTIVATEDthe encrypted payload goes to validator data availability; a quorum certificate activates it on-chain. From that height the provider is liable — silence becomes slashable

A provider can reject an activated payload only with a signed reason from a fixed set (decryption failed, commitment mismatch, token limit, malformed, unsupported parameters, policy violation) — and a fraudulent rejection is itself challengeable.

How delivery settles

USER_ACCEPT_ONLYoutput goes to the user off-chain; only the user's signature settles it. Refusing costs the provider the sale, not their bond
DELEGATED_ACCEPTANCEa user-authorized delegate signs acceptance — scoped by model, provider, amount, and expiry. The recommended path for API traffic
PUBLIC_OUTPUT_DAthe provider posts plaintext output to validator data availability — objective proof, no acceptance step, and the only mode where missing delivery is directly challengeable
OPTIMISTIC_NO_ACCEPTANCEsettles with no acceptance at all — explicitly the weakest mode, bounded only by the challenge window and the provider's bond

The refusal path is honest by design: under user-accept, a fill with valid evidence and no acceptance ends refunded — escrow back to the buyer, provider unpaid, bond released, no reputation change on either side, no relay fee. Buyer refusal is a priced risk, not a punished fault.

Fill statuses

AUTHORIZED → ACTIVATED → SETTLED | REFUNDED_UNACCEPTED | SLASHED — the last three are terminal. The replay trace on The protocol shows one fill reaching SETTLED and its sibling reaching SLASHED, with the money consequences of each.