1e70ffabd67538dc66c67c0dba6eb4d8b8aa4829
Phase 1 of the room GATE VIEW + seat-renewal sprint. Decouples 1C seating from hand/deposit/paid state: the owner is seated as long as `active_draw_for` returns a row, i.e. for the full 24h after her most recent FREE or PAID draw (PAID DRAW resets created_at, so the window runs from the later of the two). A DEL'd row (empty hand, no paid credit) now keeps 1C seated until the row expires at 24h — previously 1C dropped to .fa-ban the instant she DEL'd, even mid-window. - `_my_sea_seats` `owner_seated` → `owner_draw is not None` (drives the owner's own landing hex + the live `sea_seats` broadcast). - `my_sea_visit` `owner_seated` → same rule, so the spectator hex and the owner's landing agree (was drawn-OR-paid, dropped `owner_paid`). - DRY: removed the dead `seat1_seated` context (the `seats` ring's `seat.present` has driven 1C since the multi-seat hex landed; the flag was never read by the template). Tests — TDD red→green: - flipped `test_seat_1c_not_seated_at_gate_view_after_del` → `..._seated_...`: DEL'd empty-hand row keeps 1C seated, center still GATE VIEW (1 check / 5 ban). - flipped FT `test_seat_1_banned_when_active_draw_has_empty_hand` → `..._seated_...` (asserts .fa-circle-check). - added `test_seat1_seated_context_key_removed` (DRY regression guard). - added spectator `test_owner_seated_with_empty_hand_no_payment`. - `test_owner_not_seated_without_draw_or_payment` unchanged (no row → still unseated). 318 gameboard ITs green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Description
No description provided
Languages
Python
45.2%
JavaScript
37.3%
HTML
9.2%
SCSS
8.1%
Jinja
0.1%