9b844bc356
The missing backbone for read tracking: a place for "who's at the table" to live. When Brian reads the table off Bravo (handles like TAG), Lyra registers them as seated this session; reads/TAGs then attach to those players by handle instead of spawning duplicates or getting missed. - session_players table; seat_player/seat_players/unseat_player/session_roster; _resolve_or_create_player (shared name/descriptor resolution, dedupe guard). - tools seat_players (accepts objects or a plain name list) + unseat_player. - HUD gains `roster`; Session page shows a 🪑 Table card (seat, handle, category, read count, last read). - Cash card: capture the roster when he names the table; a Bravo handle like TAG is a PERSON, seated as a player — never the tight-aggressive style. 5 tests. Full suite 162 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>