OptionalauthoritativeOptionalscheduleServer-emitted schedule-block boundary crossing for a single
(connection, campaign) pair. Present ONLY when the pipeline
observed the campaign's current block change since the last
tick — steady-state ticks omit this field.
Emitted by the pipeline-side tick loop
(packages/api/websocket/src/shared/schedule-transitions.ts in
playlive-unified-data-pipeline) with a tickType of
"schedule-transition". Overlays that want to react
(invalidate a REST cache, cross-fade a segment banner, etc.)
should read store.lastScheduleTransitions[campaignID] or
subscribe via useOnScheduleTransition from
@playlive/react-pipeline.
Slice keys in this tick whose per-campaign arrays are the complete current list for every campaign key they contain.
Consumers replace those slots wholesale instead of merging by row id, so a row deleted upstream actually disappears from the overlay. Slices not named here (and every tick from a server that predates this field) keep the legacy additive merge.
Why this exists
Tick slices were historically merged by row id, because the pipeline's producers caught upstream errors and returned
[]— indistinguishable from "this campaign really has no rewards". A wholesale replace would therefore have blanked overlays on any transient Tiltify blip. The cost was that deletion had no wire representation at all: overlays kept rendering rewards, milestones and targets that had been removed upstream until they reloaded.The producers now omit a campaign key entirely when its fetch failed (see
fetchCampaignSliceinpackages/api/websocket/src/tiltify/slice-fetch-result.tsinplaylive-unified-data-pipeline), so "absent" means "unknown" and "present" means "complete" — which is exactly the guarantee wholesale replacement needs.Chunked ticks
A slice whose rows exceed the API Gateway 128 KB frame limit is split across several ticks. Only the first chunk is marked authoritative; the rest merge on top of it. That makes the frames order-dependent, which is safe over a single WebSocket connection (the producer awaits each send in turn). If frames ever did land out of order the overlay would show a short slice until the next tick corrected it — degraded, then self-healing, never corrupt.
Older clients ignore this field and keep merging — safe to roll out ahead of, or behind, the pipeline-side emitter.