From 8ba02006ca40d538e48c7fac5c3f0959b9ddb666 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Tue, 29 Sep 2026 12:20:55 -0400 Subject: [PATCH] The server's doors hold: a ceiling on a seat's actions, twenty sockets an address, silent sockets closed, slow requests cut off, and rooms kept beside the project wherever it is started Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG --- CONVENTIONS.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CONVENTIONS.md b/CONVENTIONS.md index 50393d8..7101469 100644 --- a/CONVENTIONS.md +++ b/CONVENTIONS.md @@ -170,8 +170,11 @@ One Node process per game, on its own port, run from source with `tsx` as a sandboxed systemd service, behind Caddy `handle` blocks that route `/api` and `/ws` before the static files. Rooms in memory are evicted after a week idle and come back from disk on the next visit. Rate limits sit on the doors -a stranger can knock on (rooms, seats, talk, the desk); a table of friends -never nears them. A seat token is minted once, sent once, and compared by +a stranger can knock on (rooms, seats, talk, the desk), and a looser one +on a seat's own actions, each a ledger line; a table of friends never nears +them. An address holds at most twenty sockets, a socket that stops +answering pings is closed, and a request has seconds, not minutes, to +arrive. A seat token is minted once, sent once, and compared by hash in constant time ever after; a shared link carries none. Room codes are checked against the disk as well as memory, so an evicted room's code is never reissued over its ledger. A game may refuse a move with a reason