SRS: UC_4.5.1 — Live Broadcast
UC_4.5.1: Live Broadcast
| Field | Value |
|---|---|
| BA in Charge | Anh Hoang |
| Date Created | 2026-08-10 |
| Version | v3 |
| Document References | RFQ_ Website and Dashboard Implementation V7.pdf (§Community Page Implementation — Live Broadcast Player) · Zapier Integration V7.pdf (§3.1 Table C — Global_Variables) · RFQ_ Stack Trading Prop Tech V7.pdf (§3.2.1.A — COMMUNITY_LIVE event) · Broadcast, Settings_Market Data.docx (§Broadcast Changes 1–2) |
Document References
| # | Original Document | Key Sections Used |
|---|---|---|
| 1 | RFQ_ Website and Dashboard Implementation V7.pdf | §Community Page Implementation — Live Broadcast Player (youtube_id from GET /community/live-broadcast, ?rel=0&modestbranding=1, native YouTube chat hidden, "Live Broadcast Offline" countdown state) |
| 2 | Zapier Integration V7.pdf | §3.1 Table C — Global_Variables (Active_Broadcast_URL, Broadcast_Is_Live) |
| 3 | RFQ_ Stack Trading Prop Tech V7.pdf | §3.2.1.A — COMMUNITY_LIVE global webhook event |
| 4 | QnA from clients — STAGE 2: Community & Live Broadcast | Client-confirmed answers on Definition, Trigger, Business logic, UI/UX, Endpoints, Zapier table (Stage 2 - Dashboard & Fomula (Community).csv, rows C-1 → C-8; Adrian Stack, 2026-08-04 → 2026-08-12) |
| 5 | Broadcast, Settings_Market Data.docx | §Broadcast Changes 1 — Zapier Table C addition (Broadcast_Title, Broadcast_Schedule) · §Broadcast Changes 2 — Endpoint replacement (schedule[] replaces next_broadcast_timestamp) |
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.5.1 |
| Use Case | Live Broadcast |
| Description | On the Community page, the trader watches the Stack Trading YouTube livestream inside an embedded native YouTube iframe player without leaving the Dashboard. When no session is live, the widget renders a "Live Broadcast Offline" state with a countdown to the next scheduled session, derived from the schedule[] array. Broadcast state is controlled manually by Operations through Zapier Table C. The widget is identical for SIM (Evaluation) and LIVE (funded) accounts — same stream, same access, no gating (Ref: BR_4.5.1.1). |
| Zapier Flow | — |
| Zapier Table | Table C — Global_Variables (Active_Broadcast_URL, Broadcast_Is_Live, Broadcast_Title, Broadcast_Schedule) |
| 3rd Party | YouTube (native <iframe> embed — player, controls, adaptive bitrate and error overlays are all handled by YouTube) |
References/Wireframe/Stage 2/Community & Live Broadcast/Community (with data).webp Community page, broadcast Live — player + title header + Live badge + session schedule bar.
References/Wireframe/Stage 2/Community & Live Broadcast/Community (no data).webp Community page, broadcast Offline — countdown state.
2. Trigger
- The trader navigates to the Community page via the Community tab in the persistent sidebar (Ref: UC_4.1.2 §2 Screen Description) → frontend calls
GET /community/live-broadcast. - The client-side countdown reaches
00:00:00→ frontend callsGET /community/live-broadcastexactly once more (Ref: BR_4.5.1.3).
3. Pre-conditions
- The user is authenticated and is on the Community page. No further condition applies — account type (SIM / LIVE), level, and account status are irrelevant (Ref: BR_4.5.1.1).
- Operations has populated Zapier Table C with the current values of
Active_Broadcast_URL,Broadcast_Is_Live,Broadcast_Title, andBroadcast_Schedule(Ref: BR_4.5.1.2).
4. Post-conditions
- The widget renders in exactly one of four states: Live player, Offline — countdown running, Offline — countdown held at
00:00:00, or Offline —TBD(Ref: BR_4.5.1.4). - The
Livebadge and every schedule-bar dot render in the colour that matches the current broadcast state — red only while live, grey otherwise (Ref: BR_4.5.1.10). - If the trader entered the page while a broadcast was live, the Newsquawk audio stream in the persistent header is Off (Ref: BR_4.5.1.11).
5. Basic Flow — Broadcast Live
- The Community page renders. The frontend calls
GET /community/live-broadcast. - The backend reads Zapier Table C and responds
200 OKwith{ youtube_id, is_live, title, schedule[] }. The response is returned for any authenticated user; there is no middleware gate and no SIM/LIVE branching (Ref: BR_4.5.1.1, BR_4.5.1.2). is_live == true→ the frontend mounts a plain HTML<iframe>populated withyoutube_id, applying the required embed parameters (Ref: BR_4.5.1.5).- The frontend renders the
titlevalue returned by the API in the header above the player (Ref: BR_4.5.1.7) and displays theLivebadge in its red live state (Ref: BR_4.5.1.10). - The Newsquawk audio stream in the persistent header automatically switches to Off so that it does not overlap the broadcast audio (Ref: BR_4.5.1.11).
- The player displays the thumbnail configured on the YouTube video until the user starts playback. All playback interaction — play, volume, seek, closed captions, quality, fullscreen — is handled natively by the YouTube control bar (Ref: BR_4.5.1.5).
- The session schedule bar renders below the player by iterating the
schedule[]array, as static, non-interactive content. The dot of the block that contains the current time renders red; every other dot renders grey (Ref: BR_4.5.1.9, BR_4.5.1.10). - At the end of the session, Operations sets
Broadcast_Is_Live = falsein Table C. While the trader keeps the page open, the frontend does not detect this change and continues showing the mounted iframe, where YouTube renders its own end-of-stream overlay. The widget returns to the Offline state (Ref: §6) on the next page load or the next navigation into the Community page (Ref: BR_4.5.1.3).
6. Alternative Flow — Broadcast Offline
Applies when the response returns is_live == false. The Play component is hidden entirely and no thumbnail is rendered in any of the three sub-states below; the frame and container size stay unchanged so the page grid does not shift. The Live badge renders in its grey offline state as Live Broadcast Offline, and every schedule-bar dot renders grey (Ref: BR_4.5.1.4, BR_4.5.1.10).
6.1 — Countdown running (schedule[] contains at least one entry)
- The frontend renders the
Live Broadcast Offlinestate. - The frontend iterates
schedule[], compares each entry against the current time, and selects the next upcoming slot. If every slot for the current day has already passed — including the case where the array holds a single entry — the timer rolls over and counts down to that slot on the following day. The timer is never disabled whileschedule[]has data (Ref: BR_4.5.1.4). - The countdown is computed once, at page load, and ticks down locally.
- The supporting lines
Market opens soonandNext session starts at [hh:mm CST]are displayed, the latter showing thetimevalue of the selected slot. - The session schedule bar renders below the frame with all dots grey (Ref: BR_4.5.1.9).
6.2 — Countdown reaches 00:00:00
- The frontend calls
GET /community/live-broadcastexactly once. - [If
is_live == true] → the widget transitions to §5 step 3 and mounts the player. - [If
is_live == false] → the countdown is held at00:00:00, the supporting line changes toStarting soon, and theNext session starts at [hh:mm CST]line is hidden. The schedule bar stays visible with all dots grey. No further request is made until the page is reloaded.
6.3 — No session scheduled (schedule[] is empty or absent)
- The frontend renders
TBDin place of the numeric timer. - The supporting line reads
Next session to be announced, and theNext session starts at [hh:mm CST]line is hidden. - The session schedule bar is hidden entirely — there is no schedule data to render (Ref: BR_4.5.1.9).
7. Exceptional Flow
- [If a client-side extension (ad-blocker) prevents the iframe from mounting] — the frontend renders a static text block inside the video frame container:
Please disable ad-blockers to view the live broadcast. The title header,Livebadge, and session schedule bar remain unchanged (Ref: BR_4.5.1.6). - [If
Active_Broadcast_URLholds an invalid ID or points to a deleted video] — no server-side validation is performed. The iframe mounts and YouTube displays its own "Video unavailable" error. Operations corrects the value directly in Table C (Ref: BR_4.5.1.5). - [If the stream drops mid-session or the trader's connection is slow] — no custom detection, fallback UI, network warning, or quality downgrade is built. YouTube's native loading/error overlay and adaptive bitrate streaming handle both cases (Ref: BR_4.5.1.5).
- [If the trader switches to another browser tab while playing] — playback is not auto-paused; the iframe keeps streaming audio in the background per standard browser behaviour (Ref: BR_4.5.1.5).
8. Business Rules
BR_4.5.1.1: Universal Access — No Account-Type or Account-Status Gating
Live Broadcast is a universal community feature. GET /community/live-broadcast returns 200 OK for any authenticated user, and there is no middleware gate, no account_status field, and no SIM/LIVE differentiation logic anywhere in the request path.
- SIM (Evaluation) accounts see the widget fully unlocked — there is no hidden state, no locked state, and no upsell/"Unlock when you go Live" placeholder.
- SIM and LIVE traders watch the exact same stream. The backend serves a single global
youtube_idfor the entire platform; there is no per-level or per-account-type content separation. - Account risk status does not affect this widget. A SIM trader under Soft Breach (Ref: UC_4.10.1), under Hard Breach, or who has failed the Associate Track still sees and uses Live Broadcast normally — breach enforcement restricts trading only, not community content.
BR_4.5.1.2: Manual Broadcast Control via Zapier Table C
Broadcast state is controlled entirely by manual Operations input on Zapier Table C — Global_Variables (Source: Zapier Integration V7.pdf §3.1 Table C). No automated YouTube Data API listener is built for this release.
| Table C variable | Type | Meaning |
|---|---|---|
Active_Broadcast_URL | String | The YouTube Video ID of the current stream. Surfaced to the frontend as youtube_id. |
Broadcast_Is_Live | Boolean | Toggles player visibility. Surfaced to the frontend as is_live. |
Broadcast_Title | String | The display title of the active broadcast. Surfaced to the frontend as title (Ref: BR_4.5.1.7). |
Broadcast_Schedule | JSON Array | The day's programming, e.g. [{"time": "08:00 CST", "label": "THE OPEN"}, {"time": "10:00 CST", "label": "THE GAP"}]. Surfaced to the frontend as schedule (Ref: BR_4.5.1.9). |
API contract. GET /community/live-broadcast returns:
{ "youtube_id": "string", "is_live": boolean, "title": "string", "schedule": [ { "time": "string", "label": "string" } ] }There is no next_broadcast_timestamp field and no provider field. The countdown is derived on the frontend from schedule[] (Ref: BR_4.5.1.4); the provider is hardcoded to YouTube for the day-1 launch, so no provider column is added to Table C.
- The schedule is entered manually in Table C by Operations; there is no synchronisation from Google Calendar or any external CMS. Operations is responsible for updating it when a session concludes.
- No broadcast scheduling database is built. Table C holds only the current day's programming. When the day's sessions end, Operations overwrites
Broadcast_TitleandBroadcast_Schedulewith those of the following day. - Whether Operations changes
Active_Broadcast_URLbetween sessions or keeps one persistent stream key and only togglesBroadcast_Is_Liveis an operational choice. The frontend renders whicheveryoutube_idthe endpoint currently returns and does not need to distinguish the two cases. - Only one global broadcast can exist at any moment: the endpoint returns a single JSON object containing exactly one
youtube_id, so two simultaneous broadcasts are not representable. - Automatic live-status detection through the YouTube Data API is explicitly out of scope for this release and is registered as a Day-2 item requiring its own Change Request.
BR_4.5.1.3: Two-Call API Contract — No Polling, No WebSocket
The frontend calls GET /community/live-broadcast in exactly two situations, and no others:
- On the initial load of the Community page.
- Exactly once, at the moment the client-side countdown reaches
00:00:00, to check whether the state has transitioned to live.
Continuous polling and a dedicated WebSocket channel for this widget are both prohibited, in order to avoid unnecessary server load.
Consequence — session end is not auto-detected mid-view. Because no further request is issued while the page stays open, the frontend cannot observe Operations setting Broadcast_Is_Live = false during a session. A trader who is watching when the session ends keeps the mounted iframe and sees YouTube's native end-of-stream overlay; the widget only returns to the Offline countdown state on the next page load or the next navigation into the Community page. This is accepted behaviour for this release, not a defect.
BR_4.5.1.4: Offline State Matrix and Countdown Computation
The countdown is derived from the schedule[] array, not from a server-supplied timestamp field. At page load the frontend iterates schedule[], compares each entry's time against the current time, selects the next upcoming slot, and counts down to it locally. It is a one-time client-side computation and is never re-synchronised with the server (Ref: BR_4.5.1.3).
- Roll-over: if every slot in
schedule[]has already passed for the current day — including the case where the array holds a single entry — the timer counts down to that same slot on the following day. The timer is never disabled whileschedule[]has data. TBDapplies only whenschedule[]itself is empty or absent. A schedule that is merely fully elapsed is not aTBDstate; it rolls over per the rule above.
| Condition | Timer display | Supporting line | Next session starts at [hh:mm CST] line | Session schedule bar |
|---|---|---|---|---|
is_live == false, schedule[] has at least one entry | Live countdown (hh:mm:ss) | Market opens soon | Displayed | Displayed, all dots grey |
Countdown reached 00:00:00, verification call returns is_live == false | Held at 00:00:00, not ticking | Starting soon | Hidden | Displayed, all dots grey |
schedule[] empty or absent | TBD | Next session to be announced | Hidden | Hidden entirely (Ref: BR_4.5.1.9) |
In the first two Offline sub-states the existing offline frame layout is preserved — the container keeps its size and the session schedule bar stays in place — so that the page grid does not break. No complex error state is introduced for a late broadcast.
⚠️ Open item — time basis of the schedule entries. The client's answer describes the frontend comparing each
schedule[]entry against the current server time, but the replacement payload carries no server-time field, and the earlier confirmed behaviour (Trigger A2) is a one-time computation against the user's local machine time. In addition,timeis a display string carrying a timezone label (08:00 CST), not an ISO-8601 UTC value, so it falls outside the project timestamp standard — Ref: CR-08. To be confirmed with the client: whether aserver_time(ISO-8601 UTC) field is added to the payload, and whethertimeshould carry an explicit offset instead of theCSTlabel. Until confirmed, the frontend parsestimeas CST and counts down against local machine time, accepting clock drift.
BR_4.5.1.5: Native YouTube IFrame Embed — Player Constraints
The player is a plain HTML <iframe>. The YouTube IFrame Embed API is not used, and no custom video player UI wrapper, custom overlay, or custom control set is built. The dashboard only receives youtube_id from the endpoint and populates the iframe with it.
- Required embed parameters:
?rel=0&modestbranding=1(Source: RFQ_ Website and Dashboard Implementation V7.pdf §Community Page Implementation).rel=0is mandatory — it prevents competitor videos from being suggested when a broadcast ends.controls=1is used so that the full standard YouTube control bar is displayed: volume, seek, closed captions, quality selection, and fullscreen are all handled natively by YouTube. Native controls must not be selectively hidden. - Native YouTube chat must be completely hidden (Source: RFQ_ Website and Dashboard Implementation V7.pdf §Community Page Implementation). Chat for this page is served by the separate Discord Chat Stream component — SIM (read-only, one-way): Ref: UC_4.9.1; LIVE (two-way): Ref: UC_4.5.2 (not yet documented in this repo).
- Video quality stays auto-adaptive to the viewer's bandwidth. The resolution must not be hard-locked to 1080p, 720p, or any fixed value; YouTube's native adaptive bitrate engine manages delivery.
- No custom failure handling. Server-side validation of the video ID, custom auto-detection of a dropped stream, custom fallback UI, custom quality downgrades, and custom network warnings are all out of scope — YouTube's native loading and error overlays cover these cases (Ref: §7).
- No auto-pause on background tabs. No Intersection Observer or equivalent script is written; the iframe keeps streaming audio when the tab loses focus, which is the intended behaviour for traders watching charts in another tab.
- Mobile: the video frame keeps a standard 16:9 aspect ratio and auto-resizes. At mobile breakpoints the layout stacks vertically with the video on top and the chat panel directly below it; the horizontal session schedule bar is hidden on small screens to preserve vertical space.
BR_4.5.1.6: Ad-Blocker Fallback Container
If a client-side extension prevents the iframe from mounting, the frontend renders a basic fallback container in place of the video: a single static text block reading Please disable ad-blockers to view the live broadcast, with no icon and no action button. All surrounding elements — title header, Live badge, and session schedule bar — remain unchanged.
BR_4.5.1.7: Broadcast Title Rendering
The header text above the player is the title value returned by GET /community/live-broadcast. There is no separate CMS entry and no hardcoded label.
- Long title: the text wraps to the next line. Rendering an ellipsis (
...) is forbidden; where the text is cut, it is clipped cleanly. - Empty or
nulltitle: the text container is hidden entirely so that it leaves no blank gap — the surrounding elements close up.
BR_4.5.1.8: Session Transition — Component-Scoped Re-render
Any transition between broadcast states (Live → Offline, Offline → Live, or one session to the next) re-renders only the video component. A full page reload must not be triggered, and the sibling widgets on the Community page — Live Chat history, Pod details, and The Pit statuses — retain their active state without interruption.
There is no intermediate or post-session state: the widget moves directly between the player and the countdown state defined in BR_4.5.1.4. No Recorded / VOD badge or state exists.
BR_4.5.1.9: Session Schedule Bar — Dynamic Data, Static Behaviour
The bar below the player listing the day's sessions (for example 08:00 CST · THE OPEN and 10:00 CST · THE GAP) is a static schedule label, not a progress or seek bar. Its content is rendered dynamically by iterating the schedule[] array returned by GET /community/live-broadcast; nothing on this bar is hardcoded on the frontend.
- Data source: each element of
schedule[]renders one entry as[time] · [label]preceded by its dot.timeandlabelare both Operations-entered strings fromBroadcast_Scheduleon Table C (Ref: BR_4.5.1.2). - Capacity: the bar must render up to 4 scheduled broadcasts without the layout breaking; the container has ample room for that number.
- Label overflow: because the text is Operations-entered, each label is clipped with CSS truncation (
white-space: nowrap; overflow: hidden;). The label must not wrap to a second line and must not render an ellipsis-driven layout shift; each label slot allows roughly 10 characters before clipping. - Dot colour is state-driven, never hardcoded (Ref: BR_4.5.1.10).
- Clicking a session label does not seek or jump to a timestamp in the video. Because the player is a native YouTube iframe, all video scrubbing is handled exclusively by the YouTube control bar; no custom seeking logic is built for this component.
- The bar is hidden at mobile breakpoints (Ref: BR_4.5.1.5).
- Visibility by state: the bar stays visible while the broadcast is Live and while it is Offline with a countdown — it must not be hidden just because the video is offline. It is hidden only when
schedule[]is empty or absent (theTBDstate), because there is no schedule data to render (Ref: BR_4.5.1.4).
Note. The truncation rule above is the opposite of the rule for the broadcast title in BR_4.5.1.7 (title = wrap to the next line, never clip to one line). Two different components, two different rules — they must not be merged.
BR_4.5.1.10: Live Indicator Colour States — Badge and Schedule Dots
Both live indicators are state-driven and never hardcoded red. Red means "on air right now"; every other situation is grey.
| Indicator | Red | Grey |
|---|---|---|
Live badge above the player | is_live == true — badge reads Live | is_live == false — badge reads Live Broadcast Offline |
| Schedule bar dot | is_live == true AND the current time falls inside that specific schedule block | Every other dot; and all dots whenever is_live == false |
- At most one dot is red at any moment, since only one schedule block can contain the current time.
- If
is_live == truebut the current time falls outside every schedule block (Operations started the stream off-schedule), the badge is still red while all dots stay grey — the two indicators are evaluated independently. - No third colour and no additional state (for example
Recorded/ VOD) exists (Ref: BR_4.5.1.8).
BR_4.5.1.11: Newsquawk Audio Auto-Off on Entering Community During a Live Session
When the trader navigates into the Community page while a broadcast is running (is_live == true), the Newsquawk audio stream in the persistent header automatically switches to Off, so that the squawk audio does not overlap the broadcast audio. The trader can re-enable it manually; the widget does not fight the user's control after the auto-off, and the On/Off state resumes normal user control after navigating away from Community.
The rule is owned by BR_4.1.4.4 (UC_4.1.4 — Newsquawk Audio Stream); this rule only states the Live Broadcast side of the interaction and adds no independent behaviour.
⚠️ Alignment note. BR_4.1.4.4 as currently written triggers the auto-off on entering the Community screen at all, without checking
is_live. This rule states the narrower trigger confirmed by the BA on 2026-08-12: auto-off applies when the trader enters Community and a broadcast is live. BR_4.1.4.4 needs the same condition added so the two documents do not diverge.
9. Screen Description
| No. | Field Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Broadcast Title | Label | Displaying rule:- Renders the title value from GET /community/live-broadcast. Displayed in every widget state.- Overflow: Wrap text, clipped cleanly where cut. Ellipsis (...) is forbidden.- Hidden entirely (container removed, no blank gap) when title is empty or null. Ref: BR_4.5.1.7.Behaviour rule:- Read-only. No user interaction. |
| 2 | Live badge | Badge | Displaying rule:- Possible values: Live (shown when is_live == true) · Live Broadcast Offline (shown when is_live == false).- Colour is state-driven, never hardcoded: red when is_live == true, grey when is_live == false. Ref: BR_4.5.1.10.- No Recorded / VOD value exists. Ref: BR_4.5.1.8.Behaviour rule:- Read-only. No user interaction. |
| 3 | Video Player | Embedded Media Player (iframe) | Displaying rule:- Rendered only when is_live == true; the Play component is hidden entirely when is_live == false, with no thumbnail in that state.- Plain HTML <iframe> populated with youtube_id, using ?rel=0&modestbranding=1 and controls=1. Full native YouTube control bar displayed. Native YouTube chat hidden. Ref: BR_4.5.1.5.- Before playback starts, displays the thumbnail configured on the YouTube video.Behaviour rule:- All playback interaction (play, volume, seek, closed captions, quality, fullscreen) is handled natively by YouTube. The dashboard adds no controls of its own.- Keeps streaming when the browser tab is in the background. |
| 4 | Countdown Timer | Label | Displaying rule:- Rendered only when is_live == false.- Format hh:mm:ss while counting down; 00:00:00 held static after the verification call returns is_live == false; TBD when schedule[] is empty or absent. Ref: BR_4.5.1.4.- Overflow: not applicable — fixed-length values only.Behaviour rule:- Derived once client-side at page load by selecting the next upcoming slot in schedule[], then ticked down locally; never re-synchronised with the server. Rolls over to the following day when every slot has passed. Ref: BR_4.5.1.3, BR_4.5.1.4.- On reaching 00:00:00, triggers exactly one GET /community/live-broadcast call.- Read-only. No user interaction. |
| 5 | Offline supporting text | Label | Displaying rule:- Rendered only when is_live == false. Exactly one value per state: Market opens soon (countdown running) · Starting soon (held at 00:00:00) · Next session to be announced (schedule[] empty or absent).- A second line Next session starts at [hh:mm CST] is displayed only while the countdown is running — showing the time of the selected slot — and hidden in the other two states. Ref: BR_4.5.1.4.- Overflow: Wrap text.Behaviour rule:- Read-only. No user interaction. |
| 6 | Session Schedule Bar | Label | Displaying rule:- Rendered dynamically by iterating the schedule[] array; one entry per element as [time] · [label] with a leading dot (for example 08:00 CST · THE OPEN, 10:00 CST · THE GAP). Supports up to 4 entries without breaking.- Displayed while Live and while Offline-with-countdown; hidden when schedule[] is empty or absent (TBD state); hidden at mobile breakpoints. Ref: BR_4.5.1.9.- Dot colour: red only when is_live == true AND the current time falls inside that block; grey in every other case. Ref: BR_4.5.1.10.- Overflow: Clip (white-space: nowrap; overflow: hidden;) — no wrapping to a second line, roughly 10 characters per label before clipping.Behaviour rule:- Non-interactive. Clicking a session label performs no action and does not seek within the video. Ref: BR_4.5.1.9. |
| 7 | Ad-blocker fallback text | Label | Displaying rule:- Rendered inside the video frame container, replacing the player, only when a client-side extension prevents the iframe from mounting. Exact text: Please disable ad-blockers to view the live broadcast. No icon, no action button.- Overflow: Wrap text. Ref: BR_4.5.1.6.Behaviour rule:- Read-only. No user interaction. |
Related behaviour owned elsewhere: when the trader navigates into this screen while a broadcast is live, the Newsquawk audio stream in the persistent header switches to Off automatically so that it does not overlap the broadcast audio. That rule is owned by BR_4.1.4.4; its Live Broadcast side is stated in BR_4.5.1.11.
Changelog
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-08-10 | v1 | Initial document | — | — | Created via Init Flow (Auditor → Challenger → Architect). Content sourced from client-confirmed answers in Stage 2 - Dashboard & Fomula (Community).csv rows C-1 → C-8 and BA decisions recorded in QnA_init_docs.md. BR_4.5.1.9 session-label data source left open pending client (A-03). |
| 2026-08-12 | v3 | Payload migration next_broadcast_timestamp → schedule[] (§1, §2, §3, §5, §6, BR_4.5.1.2, BR_4.5.1.4, §9 rows 4–6); BR_4.5.1.9 rewritten; new BR_4.5.1.10, BR_4.5.1.11 | Payload { youtube_id, is_live, title, next_broadcast_timestamp }; countdown computed from a single timestamp; TBD when next_broadcast_timestamp == null; schedule bar displayed in every state with an open item on its data source; badge/dot colours unspecified; Newsquawk auto-off mentioned only as a note under §9 | Payload { youtube_id, is_live, title, schedule[] } — next_broadcast_timestamp and any provider field removed; Table C gains Broadcast_Title + Broadcast_Schedule; countdown derived by iterating schedule[] with day roll-over; TBD only when schedule[] is empty/absent, and the schedule bar is hidden in that state; schedule bar rendered dynamically, max 4 entries, labels clipped nowrap at ~10 chars (never wrapped); new BR_4.5.1.10 (badge + dot red only while live, grey otherwise); new BR_4.5.1.11 (Newsquawk auto-off on entering Community during a live session) | Client-confirmed 2026-08-10 (Adrian Stack) in Stage 2 - Dashboard & Fomula (Community).csv — Trigger A7, Business logic A1, UI/UX A6–A7, Endpoints A3, Zapier table A3; source Broadcast, Settings_Market Data.docx §Broadcast Changes 1–2. BA-confirmed 2026-08-12 from the Figma design review — UI/UX A8–A9 and Business logic A11 of the same CSV. BR_4.5.1.9 open item (session-label data source, A-03) is now closed. Two new open items raised: time basis of schedule[].time (no server-time field, CST display string vs CR-08 UTC) in BR_4.5.1.4, and the unconditional wording of BR_4.1.4.4 in BR_4.5.1.11. |
| 2026-08-10 | v2 | BR_4.5.1.5 — Discord Chat Stream cross-ref; BR_4.5.1.1 — Soft Breach cross-ref | "Chat for this page is served by the separate Discord Chat Stream component (Ref: UC_4.5.2 — LIVE only, not yet documented in this repo)"; Soft Breach linked as UC_4.9.1 | Chat ref split by account type — SIM (one-way, read-only) links to the now-published UC_4.9.1_v1.md, LIVE (two-way) stays a placeholder at UC_4.5.2; Soft Breach ref renumbered to UC_4.10.1 | UC_4.9.1 SRS created (Init Flow — Agent 3). Follows the BA renumber of 2026-08-10 (SIM Soft Breach UC_4.9.1 → UC_4.10.1). No behavioural change in this document. |