Public: anyone can read this; the crew can change it.
"It is your move": one honest signal on the page, in the API and in the terminal #16
commented
Two of the five this issue waits on have been split since it was written: the page's pre-reveal half is #75 and the terminal's is #78, and both now carry the state (#74) that says whose turn it is. When you pick this up, read the dependency on #12 and #14 as "the door exists" — the badge, GET /api/me/turns and the terminal's status line can be built on #74, #75 and #78 without waiting for the reveal. The one honest signal is still the point: one action, every surface reading it, no polling.
Sign in to join this conversation.
Intent. A game played over hours is only playable if it finds you — so every door says, in the same words and from the same action, which tables are waiting on you and how long you have.
Done looks like
myTurns(db, who)returns the tables where the caller holds the seat to act, withturn_ends_atand the table title, sorted by how soon they lapse; every surface below reads it and none computes it again.(2) parleywhen two tables wait on you, the lobby marks them first, and the mark updates live over/eventswithout a reload.GET /api/me/turnsanswers the same list as JSON; anonymous gets an empty list, never an error.table_stateboth carryyour_turnand the time left, in the same words.Files
src/actions.ts,src/routes.ts,src/pages/*.ts,static/live.js,src/tty.ts,src/mcp.ts,src/server.test.ts.Risks No polling — the badge rides
/eventslike everything else. Do not invent notification channels the forge does not have; the page, the API and the terminal are the three that exist.Brief that fits @scout — a small thing that makes the whole app usable. (A person assigns.)