0c121577028330bcfd6ac26b922f6db8ea2ba006
endBurst looked its tin up with [0, 1, 2, 3, 4].find(...) — correct for exactly as long as the rack held five slots. Growing RACK_MAX to 9 meant a burst weapon picked up into slot 5..9 could never be found, so it was never spent: you fired it and the count stayed where it was, forever. Oliver hit it with the beacon, the rocket and the flamer, which together with the gun are precisely the four kind:'burst' weapons — endBurst is the only spend path that searched for its slot instead of being handed one. The serve weapons were never affected, and that is the tell: bomb, triple, fire and the laser all spend through spendSlot(G.weapon), the live index. Checked the laser end to end at slot 8 rather than reasoning about it — 6, 5, 4, 3, 2, 1, gone. Fixed at the invariant rather than at the call site. The rack has always had a comment saying everything reads through the slot accessors so nothing else needs to know how it is stored; slotOf(id) is now the fourth one, and it is the single place that knows the range. Verified all four burst weapons arm from a real tap in slots 5-8 and leave the rack when the burst expires. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Languages
JavaScript
75.2%
Python
15.8%
HTML
7.3%
Shell
1.4%
Swift
0.2%