Fix game-over routing, harden server input validation, and fix PGN injection
- Lift dismissedGameId state from GameScreen into App so routing decisions
stay in one place; fixes black screen on "Back to Lobby" after game ends
- useGame now returns recently-ended games (not just active) so the
checkmate/resign/draw overlay can render before the lobby re-appears
- GameScreen accepts onDismiss prop instead of managing its own routing state
- Player bar active indicator now derived from orientation, not isWhite,
fixing colors in edge cases
- useGamePublisher waits for all player data before publishing to atproto
and marks games published only after confirming data is available
- Escape backslashes and double quotes in PGN tag values to prevent header
injection via crafted Bluesky display names
- registerPlayer: add length limits on DID/handle/displayName/avatarUrl and
make DID immutable after registration to prevent identity impersonation
- Add server-logic.test.ts mirroring makeMove reducer (15 tests) and expand
pgn.test.ts with escaping edge cases (3 tests); all 78 tests passing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>