10. fe-user `Layout.tsx`: regex MỚI sau `staticMap[key]``:131`, khuôn Pe-regex `:154`: `/^Khkk_G([1-8])_(WfView|List|Create|Pending|Approved|Deleted)$/` → List `/khkk/list?group=n` · Pending `+&filter=ChoDuyet` · Approved `+&filter=DaDuyet` · Deleted `+&view=deleted` · Create `/khkk/create?group=n` · WfView `/khkk/workflow-matrix?type=10&group=n`. (G1 dùng key cũ nên đi staticMap mục 8; regex `[1-8]` phòng key G1-infix tương lai, không hại.)
11.**WfView lọc theo nhóm** (vá l2-F3 B1b): `WorkflowMatrixViewPage` hiện chỉ lọc type (`:52-71`) → đọc `group` → chỉ hiện workflow `Code === 'KHKK-N'+n` (convention Code do K3 seed; map group↔Code = 1 chỗ export const dùng chung).
12.**Create preset**: `KhkkCreatePage`×2 app đọc `group` → preselect picker nhóm (picker + body `approvalGroup` đã là việc vá-4 cụm-1; đây CHỈ preset giá trị).
13.**fe-admin mirror**: fe-admin `Layout.tsx`có staticMap RIÊNG — grep `Khkk_` bên đó trước khi nới. ⚠️ fe-user `:152-153`khai fe-admin KHÔNG có`WorkflowMatrixViewPage`(bài Pe S155: thêm WfView = link chết) → xem chứng ở K6-read bên dưới; nếu fe-admin không route matrix ⇒ regex fe-admin BỎ nhánh WfView (leaf ẩn admin-side #50 conscious-choice, ghi comment), còn lại mirror y fe-user.
13.**fe-admin mirror — ĐÃ CHỐT bằng K6-read (không còn treo):** fe-admin `Layout.tsx`Pe-regex `:134` CỐ Ý không WfView (`:129-133`thiếu`WorkflowMatrixViewPage`toàn cục — lead chốt 2026-07-27 giữ lệch) VÀ K6 ẩn root `KeHoachKyKet` khỏi sidebar admin ⇒ **fe-admin KHÔNG nới regex `Khkk_G{n}_*`** (dead-by-K6). Chỉ fe-user Layout đổi ở K4b/c; `KhkkListPage/KhkkCreatePage` fe-admin VẪN sửa (mirror SHA — sống qua deep-link). Ghi comment khai lệch tại regex fe-user.
### Acceptance K4 (đo được, UI-first — bài cụm-1)
- [ ] A1. Login Admin ×2 app: root GĐ2 → **8 group × 6 leaf = 48 leaf HIỆN sidebar** (đếm từ UI, không chỉ curl).
@ -65,10 +65,69 @@
- [ ] B4. Đếm: badge folder cha == Σ chip sub-folder (kể cả "(chưa phân nhóm)"/"(ngoài chỉ mục)") — thử 1 gói thầu có phiếu 2 nhóm + 1 HĐ ngoài index; KHÔNG leaf nào biến mất so với trước K5.
## K6 Admin thu gọn
(ĐANG LÀM)
**Hiện trạng:**`isAdminHidden` fe-admin `Layout.tsx:182-184` = đúng 1 luật `key.startsWith('Ct_')`; `filterForAdmin:186-190` lọc ĐỆ QUY mọi tầng ⇒ **ẩn 1 root = cả subtree chết theo** — tập key chỉ cần liệt ROOT (+2 con của System), không phải từng leaf.
1.**Mở rộng tập key tường minh** (QĐ7 — GIỮ blacklist, KHÔNG đảo whitelist):
```ts
const ADMIN_HIDDEN_KEYS = new Set<string>([
'PurchaseEvaluations', // GĐ1 root (:1797) — Pe_* subtree chết theo
3. **Display-only, KHÔNG đụng quyền** (2 tầng #82): route fe-admin còn nguyên — admin deep-link `/purchase-evaluations`… vẫn 200. Thu gọn = menu, không phải revoke; khai rõ trong PR để không ai tưởng mất quyền.
4. **Hệ quả cho K4c (chốt nghi vấn WfView):** fe-admin Pe-regex `:134` CỐ Ý không WfView (`:129-133` — fe-admin KHÔNG có `WorkflowMatrixViewPage`, lead chốt 2026-07-27 "giữ lệch, đừng vá") + K6 ẩn `KeHoachKyKet` root ⇒ **fe-admin Layout KHÔNG cần nới regex `Khkk_G{n}_*`** (leaf không bao giờ render admin-side). Ghi 1 comment tại chỗ regex fe-user để khai lệch có chủ đích.
### Acceptance K6
- [ ] C1. **Liệt kê đúng N mục LÁ còn thấy (đủ tên — dư/thiếu 1 = FAIL).** Công thức: N = `Dashboard` + `Users` + `Roles` + `Permissions` + `MenuVisibility` + |leaf AwV2 trong DB|. Seed đọc được 2 leaf AwV2 (`:1802-1803`); ⚠️ uncertain: row `AwV2_Contract` có thể tồn tại DB ngoài seed (regex `:166-172` nhận code `Contract`) — đo trước bằng `SELECT [Key] FROM MenuItems WHERE [Key] LIKE 'AwV2%'` rồi chốt N: **7 (nếu 2 AwV2) / 8 (nếu 3)**; SAU K3 = N+8 designer `KHKK-N1..N8`.
- [ ] C3. l3-F9: K6 kéo sớm trước K3 ⇒ mục "đếm được 8 designer trong sidebar admin" DỜI sang acceptance K3 (không đo ở K6).
- [ ] C4. Deep-link admin 1 route bị ẩn menu (vd `/purchase-evaluations`) vẫn 200 — chứng display-only.
## Thứ tự + phụ thuộc
(ĐANG LÀM)
**Vẽ lại (trả lời câu "K4a chạy được sau K1 hay cần K2 DTO?"): K4a KHÔNG cần cả K1 lẫn K2** — menu-row + grant + MenuKeys.All thuần `DbInitializer`/`MenuKeys.cs`, 0 đụng schema/DTO. Nhưng ship K4a MỘT MÌNH thì 42 leaf trỏ `?group=n` mà BE chưa hiểu param ⇒ list hiện TẤT phiếu (silent-wrong, mục K4b-9) — leaf RENDER được, LỌC chưa đúng.
```
Cụm-1: K1 ──► K2 ──► K3 (K3 đang treo OG-9)
│ │
Cụm-2: K6 ───┐│ │ (độc lập 100% — kéo SỚM NHẤT: còn rút việc fe-admin
K4a ──┼┘ │ khỏi K4c [K6-4]; đổi lại C3/l3-F9: đếm-8-designer dời sau K3)
**Thứ tự ship đề xuất:** `K6 → K4a → [K2 land] → K4b + K5 → [K3 land] → K4c`.
- K6 + K4a chạy song song cụm-1 ngay hôm nay (0 chặn).
- K4a land trước K2 = chấp nhận cửa sổ leaf-lọc-chưa-đúng trên Dev; nếu sợ UAT hiểu nhầm bug thì gộp K4a ship cùng K4b sau K2 (đo acceptance A2 luôn thể). Acceptance A1/A3-A6 đo được NGAY sau K4a; A2 BẮT BUỘC sau K2.
- K4c KHÔNG ship-trước-degrade: filter WfView theo Code `KHKK-N{n}` khi chưa seed 8 workflow ⇒ matrix RỖNG (tệ hơn không filter) — đợi K3.
## Checklist tổng cụm-2
(ĐANG LÀM)
- [ ]**0 EF migration toàn cụm-2** — menu = seed DB + restart API (bài S155); có ai đề mig là sai khuôn.
LANE 3/3 review cụm-2 (`sub-invest-fable-b2-cum2.md`) — lens ĐO-ĐƯỢC + THỨ TỰ.
Trạng thái: **(ĐANG LÀM)**
## Findings
(đang append)
## Verdict
(ĐANG LÀM)
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.