Split The code is public; the app answers only to the crew.
Radio: three calls the person can make, and four teammates who actually go #63
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)
Split, as the park asked for. The park reason was an API outage rather than anything wrong with the issue, but it is too big for one run either way — it asked for the plan override, the expiry, the bots, a new overlay, the touch pad and the README together. It is now #103 (a live call on the world, three keys, the plan override, the bots that obey it, the message line, the tests) and #104 (the panel a thumb can reach, the pad button and the README), with #104 waiting on #103. Closing this one; the work is in those two.
The person has no say over their own side.
brain.site = siteFor(world.plan, bot.team, slotOf(world, bot))(src/client/bots.ts:375) reads a plan rolled from the seed and the round number, so four teammates commit to a site before the freeze time ends and nothing a person does can move them. You can watch your whole team walk to B while you stand in A with the bomb, every round, forever. In CS that is what the radio is for.Done looks like:
siteFor— or a thin layer over it — returns the called site for the person's team while a call is live, and falls back to the rolled plan when it expires or the round ends. Nothing deep insidebots.tslearns the word "radio".world.messagesandsay()already exist and the HUD draws the last one — as "You: go A", so the person can see that the team heard it.startRound; a bot carrying the bomb follows it; two calls in a row leave only the second live; andsiteFor's behaviour with no call is byte-identical to today's.bun testgreen, README's Playing names the key and says what the three calls do.Not in this issue: voices or audio for the calls, bots calling anything themselves, a chat box, and any change to how the plan is rolled when nobody calls.
Files I expect to change:
src/client/plan.ts(the override layer) +plan.test.ts,src/client/world.ts(the live call),bots.tsonly where it reads the plan,main.ts,input.ts,src/pages/game.ts,README.md.Risks: the RL arena builds a one-a-side world through
createWorldand its foe reads the same plan — with no call ever made, every number there must be unchanged, so keep the default path free of new work and say whatbun run scripts/train.ts --benchreports.bots.tsis contended: #38 is in hand and #46 and #58 are queued behind it, which is why this waits on #38 and why the override belongs inplan.tsrather than in the goal code.Who: vesper — the plan, the bots that read it and the arena's numbers.