Device Presentation owns intradayFilter, a boolean stored in devices.presentation.
The editor labels it Hide expired items. The default is false, including existing
rows without the key and malformed stored values. Saving an unchecked checkbox writes false.
Sources own temporal windows, content, domain selection, and candidate coverage.
The parent owns whether this device displays expired candidates. Filtering consumes
validated, normalized [startsAt, expiresAt) windows, so this policy needs no source
kind, caption interpretation, timezone arithmetic, or SDK change.
lib/presentation.ts:filterPresentedItems retains items with expiresAt > now
when enabled; when disabled it retains all returned items. It does not promise
rest-of-day retention: candidate coverage is still source-owned.
lib/sourceClient.ts:composeDeviceItems applies the predicate after validation
and chronological composition, using one Unix-second clock snapshot per invocation.
IDs, ordering and effective-source diagnostics remain unchanged. Invalid output and
source failures still fail composition, even if filtering would hide every item.
Both resolver aliases, browser preview, and reminder composition use this seam. The reminder builder supplies device presentation and its build clock; upcoming reminder eligibility is unchanged. The setting is removed from the native presentation envelope and never forwarded as a source setting. Widget schema 3 / presentation version 2 remain unchanged.
Verify with tools/intraday-filter-check.ts and tools/presentation-check.ts.
The former cleans up a disposable device, mocks source read responses, and checks
persistence, resolver/preview parity, temporal boundaries, ordering and failures.
NFL, CFB, WNBA and Women's FIBA accept only teams. The retired source key is
rejected on reads and settings validation, whether true or false; no adapter or
fallback exists. Moon, Lunar and GTB have empty settings and also reject unknown keys.
Source candidates retain their existing date coverage and per-team next-game selection;
filtering does not refill a selection.
Sports captions and device visibility follow the same published window. Stored final status no longer overrides phase: without an actual end timestamp it cannot establish a different temporal bound. Typical durations remain source-owned. An early-finished game therefore remains current until its estimated expiry; no end time is fabricated.
tools/source-intraday-cutover-check.ts verifies live descriptors, stored schema
snapshots, source forms, rejection of retired settings, every saved assignment, and
device composition. tools/remove-source-intraday.ts owns the one-time assignment
cleanup; it preserves teams and device presentation. The cutover completed 2026-09-15:
eight assignment keys and four schema properties removed; source main snapshots
NFL 18, CFB 15, WNBA 16, WFIBA 53.
The existing timestamp-only source normalization is separate from this retirement. Lunar still publishes its noon timestamp at the 2026-09-15 audit and is normalized to a one-second window. Its whole-day window upgrade remains separate source work; the parent must not invent a duration for it.