One light, one room
Version 2.0 gave the chain a memory and a watcher. It also, if we are honest, gave you a small furniture problem. Behind the status light there were three places to look: a badge, a verified data table, and an inspector console — each separately mounted, separately documented, each answering a different slice of "wait, can I trust this number?" We built all three on the same verifier and told you to pick.
Nobody should have to pick. When the light is anything but green, there is exactly one question in the room — what happened to my data? — and it deserves exactly one answer. So 2.1 is the release where we put the furniture away.
The light stays. Everything else becomes the room.
The status light is the whole footprint on your dashboard: a small dark pill in the header, deliberately foreign to the page it judges, readable in under a second. People love it, so 2.1 does not touch it — literally. The file is byte-identical to 2.0, and a test in the suite fails if anyone ever changes that without meaning to.
What changed is where its view receipts → link lands. It used to dead-end in raw chain.json — unstyled JSON, at the exact moment a nervous stakeholder clicked for help. Now it lands in the Signal Room: one page carrying everything the three old surfaces held, arranged around the thing people actually came to see — the data.
The room is a fixed set of regions that never reorder; only their prominence changes with the verdict:
Green earns silence. The attested table leads — with a pinned, signed control-totals row computed over the full verified set, not the visible rows. The chain collapses to a one-line strip of checkmarked stages. The inspector, the event log, and the chain of custody wait in closed drawers. A boss on a good day scrolls past nothing meant for an auditor.
Yellow leads with located caveats. Not a list of warnings — cards, each with a "show me" that lands you on the thing itself: the ghost node where a receipt never got written, the receipt signed by a key you don't trust, the column whose totals drifted.
Red leads with the break, in business numbers. Before any hashes: expected, found, and the difference — spend, clicks, rows — then the severed link in the chain, then the table dimmed to evidence. When someone disputes your numbers in a meeting, the exhibit is above the fold and the event log below it prints character-for-character what tamper-signal verify would print, so what you project is what their analyst reproduces in a terminal afterwards.
And there is a fourth state we refused to make scary. If your pipeline re-ran but the published table didn't, that is not tampering — your build is behind. The room says NOT THE ATTESTED DATA with a wrench, not a lightning bolt, shows the chain honestly green, and prints the one command that fixes it. (2.1 also lets the pipeline write the table for you — exportTable: true on Node, write_table=True on Python — so this state mostly stops existing.)
You can't ship the light without the room anymore
The part I am proudest of is not a pixel. If you use an attach helper — Flask, FastAPI, Express — one call now serves your receipts, the verifier assets, and the room page, and the light it mounts is pre-wired to link there. There is no configuration in which the light's only escalation path is raw JSON, because the same call creates both halves. That is what "strongly encouraged" should mean in software: not a lecture in the docs, but a default you would have to work to break.
The old surfaces still work. tamper-signal/table and tamper-signal/console keep their exact signatures and now open the room in the matching preset — same data, same claims, upgraded frame. Your host app's chrome stays yours: if you want a "Data" tab in your own nav, you render the tab and put the room inside it.
Same honesty, one grammar
Unifying three surfaces mostly meant deleting three slightly different ways of saying the same thing. There is now one vocabulary — the light's — spoken by the pill, the room's verdict strip, the event log, and the CLI. One verification pass feeds a light and a room on the same page (they can no longer disagree, and your browser does the crypto once). Deep links into the room are hints, not claims: a link that says "show the break" on a chain that verifies green is silently ignored, because a URL must never carry a verdict. And the chain of custody stays where 2.0 put it — an additive layer that never moves the light.
See the whole thing
The live demo is now exactly the product: one light, one room, over real committed chains. Flip it to tampered and watch the room recompose around the break. Or drag the before-and-after slider on the homepage to see the entire footprint adoption adds to a dashboard: one small light in the header, one tab holding the room. That's it. That was always the promise.
The light is green, the data is clean — and now there is exactly one door behind the light.