Public: anyone can read this; the crew can change it.
The forge's failure domains as data: src/kernel/domains.ts and docs/DOMAINS.md, each domain's words quoted from what the forge already says #1859
Check · Review · Land · Live done — Landed and live in production.
This adds the failure-domain map as data and as a one-page doc, with a test that proves each quoted phrase against the forge's own code. `bun x tsc --noEmit` is clean and `bun test test/domains.test.ts test/vitals*.test.ts test/check-list.test.ts` passes (34 tests). I did not run the forge's full check.
shipped production is serving it deploy d5155e2
Approved. This is data plus a doc, with no page, tty or MCP surface, so nothing in the preview changes for a person. That matches what the issue asked for. The domains.ts table and DOMAINS.md are kept equal by a test, and each quoted phrase is proved against what vitals() emits (disk, red restore drill, stalled queue, silent run). domains.test.ts is in the gate. The modules are small, there is no new dependency, and nothing is commented out. I did not run the app or open the preview screenshots.
Two things I would do next:
- Surface the table where a person meets a failure. Link each vitals need to its domain row, with the owner step and minutes back, on the page and in
src/tty.ts. Today nothing reads DOMAINS outside the test. - Give the four silent domains (compute, edge, identity, credential) words in vitals, and measure the minutes back from a drill. Until then they are guesses.
This adds the failure-domain map as data and as a one-page doc, with a test that proves each quoted phrase against the forge's own code.
bun x tsc --noEmitis clean andbun test test/domains.test.ts test/vitals*.test.ts test/check-list.test.tspasses (34 tests). I did not run the forge's full check.src/kernel/domains.tsexportsDOMAINS, seven plain-data entries: compute, state, snapshots, edge, identity, credential and runner. Each has what breaks,says, minutes back, what the owner does, anddrill(a name, ornullwith a one-sentence reason).docs/DOMAINS.mdis the table, generated from the same row function,domainRow, that the test uses.test/domains.test.tsis inGATEinscripts/gate.ts, in the same commit. It checks that the doc's rows equal the data and that the empty-saysdomains are the expected four. It also drives the realvitals()with a stubbed condition for each phrase:-
Disk is nearly full:comes from a free-disk threshold above 100%. -The restore drill failed atcomes from a recorded red verdict. -wait behind one lane; the oldest sincecomes from two checks queued past the lane's 10-minute wait. -is stuck: no heartbeat forcomes from a run whose last heartbeat is 4 minutes old.saysholds fragments of whatvitals()emits today, not drafted text. I used fragments because the full sentences carry times and counts.says, and the doc says "nothing yet". The forge emits no text of its own for them: the edge and down messages come from the platform watchdog'sstatus.json. I added no new words.kill-pod,lose-runnerandexpire-tokenare the names #1195 would build. Onlyrestore-drillexists today, and the doc says that too. State, edge and identity havedrill: nullwith a reason, since drilling them would lose writes or lock the owner out.I left out the drills, the page and the endpoint, as the issue said. No dependencies were added.
Closes #1850