Pre-publish review of the four lexicons. None of the record lexicons have ever been published (only the permission set is), so this is the last cheap moment to fix the schema before it becomes a public contract. The app has no users, so no migration.
blue.checkmate.challenge is removed. It duplicated the game record
(opponent and gameUri are both derivable from game.white/black), its
status never left open, nothing read it, and it did not solve the discovery
problem it existed for: an open challenge has no opponent, so there is no DID
to backlink on and Constellation cannot find it any better than a waiting
game. Directed invitations are found from the game record's seat fields instead.
Removes the lexicon, the ChallengeRecord type, createChallenge/updateChallenge/
getChallenge, the challenge field on challenge.status, the collection from
the permission set, and the unreachable /challenge/{did}/{rkey} route. HAD-169,
HAD-173 and HAD-235 are cancelled as moot.
Three game descriptions were wrong:
parentGameUrisaid "the white player's record". The canonical record is the creator's, whichever colour they chose; the joiner's copy points at it.drawOfferedsaid "by the last moving player"; it means this record's owner has an outstanding offer. Offers are not turn-gated.pgnnow says variant starting positions travel in[SetUp]/[FEN]headers, which is the contract sincestartingFenwas dropped.
fifty_moves becomes fiftyMoves, the one snake_case value among camelCase
neighbours. Four code sites.
Kept deliberately after discussion: timeControl, moveTimes, the abandoned
status and chess960, all defined ahead of their features; and knownValues
rather than closed enum throughout.
CLAUDE.md and lexicons/README.md updated to describe pairing as creator/joiner rather than white/black, and the roadmap's OG-tags table loses the deleted route.