Bỏ qua

E-001 — Nền quản trị

Nguồn: PRD prd-openapi-platform-2026-09-04 §5 (F1, F3, F7 phần ghi) · spine architecture-openapi-platform-2026-09-04 (AD-1, AD-4, AD-9, AD-11, AD-13, AD-14, AD-15, AD-16, AD-18, AD-19, AD-20, AD-24) · story chi tiết + AC ở _bmad-output/planning-artifacts/epics.md (mục Epic E-001). PO duyệt cấu trúc epic + ô parity: 05/09/2026 — duyệt cả danh sách epic và bảng story · bổ sung 06/09/2026: thêm E-001/0.5 (dựng repo docs), các story cũ dời thứ tự xuống một bậc. · bổ sung 09/09/2026 (PO duyệt): thêm E-001/5.10 (vỏ ứng dụng admin-fe), thứ tự 28 — không dời hàng nào. · bổ sung 09/09/2026 chiều (PO duyệt — UU-TIEN-GD1 §D dòng P1 và P7): tách E-001/5.7 thành ba (5.7 đăng nhập · 5.11 người dùng MSB · 5.12 vai/quyền), thêm thứ tự 29 và 30 — không dời hàng nào; và E-001/5.9 áp tiền lệ port của 5.8 (M:E-004/2.8Đ:E-004/2.8). · bổ sung 11/09/2026 tối (PO chốt từng mục — UU-TIEN-GD1 §G): thêm 1.4 (thứ tự 32) · 5.13 (33) · 5.14 (34) — không dời hàng nào; 2.6 chốt cả ba thao tác qua duyệt + mang đường mồi; 3.3 vào đường găng GĐ1; 4.1 xếp đầu hàng chờ admin-be. · bổ sung 11/09/2026 tối, lượt [Q] (PO chốt OAPI-135): thêm 1.5 (35) · 1.6 (36) — cổng ma trận quyền fail-closed, xếp sau đường găng GĐ1. · bổ sung 11/09/2026 tối (PO chốt): 2.4 + 5.12 thêm CRUD danh mục quyền; 5.12 áp tiền lệ port (M:2.4Đ:2.4) và mở issue ngay — màn trước, nối API là nợ. · 12/09/2026 chiều: thêm 2.7 (37) — 2.6 đã archive theo bản cũ trước khi PO bỏ duyệt ⇒ story mới. · bổ sung 13/09/2026 (PO chốt OAPI-231-khung-uat-cổng-platform, tại làn docs): thêm 0.6 (thứ tự 5b) — khung nghiệm thu uat, hồi tố; không dời hàng nào. Nhà cho change hạ tầng uat; 6 change archive đang trống story: sẽ trỏ về đây (việc làn uat). · 13/09/2026 (PO chốt tại làn admin-fe: «hàng đợi chờ duyệt làm theo gói, bỏ vai trò, quyền, gán vai như đã chốt giai đoạn 1»): viết bù mục AC 5.14epics.md (trước đó chỉ có hàng bảng — issue OAPI-244-màn-hàng-đợi-chờ-duyệt trỏ vào chỗ trống); sửa ô lọc loại của hàng 5.14 cho khớp 3.3 12/09. Không thêm hàng. · ⚠️ 12/09/2026 — gói design/roles/ (CCS) về, PO chốt BỎ maker/checker cho phân quyền GĐ1 (lệch có chủ ý K3, ghi ở docs/backlog-tuan-thu.md §2 + AD-9). Sửa hàng 2.4 · 2.5 · 2.6 · 3.3 · 5.11 · 5.12 · 5.14; ⛔ không dời thứ tự; 2.4 mở issue ngay để ghép luồng với 5.12. Chi tiết gói → §«Gói design/roles/ 12/09» cuối file.

Nền cho mọi epic sau. Mở bằng nhóm 0 dựng khung bốn repo (AD-24) cộng repo tài liệu docs (AD-25), rồi gánh ba thứ không hoãn được (K2 nhật ký bất biến, K3 tách trách nhiệm, K4 mã chủ thể bất biến) cộng nền giao diện cho hai bề mặt.

⚠️ Sửa 09/09/2026 (PO chốt) — AD-13 bỏ điều cấm chia sẻ mã. Bốn cặp story nhóm 5 sinh đôi vì câu cấm cũ (5.1/5.2 · 5.3/5.4 · 5.5/5.6 · 5.7/5.9) nay không phải viết lại từ đầu: làn sau kế thừa bản của làn trước, story chỉ ghi phần khác. ⛔ Trừ danh sách không-được-lệch của AD-13 bản mới — trong nhóm 5 thì chạm sàn trợ năng (UX-DR2, UX-DR3, story 5.3/5.4) và phong bì lỗi. Story đã archive giữ nguyên, ⛔ không sửa hồi tố.

Vì sao làm — BRD tầng epic

Mục tiêu. Người của ngân hàng đăng nhập được, được phân quyền, và mọi thao tác để lại vết không sửa được ngay từ thao tác đầu tiên. Gồm cả nền giao diện dùng chung hai bề mặt.

Nhóm yêu cầu trong PRD — F1, F3, F7

F1 — Quản trị người dùng nội bộ và phân quyền

  • FR-001 Quản trị hệ thống tạo tài khoản người dùng nội bộ. Không có đăng ký tự do.
  • FR-002 Đăng nhập bằng tài khoản hệ thống tự quản (định danh + mật khẩu). PO chốt 04/09/2026 (giải C1): giai đoạn này làm đăng nhập thường; LDAP của bank đi sau qua adapter ở FR-049.
  • FR-003 Phân quyền cấu hình được tại thời gian chạy: người vận hành tạo được vai mới, sửa được tập quyền của vai, mà không cần triển khai lại phần mềm. Quyền gắn vào vai, không gắn trực tiếp vào người. Các vai ở §3 là dữ liệu khởi tạo, không phải hằng số trong mã.
  • FR-004 Gán và thu hồi vai. Thao tác này tự nó phải qua maker/checker — người tự nâng quyền cho mình là lỗ hổng lớn nhất của mô hình phê duyệt hai người.
  • FR-005 Tách trách nhiệm: một người không được vừa là maker vừa là checker của cùng một hồ sơ. Hệ thống chặn, không dựa vào quy định giấy. Đây là ràng buộc bất biến — không có cấu hình nào tắt được nó, kể cả super admin. Phân quyền quyết định ai được duyệt; nó không được phép quyết định có cần người thứ hai hay không.
  • FR-006 Khoá tài khoản. Phiên đang mở của tài khoản bị khoá chấm dứt ngay, không chờ hết hạn.
  • FR-007 Ghi nhật ký đăng nhập thành công, thất bại, đăng xuất, đổi mật khẩu.
  • FR-049 Xác thực đi qua một lớp adapter, để thay nguồn danh tính mà không đụng phần còn lại của hệ thống. Giai đoạn này chỉ hiện thực đường tự quản; đường LDAP của bank cắm sau. PO chốt 04/09/2026: khoá định danh bền là email công ty. Đó là khoá dùng để đối chiếu tài khoản tự quản với bản ghi LDAP khi cắm.

