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 test

Mở 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.

  1. 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).
  2. Ở 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.
  3. 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.
  4. Đ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'.
  5. 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).
  6. 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).
  7. 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.
  8. 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ãnTênEmail / userIdMật khẩuGhi chú
ADMIN / PLATFORMNguyễ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ƯỜNGTrầ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 PASS

Kết quả các cổng tự động ở lần chạy mới nhất (chỉ đọc).

Kết quảLệnhKỳ vọng
PASSapi tsc (npx tsc --noEmit)0 lỗi — API biên dịch sạch (NestJS/Prisma)
PASSweb tsc (npx tsc --noEmit)0 lỗi src/** — web biên dịch sạch (Next 16)
PASStest:rlsRLS PASSED — 35 bảng có chính sách; MUST_NOT_LEAK 0 rò rỉ giữa tenant
PASStest:smokeE2E PASSED — 13 workflow X.Office chạy end-to-end
PASStest:controlplaneCONTROL PLANE PASSED — reset + smoke bộ điều phối control-plane
PASStest:mdmMDM PASSED — dữ liệu chủ (đơn vị/vị trí/vai trò) nhất quán
PASStest:backupBACKUP PASSED — 30 assertions; tạo gói + checksum
PASStest:recordsRECORDS 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
PASStest:webhookWEBHOOK PASSED — phát/nhận sự kiện webhook* PASSED kèm teardown libuv (Windows) — đã xác minh không phải lỗi
PASStest:conditionCONDITION AST PASSED — 20 cases; bộ điều kiện quy trình
PASStest:authzAUTHZ PASSED — allow 201 / deny 403 / 401 / OIDC* PASSED kèm teardown libuv (Windows) — đã xác minh không phải lỗi
PASStest:rolesROLE REGISTRY PASSED — vai trò + ma trận quyền resolve đúng
PASStest:auth-flowAUTH FLOW PASSED — login / invite→activate / forgot→reset / revoke
PASStest:requestsREQUESTS PASSED — Request Center tạo→submit→duyệt→thực thi
PASStest:directivesDIRECTIVES PASSED — chỉ đạo issue→acknowledge→accept
PASStest:ticketsTICKETS PASSED — Service Desk tạo→assign→resolve→CSAT
PASStest:bookingsBOOKINGS PASSED — đặt chỗ tạo→duyệt→check-in + xung đột 409
PASStest:announcementsANNOUNCEMENTS PASSED — publish→read→acknowledge→remind
PASStest:tenant-registryTENANT REGISTRY PASSED — sổ đăng ký tenant + trạng thái/lớp
PASStest:platform-consolePLATFORM CONSOLE PASSED — quyền platform-operator + tổng quan
PASStest:launch-factoryLAUNCH FACTORY PASSED — khởi chạy tenant qua 8 bước tiến trình
PASStest:catalogCATALOG PASSED — seed + smoke blueprint & seed-pack
PASStest:deliveryDELIVERY PASSED — engagement/triển khai khách hàng
PASStest:t002T002 PASSED — provision + cách ly tenant realestate-demo* PASSED kèm teardown libuv (Windows) — đã xác minh không phải lỗi
PASStest:demosDEMOS PASSED — provision + smoke bộ tenant demo
PASStest:backup-scheduleBACKUP SCHEDULE PASSED — lịch backup định kỳ mỗi tenant
PASStest:work-itemWORK ITEM PASSED — NativeWorkItem CRUD + FSM + tag/dimension
PASStest:work-projectWORK PROJECT PASSED — ExecutionProject WBS + phụ thuộc FS/SS/FF/SF + baseline
PASStest:work-viewsWORK 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
PASStest:manage-sliceMANAGE SLICE PASSED — 28 assertions: Mục tiêu→KPI(từ Work)→Review→Quyết định→Action→NativeWorkItem→Follow-up + cách ly tenant
PASStest:manage-okrMANAGE 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
PASStest:manage-industryMANAGE 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 đè
PASStest:ioc-twinIOC 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
PASStest:ioc-data-layerIOC 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
PASSscan:secretsSECRET SCAN PASSED — 0 secret lộ ngoài .env
PASStest:e2e2 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)
PASSmigrate: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ử
PASSboot 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
PASStest: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
PASStest: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
PASSfull smoke run 39 script trên cấu hình 2-process39/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

Cục bộ

💡 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

U1Xem icon rail bên tráiMở màn ↗

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)

U2Bấm từng workspace trên railMở màn ↗

Kỳ vọng: Panel 'prime' con hiện đúng các màn của workspace đang chọn

U3Thu gọn menu (nút 'Thu gọn / Mở menu')

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

U4Thu nhỏ cửa sổ / mở trên mobile → hamburger

Kỳ vọng: Hiện drawer hamburger; drawer liệt kê menu theo workspace đang chọn

U5Mở Sơ đồ đơn vị → nút toàn màn hìnhMở màn ↗

Kỳ vọng: Org-chart fullscreen phủ luôn rail bên trái; thoát fullscreen trả lại layout

U6Chuyển sáng / tối (theme toggle)

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

U7Mở /docs xem các tabMở màn ↗

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

U8Mở /login đăng nhậpMở màn ↗

Kỳ vọng: Form login render; đăng nhập đúng → vào app; sai → báo lỗi

U9Luồng mời → kích hoạt (/activate) [ENFORCE]Mở màn ↗

Kỳ vọng: Link mời mở /activate; đặt mật khẩu → tài khoản active, đăng nhập được

U10Quên mật khẩu /forgot → /reset [ENFORCE]Mở màn ↗

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

U11Thu hồi phiên khi treo tài khoản [ADMIN][ENFORCE]Mở màn ↗

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)

U12Chọn tenant (/select-tenant)Mở màn ↗

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

U13Mở /admin tổng quan [ADMIN]Mở màn ↗

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

U14/admin/users — danh sách + mời [ADMIN]Mở màn ↗

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

U15/admin/organization — Sơ đồ đơn vị [ADMIN]Mở màn ↗

Kỳ vọng: Chip 'Dữ liệu trực tiếp (/api/identity)'; cây đơn vị + trưởng đơn vị thật

U16Sơ đồ nhân sự (avatar/email/sđt) [ADMIN]Mở màn ↗

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

U17Cấu hình node đơn vị [ADMIN]Mở màn ↗

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

U18In / Xuất PDF sơ đồ [ADMIN]Mở màn ↗

Kỳ vọng: Nút In/Xuất PDF tạo file sơ đồ đúng bố cục

U19/admin/positions — vị trí + kiêm nhiệm [ADMIN]Mở màn ↗

Kỳ vọng: Timeline vị trí theo thời gian; hiển thị acting/kiêm nhiệm đúng

U20/admin/roles — vai trò + ma trận quyền [ADMIN]Mở màn ↗

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

U21/admin/data-scopes — phạm vi dữ liệu [ADMIN]Mở màn ↗

Kỳ vọng: Cấu hình data-scope (đơn vị/vùng) hiển thị và lưu đúng

U22/admin/delegations — uỷ quyền [ADMIN]Mở màn ↗

Kỳ vọng: Màn uỷ quyền; guardrail SELF_DELEGATION gắn cờ khi tự uỷ quyền cho mình

U23/admin/backups → '+ Tạo bản sao lưu' [ADMIN]Mở màn ↗

Kỳ vọng: Drawer mở, submit → gói mới xuất hiện, Checksum PASS, dung lượng hiển thị

U24/admin/restores — phục hồi [ADMIN]Mở màn ↗

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

U25/admin/audit — nhật ký kiểm toán [ADMIN]Mở màn ↗

Kỳ vọng: Log audit các thao tác quản trị; lọc/tra cứu được

U26/admin/settings/tenant — provisioning [ADMIN]Mở màn ↗

Kỳ vọng: Panel provisioning live; toggle Bật/Tắt app; nút 'Đối soát' → consistent

X.Space

U42Kênh /space/home + kênhMở màn ↗

Kỳ vọng: Danh sách kênh; mở 1 kênh xem overview/threads/lists

U43Nhắn trực tiếp (DM)Mở màn ↗

Kỳ vọng: Mở DM tới 1 người; gửi/nhận tin hiển thị đúng luồng

U44Khách hàng 360 /customersMở màn ↗

Kỳ vọng: Danh sách khách hàng; mở hồ sơ 360 (thông tin + hoạt động) đầy đủ

U136Gửi tin trong kênh + thả cảm xúcMở màn ↗

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ỏ

U137Đính kèm tệp/ảnh vào kênh (thử cả tệp > 20MB)Mở màn ↗

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é'

U138Tab Tài liệu của kênhMở màn ↗

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

U139Nhắn riêng: mở DM với 1 người, rồi mở lại từ phía người kiaMở màn ↗

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

U140Thẻ sự kiện nghiệp vụ trong kênh (tờ trình/nhiệm vụ/duyệt)Mở mà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

U141Tạo việc từ một tin nhắn (menu trên tin)Mở màn ↗

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 đó

U142Tab Công việc của kênhMở màn ↗

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

U143Hộp hoạt động /space/activityMở màn ↗

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

U144Tìm kiếm /space/search — gõ vài từ rời (vd tên khách + số)Mở màn ↗

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ỗ

U145Lưu để xem sau + /space/savedMở màn ↗

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)

U146X.AI trong kênh: 'Tôi đã lỡ gì' / hỏi đáp / soạn nhápMở màn ↗

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

U147Họp trực tuyến — vào phòng (cần cấp quyền micro/camera)Mở màn ↗

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ẻ)

U148Họp trực tuyến — tắt/bật tiếng, tắt/bật camera, rời phòngMở màn ↗

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

U149Ghi chú trong cuộc họp (khung 'Ghi chú & giao việc')Mở màn ↗

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

U150Bấm 'Tóm tắt & rút đề xuất'Mở màn ↗

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

U151Xác nhận một đề xuất việc: chọn người nhận + hạn rồi bấm 'Tạo việc'Mở màn ↗

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'

U152Bấm 'Tạo việc' hai lần trên cùng một đề xuấtMở màn ↗

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

U153Xác nhận một đề xuất quyết địnhMở màn ↗

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

U154Bỏ một đề xuấtMở màn ↗

Kỳ vọng: Đề xuất biến khỏi danh sách chờ, KHÔNG tạo việc/quyết định nào

U155Rời phòng rồi quay lại tab Họp trực tuyếnMở màn ↗

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)

U156Người KHÔNG dự cuộc họp mở tab Họp trực tuyến của kênh đóMở màn ↗

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

U157Nút '📞 Họp trực tuyến' ở đầu kênhMở mà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ì)

U158[ADMIN] Gán người vào vai trò → kiểm tra người đó nhắn tin đượcMở màn ↗

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

U45/platform tổng quan [PLATFORM]Mở màn ↗

Kỳ vọng: Chỉ platform-operator thấy; dashboard tổng quan vận hành nền tảng live

U46/platform/tenants — danh sách tenant [PLATFORM]Mở màn ↗

Kỳ vọng: Liệt kê 10 tenant (T001–T010) kèm status / class / blueprint

U47Đăng ký / onboard tenant khách [PLATFORM]Mở màn ↗

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

U48/platform/launches — khởi chạy tenant [PLATFORM]Mở màn ↗

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

U49/platform/blueprints + /platform/seed-packs [PLATFORM]Mở màn ↗

Kỳ vọng: Danh mục blueprint & seed-pack; mở chi tiết 1 mục hiển thị cấu phần

U50/platform/backups — lịch backup + Chạy ngay [PLATFORM]Mở màn ↗

Kỳ vọng: Lịch backup định kỳ mỗi tenant; nút 'Chạy ngay' tạo gói tức thì

U51/delivery — triển khai khách hàng [PLATFORM]Mở màn ↗

Kỳ vọng: Danh sách engagement triển khai; mở 1 engagement xem tiến độ

Phát triển & Chất lượng

U124Tổng quan /engineering — xem 4 thẻ số liệu + danh sách sản phẩmMở màn ↗

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

U125Mở sản phẩm PRD-XHUB — xem 'Product 360' (Tổng quan, phiên bản, repository, CI/Build)Mở màn ↗

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ó

U126Phiên bản & Phát hành /engineering/versions — xem bảng version của cả 6 sản phẩmMở màn ↗

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)

U127Backlog /engineering/backlog — lọc theo sản phẩm rồi theo trạng tháiMở màn ↗

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)

U128Tài liệu /engineering/docs — lọc theo sản phẩm PRD-XHUBMở màn ↗

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

U129Kiểm thử /engineering/tests — chọn 1 sản phẩm → phiên bản → module, ghi kết quả 1 test case (PASS hoặc FAIL)Mở màn ↗

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)

U130Ở 1 case vừa ghi FAIL, bấm nút 'Báo lỗi'Mở màn ↗

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> →'

U131Lỗi (Defect) /engineering/defects — tìm lại đúng lỗi vừa báo ở U130Mở màn ↗

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

U132Khung kiểm soát /engineering/controls — chọn PRD-XHUB rồi chọn 1 sản phẩm khác chưa được đánh giáMở màn ↗

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)

U133Quản trị AI /engineering/ai-systemsMở màn ↗

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

U134Bảo vệ dữ liệu /engineering/privacyMở màn ↗

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á)

U135Phòng kiểm toán /engineering/audit-room — bấm lần lượt các thẻ số liệuMở màn ↗

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

U70DevTools Console khi lướt tất cả màn

Kỳ vọng: 0 lỗi đỏ (JS error / failed fetch) trên mọi route đã mở

Vận hành — Tách process

U106[DEV] Ở xhub-api: `npm run build` rồi mở 2 terminal chạy `npm run start:platform:prod` và `npm run start:xoffice:prod`

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...)

U107Sửa `xhub-web/.env.local`: `XHUB_API_URL`/`NEXT_PUBLIC_XHUB_API_URL=http://localhost:4000`, `XOFFICE_API_URL`/`NEXT_PUBLIC_XOFFICE_API_URL=http://localhost:4001`, khởi động lại `npm run dev`, mở /platform/tenantsMở màn ↗

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)

U108Mở /office/requests (giữ nguyên cấu hình U107)Mở màn ↗

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

U109Mở /delivery, chọn 1 engagement đã tới giai đoạn GO_LIVE, bấm 'Khởi chạy tenant'Mở màn ↗

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ộ

U110[DEV] Tắt process platform (Ctrl+C ở terminal :4000), thử mở lại /platform/tenants, rồi mở /office/requests

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

U111[DEV] Tắt cả 2 process, chạy lại `npm run start:dev` (chế độ all-in-one, 1 process duy nhất :4000) ở xhub-api

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ỡ