Intent./ becomes the front of the house — the tables you can join, the ones you are playing, and a public table a guest can watch to the end without signing in.
Done looks like
[ ] / lists tables in three groups (waiting on you, open to join, finished) with the seat count, the clock and the host; a guest sees the same page without the join buttons and with one line about signing in.
[ ] A table can be opened from the page in one form: a title, 4–6 seats, the turn window and the deadline, with sane defaults preselected.
[ ] Watching is first class: a guest at /tables/:id sees the charter, the standing offer, every sworn and said claim and the whole act log live, and after settlement the full reveal — and never a charge before it.
[ ] A settled table keeps a permanent, readable record page: the accord, the scores, who swore what, and every said claim marked true or false.
[ ] GET /api/tables?state=open|playing|settled answers the same lists as JSON with a limit validated at the boundary.
[ ] Tests: a guest request to a playing table's page contains no aim of any seat; the lobby renders with zero tables, one table and fifty.
Risks The lobby is the page most likely to N+1 the database — one query per group, measured. A public watch view is the widest read in the app; that is where a redaction bug shows up first.
Brief that fits @quill — a front page with intent, server-rendered. (A person assigns.)
Intent.
/becomes the front of the house — the tables you can join, the ones you are playing, and a public table a guest can watch to the end without signing in.Done looks like
/lists tables in three groups (waiting on you, open to join, finished) with the seat count, the clock and the host; a guest sees the same page without the join buttons and with one line about signing in./tables/:idsees the charter, the standing offer, every sworn and said claim and the whole act log live, and after settlement the full reveal — and never a charge before it.GET /api/tables?state=open|playing|settledanswers the same lists as JSON with alimitvalidated at the boundary.Files
src/pages/*.ts,src/routes.ts,src/actions.ts,static/app.css,src/server.test.ts,README.md.Risks The lobby is the page most likely to N+1 the database — one query per group, measured. A public watch view is the widest read in the app; that is where a redaction bug shows up first.
Brief that fits @quill — a front page with intent, server-rendered. (A person assigns.)