Tài liệu
Hướng dẫn phát triển, hướng dẫn sử dụng và bảng kiểm thử tương tác.
Bắt đầu ở đây — dành cho người test mới, chưa biết code
Đọc trước khi testMở trình duyệt tới http://localhost:3000 (nếu máy chủ chạy ở cổng khác — ví dụ 3001 — đổi số cổng tương ứng). Làm theo các bước dưới, rồi kéo xuống checklist.
- Mở trình duyệt tới http://localhost:3000/login (nếu máy chủ chạy ở cổng khác — 3001 — thay số cổng tương ứng, hỏi dev nếu không chắc).
- Ở khung 'Chọn nhanh (demo, không mật khẩu)' phía dưới form, bấm thẳng vào tên tài khoản bạn cần (xem bảng Tài khoản test bên dưới) — KHÔNG cần gõ gì thêm. Hoặc gõ email vào ô 'Email hoặc userId', để trống ô Mật khẩu, bấm Đăng nhập.
- Sau khi vào ứng dụng, mở tab Tài liệu (biểu tượng Doanh nghiệp → Tài liệu, hoặc gõ thẳng /docs) rồi chọn tab 'Kiểm thử' — đây chính là trang bạn đang xem.
- Đi theo từng nhóm từ trên xuống dưới. Với mỗi dòng: bấm 'Mở màn ↗' để mở đúng màn cần test ở tab mới, làm theo cột 'Bước', rồi so kết quả thực tế với cột 'Kỳ vọng'.
- Bấm nút PASS hoặc FAIL cho dòng đó (khung 3 nút bên phải mỗi dòng). Có thể gõ thêm Ghi chú nếu FAIL (mô tả lỗi thấy được, không cần thuật ngữ kỹ thuật).
- Kết quả tự lưu khi bạn tick (badge góc phải bảng: 'Đã lưu máy chủ' = đã đồng bộ, 'Lưu cục bộ (offline)' = máy chủ tạm không phản hồi nhưng dữ liệu vẫn ở trên máy bạn).
- Khi test xong (hoặc xong một phiên), bấm nút 'Sao chép kết quả' — nội dung dạng bảng Markdown được chép vào clipboard, dán vào email/chat gửi cho người phụ trách.
- Gặp màn không mở được, nút không phản hồi, hoặc lỗi hiển thị lạ: chụp màn hình + ghi lại đường dẫn (URL) đang mở, gửi kèm khi báo cáo.
Tài khoản test
| Nhãn | Tên | Email / userId | Mật khẩu | Ghi chú |
|---|---|---|---|---|
| ADMIN / PLATFORM | Nguyễn Hoài Nam (Giám đốc Công nghệ) | nam.nguyen@xtech.com.vn | (để trống) | Tài khoản có mọi quyền (PLATFORM_ADMIN — quyền '*'). Dùng cho MỌI dòng có nhãn [ADMIN] hoặc [PLATFORM]. Đây cũng là tài khoản mặc định để test các màn không ghi nhãn vai trò. |
| NHÂN VIÊN THƯỜNG | Trần Thu Hà (Trưởng nhóm Kinh doanh) | ha.tran@xtech.com.vn | (để trống) | Tài khoản KHÔNG có quyền quản trị — dùng để xác nhận khu Quản trị (/admin/*) và Platform Console (/platform/*) KHÔNG hiện ra cho người dùng thường. |
| T002 (đa tenant) | Admin tenant Chủ đầu tư BĐS Demo (tenant-realestate-demo) | (userId: tenant-realestate-demo-admin) | cần dev cấp — xem ghi chú | Tài khoản này KHÔNG đăng nhập được bằng cách chọn nhanh (không nằm trong danh sách 16 người tenant-xtech). Mật khẩu được sinh ngẫu nhiên mỗi lần chạy `npm run provision:t002` ở xhub-api và chỉ in ra console lúc đó (biến môi trường T002_ADMIN_PASSWORD/T002_EMP_PASSWORD nếu dev đặt trước). Nếu bạn cần test nhóm 'Đa tenant' (U52–U54), hãy nhờ dev cung cấp mật khẩu hiện hành hoặc chạy lại lệnh trên và gửi bạn kết quả. |
[ENFORCE]: [ENFORCE] = màn/luồng đó chỉ thể hiện đúng khi máy chủ API bật AUTH_ENFORCE=true. Ở môi trường demo mặc định (đa số trường hợp) biến này TẮT — các dòng [ENFORCE] không kiểm tra được, hãy để 'Chưa test' và ghi chú 'N/A demo mode', KHÔNG tính là FAIL.
Báo cáo kết quả: Gửi kết quả (bấm 'Sao chép kết quả' rồi dán) cho quản trị viên tenant X-TECH phụ trách XHub, hoặc bộ phận IT phụ trách nền tảng. Nếu không rõ người nhận, hỏi người đã gửi bạn tài liệu này.
Bot-test — kết quả tự động
Cập nhật: 2026-08-04 · 41/41 PASSKết quả các cổng tự động ở lần chạy mới nhất (chỉ đọc).
| Kết quả | Lệnh | Kỳ vọng |
|---|---|---|
| PASS | api tsc (npx tsc --noEmit) | 0 lỗi — API biên dịch sạch (NestJS/Prisma) |
| PASS | web tsc (npx tsc --noEmit) | 0 lỗi src/** — web biên dịch sạch (Next 16) |
| PASS | test:rls | RLS PASSED — 35 bảng có chính sách; MUST_NOT_LEAK 0 rò rỉ giữa tenant |
| PASS | test:smoke | E2E PASSED — 13 workflow X.Office chạy end-to-end |
| PASS | test:controlplane | CONTROL PLANE PASSED — reset + smoke bộ điều phối control-plane |
| PASS | test:mdm | MDM PASSED — dữ liệu chủ (đơn vị/vị trí/vai trò) nhất quán |
| PASS | test:backup | BACKUP PASSED — 30 assertions; tạo gói + checksum |
| PASS | test:records | RECORDS PASSED — kho tài liệu bất biến + phiên bản* PASSED kèm teardown libuv (Windows) — đã xác minh không phải lỗi |
| PASS | test:webhook | WEBHOOK PASSED — phát/nhận sự kiện webhook* PASSED kèm teardown libuv (Windows) — đã xác minh không phải lỗi |
| PASS | test:condition | CONDITION AST PASSED — 20 cases; bộ điều kiện quy trình |
| PASS | test:authz | AUTHZ PASSED — allow 201 / deny 403 / 401 / OIDC* PASSED kèm teardown libuv (Windows) — đã xác minh không phải lỗi |
| PASS | test:roles | ROLE REGISTRY PASSED — vai trò + ma trận quyền resolve đúng |
| PASS | test:auth-flow | AUTH FLOW PASSED — login / invite→activate / forgot→reset / revoke |
| PASS | test:requests | REQUESTS PASSED — Request Center tạo→submit→duyệt→thực thi |
| PASS | test:directives | DIRECTIVES PASSED — chỉ đạo issue→acknowledge→accept |
| PASS | test:tickets | TICKETS PASSED — Service Desk tạo→assign→resolve→CSAT |
| PASS | test:bookings | BOOKINGS PASSED — đặt chỗ tạo→duyệt→check-in + xung đột 409 |
| PASS | test:announcements | ANNOUNCEMENTS PASSED — publish→read→acknowledge→remind |
| PASS | test:tenant-registry | TENANT REGISTRY PASSED — sổ đăng ký tenant + trạng thái/lớp |
| PASS | test:platform-console | PLATFORM CONSOLE PASSED — quyền platform-operator + tổng quan |
| PASS | test:launch-factory | LAUNCH FACTORY PASSED — khởi chạy tenant qua 8 bước tiến trình |
| PASS | test:catalog | CATALOG PASSED — seed + smoke blueprint & seed-pack |
| PASS | test:delivery | DELIVERY PASSED — engagement/triển khai khách hàng |
| PASS | test:t002 | T002 PASSED — provision + cách ly tenant realestate-demo* PASSED kèm teardown libuv (Windows) — đã xác minh không phải lỗi |
| PASS | test:demos | DEMOS PASSED — provision + smoke bộ tenant demo |
| PASS | test:backup-schedule | BACKUP SCHEDULE PASSED — lịch backup định kỳ mỗi tenant |
| PASS | test:work-item | WORK ITEM PASSED — NativeWorkItem CRUD + FSM + tag/dimension |
| PASS | test:work-project | WORK PROJECT PASSED — ExecutionProject WBS + phụ thuộc FS/SS/FF/SF + baseline |
| PASS | test:work-views | WORK VIEWS PASSED — Gantt phối hợp (SUMMARY vs FULL) + Kanban + thống kê đa chiều cross-tab đúng số + reschedule 400 khi phá vỡ phụ thuộc |
| PASS | test:manage-slice | MANAGE SLICE PASSED — 28 assertions: Mục tiêu→KPI(từ Work)→Review→Quyết định→Action→NativeWorkItem→Follow-up + cách ly tenant |
| PASS | test:manage-okr | MANAGE OKR PASSED — 25 assertions: KPI-tree theo góc nhìn, KPI đỏ không bị điểm gộp che, check-in giữ lịch sử (không sửa/xoá), cách ly tenant |
| PASS | test:manage-industry | MANAGE INDUSTRY PASSED — 9 tenant có Mục tiêu/KPI/OKR đúng đặc thù ngành (0 trùng lặp ngoài ACT-CLOSE); T001 không bị ghi đè |
| PASS | test:ioc-twin | IOC TWIN PASSED — 44 assertions: mặt bằng/scene/publish-rollback bất biến, gán vùng vào OrgUnit thật, 2D luôn dùng được khi tắt WebGL |
| PASS | test:ioc-data-layer | IOC DATA LAYER PASSED — 45 assertions: lớp dữ liệu chiếu từ Work thật (không lưu số riêng), cấm camera/chấm công/sinh trắc học (403), quyền xem cá nhân + audit |
| PASS | scan:secrets | SECRET SCAN PASSED — 0 secret lộ ngoài .env |
| PASS | test:e2e | 2 suite PASS — app root + xoffice-delegation self-grant regression (SEC-002/GAP-002: chặn tự cấp quyền admin qua uỷ quyền + act-on-task)* Mới thêm 03/08/2026 (G0 hardening) |
| PASS | migrate:status (`npx prisma migrate status`) | 1 migration (baseline) — 'Database schema is up to date!'* Mới thêm 03/08/2026 — chuyển từ `prisma db push` sang Prisma Migrate có lịch sử |
| PASS | boot split (`start:platform` + `start:xoffice`, build 1 lần) | Cả 2 process lên khoẻ song song (:4000 + :4001); mỗi process CHỈ serve đúng route nhóm mình — /api/platform/* → 404 ở xoffice, /api/xoffice/* → 404 ở platform* Mới 04/08/2026 (Phase 1.5 Stage B) — xác nhận qua request 404 chéo, không đoán |
| PASS | test:delivery (trỏ base :4001, xoffice process) | DELIVERY PASSED — bao gồm 'POST launch' + 'launch ran to COMPLETED' + 'detail embeds live launch progress': Delivery (process xoffice) gọi HTTP THẬT sang Launch Factory (process platform, :4000) qua route /api/platform/launches* Mới 04/08/2026 — bằng chứng chính cho việc 2 process tách thật, không chỉ tách port |
| PASS | test:platform-console (đã sửa cho cấu hình 2-process) | PLATFORM CONSOLE SMOKE PASSED — assertion 'platform op DENIED 403 trên route business' giờ trỏ đúng sang process xoffice để test guard thật (trước khi sửa: 404 vì route không còn tồn tại ở process platform)* Mới 04/08/2026 — phát hiện + sửa 1 test giả định sai cấu hình 1-process |
| PASS | full smoke run 39 script trên cấu hình 2-process | 39/39 PASS, trừ 2 flake xác nhận KHÔNG liên quan Stage B* test:people-attendance: bug tính giờ đi trễ có từ trước (đã ghi từ Stage A) · test:smoke (xoffice-e2e): 62 dòng Delegation tồn đọng từ chạy tay lặp lại trên DB dev cũ, không phải do code — CI luôn chạy DB mới nên không gặp lại |
* Một số cổng in PASSED kèm assertion teardown libuv trên Windows — đã xác minh không phải lỗi.
User test — checklist bạn tự tick
💡 Chụp màn hình (Print Screen / Snipping Tool), bấm Ctrl+V ngay trong ô ghi chú của từng dòng để đính kèm ảnh minh chứng — không cần chọn file.
Đã test
0/78
PASS
0
FAIL
0
Tiến độ
0%
Điều hướng & UI
Kỳ vọng: Đúng 5 workspace: Trang chủ · Công việc · X.Space · X.Office · Doanh nghiệp (không có item 'Thiết lập' thừa)
Kỳ vọng: Panel 'prime' con hiện đúng các màn của workspace đang chọn
Kỳ vọng: Rail thu gọn → menu chuyển thành header ngang có icon; mở lại về panel dọc; icon back chevron đúng
Kỳ vọng: Hiện drawer hamburger; drawer liệt kê menu theo workspace đang chọn
Kỳ vọng: Org-chart fullscreen phủ luôn rail bên trái; thoát fullscreen trả lại layout
Kỳ vọng: Toàn bộ màu nền/chữ đổi đồng bộ; không có mảng trắng/đen lệch tông
Kỳ vọng: 6 tab tài liệu: Phát triển · Hướng dẫn · Nghiệp vụ · SaaS · Backlog · Kiểm thử; mỗi tab render markdown + TOC
Xác thực
Kỳ vọng: Form login render; đăng nhập đúng → vào app; sai → báo lỗi
Kỳ vọng: Link mời mở /activate; đặt mật khẩu → tài khoản active, đăng nhập được
Kỳ vọng: Nhập email ở /forgot → nhận link; /reset đặt mật khẩu mới; đăng nhập bằng mật khẩu mới
Kỳ vọng: Suspend user ở /admin/users → phiên hiện tại của user đó bị vô hiệu (đăng xuất buộc)
Kỳ vọng: User đa tenant thấy danh sách tenant; chọn 1 → vào đúng workspace tenant đó
Quản trị & Tổ chức
Kỳ vọng: Chip 'Control Plane trực tiếp'; số liệu người dùng/đơn vị/vị trí/xung đột/kết nối live
Kỳ vọng: Chip live; các thành viên với chức danh/đơn vị/vai trò resolve thật; nút mời mở drawer
Kỳ vọng: Chip 'Dữ liệu trực tiếp (/api/identity)'; cây đơn vị + trưởng đơn vị thật
Kỳ vọng: Chuyển sang chế độ sơ đồ nhân sự; mỗi node hiện avatar, email, số điện thoại thật
Kỳ vọng: Đổi tên / gán trưởng / thêm đơn vị con / di chuyển / xoá node — thao tác lưu và cây cập nhật
Kỳ vọng: Nút In/Xuất PDF tạo file sơ đồ đúng bố cục
Kỳ vọng: Timeline vị trí theo thời gian; hiển thị acting/kiêm nhiệm đúng
Kỳ vọng: Danh sách vai trò + ma trận quyền; 'test-as-user' xem quyền hiệu lực của 1 user
Kỳ vọng: Cấu hình data-scope (đơn vị/vùng) hiển thị và lưu đúng
Kỳ vọng: Màn uỷ quyền; guardrail SELF_DELEGATION gắn cờ khi tự uỷ quyền cho mình
Kỳ vọng: Drawer mở, submit → gói mới xuất hiện, Checksum PASS, dung lượng hiển thị
Kỳ vọng: Danh sách bản phục hồi; chọn gói → mô phỏng khôi phục hiển thị trạng thái
Kỳ vọng: Log audit các thao tác quản trị; lọc/tra cứu được
Kỳ vọng: Panel provisioning live; toggle Bật/Tắt app; nút 'Đối soát' → consistent
X.Space
Kỳ vọng: Danh sách kênh; mở 1 kênh xem overview/threads/lists
Kỳ vọng: Mở DM tới 1 người; gửi/nhận tin hiển thị đúng luồng
Kỳ vọng: Danh sách khách hàng; mở hồ sơ 360 (thông tin + hoạt động) đầy đủ
Kỳ vọng: Tin gửi đi hiện ngay kèm tên người thật (không phải @user:…); rê chuột lên tin → chọn emoji, số đếm cảm xúc tăng; bấm lại chính emoji đó → gỡ bỏ
Kỳ vọng: Tệp dưới 20MB tải lên được và mở xem lại được; tệp quá lớn báo rõ 'vượt quá 20MB' — KHÔNG phải thông báo chung chung 'thử lại nhé'
Kỳ vọng: Liệt kê đúng các tệp/ảnh đã gửi trong kênh, kèm người gửi và thời điểm; bấm vào mở/tải được
Kỳ vọng: Chỉ có MỘT phòng chung cho cặp hai người (mở từ hai phía không tạo hai phòng); lịch sử tin nhắn giữ nguyên
Kỳ vọng: Sự kiện hiện thành THẺ có tiêu đề + trạng thái tiếng Việt (không có chữ IN_PROGRESS/PENDING thô); nút hành động chỉ bật khi bước đó thật sự giao cho bạn — nếu đang ở hàng chờ theo vai trò thì thẻ tự giải thích, không có nút bấm được
Kỳ vọng: Việc được tạo thật, mở ra ở Công việc; kênh nhận lại một thẻ báo đã tạo việc từ tin đó
Kỳ vọng: Hiện việc THẬT sinh ra từ kênh (không phải danh sách mẫu); bấm 1 việc mở đúng màn chi tiết
Kỳ vọng: Gom việc cần xử lý + nhắc tên (@bạn) + trả lời thread; đánh dấu đã đọc / tạm ẩn hoạt động đúng dòng và không tự hiện lại
Kỳ vọng: Tìm được cả khi các từ nằm rải rác trong câu (ví dụ gõ 'Đà Nẵng 123' vẫn ra 'Đà Nẵng (123)'); kết quả gộp tin nhắn + việc + tài liệu, bấm vào mở đúng chỗ
Kỳ vọng: Lưu một tin/việc → xuất hiện ở mục Đã lưu; bỏ lưu thì mất khỏi danh sách; nội dung gốc không bị nhân bản (mở ra vẫn là bản gốc)
Kỳ vọng: Trả lời bám nội dung kênh, có trích dẫn tin nguồn. Nếu X.AI chưa chạy được thì phải NÓI RÕ lý do và ghi là bản tóm tắt tất định — không im lặng trả về rỗng, không giả vờ trả lời
Kỳ vọng: Bấm 'Vào phòng họp' → thấy hình mình; người thứ hai vào cùng kênh thì vào CHUNG một phòng; kênh nhận đúng MỘT thẻ 'bắt đầu cuộc họp' (không phải mỗi người một thẻ)
Kỳ vọng: Nút đổi trạng thái ngay và người kia thấy đúng; người CUỐI CÙNG rời phòng thì kênh nhận thẻ 'kết thúc' kèm thời lượng và số người
Kỳ vọng: Ghi vài dòng (nêu rõ việc cần làm và điều đã chốt) → ghi chú hiện ngay trong danh sách
Kỳ vọng: Hiện bản tóm tắt + danh sách 'Chờ bạn xác nhận' gồm đề xuất việc / đề xuất quyết định. Nếu X.AI chưa chạy được: vẫn có tóm tắt tất định kèm câu giải thích vì sao chưa có đề xuất
Kỳ vọng: Việc thật được tạo và giao đúng người/đúng hạn BẠN chọn (không phải người mà máy đoán); kênh nhận thẻ 'chốt việc từ cuộc họp'; đề xuất chuyển sang mục 'Đã chốt'
Kỳ vọng: Chỉ có MỘT việc được tạo — lần bấm thứ hai không đẻ thêm việc trùng
Kỳ vọng: Quyết định được ghi nhận thật (tra lại được ở Quản trị → Quyết định), kênh nhận thẻ tương ứng
Kỳ vọng: Đề xuất biến khỏi danh sách chờ, KHÔNG tạo việc/quyết định nào
Kỳ vọng: Biên bản và các đề xuất của cuộc vừa họp vẫn còn (không mất khi cuộc gọi kết thúc)
Kỳ vọng: Không đọc được ghi chú/đề xuất của cuộc họp mình không dự — chỉ thành viên kênh mới vào phòng được, và chỉ người đã dự mới xem được biên bản
Kỳ vọng: Bấm vào mở đúng tab Họp trực tuyến CỦA KÊNH ĐANG XEM (trước đây nút 'Huddle' này bấm không ra gì)
Kỳ vọng: Gán xong, cột tình trạng trao đổi của người đó chuyển sang dùng được; người bị khoá/vô hiệu hoá thì KHÔNG được tự mở khoá chỉ vì vừa được gán vai trò
Platform Console
Kỳ vọng: Chỉ platform-operator thấy; dashboard tổng quan vận hành nền tảng live
Kỳ vọng: Liệt kê 10 tenant (T001–T010) kèm status / class / blueprint
Kỳ vọng: Luồng đăng ký tenant mới; tenant xuất hiện trong sổ đăng ký với trạng thái onboard
Kỳ vọng: Tạo launch; tiến trình 8 bước chạy tuần tự và cập nhật trạng thái từng bước
Kỳ vọng: Danh mục blueprint & seed-pack; mở chi tiết 1 mục hiển thị cấu phần
Kỳ vọng: Lịch backup định kỳ mỗi tenant; nút 'Chạy ngay' tạo gói tức thì
Kỳ vọng: Danh sách engagement triển khai; mở 1 engagement xem tiến độ
Phát triển & Chất lượng
Kỳ vọng: Đúng 6 sản phẩm theo thứ tự rollout: XHub Platform → X.Office → X2/XBuilding → X1/XBooking → FinERP → X.Space; mỗi thẻ hiện version mới nhất + trạng thái
Kỳ vọng: Version 1.0.0 hiển thị đúng; danh sách repository/component; mục CI/Build đọc từ BuildRecord (chỉ ghi qua callback CI có ký HMAC, KHÔNG có nút tạo tay); mục 'Chưa xây' liệt kê rõ Release readiness/Triển khai/Audit — không giả vờ đã có
Kỳ vọng: Sắp xếp mới nhất trước; đúng version khởi tạo mỗi sản phẩm (XHub Platform/X.Office = 1.0.0, 4 sản phẩm còn lại = 0.1.0)
Kỳ vọng: Danh sách lọc đúng theo pill đã chọn; trạng thái đúng chuỗi FSM (IDEA→TRIAGED→READY→IN_PROGRESS→IN_REVIEW→READY_FOR_TEST→TESTING→ACCEPTED→RELEASED, có nhánh BLOCKED)
Kỳ vọng: Thấy tài liệu 'Chuẩn bảo mật & quyền riêng tư' (loại SECURITY_PRIVACY, phân loại INTERNAL) kèm chip trích dẫn chuẩn/luật
Kỳ vọng: Bấm 1 trạng thái rồi 'Ghi kết quả' → trạng thái + thời điểm cập nhật ngay trên bảng, không cần tải lại trang (kết quả append-only, không đè bản trước)
Kỳ vọng: Tạo Lỗi (Defect) mới, tự đặt tiêu đề 'Lỗi: <tên case>', liên kết đúng test case + kết quả kiểm thử vừa ghi; nút đổi thành link 'Đã báo lỗi <mã lỗi> →'
Kỳ vọng: Thấy đúng lỗi vừa tạo, có nhãn '(từ kết quả kiểm thử)', trạng thái ban đầu NEW
Kỳ vọng: PRD-XHUB: 16 kiểm soát hiện đủ, đa số 'Đã áp dụng' (IN_PLACE), riêng 2 mục về AI/bảo vệ dữ liệu hiện 'Một phần' (PARTIAL); sản phẩm chưa đánh giá hiện đúng 'Chưa đánh giá' (không để trống/lỗi)
Kỳ vọng: Thấy đúng 1 hệ thống AI đã đăng ký (X.Office Workflow AI Draft/Copilot), mức rủi ro 'Giới hạn' (LIMITED), có ghi chú giám sát con người rõ ràng — không phải danh sách rỗng hay số liệu bịa
Kỳ vọng: Thấy đúng 2 hoạt động xử lý dữ liệu đã đăng ký (Danh bạ nhân sự; Chấm công & nghỉ phép), mỗi hoạt động có nhóm dữ liệu + căn cứ pháp lý + trạng thái đánh giá DPIA mới nhất (hoặc 'Chưa có' nếu chưa đánh giá)
Kỳ vọng: 6 thẻ tổng hợp đúng số (kiểm soát theo trạng thái; AI/hoạt động xử lý cần đánh giá); bấm mỗi thẻ nhảy đúng sang trang chi tiết tương ứng (Kiểm soát/Quản trị AI/Bảo vệ dữ liệu); có ghi chú rõ đây là bản rút gọn, CHƯA có sổ bằng chứng đầy đủ và chưa phân quyền riêng vai trò Auditor
Console kỹ thuật
Kỳ vọng: 0 lỗi đỏ (JS error / failed fetch) trên mọi route đã mở
Vận hành — Tách process
Kỳ vọng: Cả 2 process lên khoẻ, không báo lỗi EADDRINUSE; log mỗi process chỉ liệt kê route của đúng nhóm mình (platform: /api/platform, /api/controlplane, /api/mdm, /api/backup, /api/webhooks... — xoffice: /api/xoffice, /api/requests, /api/people...)
Kỳ vọng: Danh sách 10 tenant tải bình thường — xác nhận màn Platform Console lấy dữ liệu từ process platform (:4000)
Kỳ vọng: Danh sách yêu cầu tải bình thường (>100 dòng) — xác nhận màn X.Office lấy dữ liệu từ process xoffice (:4001), KHÔNG phải process platform
Kỳ vọng: Tiến trình 8 bước chạy tới COMPLETED — ĐÂY LÀ BẰNG CHỨNG CHÍNH: request đi từ process xoffice (Delivery) sang process platform (Launch Factory) qua HTTP thật, không phải gọi hàm nội bộ
Kỳ vọng: /platform/tenants báo lỗi kết nối rõ ràng (không phải màn trắng); /office/requests VẪN hoạt động bình thường — chứng minh 2 process độc lập thật, không phải 1 process giả lập 2 port
Kỳ vọng: Toàn bộ app hoạt động bình thường như trước khi tách — chế độ dev nhanh (1 lệnh, khỏi mở 2 terminal) không bị phá vỡ