fleetGames.spectatorStudio({ orgId }), which returns a
broadcasts array. The screen renders those records directly — it does
not synthesise stream names, viewer counts, or ladder rungs when a field
is absent.
This page documents the shape of a broadcast record, how each panel
reads it, and what the screen does when a field is missing.
What a broadcast record contains
Each entry inbroadcasts maps to one row in the Eligible to
promote list and, when selected, to the On air panel. The screen
accepts two names for several fields and takes whichever is present.
A ladder rung is its own small record:
How a broadcast becomes eligible to promote
The Eligible to promote list is thebroadcasts array, unfiltered
and in the order the control plane returned it. There is no client-side
filter or sort step: if a broadcast is in the response, it is in the
list. The Mode filter chip in the panel header is rendered in its
inactive state and is not wired to a filter.
If the response contains no broadcasts, the panel shows No broadcasts
eligible for promotion. rather than an empty box.
What promoting a broadcast does
The Promote button sets the screen’s local selection to that broadcast’s match id. That selection controls which record feeds the On air panel and which row shows theON AIR tag instead of a Promote
button. It issues no mutation — nothing about the broadcast changes in
ClutchCall’s control plane when you promote from this screen, and the
selection resets when the screen unmounts.
If nothing has been selected yet, the On air panel falls back to the
first record in broadcasts. If the array is empty, the panel renders
its empty state: hint No active broadcast, no LIVE tag, and a stream
frame that is not marked live.
The Cut, Cut to replay, Featured carousel, and Add slot
controls are present but disabled on this screen.
Reading the on air panel
The panel header hint readsmode · region · <viewers> viewers, where
the viewer figure is the record’s viewer_count rendered with
toLocaleString(). A LIVE tag appears whenever a broadcast is selected.
The stream frame below it shows three values taken straight from the
record:
- Label —
label, orquality_label, or the literalLive broadcastwhen a broadcast is selected but neither field is set. - Stream —
stream_name, ormoq_namespace. - Time-to-glass —
latencyortime_to_glass_ms, printed as<n> ms time-to-glass.
The bitrate ladder
Under the stream frame, each rung of the selected broadcast’s ladder renders as one row: rung name, a fill bar, the rung bitrate in Mbps, and the rung’s viewer figure. The fill bar’s width is the rung’sfill_pct as reported by the control
plane. The screen clamps it into the range 0–100 and applies no other
transformation — it does not compute fill from the viewer counts or the
bitrate. A rung whose fill_pct is absent renders as an empty bar.
Rungs are drawn in the order they appear in the array. The panel’s
caption — drop a rung to relieve egress — describes the intent of the
ladder view; dropping a rung is not an action this screen performs.
When the selected broadcast has no ladder (or bitrate_ladder), or
the array is empty, the section shows No bitrate ladder reported.
Viewer count and edge cache panels
Two panels sit below the carousel:- Viewer count · last 30 min renders a fixed empty state, No
broadcast sessions yet. The
spectatorStudioresponse carries a per-broadcastviewer_count, but no viewer time series, so the chart has no series to draw. - Cache hit ratio · per PoP renders one bar per point of presence from a list that is currently empty, so the panel draws no rows.
When a field reports no value
The screen prefers a visible placeholder over an invented value, but the placeholder differs by field:
A viewer count of
0 in the UI therefore means either “no spectators”
or “the record omitted viewer_count”. Check the raw response if the
distinction matters.
Refresh cadence
The query refetches every 30 seconds while the screen is mounted, and only runs once an org id is resolved. The header showsRefreshing…
during a fetch and otherwise Updated <relative time>, derived from
when the query data last changed. The refresh button forces a refetch
and is disabled while one is in flight.
Changing the selected broadcast does not refetch; a refresh keeps your
selection as long as that match id is still present in the new response,
and otherwise falls back to the first record.
Related
- Telemetry — the metric, trace, and CDR streams behind operational panels
- Authentication — API keys for control-plane calls, relay tokens for MoQT namespaces

