app/identity_replay.h

advance a PieceTracker over an engine-encoded move.

The engine works in piece types; the physical board works in piece identity (which of the 32 pieces, and therefore which storage slot a capture is routed to). GameController bridges the two for the live game. But every offline consumer that has to know where the pieces would be — review’s backward stepping, a puzzle’s setup delta — needs the same transition rules without a gantry attached.

These three functions are that rule, in one place. They mirror GameController::updateTracker / ::undoMove exactly; if those change, change these. Keeping a private copy per session is how the two silently drift apart.

Pure: no hardware, no engine state — a tracker and an encoded move.

namespace kirin