SPEC.md bumps to v0.3:
- Section 3 envelope schema lists the 5th key `n` (8-byte msgpack bin)
- New section 3.1 documents the replay-dedup cache (per-session LRU,
512 entries, 600s TTL, Fresh|Replay verdict)
- New appendix B documents the Chess reference game: UCI-only wire,
state-by-replay, terminal reason codes, the dual-context `w` key
- Removed sections covering legacy rlap.v1 / ratspeak.game markers
- Removed manifest fields min_players, genre, turn_timeout (which
no real consumer used)
README adds Chess to the Quick Start, mentions replay-protection in
the feature list, and updates the architecture tree to include
dedup.rs and apps/chess.rs.
CHANGELOG entry for 0.3.0 enumerates the additions, renames, and
removals.
Hand-crafted msgpack vectors with deterministic 8-byte nonces. They live
in tests/chess_*.bin and are byte-identical to the copies in lrgp-py
under tests/vectors/ — that cross-language fixture is what enforces
wire compatibility between the two reference implementations. msgpack
maps are unordered by spec, so the vector tests assert decode-correctness
(field values match expected) rather than byte-identity round-trip.
The example demonstrates challenge -> accept -> first move with two
LrgpRouter instances. Full-game simulation needs a richer two-peer
state-sync harness than this single-process demo provides.
Port the Chess implementation from the Ratspeak local source of truth:
UCI-only wire format, board state replayed locally via cozy-chess,
two-side validation, terminal reasons coded as 2-3 chars (cm, sm, ins,
3fr, 50m, rsn, agr).
Drop pre-release legacy code: rlap.v1 / ratspeak.game protocol-marker
recognition, LegacyNoNonce dedup verdict, optional-nonce handling. The
nonce is now required at the wire boundary, simplifying dedup to
Fresh|Replay.
Rename GameManifest -> AppManifest (matches Ratspeak naming) and add
default snapshot_session / rollback_session methods to GameApp so apps
that need transactional rollback (chess) opt in by overriding.
Also adds the test-helpers feature gate exposing per-app force_coin
hooks for deterministic test-vector generation.