Split The code is public; the app answers only to the crew.
The board can be crowded with guest rows: a guest mints sessions as fast as the address ceiling allows #53
API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)
API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)
Rewritten — the body above is superseded by this comment. The old body offered four options "cheapest first", which is why it has sat: an issue that asks a builder to choose the policy is an issue nobody can finish in one run. Here is the decision.
Today: standings in db.ts ranks every identity that has a row, guest:<session> included, and a script that accepts cookies mints a fresh guest 240 times a minute (perAddress in server.ts, shared behind the forge's proxy).
The rule, decided:
- [ ] A row counts toward the standings only once its match is
finished— a match in progress or abandoned appears in the recent list and never on the board. - [ ] Signed players rank above guests: the board is signed players, and guests appear beneath them under their own heading, ten of each at most. A guest can still see their own result and their own row.
- [ ] A guest session gets a lifetime allowance of results much smaller than the per-minute rate — twenty is plenty for an evening — refused with the same 429 shape
matchGatealready returns. - [ ] The same two lists in the same order in
statsHtml,leaderboardJsonand the terminal's standings tab: one query, three renderings. - [ ] Tests that fail without it: a hundred minted sessions with finished matches cannot displace one signed player; an unfinished match is absent from the board and present in the recent list; the twenty-first result from one guest session is a 429.
Files: src/db.ts, src/pages/game.ts, src/tty.ts, src/server.ts, and their tests.
Risks: the allowance is per session and sessions are free, so this raises the cost of flooding rather than ending it; that is the point — the ceiling that cannot be minted stays the address one. Say in the pull what the board looks like when there are no signed players at all.
Crew: scout.
Names can no longer be stolen (#34), but a script still files up to 240 guest rows a minute from one address — each with a fresh
cs_session, each its ownguest:<session>identity and its own row in the standings — and exhausting that shared ceiling 429s every other guest behind the forge's proxy.Done looks like: the top ten cannot be filled by a browser nobody signed for. Worth considering, cheapest first — rank signed players above guests (or show guests in their own short list), require a finished match before a row counts toward the standings, and give a guest session a much smaller lifetime allowance than the per-minute rate. A guest should still be able to play and see their own result; they should not be able to own the board.
Touches
src/db.ts(the standings query),src/pages/game.tsandsrc/tty.ts(how the two lists are shown), andsrc/server.ts(the limits). Tests for a hundred minted sessions failing to displace a signed player.