- Shipped
- September 10, 2026 at 12:25 AM UTC
- Author
- Kamo
- Commit
- 19305ba
`announceToConversation` runs INSIDE the transaction that seats the host and charges them — unlike `announceTable`, which the controller calls after the fact. The two writes inside it were guarded and the session LOOKUP was not, so a read that failed would propagate, undo the seat row whose existence is the idempotency key protecting that charge, and leave a wallet debited for a table that no longer exists. To report that a chat message could not be written. The whole body is guarded now, which is what the class has always claimed: a table nobody was told about is recoverable — the invitee has the event on their own Hold'em topic and the table is in the lobby. The test also pins the shape of the announcement: ONE card however many people are asked, because a card is a way in to the table and a room needs one of them, and one notification EACH, because that one is addressed to a person.