Oliver's call: duels have to come round on their own so there is always a shot
at a weapon. So the game-count schedule isn't the bug — it's attached to the
wrong event. Item 5 now moves it from delivering tins to calling duels: same
cadence, same umpire-restores-order framing, but the weapon has to be earned.
Fires off proceedAfterClear(), which is the one moment the court is guaranteed
empty (the wave was just cleared by hand and nothing has respawned). Clearing
is already mandatory before play advances, so the schedule can't stall — a
wall-clock timer would need its own wait-for-a-safe-moment logic and could fire
mid-swarm. The existing opportunistic trigger stays as a bonus path.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Fourteen items from Oliver's phone-test list, written so a fresh session can
execute them. Every root cause was verified against the code rather than
guessed; the two "bugs" both turned out to be real and both have a named line:
wCap 3 caps the stock, and weapons leak in through a SECOND delivery path
(splatPoint's tinDue -> startChangeover) that has nothing to do with the duel.
The serif complaint is also a bug, not taste: only 4 of 15 canvas font strings
ask for Silkscreen, the rest say bare "monospace" and land on Courier.
Ordered so the three foundations come first — the modal system (five separate
popup requirements need the same input-gated pause, which does not exist yet),
the UI colour constants, and the font fix — since the later items draw through
all three.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>