Investigating a user report that Vegas scroll mode doesn't update scores
or game status. Root cause: PR #299 (Mar 28) added a mechanism so a live
score change reached the ticker within a few seconds instead of waiting
for a full scroll cycle -- _tick_plugin_updates_for_vegas() diffed
plugin_last_update timestamps to detect which plugins got fresh data and
called coordinator.mark_plugin_updated() for each, and should_recompose()
checked has_pending_updates_for_visible_segments() to trigger an immediate
hot-swap.
PR #330 (May 14, multi-display wireless sync) refactored both call sites
while adding sync support and silently deleted this entire mechanism --
not just gated it behind the new sync-mode deferral it legitimately
needed, but removed it outright. The result: VegasModeCoordinator.
mark_plugin_updated() and StreamManager.has_pending_updates_for_visible_
segments() have been fully implemented but never called from anywhere
since. Vegas mode's only remaining freshness sources are a 5s content
cache TTL (fine) and full recompose at cycle boundaries, which depending
on min/max_cycle_duration can be minutes away -- so live scores/status
can sit stale far longer than a user would expect from a "live" ticker.
Fix:
- Restored _tick_plugin_updates_for_vegas() in display_controller.py,
wired as the Vegas coordinator's update callback in place of the plain
_tick_plugin_updates(). Diffs plugin_last_update before/after the tick
and calls vegas_coordinator.mark_plugin_updated(plugin_id) for each
plugin that actually got new data (rather than returning the list, since
the callback interface no longer consumes a return value).
- Restored the has_pending_updates_for_visible_segments() check in
render_pipeline.should_recompose(), positioned after (not instead of)
the sync-mode early return PR #330 added, so standalone installations
regain immediate refresh while synced leader/follower pairs correctly
keep deferring hot-swaps to cycle boundaries as PR #330 intended.
Test plan:
- Added test_display_controller_vegas_tick.py and
test_vegas_render_pipeline_recompose.py -- neither area had any prior
test coverage, which is very likely why this regression went unnoticed
for ~2.5 months.
- Verified both new test files fail against the pre-fix code (swapped in
the current main versions of both files) with exactly the expected
errors -- AttributeError for the deleted method, and the recompose
assertion returning False instead of True -- then pass against the fix.
- Confirmed the sync-mode deferral this restoration must not break still
holds: test_sync_active_defers_pending_updates_to_cycle_boundary.
- Full related suite (test_vegas_plugin_adapter, test_vegas_config,
test_display_controller_plugin_toggle, test_display_controller_
optimizations, test_plugin_system): 108 passed, 1 pre-existing failure
unrelated to this change (test_circuit_breaker, stale mock signature).
- Full CI plugin-safety suite (test_harness, test_visual_rendering,
test_plugin_matrix): 52 passed, 2 pre-existing skips.