3eaf3d38a5
ChessEngine.makeMove() now normalizes SAN notation before passing to chesslib, fixing games against jester.nyo.dev and other clients that use different notation: - Castling: 0-0 → O-O, 0-0-0 → O-O-O (zeros to letters) - Annotations: strips !, ?, !!, ??, !?, ?! suffixes Previously, chesslib rejected 0-0/0-0-0 causing ChessStateReconstructor to mark games as desynced and skip remaining moves. Games appeared permanently stuck, even after app restart. Also fixes discoverUserGames() silently dropping games classified as spectator — now adds them to spectatingGames instead. 23 new interop tests covering SAN variants, reconstruction, spectator detection, and missing start event handling. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>