The control room
Both worlds on one operator board. The deck pages read a world one card at a time; the operator's question is different — what is the state of the whole plant, right now, and what happened on the 26th? That question has had a canonical answer for fifty years.
scenario.json files the deck pages use and the twins they reference — nothing was added
to make it possible, which is what makes the scenario files a world model rather than a page config.
A tile is a twin node; its lamp colour is its tier and nothing else; a sensor that refused
measurement is a FAULT lamp, never a blank; and the log at the bottom re-runs every verdict
through mandate.py at build time. Click any tile for its faceplate.-
1—
the agent
git push origin claude/write-book-pdf
PERMIT
permitted — and the work crosses to Unit 2, the world without the walls“PERMIT claude/write-book-pdf (mandate v1” — the transcript · re-run at build:
PERMIT claude/write-book-pdf (mandate v1, allow=['claude/**'], expires 2026-12-31T00:00:00Z) -
2—
the agent
git push origin dev
REFUSED
CAN said yes; MAY said no; MAY won — the breaker trips“✗ dev is not permitted by mandate v1” — the transcript · re-run at build:
REFUSED dev (mandate v1 permits ['claude/**']) -
32026-08-26 15:00 UTC
sha256:90f97984b9cf3930
DECIDES: amend mandate v1 → v2
DECIDES
the operator action — the only signed, timestamped row on this log
-
42026-08-26 15:14 UTC
the agent
git push origin dev (again)
PERMIT
the site deploys; tag v0.1.28 records the landing“PERMIT dev (mandate v2” — the transcript · re-run at build:
PERMIT dev (mandate v2, allow=['claude/**', 'dev'], expires 2026-12-31T00:00:00Z)
Times are derived or absent: the DECIDES row prints mandate v2's own
issued_at; the landing prints the v0.1.28 tag's commit time from git; the
transcript records the refusal, not the clock, so those rows print a dash. The replay is baked, not
computed — the browser only steps through verdicts the build already re-proved.
-
SHUT
an append lane that accepts a token holder with no account
somebody else
how a measurement reaches the registry without a human committing it · enrolled_via_lane = 0
-
SHUT
an issuer key that anybody cannot forge
somebody else
a live enforcement decision resting on a published fixture is theatre · mandates_real_issuer = 0
-
SHUT
a grant signed by a named measurer, about a keyed environment
this project
a live lamp lit by an unsigned fact is an anonymous claim about the present · library_entries_signed = 0
-
SHUT
a measurement taken from outside the environment being measured
somebody else
dated self-measurement carries a date you can check; a live self-report is a press release · independent_measurements = 0
These are doors on the state map, not new claims: each one is the condition the next rung will not accept work without. Three of the 4 need somebody other than this project, which is the honest reason the chip reads what it reads. The gate is symmetric, as it is there: a board that could claim LIVE and does not is as much a defect as one that claims it and cannot.
What this board does not claim. Two units and one recorded incident is a diorama with excellent manners, not a control room under load: nothing here shows the annunciator scaling past twenty tiles, the log past one incident, or an operator acting on any of it. REPLAY never becomes LIVE on this page — a live board needs the registry's write path, monitors feeding facts, and a mandate service, all still stated design. And the genre bet — that a mimic reads faster than a table — is now four implementations deep across two estates with zero user tests.
Renderer: admin/build/gen_control.py · specified in
brief v0.33.69
· gates: tiles == twin nodes per unit; lamp classes closed over the five tiers; the wall
drawn must agree with the egress tier; every verdict re-run through the tool; every quote
byte-checked; timestamps derived or absent; the REPLAY chip checked in the output.