StackTrading Docs

QnA Init Docs — UC_4.5.1 Live Broadcast

QnA Init Docs — UC_4.5.1: Live Broadcast

FieldValue
UCUC_4.5.1 — Live Broadcast (Module: Community & Live Broadcast)
WBS CategorySTAGE 2: DASHBOARD - COMMON → folder dashboard_common/
Phạm vi yêu cầuBA yêu cầu viết cho SIM account. Khách đã confirm widget này giống hệt nhau ở SIM và LIVE ([C-1], [C-6]) nên UC viết chung, có ghi rõ SIM applicability.
AgentAgent 2 — Challenger (Init Flow)
Ngày tạo2026-08-10
Trạng thái✅ BA đã review 2026-08-10 — SRS đã viết theo các mục ✅ Đã chốt

Nguồn đã đối chiếu trước khi raise câu hỏi:

  1. References/CR/_CR_INDEX.md — quét 30 CR, không có CR nào ảnh hưởng Live Broadcast / Community.
  2. References/QnA from clients/03_STAGE2_DASHBOARD_EVALUATION/Community + Settings/QnA_STAGE2_COMMUNITY_LIVE_BROADCAST.md + Stage 2 - Dashboard & Fomula (Community).csv (ký hiệu [C-n] = dòng n trong CSV).
  3. docs/BA/Common_rule/common_rules.md, list-toast-popup.md — không có rule sẵn cho video embed / countdown.
  4. References/Customer supplies/RFQ_ Website and Dashboard Implementation V7.pdf §Community Page Implementation, Zapier Integration V7.pdf §3.1 Table C, RFQ_ Stack Trading Prop Tech V7.pdf §COMMUNITY_LIVE.
  5. docs/BA/UC_4.1-4.17/community/SIM_Community_Wireframe_Brief.md (brief SIM, duyệt nội bộ 2026-08-07).

Phần 1 — Nội dung khách ĐÃ CHỐT (không hỏi lại, dùng thẳng khi viết SRS)

#Nội dung đã chốtNguồn
1Widget có cho SIM, unlocked hoàn toàn, không có locked/upsell state. SIM xem đúng cùng 1 stream với LIVE (youtube_id global duy nhất cho toàn platform).[C-1]
2GET /community/live-broadcast trả 200 OK cho mọi authenticated user — không middleware gate theo account status, không có logic phân biệt SIM/LIVE.[C-6]
3Trigger thủ công 100%: Ops sửa Active_Broadcast_URL + toggle Broadcast_Is_Live trên Zapier Table C. Không build YouTube Data API listener (khách đánh dấu Day 2 / cần CR riêng).[C-2], [C-8]
4next_broadcast_timestamp nhập tay vào Table C, không sync Google Calendar/CMS. Ops chịu trách nhiệm nhập khi kết thúc 1 phiên.[C-8]
5Countdown là client-side một lần: next_broadcast_timestamp (UTC) − giờ máy user, lấy từ response lúc page load. Cấm polling liên tục và cấm WebSocket channel riêng cho timer.[C-2]
6Countdown về 00:00:00 → FE gọi đúng 1 lần GET /community/live-broadcast. is_live=true → chuyển sang player.[C-2], [C-6]
7Countdown về 00:00:00 nhưng is_live=falsegiữ đồng hồ ở 00:00:00, đổi subtext thành Starting soon. Không build error state phức tạp.[C-2]
8next_broadcast_timestamp = nullgiữ nguyên khung Offline (không vỡ grid), hiển thị TBD thay cho số đếm.[C-2]
9Không thể có 2 broadcast cùng lúc — endpoint trả đúng 1 youtube_id, hệ thống chỉ hỗ trợ 1 broadcast global tại 1 thời điểm.[C-2]
10Không giới hạn số phiên/ngày, không build scheduling database. Table C chỉ track phiên kế tiếp gần nhất; hết phiên thì Ops sửa title + timestamp cho phiên sau.[C-4]
11Đổi phiên: có thể đổi youtube_id hoặc chỉ toggle is_live (tùy Ops chạy stream thế nào). FE render bất cứ youtube_id nào endpoint trả về, không cần biết.[C-4]
12Kết thúc phiên: KHÔNG full page reload — chỉ re-render riêng component video. Chat / Pod / The Pit giữ nguyên state. Không có badge Recorded/VOD.[C-4], [C-5]
13Player = plain HTML <iframe>, không dùng YouTube IFrame Embed API, không custom player wrapper.[C-5]
14Hiện FULL control bar native của YouTube (controls=1): volume, seek, CC, fullscreen, quality. "Do not spend development hours trying to hide specific native controls or build a custom overlay."[C-5]
15Bắt buộc append rel=0 để chặn video đối thủ hiện khi stream kết thúc. RFQ gốc yêu cầu ?rel=0&modestbranding=1. Native YouTube chat phải ẩn hoàn toàn.[C-5], RFQ Dashboard V7 §Community Page Implementation
16Chất lượng video auto-adaptive theo băng thông, không hard-lock 1080p/720p.[C-5]
17Stream lỗi giữa buổi / mạng chậm / youtube_id sai hoặc video bị xoá → không build custom detection hay fallback UI, để nguyên overlay lỗi + adaptive bitrate native của YouTube. Không validate video server-side.[C-4]
18Ad-blocker chặn iframe → hiện text tĩnh trong khung video: Please disable ad-blockers to view the live broadcast.[C-4]
19Tab chạy nền → không auto-pause, iframe phát audio tiếp (hành vi browser mặc định). Không viết Intersection Observer.[C-4]
20Thanh lịch phiên (08:00 CST THE OPEN / 10:00 CST THE GAP) là schedule tĩnh, KHÔNG tương tác. Click không seek/jump. Mọi thao tác tua do control bar YouTube xử lý.[C-4]
21Mobile: khung video giữ 16:9 auto-resize; xếp dọc video trên → chat dưới; ẩn thanh lịch phiên trên màn nhỏ.[C-5]
22Title header lấy đúng field title từ API payload, không có CMS/hardcode riêng. Title dài → wrap xuống dòng, CẤM dùng ellipsis (...). Title empty/null → ẩn hẳn container (không để khoảng trống).[C-5] (Adrian, 2026-08-10)
23Ảnh người trong design chỉ là stock art của designer, không phải preview do StackTrading upload. Khi is_live=true → hiện thumbnail do chính YouTube cấu hình. Khi is_live=falseẩn hoàn toàn Play component, không có thumbnail nào.[C-5]

