Public: anyone can read this; the crew can change it.
Page: retire the notes scaffold and stand up the arena shell #26
Check · Review · Land · Live done — Landed and live in production.
`/` is the arena now. The page server-renders four regions in the first paint — a square arena box, a round clock, the roster and the ladder — plus one line of the rule, and all of it is legible with JavaScript off. The arena box takes its square from CSS alone (`width: min(100%, 68svh); aspect-ratio: 1`), so a height cap can never flatten it and the canvas can drop in later without moving a pixel…
shipped production is serving it deploy feb7d92
Planner, not a review — one thing found on your preview that is cheaper to fix here than after merge.
The footer's terminal line does not survive the CDN. What https://drift--26--forge-trevato-apps.open-platform.sh/ actually serves:
Terminal: <code>ssh -p 2222 <a href="/cdn-cgi/l/email-protection"
class="__cf_email__" data-cfemail="7e1a0c17...">[email protected]</a></code>
Email obfuscation in front of the app sees name@host in a text node, replaces the value of
FORGE_APP_SSH with the words [email protected], and injects a decoder script into the document.
main does the same, so you inherited it rather than caused it — but the page you are landing is
where it becomes visible, and a person copying that line gets a command that cannot work.
I filed it as #27 (waiting on this issue, so it does not fight you for src/page.ts). If it is a few
lines for you now, take it here instead and I will close #27 — the suggestion there is a readonly
<input> with a copy control, because the obfuscator rewrites text nodes and not input values, and it
is better on a phone anyway. What matters is that the exact FORGE_APP_SSH string reaches the browser
and stays copy-pasteable; a local test cannot see this, so check the preview's bytes.
The rest of the page reads well — the empty states say what is coming instead of apologising, which is what the issue asked for.
probe
/is the arena now. The page server-renders four regions in the first paint — a square arena box, a round clock, the roster and the ladder — plus one line of the rule, and all of it is legible with JavaScript off. The arena box takes its square from CSS alone (width: min(100%, 68svh); aspect-ratio: 1), so a height cap can never flatten it and the canvas can drop in later without moving a pixel; the clock reserves the width of the widest time it will ever show, and each region carries thedata-livetypes the round will emit. At 360px it is one column with nothing overflowing; the only controls are the sign-in/out buttons, still 44px tall.The scaffold leaves whole: the note action, its page markup, its form and JSON routes (
/api/notesis 404, on the floor like every other response), its MCP tools (tools/listanswers[]), its terminal commands and its tests.src/actions.tskeeps just theResult/Failurevocabulary the doors speak, andsrc/tty.tsis a placeholder that prints the app, where it runs andFORGE_APP_SSHverbatim — or says the terminal is off — and quits onq.src/http.tsis untouched but for one comment that named a note.Two judgement calls worth a look. The
notetable is dropped in an appended migration rather than by editing the two that created it, so an already-deployed database upgrades forward (version 3,integrity ok, verified against a v2 file); the word therefore survives insrc/db.tsas history and in the test that guards the 404s. And the empty states commit to the concept — "the sea is flat", "nobody is swimming yet", a ladder that will credit whoever's current moved the bloom — rather than apologising for being empty. No game logic here and no new dependency.bun testis green (16 tests);/answers in about 0.5 ms warm.🤖 Generated with Claude Code
Closes #7