intrepidshape/elm-web3 3.0.0 · elm-web3-ui 3.0.0
What is actually proved
Most libraries tell you they are correct. This one shows you the machine output. Every claim below is graded by what a checker actually did — not by what a document says — and CI re-runs every checker on every change.
Four checkers, one honest ledger
A claim earns its grade from the strongest machine that has actually verified it. A Lean proof that does not compile is not a proof; a TLA+ property absent from the model-checker's config was never checked; a test that never ran is a comment. The grades, strongest first:
The fourth checker is the gallery: every state machine rendered, clicked, and redeployed on each release. Formal tools verify what a claim says; a pixel verifies what a user gets — the stack needs both, so we run both.
The coverage, counted
Every invariant in the ledger, bucketed by the strongest verification it has actually received. No bucket borrows from a stronger one — an open obligation stays in its own row until the checker closes it.
WalletSpec.tla was rewritten against the 2.0.0 wallet: the
five new rows are the request-id properties that machine did not have
before. The chart moves only when a checker's exit code does.
The state machines, drawn from the specs
Four state machines run every dapp built on this stack. Each diagram below
is drawn from its TLA+ specification, and every labelled invariant is one
that TLC verified over the full reachable state space of the model. The
same guards exist in the Elm code — the conformance audit maps every
update branch to its spec action, one to one.
Wallet WalletSpec.tla · Web3.Wallet
Connecting id
carries the request id that makes the last three properties statable:
clicking Connect again supersedes the attempt in flight instead of being
swallowed, and the superseded attempt can no longer clobber the new one.
Transaction TransactionSpec.tla · Web3.Transaction
Sign SignSpec.tla · Web3.Sign
UnguardedSpec and TLC shows that last property breaking —
the id guard is load-bearing, not decorative.
ApprovalFlow ApprovalSpec.tla · Web3.Ui.ApprovalFlow
ApprovalFlowTest. Failure edges to Blocked omitted for
legibility — every in-flight state has one.
How the grades stay true
Every row in the
coverage ledger
is backed by a command you can run yourself — lean on the
proof files, check-tla.sh on the specs, elm-test
on the properties — and CI re-runs all of them on every pull request, so
a claim cannot outlive the thing it claims.
The rules are strict by design: a proof that doesn't compile counts for nothing; a spec property absent from the model-checker's config was never checked; and when a checker and a claim disagree, the claim changes — graded down the same hour, promoted back only when the checker says so. The gallery is the fourth checker: every state machine rendered and clickable, because a pixel is the one reviewer that never extends good faith.