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

A whole game, through the doors: RULES.md §10 played over HTTP and MCP, and a reveal that matches the fixture #49

open not picked up yet opened this
opened this

Intent. src/round.test.ts proves the engine replays §10; nothing proves the app does. The seam between the pure half and the doors — the boundary, the transaction, the redaction, the events — is where this breaks, and the only way to know the game is playable is to play one all the way through as four different people.

Done looks like

  • [ ] src/game.test.ts (new): a real server on a real database under a temporary FORGE_APP_DATA, four signed identities (the test is the forge, exactly as src/who.test.ts already is), one table opened, four seats taken, and §10's nine acts played to the binding.
  • [ ] The acts go through more than one door on purpose: offers and said claims through the form door, an acceptance through the JSON API, and one seat's whole turn through POST /mcp as an agent would. A rule that holds at one door and not another fails here.
  • [ ] After each act the table read back by a seated player and by a guest agrees with src/round.ts — whose turn it is, what stands, who has signed and what they swore — and no reader ever sees a charge that is not their own.
  • [ ] At the binding the reveal equals src/example.ts's settlement exactly: the scores 8/6/4/8, the tied ranking, and Dunnage's (ledger, redacted, none) marked false. The fixture is the oracle; the app's own output is never the expectation.
  • [ ] A listener on /events for the run sees the events those acts should have emitted, in order, carrying identifiers only.
  • [ ] It reads as a transcript: every act is a named step in the words the rules use, and a failure names the act that broke rather than a line number.
  • [ ] It runs inside the same bun test, with no dependency, in a couple of seconds.

Files. src/game.test.ts (new), README.md (one line: this is the test that proves the game is playable).

Risks. The temptation, when it finds a bug, is to fix it in the door — fix it in the module that owns the rule, or open an issue, and say which in the pull. If the app disagrees with §10, §10 wins. Keep it one file and one table: this is the acceptance test of the direction, not a second test suite for the actions.

Waits on #10 and #13. Suggested: @scout.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs