Intent. Give the game its visual language before the game's page needs it — one layout, a charter grid of 7 clauses by 3 settings, claim rows, an act log and a clock slot — rendered from fixed sample data at /style, so the pattern is real, reviewable in the preview, and reusable by #12 and #15 instead of invented twice.
Done looks like
[ ] src/pages/layout.ts (new): one layout({ title, body, who, live }) that emits the whole document — <head>, CSS and JS linked by asset(), the header with the forge sign-in and sign-out links, the notice from readNotice, the footer — and escapes everything that came from a person. AGENTS.md says to split page.ts when the second page arrives; this is that moment.
[ ] src/pages/style.ts (new) plus one row in src/routes.ts for GET /style: every component the game needs, rendered from a constant fixture declared in that file — no database, no identity, no secret. The charter grid with one setting marked as the standing offer; a seat row carrying a sworn claim (clause, setting, weight); a said claim with no verdict and the same claim marked true and false; the act log newest last; the clock slot; the offer form as 7 radio groups; Accept and Pass; and a refusal sentence in the voice an action would use.
[ ] Each component is an exported function of plain data, so #12 renders the real table by calling the same functions with real state.
[ ] static/app.css is rewritten for that vocabulary and the notes demo's rules go: legible at 360px with no horizontal scroll, every control at least 44px on a side, usable at 200% zoom, a visible focus ring on every control, and prefers-color-scheme honoured for dark.
[ ] No layout shift: the charter grid's columns are fixed, and the clock slot reserves its width (that class comes from #20).
[ ] src/server.test.ts: GET /style answers 200 with the security floor intact, carries no inline <script>, renders identically for a guest and for an admin, and the response is under 50ms.
[ ] README.md gains one line saying /style is where the look lives and that it is rendered from fixtures, not from a table.
Risks #7 is in flight and owns src/page.ts and / — do not touch either, add files and one route, and rebase rather than rewrite when it lands. A style page that drifts from the real page is worse than none: it renders the same functions #12 will call, or it is deleted with #12.
Brief that fits @quill — typography, rhythm and a page that does the work without a framework. (A person assigns.)
Intent. Give the game its visual language before the game's page needs it — one layout, a charter grid of 7 clauses by 3 settings, claim rows, an act log and a clock slot — rendered from fixed sample data at
/style, so the pattern is real, reviewable in the preview, and reusable by #12 and #15 instead of invented twice.Done looks like
src/pages/layout.ts(new): onelayout({ title, body, who, live })that emits the whole document —<head>, CSS and JS linked byasset(), the header with the forge sign-in and sign-out links, the notice fromreadNotice, the footer — and escapes everything that came from a person.AGENTS.mdsays to splitpage.tswhen the second page arrives; this is that moment.src/pages/style.ts(new) plus one row insrc/routes.tsforGET /style: every component the game needs, rendered from a constant fixture declared in that file — no database, no identity, no secret. The charter grid with one setting marked as the standing offer; a seat row carrying a sworn claim (clause, setting, weight); a said claim with no verdict and the same claim marked true and false; the act log newest last; the clock slot; the offer form as 7 radio groups; Accept and Pass; and a refusal sentence in the voice an action would use.static/app.cssis rewritten for that vocabulary and the notes demo's rules go: legible at 360px with no horizontal scroll, every control at least 44px on a side, usable at 200% zoom, a visible focus ring on every control, andprefers-color-schemehonoured for dark.src/server.test.ts:GET /styleanswers 200 with the security floor intact, carries no inline<script>, renders identically for a guest and for an admin, and the response is under 50ms.README.mdgains one line saying/styleis where the look lives and that it is rendered from fixtures, not from a table.Files
src/pages/layout.ts(new),src/pages/style.ts(new),src/routes.ts(one row),static/app.css,src/server.test.ts,README.md.Risks #7 is in flight and owns
src/page.tsand/— do not touch either, add files and one route, and rebase rather than rewrite when it lands. A style page that drifts from the real page is worse than none: it renders the same functions #12 will call, or it is deleted with #12.Brief that fits @quill — typography, rhythm and a page that does the work without a framework. (A person assigns.)