Kèm một rào bắt buộc: nhật ký và mọi tham chiếu nội bộ trỏ vào một mã người dùng nội bộ bất biến, không trỏ vào email. Email công ty đổi được — đổi tên, đổi họ, hoặc đổi tên miền sau một đợt sáp nhập — và một khoá đổi được thì không phải khoá bền. Nếu nhật ký trỏ thẳng vào email thì đúng cái rủi ro ta vừa tránh sẽ quay lại từ cửa khác: nhật ký cũ mất đường nối về người thật, mà Điều 11.12b bắt giữ nó một năm. Email là cầu nối sang LDAP; mã nội bộ mới là danh tính. - FR-050 Tài khoản super admin toàn quyền, có giới hạn: - Không tự phê duyệt được hồ sơ TPP hay đề xuất cấp quyền — FR-005 áp cả với nó. - Không xoá hay sửa được nhật ký (NFR-006). - Mọi thao tác của super admin ghi nhật ký ở mức cảnh báo, tách riêng để soi được. - Số lượng tài khoản super admin bị giới hạn và rà soát định kỳ.

Lý do: câu đầu tiên thanh tra hỏi là "ai có thể một mình cấp quyền PIS cho một bên thứ ba". Nếu câu trả lời là "super admin" thì cả TT-01 lẫn mô hình phê duyệt hai người đều có lỗ, dù trên giấy vẫn đủ điều khoản.

F3 — Phê duyệt maker/checker

  • FR-019 Mọi thay đổi ràng buộc (cấp quyền, sửa hồ sơ đã duyệt, thu hồi, gán vai) phải qua đúng hai người: một đề xuất, một duyệt.
  • FR-020 Checker chỉ duyệt hoặc từ chối. Checker sửa được nội dung thì mô hình hai người sụp — người duyệt trở thành người soạn.
  • FR-021 Từ chối bắt buộc kèm lý do.
  • FR-022 Hàng đợi việc chờ duyệt, lọc theo loại đề xuất.
  • FR-023 Bản ghi phê duyệt bất biến: ai đề xuất, ai duyệt, thời điểm, và nội dung trước và sau thay đổi.
  • FR-024 Cấp duyệt cho scope PIS/EWLTS là giá trị cấu hình, không phải hằng số. Mặc định bằng cấp với scope khác; bank đòi cao hơn thì chỉnh cấu hình. Đây chính là lợi ích của lựa chọn ở FR-051 — C5 không còn là giả định phải đoán.
  • FR-051 Cấu hình luồng phê duyệt: với mỗi loại đối tượng (hồ sơ TPP, cấp quyền, thu hồi, gán vai) khai báo được cần bao nhiêu cấp duyệt và vai nào được duyệt ở từng cấp.

Đây là phần dễ bị bỏ sót nhất khi nghe "maker/checker quy định qua phân quyền". Phân quyền (RBAC) trả lời được "người này có quyền duyệt không", nhưng không trả lời được "người này có được duyệt hồ sơ do chính mình soạn không""việc này cần mấy chữ ký" — đó là ràng buộc quan hệ và ràng buộc quy trình, không phải quyền. Chỉ làm RBAC rồi tuyên bố maker/checker đã cấu hình được là để FR-005 rơi xuống đất mà không ai thấy. - FR-052 Thay đổi cấu hình luồng phê duyệt tự nó phải qua phê duyệt, và ghi nhật ký. Nếu không, người ta hạ số cấp duyệt xuống 1, làm việc cần làm, rồi nâng lại — mô hình hai người bị vô hiệu trong vài phút mà không để lại vết nào.

F7 — Nhật ký và báo cáo tuân thủ

  • FR-041 Nhật ký thao tác quản trị dạng chỉ-ghi-thêm: ai, làm gì, lên đối tượng nào, lúc nào, kết quả ra sao.
  • FR-042 Nhật ký truy vấn được tối thiểu 3 tháng, sao lưu tối thiểu 1 năm (TT-13).
  • FR-043 Tra cứu nhật ký theo TPP, người dùng, khoảng thời gian, loại thao tác.
  • FR-044 Xuất báo cáo cho NHNN (TT-09): danh sách TPP, scope từng TPP, mốc cấp và thu hồi.
  • FR-045 Xuất hồ sơ vòng đời một TPP — từ tiếp nhận tới trạng thái hiện tại, dùng khi bị hỏi về một trường hợp cụ thể.

Bảng story → change

