The room's scroll-of-events feed only updated on refresh — a gamer
watching the SCROLL view never saw a co-player's deposit / role pick /
sig appear. Now every recorded GameEvent nudges all open room sockets to
re-fetch the feed.
- drama.models.record() broadcasts a `scroll_update` to the `room_<id>`
group via transaction.on_commit — so the live re-fetch sees the
committed row, and a rolled-back TestCase never fires it (zero overhead
/ channel-layer traffic for the plain IT suite). _broadcast_scroll_update
is fully guarded: a missing/unreachable channel layer must NEVER break
event recording (falls back to refresh-to-update). One central hook
covers every event writer, current + future.
- RoomConsumer gains a `scroll_update` relay handler (same one-liner shape
as gate_update / turn_changed).
- New `scroll_status` view + url (epic:scroll_status,
room/<id>/scroll/status) renders JUST core/_partials/_scroll.html with
the same events/viewer/scroll_position context as room_view's inline
paint, so the swapped feed is identical.
- room-scroll.js listens for `room:scroll_update`, fetches the partial,
swaps #id_drama_scroll, then re-applies the saved Frame/Redact filter +
restarts the buffer dots on the fresh nodes. URL comes from
.room-page[data-scroll-status-url]. Refactored the dots + filter into
re-runnable helpers; existing behavior (title reel IO, filter form,
localStorage) preserved.
TDD:
- drama RecordBroadcast ITs: record() schedules the broadcast on commit
(captureOnCommitCallbacks execute=True) and NOT before commit.
- RoomConsumer relays scroll_update (InMemory layer, WebsocketCommunicator).
- ScrollStatusViewTest: endpoint renders the feed section, reflects the
latest events, is the bare partial (no navbar/aperture chrome).
544 drama+epic ITs green — the on_commit hook is inert under TestCase, so
no existing event-writer test regressed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New/extended tests across billboard, dashboard, drama, epic, gameboard,
and lyric to cover previously untested branches: dev_login view, scroll
position endpoints, sky preview error paths, drama to_prose/to_activity
branches, consumer broadcast handlers, tarot deck draw/shuffle, astrology
model __str__, character model, sig reserve/ready/confirm views, natus
preview/save views, and the full tasks.py countdown scheduler.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
roles_revealed WS event removed; select_role last pick now fires _notify_all_roles_filled() + stays in ROLE_SELECT; new pick_sigs view (POST /room/<uuid>/pick-sigs) transitions ROLE_SELECT→SIG_SELECT + broadcasts sig_select_started; room.html shows .pick-sigs-btn when all 6 roles filled; PICK SIGS btn absent during mid-selection; 11 new/modified ITs in SelectRoleViewTest + RoomViewAllRolesFilledTest + PickSigsViewTest
consumer: LEVITY_ROLES {PC/NC/SC} + GRAVITY_ROLES {BC/EC/AC}; connects to per-polarity cursor group (cursors_{id}_levity/gravity); receive_json routes cursor_move to cursor group; new handlers all_roles_filled, sig_select_started, cursor_move; CursorMoveConsumerTest (TransactionTestCase, @tag channels): levity cursor reaches fellow levity player, does not reach gravity player
game kit gear menu: #id_game_kit_menu registered in _applets.scss %applet-menu + fixed-position + landscape offset; id_gk_sections_container added to appletContainerIds in applets.js so OK submit dismisses menu; _game_kit_sections.html sections use entry.applet.grid_cols/grid_rows (was hardcoded 6); %applets-grid applied to #id_gk_sections_container (direct parent of sections, not outer wrapper); FT setUp seeds gk-* applets via get_or_create
drama test reorg: integrated/test_views.py deleted (no drama views); two test classes moved to epic/tests/integrated/test_views.py + GameEvent import added; drama/tests/unit/test_models.py → drama/tests/integrated/test_models.py; unit/ dir removed
login form: position:fixed + vertically centred in base styles across all breakpoints; 24rem width, text-align:center; landscape block reduced to left/right sidebar offsets; alert moved below h2; left-side position indicator slots 3/4/5 column order flipped via CSS data-slot selectors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>