-
Mahmoud Aglan authored
Root cause: draw offers stored in game_state were lost when a concurrent move write did read→merge→write (non-atomic). Now uses PostgreSQL jsonb || operator via merge_game_state() RPC for atomic merges. Also adds: - mp_log table for server-side multiplayer event logging - Frontend sessionStorage logging (sessionStorage.mp_log) for debugging draw offers, moves, and poll events - Logging on match_created, move, resign, draw_accepted, game_state_merge Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
9b2a459c