StackTrading Docs

SRS: Dashboard - Common (UC 4.1.1–4.1.5)

FieldValue
BA in ChargeTrang Nguyen
Date Created2026-08-06
Versionv23
Document ReferencesRFQ_ 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_IDUse Case NameBusiness Description
UC_4.1.1Dashboard LayoutOverview-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.2Sidebar NavigationOverview-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.3Market Status WidgetA 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.4Newsquawk Audio StreamStreams the authenticated Newsquawk audio feed (Squawk Relay) to the dashboard via a token-authenticated audio player.
UC_4.1.5Launch Trading TerminalShows 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

FieldContent
IDUC_4.1.1
Use CaseDashboard Layout
DescriptionOverview-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 PartyRithmic (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 NameField TypeDisplaying rule / Behaviour rule
1Persistent HeaderLabelDisplaying 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).
2Persistent SidebarLabelDisplaying 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.
3Main Content AreaLabelDisplaying 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

FieldContent
IDUC_4.1.2
Use CaseSidebar Navigation
DescriptionDefines 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 NameField TypeDisplaying rule / Behaviour rule
1Logo (Collapse/Expand trigger)Icon/ButtonDisplaying 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.
2Sidebar Tab ListTabDisplaying 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.1UC_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.
3Launch 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.
4Support 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.
5Profile icon (footer)Button (Icon) + DropdownDisplaying 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.1UC_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

FieldContent
IDUC_4.1.3
Use CaseMarket Status Widget
DescriptionA 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 FlowFlow 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_UPDATE WebSocket 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_Details table with Official_Close_UTC, Halt_Start_UTC, Session_Open_UTC per 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 .

  1. On Dashboard load, frontend calls GET /system/market-status.
  2. Backend queries the CME_Instrument_Details table (populated daily from the CME Reference Data API — Ref: §3 Pre-conditions, BR_4.1.3.5), comparing server UTC time against Official_Close_UTC, Halt_Start_UTC, Session_Open_UTC to 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.
  3. Backend responds with Array<{asset_class, state, short_text, next_state_timestamp}>.
  4. Frontend renders the widget from this array. For any entry whose short_text follows the "Close in X minute(s)" pattern, frontend starts a client-side ticking timer computed as next_state_timestamp - current_client_time.
  5. 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).
  6. Flow 24 Action 4 pushes a MARKET_STATUS_UPDATE WebSocket event to the Dashboard with payload {Widget_State, Widget_Short_Text}.
  7. 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.
  8. In parallel, Flow 24 Action 3 pushes a NOTIFICATION WebSocket 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_LevelWidget_StateWidget_Short_TextNotification_Severity
Warning_60OpenClose in 60mINFO
Warning_30OpenClose in 30mWARN
Warning_10OpenClose in 10mCRITICAL
Lockout_ActiveLockoutLockedCRITICAL
Enforcement_CompleteClosedMarket ClosedINFO
Halt_ActiveHaltedMarket HaltedWARN
Halt_ClearedOpenTrading OpenINFO
Session_OpenOpenTrading OpenINFO

[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_Details as Session_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 in CME_Instrument_Details are 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_York IANA 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 the America/New_York zone 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 NameField TypeDisplaying rule / Behaviour rule
1Widget State/TextLabel + BadgeDisplaying 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.
2Motion/severity stateIcon/AnimationDisplaying 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

FieldContent
IDUC_4.1.4
Use CaseNewsquawk Audio Stream
DescriptionStreams 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 PartyNewsquawk — 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

  1. Audio player widget renders in the persistent header, defaulting to Off on login (Ref: BR_4.1.4.3). No auto-play occurs.
  2. 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.
  3. 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 NameField TypeDisplaying rule / Behaviour rule
1On/OffButton (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).
2Connection status dotIconDisplaying 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).
3Volume controlSliderDisplaying 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

FieldContent
IDUC_4.1.5
Use CaseLaunch Trading Terminal
DescriptionDynamically 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 TableTable I — Platforms and Gateway Registry (Platform_Name, Asset_Class, Gateway_Router, Is_Active)
3rd PartyTradingView (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_selection value 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

  1. On Dashboard load, frontend checks platform_selection.
  2. 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).
  3. User clicks [Launch TV Web Terminal].
  4. Frontend opens a new tab (target="_blank") to tv.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 NameField TypeValidation Rule / Behaviour
1Launch TV Web TerminalButton (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

DateVersionUpdated itemBeforeAfterNotes
2026-08-17v13UC_4.1.2 §1 Overview — Description fieldDescribed only the sidebar tab list / navigation behavior, with no statement about lock behavior under account breach statusAdded 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.12Client-supplied requirement, BA/client direct instruction 2026-08-17
2026-08-17v13UC_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 componentsAdded 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 statusesClient-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-19v14UC_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 shiftsAdded 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 BRClient 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-19v15UC_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 mechanicsSuperseded 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.5Client-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-19v16UC_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-22v17UC_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 tagRef: [[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 labelCHR 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-26v18UC_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 linkRe-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-26v19UC_4.1.2 §2 Screen Description — row 2 (Sidebar Tab List), Career tab mappingPointed 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 panelThe 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.2UC_4.16.1, and the new UC_4.16.2 covers the HR half.
2026-09-03v20UC_4.1.4 — full rewrite of §1 Overview, §3 Pre-conditions, §4 Post-conditions, §5 Basic Flow, §6 Exceptional Flow, BR_4.1.4.1BR_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 OffNewsquawk'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-03v21UC_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 wireframeRemoved 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 groupClient-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-03v22UC_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 muteReverted 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 buttonBA 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-03v23UC_4.1.4 §1 Overview and §7 Business Rules (after BR_4.1.4.4) — removed the two standalone 🎬 Motion reference linesBoth §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 UCRemoved 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 changedBA instruction 2026-09-03

On this page