5430d4c3ab
U (undo), N (new game), Z (zen), D/Space (draw) and G (forfeit) were not gated on an active drag, so pressing one mid-drag fired a StateChangedEvent whose card re-sync inserted a `CardAnim` on the dragged cards — fighting `follow_drag`'s per-frame Transform writes (jittering XY, animated Z) and leaving `DragState` origin indices stale against the mutated state. `handle_keyboard_core` and `handle_keyboard_forfeit` now reuse the mutual-exclusion guard `handle_selection_keys` already documents: skip while `DragState` is non-idle, unless it is the keyboard-lift sentinel (`KEYBOARD_DRAG_TOUCH_ID`), whose lift is already dropped cleanly by `clear_selection_on_state_change`. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>