QnA Init Docs — UC_4.8.3: The Desk Manager (SIM Overview)
Ngày tạo: 2026-08-08 Ngày BA review: 2026-08-10 Phiên bản: v1 BA phụ trách: Trang Nguyen Trạng thái: ✅ Toàn bộ A-01→A-11 đã chốt — không còn open question nào.
Carried-forward context (đã confirm ở dashboard_common/UC_4.1.1-4.1.5/QnA_init_docs.md, KHÔNG hỏi lại)
- A-07: The Desk Manager (SIM = UC_4.8.3, LIVE = UC_4.11.3) = widget Gekko, thuộc module Overview, KHÔNG thuộc Global Shell. (Source:
docs/BA/UC_4.1-4.17/dashboard_common/UC_4.1.1-4.1.5/QnA_init_docs.md)
Nguồn — đã tìm được spec RẤT đầy đủ (khác các UC khác trong cụm này)
RFQ_ Website and Dashboard Implementation V7.pdf§Part C (dashboard_v7_full.txt, dòng 896-900): "The Desk Manager: An optional LLM-driven 'Chatter' feature (via backend GEKKO_CHATTER channel) ... LLM commentary must be rendered as stacked UI cards featuring dynamic 'Discipline pass' or 'Discipline fail' tags."RFQ_ Stack Trading Prop Tech V7.pdf§3.2 (v7_full.txt, dòng 492-494): eventGEKKO_CHATTER— payload{text: string, vibe: string, event_type: string}.RFQ_ Stack Trading Prop Tech V7.pdf§3.2.1 "The Desk Manager (LLM Commentary Engine)" (v7_full.txt, dòng 495-614) — đã đọc toàn bộ, spec đầy đủ:- Engine: stateless commentary engine, Google Gemini 1.5 Flash 8B API, async worker.
- A. Event Filtering — 15 trigger event (dòng 500-530):
SESSION_START,LOSS_EVENT,PROMOTION,DEFENSE_TRIGGERED,STOP_HIT,NEWS_HOLD,ORDER_CANCELLED,POD_DYNAMICS,PAPER_HANDS,STAGNATION,THE_WHALE,REVENGE_TRADE,THE_CLOCK_WATCHER,SCALP_HUNTER,COMMUNITY_LIVE. - B. Rate Limiting (dòng 531-533): Token Bucket, 10 critiques/giờ/user.
- C. Master Prompt Payload (dòng 534-611): system instruction persona "Gordon Gekko" + 18 logic constraint + JSON context structure (
user_context,trade_context,risk_state,widget_metrics,system.variability_seed).
RFQ_ Stack Trading Prop Tech V7.pdf(dòng 3422-3425): "The Desk Manager Delivery: ... commentary string must be delivered asynchronously via the GEKKO_CHATTER channel. Under no circumstances should the backend wait for the LLM response before confirming a trade execution."
| ID | Câu hỏi | Giả định (BA/QC đề xuất) | BA chốt (ưu tiên cao nhất) | Trạng thái |
|---|---|---|---|---|
| A-01 | [✅ Resolved qua research — không cần hỏi BA] Danh sách 15 trigger event + 18 constraint prompt — nguồn cũ (docs/BA/UC_58-72/Dashboard_Overview_Plan.md §3.11, QN-DASH-017) từng ghi "WBS chỉ đếm số lượng, chưa có tài liệu chi tiết". Đã re-verify: chi tiết ĐẦY ĐỦ đã có trong RFQ_ Stack Trading Prop Tech V7.pdf §3.2.1 (dòng 495-614, xem "Nguồn" ở trên) — không cần hỏi lại BA, Architect chỉ cần trích dẫn đúng khi viết SRS. | — (đã resolve) | — | ✅ Đã resolve qua research |
| A-02 | Token Bucket hết quota (10 critiques/giờ) — UI feedback khi bị rate-limit? Nguồn không mô tả hành vi này. | [ASSUMPTION] Im lặng bỏ qua (không hiển thị message rate-limited) — theo tinh thần "optional feature" (nguồn gọi đây là "optional LLM-driven Chatter feature"), tránh gây khó chịu cho user bằng lỗi kỹ thuật nội bộ không liên quan tới trading. | Đúng như đề xuất — BA: "Không cần cảnh báo hay UI nào cho phần này." Im lặng bỏ qua khi rate-limit đạt ngưỡng, không hiển thị message/warning nào. | ✅ Đã chốt |
| A-03 | vibe field (payload GEKKO_CHATTER) — enum đầy đủ là gì? Nguồn chỉ định nghĩa vibe: string, không có danh sách enum cụ thể, dù prompt logic ngầm định nhiều "tông" khác nhau (Executioner/Warden/mocking/backhanded compliment theo từng event_type). | [ASSUMPTION] FE không cần enum cố định chovibe — chỉ dùng để chọn style card theo 2 nhóm suy ra được từ yêu cầu UI ("Discipline pass"/"Discipline fail" tags): map vibe → 1 trong 2 nhóm style, KHÔNG cần khớp chính xác với từng event_type trong 15 event. Cần BE xác nhận nếu có enum thật. | Đúng như đề xuất — BA xác nhận đúng nội dung đề xuất: không cần enum cố định cho vibe, chỉ map sang 1 trong 2 nhóm style ("Discipline pass"/"Discipline fail"), không cần khớp chính xác từng event_type. | ✅ Đã chốt |
| A-04 | AI Chat Toggle — thuộc UC nào? dashboard_v7_full.txt §Part C (dòng 592-595) nhắc "AI Chat Toggle" nằm trong "Settings & Profile Module". Rà soát WBS category STAGE 2.1. DASHBOARD SIM hiện tại KHÔNG thấy UC "Settings" nào. Toggle ON/OFF của Desk Manager thuộc UC nào — ngoài phạm vi UC_4.8.3 này? | [ASSUMPTION] Toggle thuộc 1 UC Settings riêng (chưa có trong WBS/chưa viết) — UC_4.8.3 chỉ mô tả hành vi render card khi feature đang ON (giả định mặc định ON), không mô tả UI toggle switch. Cross-ref, không block SRS UC_4.8.3. | Đúng như đề xuất — BA: "Toggle thuộc 1 UC Settings riêng." UC_4.8.3 chỉ mô tả hành vi render card khi feature đang ON, không mô tả UI toggle switch (thuộc UC Settings riêng, chưa có trong WBS). | ✅ Đã chốt |
| A-05 | Card lifecycle (stack) — dashboard_v7_full.txt mô tả "stacked UI cards" nhưng không rõ: giữ tối đa bao nhiêu card cùng lúc, có tự biến mất theo thời gian không, hay tồn tại tới khi user dismiss/refresh trang? | [ASSUMPTION] Giữ tối đa 5 card gần nhất trong stack, card cũ nhất tự rớt khỏi stack khi có card mới (không có nút dismiss, không auto-expire theo thời gian) — chưa có nguồn xác nhận, cần BA/UX quyết định con số cụ thể. | Đã chốt đầy đủ (2026-08-10): Điều kiện hiển thị widget — The Desk Manager tiếp tục hiển thị/hoạt động miễn là (1) tài khoản chưa bị khoá (chưa Hard Breach/Frosted Glass) và (2) dữ liệu chưa bị archive/mất (Ref: STAGE2-020/022 — trade history archive tại Failure+10 ngày). Số lượng card hiển thị cùng lúc trong viewport = 2 card (không cuộn); toàn bộ card cũ hơn vẫn được giữ lại trong stack, xem lại bằng scroll (không tự động rớt/xoá, không giới hạn tổng số card lưu trữ trong stack) — khác đề xuất ban đầu (max 5 card, card cũ tự rớt khi có card mới). | ✅ Đã chốt |
| A-06 | [Impact Analysis — Rate limiting] Token Bucket 10/giờ/user — tính theo giờ đồng hồ cố định (vd 00:00-01:00) hay rolling window (giờ gần nhất tính từ request hiện tại)? Ảnh hưởng trực tiếp tới UX khi user active liên tục quanh mốc giờ. | [ASSUMPTION] Rolling window 60 phút (không phải giờ đồng hồ cố định) — theo chuẩn Token Bucket algorithm thông thường (nguồn chỉ ghi "Algorithm: Token Bucket", không chỉ định rõ cố định/rolling). Cần BE xác nhận implementation thật. | Đúng như đề xuất — BA xác nhận rolling 60-minute window (không phải giờ đồng hồ cố định). | ✅ Đã chốt |
| A-08 | STAGNATION — prompt rule chưa có nguồn (bảng mapping BR_4.8.3.5 trước đây ghi "Pending client provides") — nội dung constraint prompt cho event này là gì? | Chưa có đề xuất — chờ khách cung cấp trực tiếp constraint text, không tự soạn giọng văn Gordon Gekko. | Khách: "If event_type is STAGNATION: Mock their fear of the market. Tell them time is money, and if they are going to freeze up for three days, they need to return your capital to someone who actually has the nerve to trade." — đánh số constraint 23 (nối tiếp 19-22 đã bổ sung 2026-08-14). | ✅ Đã chốt |
| A-09 | THE_WHALE — trigger formula (so sánh position size / allowed margin) — nguồn RFQ chỉ ghi định tính ">80% allowed margin của level hiện tại", không có công thức. Futures/Forex so sánh thế nào? Với account SIM, "allowed margin của level hiện tại" lấy theo level nào khi user mua theo track (Associate/Accelerated/Advanced), không phải theo current_level cố định? | Đề xuất: tái dùng Table A (Max_Forex_Notional)/Table B (Max_Contracts) từ flow Enforce Overnight Margin, nhân với ratio 0.8 cố định — cần khách xác nhận công thức và cách map track SIM → level tra bảng. | Khách: "Futures: Contract_Count > 0.8 × Max_Contracts (level/table B). Forex: Notional > 0.8 × Max_Forex_Notional (level/table A). Đối với account sim thì dữ liệu allowed margin dùng để so sánh này cũng được lấy theo table A/B tùy theo từng gói user chọn mua challenge: Associate Track → Level 1; Accelerated Track → Level 2; Advanced Track → Level 5." — đã áp dụng vào cột Note của bảng prompt mapping BR_4.8.3.5 (dòng THE_WHALE), kèm bảng mapping track→level. Open question phụ đã chốt (2026-08-21): SIM lookup level cố định theo track mua; LIVE lookup theo current_level (theo promotion). | ✅ Đã chốt (SIM: track purchased cố định; LIVE: current_level theo promotion) |
| A-10 | THE_CLOCK_WATCHER — mốc thời gian "market close" / "overnight session break" lấy từ đâu? Futures và Forex có timeline khác nhau (Futures theo từng asset family CME, Forex theo institutional rollover) — nguồn RFQ không nói rõ field/table nào cấp mốc này cho trigger cụ thể này (mặc dù đã có field tương tự ở flow Enforce Overnight Margin). | Đề xuất: tái dùng CME_Instrument_Details (Official_Close_UTC/Halt_Start_UTC) cho Futures và mốc rollover Forex đã biết — cần khách xác nhận đúng field/nguồn được tái sử dụng cho trigger này, không phải logic mới. | Khách: "Futures: The Node.js middleware manages independent timeline threads for each category by reading the Official_Close_UTC and Halt_Start_UTC fields directly from the CME_Instrument_Details database table. The 60-second window anchors to whichever of those timestamps is approaching next. Forex: The 60-second window anchors to the 16:00 CT institutional rollover." — đã áp dụng vào cột Note của bảng prompt mapping BR_4.8.3.5 (dòng THE_CLOCK_WATCHER); lưu ý mốc Forex phải đồng bộ DST-aware theo quyết định đã chốt ở UC_4.2.1 BR_4.2.1.1 (5PM ET, không phải UTC cố định). | ✅ Đã chốt |
| A-11 | ORDER_CANCELLED/SCALP_HUNTER — counter có reset sau khi bắn event không? Nguồn RFQ chỉ ghi ngưỡng trigger (5+ cancel/10 phút, 10+ round turn/5 phút) nhưng không nói rõ hành vi counter sau khi đạt ngưỡng — nếu trader tiếp tục cancel/scalp vượt ngưỡng trong cùng window, event có bắn liên tục theo từng lần vượt không? | Chưa có đề xuất — rate limit 10 critiques/giờ/user (BR_4.8.3.2) khiến câu hỏi này quan trọng: nếu không reset, 1 burst hành vi có thể bắn 3+ event liên tiếp và làm cạn token bucket. | Khách: "The counter must reset. It requires 5 fresh cancellations within a new 10-minute rolling cycle to fire again. We have a strict system limit of 10 AI critiques per hour per user. If a trader is erratically canceling 15 orders in a few minutes, we do not want to fire 3 rapid consecutive events and instantly drain their token bucket. Fire once, reset the counter." — áp dụng cho ORDER_CANCELLED: bắn 1 lần khi đạt 5 cancel/10 phút rồi reset counter, cần đủ 5 cancel mới trong 1 rolling window mới để bắn lại. BA áp dụng cùng nguyên tắc reset cho SCALP_HUNTER (10 round turn/5 phút) theo ngưỡng/window riêng của event này — đã đưa vào cột Note của bảng prompt mapping BR_4.8.3.5 (dòng ORDER_CANCELLED và SCALP_HUNTER). | ✅ Đã chốt |
Ghi chú Phase 2.2 — WBS Cross-UC Consistency Check
- CR Conflict Check: Đã đọc
References/CR/_CR_INDEX.md— không có CR nào tham chiếu The Desk Manager/GEKKO_CHATTER. - Same-category consistency (
STAGE 2.1. DASHBOARD SIM): Không có sibling UC nào khác mô tả AI commentary — UC_4.8.3 là điểm duy nhất trong SIM. Cross-ref LIVE UC_4.12.3 (The Desk Manager/Gekko, renumber từ UC_4.11.3 theo WBS update 2026-08-10) — theo A-07 (carried-forward), cùng logic Gekko, khác event set theo môi trường: SIM có thêmSTAGNATION(SIM-only, xem correction 2026-08-14 trong Changelog), LIVE có thêmDEFENSE_TRIGGERED/POD_DYNAMICS(LIVE-only). - Missing dependency: "Settings Module" (AI Chat Toggle) — xem A-04, chưa có UC trong WBS hiện tại.
- Orphan-UC check: UC_4.8.3 xác nhận tồn tại trong WBS qua
node script/parse_wbs.js --compact. - Status design lưu ý: Theo phân tích nội bộ cũ (
Dashboard_Overview_Plan.md§1, dưới numbering cũ), Desk Manager từng là widget duy nhất cóstatus_design = "Not yet"(thiết kế UI chưa bắt đầu) trong toàn cụm Dashboard Overview — cần verify lạimapping_design/status_designhiện tại của UC_4.8.3 trong WBS mới nhất trước khi Architect viết SRS (không thấy Figma link nào trong lần parse WBS hiện tại của phiên làm việc này).
Ghi chú Phase 2.5 — Impact Analysis
| Action | Uniqueness | Cascade | Reversibility | Concurrency |
|---|---|---|---|---|
| Toggle AI Chat ON/OFF (ngoài scope UC_4.8.3, cross-ref A-04) | Theo user | Unsubscribe/subscribe kênhGEKKO_CHATTER WebSocket khi OFF (theo suy luận từ nguồn — cần xác nhận) | Reversible (bật lại được) | Không phát hiện race condition đặc biệt trong nguồn |
| Rate limit 10 critiques/giờ đạt ngưỡng | Theo user | Card mới không render cho tới khi bucket refill (xem A-02/A-06) | N/A (tự refill theo thời gian) | Không phát hiện race condition trong nguồn |
Changelog
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-08-08 | v1 | Initial creation | — | 6 QnA items (A-01 đã resolve qua research) | Init Flow Step 1+2 |
| 2026-08-10 | v1.1 | BA review — trả lời A-02/A-03/A-04, trả lời 1 phần A-05 | 4 mục ⏳ Chờ BA | A-02/A-03/A-04 ✅ Đã chốt; A-05 🟡 đã chốt điều kiện hiển thị widget, còn thiếu chi tiết giới hạn số card trong stack; A-06 vẫn ⏳ Chờ BA | BA (Trang Nguyen) trả lời trực tiếp qua chat 2026-08-10 |
| 2026-08-10 | v1.2 | BA hoàn thiện A-05 (giới hạn hiển thị + scroll) | 🟡 Thiếu chi tiết stack limit | ✅ Đã chốt — 2 card hiển thị cùng lúc trong viewport, xem card cũ hơn bằng scroll, không giới hạn tổng số lưu trữ, không tự rớt (khác đề xuất ban đầu: max 5 card, tự rớt) | BA (Trang Nguyen) trả lời trực tiếp qua chat 2026-08-10 — chỉ còn A-06 (LOW) chưa trả lời, không block Step 3 |
| 2026-08-13 | v1.3 | Loại DEFENSE_TRIGGERED/POD_DYNAMICS khỏi event set SIM | 15-event set (đầy đủ RFQ) | 13-event set cho SIM — 2 event này là LIVE-only (cross-ref UC_4.12.3) | BA confirmation 2026-08-13, áp dụng vào UC_4.8.3_v1.md BR_4.8.3.1/BR_4.8.3.7 |
| 2026-08-14 | v1.4 | Correction — thêm lại STAGNATION vào event set SIM | 13-event set (không có STAGNATION, event này từng bị coi là LIVE-only theo QN-4.12.3-01 cũ) | 14-event set — STAGNATION xác nhận là SIM-only, KHÔNG xảy ra ở LIVE (đảo lại QN-4.12.3-01 phía LIVE UC_4.12.3, xem dashboard_live/UC_4.12.3/QnA_init_docs.md changelog 2026-08-14). Đã thêm STAGNATION vào Overview/Basic Flow/BR_4.8.3.1/bảng prompt mapping BR_4.8.3.7 (UC_4.8.3_v1.md), Content/Prompt Rule = "Pending client provides." (không có constraint 1-18 map tới trong nguồn). | Theo yêu cầu đảo lại từ client/BA (2026-08-14) |
| 2026-08-14 | v1.5 | Client bổ sung constraint 19-22 — điền prompt rule cho 4 event trước đó "Pending client provides." | SESSION_START/LOSS_EVENT/PROMOTION/ORDER_CANCELLED đều để "Pending client provides." (không có constraint 1-18 nào map tới trong RFQ v7) | Client cung cấp trực tiếp 4 constraint mới (19: SESSION_START, 20: LOSS_EVENT, 21: PROMOTION, 22: ORDER_CANCELLED) — đã điền vào bảng prompt mapping BR_4.8.3.7 và ghi chú mở rộng 18→22 constraint trong BR_4.8.3.7/BR_4.8.3.8 (UC_4.8.3_v1.md) | Nguồn: Client-provided update, 2026-08-14 (ngoài RFQ v7 gốc — cần lưu ý đây là bổ sung mới, không phải nội dung RFQ ban đầu) |
| 2026-08-15 | v1.6 | Client bổ sung 3 mục: A-08 (constraint 23 — STAGNATION), A-09 (THE_WHALE formula), A-10 (THE_CLOCK_WATCHER anchor) | STAGNATION prompt rule = "Pending client provides."; THE_WHALE/THE_CLOCK_WATCHER trigger chỉ có mô tả định tính, không có công thức/nguồn field cụ thể | A-08 ✅ constraint 23 điền vào bảng BR_4.8.3.7; A-09 ✅ công thức Contract_Count > 0.8 × Max_Contracts (Futures)/Notional > 0.8 × Max_Forex_Notional (Forex) + bảng mapping track SIM (Associate→Lvl1, Accelerated→Lvl2, Advanced→Lvl5) → BR_4.8.3.9 mới, kèm 1 open question phụ (lookup level cố định theo track hay theo current_level sau promotion, chưa hỏi khách); A-10 ✅ Futures anchor = Official_Close_UTC/Halt_Start_UTC từ CME_Instrument_Details (nearest-upcoming), Forex anchor = 16:00 CT institutional rollover (đồng bộ DST-aware theo UC_4.2.1 BR_4.2.1.1) → BR_4.8.3.10 mới | Client cung cấp trực tiếp qua BA, 2026-08-15. Đã update UC_4.8.3_v1.md: bảng BR_4.8.3.7 (dòng STAGNATION/THE_WHALE/THE_CLOCK_WATCHER) + 2 Business Rule mới BR_4.8.3.9/BR_4.8.3.10. |
| 2026-08-15 | v1.7 | BA restructure — bỏ BR_4.8.3.9/BR_4.8.3.10, gộp nội dung vào cột Note mới trong bảng BR_4.8.3.7 | BR_4.8.3.9 (THE_WHALE formula) và BR_4.8.3.10 (THE_CLOCK_WATCHER anchor) là 2 Business Rule riêng, bảng prompt mapping BR_4.8.3.7 chỉ có 3 cột (Event/Trigger/Content-Prompt Rule) | Đã xoá BR_4.8.3.9 và BR_4.8.3.10; thêm cột Note (cột thứ 4, cuối bảng) vào bảng prompt mapping BR_4.8.3.7 — nội dung công thức THE_WHALE và anchor THE_CLOCK_WATCHER (đầy đủ, không rút gọn, giữ nguyên open question) chuyển vào Note của đúng dòng event tương ứng; các dòng event khác Note = "—". Sửa đoạn intro BR_4.8.3.7 (bỏ link tới 2 anchor đã xoá) và cột Trigger (bỏ "(Ref: BR_4.8.3.9/10...)"). Khôi phục heading #### BR_4.8.3.8 (bị mất anchor khi chèn BR_4.8.3.9/10 ở v1.6, nay đã gắn lại đúng vị trí). A-09/A-10 trong bảng QnA phía trên đã sửa lại trỏ về cột Note thay vì BR đã xoá. | BA restructure theo yêu cầu khách, 2026-08-15 — không đổi nội dung nghiệp vụ, chỉ đổi cấu trúc trình bày (BR riêng → cột trong bảng mapping). |
| 2026-08-15 | v1.8 | Client bổ sung A-11 — counter reset rule cho ORDER_CANCELLED/SCALP_HUNTER | Cột Note của 2 dòng ORDER_CANCELLED/SCALP_HUNTER trong bảng BR_4.8.3.7 = "—" (chưa mô tả hành vi counter sau khi đạt ngưỡng trigger) | A-11 ✅ đã chốt — khách xác nhận counter reset sau khi bắn event 1 lần, cần đủ threshold mới trong 1 rolling window mới để bắn lại (tránh cạn token bucket 10/giờ khi trader hành vi bất thường liên tục). Đã điền vào cột Note của ORDER_CANCELLED (verbatim quote khách) và SCALP_HUNTER (áp dụng cùng nguyên tắc theo threshold/window riêng của event này, do khách chỉ quote trực tiếp cho ORDER_CANCELLED) trong bảng BR_4.8.3.7 của UC_4.8.3_v1.md. Đồng thời xoá mục Changelog khỏi UC_4.8.3_v1.md theo yêu cầu BA (lịch sử thay đổi tiếp tục theo dõi tại Changelog của file QnA này). | Client cung cấp trực tiếp qua BA, 2026-08-15. |
| 2026-08-21 | v1.9 | BA chốt A-06 (rolling window) + A-09 open question phụ (LIVE lookup level) + renumber BR trong UC_4.8.3_v1.md | A-06 ⏳ Chờ BA (LOW); A-09 còn open question (lookup theo track hay current_level); BR_4.8.3.4/5/6/7/8 đánh số lệch thứ tự heading | A-06 ✅ rolling 60-minute window (không phải giờ đồng hồ cố định); A-09 ✅ SIM = track purchased (cố định), LIVE = current_level (theo promotion); BR đánh số lại đúng thứ tự heading .1–.6 (Widget Visibility .3, Non-Blocking .4, Per-Event Trigger .5, Master Prompt Context .6) và sửa toàn bộ cross-ref | BA (Trang Nguyen) trả lời trực tiếp qua chat 2026-08-21. Đã update UC_4.8.3_v1.md + cross-ref trong UC_4.12.3_v1.md |