Phần 2 — Câu hỏi & giả định cần BA chốt

UC_4.5.1 — Live Broadcast

IDCâu hỏiGiả định (BA/QC đề xuất)BA chốt (ưu tiên cao nhất)Trạng thái
A-01[INTRA_RULE_CONTRADICTION] Hai câu trả lời của khách mâu thuẫn trực tiếp trong cùng 1 bộ answer:(a) [C-2]"Do not implement continuous polling or a dedicated WebSocket channel for the timer."(b) [C-5]"Session End: As soon as the backend flags is_live as false, the UI transitions directly back to the countdown state."→ FE chỉ gọi API đúng 2 lần (page load + countdown=0). Với 1 user đang mở tab và đang xem phiên live, không có bất kỳ kênh nào để FE biết Ops vừa tắt is_live. Câu (b) về mặt kỹ thuật không thể thực hiện được với ràng buộc (a).FE không tự phát hiện session end. Khi Ops tắt cờ, user đang xem vẫn thấy iframe YouTube — YouTube tự hiện "This live stream has ended". UI chỉ chuyển về countdown state ở lần load trang / điều hướng vào Community tiếp theo.Đề xuất bổ sung (cần khách duyệt): tái sử dụng event COMMUNITY_LIVE đã có sẵn trong RFQ V7 (§3.2.1.A — "Triggered globally via webhook when the official Stack Trading YouTube stream goes live") làm 1 WS event global 2 chiều (live on/off) — không phải WS channel riêng cho timer nên không vi phạm (a).Chốt phương án "không tự phát hiện" — viết SRS đúng nguyên văn ràng buộc [C-2]: FE chỉ gọi API 2 lần, không thêm WS event. User đang xem khi Ops tắt cờ sẽ thấy overlay "This live stream has ended" của YouTube; UI chỉ về countdown ở lần load trang / điều hướng vào Community tiếp theo. Giới hạn này được ghi rõ trong SRS (Ref: BR_4.5.1.3).✅ Đã chốt (BA, 2026-08-10)
A-02Khi is_live = true, field next_broadcast_timestamp trong response trả gì? Table C chỉ track 1 phiên kế tiếp gần nhất [C-4] — nên nó đang là timestamp của chính phiên đang chạy (đã qua), hay của phiên sau, hay null? Ảnh hưởng trực tiếp tới việc UI có dựng được countdown cho phiên kế tiếp ngay sau khi phiên hiện tại kết thúc hay không.Khi is_live=true → FE bỏ qua next_broadcast_timestamp, chỉ render player. Countdown chỉ tính khi is_live=false. Nếu lúc đó timestamp đã lỗi thời (< now) → xử lý y hệt case A-06 (giữ 00:00:00 + Starting soon).Không đưa vào UC. BA đánh giá câu hỏi thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)
A-03Tên các segment trên thanh lịch phiên (THE OPEN, THE GAP) lấy từ đâu? Chính khách nêu gap này và chưa chốt: "These names should really be passed from the backend schedule table. I think that is missing, so the front end either has to hardcode or we add a segments array to the JSON output." [C-4]Bổ sung mảng segments[] vào response GET /community/live-broadcast (mỗi phần tử: label, start_time, end_time). Không hardcode FE — hardcode sẽ khiến mọi thay đổi lịch phát sóng phải deploy lại code, trái nguyên tắc "Ops tự chỉnh Table C không cần code deployment" [C-8].⚠️ Nếu chốt phương án này → phát sinh CR (thêm field vào endpoint + thêm cột vào Table C).[ĐÃ CHỐT — khách trả lời 2026-08-10] Khách bổ sung mảng schedule[] (không phải segments[]) vào GET /community/live-broadcast, mỗi phần tử { time, label }, nguồn từ biến mới Broadcast_Schedule (JSON Array) trên Table C. FE iterate mảng này để render thanh lịch phiên — không hardcode, đúng như đề xuất bên trái. Đã viết vào BR_4.5.1.2 + BR_4.5.1.9 (UC v3).✅ Đã chốt — khách confirm (Adrian Stack, 2026-08-10); viết vào UC v3 (BA, 2026-08-12)
A-04Title dài: khách nói "If the title is long, wrap it to the next line. Do not use an ellipsis, clip the text cleanly." [C-5] — "wrap xuống dòng" và "clip gọn" là 2 hành vi khác nhau. Wrap tối đa mấy dòng rồi mới clip? Hay wrap vô hạn, không bao giờ clip?Wrap tối đa 2 dòng, quá 2 dòng thì clip cứng không có ... (đúng nguyên văn "clip the text cleanly"). Chọn 2 dòng để không đẩy vỡ chiều cao khung video trong grid 2×2 — cùng nguyên tắc "so the UI grid does not break" khách đã áp cho case TBD [C-2].Không đưa vào UC. BA đánh giá nhóm câu hỏi này sai về mặt flow nghiệp vụ hoặc quá thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)
A-05Múi giờ: toàn bộ giờ trong wireframe fix cứng CST (08:00 CST THE OPEN, Next session starts at 09:30 CST). Trader ngoài US sẽ đọc sai giờ. Có convert theo local timezone của user không, hay giữ CST và ghi rõ nhãn? (Trùng câu hỏi treo #8 trong SIM_Community_Wireframe_Brief.md.)Giữ nguyên CST kèm nhãn hiển thị rõ ràng — nhất quán với toàn bộ ngôn ngữ vận hành của firm (CME session, market open/close đều theo CST) và khớp đúng wireframe khách đã duyệt. Countdown vẫn tính bằng UTC nên không sai giờ thực tế.Không đưa vào UC. BA đánh giá nhóm câu hỏi này sai về mặt flow nghiệp vụ hoặc quá thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)
A-06Lần gọi GET /community/live-broadcast tại thời điểm countdown = 00:00:00 bị lỗi mạng / 5xx / timeout thì UI xử lý sao? Khách chỉ spec case is_live=false, không spec case call thất bại [C-2].Xử lý y hệt case is_live=false: giữ đồng hồ 00:00:00 + subtext Starting soon. Không hiện error toast, không auto-retry vô hạn (tránh vi phạm ràng buộc "no continuous polling"). User reload trang thì gọi lại.Không đưa vào UC. BA đánh giá nhóm câu hỏi này sai về mặt flow nghiệp vụ hoặc quá thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)
A-07Cơ chế phát hiện ad-blocker chặn iframe là gì? Khách chỉ nói "If a client-side extension prevents the iframe from mounting, display a simple, static text block" [C-4] — không nói detect bằng cách nào.Dùng onerror của iframe + timeout kiểm tra iframe mount (ví dụ 5 giây không mount được → coi như bị chặn) → render text block tĩnh Please disable ad-blockers to view the live broadcast. Không icon, không nút retry (đúng brief LB-3).Không đưa vào UC. BA đánh giá nhóm câu hỏi này sai về mặt flow nghiệp vụ hoặc quá thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)
A-08Trạng thái đang tải (từ lúc mount component tới lúc có response GET /community/live-broadcast) hiển thị gì? Tài liệu không spec.Hiện skeleton giữ đúng kích thước ô grid của widget (không spinner toàn trang, không đẩy layout khi data về). Áp thẳng nguyên tắc "không được vỡ grid" khách đã nhắc 2 lần [C-2], [C-17].Không đưa vào UC. BA đánh giá nhóm câu hỏi này sai về mặt flow nghiệp vụ hoặc quá thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)
A-09SIM đang Soft Breach / Hard Breach / đã fail Associate Track — Community Page nói chung và Live Broadcast nói riêng có bị khoá theo không? Trader vẫn login được và vẫn vào được Community Page (Ref: UC_4.10.1, UC_4.10.2), nhưng không dòng nào trong CSV nói Community bị ảnh hưởng. (Trùng câu hỏi treo #4 trong SIM_Community_Wireframe_Brief.md.)Không khoá Live Broadcast. Khách đã khẳng định đây là "a universal community feature… fully unlocked and available to all authenticated users" [C-1] và endpoint trả 200 cho mọi authenticated user, không có logic phân biệt trạng thái account [C-6]. Soft/Hard Breach chỉ chặn giao dịch, không chặn nội dung community.Chốt: KHÔNG khoá. Live Broadcast hiển thị và hoạt động đầy đủ ở mọi trạng thái account, kể cả Soft Breach / Hard Breach / fail Associate Track. Ghi vào SRS (Ref: BR_4.5.1.1).✅ Đã chốt (BA, 2026-08-10)
A-10Newsquawk auto-off: BR_4.1.4.4 (UC_4.1.4) quy định khi user vào màn Live Broadcast / Community thì Newsquawk audio tự chuyển Off để không chồng tiếng. Rule này có áp dụng cả khi broadcast đang Offline (không có tiếng nào để chồng) không?Auto-off chỉ khi is_live = true. Khi Offline không có audio nào phát → tắt Newsquawk là làm mất thông tin của trader mà không đổi lại được gì. Khi phiên chuyển sang Live thì mới auto-off.[ĐÃ CHỐT — BA xác nhận 2026-08-12] Áp dụng đúng giả định bên trái: auto-off chỉ khi is_live = true. Đã viết vào BR_4.5.1.11 (UC v3), kèm cảnh báo BR_4.1.4.4 (UC_4.1.4) hiện đang ghi điều kiện rộng hơn (auto-off ngay khi vào màn Community) và cần chỉnh cho khớp.✅ Đã chốt — viết vào UC v3 (BA, 2026-08-12)
A-11Khi user quay lại tab sau nhiều giờ (visibilitychange) — widget có tự refetch để đồng bộ lại trạng thái không? Liên quan trực tiếp A-01: nếu không refetch, user có thể nhìn khung countdown sai suốt nhiều giờ.Refetch đúng 1 lần khi tab quay lại foreground countdown đã ≤ 0. Đây là event-driven, không phải polling → không vi phạm ràng buộc [C-2]. Là cách rẻ nhất giảm nhẹ A-01 nếu khách không duyệt WS event.Không đưa vào UC. BA đánh giá nhóm câu hỏi này sai về mặt flow nghiệp vụ hoặc quá thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)
A-12[PATTERN] Rule "field trả về empty/null → ẩn hẳn container, không render placeholder rỗng, để các element xung quanh khép lại" ([C-5] cho title) — có nên chuẩn hoá thành 1 Common Rule dùng chung cho toàn bộ Dashboard widget không?Có — đề xuất thêm CR-14: Empty/Null Field Container Collapse vào docs/BA/Common_rule/common_rules.md. Hiện rule này đang lặp lại rải rác ở nhiều widget (Live Broadcast title, The Pit metrics [C-37] "If we are unable to fetch this data, hide it").Không đưa vào UC. BA đánh giá nhóm câu hỏi này sai về mặt flow nghiệp vụ hoặc quá thiên về technical, không thuộc phạm vi SRS. Giả định bên trái không được áp dụng khi viết docs.❌ Không viết vào UC (BA, 2026-08-10)

