QnA Init Docs — UC_4.5.2 The Pit (Discord Server Widget)
QnA Init Docs — UC_4.5.2: The Pit (Discord Server Widget)
| Field | Value |
|---|---|
| UC | UC_4.5.2 — The Pit (Discord Server Widget) (Module: Community & Live Broadcast) |
| WBS Category | STAGE 2: DASHBOARD - COMMON → folder dashboard_common/ |
| ✅ Renumber | Đã xong. BA chỉ đạo 2026-08-10 (The Pit: UC_4.5.4 → UC_4.5.2; Discord Chat Stream TWO-WAY: UC_4.5.2 → UC_4.14.1) nay đã được phản ánh trong WBS mới References/WBS/[BA Internal] Stacktrading.csv. Mọi cross-ref trong docs/BA/UC_4.1-4.17/ đã được map lại theo WBS này. |
| Phạm vi yêu cầu | BA yêu cầu viết cho SIM account. Khách đã confirm widget này giống hệt nhau ở SIM và LIVE ([C-34]) nên UC viết chung trong dashboard_common/, có ghi rõ SIM applicability. |
| Agent | Agent 2 — Challenger (Init Flow) |
| Ngày tạo | 2026-08-10 |
| Trạng thái | ✅ Đã đóng toàn bộ 2026-09-06 — A-15, A-16 đã có trả lời từ BE; không còn câu treo. Xem Trả lời QnA 2026-09-06. Trước đó: ✅ Đã đóng toàn bộ 2026-08-27. Cả 11 mục treo của Phần 2 (A-02 → A-13) đã được trả lời và apply vào UC_4.5.2_v1.md v2. 8 mục confirm đúng đề xuất BA/QC, 2 mục đảo ngược đề xuất (A-09 storage, A-12 common rule), 1 mục sinh CR (CR-20260827-001). Conflict hide-vs-stale ở mục A-12 đã đóng 2026-08-28 — giữ luật ẩn theo khách. |
Nguồn đã đối chiếu trước khi raise câu hỏi:
References/CR/_CR_INDEX.md— quét 30 CR, chỉ CR-20260720-004 (Zendesk → Freshdesk) chạm tới UC này qua Flow 38. Không có CR nào khác ảnh hưởng The Pit.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).Stage 2 - Dashboard & Fomula (Settings).csv(ký hiệu[S-n]) — phần Discord Linking, nguồn của link token.References/Customer supplies/(Stage 2) Community & Live Broadcast/Discord Server Details.md— đặc tả channel#the-pit,#verify, role/badge matrix, Freshdesk routing.References/Customer supplies/—RFQ_ Website and Dashboard Implementation V7.pdf§Community Page Implementation,Zapier Integration V7.pdfFlow 4 / Flow 38,RFQ_ Stack Trading Prop Tech V7.pdf§Community Endpoints.docs/BA/Common_rule/common_rules.md,list-toast-popup.md— không có rule sẵn cho deep-link card / metric polling.docs/BA/UC_4.1-4.17/community/SIM_Community_Wireframe_Brief.md(brief SIM, duyệt nội bộ 2026-08-07) — FUNCTION 4 (B7, PIT-1, PIT-2).docs/BA/UC_4.1-4.17/dashboard_common/UC_4.5.1/QnA_init_docs.md— UC anh em cùng màn, dùng để tránh trùng/đè rule.
✅ Trả lời QnA — 2026-09-06 (metric thứ 2: Traders in voice)
Nguồn: khách trả lời trực tiếp (The Pit — metric alignment) + BE confirm (Dat Nguyen, Thu 4:48 PM).
Trạng thái apply: đã ghi vào UC_4.5.2_v1.md v2.2.
⚠️ Đè lên A-02, A-07, A-13 của batch 2026-08-27 ở phần dưới. Khi mâu thuẫn, lấy phần này.
Chốt
| # | Điểm | Kết luận | Đã apply vào |
|---|---|---|---|
| A-13 🔄 | Nhãn metric thứ 2 | 🔄 ĐẢO NGƯỢC quyết định 2026-08-27. Nhãn đổi từ Voice channels active → Traders in voice. Chỉ là static text phía FE, không đổi layout, không đổi cadence poll. | BR_4.5.2.4 · §9 Row 9 |
| A-14 | Công thức Traders in voice | Duyệt mảng members của widget.json, đếm số object có channel_id. Ý nghĩa số không đổi (số người đang trong voice) — chỉ đổi field đọc, không còn duyệt mảng channels. | BR_4.5.2.4 · BR_4.5.2.11 · §9 Row 9 |
| A-02 | Traders online | Không đổi — vẫn map presence_count. | BR_4.5.2.4 |
| A-15 | Tên key trong DTO | traders_in_voice. Key đổi theo nhãn — lý do giữ tên cũ (voice_channels_active, "cho khớp nhãn UI") không còn hiệu lực sau khi nhãn đổi. | BR_4.5.2.3 |
| A-16 | Giới hạn mảng members | Không giới hạn. Mảng members không bị cắt bớt → Traders in voice đếm đủ, không lệch chuẩn so với Traders online. Rủi ro đếm thiếu BA nêu ra không xảy ra; không cần rule xử lý. | Không cần rule — chỉ ghi Changelog |
| A-17 | 1 UUID link được mấy account Discord? | Đúng 1. Account Discord nào submit /link trước thì chiếm token và trở thành discord_user_id; account thứ 2 submit cùng token bị bot từ chối. Trader không link được 2 account Discord, 2 trader không dùng chung 1 token. Dashboard không có nút unlink / re-link. | BR_4.5.2.6 |
| A-07 🔁 | Nguồn dữ liệu / API | Không đổi gì: vẫn GET https://discord.com/api/guilds/{Server_ID}/widget.json, vẫn cache Redis 30s, vẫn endpoint public GET /community/server-status. Không thêm API mới, không đổi kiến trúc BE — cả 2 metric lấy từ cùng 1 payload đang fetch sẵn. BE xác nhận: "vẫn api cũ, nhưng nó bảo lấy từ members có channel id thay vì lấy channel". | BR_4.5.2.3 |
✅ Trả lời QnA — 2026-08-27 (11 câu · đóng toàn bộ Phần 2)
Nguồn: BA/khách trả lời trực tiếp trên file này.
Trạng thái apply: đã ghi vào UC_4.5.2_v1.md v2.
⚠️ Đọc kèm: phần này đè lên mọi đề xuất BA/QC ở Phần 2 phía dưới. Khi 2 chỗ mâu thuẫn, lấy phần này.
Chốt
| # | Điểm | Kết luận | Đã apply vào |
|---|---|---|---|
| A-02 | Nhãn Traders online | Giữ nguyên. Members online bị bác. Chấp nhận sai lệch nghĩa — con số là presence_count server-wide gồm staff, bot, public chưa verify; card coi mọi member là trader. Nguyên tắc khách: "keep it simple, no scope increases for custom UI changes". | BR_4.5.2.4 — bảng nhãn mới |
| A-13 | Nhãn Voice channels active | ⛔ ĐÃ BỊ ĐÈ 2026-09-06 — nhãn nay là Traders in voice. (Nội dung cũ:) Giữ nguyên. In voice bị bác — chưa có quyết định chính thức nào từ khách yêu cầu đổi. Công thức headcount không đổi. Field DTO cũng giữ tên voice_channels_active cho khớp nhãn; BE không được đọc tên field theo nghĩa đen. | BR_4.5.2.4, BR_4.5.2.3 |
| A-07 | Contract GET /community/server-status | (a) Trimmed DTO {traders_online, voice_channels_active}, cấm passthrough raw widget.json. (b) 🔄 PUBLIC — không cần auth header, vì cặp metric này render cả ở website công khai ngoài Dashboard → đảo ngược đề xuất "authenticated only" của BA. (c) Lỗi upstream: degrade, không đẩy lỗi lên page level. | BR_4.5.2.3 — bảng contract mới + note rate-limit theo IP |
| A-04 | Vị trí khối 3 bước | Trong thân card The Pit, cố định, cạnh widget My POD. Banner cấp trang bị bác — sẽ đẩy cả Bento Grid xuống. | BR_4.5.2.7 |
| A-05 | Metric = 0 | Hiện 0. Không có rule nào yêu cầu ẩn khi giá trị 0; metric là real-time nên 0 là số đọc thật. | BR_4.5.2.5 |
| A-06 | Breach có khoá card không | Không khoá. Frosted glass của Hard Breach chỉ phủ tab Command để ép Reset/Re-buy; trang Community vẫn vào được. Trader bị Flow 7 revoke role vẫn thấy card bình thường — Dashboard chỉ check cờ discord_user_id, không check phân quyền Discord real-time. | BR_4.5.2.1, BR_4.5.2.8 |
| A-08 | CR cho #the-pit announcement | Có — bắt buộc log CR. Đã tạo CR-20260827-001 và đăng ký vào _CR_INDEX.md. Không đổi hành vi UC này — card không đọc/ghi announcement; CR rơi vào Flow 4 + UC Level-Up. | BR_4.5.2.9 — thêm cross-ref |
| A-09 | Lưu Server_ID + invite URL | 🔄 ĐẢO NGƯỢC đề xuất BA. Lưu ở env var backend, không đưa vào Table C. Table C hiện không chứa 2 field này và cũng không bổ sung. → Không phát sinh CR schema như BA lo ngại. | BR_4.5.2.3 — bullet mới |
| A-10 | State nút Enter PIT | Không đổi. Không Rejoin, không badge Joined, không disable. Dashboard không phân biệt được trader còn trong server hay đã rời. | BR_4.5.2.8 |
| A-11 | Loading state | Skeleton chỉ ở lần load đầu. Các lần poll 30s sau: silent, cập nhật tại chỗ, không spinner/skeleton/layout shift. | BR_4.5.2.3 |
| A-12 | Chuẩn hoá CR-14 | ✅ RÚT — không chuẩn hoá. Hide-on-error là quyết định từng widget, không phải default toàn platform: đúng cho embed bên thứ 3 rời rạc (Trustpilot), sai cho widget lõi vận hành (PnL Gauge, Position Monitor) vì panel biến mất sẽ bị đọc thành "flat / no positions" chứ không phải "no data". | BR_4.5.2.5 |
✅ Conflict ĐÃ ĐÓNG 2026-08-28 — A-12 áp lên chính The Pit
Câu trả lời A-12 xếp The Pit vào nhóm widget lõi vận hành và đề xuất: card này cũng không được ẩn khi lỗi, phải giữ giá trị cache Redis gần nhất để không vỡ Bento Grid.
Điều này ngược hoàn toàn với BR_4.5.2.5 hiện tại, vốn viết theo nguyên văn khách chốt cho đúng 2 metric này:
"If we are unable to fetch this data, hide it." — kèm lệnh cấm giữ lại số cũ (
[C-37])
Xử lý: theo priority chain của dự án (QnA confirmed ★★★ > nhận định nội bộ), BR_4.5.2.5 giữ nguyên và đó là thứ phải build. Muốn serve stale cache thì phải có khách đảo lệnh, không phải BA tự quyết — vì trader không phân biệt được 41 online cache với 41 online thật, đúng thứ khách cấm.
→ ✅ BA chốt 2026-08-28: giữ luật ẩn. Đề xuất serve-stale bị rút. Lý do nhắc lại: số cache cũ trong lúc Discord down làm trader hiểu nhầm, tệ hơn việc card ngắn lại một lúc. Đã gỡ block conflict khỏi BR_4.5.2.5, thay bằng note ✅ closed.
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ốt | Nguồn |
|---|---|---|
| 1 | The Pit có cho SIM, không có locked/upsell state. Read và write mở hoàn toàn cho mọi active trader từ Level 1 → Level 24. "SIM traders do not face chat restrictions in The Pit." | [C-34] |
| 2 | Chỉ public unverified user mới bị giới hạn read-only. Khác biệt giữa các tier không nằm ở quyền chat mà ở channel visibility (level càng cao mở thêm private team channel / priority support / partner area). | [C-34], [S-17] |
| 3 | #the-pit và #live-broadcast-chat là 2 text channel khác nhau trong cùng 1 server. #the-pit = lounge cộng đồng, feeds the Community Page. #live-broadcast-chat = kênh riêng cho livestream, feed chat UI trên Command Center. | [C-34] |
| 4 | #the-pit là text channel, không phải voice channel. Nguyên văn: "Voice is not applicable as this is a text channel." → phủ định mô tả cũ trong WBS ("One click joins the voice channel"). | [C-34] |
| 5 | Card là custom UI card, KHÔNG phải iframe embed Discord Server Widget. Phủ định mô tả trong RFQ_ Website and Dashboard Implementation V7.pdf ("native Discord Server Widget iframe"). | [C-37], [C-38] |
| 6 | ⚠️ [UPDATE 2026-08-12 — chỉ giữ 1 CTA] Vì Enter PIT và Open Discord mở cùng 1 luồng, khách chốt xoá Open Discord khỏi state đã link; card chỉ còn 1 CTA duy nhất = Enter PIT ở header, khối Community Chat / Discord Gateway thành display-only. Open Discord chỉ còn tồn tại ở bước 2 của khối hướng dẫn khi chưa link (ở đó nó là 1 bước trong quy trình 3 bước, không phải CTA trùng lặp). Hành vi deep link không đổi. → Đã áp vào BR_4.5.2.2.(Nội dung cũ, vẫn đúng về mặt hành vi:) 2 CTA Enter PIT và Open Discord là deep link qua server invite URL, mở thẳng Discord desktop app hoặc web client (app-first, web fallback) — không phải link mở tab tới URL channel.Khách trả lời gộp chung 2 CTA trong đúng 1 câu: "The card's CTAs ('Enter PIT' and 'Open Discord') launch the Discord desktop application or web client directly via the server invite URL." → cùng 1 hành vi, cùng 1 invite URL, khác nhau chỉ ở vị trí đặt (header card vs thân card). Khách không cấp deeplink cấp channel nên cấm bịa ra deeplink riêng trỏ thẳng #the-pit. | [C-37], [C-38] |
| 7 | [SUPERSEDE 2026-08-10] FE KHÔNG được gọi widget.json của Discord trực tiếp nữa. Toàn bộ metric đi qua backend caching proxy: BE gọi https://discord.com/api/guilds/{Server_ID}/widget.json, parse, cache Redis TTL 30 giây. Lý do khách nêu: "To prevent Discord from rate-limiting our frontend traffic." | [C-37], [C-39] |
| 8 | Endpoint mới: GET /community/server-status (method GET). FE query endpoint nội bộ này, client browser không bao giờ gọi thẳng Discord. | [C-37], [C-39] |
| 9 | FE poll 30 giây/lần (silent background fetch) tới GET /community/server-status. [SUPERSEDE] con số 10 phút trong answer cũ của Adam đã bị thay. | [C-37] |
| 10 | Traders online = field presence_count từ cached widget payload. Scope = TOÀN BỘ Discord server, KHÔNG giới hạn trong #the-pit, KHÔNG lọc theo role. [CONFLICT CLOSED] yêu cầu lọc role Stack Trader / Associate của Adam đã bị drop — không cần privileged intent, không cần bot query. | [C-37] |
| 11 | 🔴 [SUPERSEDED 2026-08-12 — Adrian Stack, The Pit / Business logic A9(b).2] Công thức đã đổi: Voice channels active = TỔNG SỐ MEMBER đang connect trong tất cả voice channel (sum members của các voice room trong cached payload), KHÔNG còn là số room. Nguyên văn: "Displaying the number of active rooms does not show community engagement. The dashboard needs to reflect the total number of users actively participating in voice at that moment." Ví dụ: 3 room có 4 + 2 + 1 người → hiện 7, không phải 3. Vẫn không có mẫu số, vẫn server-wide. → Đã áp vào BR_4.5.2.4.(Nội dung cũ — đã bị thay, giữ lại để truy vết:) Voice channels active = đếm số voice room đang có member active trong mảng channels của cached payload. Không hiển thị mẫu số / tổng số. Cùng scope server-wide như Traders online.Ý nghĩa nghiệp vụ — khách giải thích rõ, không phải suy diễn: "Each trader is assigned a pod, and each pod can have several members. This should display the voice channel count of how many voice channels have active members in them." → metric này cố ý phản ánh mức độ sôi động voice của các Pod trên toàn server (pod-[leader_name], private text + voice), đóng vai trò chỉ báo "cộng đồng đang hoạt động cỡ nào" — không phải chỉ báo riêng của channel #the-pit.⚠️ Không nhầm với [C-34] ("Voice is not applicable as this is a text channel"): câu đó trả lời câu hỏi SIM có bị hạn chế voice trong The Pit không — không có voice restriction để bàn vì bản thân #the-pit là text channel. Hai câu nói về 2 việc khác nhau, không mâu thuẫn. | [C-37], [C-34] |
| 12 | Fetch metric thất bại → ẩn hẳn cả 2 dòng metric. Cấm giữ số cũ, cấm hiện placeholder —. Nguyên văn: "If we are unable to fetch this data, hide it." | [C-37] |
| 13 | User chưa link Discord (discord_user_id = null) → dashboard BẮT BUỘC hiện CTA hướng dẫn user copy link token trước khi cho họ rời sang Discord, và phải hướng dẫn paste token vào channel #verify. Không có bước này user chỉ nhận default read-only public access, không mở được paid trader role. | [C-37], [S-17] |
| 13b | Token CTA xuất hiện ở cả 2 nơi, không phải chọn 1: Community tab ("We discussed somewhere else, likely on the community tab, but we should help users with their token linking if they haven't already") và Settings ("I don't think it is there either, feel free to add it there as well — especially if they haven't linked yet and we need to give them a token"). → UC_4.5.2 sở hữu bản trên Community. Bản trong Settings hiện không có UC nào sở hữu trong WBS mới (UC_4.6.2 nay là Profile & Preferences, không còn là Discord Linking) → BA cần bổ sung 1 dòng WBS cho Settings — Discord Linking, hoặc gộp vào UC_4.6.1 Connections & Credentials. | [S-17] |
| 14 | Link token là UUID single-use, sinh 1 lần duy nhất tại Flow 1 Step 6. Không rotate, không refresh, không expire. Bot xoá token khỏi DB ngay sau khi user chạy /link. Mất email onboarding → dashboard hiển thị lại đúng token cũ đó, không sinh token mới. | [S-18], [S-20], [S-22] |
| 15 | Sau khi discord_user_id được ghi vào DB → Settings dashboard vĩnh viễn hiển thị status Connected và ẩn hẳn khối token. | [S-18] |
| 16 | Invite link đưa user vào default landing channel của server, không phải thẳng #verify; hướng dẫn onboarding phải nói rõ user tự navigate sang #verify. Mọi user click invite link đều nhận role everyone = read-only public channel. | [S-17] |
| 17 | Hành động link không dùng HTTP REST endpoint — dùng Discord Slash Command /link [discord_link_token]. Bot listener match user trong PostgreSQL → ghi discord_user_id → gán role Associate Trader → xoá token. | [S-22] |
| 18 | KHÔNG build bell notification / toast trên dashboard cho announcement Discord. Nguyên văn: "Do not build any custom dashboard bell notifications or toasts for Discord announcements. Do not increase the scope of this build." Announcement chỉ tồn tại trong Discord. | [C-37] |
| 19 | [THAY ĐỔI so với Zapier V7] Ngừng post announcement level-up vào #the-pit. Nguyên văn: "Lets not post to #the-pit. That channel is for organic community chat." Tất cả announcement chuyển hết về #trading-floor-announcements hoặc #viral-wins; bỏ luôn cơ chế "Silent vs. Viral". | [C-37], [S-4] |
| 20 | Flow 38 (Digital Concierge): bot monitor #the-pit + #verify → phát hiện trigger word → Gemini LLM phân loại Complaint / Positive / Neutral → nếu Complaint: xoá message gốc, post public reply mẫu, bắn webhook Zapier → map discord_id → email → tạo Freshdesk ticket (Priority = High). | Zapier Integration V7.pdf Flow 38, Discord Server Details.md, CR-20260720-004 |
| 21 | Danh sách trigger word Flow 38 (khách chốt, có thể thêm/bớt sau): slippage, lag, frozen, scam, missing payout, Rithmic down, MT5 Down, TradingView down, connection dropped. | [C-37] |
| 22 | Flow 7 (Digital Eviction) chạy POST /discord/revoke-all-roles: chỉ strip title role + pod role. KHÔNG kick user khỏi server, KHÔNG xoá discord_user_id. User tụt về read-only public access nhưng vẫn ở trong server. | [S-20] |
| 23 | User mua evaluation mới mà discord_user_id IS NOT NULL → bỏ qua bước sinh token, gọi thẳng /manage-discord-role gán lại role Associate Trader. Không bắt verify lần 2. | [S-20] |
| 24 | Hệ thống không quản lý display name. User join bằng Discord profile sẵn có, tự đổi server nickname theo hành vi Discord chuẩn. | [S-20] |
| 25 | The Pit không có khái niệm giờ hoạt động — luôn mở, không có state Online/Offline gắn với lịch broadcast. Hoạt động song song và độc lập hoàn toàn với trạng thái Live Broadcast (Ref: UC_4.5.1). | QnA_STAGE2_COMMUNITY_LIVE_BROADCAST.md §4 |
| 26 | [MỚI 2026-08-12 — A9(a)] Traders online đếm user từ TẤT CẢ channel, bao gồm cả Landing Pad. Không lọc role phía mình. Đây là làm rõ, không đổi công thức (vẫn presence_count server-wide như mục 10). | [C-37] A9(a) |
| 27 | [MỚI 2026-08-12 — A9(b).1] Cấu trúc POD trên Discord: POD không phải chỉ là voice channel. Mỗi POD là 1 Discord Category, bên trong có 1 text channel + 1 voice channel riêng, chỉ member của POD đó thấy và vào được. Đây là yêu cầu provisioning phía Discord server (thuộc Pod Mentorship / Discord Server Details.md), UC_4.5.2 chỉ ghi lại làm ngữ cảnh cho công thức voice metric → BR_4.5.2.11. | [C-37] A9(b).1 |
| 28 | [MỚI 2026-08-12 — QnA design review] Khi chưa link Discord, copy khối hướng dẫn được viết lại: heading Link your Discord account first; 3 bước có nhãn hành động — 1 Copy your token, 2 Join the server, 3 Type the command /link followed by your token in the #verify channel.; dòng hỗ trợ đổi thành Complete verification to participate, access exclusive trading rooms, and unlock your badges. (thay câu cũ Without this you'll only get read-only public access). Chỉ đổi copy — luật access không đổi (chưa verify vẫn chỉ có role everyone / read-only). → BR_4.5.2.7 | QnA update 2026-08-12 |
Phần 2 — Câu hỏi & giả định cần BA chốt
UC_4.5.2 — The Pit (Discord Server Widget)
| ID | Câu hỏi | Giả định (BA/QC đề xuất) | BA chốt (ưu tiên cao nhất) | Trạng thái |
|---|---|---|---|---|
Voice channels active mâu thuẫn với định nghĩa "The Pit là text channel". | — | ❌ RÚT — câu hỏi sai, khách đã trả lời đủ trong CSV. [C-37] A7 nêu rõ cả cách đếm lẫn lý do: "Each trader is assigned a pod, and each pod can have several members. This should display the voice channel count of how many voice channels have active members in them." → metric cố ý đo voice của các Pod trên toàn server. Còn "Voice is not applicable as this is a text channel" [C-34] là trả lời cho câu hỏi SIM có bị hạn chế voice không (Q-SIM-14), không phải nói về metric. Hai câu khác phạm vi → không mâu thuẫn. Nội dung đã chuyển vào Phần 1 mục 11. | ❌ Rút (2026-08-10) | |
| A-02 | [GỬI KHÁCH — không phải BA tự quyết] Cách đếm Traders online đã chốt (presence_count, server-wide, không lọc role — Phần 1 mục 10), không có mâu thuẫn. Điểm còn treo chỉ là wording của nhãn: presence_count bao gồm cả staff, member public chưa verify và bot có report presence, nên chữ "Traders" hẹp hơn con số thực tế. Đây là mục chính CSV đã tự flag: "Impact note for BA: … Label wording on the card may need a review with the client if that is misleading." | Viết SRS giữ nguyên nhãn Traders online theo đúng wireframe khách đã duyệt, và ghi rõ trong Business Rule rằng con số là server-wide presence, không phải số trader đã verify — để dev/QC không hiểu sai. Song song gửi khách 1 câu hỏi wording (đề xuất Members online); nếu khách đổi ý thì chỉ sửa label, không đổi công thức. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — giữ nhãn, Members online bị bác |
Enter PIT và Open Discord là 1 hay 2 action khác nhau? | — | ❌ RÚT — khách đã trả lời trong CSV. [C-38] A1 gọi tên cả 2 CTA trong đúng 1 câu: "The card's CTAs ('Enter PIT' and 'Open Discord') launch the Discord desktop application or web client directly via the server invite URL." → cùng 1 hành vi, cùng 1 invite URL. Nội dung đã chuyển vào Phần 1 mục 6. (Q-UI-21 trong file QnA gốc chưa được đánh dấu ANSWERED — BA nên cập nhật lại trạng thái câu đó.) | ❌ Rút (2026-08-10) | |
| A-04 | PIT-1 (chưa link Discord) đặt ở ĐÂU TRONG trang Community? Phần "màn nào" đã chốt rồi — khách nói hiện token CTA ở cả Community tab lẫn Settings [S-17] (xem Phần 1 mục 13b). Còn lại đúng 1 điểm chưa có answer: vị trí trong trang Community — (a) khối 3 bước nằm trong thân card The Pit (thay chỗ khối Community Chat / Discord Gateway), hay (b) banner cấp trang phía trên grid. (Trùng câu hỏi treo #1 trong SIM_Community_Wireframe_Brief.md.) | Chọn (a) — trong thân card The Pit. Lý do: đây là state mặc định của phần lớn trader SIM mới mua challenge; đặt trong card giữ nguyên grid 2×2 (nguyên tắc "so the UI grid does not break" khách đã nhắc 2 lần [C-2], [C-17]), còn banner cấp trang sẽ đẩy toàn bộ layout xuống. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — trong thân card, banner cấp trang bị bác |
| A-05 | Voice channels active = 0 (fetch OK nhưng giá trị bằng 0, ví dụ đêm khuya) → hiện 0 hay ẩn dòng? Luật "unable to fetch → hide it" [C-37] chỉ nói về lỗi fetch, không nói về giá trị 0. Áp dụng tương tự cho Traders online = 0. | Hiện 0. Ẩn dòng khi giá trị = 0 sẽ làm card "nhảy" chiều cao mỗi lần poll 30 giây (2 dòng → 1 dòng → 2 dòng), vừa vỡ grid vừa gây nhiễu thị giác. Luật ẩn chỉ áp cho fetch thất bại. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — hiện 0 |
| A-06 | SIM đang Soft Breach / Hard Breach / đã fail Associate Track — card The Pit có bị khoá theo không? Trader vẫn login và vẫn vào được Community Page (Ref: UC_4.9.1, UC_4.10.2). Phức tạp hơn Live Broadcast ở chỗ Flow 7 revoke hết Discord role [S-20] → user bấm Enter PIT vẫn vào được server nhưng tụt về read-only public, mà card không có cách nào thể hiện điều đó. (Trùng câu hỏi treo #4 trong SIM_Community_Wireframe_Brief.md.) | Không khoá card. Khách khẳng định read/write mở cho "all active traders from Level 1 through Level 24" [C-34] và Flow 7 cố ý không kick user khỏi server. Trạng thái mất role là hệ quả phía Discord, không phải state của dashboard widget → card giữ nguyên B7, không thêm badge/banner mới. Nếu BA muốn thể hiện thì cần khách confirm copy riêng. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — không khoá; frosted glass chỉ phủ tab Command |
| A-07 | Response schema, auth và failure behaviour của endpoint mới GET /community/server-status — chính khách để ngỏ trong CSV: "Open for BA/BE to confirm: (a) exact response schema — raw widget.json passthrough vs. a trimmed DTO such as { traders_online, voice_channels_active }; (b) auth requirement — authenticated users only vs. public; (c) failure behaviour when the upstream Discord call fails AND the Redis entry is cold." [C-39] | (a) Trimmed DTO { traders_online, voice_channels_active } — passthrough raw payload sẽ lộ danh sách member/channel ra FE không cần thiết. (b) Authenticated only — card chỉ tồn tại trong Dashboard sau đăng nhập. (c) Redis cold + Discord lỗi → trả payload rỗng (null cho cả 2 field) để FE ẩn metric theo [C-37]; cấm serve stale cache vì trái thẳng luật "do not keep the last known numbers". | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — trimmed DTO · ⚠️ auth = PUBLIC, đảo ngược đề xuất BA |
| A-08 | [CR CANDIDATE] Khách chỉ đạo ngừng post announcement level-up vào #the-pit và bỏ cơ chế "Silent vs. Viral" [C-37] → trái trực tiếp với Zapier Integration V7.pdf Flow 4 (Level 6/10/14 → #trading-floor-announcements + #the-pit). Đây có phải CR cần log vào References/CR/ không? | Có — nên log CR. Đây là thay đổi hành vi của 1 Zapier flow đã spec, không phải làm rõ. Tuy nhiên tác động nằm ở Flow 4 / UC Level-Up, không thuộc phạm vi UC_4.5.2 (card này không đọc/ghi announcement). → Ghi nhận trong Phần 3 để BA mở CR riêng; UC_4.5.2 không viết rule announcement. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — đã log CR-20260827-001 |
| A-09 | Cấu hình {Server_ID} (Discord Guild ID) và server invite URL lưu ở đâu? Khách nêu tên biến {Server_ID} [C-39] nhưng không nói nguồn cấu hình — env var backend, hay field mới trên Table C (Global_Variables) như cách Ops đang tự chỉnh Active_Broadcast_URL mà không cần deploy? | Đưa vào Table C (Global_Variables) — cùng pattern với Active_Broadcast_URL / Broadcast_Is_Live, cho phép Ops đổi invite URL (invite Discord có thể hết hạn / bị revoke) mà không phải deploy lại. ⚠️ Nếu chốt phương án này → phát sinh CR thêm field vào Table C. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | 🔄 Đã chốt 2026-08-27 — ĐẢO NGƯỢC: env var backend, KHÔNG vào Table C → không phát sinh CR |
| A-10 | Sau khi user đã join server, lần sau quay lại Community Page thì Enter PIT có đổi state/label không (Rejoin, badge Joined, disabled)? Câu Q-UI-25 trong QnA vẫn OPEN. | Không đổi — CTA luôn hiển thị y hệt. Dashboard chỉ biết discord_user_id có null hay không (tức đã link hay chưa), không biết user hiện có đang ở trong server hay đã rời server → không đủ dữ liệu để render state Joined. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — không đổi state |
| A-11 | Trạng thái đang tải metric (từ lúc mount component tới lúc có response GET /community/server-status) hiển thị gì? Tài liệu không spec. Poll 30 giây/lần → mỗi lần poll có hiện lại loading không? | Lần load đầu: skeleton giữ đúng kích thước 2 dòng metric (không spinner toàn card). Các lần poll sau: silent — cập nhật số tại chỗ, không nháy skeleton (đúng chữ "silent background fetch" [C-37]). | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — skeleton lần đầu, silent các lần poll sau |
| A-12 | [PATTERN] Rule "fetch thất bại → ẩn hẳn container, cấm giữ số cũ, cấm hiện placeholder —" xuất hiện lặp lại ở nhiều widget (The Pit metrics [C-37], Live Broadcast title empty [C-5]). Có nên chuẩn hoá thành 1 Common Rule dùng chung không? | Có — đề xuất thêm CR-14: Empty/Null Field Container Collapse vào docs/BA/Common_rule/common_rules.md (trùng đề xuất A-12 của UC_4.5.1, chưa được duyệt). Nếu BA duyệt thì cả UC_4.5.1 và UC_4.5.2 đều reference CR-14 thay vì viết lại rule. | Áp dụng đề xuất bên trái khi viết UC_4.5.2_v1.md (BA chỉ đạo 2026-08-11: cứ viết, không chờ gate). Nếu BA/khách chốt khác → sửa SRS + ghi Changelog. | ✅ Đã chốt 2026-08-27 — CR-14 bị RÚT · conflict hide-vs-stale đã đóng 2026-08-28 (giữ luật ẩn) |
| A-13 | [GỬI KHÁCH — CSV tự flag] Sau khi A9(b) đổi công thức thành headcount, nhãn Voice channels active đọc lên vẫn giống số phòng → dễ bị hiểu sai (số 7 sẽ bị đọc là "7 phòng đang mở" thay vì "7 người đang trong voice"). Nguyên văn CSV: "Open for BA: with the metric now being a headcount, confirm whether the UI label 'Voice channels active' is relabelled (e.g. 'In voice')." | Giữ nhãn Voice channels active trong SRS (đúng wireframe khách đã duyệt), ghi rõ trong BR_4.5.2.4 rằng giá trị là headcount, kèm ví dụ 4+2+1 → 7 để dev/QC không cài nhầm. Song song gửi khách đề xuất đổi nhãn thành In voice. Đổi nhãn không đổi công thức.Kèm theo: nếu BE chốt trimmed DTO thì nên đặt tên field là voice_members_active thay vì voice_channels_active (Ref: BR_4.5.2.3). | ⏳ Chờ khách trả lời — SRS đang viết theo đề xuất bên trái. | ✅ Đã chốt 2026-08-27 — giữ nhãn, In voice bị bác |
Phần 3 — Cross-UC & Missing Dependency (thông tin cho Agent 3)
| Loại | Nội dung |
|---|---|
[RENUMBER — ✅ đã thực hiện 2026-08-10] | BA chốt 2026-08-10: The Pit: UC_4.5.4 → UC_4.5.2, Discord Chat Stream (TWO-WAY): UC_4.5.2 → UC_4.14.1. Đã hoàn tất trên cả 3 nơi:1. References/WBS/[BA Internal] Stacktrading.csv — WBS mới đã ghi UC_4.5.2 = The Pit (Discord Server Widget) và UC_4.14.1 = Discord Chat Stream (TWO-WAY).2. docs/BA/UC_4.1-4.17/dashboard_common/UC_4.1.1-4.1.5/UC_4.1.1-4.1.5_v1.md — row Sidebar Tab List (§2 UC_4.1.2) và BR_4.1.4.4 đã đổi sang "UC_4.5.2 (The Pit)" + "UC_4.14.1 (Discord Chat Stream two-way)".3. docs/BA/UC_4.1-4.17/dashboard_common/UC_4.5.1/QnA_init_docs.md — Phần 3 đã đổi sang UC_4.5.2 = The Pit. |
[MISSING_DEPENDENCY] | UC_4.14.1 (Discord Chat Stream), UC_4.14.2 (Pod Mentorship), UC_4.6.2 (Settings — Discord Linking) chưa có SRS. UC_4.5.2 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. |
[CONTRADICTS_SOURCE] | Mô tả trong RFQ_ Website and Dashboard Implementation V7.pdf ("native Discord Server Widget iframe") và trong WBS ("Embed Discord Server Widget iframe… One click joins the voice channel") đã bị khách phủ định bởi [C-37]/[C-38] (custom card + deep link, không iframe) và [C-34] (#the-pit là text channel, không có voice). SRS viết theo QnA confirmed, đồng thời BA nên sửa lại cột Mapping FE và Use case description của WBS cho khớp. |
[CR CANDIDATE — ngoài scope UC này] | (1) Ngừng post announcement vào #the-pit + bỏ "Silent vs. Viral" [C-37] → tác động Flow 4 / UC Level-Up. (2) Endpoint mới GET /community/server-status không tồn tại trong RFQ_ Stack Trading Prop Tech V7.pdf (RFQ nói widget không cần backend route) → chính khách ghi chú "check whether a WBS line item + BE estimate must be added for it" [C-39]. Cả 2 đều cần BA mở CR riêng. |
| Cross-UC ràng buộc | BR_4.1.4.4 (UC_4.1.4 — Newsquawk Audio Stream) quy định Newsquawk auto-off khi user vào màn Community → UC_4.5.2 tham chiếu rule đó, không viết lại (Single Source of Truth). Rule này thuộc cấp màn Community, không phải cấp card The Pit. |
| Cross-UC — link token | Link token UUID hiển thị trong PIT-1 là cùng 1 token với token trong Settings → Discord Linking (Ref: UC_4.6.2). Text/label/behaviour của token block phải viết 1 chỗ duy nhất rồi reference chéo. Vì UC_4.6.2 chưa có SRS, UC_4.5.2 sẽ viết đầy đủ và ghi chú để UC_4.6.2 reference ngược lại sau. |
| Điểm vào | Sidebar 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ày | Live Broadcast player (UC_4.5.1), Live chat panel (UC_4.14.1), My POD card (UC_4.14.2), màn LOAD-1 cấp trang, và câu hỏi treo #2/#3/#5/#7/#8 trong SIM_Community_Wireframe_Brief.md. |
| Wireframe | References/Wireframe/Stage 2/Community & Live Broadcast/Community (with data).webp (B7 — đã link, có metric) · Community (no data).webp. State PIT-1 (chưa link Discord) và PIT-2 (ẩn metric) chưa có file wireframe trong repo — Figma: node 1767-348308. |
| Metadata | git config user.name = QuynhAnh12 — không có trong BA Roster của project_context.md. Agent 3 sẽ lấy BA in Charge từ cột BA PiC của WBS = anh.hoang12 → "Anh Hoang". BA xác nhận hoặc sửa lại tên. |