Story Service Thứ tự bắt buộc Ghi chú Chặn bởi
E-001/0.1 Khung dự án admin-be admin-be 1 cap/scaffold-admin-be · AD-24 · Maven, Spotless, JUnit 5, Testcontainers postgres:18
E-001/0.2 Khung dự án portal-be portal-be 2 cap/scaffold-portal-be · AD-24 · pom riêng hẳn; ⛔ không cấu hình Flyway (AD-14)
E-001/0.3 Khung dự án admin-fe admin-fe 3 cap/scaffold-admin-fe · AD-24 · Vite, TypeScript strict; ⛔ không phụ thuộc CDN (AD-23)
E-001/0.4 Khung dự án portal-fe portal-fe 4 cap/scaffold-portal-fe · AD-24 · dựng riêng, không dùng lại cấu hình của 0.3 (AD-13)
E-001/0.5 Dựng repo tài liệu docs docs 5 không OpenSpec · nhà của trang hướng dẫn mà khoá docs: trong link.yaml trỏ tới
E-001/0.6 Khung nghiệm thu uat uat 5b hồi tố (PO chốt 13/09/2026, OAPI-231): dựng 07–12/09 trước khi có story; AC = mô tả cái đã có ở uat@30a7b83 — compose local (AD-26) + AWS · Playwright + uat-case.sh · CI self-hosted (AD-24 mục 7) · seed idempotent · bí mật giả local-only-* (AD-27). ⛔ không OpenSpec cho CA (OAPI-212-uat-viết-ca-không-qua-change) nhưng là nhà của change hạ tầng env/ · tool/ · AWS. Thứ tự 5b = sau 0.5, không dời hàng nào (ô phi số đầu tiên, cố ý)
E-001/1.1 Dòng di trú và schema chung admin-be 6 cap/schema-migration · AD-14 expand-contract, CI chặn vi phạm M:E-001/0.1
E-001/1.2 Ma trận vai và quyền cơ sở dữ liệu admin-be 7 cap/schema-migration · AD-15, AD-20 · phép thử fail-closed trong CI M:E-001/1.1
E-001/1.3 Schema nhật ký bất biến admin-be 8 cap/audit-log · AD-4, AD-18 · cấm cascade, băm móc xích M:E-001/1.1
E-001/2.1 Người dùng nội bộ admin-be 9 cap/iam-internal-users · AD-11 mã bất biến, chỉ vô hiệu không xoá M:E-001/1.1 · M:E-001/1.2
E-001/2.2 Adapter xác thực và đăng nhập tự quản admin-be 10 cap/iam-internal-users · AD-1 port · nợ N1 không làm MFA M:E-001/2.1
E-001/2.3 Phiên có trạng thái admin-be 11 cap/iam-internal-users · AD-19 · hết hạn khi không hoạt động: 15 phút (PO chốt 09/09, NFR-003 vế 1) · ⚠️ vế 2 «xác thực lại để thao tác nhạy cảm» CHƯA có đáp M:E-001/2.2
E-001/3.1 Khung phê duyệt và tách trách nhiệm admin-be 12 cap/approval-workflow · AD-9 bất biến M:E-001/2.1 · M:E-001/1.3
E-001/2.4 Vai và quyền cấu hình được lúc chạy admin-be 13 cap/iam-internal-users · xếp SAU 3.1 vì gán vai phải qua duyệt · ✅ PO chốt 11/09 tối — thêm CRUD danh mục quyền (nguyên văn với admin-fe: «danh mục quyền là cái cấu hình được, xem thêm sửa xoá được, anh cần nó control được qua admin»): quyền có đối tượng · hành động · tên hiển thị · mô tả · lớp (chức năng / đặc quyền duyệt — K3) · trạng thái; UNIQUE(đối tượng,hành động), mã khuôn <đối tượng>.<hành động> (read · create · update · disable + đặc quyền approve, publish…); ⛔ không xoá, chỉ ngưng hoạt động (AD-11); mọi thay đổi vai · quyền · gán qua duyệt 3.1 (FR-004, AD-9). Tham chiếu cơ chế đã chạy ở TingPos permissions(resource, action, display_name) · ma trận vai×quyền gom theo resource · ⚠️ PO SỬA 12/09 theo gói design/roles/: ⛔ KHÔNG qua duyệt — chỉ super admin (iam.super_admin) gọi được các đường này, hiệu lực ngay khi lưu, mỗi thao tác ghi nhật ký 4.1 mức cảnh báo kèm tài khoản thực hiện (K3 lệch có chủ ý, K2 bù) · 13 đối tượng seed đúng mã + thứ tự gói (user · role · permission · tpp_organization · application · tpp_request · api · api_product · api_product_plan · domain · subdomain · api_mock · notification_template) · mã quyền tự sinh, không đổi sau khi tạo · hành động đổi theo lớp: chức năng read/create/update/disable, đặc quyền approve/reject/publish/approve_prod/rotate_approve; quyền lớp đặc quyền mang thêm hai trường đối tượng chịu tác động · khi duyệt thì điều gì xảy ra · vai có mã vai (in hoa/số/_/. ≤ 64), số quyền, số người dùng, updated_at · gán vai ghi granted_at, thu hồi ghi revoked_at không xoá hàng (K1) + đường đọc lịch sử cấp/thu hồi theo tài khoản · người không phải super admin: 403 phong bì AD-16 mã iam.super_admin · ⛔ điều kiện ĐÓNG là 4.1 archive — nhật ký cảnh báo là lớp bù duy nhất cho K3 lệch, ⛔ không ship «hiệu lực ngay» khi chưa có vết; mở change được ngay (4.1 đang thi công) M:E-001/2.1 · Đ:E-001/4.1
E-001/2.5 Super admin có giới hạn admin-be 14 cap/iam-internal-users · FR-050 · đường mồi qua dòng di trú · ⚠️ PO SỬA 12/09: câu 1 của FR-050 («không tự phê duyệt đề xuất cấp quyền») tạm không áp ở GĐ1 — super admin là người duy nhất phân quyền và làm có hiệu lực ngay; ba câu còn lại giữ: không sửa/xoá nhật ký · mọi thao tác ghi mức cảnh báo, tách riêng · giới hạn số lượng super admin + rà soát định kỳ. Dấu «là super admin» sống ở 2.4 (vai/cờ iam.super_admin), story này làm phần giới hạn + đường mồi M:E-001/2.4 · M:E-001/3.1
E-001/2.6 API quản trị người dùng nội bộ admin-be 31 cap/iam-internal-users · mở 11/09/2026, PO chốt — liệt kê (phân trang · tìm · lọc trạng thái) · tạo tài khoản nội bộ · vô hiệu và mở lại (disabled_at, ⛔ không xoá — AD-11). ⛔ Lý do story tồn tại: 2.1 khai BẢNG, ⛔ không khai đường; openapi.yaml @ a26b48b có 4 đường (3 phiên + schema-migration) ⇒ màn 5.11 ⛔ không có nguồn dữ liệu nào. ⛔ Gán vai ⛔ KHÔNG thuộc story này (2.4 + 5.12). ⚠️ Tạo/vô hiệu là thao tác ràng buộc ⇒ ghi nhật ký (K2) — vì thế xếp sau 4.1. ~~✅ PO chốt 11/09 tối: cả ba thao tác qua khung phê duyệt 3.1~~ ⚠️ PO SỬA 12/09 (gói design/roles/ mục 6): ⛔ KHÔNG qua duyệt — tạo · vô hiệu · mở lại do super admin làm, hiệu lực ngay, ghi nhật ký 4.1 mức cảnh báo (K3 lệch có chủ ý GĐ1). Hệ quả: (a) 5.11 bỏ trạng thái «chờ duyệt», bộ từ còn Đang hoạt động · Ngưng hoạt động · (b) đường mồi thuộc story này: migration mồi một tài khoản super admin (không còn đòi hai — AD-9 câu 3 sửa 12/09), mật khẩu buộc đổi lần đầu, tự vô hiệu sau lần đăng nhập đầu theo AD-9, ghi nhật ký. 2.5 giữ nguyên sau 2.4 · đường liệt kê trả createdAt (cột Ngày tạo của 5.11, PO chốt 11/09) · ⛔ 3.1 không còn là điều kiện M:E-001/2.1 · M:E-001/2.3 · M:E-001/4.1
E-001/3.2 Cấu hình luồng phê duyệt admin-be 15 cap/approval-workflow · đổi cấu hình tự nó phải qua duyệt M:E-001/3.1
E-001/3.3 Hàng đợi chờ duyệt admin-be 16 cap/approval-workflow · ✅ PO chốt 11/09 tối: VÀO GĐ1 — nguồn của màn hàng đợi 5.14 (và khối «Yêu cầu chờ duyệt» của E-011 sau này). API liệt kê yêu cầu chờ người đang đăng nhập duyệt được, lọc theo loại đối tượng · ⚠️ 12/09: sau khi PO bỏ duyệt cho phân quyền, hàng đợi GĐ1 không có loại vai/quyền/gán vai/tài khoản nội bộ — chỉ còn hồ sơ tổ chức (E-004/1.3), yêu cầu đăng ký (E-005), cấu hình luồng (3.2) M:E-001/3.1
E-001/4.1 Ghi nhật ký thao tác quản trị admin-be 17 cap/audit-log · actor_type + actor_id · ⛔ NHÀ của FR-007 cho CẢ HAI bề mặt (PO chốt 09/09) — bảng nhật ký nghiệp vụ trong vùng audit; E-001/1.3 đã cấp portal_app INSERT nên portal-be ghi thẳng, ⛔ không đẻ bảng thứ hai · ✅ PO chốt 11/09 tối: ĐẦU hàng chờ admin-be sau E-004/1.1 — vết trước thao tác ràng buộc (§F UU-TIEN-GD1: K2 ⛔ không nợ được); đóng nốt điều kiện Đ: của E-004/2.8 (tắt ĐỎ [8] check-thu-tu.sh) M:E-001/1.3 · M:E-001/2.1
E-001/4.2 Tra cứu nhật ký admin-be 18 cap/audit-log · giữ nóng ≥3 tháng M:E-001/4.1
E-001/5.1 Nền token và thành phần cho admin-fe admin-fe 19 cap/admin-console-ui · UX-DR1, 10, 11, 12 M:E-001/0.3
E-001/5.2 Nền token và thành phần cho portal-fe portal-fe 20 cap/tpp-portal-ui · ~~AD-13 nên viết lại~~ đã archive — giữ nguyên; từ 09/09 story sau kế thừa được M:E-001/0.4
E-001/5.3 Sàn trợ năng cho admin-fe admin-fe 21 cap/admin-console-ui · UX-DR2, 3 · focus-visible không phải focus M:E-001/5.1
E-001/5.4 Sàn trợ năng và responsive cho portal-fe portal-fe 22 cap/tpp-portal-ui · UX-DR2, 3, 4 M:E-001/5.2
E-001/5.5 Khung màn danh sách cho admin-fe admin-fe 23 cap/admin-console-ui · UX-DR6, 8, 9 M:E-001/5.1
E-001/5.6 Khung màn danh sách cho portal-fe portal-fe 24 cap/tpp-portal-ui · UX-DR6, 8, 9 M:E-001/5.2
E-001/5.7 Màn đăng nhập admin-fe admin-fe 25 cap/admin-console-ui · PO tách 09/09 (P1): CHỈ còn màn đăng nhập, quản trị người dùng sang 5.11, vai/quyền sang 5.12 · ⛔ PO chốt 07/09: CHỈ tên đăng nhập + mật khẩu; nút «tài khoản MSB» và bước mã xác thực KHÔNG render (giai đoạn 2) — xem docs/style.md §3 và gói design/ui_kits/admin/ (AdminLogin, index.html:46) M:E-001/5.5 · M:E-001/2.2
E-001/5.8 Hạ tầng phiên cho admin-fe admin-fe 26 cap/admin-console-ui · đăng xuất · đổi mật khẩu trong phiên · trang 404 và 403 toàn màn M:E-001/5.5 · Đ:E-001/5.7 · Đ:E-001/2.2 · Đ:E-001/2.3
E-001/5.9 Đăng nhập và hạ tầng phiên cho portal-fe portal-fe 27 cap/tpp-portal-ui · khoá tạm sau N lần sai · quên mật khẩu dùng câu trung lập · đăng xuất · đổi mật khẩu · 404 và 403 · PO chốt 09/09 (P7): áp tiền lệ port của 5.8 — dựng màn và cổng phiên trên hợp đồng của E-004/2.8, ⛔ màn tự khai là giữ chỗ tới khi BE lên M:E-001/5.6 · Đ:E-004/2.8 ⚠️ khác epic
E-001/5.10 Vỏ ứng dụng admin-fe — Sidebar và Topbar theo gói design admin-fe 28 cap/admin-console-ui · design/components/navigation/Sidebar.jsx, Topbar.jsx · sidebar trắng 228px, nhóm có nhãn, mục đang mở nền cam nhạt, nút thu gọn · topbar breadcrumb + ngôn ngữ + avatar · thay nav giữ chỗ ở App.tsx · danh sách mục tiêm từ ngoài (nếp D1 của 5.5), ẩn theo quyền là dữ liệu đầu vào · ⛔ icon tự host (UX-DR10) M:E-001/5.5 · M:E-001/5.8
E-001/5.11 Màn người dùng MSB admin-fe 29 cap/admin-console-ui · tách từ 5.7 09/09 (P1) · danh sách + tạo tài khoản nội bộ; gói design AccountList lọc Loại = Nội bộAccountCreateModal · ✅ ĐO LẠI 11/09 — gói ĐÃ TÁCH hai màn, ghi chú cũ («gói chỉ có một màn Tài khoản chung hai loại ⇒ dừng và hỏi») HẾT HIỆU LỰC và ⛔ không còn chặn: AccountList({scope}) vào gói từ lượt CCS 09/09 bc770cd — hai tập dữ liệu, cột riêng, lọc riêng, màn TPP ⛔ không có nút Tạo mới. ✅ Hai lệch nghiệp vụ của gói PO đã chốt 11/09, ghi trong thân issue OAPI-140 (admin-fe#25): tạo tài khoản TPP được, qua quyền · màn ⛔ không nói «tài khoản AD». Luật chung ở docs/style.md §1: gói là nguồn hình ảnh, ⛔ không phải nguồn nghiệp vụ. ⚠️ AC năm cột GIỮ NGUYÊN (PO chốt 11/09) — nhưng ba cột Tên đăng nhập · Đơn vị · Vai trò ⛔ chưa có nguồn ở bất kỳ tầng nào (app.internal_user V6 chỉ có email · ho_ten · disabled_at) ⇒ lượt thi công đầu tạm bỏ, phần bỏ đi là NỢ, issue con của OAPI-140. ⛔ Nguồn dữ liệu của màn là story mới E-001/2.6 · gán vai không thuộc story này (ở 5.12) · ~~PO chốt 11/09 tối: tạo · vô hiệu · mở lại qua duyệt 3.1 ⇒ trạng thái «chờ duyệt»~~ ⚠️ PO SỬA 12/09 (gói design/roles/): BỎ «chờ duyệt» — change man-nguoi-dung-msb đã dựng bộ từ ba giá trị @ 0cab81f, gỡ lại trong cùng change (story chưa archive): bộ từ còn Đang hoạt động · Ngưng hoạt động, tạo/vô hiệu/mở lại hiệu lực ngay, không nút duyệt · thêm theo gói: nhấp một hàng mở hộp thoại Gán vai (AssignRoleModal — thân hộp thoại thuộc 5.12, đây chỉ là cửa vào) khi người đang đăng nhập là super admin; người khác thấy hộp cảnh báo «Không đủ quyền gán vai» đầu trang và hàng không nhấp được · ⛔ câu «tài khoản AD» của gói vẫn không theo (PO 11/09) · ✅ PO chốt 11/09 (xác nhận lại với làn platform cùng ngày): thêm cột Ngày tạo — nguồn app.internal_user.created_at (V6), gói AccountList có vẽ; AC năm cột ở epics.md ⛔ không sửa ngược (⛔G1), hàng này là nơi ghi ⇒ màn có sáu cột. Nối API là nợ OAPI-145 (admin-fe#27) M:E-001/5.5 · M:E-001/5.10 · M:E-001/2.1
E-001/5.12 Màn vai và quyền theo chức năng admin-fe 30 cap/admin-console-ui · tách từ 5.7 09/09 (P1) · gói design RoleList · PermissionList · RoleCreateModal · ⛔ K3: «quyền duyệt» là lớp riêng trong bảng quyền, hiển thị tách, ⛔ không trộn vào quyền chức năng; maker ≠ checker trên cùng một việc do engine E-001/3.1 thi hành, ⛔ không phải cấu hình; gán quyền duyệt tự nó qua duyệt (FR-004) · ~~⚠️ gói chưa vẽ lớp quyền duyệt trong RoleCreateModal~~ hết hiệu lực: gói có APPROVAL_PERMS @ screens.jsx:1294 (đo 11/09) · ✅ PO chốt 11/09 tối (mở issue, UU-TIEN-GD1 §G): đi như 5.11màn trước trên nguồn mẫu + tự khai TuKhaiChuaNoi, nối API 2.4 là nợ có tên; áp tiền lệ port P7 ⇒ M:2.4Đ:2.4, điều kiện đóng story vẫn là 2.4 archive · phạm vi thêm theo 2.4: màn CRUD danh mục quyền (PermissionList + tạo/sửa/ngưng, lớp đặc quyền hiển thị tách) · ⚠️ PO SỬA 12/09 — nguồn hình ảnh là gói design/roles/ (Phân quyền - Admin.dc.html + README.md), ⛔ KHÔNG «chờ duyệt», nút chính là «Lưu», hiệu lực ngay; ba màn + bốn hộp thoại: Quyền (lọc đối tượng/lớp, gom theo đối tượng, phân trang số) · Biểu mẫu quyền (mã tự sinh chỉ đọc; chọn lớp đặc quyền ⇒ hành động đổi nhóm + hai trường hệ quả) · Vai trò (7 cột) · Tạo/Sửa vai (ma trận 13 đối tượng × 4 hành động, chọn cả hàng/tất cả; khối Đặc quyền duyệt tự sinh từ danh mục — ⛔ không gõ cứng) · Gán vai (bảng vai với ngày cấp · Đã cấp/Đã thu hồi/Chưa cấp · nút Thu hồi ghi mốc, ô đã thu hồi khoá không bỏ tick · khối lịch sử) · Xác nhận ngưng hoạt động · 403 hai dạng (toàn trang khi mở URL trực tiếp, hộp trong card) · sidebar lọc theo quyền: mục không được cấp không render, nhóm rỗng không render (dữ liệu tiêm vào vỏ 5.10, nếp D1) · ~~7 mục gói còn thiếu~~ gói 12/09 đã lấp; còn lại ở bản kê CCS 12/09 M:E-001/5.10 · Đ:E-001/2.4
E-001/1.4 Thu hồi EXECUTE hai hàm vùng nhật ký khỏi PUBLIC admin-be 32 cap/audit-log · mở 11/09/2026 tối (PO chốt — luật nợ sau archive, §G) · nhà của issue có sẵn OAPI-91 (admin-be#28): audit.bam_su_kien(...)audit.dat_bam_moc_xich() chưa REVOKE EXECUTE FROM PUBLIC, cùng lớp lỗ OAPI-83 đã vá ở V7; ca ghim đã có trong TriggerVanNoSauKhiThuHoiExecuteTest · ⛔ không vá ngược change 2.1 đã archive — đổi trailer **Story:** trên body issue thành E-001/1.4 (đó là mối nối epic-status/inbox đọc, ⛔ không phải link.yaml; đính chính 11/09 theo số đo làn portal-be) M:E-001/1.3
E-001/5.13 Nối bốn màn xác thực của portal-fe vào portal-be thật portal-fe 33 cap/tpp-portal-ui · mở 11/09/2026 tối (PO chốt — §G) · nhà của issue có sẵn OAPI-107 (portal-fe#20) và của change đang thi công noi-xac-thuc-vao-portal-be — trước 11/09 change này chạy không có hàng story ⇒ epic-status mù · bỏ máy chủ giả lập src/features/auth/may-chu-gia-lap.ts, gọi POST /api/v1/tpp-sessions · DELETE …/current · PUT /api/v1/tpp-users/current/password · «quên mật khẩu» vẫn màn giữ chỗ tới khi OAPI-127 trả · ⚠️ số 5.13 trống vì P3 hết đối tượng (5.6 đã gộp vỏ portal) M:E-001/5.9 · M:E-004/2.8
E-001/5.14 Màn hàng đợi chờ duyệt admin-fe 34 cap/admin-console-ui · mở 11/09/2026 tối (PO chốt — UU-TIEN-GD1 §C «lỗ thật», chọn MÀN RIÊNG) · liệt kê yêu cầu người đang đăng nhập duyệt được, lọc theo loại (GĐ1: hồ sơ tổ chức · yêu cầu đăng ký · cấu hình luồng — ⛔ không vai/quyền/gán vai/tài khoản nội bộ, PO 12/09 + 13/09), bấm hàng đi tới màn đối tượng để duyệt/từ chối kèm lý do · ⛔ K3: người tạo yêu cầu ⛔ không thấy nút duyệt của chính mình (engine 3.1 thi hành, màn chỉ phản ánh) · ⚠️ gói design/roles/ 12/09 màn Hàng đợi (tab Vai/Quyền/Gán vai, khối «trước → sau») nhưng đó là biến thể maker/checker cho phân quyền — PO đã bỏ ở GĐ1 ⇒ lấy hình dạng (bảng + chi tiết trước/sau), đổi loại sang hồ sơ tổ chức · yêu cầu đăng ký · cấu hình luồng; ghi bản kê CCS 12/09 để vẽ đúng loại M:E-001/5.10 · M:E-001/3.3
E-001/1.5 Cổng ma trận quyền fail-closed với tập cột rỗng — admin-be admin-be 35 cap/schema-migration · mở 11/09/2026 tối (PO chốt OAPI-135, ghi ở AD-15 bổ sung 11/09) · tập cột khai rỗng = ⛔ không cột nào có quyền; chiều cấm đo mức cột · nghiệm thu bằng mutation GRANT UPDATE (ly_do) phá FR-023 phải đỏ (đo 10/09: 5/5 ca xanh) · ⚠️ xếp SAU đường găng GĐ1 (sau 3.3), ⛔ không chen trước 4.1/2.6 M:E-001/1.2
E-001/1.6 Hợp đồng CSDL của portal-be fail-closed với tập cột rỗng portal-be 36 cap/tpp-self-registration · mở 11/09/2026 tối (PO chốt OAPI-135) · DatabaseContract/DatabasePrivilegeGuard: nonInsertableColumns() khi tập rỗng trả mọi cột; chiều cấm đo mức cột · nghiệm thu: mutation GRANT INSERT (version) ON app.flyway_schema_history TO portal_app phải làm cổng ném (đo 10/09: không ném, 14/15 ca xanh) · trả luôn nợ OAPI-96 (portal-be#22 — hợp đồng thiếu vùng audit) vì mốc trả của nó là «change kế tiếp chạm DatabaseContract» · ⚠️ xếp SAU đường găng GĐ1 M:E-001/0.2 · M:E-001/1.2
E-001/2.7 Tài khoản nội bộ theo mô hình super admin — bỏ đường đề xuất của 2.6 admin-be 37 cap/iam-internal-users · mở 12/09/2026 (luật 09/09: 2.6 đã archive theo bản 11/09 «qua đề xuất hai người» — 2026-09-12-internal-user-admin-api, platform: 61494f7 — ⛔ không sửa ngược, thêm story mới) · làm đúng hàng 2.6 bản 12/09: tạo · vô hiệu · mở lại do super admin (iam.super_admin, cổng đã có từ 2.4) hiệu lực ngay, ghi nhật ký 4.1 mức cảnh báo; bỏ đường đề xuất/duyệt đã dựng (đường HTTP + trạng thái chờ) — ⛔ AD-14.1 chỉ-thêm: bảng/cột đã có thì ngưng dùng, không drop; mồi một super admin · trả luôn OAPI-178 (admin-be#62 — vô hiệu super admin cuối qua đường hiện chạy: ⛔ không được vô hiệu super admin đang hoạt động cuối cùng, 409) · admin-fe 5.11 nối vào đường của story này (OAPI-145) M:E-001/2.6 · M:E-001/2.4 · M:E-001/4.1
# Gói nói So với story/luật Áp
--- --- --- ---
1 Quyền là dữ liệu cấu hình: xem · thêm · sửa · ngưng; không xoá khớp PO 11/09 (CRUD danh mục quyền), AD-11 2.4 5.12
2 <đối tượng>.<hành động> tự sinh, chỉ đọc, không đổi sau tạo; hành động chuẩn + đặc quyền chi tiết mới 2.4
3 Hai lớp; khối đặc quyền trong biểu mẫu vai tự sinh từ danh mục khớp K3 lớp riêng; chi tiết mới (tự sinh) 2.4 5.12
4 Mốc cấp/thu hồi, không bỏ tick, lịch sử khớp K1 2.4 5.12
5 Chỉ super admin thao tác phân quyền; menu ẩn mục không có quyền; 403 khi mở URL trực tiếp mới — FR-003 nói «người vận hành» ⇒ GĐ1 thu về super admin 2.4 2.5 5.12
6 Bỏ maker/checker cho phân quyền, cờ bật lại mâu thuẫn K3 · FR-004/005/050 · AD-9 · chốt 11/09 — trình riêng, PO chốt BỎ 12/09, ⛔ không cờ K3 · AD-9 · 2.4 2.6 5.11 5.12
7 «Tài khoản AD» ở màn Tài khoản MSB ⛔ PO đã bác 11/09 — gói lặp lại không theo, bản kê CCS
Màn Nhật ký hệ thống chưa có thiết kế 4.2 tra cứu nhật ký chưa có hình bản kê CCS

Thứ tự đáng chú ý: 3.1 (khung phê duyệt) xếp trước 2.4 (gán vai) dù cùng nhóm danh tính — vì FR-004 đòi gán vai tự nó phải qua phê duyệt. Làm ngược thì có một khoảng thời gian người ta tự nâng quyền cho mình.

Năm story nhóm 0 chạy song song được với nhau — bốn repo không chạm nhau và không có merge nguyên tử để mà xếp hàng. Số thứ tự 1–4 chỉ nói chúng đứng trước mọi story còn lại, không nói 0.2 phải chờ 0.1.

Nhóm 5 chạy song song được với nhóm 1–4: nền giao diện không phụ thuộc nền dữ liệu, trừ 5.7 cần 2.2 xong — và 2.2 đã archive 09/09/2026 (admin-be 2026-09-09-password-auth-adapter), nên vế «trừ» này hết hiệu lực.

Bổ sung 07/09/2026 (PO duyệt) — hai story hạ tầng phiên. 5.85.9 sinh từ mục Còn thiếu của hệ thống thiết kế: đăng xuất, đổi mật khẩu trong phiên, trang lỗi toàn màn, và màn đăng nhập của cổng bên thứ ba (bảng story trước đó chỉ có màn đăng nhập cho bề mặt quản trị ở 5.7). Không bỏ được vì: AD-19 chốt phiên có trạng thái, kiểm thu hồi mỗi yêu cầu — cơ chế đã có, chỉ thiếu đường cho người dùng gọi nó; Consistency Conventions đã chốt chính sách mật khẩu là cấu hình, mà có chính sách không có đường đổi mật khẩu là chính sách không thi hành được; và AD-28 mục 4 vừa chốt 404 dùng cả cho «có nhưng không được biết là có» — một quyết định bảo mật cần màn nói đúng chừng mực, lộ quá nhiều là phá chính quyết định đó. 5.85.9 chạy song song được với nhóm 1–4 như cả nhóm 5.

Bổ sung 09/09/2026 (PO duyệt) — 5.10 vỏ ứng dụng. Làn admin-fe phát hiện khi đóng 5.8: gói design chốt Sidebar 228px + Topbar breadcrumb (design/components/navigation/), App.tsx đang dùng một thanh nav giữ chỗ của màn trình diễn và tự khai như vậy, và quét 82 story không hàng nào phủ điều hướng của vỏ. Xếp sau 5.8 vì avatar/đăng xuất ở topbar gọi cổng phiên của 5.8. ⛔ Không mang màn nghiệp vụ nào: mục điều hướng trỏ tới màn của epic sau là dữ liệu tiêm vào, vỏ chỉ dựng khung và trạng thái đang mở. portal-fe có bề mặt tương ứng («thanh trên, nội dung ≤ 1160px», gói design §Hai bề mặt) — chưa đo 5.6 đã phủ chưa; nếu chưa thì mở story riêng, không gộp vào đây — hai bề mặt hai vòng đời. ⚠️ Nhưng từ 09/09/2026 story vỏ portal-fe kế thừa 5.10 chứ không viết lại từ đầu (AD-13 bỏ điều cấm).

Bổ sung 09/09/2026 chiều (PO duyệt) — tách 5.7 (P1) và tiền lệ port cho 5.9 (P7). Cả hai đến từ UU-TIEN-GD1 §D, PO chốt từng dòng.

  • P1 — 5.7 mang ba màn ở ba bậc ưu tiên khác nhau. PO xếp đăng nhập trước, người dùng MSB sau, vai/quyền sau nữa; để nguyên một story thì màn đăng nhập không ship sớm được, và story chỉ đóng khi cả ba xong. Tách ⇒ 5.7 đăng nhập (hết chặn: M:5.5M:2.2 đều archive), 5.11 người dùng MSB, 5.12 vai/quyền. ⛔ Không dời hàng nào; 5.8 giữ nguyên Đ:5.7 — nay điều kiện đó hẹp lại đúng phần đăng nhập, và đó là phần 5.8 thật sự cần.
  • P7 — 5.9 đổi M:E-004/2.8 thành Đ:E-004/2.8. Tiền lệ đã có: 5.8 dựng cổng phiên admin-fe trước khi 2.2/2.3 lên, màn tự khai là giữ chỗ, và cách đó chạy được. Giữ M: thì portal-fe đứng chờ một chuỗi ba mắt xích ở hai repo khác (E-004/1.72.85.9) trong khi hợp đồng phiên đã chốt và đọc đượcportal-be origin/xac-thuc-va-phien-tpp §Hình dạng giao admin-be. ⛔ Đổi M:Đ: không cho phép ship màn giả: điều kiện đóng story vẫn là 2.8 archive.

PO chốt 09/09/2026 — FR-007 có nhà, và nhà đó là 4.1, KHÔNG phải story mới. Làn portal-be đo khi explore E-004/2.8: vùng audit của admin-be @ d00d7d0đúng một bảng — audit.schema_event, mà COMMENT của chính nó ghi «Vết mỗi lượt DI TRÚ SCHEMA» — tức nhật ký Flyway, ⛔ không phải nhật ký nghiệp vụ. Không bảng nào cho bốn sự kiện FR-007.

⚠️ Nhưng đây KHÔNG phải ca «story dùng vật mang mà không story nào tạo» như hai ca E-004/1.61.7. Story tạo đã có: E-001/4.1, PO duyệt 05/09, cap/audit-log, và epics.md của nó ghi thẳng «Nhật ký đăng nhập thành công, thất bại, đăng xuất, đổi mật khẩu (FR-007 — chỗ duy nhất trong toàn bộ nguyên liệu nhắc FR-007. Khác nhau ở cách chữa: hai ca trước phải thêm story, ca này chỉ phải mở story sẵn có. ⛔ Mở story mới là hai story cùng cap/audit-log cùng tạo một bảng — đúng thứ sổ đăng ký capability sinh ra để chặn.

4.1 không bị chặn: M:E-001/1.3M:E-001/2.1 đều đã archive.

Bảng nhật ký dùng CHUNG hai bề mặt. AD-20 cấm hai đường xác thực dùng chung bảng tài khoản, không cấm dùng chung bảng nhật ký — và E-001/1.3 đã khai sẵn portal_appINSERT, không SELECT trên vùng audit. Tức kiến trúc đã tính tới portal-be ghi vào đây từ đầu.

Nhóm cam: ảnh chụp SIT KHÔNG phải nguồn sự thật (áp cho 5.1, và mọi story dùng token). Hệ thống thiết kế ghi bề mặt quản trị «hiện vẫn dùng chữ trắng trên nút cam theo ảnh chụp SIT». Bản chốt 05/09/2026 nói khác: chữ trên nền cam là #0F172A, không phải trắng (đo 6.44 và 4.85); cam làm chữ là #C23D1A. Chữ trắng trên cam #E85431 không đạt ngưỡng tương phản, nên nếu bề mặt quản trị giữ chữ trắng thì 5.3 (sàn trợ năng) phải đỏ. Lấy bản chốt 05/09, không lấy ảnh chụp.

Bổ sung 11/09/2026 tối (PO chốt từng mục qua làn platform) — bảy mục của UU-TIEN-GD1 §G. Phần chạm epic này:

  • Luật nợ sau archive (mục 3): issue nợ phát hiện sau khi story archive ⛔ không được giữ trailer **Story:** <story đã archive> trên body — epic-status.sh:128 đọc trailer đó (⛔ không đọc link.yaml; bản đầu ghi sai, đính chính cùng ngày theo số đo làn portal-be: link.yaml của xac-thuc-va-phien-tpp chỉ closes: #19, không chứa #28), thấy issue mở là báo MÂU THUẪN, tín hiệu «xong» mất nghĩa (đo 11/09: 6 story ARCHIVE⚠). Hai lối: nợ có thi côngstory mới có tên, đổi trailer sang story mới (OAPI-911.4 · OAPI-1075.13 · OAPI-131E-004/2.10); nợ chỉ ca kiểm / tài liệu / hạ tầng ngoài repo → giữ issue, gỡ trailer (OAPI-1363.1 · OAPI-1335.4 · OAPI-1235.7). Sửa body issue là việc của làn sở hữu repo, ⛔ làn platform không ghi vào repo khác.
  • 2.6 qua duyệt + mang đường mồi (mục 6 + câu hỏi phụ): xem hàng 2.6. Lý do PO chọn cả ba qua duyệt thay vì chỉ «mở lại»: một nếp thống nhất cho mọi thao tác trên danh tính nội bộ. Giá phải trả, PO đã thấy: 5.11 mang trạng thái chờ duyệt ngay lượt đầu, và phải có ≥ 2 tài khoản mồi.
  • 3.3 + 5.14 vào GĐ1 (mục 5): PO chọn màn hàng đợi riêng thay vì khối trên trang chủ (E-011 chưa duyệt cấu trúc) hay lọc trong màn đối tượng.
  • Thứ tự hàng chờ admin-be sau E-004/1.1 (mục 7, đã gộp câu hỏi phụ về mồi): 4.12.6E-004/1.2E-004/1.33.3. 2.5 giữ chỗ sau 2.4, ⛔ không kéo lên.

Gói design/roles/ 12/09/2026 (CCS) — nhận nguyên vẹn, đối chiếu logic, PO chốt. Gói khai 7 «nguyên tắc nghiệp vụ đã chốt với MSB». Đối chiếu với luật và story:

# Gói nói So với story/luật Áp
1 Quyền là dữ liệu cấu hình: xem · thêm · sửa · ngưng; không xoá khớp PO 11/09 (CRUD danh mục quyền), AD-11 2.4 5.12
2 <đối tượng>.<hành động> tự sinh, chỉ đọc, không đổi sau tạo; hành động chuẩn + đặc quyền chi tiết mới 2.4
3 Hai lớp; khối đặc quyền trong biểu mẫu vai tự sinh từ danh mục khớp K3 lớp riêng; chi tiết mới (tự sinh) 2.4 5.12
4 Mốc cấp/thu hồi, không bỏ tick, lịch sử khớp K1 2.4 5.12
5 Chỉ super admin thao tác phân quyền; menu ẩn mục không có quyền; 403 khi mở URL trực tiếp mới — FR-003 nói «người vận hành» ⇒ GĐ1 thu về super admin 2.4 2.5 5.12
6 Bỏ maker/checker cho phân quyền, cờ bật lại mâu thuẫn K3 · FR-004/005/050 · AD-9 · chốt 11/09 — trình riêng, PO chốt BỎ 12/09, ⛔ không cờ K3 · AD-9 · 2.4 2.6 5.11 5.12
7 «Tài khoản AD» ở màn Tài khoản MSB ⛔ PO đã bác 11/09 — gói lặp lại không theo, bản kê CCS
Màn Nhật ký hệ thống chưa có thiết kế 4.2 tra cứu nhật ký chưa có hình bản kê CCS

Story đã archive có phải sửa không: 3.1 khung phê duyệt là engine generic — không ép vai/quyền đi qua, ⛔ không cần story sửa; 5.10 vỏ nhận danh sách menu tiêm vào — lọc theo quyền là dữ liệu đầu vào của 5.12, ⛔ không cần story sửa; 5.11 chưa archive ⇒ sửa trong change. Không có story «sửa cái đã ship».


Các nhóm việc (feature)

Hệ Admin

Hệ Portal