SRS: Dashboard - Common (UC 4.1.1–4.1.5)
| Field | Value |
|---|---|
| BA in Charge | Trang Nguyen |
| Date Created | 2026-08-06 |
| Version | v23 |
| Document References | RFQ_ Website and Dashboard Implementation V7.pdf (§Part C: Trader Dashboard Implementation, Key Features) · RFQ_ Stack Trading Prop Tech V7.pdf (§12 Audio Security, §MARKET_STATUS_UPDATE/NOTIFICATION WS events) · Zapier Integration V7.pdf (§3.6 Table I — Platforms and Gateway Registry, Flow 24 — Overnight Margin & Swap Monitor) · BA confirmation 2026-09-03 (Newsquawk embedded-widget architecture, long-lived token, default-Off, auto-mute) |
UC Index
| UC_ID | Use Case Name | Business Description |
|---|---|---|
| UC_4.1.1 | Dashboard Layout | Overview-level description of the overall dashboard screen layout (persistent header + sidebar + content area) as an umbrella structure; maps each layout region to its owning child UC, split by SIM vs LIVE account type where applicable. |
| UC_4.1.2 | Sidebar Navigation | Overview-level description of the persistent sidebar: expand/collapse toggle, tab list mapped to destination UCs, and the utility icons (Support, TV Terminal, User menu) at the foot of the sidebar. |
| UC_4.1.3 | Market Status Widget | A countdown widget to a mandatory position-close event caused by overnight margin/swap risk, driven by Zapier Flow 24 (Overnight Margin & Swap Monitor). |
| UC_4.1.4 | Newsquawk Audio Stream | Streams the authenticated Newsquawk audio feed (Squawk Relay) to the dashboard via a token-authenticated audio player. |
| UC_4.1.5 | Launch Trading Terminal | Shows a "Launch TV Web Terminal" action in the persistent sidebar only when the user's selected trading platform is TradingView. |
Global Shell
UC_4.1.1 — Dashboard Layout
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.1.1 |
| Use Case | Dashboard Layout |
| Description | Overview-level description of the overall Dashboard screen layout only — a persistent header, a persistent sidebar, and a main content area. This UC does NOT own the Trigger/Basic Flow of the content it hosts; each region's detailed behavior is defined by its own child UC (UC_4.1.2, UC_4.1.3, UC_4.1.4, UC_4.1.5), plus SIM/LIVE-specific widgets owned outside this document (UC_4.7.1–UC_4.7.5 SIM / UC_4.12.1–UC_4.12.6 LIVE — see §2). |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Rithmic (Futures signature-gate) · MT5 / TraderEvolution (Forex signature-gate) |
References/Wireframe/Stage 2/Dashboard/Dashboard.png Overall dashboard layout — persistent header (top), persistent sidebar (left), main content area (right/center).
2. Screen Description
| No. | Field Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Persistent Header | Label | Displaying rule:- Daily Loss Limit Bar — a progress bar showing the trader's remaining Daily Loss Limit budget for the day. Owned outside this document, split by account type: SIM: Ref: UC_4.7.5 (Daily loss limit bar — Persistent Global Header). LIVE: Ref: UC_4.12.5 (Daily loss limit, not yet documented in this repo). - Permission impact — Hard Breach / Soft Breach / Frosted Glass cooling-off: in all 3 statuses, this bar keeps displaying the state/value it held right before the breach — it does not update further while the account is in any of these 3 statuses (Source: BA/client direct instruction, 2026-08-17).- Market Status Widget — a countdown to the next mandatory position-close/lockout event driven by overnight margin/swap risk. Same UC for both account types: Ref: UC_4.1.3. - Permission impact — Hard Breach / Soft Breach / Frosted Glass cooling-off: in all 3 statuses, market warnings keep updating normally via the MARKET_STATUS_UPDATE websocket event — this widget is never affected by account breach status (Source: BA/client direct instruction, 2026-08-17).- Newsquawk Audio Stream player — an On/Off control for the embedded Newsquawk audio widget (defaults to Off at login). Same UC for both account types: Ref: UC_4.1.4. - Permission impact — Hard Breach / Soft Breach / Frosted Glass cooling-off: in Soft Breach, the On/Off toggle stays available to the user as normal. In Hard Breach or Frosted Glass cooling-off, the stream defaults to Off and can only be turned back on once the user resets/rebuys the account, or once the 48h countdown ends (Source: BA/client direct instruction, 2026-08-17).- Days Remaining counter — a countdown of days left before the trader's challenge/account expires; shows a pulse/glow + "Extend Time" button when under 10 days remain. SIM: Ref: UC_4.7.4 (not yet documented in this repo). LIVE: Ref: UC_4.12.1 (not yet documented in this repo). - Permission impact — Hard Breach / Soft Breach / Frosted Glass cooling-off: in all 3 statuses, the countdown keeps running normally — it is never paused or affected by breach status (Source: BA/client direct instruction, 2026-08-17).- Notification bell — unread-count badge that opens a dropdown panel; the panel itself is the full paginated notification history (no separate "View All" page or link). SIM: bell/badge/panel-open owned by UC_4.7.1; panel's filters owned by UC_4.7.2; panel's list/pagination/mark-as-read owned by UC_4.7.3. LIVE: Ref: UC_4.12.4 (not yet documented in this repo). - Permission impact — Hard Breach / Soft Breach / Frosted Glass cooling-off: in all 3 statuses, the user can still view the notification list and keep receiving notifications normally (Source: BA/client direct instruction, 2026-08-17). |
| 2 | Persistent Sidebar | Label | Displaying rule:- Left region, always visible across all content-area tabs. Hosts the sidebar tab list, the expand/collapse toggle, and the footer utility icons (Support, TV Terminal, User menu). Full behavior owned by UC_4.1.2 — see that UC's own Screen Description. Same structure for both SIM and LIVE account types. |
| 3 | Main Content Area | Label | Displaying rule:- Center/right region. Renders the page matching the sidebar's currently active tab Command.. Chart/table mapping per WBS (STAGE 2: DASHBOARD - COMMON / SIM / LIVE): - Position Monitor Table — same UC both account types: Ref: UC_4.2.1 (not yet documented in this repo). - The Pulse — same UC both account types: Ref: UC_4.2.2 (not yet documented in this repo). - Equity Curve — same UC both account types: Ref: UC_4.2.3 (not yet documented in this repo). - Profit Factor — same UC both account types: Ref: UC_4.2.4 (not yet documented in this repo). - Win Rate — same UC both account types: Ref: UC_4.2.5 (not yet documented in this repo). - PnL Gauge — SIM: Ref: UC_4.8.1. LIVE: Ref: UC_4.12.2. - Level Progression — SIM: Ref: UC_4.8.2. LIVE: Ref: UC_4.12.6. - The Desk Manager — SIM: Ref: UC_4.8.3. LIVE: Ref: UC_4.12.3.- Permission impact — Hard Breach / Soft Breach / Frosted Glass cooling-off: in all 3 statuses, this area keeps displaying the last available data the user has (Source: BA/client direct instruction, 2026-08-17). |
UC_4.1.2 — Sidebar Navigation
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.1.2 |
| Use Case | Sidebar Navigation |
| Description | Defines the persistent sidebar tab list hosted insideUC_4.1.1's layout. Selecting a tab navigates to the corresponding page; this UC does not describe the content or business rules of the destination page itself. The sidebar itself is never locked by account status: it stays fully operable (tab navigation, expand/collapse, footer icons) even when the trader's account has hit Max Drawdown/Hard Breach, or is in a Frosted Glass cooling-off period — consistent with the sidebar-stays-interactive precedent already confirmed elsewhere in this repo for the Frosted Glass overlay (Ref: BR_4.11.2.12 — "the sidebar navigation and the sidebar user chip (including Logout) remain interactive, so the trader is never trapped with no exit") (Source: BA/client direct instruction, 2026-08-17). |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | — |
References/Wireframe/Stage 2/Dashboard/Dashboard - navigation expanded.png Sidebar shown in its expanded state.
2. Screen Description
| No. | Field Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Logo (Collapse/Expand trigger) | Icon/Button | Displaying rule:- The brand logo at the top of the sidebar, paired with a collapse arrow icon next to it. Not a navigation tab.Behaviour rule:- To expand (collapsed → expanded): click the logo, or click any blank/empty area within the sidebar menu.- To collapse (expanded → collapsed): click the collapse arrow icon next to the logo.- Pure UI state toggle — does not navigate to any UC and does not change the active tab. |
| 2 | Sidebar Tab List | Tab | Displaying rule:- Exactly one tab shown as active at any time, matching the currently rendered route (updates immediately on navigation, including browser back/forward and deep links).- Each tab is a destination page owned by its own UC outside this document. Tab → owning UC mapping per WBS: - Command → the Dashboard Global Shell UCs. Common: UC_4.1.1–UC_4.1.5. SIM: UC_4.7.1–UC_4.7.5 (Notification Center, Countdown Timer, Daily loss limit bar). LIVE: UC_4.11.1–UC_4.11.6 (Countdown Timer, PnL Gauge, The Desk Manager, Notification Center, Daily loss limit, Level Progression). - Level → the Level Overview screen: LIVE Ref: UC_4.12 (Levels module). SIM analog Level Progression: UC_4.8.2 (SIM) / UC_4.11.6 (LIVE). (not yet documented in this repo) - Performance → Ref: UC_4.3 (12 Performance Metrics). (not yet documented in this repo) - Journal → Ref: UC_4.4 (Journal & Heatmap / Calendar). (not yet documented in this repo) - Career → Ref: UC_4.16.2 (Career & HR Widget — Employment status, Current level, Base salary, Benefits, Vacation days, Next pay date, [Manage Payouts], [View in Rippling]) and Ref: UC_4.16.1 (the Latest certificate panel on the same tab). LIVE only — a SIM trader has no Rippling record and no Career tab (Ref: BR_4.16.2.1). - Community → Ref: UC_4.5.1 (Live Broadcast), UC_4.5.4 (The Pit — Discord Server Widget); LIVE also UC_4.5.2 (Discord Chat Stream, two-way) and UC_4.13 (Pod Mentorship Module). (not yet documented in this repo)Behaviour rule:- On click: navigates to the tab's associated route. Clicking either the tab's icon or its label text triggers the same navigation — both are valid click targets, whether the sidebar is currently expanded (icon + label both visible) or collapsed (icon-only). The sidebar is a navigation shell only — all behavior after landing on the destination page is defined by that page's own UC. |
| 3 | Launch Trading Terminal (sidebar) | Button (Icon) | Displaying rule:- Opens the TV Web Terminal, conditional on platform_selection == "TradingView". Full behavior owned by UC_4.1.5. |
| 4 | Support icon (footer) | Button (Icon) | Displaying rule:- Footer utility icon, not a navigation tab.Behaviour rule:- On click: opens a new browser tab navigating to the client's Freshdesk support portal (https://stacktrading.freshdesk.com/support/home) — Freshdesk is the platform for all client ticketing, Ref: CR-20260720-004. |
| 5 | Profile icon (footer) | Button (Icon) + Dropdown | Displaying rule:- Footer utility icon, not a navigation tab.- Default image: [If the user has NOT configured a custom avatar in Settings] → shows a default avatar generated from the user's Full Name initials, per the generation rule below.- [If the user has configured a custom avatar in Settings] → the icon shows the user's configured avatar instead of the default generated avatar.- Default avatar generation rule (applied to the trimmed Full Name when no custom avatar is set): - If the first word and the last word of the trimmed Full Name each contain at least 1 alphabetic character → take the first alphabetic character of the first word + the last alphabetic character of the last word. - If the trimmed Full Name is a single word containing both alphabetic and non-alphabetic characters → take the first 2 alphabetic characters of that word. - If the trimmed Full Name contains only numeric and/or special characters (no alphabetic characters) → take the first 2 characters of the trimmed Full Name as-is (including numbers/special characters); if the trimmed Full Name is only 1 character long, show that single character only.Behaviour rule:- On click: opens a dropdown with 2 items: - Settings → navigates to the Settings module (Ref: UC_4.6.1–UC_4.6.6, not yet documented in this repo). - Logout → logs the user out of the current session and navigates to the initial Login screen. Behaviour detail beyond this navigation (token clearing, session invalidation, audio/session teardown) is tracked as a CR pending the Settings/Logout UC — Ref: [CHR-39]; the redirect target confirmed here (Login screen) supersedes that CR's earlier placeholder assumption. This UC references the CR only for teardown detail; it does not own the full Logout behaviour beyond the navigation stated here. |
UC_4.1.3 — Market Status Widget
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.1.3 |
| Use Case | Market Status Widget |
| Description | A countdown widget to a mandatory position-close event caused by overnight margin/swap risk. Displays the current operational phase per asset class (Open/Lockout/Closed/Halted) and, when a countdown applies, a live-ticking "Close in X minute(s)" style label. Driven server-side by the Dynamic Timekeeper middleware and broadcast via Zapier Flow 24. Same widget and same data source for both SIM and LIVE account types — no SIM/LIVE branching in this UC. |
| Zapier Flow | Flow 24 — Overnight Margin & Swap Monitor (Broadcast) (Ref:zapier_v7_full.txt "Flow 24: Overnight Margin & Swap Monitor (Broadcast)") |
| Zapier Table | — |
| 3rd Party | — |
🎬 Motion reference: Close In — Motion folder.
2. Trigger
- The Dashboard layout (Ref: UC_4.1.1) has rendered → frontend calls
GET /system/market-status. - A
MARKET_STATUS_UPDATEWebSocket event arrives mid-session (Ref: BR_4.1.3.2).
3. Pre-conditions
- User is on the Dashboard (Ref: UC_4.1.1 §1 Overview).
- The Dynamic Timekeeper has populated the
CME_Instrument_Detailstable withOfficial_Close_UTC,Halt_Start_UTC,Session_Open_UTCper asset class, via a daily cron task that pulls the official schedule directly from the CME Reference Data API (Ref: BR_4.1.3.5).
4. Post-conditions
- The widget displays the current state and, where applicable, a live countdown for each asset class the user trades.
5. Basic Flow — Futures Gateway
Applies when the user's selected asset class is Futures .
- On Dashboard load, frontend calls
GET /system/market-status. - Backend queries the
CME_Instrument_Detailstable (populated daily from the CME Reference Data API — Ref: §3 Pre-conditions, BR_4.1.3.5), comparing server UTC time againstOfficial_Close_UTC,Halt_Start_UTC,Session_Open_UTCto compute the current operational phase per asset class. These UTC values already reflect that day's DST shift and holiday-hours adjustment, sourced natively from CME — no separate DST logic runs in this step. - Backend responds with
Array<{asset_class, state, short_text, next_state_timestamp}>. - Frontend renders the widget from this array. For any entry whose
short_textfollows the "Close in X minute(s)" pattern, frontend starts a client-side ticking timer computed asnext_state_timestamp - current_client_time. - Live update: the Dynamic Timekeeper middleware calculates milestones independently per asset class/symbol and fires a webhook as each configuration approaches its threshold (
Alert_Level:Warning_60/Warning_30/Warning_10/Lockout_Active/Enforcement_Complete/Halt_Active/Halt_Cleared/Session_Open). - Flow 24 Action 4 pushes a
MARKET_STATUS_UPDATEWebSocket event to the Dashboard with payload{Widget_State, Widget_Short_Text}. - Frontend receives the event, looks up the matching entry in its asset-class-state array by
Asset_Class, and updates only that entry:state ← Widget_State,short_text ← Widget_Short_Text. - In parallel, Flow 24 Action 3 pushes a
NOTIFICATIONWebSocket event (Notification_Severity,Message_Text) to populate the Notification Center.
6. Alternative Flow — Forex Gateway
Applies when the user's selected asset class is Forex. The Forex case reuses the same widget, endpoint, and event pipeline as the §5 Basic Flow; the only differences are the fixed close/rollover marker and that the warning schedule is auto-calculated against that fixed marker.
The rollover marker is a fixed 5:00 PM Eastern/New York time (17:00 ET) wall-clock instant, not a fixed UTC instant — the backend resolves it using a timezone-aware library targeting the America/New_York zone at local 17:00 every day, which natively yields 21:00 UTC in EDT or 22:00 UTC in EST without any hardcoded manual offset (Ref: BR_4.1.3.5). Equivalent Central Time expression: 16:00 CT.
No separate widget or field is needed for the Forex case — the dashboard timer displays the Forex fixed-rollover countdown the same way it displays the Futures overnight-margin countdown.
7. Exceptional Flow
N/A
8. Business Rules
BR_4.1.3.1: Client-Side Ticking Timer for Countdown States
For any asset-class entry whose short_text follows the "Close in X minute(s)" pattern, the frontend computes and locally ticks down next_state_timestamp - current_client_time, rather than polling the backend every second. The timer is purely a display computation; the authoritative state transition is still driven server-side by the Dynamic Timekeeper and delivered via the MARKET_STATUS_UPDATE event (Ref: BR_4.1.3.2).
BR_4.1.3.2: Alert Level → Widget State/Text/Severity Matrix
Flow 24's payload Alert_Level maps deterministically to Widget_State, Widget_Short_Text (max 15 characters), and Notification_Severity, per the table below (Ref: zapier_v7_full.txt "Flow 24" Notification Matrix):
| Alert_Level | Widget_State | Widget_Short_Text | Notification_Severity |
|---|---|---|---|
| Warning_60 | Open | Close in 60m | INFO |
| Warning_30 | Open | Close in 30m | WARN |
| Warning_10 | Open | Close in 10m | CRITICAL |
| Lockout_Active | Lockout | Locked | CRITICAL |
| Enforcement_Complete | Closed | Market Closed | INFO |
| Halt_Active | Halted | Market Halted | WARN |
| Halt_Cleared | Open | Trading Open | INFO |
| Session_Open | Open | Trading Open | INFO |
[Asset_Class] and [Symbol] placeholders in the Discord/Slack/Dashboard copy text are replaced server-side before delivery — this widget only consumes Widget_State/Widget_Short_Text, not the full copy text (that belongs to the Notification Center, Ref: §5 step 8).
BR_4.1.3.3: Tie-Breaking Rule for Simultaneous Webhooks
If two MARKET_STATUS_UPDATE webhooks arrive at effectively the same time, they will always be for different asset classes (the Timekeeper fires independently per asset class/symbol — Ref: §5 step 5). When more than one asset class's entry must be prioritized for display (e.g. a single-asset-class widget slot, or ordering multiple entries), prioritize by proximity to lockout: show the asset class with the closest next_state_timestamp, or the most critical state if severity differs (e.g. Lockout takes priority over Open).
BR_4.1.3.4: Motion State Maps to Notification_Severity
🎬 Motion reference: Close In — Motion folder.
The widget's motion/visual state maps directly to the Notification_Severity flag pushed alongside Widget_State/Widget_Short_Text:
- INFO: standard default visual state — no special motion.
- WARN: triggers the initial color-change warning state.
- CRITICAL: triggers the high-alert blinking warning state shown in the motion file.
BR_4.1.3.5: DST (Daylight Saving Time) Handling — Source-Native for Futures, Timezone-Library-Native for Forex
- Futures — DST is handled upstream, at the data source, not by application logic. A daily cron task in the Node.js middleware (the Dynamic Timekeeper) pulls that day's official session boundaries directly from the CME Reference Data API and writes them into
CME_Instrument_DetailsasSession_Open_UTC/Official_Close_UTC/Halt_Start_UTC(Ref: §3 Pre-conditions, §5 step 2). Because the CME Reference Data API itself already accounts for DST shifts and holiday hours when it publishes these schedules, the values landing inCME_Instrument_Detailsare correct UTC instants for that specific day with no additional DST calculation required anywhere downstream — the enforcement engine (§5 step 2) and the widget only ever read pre-resolved UTC timestamps. - Forex — DST is handled natively by the runtime's timezone database, not by manual UTC-offset math. The institutional rollover is defined as a local wall-clock instant — 17:00 in the
America/New_YorkIANA timezone (equivalent to 16:00 Central Time) — not a fixed UTC offset. The backend resolves this using a standard Node.js timezone-aware library (e.g.Intl/date-fns-tz/luxon, whichever the team standardizes on) configured to theAmerica/New_Yorkzone and targeting 17:00 local time every day. Because that IANA zone already encodes the EST (UTC-5) ⇄ EDT (UTC-4) transition dates, the library-computed UTC instant is 21:00 UTC while EDT is in effect and 22:00 UTC while EST is in effect automatically — the backend does not hardcode either offset or maintain its own DST transition-date table for Forex. - No independent client-side DST logic in either flow. The frontend countdown (Ref: BR_4.1.3.1,
next_state_timestamp - current_client_time) only ever diffs against the UTC timestamp already supplied by the backend — it performs no timezone or DST computation of its own, for either Futures or Forex.
9. Screen Description
| No. | Field Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Widget State/Text | Label + Badge | Displaying rule:- Per asset class: current Widget_State (Open/Lockout/Closed/Halted) and Widget_Short_Text (e.g. "Close in 10m", "Locked", "Market Closed", "Market Halted", "Trading Open" — max 15 chars). Ref: BR_4.1.3.2.Behaviour rule:- Populated on load from GET /system/market-status; updated live on MARKET_STATUS_UPDATE (Ref: §5). Countdown entries tick client-side (Ref: BR_4.1.3.1), computed purely against the UTC timestamps supplied by the backend — no local-timezone/DST arithmetic on the client (Ref: BR_4.1.3.5). Read-only — no direct user interaction. |
| 2 | Motion/severity state | Icon/Animation | Displaying rule:- Visual severity treatment mapped from Notification_Severity (Ref: BR_4.1.3.4). Per severity state: - INFO Severity: Keep the UI in its standard default state. - WARN Severity: Trigger the initial color change warning state. - CRITICAL Severity: Trigger the high-alert blinking warning state shown in the motion file.Behaviour rule:- Updates whenever the underlying Widget_State/Widget_Short_Text entry updates. Read-only. |
UC_4.1.4 — Newsquawk Audio Stream
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.1.4 |
| Use Case | Newsquawk Audio Stream |
| Description | Streams the Newsquawk audio feed to the dashboard by embedding Newsquawk's own widget directly in the persistent header, with a simple On/Off control. Authentication uses a long-lived token issued by Newsquawk — the embedded widget itself fetches/uses this token and streams audio directly from Newsquawk; there is no intermediary relay server. Defaults to Off when the user logs in (Ref: BR_4.1.4.3). Supersedes the earlier Squawk Relay (Icecast 2) architecture and the short-lived per-session token design (Source: BA confirmation, 2026-09-03). |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Newsquawk — embedded widget is the audio content source AND the streaming mechanism; the widget authenticates directly to Newsquawk using the long-lived token (Ref: BR_4.1.4.2). No AWS EKS/Icecast 2 relay is used. |
2. Trigger
The Dashboard layout (Ref: UC_4.1.1) has rendered.
3. Pre-conditions
- User is on the Dashboard (Ref: UC_4.1.1 §1 Overview).
- A valid long-lived audio access token, issued by Newsquawk, is available for the embedded widget to authenticate with (Ref: BR_4.1.4.2).
4. Post-conditions
- The embedded Newsquawk widget is playing (On) or stopped (Off), per user control — Off by default immediately after login (Ref: BR_4.1.4.3).
5. Basic Flow
- Audio player widget renders in the persistent header, defaulting to Off on login (Ref: BR_4.1.4.3). No auto-play occurs.
- On the user's first click of [On], the frontend mounts the embedded Newsquawk widget, which authenticates and streams audio directly from Newsquawk using the long-lived token (Ref: BR_4.1.4.1, BR_4.1.4.2). There is no separate relay/streaming server and no per-session token issuance step — the widget owns the entire connection.
- User clicks [Off] to stop playback; state persists in the header until the user clicks [On] again or navigates away.
6. Exceptional Flow
- Widget connection drops mid-playback: reconnection behavior is owned entirely by the embedded Newsquawk widget itself (out of this platform's control) — the dashboard does not implement its own reconnect/retry logic on top of it.
7. Business Rules
BR_4.1.4.1: Token-Based Widget Authentication (Mandatory)
The embedded Newsquawk widget MUST authenticate using the token described in BR_4.1.4.2 to prevent unauthorized listening. This is a mandatory security requirement, not optional. There is no separate relay/streaming server in this design — the widget streams directly from Newsquawk, and the token is the only access-control mechanism (Source: BA confirmation, 2026-09-03 — supersedes the earlier Squawk Relay/Icecast 2 architecture).
BR_4.1.4.2: Long-Lived Audio Access Token (Supplied by Newsquawk)
The audio access token for BR_4.1.4.1 is a long-lived token issued directly by Newsquawk — not a short-lived JWT derived from the user's own session token, and not re-issued on the platform's session-refresh cadence. This supersedes the prior short-lived, session-derived audio-token design; the platform obtains this long-lived token from Newsquawk and supplies it to the embedded widget, with no periodic re-issuance tied to the 15-minute session-token refresh (Source: BA confirmation, 2026-09-03).
BR_4.1.4.3: Default Off at Login
The audio player defaults to Off immediately when the user logs in — the widget does not auto-play. Only 2 actions exist on this widget: On and Off; there is no separate "stopped" state beyond Off (Source: BA confirmation, 2026-09-03).
BR_4.1.4.4: Auto-Mute on Community Screen During a Live Broadcast
When the user navigates into the Community screen (Ref: Community tab → UC_4.5.1 Live Broadcast, UC_4.5.2 The Pit; SIM also UC_4.9.1 Discord Chat Stream one-way; LIVE also UC_4.14.1 Discord Chat Stream two-way) while the live broadcast is on (is_live == true, Ref: UC_4.5.1 §BR_4.5.1.10), the Newsquawk audio automatically mutes to avoid overlapping the community's own live audio — the On/Off toggle itself stays in its current state (does not flip to Off); only the audio output is silenced (Source: BA confirmation, 2026-09-03 — supersedes the prior "switches to Off" behavior).
- If the broadcast is not live when the user enters Community, no auto-mute occurs.
- If the broadcast goes live while the user is already on the Community screen, the audio mutes at that moment.
- On leaving the Community screen, or when the broadcast stops being live, the audio automatically unmutes (resumes at the volume/On-Off state it had before the mute) — the user does not need to manually re-enable it.
- Beyond the login default (BR_4.1.4.3) and this auto-mute behavior, there is no other automatic On/Off/mute rule for this widget — all other On/Off transitions are user-initiated (Source: BA confirmation, 2026-09-03).
8. Screen Description
| No. | Field Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | On/Off | Button (Icon/Toggle) | Displaying rule:- A 2-state toggle for the embedded Newsquawk widget, labeled "Squawk box" in the persistent header. Defaults to Off at login (Ref: BR_4.1.4.3).Behaviour rule:- On click (Off → On): mounts/starts the embedded Newsquawk widget, which authenticates with the long-lived token and streams directly from Newsquawk (Ref: BR_4.1.4.1, BR_4.1.4.2).- On click (On → Off): stops playback. State persists in the header until changed again or auto-muted.- While On, automatically mutes (toggle state unchanged) whenever the user is on the Community screen during a live broadcast, and automatically unmutes on leaving that screen or when the broadcast stops being live (Ref: BR_4.1.4.4). |
| 2 | Connection status dot | Icon | Displaying rule:- A small status dot next to the On/Off toggle, reflecting the embedded Newsquawk widget's connection state: - Connected: green dot. - Connecting: orange dot. - Not connected: gray dot.- Only meaningful while the widget is On — while Off, the dot shows gray (not connected). Ref: wireframe (Squawk box control group).Behaviour rule:- Read-only. Reflects the embedded widget's own connection state; the platform does not implement separate reconnect/retry logic on top of it (Ref: §6 Exceptional Flow) (Source: BA confirmation, 2026-09-03). |
| 3 | Volume control | Slider | Displaying rule:- A horizontal slider next to a speaker/volume icon, controlling the embedded Newsquawk widget's playback volume. Ref: wireframe (Squawk box control group).Behaviour rule:- Dragging the slider adjusts playback volume in real time via the embedded widget's own volume control — the platform does not persist or apply any server-side volume logic. Available regardless of mute state; adjusting volume while auto-muted (Ref: BR_4.1.4.4) takes effect once the audio unmutes.- Mute action: dragging the slider all the way to its minimum (leftmost) position mutes the audio — there is no separate mute button/icon on this widget; muting is performed entirely via the volume slider (Source: BA confirmation, 2026-09-03). |
UC_4.1.5 — Launch Trading Terminal
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.1.5 |
| Use Case | Launch Trading Terminal |
| Description | Dynamically shows a "Launch TV Web Terminal" action in the persistent sidebar (Ref:UC_4.1.2) only when the user's selected trading platform is TradingView; opens the TradingView web terminal in a new browser tab. Relocated from the dashboard header to the sidebar per direct BA instruction (2026-08-07) — see the note under BR_4.1.5.1. |
| Zapier Flow | — |
| Zapier Table | Table I — Platforms and Gateway Registry (Platform_Name, Asset_Class, Gateway_Router, Is_Active) |
| 3rd Party | TradingView (tv.stacktrading.com) |
2. Trigger
The Dashboard layout (Ref: UC_4.1.1) has rendered, with the persistent sidebar (Ref: UC_4.1.2) visible.
3. Pre-conditions
- User is on the Dashboard with the persistent sidebar rendered (Ref: UC_4.1.2 §1 Overview).
- User's
platform_selectionvalue is available from the account state payload.
4. Post-conditions
- A new browser tab opens at
tv.stacktrading.com, authenticated with the credentials supplied in the API payload.
5. Basic Flow
- On Dashboard load, frontend checks
platform_selection. - If
platform_selection == "TradingView", the [Launch TV Web Terminal] action renders in the persistent sidebar (Ref: UC_4.1.2 §2 Screen Description). Otherwise, it is not rendered (Ref: BR_4.1.5.1). - User clicks [Launch TV Web Terminal].
- Frontend opens a new tab (
target="_blank") totv.stacktrading.com, using the credentials supplied in the API payload.
6. Business Rules
BR_4.1.5.1: Button Visibility Gated by Platform Selection
The [Launch TV Web Terminal] action renders only when platform_selection == "TradingView". For every other registered platform — TradeSea (Futures/Rithmic, supersedes NinjaTrader 8 per CR-20260720-001), Quantower, ATAS, MotiveWave, Sierra Chart (all Futures/Rithmic), and MetaTrader 5 (Forex/MT5) — the action is not rendered at all; those are desktop applications the trader opens independently, outside the web dashboard. Confirmed per QnA_init_docs.md A-03. Per direct BA instruction (2026-08-07), this action lives in the persistent sidebar (Ref: UC_4.1.2), not the header — this reframes but does not change the visibility condition itself, which is unchanged from the original A-03 answer.
7. Screen Description
| No. | Field Name | Field Type | Validation Rule / Behaviour |
|---|---|---|---|
| 1 | Launch TV Web Terminal | Button (Icon, sidebar) | Displaying rule:- Rendered only when platform_selection == "TradingView", in the persistent sidebar (Ref: UC_4.1.2 §2 Screen Description). Hidden entirely for all other platforms. Ref: BR_4.1.5.1.Behaviour rule:- On click: opens tv.stacktrading.com in a new browser tab (target="_blank"), authenticated via the credentials in the API payload. |
Changelog
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-08-17 | v13 | UC_4.1.2 §1 Overview — Description field | Described only the sidebar tab list / navigation behavior, with no statement about lock behavior under account breach status | Added a statement that the sidebar (tab navigation, expand/collapse, footer icons) is never locked by account status — stays fully operable during Max Drawdown/Hard Breach or Frosted Glass cooling-off — cross-referenced to the existing sidebar-stays-interactive precedent inBR_4.11.2.12 | Client-supplied requirement, BA/client direct instruction 2026-08-17 |
| 2026-08-17 | v13 | UC_4.1.1 §2 Screen Description — row 1 (Persistent Header: Daily Loss Limit Bar, Market Status Widget, Newsquawk Audio Stream, Days Remaining counter, Notification bell) and row 3 (Main Content Area) | No statement of permission/interaction impact under Hard Breach / Soft Breach / Frosted Glass cooling-off (48h) for these 6 components | Added component-specific permission-impact notes for all 3 statuses:Daily loss limit bar freezes at its pre-breach state/value; Market status widget keeps updating live via websocket regardless of status; Newsquawk audio stays user-togglable in Soft Breach only — defaults to Off and stays locked Off in Hard Breach/Frosted Glass until reset/rebuy or the 48h countdown ends; Days remaining counter keeps counting down normally in all 3 statuses; Notification bell keeps showing the list and receiving notifications normally in all 3 statuses; Main content area keeps showing the user's last available data in all 3 statuses | Client-supplied requirement, BA/client direct instruction 2026-08-17.Terminology note for BA follow-up: the existing SIM "Frosted Glass" state documented at UC_4.10.2 is permanent (lifts only via Reset/Start New Track purchase, not on a 48h timer); the only existing "48-hour" cooling-off concept in this repo is the LIVE-only, Level 9+ Defense Protocol (Ref: common_rules.md "Defense Protocol" — 48-hour cooling-off before resuming with reduced parameters), which is largely undocumented elsewhere (UC_4.15.4 not yet written; UC_4.12.5 marks it [PENDING — client confirmation]). This edit records the client's instruction as-given; recommend the client/BA confirm whether "Frosted Glass cooling-off (48h)" refers to the Defense Protocol window specifically, so UC_4.15.4 can be written consistently with this note. |
| 2026-08-19 | v14 | UC_4.1.3 §8 Business Rules — new BR_4.1.3.5 (DST Handling) | No rule addressed how the Market Status Widget's countdown/notification display accommodates Daylight Saving Time timezone shifts | Added BR_4.1.3.5 explaining the widget has no independent client-side timezone/DST logic —Official_Close_UTC/Halt_Start_UTC/Session_Open_UTC (§3) and next_state_timestamp (§5) are UTC values already recomputed per date by the Dynamic Timekeeper's master reference schedule, and the frontend countdown (BR_4.1.3.1) only diffs against that UTC value; also updated §9 Screen Description row 1 to cross-reference the new BR | Client request 2026-08-19 ("chỉnh sửa thêm rule hiển thị market status đáp ứng dịch chuyển múi giờ DST").No explicit DST clause exists in CR / QnA from clients / Customer supplies (grep-searched "DST", "daylight saving", "timezone", "time zone" across all 3 — no hits). This BR is inferred from the confirmed UTC mandate (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md STAGE1-001, STAGE1-066) plus the widget's existing UTC-based architecture already in §3/§5 — marked [INFERRED] with a [PENDING — client confirmation] sub-point on whether the upstream master reference schedule itself is verified DST-correct per exchange calendar. Recommend BA raise this as a new QnA item for explicit client confirmation. |
| 2026-08-19 | v15 | UC_4.1.3 §6 Alternative Flow — Forex Gateway; §8 BR_4.1.3.5 (rewritten) | v14's BR_4.1.3.5 was framed as a generic[INFERRED] rule (no source found) covering both Futures and Forex symmetrically; §6 described the Forex marker only as a static "16:00 CT" with no DST mechanics | Superseded with client-confirmed verbatim quote:"The catch is that the backend must account for Daylight Savings Time. The rollover is always 5:00 PM Eastern Time. That means it shifts between 21:00 UTC and 22:00 UTC depending on the time of year. Your backend timekeeper must account for the US DST schedule to prevent your UI timers from breaking twice a year." Rewrote BR_4.1.3.5 to scope DST-to-UTC conversion as a Forex-only concern (17:00 ET → 22:00 UTC in EST / 21:00 UTC in EDT, re-evaluated per date against the US DST calendar) and explicitly state Futures needs no such conversion since CME_Instrument_Details already stores Official_Close_UTC/Halt_Start_UTC/Session_Open_UTC pre-resolved in UTC (§3). §6 Alternative Flow updated to state the rollover is a wall-clock (ET) instant, not a fixed UTC instant, and cross-reference BR_4.1.3.5 | Client-supplied correction 2026-08-19, narrowing the scope of the prior v14 inference. Agent search confirmed this exact quote isnot yet present in any filed CR or QnA record (References/CR/, References/QnA from clients/, References/Customer supplies/) — it was supplied directly in this conversation. [PENDING — filing]: recommend BA file this quote as a new QnA entry (or CR, if it changes an already-delivered spec) under the Forex/rollover category for traceability, since per CLAUDE.md protocol conversation-supplied client statements should be captured in References/QnA from clients/ to remain the source of truth for future audits. |
| 2026-08-19 | v16 | UC_4.1.3 §3 Pre-conditions, §5 Basic Flow step 2, §6 Alternative Flow, §8 BR_4.1.3.5 (rewritten again) | v15's BR_4.1.3.5 described the DST-to-UTC resolution mechanism only in terms of "backend must resolve/re-evaluate" without naming the actual mechanism (no mention of the CME Reference Data API as the Futures source, nor of a Node.jsAmerica/New_York timezone library as the Forex mechanism) | Rewrote BR_4.1.3.5 with the client's newly-supplied mechanism-level detail:Futures — daily cron in the Node.js middleware (Dynamic Timekeeper) pulls that day's session boundaries directly from the CME Reference Data API into CME_Instrument_Details; the API itself natively handles DST shifts and holiday hours, so no DST logic runs anywhere downstream (§3 Pre-conditions and §5 step 2 updated accordingly). Forex — backend uses a standard Node.js timezone-aware library set to the America/New_York IANA zone targeting local 17:00 daily; that zone's built-in EST⇄EDT transition table yields 21:00 UTC (EDT) / 22:00 UTC (EST) automatically, with no manual offset hardcoding (§6 Alternative Flow updated accordingly) | Client-supplied mechanism detail 2026-08-19, refining (not contradicting) v15's Forex-only-vs-Futures-no-conversion scoping — this revision explainshow each side achieves that, per the client's own description of "how the backend manages the reset times." Same [PENDING — filing] note as v15 still applies: this quote has not yet been located in a filed CR or QnA record; recommend BA file both the v15 and v16 quotes together as one QnA entry under Backend/Zapier Flow 24, since they describe the same mechanism from two levels of detail. |
| 2026-08-22 | v17 | UC_4.1.2 §2 Screen Description — row 5 (Profile icon footer, Logout item) | Ref: [CR-20260806-001](../../../../../References/CR/2026-08-06_dashboard-logout-action/CR_summary.md) — dead link (actual folder has CR39_ prefix), old CR-ID shown as visible text, no CHR tag | Ref: [[CHR-39]](../../../../../References/CR/2026-08-06_CR39_dashboard-logout-action/CR_summary.md) — fixed link path; old CR-ID text fully replaced by the CHR tag as the visible link label | CHR Tag Impact Matrix v1 row A020 / Change Plan v4 row A24 — CR_ID confirmed correct against _CR_INDEX.md (unlike the UC_3.1-UC_3.2/CHR-15 case), only the link path was stale |
| 2026-08-26 | v18 | UC_4.1.2 §2 Screen Description — row 2 (Sidebar Tab List), Career tab mapping | - **Career** → Ref: UC_4.15.2 (Career & HR Widget). (not yet documented in this repo) — wrong UC_ID (UC_4.15.2 is Hard Breach — Level Stop, per WBS), plain-text reference, no link | Re-pointed to UC_4.16.2 as a Markdown link, noted that only the certificate half of that UC is documented so far, and added that the Career tab is LIVE-only (a SIM trader has no Rippling record) | Found while writing UC_4.16.2. WBS is authoritative: UC_4.15.2 = STAGE 2.2: DASHBOARD LIVE / Failure & Recovery / Hard Breach - Level Stop; UC_4.16.2 = Level-Up & Certificate / Career & HR Widget. LIVE-only scope per [HR-DEF-01] (Adrian Stack, 2026-08-15) and BR_4.16.2.1 |
| 2026-08-26 | v19 | UC_4.1.2 §2 Screen Description — row 2 (Sidebar Tab List), Career tab mapping | Pointed only at UC_4.16.2, annotated "the certificate half is documented; the remaining HR tiles are not" | Points at both owners of the Career tab: UC_4.16.2 for the HR tiles and the two outbound buttons, and UC_4.16.1 for the Latest certificate panel | The Career tab is now fully documented. Follows the 2026-08-26 UC ID realignment to the WBS: the certificate doc was renumbered UC_4.16.2 → UC_4.16.1, and the new UC_4.16.2 covers the HR half. |
| 2026-09-03 | v20 | UC_4.1.4 — full rewrite of §1 Overview, §3 Pre-conditions, §4 Post-conditions, §5 Basic Flow, §6 Exceptional Flow, BR_4.1.4.1–BR_4.1.4.4, §8 Screen Description row 1; UC_4.1.1 §2 Screen Description row 1 (Newsquawk bullet) | Architecture: dashboard-side Squawk Relay (AWS EKS Icecast 2) ingesting an authenticated Newsquawk URL; short-lived audio JWT re-issued on the 15-min session-token refresh cadence; default On at login; single-active-session-per-user enforced across tabs (losing tab auto-drops to Off); Community-screen auto-off triggered unconditionally on entering the screen, flips the toggle to Off | Newsquawk's own widget is embedded directly in the header and streams straight from Newsquawk — no relay server. Auth token is now long-lived, issued directly by Newsquawk (no periodic re-issuance tied to session refresh). Default state on login is now Off (no auto-play). The single-session-per-tab arbitration rule is removed (no relay session left to arbitrate; each tab's widget instance is independent). Community auto-behavior changed from "switches Off" to auto-mute, gated on the broadcast actually being live (is_live == true) rather than merely being on the screen — the toggle itself no longer flips; only the audio output mutes, and it auto-unmutes on leaving the screen or when the broadcast stops being live. | Client-supplied architecture change, BA confirmation 2026-09-03. This also resolves the alignment note previously left open in UC_4.5.1 §BR_4.5.1.11 (BR_4.1.4.4 now gates on is_live, matching that UC's narrower trigger) — recommend BA also update UC_4.5.1's wording from "switches to Off" to "mutes" for consistency, and review the cross-references in UC_4.9.1, UC_4.14.1, UC_4.14.2 that still describe the old "switches to Off" behavior. |
| 2026-09-03 | v21 | UC_4.1.4 §7 Business Rules — removed standalone BR_4.1.4.3 "Default Off at Login" and renumbered the former BR_4.1.4.4 to BR_4.1.4.3; §1/§4/§5 internal refs; §8 Screen Description — row 1 updated, new rows 2 (Connection status dot) and 3 (Volume control) | Login-default-Off content stated as its own standalone BR_4.1.4.3; the merged/renumbered auto-mute rule (formerly BR_4.1.4.4) had no successor anchor once BR_4.1.4.3 was freed up; §8 only described the On/Off button, with no mention of the widget's connection-status indicator or volume control shown in the wireframe | Removed the standalone login-default BR and folded its essential content ("defaults to Off at login, no auto-play, only On/Off actions exist") as a trailing bullet inside the renumbered BR_4.1.4.3 (Auto-Mute on Community Screen During a Live Broadcast — content unchanged otherwise, only the anchor/number shifted from BR_4.1.4.4). §8 row 1 re-labeled "Squawk box" and re-pointed its refs to the new BR_4.1.4.3; added row 2 Connection status dot (green = connected, red = disconnected) and row 3 Volume control (horizontal slider), both per the client-supplied wireframe of the header's Squawk box control group | Client-supplied wireframe + BA confirmation 2026-09-03. ⚠️ Cross-reference alert: this renumbering orphans every external citation of the old BR_4.1.4.4 anchor (now nonexistent) and changes the meaning of BR_4.1.4.3 (now the auto-mute rule, not the login-default rule) in: UC_4.9.1, its QnA_init_docs.md, UC_4.9.2, UC_4.5.1 (×3) + its QnA_init_docs.md, UC_4.5.2 + its QnA_init_docs.md, UC_4.14.1, UC_4.14.2, and UC_4.17.2 — not yet synced, pending BA decision (same open item as v20's note above). |
| 2026-09-03 | v22 | UC_4.1.4 §7 Business Rules — reverted v21's removal/renumbering: restored standalone BR_4.1.4.3 "Default Off at Login" and restored BR_4.1.4.4 "Auto-Mute on Community Screen During a Live Broadcast" (unmerged, original numbers); §1/§4/§5 internal refs re-pointed accordingly; §8 Screen Description — row 1 ref re-pointed to BR_4.1.4.4, row 2 (Connection status dot), row 3 (Volume control) | v21 removed the standalone BR_4.1.4.3 and shifted BR_4.1.4.4 down to BR_4.1.4.3, breaking 10 external cross-references to the old numbering; row 2 only distinguished 2 connection states (green/red); row 3 described volume adjustment but not how to mute | Reverted the BR removal/renumbering — BR_4.1.4.3 and BR_4.1.4.4 are both restored as separate, independently-anchored rules with their original numbers and content, exactly as before v21, so all pre-existing external references stay valid. Row 2 now distinguishes 3 connection states: green = connected, orange = connecting, gray = not connected (including the Off state). Row 3 now states that dragging the volume slider to its minimum is the mute action for this widget — there is no separate mute button | BA instruction 2026-09-03: revert the renumbering so as not to affect other UCs' existing references to BR_4.1.4.3/BR_4.1.4.4; client-supplied connection-state and mute-via-slider clarifications, BA confirmation 2026-09-03. This also resolves the v20/v21 cross-reference alert for the anchor numbers themselves — UC_4.9.1, UC_4.9.2, UC_4.5.1, UC_4.5.2, UC_4.14.1, UC_4.14.2, and UC_4.17.2 can keep citing BR_4.1.4.4/BR_4.1.4.3 unchanged; the still-open item is only the wording sync from "switches to Off" to "auto-mutes" (per v20's note), which remains pending BA decision. |
| 2026-09-03 | v23 | UC_4.1.4 §1 Overview and §7 Business Rules (after BR_4.1.4.4) — removed the two standalone 🎬 Motion reference lines | Both §1 and §7 each carried their own standalone line: 🎬 Motion reference: Newsquawk On/Off — Motion folder, duplicating the same motion-folder link twice within the same UC | Removed both standalone Motion reference lines from §1 (after the Overview table) and §7 (after BR_4.1.4.4) — no other content in those sections changed | BA instruction 2026-09-03 |