Method
The rule is a type, and the type is tested.
§1 The rule
Every figure on this site is a Staged<T>. There is no arm that carries a value without its stage, and the FINAL arm cannot be constructed without the Ethereum assertion that ratified it — not a boolean, not a string somebody typed, the reference itself.
type Staged<T> =
| { stage: "CONFIRMED"; value: T; at: L2Block }
| { stage: "BATCHED"; value: T; at: L2Block; batch: Batch }
| { stage: "FINAL"; value: T; at: L2Block; batch: Batch;
assertion: Assertion }
| { stage: "UNREADABLE"; why: string; tried: string }Deliberately absent: markFinal(), stage = "FINAL", assumeFinal, orElse. Those are the doors an unsettled figure walks through wearing the same font as a settled one.
§2 And it is proved, not asserted
scripts/check-stage.mjs writes each cheat out as real TypeScript, runs the compiler over it, and fails the build if the compiler accepts any of them.
The last case is the important one. A checker that only proves failures passes for the wrong reason the moment something unrelated breaks — a typo in an import path makes every probe “correctly rejected” while testing nothing at all. In a sibling project that is exactly what happened: four cheats were being rejected by a compiler flag, not by the rule, and only the case that had to succeed could tell the difference.
No probe carries @ts-expect-error or an as cast either. Both suppress the error the case exists to provoke, so the file compiles and the probe reports the rule broken while it is working perfectly.
§3 Three things that look alike
0
A reading of zero
We read it, and the answer was nothing. A fact about the world.
——
A failed reading
We asked and could not see. A fact about us, and the call that failed is printed beside it.
words
Nothing to read yet
There is no assertion, no batch, no round. Not a failure — an absence, and it says so in a sentence.
§4 What this is not
It is not a warning about Robinhood Chain
A challenge window is what makes an optimistic rollup safe. Six days is the cost of being able to prove fraud. The fault is not that the window exists — it is that sites built on the chain describe settlement as immediate.
It is not an audit
Nothing here inspects a contract for defects. It reads four public values from Ethereum and prints them beside the claims they contradict.
It is not complete
The per-assertion state — which batch covers which L2 block, and which assertions are confirmed — is not read yet. The rollup's ABI for that differs from the one this reader knows, and rather than guess, the site says so here.
It is not a price or a product
There is nothing to buy on this site and no transaction for anybody to sign.
nothing here is called final without the assertion that ratified it. Take every reading yourself on the reader page, where each call is printed in full against a public Ethereum endpoint.