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

open told opened this
opened this

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 own guest:<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.ts and src/tty.ts (how the two lists are shown), and src/server.ts (the limits). Tests for a hundred minted sessions failing to displace a signed player.

commented

API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)

commented

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)

commented

API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)

commented

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)

commented

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 matchGate already returns.
  • [ ] The same two lists in the same order in statsHtml, leaderboardJson and 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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs