Scaffold project and author 14-phase roadmap

Browser co-op kitchen game: FastAPI + native WebSockets, server-authoritative
20 Hz simulation, in-memory anonymous lobbies, data-driven YAML levels, Canvas 2D
vanilla ES-module client with locally authored SVG art and no external CDNs.

.agents/PLAN.md records the LOCKED decisions; .agents/user_stories/ holds the 12
flow contracts; .agents/phases/todo/ breaks them into 14 sequential, test-gated
phases (71 task files), each leaving the app launchable and the suite green.

LLM-Generated: true
This commit is contained in:
2026-10-05 17:05:56 -04:00
commit f84c6ebaef
105 changed files with 5752 additions and 0 deletions
@@ -0,0 +1,25 @@
# US-01 — Create an anonymous lobby
**As a** player who just opened the site,
**I want to** press one button and get a room code,
**so that** I can start a game with friends without creating an account.
## Acceptance criteria
1. The landing screen shows exactly one primary action: *Create lobby*.
2. Creating a lobby issues a 5-character code from the Crockford base32 alphabet
(no `I`, `L`, `O`, `U`), uppercase, shown large and with a copy button.
3. No account, email, password, cookie consent, or third-party request is involved.
4. The browser stores only a random session token (`sessionStorage`) and the room code.
5. The creator is marked `host` and holds a seat; the room is in `LOBBY`.
6. Reload of the same tab with the same token returns the player to the same seat.
7. If the server is at `max_rooms`, the UI shows a clear "lobby full, try again" error
instead of a broken screen.
8. An idle, empty lobby is garbage-collected.
## E2E suite
`tests/e2e/test_us01_create_lobby.py` — load `/`, create lobby, assert code shape,
reload → same seat, assert zero non-origin network requests.
## Phases
`01_runnable_service_scaffold`, `05_anonymous_lobbies_and_room_lifecycle`,
`07_canvas_client_and_hud`