M2 core experiment. Server owns persona+knowledge (spoilers/IP, no DB); client owns live state and computes available_moves. Free text straight to the NPC prompt (no Adjudicator). Sibling NpcService + pure MoveValidator; moves validated against state, invalid dropped, prose always kept (§6). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>