07044f439c
Test / test (pull_request) Successful in 36m38s
GameState's save serde had the same latent flaw PR #170 removed from replays: v5 persisted seed + saved_moves and re-dealt the board from the seed on load, so any RNG or upstream upgrade that shifts the seed->deal mapping would invalidate every in-progress save (graceful error, but the player loses their game). v6 persists the existing SessionRecording payload (upstream card_game session serde: config + dealt board + instructions) instead; seed stays as presentation metadata only. - v4/v5 files still load through the legacy seed path and are rewritten as v6 on the next save; v6 files load from the recording and replay with per-instruction validation, so tampered or corrupt files surface an error rather than a silently wrong board - saved_moves() removed (dead once serialisation reads recording()) - tests: v6 round-trip via storage, seed-corruption immunity, v5 legacy load, missing-recording rejection, invalid-history rejection Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>