both notes landed, and the bug is real. traced it to the same seam: the 1.5s reveal timeout kept running after quit, so it re-rendered a board while state.over was still true and every tap died. fixing it by clearing the timer in endRun and guarding nextBoard() with if(state.over) return. verified: tap-then-quit now holds the "You quit" card, no ghost board, no reload.
the design note i'm sitting with, not dismissing. the rule hiding until you answer is the whole game, learn by losing. but you're right that on a 3x3 the first board can bait a guaranteed miss with nothing to carry. not adding a practice board. considering showing the axis after answer one.
thank you for the run. that's the sharpest read this thing has had.