Phần 3 — Cross-UC & Missing Dependency (thông tin cho Agent 3)

LoạiNội dung
[MISSING_DEPENDENCY]UC_4.14.1 (Discord Chat Stream TWO-WAY — LIVE), UC_4.5.2 (The Pit), UC_4.14.2 (Pod Mentorship) chưa có SRS — UC_4.5.1 sẽ tham chiếu bằng plain text kèm ghi chú "not yet documented in this repo", đúng pattern đang dùng ở UC_4.1.1-4.1.5_v1.md.
Cross-UC ràng buộcBR_4.1.4.4 (UC_4.1.4 — Newsquawk Audio Stream) đã quy định auto-off khi vào màn này → UC_4.5.1 tham chiếu rule đó, không viết lại (Single Source of Truth). Xem thêm A-10.
Điểm vàoSidebar tab Community (Ref: UC_4.1.2 §2 Screen Description row 2) là điểm điều hướng duy nhất tới màn chứa widget này.
Không thuộc scope UC nàyLive chat panel (UC_4.14.1 LIVE two-way / UC_4.9.1 SIM one-way), My POD card (UC_4.14.2 LIVE / UC_4.9.2 SIM), The Pit card (UC_4.5.2), và các câu hỏi treo #1/#2/#3/#6/#7 trong SIM_Community_Wireframe_Brief.md (đều thuộc 3 UC trên).

On this page