f991f1ab1046ab849281dc2c8502ba289163d509
Oliver's retest: 'the fall never happens, the game does not continue, the ball is gone.' Root cause: the decided latch was set AFTER resolveInterlude, and on a point with no stage change matchPoint re-arms the next rally synchronously — so the latch outlived the rally it scoped and swallowed every resolution after it. Two changes: matchFallWillPlay() gates the early resolution to points that actually put a collapse (or the game-winning kill) on court — an ordinary point keeps its ordinary bounce-2 ending, so the ball never vanishes mid-roll — and with only those paths admitted, the after-set latch is provably safe: both defer matchReady until their beat ends. A regression test drives the exact soft-lock sequence through the real update loop. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Languages
JavaScript
75.2%
Python
15.8%
HTML
7.3%
Shell
1.4%
Swift
0.2%