QnA Init Docs — UC_4.14.1 Discord Chat Stream (TWO-WAY) — LIVE
QnA Init Docs — UC_4.14.1: Discord Chat Stream (TWO-WAY)
| Field | Value |
|---|---|
| UC | UC_4.14.1 — Discord Chat Stream (TWO-WAY) (Module: Community & Live Broadcast — LIVE) |
| WBS Category | STAGE 2.2: DASHBOARD LIVE → folder dashboard_live/ |
| BA PiC | anh.hoang12 (Anh Hoang) — theo WBS |
| Phạm vi | Chiều outbound (Dashboard → Discord) + trạng thái vùng input theo 2 gate (Level / Discord link). Chiều inbound (Discord → Dashboard) không viết lại — reference sang UC_4.9.1. |
| Ngày tạo | 2026-08-26 |
| Trạng thái | 📤 SRS UC_4.14.1_v1.md đã xuất bản. Q-01 đã chốt (BA, 2026-08-26 — khoá input, không ẩn). Còn 9 open item ở §10 của SRS chờ khách/BE chốt (2 mục 🔴 blocking). |
Nguồn đã đối chiếu trước khi viết:
References/CR/_CR_INDEX.md— quét toàn bộ CR. Có 1 CR trực tiếp:CR-20260818-002(Flow 38 monitor thêm#live-broadcast-chat) và 1 CR gián tiếp:CR-20260720-004(Freshdesk thay Zendesk).References/QnA from clients/03_STAGE2_DASHBOARD_EVALUATION/Community + Settings/QnA_STAGE2_COMMUNITY_LIVE_BROADCAST.md§2 — Discord Chat Stream ([DCS-*]), + §5 The Pit ([PIT-BIZ-03]trigger word list).References/Customer supplies/(Stage 2) Community & Settings/Discord Server Details.md— §#live-broadcast-chat, §#verify, §Compiled Discord Roles and Badges.References/Customer supplies/—RFQ_ Stack Trading Prop Tech V7.pdf§2.3 Discord Bot & Message Queueing + §Community, Trustpilot and Discord Bot Endpoints;RFQ_ Website and Dashboard Implementation V7.pdf§Community Page Implementation.docs/BA/UC_4.1-4.17/dashboard_sim/UC_4.9.1/UC_4.9.1_v1.md— UC anh em (ONE-WAY, SIM).BR_4.9.1.12đã chỉ đích danh UC_4.14.1 sở hữu chiều outbound.docs/BA/UC_4.1-4.17/dashboard_common/UC_4.5.1/UC_4.5.1_v1.md— nguồn cờis_live;UC_4.5.2_v1.md— nguồn link-token block trên card The PIT.docs/BA/Common_rule/common_rules.md— CR-02 (text field), CR-08 (timestamp), CR-14 (WebSocket reconnection).References/QnA from clients/.../SIM_Community_Wireframe_Brief.md— brief SIM 2026-08-07, nguồn của các state CHAT-1 → CHAT-4 và của các câu hỏi chặn.- Design pack khách gửi 2026-08-26 (6 state màn Community LIVE) — do BA cung cấp trực tiếp, chưa commit vào
References/Wireframe/.
Phần 1 — Nội dung khách ĐÃ CHỐT (dùng thẳng khi viết SRS)
| # | Nội dung đã chốt | Nguồn |
|---|---|---|
| 1 | Panel là 2 chiều ở LIVE. Quyền post (Read/Write) của #live-broadcast-chat chỉ dành cho role Associate Trader trở lên = LIVE Level 1+. | [DCS-DEF-02], Discord Server Details.md |
| 2 | Chỉ gửi được sau khi đã link Discord. Chưa link → vùng input bị khoá (không ẩn): 🔒 + placeholder Link your Discord account first to unlock chat. (A18 gốc ghi "should be hidden" → đã bị supersede bởi design 2026-08-26 + quyết định BA cùng ngày, xem Q-01.) | [DCS-BIZ-18] (Adam) + design pack 2026-08-26 |
| 3 | Endpoint chính thức: POST /community/chat/send — thay cho POST /chat/send ghi trong WBS. Input { user_id, message_text }, response HTTP 202 Accepted ngay lập tức. | [DCS-EP-01], RFQ_ Stack Trading Prop Tech V7.pdf §Community Endpoints |
| 4 | Không có lớp kiểm duyệt nội dung custom ở endpoint. Bắt buộc có rate limit theo user ~1 request/giây/user để chặn spam làm ngập Redis queue. | [DCS-EP-02] |
| 5 | Bị throttle → hiện inline notice Message rate limit reached. Please wait a moment. | [DCS-BIZ-12] |
| 6 | Pipeline outbound: Redis memory queue → Batch Worker. Nếu velocity > 1 msg/s → worker gộp N message thành 1 payload Discord format [User A]: Message \n [User B]: Message. Mục đích: né rate limit Discord 5 msg / 5s / channel. | RFQ_ Stack Trading Prop Tech V7.pdf §2.3, [DCS-BIZ-11] |
| 7 | Không optimistic render. Frontend KHÔNG hiển thị message tại thời điểm bấm Send. Live Chat Feed là component read-only hoàn toàn, chỉ được đổ bởi DISCORD_CHAT_STREAM. Message chỉ quay lại khi đã post thành công lên Discord. | [DCS-BIZ-20] (Adrian Stack, 2026-08-18) |
| 8 | Message bị AutoMod chặn → không bao giờ quay lại dashboard → không cần UI flag, không cần animation xoá, không cần error toast riêng cho moderation. | [DCS-BIZ-20] |
| 9 | Flow 38 mở rộng 2 → 3 channel: Node.js Discord Bot phải monitor thêm #live-broadcast-chat, bên cạnh #the-pit và #verify. Native AutoMod không hiểu ngữ cảnh trading nên không chặn được khiếu nại vận hành. | [DCS-BIZ-21] → CR-20260818-002 |
| 10 | Trigger word list Flow 38: slippage, lag, frozen, scam, missing payout, Rithmic down, MT5 down, TradingView down, connection dropped. Gemini sentiment gate phân loại Complaint / Positive / Neutral. Complaint → xoá message + public placeholder reply + ticket Freshdesk Priority = High. | [PIT-BIZ-03], RFQ_ Stack Trading Prop Tech V7.pdf §2.3, CR-20260720-004 |
| 11 | Giới hạn 2.000 ký tự, enforce bằng HTML maxlength. Không build character counter custom. | [DCS-BIZ-04] |
| 12 | Enter = gửi. Shift+Enter = xuống dòng (giống Discord). | [DCS-UI-03] (Adam) |
| 13 | Chỉ plain text + Unicode emoji. Không emoji picker custom (dùng bàn phím OS), không custom Discord emoji, không upload ảnh/GIF, không link preview, không @mention auto-complete. | [DCS-BIZ-05], [DCS-BIZ-06], [DCS-UI-01] |
| 14 | Không có emoji reaction — reaction chỉ tồn tại bên Discord native, không sync về Dashboard. | [DCS-UI-01] |
| 15 | Panel chat mở/đóng đúng cùng thời điểm với video, chỉ điều khiển bởi cờ is_live. Offline → xoá sạch message, hiện No live chat, input khoá, placeholder Waiting for session.... | [DCS-TRIG-01], [DCS-BIZ-10] |
| 16 | Hydrate 50 tin gần nhất từ Redis khi mount; rolling window cố định 50 tin; không pagination, không infinite scroll. | [DCS-BIZ-08], [DCS-BIZ-09] |
| 17 | Chiều inbound stream real-time 1:1, không batching. Thứ tự FIFO theo timestamp nhận (UTC). | [DCS-BIZ-11], [DCS-BIZ-13] |
| 18 | Tên hiển thị = nickname Discord server + role metadata append tự động. User không tự set được tên/avatar từ Dashboard.⚠️ Superseded một phần bởi CR-20260903-001 (2026-09-03): message gửi từ Dashboard nay đi qua Discord Webhook với username + avatar_url lấy từ Users record, không phải từ profile Discord (Ref: BR_4.14.1.12). Message gõ trực tiếp trong app Discord vẫn giữ nguyên. Câu "user không tự set được" vẫn đúng — cả hai field đều do BE điền. Còn mở: lấy Full Name hay Discord nickname (§10 item 11). | [DCS-BIZ-01] → [DCS-BIZ-03] |
| 19 | Auto-scroll khi neo đáy; giữ vị trí + badge New Messages khi đã cuộn lên. | [DCS-BIZ-07] |
| 20 | Không hiển thị online count trên panel chat ở mọi state — Discord API không cấp số online theo từng text channel. | [DCS-BIZ-15] → đã đóng bởi BR_4.9.1.11 |
| 21 | Flow 7 §Digital Eviction gọi POST /discord/revoke-all-roles: strip title role + pod role, KHÔNG kick khỏi server, KHÔNG xoá discord_user_id. User tụt về everyone (read-only public). | [DL-BIZ-04], RFQ_ Stack Trading Prop Tech V7.pdf §Community Endpoints |
| 22 | Link-token block (Link your Discord account first + 3 bước + [Copy]) nằm trên card The PIT, đã do BR_4.5.2.7 sở hữu — UC này không viết lại. | [PIT-BIZ-01], UC_4.5.2_v1.md |
Phần 2 — Câu hỏi & giả định cần BA / khách chốt
Toàn bộ mục dưới đây đã được ghi vào §10 của
UC_4.14.1_v1.mdvới cùng số thứ tự, để reviewer đọc SRS là thấy ngay. Q-01 đã chốt → nằm ở bảng Closed by this document của §10; Q-02 → Q-10 vẫn ở bảng Open Items và giữ nguyên số, nên §10 bắt đầu từ mục 2.
| ID | Loại | Câu hỏi / Giả định | Cách xử lý trong SRS v1 | Trạng thái |
|---|---|---|---|---|
| Q-01 | SOURCE_CONFLICT | Chưa link Discord: ẩn input hay khoá input? [DCS-BIZ-18] nói "the ability to send messages should be hidden". Design pack 2026-08-26 vẽ input hiện + khoá + 🔒 + placeholder Link your Discord account first to unlock chat. | ✅ BA chốt 2026-08-26: khoá, không ẩn. Viết theo design. Lý do: input biến mất không giải thích gì cho trader, và bỏ hẳn row mâu thuẫn với chính ràng buộc "so the UI grid does not break" khách đã nêu 2 lần. A18 bị supersede ở điểm này. Note ⚠️ trong BR_4.14.1.2 đã đổi thành note quyết định; item chuyển sang bảng Closed by this document ở §10 của SRS. Không log thành CR — cả 2 nguồn đều từ khách, nguồn mới hơn thắng, không phát sinh scope/endpoint mới. | ✅ Đã chốt (BA, 2026-08-26) |
| Q-02 | SPEC_GAP 🔴 | Author attribution khi bot relay. Worker post dưới danh tính bot, và khi gộp thì 1 message Discord chứa text của nhiều trader. Không nguồn nào nói author / is_host của payload inbound được lấy từ đâu. Đọc thẳng theo tài liệu → dashboard sẽ render 1 bubble tác giả là bot chứa nhiều người, phá BR_4.9.1.5 và phá Host highlight. | BA đề xuất: bot carry author + is_host qua Redis queue và tách payload gộp thành N event DISCORD_CHAT_STREAM riêng, mỗi sender 1 event. Ghi vào BR_4.14.1.3 dưới dạng đề xuất, đánh dấu blocking. | ⏳ Blocking BE |
| Q-03 | INTRA_RULE_CONTRADICTION | Design LIVE lệch với UC_4.9.1 ở 2 điểm dù là cùng 1 component: (a) Read less — design vẽ inline trong bubble, BR_4.9.1.9 viết sticky ở góc dưới phải khung chat; (b) badge — design có cả New Message (số ít) lẫn New Messages (số nhiều). | (a) viết theo design + flag divergence ở BR_4.14.1.7 và §9 row 5; (b) viết là label theo số lượng tin chưa xem. | ⏳ Chờ design/khách |
| Q-04 | UX_GAP | Sender không nhận feedback gì khi message bị chặn. (Open Item #15 của QnA_STAGE2_COMMUNITY_LIVE_BROADCAST.md.) | Ghi rõ ràng là im lặng có chủ đích trong BR_4.14.1.10 + §7, để QA không log bug. Nếu khách muốn feedback → BE phải đọc AutoMod event + bắn WS event mới (scope mới). | ⏳ Chờ khách |
| Q-05 | TECH_RISK 🔴 | Discord AutoMod có quét message do bot post không? Toàn bộ layer 1 giả định là có, nhưng mọi message từ Dashboard đều đi qua bot, không đi qua account của trader. | Viết đúng như khách mô tả, kèm cảnh báo BE phải verify với platform behaviour của Discord. Nếu AutoMod không áp cho bot → Dashboard không có filter nào và phải thêm custom pre-post filter (scope mới). | ⏳ Blocking BE verify |
| Q-06 | IMPACT_ANALYSIS | Thiệt hại dây chuyền trong payload gộp. N message của N trader gộp thành 1 post; chỉ cần 1 dòng dính AutoMod / Flow 38 → cả payload bị chặn hoặc bị xoá, kéo theo các message vô tội. | Ghi consequence vào BR_4.14.1.3 + BR_4.14.1.10. Giải pháp của Q-02 (tách per-sender) cũng đóng luôn mục này. | ⏳ Chờ khách |
| Q-07 | CR_OPEN | Flow 38 có post public placeholder reply trong #live-broadcast-chat không? Ở #the-pit thì có; nhưng ở broadcast chat reply đó sẽ stream lên dashboard của mọi người ngay giữa buổi live. (Open question 1 của CR-20260818-002.) | Viết theo hành vi Flow 38 hiện có, flag ở §10. | ⏳ Chờ khách |
| Q-08 | RACE_CONDITION | Message bị Flow 38 xoá SAU khi đã lên WebSocket. DISCORD_CHAT_STREAM là append-only, không có retract event. (Open question 4 của CR-20260818-002.) | Không spec cơ chế retract. Flag ở §10: hoặc thêm WS event mới, hoặc chốt rằng message đã render sẽ nằm đó tới khi rolling window 50 tin purge đi. | ⏳ Chờ khách |
| Q-09 | RESPONSIVE | Layout mobile của panel chat — [DCS-UI-02] khách không trả lời. (Open Item #5.) | Không spec trong UC v1. | ⏳ Chờ khách |
| Q-10 | SOURCE_HYGIENE | Design pack 2026-08-26 chưa có trong repo — 6 state được cite nhưng không mở được từ References/Wireframe/Stage 2.2/. | Cite là "client design pack, 2026-08-26", flag ở §10. | 📋 BA cần commit file |
Phần 3 — Giả định BA tự đóng (không cần hỏi khách)
| ID | Giả định | Căn cứ | Ghi vào |
|---|---|---|---|
| A-01 | Thứ tự ưu tiên state của input row: is_live == false > Level 0 > chưa link Discord > enabled. | Cùng dạng va chạm mà SIM_Community_Wireframe_Brief.md câu hỏi chặn #2 nêu ra. Lý do: (a) trạng thái phiên là nguyên nhân gần nhất và sẽ hết trước; (b) link Discord không nâng Level 0 lên Level 1, nên hiện copy "link Discord" cho SIM là chỉ dẫn sai. | BR_4.14.1.2 |
| A-02 | Chiều inbound không viết lại, chỉ reference sang UC_4.9.1. | BR_4.9.1.12 đã tuyên bố ranh giới ngược lại (outbound thuộc UC_4.14.1). Hai panel là cùng 1 component → duplicate rule sẽ lệch nhau ngay lần sửa đầu tiên. | BR_4.14.1.7 |
| A-03 | Input giữ nguyên text khi bị rate limit / lỗi mạng, chỉ clear khi nhận 202. | Khách không nói, nhưng bắt trader gõ lại 2.000 ký tự là phản UX; và 202 là tín hiệu duy nhất xác nhận đã vào queue. | BR_4.14.1.5, §9 row 7 |
| A-04 | Message đã 202 mà session kết thúc thì không bị huỷ — worker vẫn có thể post lên Discord sau khi panel đã đóng. | Không có cơ chế cancel trong pipeline Redis + worker. Discord là system of record; panel chỉ là cửa sổ nhìn vào, và cửa sổ đóng theo session. | BR_4.14.1.8 |
| A-05 | CR-02 không áp cho ô input này (255/500 ký tự + inline error khi out-click + placeholder Enter [label]). | Khách chốt cứng 2.000 ký tự block-on-limit và 4 chuỗi placeholder riêng → override CR-02 §2.2 và §2.3. | BR_4.14.1.6 |
| A-06 | Reconnecting… là chip cạnh header Live chat, không phải banner full-width trên list (brief SIM đề xuất banner). | Design pack 2026-08-26 vẽ chip cạnh header. CR-14 chỉ quy định hành vi, không quy định vị trí. | BR_4.14.1.9, §9 row 2 |
| A-07 | Hai gate chỉ được evaluate lúc mount, không poll discord_user_id, không subscribe event link. | Khách đã từ chối polling ở mọi chỗ khác trên trang này ([LB-TRIG-02], [LB-EP-02]). Trader link xong phải reload — chấp nhận được vì link Discord là hành động một lần. | BR_4.14.1.1 |
| A-08 | Whitespace-only không gửi được, coi như rỗng. | CR-02 §2.1 — spaces-only input treated as empty. Đây là phần duy nhất của CR-02 còn áp dụng. | BR_4.14.1.6, §9 row 7 |
| A-09 | Message của chính người gửi không có style riêng (không "me bubble", không tick sent/delivered). | Hệ quả trực tiếp của [DCS-BIZ-20]: feed read-only hoàn toàn, message quay về qua WS y hệt message người khác → không có thông tin nào để phân biệt ở tầng render. | BR_4.14.1.4, §9 row 3–4 |
| A-10 | Sau Digital Eviction, input chỉ khoá ở lần load kế tiếp; message gửi trong khoảng chờ sẽ vào queue rồi bị Discord từ chối và biến mất im lặng. | Hệ quả của A-07 + [DL-BIZ-04] (revoke role nhưng không kick, không xoá discord_user_id). | BR_4.14.1.11 |
Phần 4 — Impact sang tài liệu khác
| Tài liệu | Impact | Trạng thái |
|---|---|---|
UC_4.9.1_v1.md — BR_4.9.1.12 | Rule ghi *"owned by UC_4.14.1 — Discord Chat Stream (TWO-WAY), LIVE (not yet documented in this repo)". Nay đã có doc → cần đổi thành link tới UC_4.14.1_v1.md`. | ⏳ Chưa apply |
UC_4.9.1_v1.md — BR_4.9.1.9 | Vị trí Read less lệch với design LIVE (Q-03a). Hai panel là cùng component → phải đồng bộ sau khi khách chốt. | ⏳ Chờ Q-03 |
UC_4.9.1_v1.md — BR_4.9.1.8 | Badge label: BR_4.9.1.8 chỉ ghi New Messages; design LIVE có thêm New Message số ít (Q-03b). | ⏳ Chờ Q-03 |
UC_4.5.2_v1.md — BR_4.5.2.8 | Đang ghi "Flow 38 monitors #the-pit and #verify" → phải thêm #live-broadcast-chat theo CR-20260818-002. | ⏳ Chưa apply (đã nêu trong CR summary) |
UC_4.6.1-4.6.4/UC_4.6.4_v1.md | Cùng lý do — file có tham chiếu Flow 38. | ⏳ Chưa apply |
UC cho Flow 38 (WBS UC_9.16) | Description WBS ghi "monitors #the-pit and #verify" → cần update channel list. | ⏳ Chưa apply |
WBS UC_4.14.1 | Cột Mapping BE ghi POST /chat/send → khách đã đổi thành POST /community/chat/send ([DCS-EP-01]). Cột Reference ghi channel #broadcast-chat → tên đúng là #live-broadcast-chat. | 📋 BA cần sửa WBS |
WBS UC_9.16 / estimate BE | Flow 38 mở rộng 2 → 3 channel; thêm Q-02 (tách payload per-sender) và Q-05 (custom pre-post filter nếu AutoMod không áp cho bot) → có thể phát sinh line item BE mới. | 📋 Cần review estimate |
References/Wireframe/Stage 2.2/ | Thiếu folder Community & Live Broadcast chứa 6 state design LIVE (Q-10). | 📋 BA cần commit |
QnA_STAGE2_COMMUNITY_LIVE_BROADCAST.md — [DCS-BIZ-18] | Answer gốc ghi "the ability to send messages should be hidden" → đã bị supersede bởi design 2026-08-26 + quyết định BA (Q-01). Cần annotate tại chỗ để người đọc sau không mở lại tranh luận này. | 📋 BA cần annotate |