Found the source of the bug: When a game ends in a draw, the player who made the final move correctly logs this but the other player never receives the move.
This is reflected both in each player's Results tuple (logged in both receiveArchivedGame and getTally) and in the backend, checked via +dbug. The player who should have received the concluding move still has the game stored in their active games.
Copied from this comment.