5-sprint outside-in FT suite. Each FT class drives one sprint:
Sprint 1 (DeckContributionTest): role confirmation sets TableSeat.deck_variant
to the gamer's equipped deck; Game Kit tooltip shows game name + In-Use status.
Sprint 2 (DeckInUseGameKitTest): DON btn-disabled w.o DOFF toggle for in-use
deck; tooltip names the game; non-contributing deck retains normal DON/DOFF.
Sprint 3 (GameInviteNotificationTest, @two-browser): invite_gamer() creates
BillPost(kind=INVITE) for invitee; INVITE: <room> link appears in My Posts.
Sprint 4 (GameInviteBillPostTest): /billboard/post/<pk>/ renders _billpost_invite
partial; BYE dismisses; OK shows join-guard when valid deck is equipped.
Sprint 5 (GameInviteDeckValidationTest): OK btn-disabled + tooltip when no valid
deck; confirming join assigns deck to seat and locks Game Kit DON.
New model surface: billboard.BillPost (kind, recipient, room, invite, dismissed)
New field: epic.TableSeat.deck_variant FK → DeckVariant
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>