- Round-trip: every command verb serialize->parse->re-serialize is identical;
malformed input is rejected.
- Equivalence: add a long ~2400-tick run through waves/combat that records,
reads back, and replays to a byte-identical final state with no desync
(alongside the existing short scenario).
- Desync detection: corrupting one recorded checksum makes ReplayPlayer report
the exact desync tick.
- Reset boundary: a Reset drained through CommandManager rolls the recorder to
a new file named by the new seed.
- Polish: the end-of-replay / desync overlay dims the world behind the message.
Record + playback is now functionally complete and covered by headless tests.
Full suite green (354 cases / 3418 assertions).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DUsFgd2Ga6pmLz8giS8WUn
Hooks a recorder into the command chokepoint so each run is written to disk as
it plays, ready for playback in Phase 3.
- ReplayRecorder (lib): line-oriented append-friendly file — keyed header
(version, build, seed, config_hash, timestamp), then '---', then tick-tagged
command lines interleaved with "# checksum <tick> <hex>" RNG fingerprints.
Each line is flushed so a crash leaves a valid partial file. Config hash is a
64-bit FNV over the config dir's *.toml files; build tag is __DATE__/__TIME__.
- CommandSerializer (lib): per-command text (length-prefixed variable parts;
ship layouts and splitter filters serialized inline). Reset is a file
boundary, never a stream entry.
- CommandManager owns an optional ReplayRecorder: drain() records each applied
command + a post-apply checksum; a drained Reset rolls to a new file;
recordTickCheckpoint() (called per tick from onFrame) writes a checksum every
30 ticks.
- Random seed generated in main and on restart (std::random_device); Simulation
retains it via getSeed() for the header.
- GameWorldView attaches the recorder at construction (first file + tick-0
checksum); replays land in <data>/replays named <timestamp>_<seed>.replay.
ReplayRecorderTest covers serialization, file well-formedness, file rolling,
and the CommandManager drain->record integration. Full suite green
(346 cases / 3377 assertions); app, tests, and balancing all build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DUsFgd2Ga6pmLz8giS8WUn