diff --git a/.claude/WAL.md b/.claude/WAL.md index 4fe6ebd..8b68a06 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -37,9 +37,13 @@ next: 5/6 OG CHỐT (1 schema-GỘP+UI-1-1 · 2 đội-hình-cũ · 7 N-phiếu+ OG-9 ✅ CHỐT (câu IV): anh xác nhận đảo "PHÁ VỠ" @S155 — "chỗ budget chốt chặn là a Chương" ⇒ K3 (a)-(e) HẾT CHẶN. + OG-3 NÂNG: trần budget = HUMAN-GATE VĨNH VIỄN (a Chương quyết cần-CEO-hay-không) — XÓA mọi ý "enforce máy wave sau" khỏi backlog. 7/7 OG nghiệp-vụ đã chốt; còn OG-6 soát-bảng (chặn seed) + OG-5. - wf: B2 cụm-2 wf_15a42015-aea ĐANG CHẠY (1 lane fable đan-xen: K4 sidebar 49-row · K5 cây groups · K6 admin). - CHỜ ANH: (I) bản-15-trang · (II) B2-14-dòng+"/"=hoặc · (III) ai bấm Đưa-vào-HĐ · (IV=OG-9) đảo PHÁ-VỠ-S155. - Sổ fable-lane: StructuredOutput-fail 3/5 (2 att gần nhất SẠCH — đan-xen tương quan?). + B2 cụm-2 invest ✅ wf_15a42015-aea SẠCH (5/5 section, K4 13v·K5 6v·K6 4v, 0-mig; BÁC 2 tiền-đề lead: + 13-role=13/13-R+C+U [:2427] · fe-admin khỏi-nới-regex [ẩn subtree :186-190]; lead spot-check 2/2 ĐẠT; + drift chain 55→64→113 key · policies →452; precedent-split khai 2 khuôn ngoài-All⟂trong-All). + wf: SONG SONG — B2-r cụm-2 wf_954b8cf0-e6b (3 lane reviewer c2-l{1,2,3}) + B2 cụm-3 invest wf_a21c8ff1-bc7 + (1 lane fable: K7 bridge KHKK→HĐ 3-nấc + K8 kịch-bản dry-run per-bước từ PE/2026/A/049). + CHỜ ANH: (I) bản-15-trang · (II) B2-14-dòng+"/"=hoặc · (III) ai bấm Đưa-vào-HĐ (K7 default người-có-quyền + + dialog, đánh dấu chờ) · OG-6 soát bảng. Sổ fable-lane: fail 3/6 (3 att đan-xen gần nhất SẠCH). verify: grep -c 'END spec v2' .claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/spec-4gd-khkk-tong-quat-31-07-2026.md diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-invest-fable-b2-cum2.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-invest-fable-b2-cum2.md index 07e7a6c..8dc259e 100644 --- a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-invest-fable-b2-cum2.md +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-invest-fable-b2-cum2.md @@ -37,7 +37,7 @@ 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([ + 'PurchaseEvaluations', // GĐ1 root (:1797) — Pe_* subtree chết theo + 'KeHoachKyKet', // GĐ2 root (:1775) — Khkk_* 8 nhóm chết theo + 'Contracts', // GĐ3 root (:1771) — Ct_* đã có prefix-rule, root nay ẩn nốt + 'HopDongCung', // GĐ4 root (:1776) — Hdc_* chết theo + 'Forms', // :1788 + 'Reports', // :1789 + 'Master', // Danh mục root (:1760) — Suppliers/Projects/Departments/Catalogs/HrmConfig(:1816 parent Master) chết theo + 'Hrm', // :1809 + 'Off', // :1827 + 'Personal', // :1853 + 'Workflows', // :1795 — CON của System, phải liệt riêng (Wf_* chết theo) + 'PeWorkflows', // :1798 — CON của System (PeWf_* chết theo) + ]) + function isAdminHidden(key: string): boolean { + return ADMIN_HIDDEN_KEYS.has(key) || key.startsWith('Ct_') + } + ``` + **CHỪA (không vào set):** `Dashboard` (QĐ7 giữ) · `System` + 4 leaf quản trị `Users/Roles/Permissions/MenuVisibility` (`:1791-1794`) · `ApprovalWorkflowsV2` (`:1801`) + subtree AwV2 (2 leaf seed `:1802-1803` + 8 designer K3). +2. **Sửa comment ĐỦ KHỐI** `:177-184`: khối cũ khai "[S57] BỎ ẩn Danh mục — admin quản master trực tiếp" (`:179-181`) — QĐ7 ĐẢO lời đó ⇒ comment phải viết lại (khai đảo + trỏ spec S164), kẻo lượt sau đọc comment cũ tưởng bug (bài cụm-1 "đọc comment đủ khối"). +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`. +- [ ] C2. fe-user KHÔNG đổi: `git diff --stat .. -- fe-user/src` = **0 file** (đo diff, KHÔNG đo bundle-hash — #69/l3-F12). +- [ ] 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) + K4b ◄─┘ (cần K2: param group :622-625 + DTO approvalGroup + backfill=1) + K5 ◄── (cần K2: approvalGroup trên KhkkListItemDto; GĐ3/4 group-by c.type + tự do nhưng CÙNG FILE — làm 1 lượt sau K2 cho đỡ 2 lần mirror-SHA) + K4c ◄── (cần K3: 8 Code KHKK-N1..N8 cho WfView filter + preset Create) +``` + +**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. +- [ ] K4: 13 việc (K4a 1-6 · K4b 7-9 · K4c 10-13) + acceptance A1-A6 (A2 đo sau K2). +- [ ] K5: 6 việc + acceptance B1-B4 (SHA-identical 3 file ×2 app · build ×2 PASS · Σ sub-folder == folder cha). +- [ ] K6: 4 việc + acceptance C1-C4 (liệt đúng N lá kèm tên · fe-user git-diff 0 file · 8-designer dời sau K3). +- [ ] Drift khai CÙNG COMMIT K4a: STATUS 2 row Menu keys 64→113 · Policies 256→452 (nối tiếp 55→64 cụm-1) — đừng Goodhart giữ-số-đứng-yên. +- [ ] Test: **+1 BE** (extend test seed-grant cụm-1 phủ 49 key mới — khai k=1, tổng ≥590+k' cụm-1 +1); còn lại là acceptance UI/SQL đo tay (14 mục A/B/C). +- [ ] Mọi wave: cicd PASS · wave FE-ship byte-verify #77 (K4b/c, K5, K6) · wave BE-only smoke API (K4a) — l3-F17. +- [ ] Nhãn 8 nhóm (K4a-3) = đề xuất từ transcribe — owner chỉnh CHỮ tự do, KEY không đổi; không chặn wave nào (khác OG-6 vốn chỉ chặn K1-seed). + +END sub-invest-fable-b2-cum2 — TOTAL: K4 13v · K5 6v · K6 4v · 1 test diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l1.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l1.md new file mode 100644 index 0000000..178a0d4 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l1.md @@ -0,0 +1,11 @@ +# c2-l1 + +LANE 1/3 — LENS QUYẾT-vs-CODE. Đối tượng: `sub-invest-fable-b2-cum2.md` (K4 sidebar 49-row · K5 cây groups · K6 admin 12-key blacklist). + +## Findings + +(ĐANG LÀM) + +## Verdict + +(ĐANG LÀM) diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l2.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l2.md new file mode 100644 index 0000000..ed490b9 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l2.md @@ -0,0 +1,12 @@ +# c2-l2 + +LANE 2/3 — lens ĐỦ-vs-SPEC cho cụm-2 (K4 sidebar 49-row · K5 cây groups · K6 admin 12-key blacklist). +Nguồn chấm: `sub-invest-fable-b2-cum2.md` + `spec-4gd-khkk-tong-quat-31-07-2026.md` (§③ cụm-2, §② QĐ6/7, OG-8) + `spec-cum1-chi-tiet-31-07-2026.md` (12 vá liên đới). + +## Findings + +(ĐANG LÀM) + +## Verdict + +(ĐANG LÀM) diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l3.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l3.md new file mode 100644 index 0000000..9150c09 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-c2-l3.md @@ -0,0 +1,12 @@ +# c2-l3 + +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)