Giao diện
Gate R1 — Tổng hợp Feature Inventory (SAPP Works tools) ​
Tác giả: lane
ba/(AI) · Ngày: 2026-09-30 · Mode: B – As-built · Commit:e77c47aDành cho: BA/owner duyệt Gate R1 trước khi lập danh sách User Story. Nguồn: 7 inventory dưới đây, dựng bằng đọc source — chưa gọi thử API hay chạy màn nào. Các kết luận "có thể crash / có thể lỗi" là suy ra từ code, cần chạy thử để xác nhận. Kiểm chứng: 622/622 trích dẫnfile:dòngtrong bảng trỏ tới file và dòng có thật; mẫu ngẫu nhiên 10 trích dẫn đối chiếu nội dung — khớp.
1. Bảng số liệu ​
| Nhóm | Inventory | Entry point | Hành động | Rule | Drift | ⚠️ Observed | Câu hỏi |
|---|---|---|---|---|---|---|---|
| Nền tảng dùng chung | platform | 22 | 21 | 48 | 10 | 13 | 16 |
| HubSpot (sapp.001–004) | hubspot | 12 | 11 | 28 | 10 | 8 | 13 |
| SAPP-20603 eContract (005/012/013) | 20603 | 9 | 12 | 29 | 3 | 5 | 12 |
| SAPP-24395 (006/007) | 24395 | 12 | 17 | 38 | 12 | 16 | 17 |
| SAPP-23954 (008/009) | 23954 | 8 | 12 | 33 | 9 | 8 | 17 |
| SAPP-26878 (010) — 14 flow, 223 bước | 26878 | 27 | 127+ | 34 | 11 | 6 | 15 |
| SAPP-26297 (011) — 9 luồng, 78 case | 26297 | 17 | 25 | 33 | 6 | 9 | 15 |
| Tổng | 107 | 225+ | 243 | 61 | 65 | 105 |
2. Phát hiện xuyên nhóm (quan trọng nhất) ​
| # | Phát hiện | Nhóm | Bằng chứng tiêu biểu |
|---|---|---|---|
| X-1 | Toàn bộ 259 route /api/v1/sapp/* là @Public() — không cần đăng nhập, không permission, không system API key, kể cả route ghi prod (Ops passthrough: tạo user/lớp/đơn/giao dịch, confirm giao dịch, xoá lịch, resync SAP; HubSpot duplicate pipeline; eContract retry; 23954 refresh). API doc sapp.md:14 chỉ nói "3 route public tạm thời". | tất cả | be/apps/api/src/sapp/*.controller.ts (đếm 2026-09-30) |
| X-2 | Khoá tool chỉ có ở giao diện. BE không kiểm tra tool đang tắt/khoá; trạng thái mở khoá nằm trong sessionStorage; route verify mã bí mật public, không giới hạn tần suất. | nền tảng | inventory platform §5 |
| X-3 | "Staging" HubSpot = portal prod — cố ý theo comment trong code (không có portal staging riêng). Hệ quả: tab "Staging" của 24395 ghi deal/contact vào prod; email trùng → contact học viên thật bị cập nhật đè. | nền tảng, HubSpot, 24395 | be/libs/constants/src/lib/hubspot/hubspot.constants.ts:19-26 |
| X-4 | Thao tác ghi PRODUCTION đang có: eContract Retry (UPDATE retry = 0 trên DB econtract prod → cron gọi EFY/FPT thật); 23954 refresh cap_nhat_owner (ghi rỗng rồi ghi lại, không batch, không rollback); HubSpot Duplicate pipeline trên prod; 24395 qua "staging"; 26878 — chặn prod chỉ ở FE, BE vẫn có route prod. | 20603, 23954, HubSpot, 24395, 26878 | từng inventory §6 |
| X-5 | Chốt chặn prod có thật: Ops SQL runner không có key/route prod, không nhận SQL thô; manual-scan & sign-callback từ chối prod; thêm option property chỉ chạy dev; 26297 không có route prod. | nền tảng, 26297 | inventory platform §5 |
| X-6 | Trạng thái nằm trên Redis, không có bảng DB: lịch sử refresh 23954 (TTL 7 ngày, gia hạn mỗi lần ghi), run 26878 (30 ngày, tối đa 50 run/flow/env), session bulk product 24395. | 23954, 26878, 24395 | từng inventory §4 |
| X-7 | Nghi lỗi FE (suy từ code, chưa chạy): 24395 bước 3 có thể luôn báo "0/0" và mất session; so mã lỗi hết hạn session sai kiểu; 26878 nút "Lịch sử" có thể crash ở flow phase 2; 26297 ô để trống bị bỏ khỏi payload → không xoá được property HubSpot (case 5.1, 5.7, 6.3). | 24395, 26878, 26297 | từng inventory §5 |
| X-8 | Drift lớn với API doc / runbook: 61 chỗ. Tiêu biểu: số route public; 26878 doc nói có lưu trigger/sourceRunId/sourceFlow nhưng code bỏ mất; route assign-class-code chưa có trong doc; runbook ghi mọi flow phase 2 trả lại mã lớp nhưng code chỉ US-01 (rủi ro cạn pool mã lớp staging); 23954 doc nói thiếu token ném 12001 nhưng code trả 201. | tất cả | từng inventory §7 |
| X-9 | Code chết / lệch giả định: SecretGate (khoá cứng) không tool nào dùng; hubspot-property-field.tsx không dùng trong 4 tool HubSpot; 4 tool HubSpot đi qua service HubSpot riêng (be/libs/modules/src/lib/hubspot/), không qua service SAPP. app/ không có màn SAPP. | nền tảng, HubSpot | inventory platform, hubspot |
3. Câu hỏi cho BA — đã gộp trùng ​
Câu chặn bước sau (cần trả lời trước khi viết FS; chưa trả lời → FS ghi Assumption/OQ):
| ID | Câu hỏi | Gộp từ |
|---|---|---|
| G-01 | Ai dùng cụm tool /works/sapp? (chỉ owner / đội QA SAPP / đội Ops SAPP…) — cần để viết Role trong mọi US. | platform Q-04, hubspot Q-01, 20603 Q-04, 26878 Q-05, 26297 Q-01 |
| G-02 | 259 route @Public() (gồm ghi prod) là cố ý hay nợ bảo mật? FS sẽ ghi đúng hiện trạng; câu trả lời quyết định ghi là "thiết kế" hay ⚠️ Observed + đưa vào Handover cho BE. | platform Q-01, hubspot Q-02, 20603 Q-01, 23954 Q-02, 24395 Q-02, 26878 Q-02, 26297 Q-03 |
| G-03 | Các thao tác ghi prod (X-4) là cố ý? Đặc biệt: HubSpot Duplicate pipeline trên prod; 23954 refresh trên prod không batch/rollback; eContract retry reset nhiều flow FAIL khác tên cùng lúc. | hubspot Q-03, 23954 Q-03/Q-08/Q-09, 20603 Q-02 |
| G-04 | "Staging" ghi vào HubSpot prod — có chấp nhận ghi đè contact học viên thật khi trùng email? | platform Q-02, 24395 Q-02/Q-05 |
| G-05 | Mục đích nghiệp vụ mỗi nhóm (vd 23954: automation nào được kích hoạt lại khi refresh cap_nhat_owner; 24395: ý nghĩa 14 deal case). BRD tóm tắt cần câu này. | 23954 Q-01, 24395 Q-01 |
| G-06 | Các nghi lỗi X-7 là bug hay cố ý? (và có muốn AI chạy thử để xác nhận — cần dev server + môi trường dev) | 24395 Q-09/Q-13, 26878 Q-04, 26297 Q-02, 23954 Q-10 |
| G-07 | 26878: mất trigger/sourceRunId/sourceFlow trong log re-sync; "deal có sẵn" tự đánh dấu xong các bước còn lại (kể cả bước Ops phase 2); phase 2 có chính thức lưu history không; flow phase 2 ngoài US-01 trả mã lớp thế nào. | 26878 Q-01/Q-03/Q-06/Q-07 |
| G-08 | Hiện trạng bị chặn: 26878 US-09 (sign-callback chờ SAPP); 26297 luồng 4–6 chưa chạy được — FS mô tả là "đã triển khai, chưa chạy được"? | 26878 Q-08, 26297 Q-09 |
| G-09 | Cấu hình môi trường: SAPP_BASE_API_URL (bulk product 24395) đang trỏ môi trường nào, đã từng ghi prod chưa; trên DB prod tool nào đang tắt/ẩn/khoá; migration sapp.011 đã chạy ở đâu. | 24395 Q-04, platform Q-03, 26297 Q-10 |
| G-10 | Có FS/đặc tả gốc của các ticket (vd 26878 US-01…US-09) để đối chiếu AC/BR không? (Lưu ý: dự án này không tra Jira/Confluence — BA đưa file vào working/raw-inputs/ nếu có.) | 26878 Q-13 |
Câu không chặn (≈75 câu còn lại): giữ trong §8 của từng inventory; FS sẽ ghi thành Open Question.
4. Đề xuất cho bước sau (Recommendation, chờ BA) ​
- Viết FS as-built mô tả đúng hiện trạng kể cả các rủi ro trên; rủi ro nào BA xác nhận "không cố ý" → gom vào Handover cho BE/FE (Bước 12) thay vì im lặng.
- Danh sách US dự kiến (R2) sẽ trình sau khi Gate R1 duyệt.