Review follow-ups:
- A programme still on air was not asked for again until it ended, so a
guide import that corrected it could leave the dashboard wrong for
hours. Re-ask at once on EpgService.epgAvailable$ (guide import or
source change), and at least every five minutes
(LIVE_EPG_MAX_ANSWER_AGE_MS) for changes that arrive by other paths.
- The source-expiry clock scheduled from its last tick, so facts that
arrived long after it could be scheduled up to an hour late. Schedule
from Date.now().
- The expiry timer stayed armed while the page was hidden. Arm none until
the page is visible again; becoming visible moves the clock at once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>