Public: anyone can read this; the crew can change it.

A seat can be given up mid-game: the rule written into RULES.md, and the ledger act that produces it #68

open not picked up yet opened this
opened this

Intent. Give a table a way to survive a player who walks away at hour two, by writing the standing-down rule into the rules of record and giving the ledger the act that sets it.

The hole. src/round.ts (merged in #44) already models it in full: Seat.left is documented as "the seat was given up: the order keeps its place and the clock plays it out", mayAct refuses such a seat with "That seat was given up.", and whoseTurn is careful to say that a seat that has left is still named and never skipped. Nothing can ever produce that state. RULES.md does not mention it anywhere — the only left in the file is a setting of the Wreck clause. There is no column on seat, no act kind, no action, and leaveTable refuses outright once a table is playing ("A seat is fixed once the table starts"). So the pure rules carry a concept the rules of record have never agreed to, which is the drift AGENTS.md warns about, and a six-hour table with a vanished player has no ending but the deadline.

The rule, decided — write it as this unless the pull argues otherwise. A seat may stand down while the table is playing. Its place in the order stays; it may never act again; the clock passes for it, as it already passes for a lapsed window (§8). The quorum does not change: the table's size is fixed when play starts, so standing down never lowers the bar a deal has to clear. What that seat swore before standing down stands, is public, and is judged at the reveal like anyone's, and it is scored at settlement like any other seat. Standing down is therefore the loud version of running the clock down — a real move for the seat whose dread is about to be triggered, since §8 pays every seat 0 on an impound — and it costs that seat every chance of a positive score.

Done looks like

  • [ ] RULES.md gains the rule, numbered in §5 with §8's clock, in the file's own voice, and says what it costs — including the alternative that was rejected (a quorum that falls with the seats, which would let one deserter hold a table hostage).
  • [ ] A migration appended to migrations in src/db.ts — never an edit to one that has run — carrying the fact on seat and the moment it happened.
  • [ ] standDown(db, who, { id }) in src/actions.ts: your own seat only, playing only, once only; it writes the seat's fact and a real act row in one transaction, and emits.
  • [ ] tableState carries the fact into the view, and the Round handed to src/round.ts is built from it — left is read from the ledger, never recomputed, and the refusal a door prints is mayAct's own words.
  • [ ] Every door: a button on the table page with a confirmation, POST /api/tables/:id/stand-down, an MCP tool, a key in src/tty.ts.
  • [ ] Tests that fail without it: a seat stands down, its turn still comes and mayAct refuses it with "That seat was given up."; the quorum in tableState is unchanged; a seat cannot stand down twice, cannot stand down at an open or settled table, and cannot stand down another seat; the §10 fixture in src/example.ts still settles exactly as it did.

Files I expect to change. RULES.md, src/db.ts, src/actions.ts, src/routes.ts, src/mcp.ts, src/tty.ts, src/pages/table.ts, src/actions.test.ts, src/server.test.ts.

Risks. Enough seats standing down can make a binding arithmetically impossible; that is the deadline's job and the rules should say so rather than invent a second ending. Do not let standing down become a cheap way to deny a deal to others while dodging a bad score — it does not, because an impound pays the deserter 0 too, and the pull should show that in a test. seesCharge must be untouched: a seat that stood down keeps its charge secret until the reveal like everyone else.

Waits on #8, which builds the ledger and the act rows this writes into.

Who. @mason, reviewed by @juniper on the words of the rule.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs