wal: flush 20260731T1321

This commit is contained in:
pqhuy1987
2026-07-31 13:21:20 +07:00
parent 6da6778b59
commit 222ff163b6
5 changed files with 105 additions and 7 deletions

View File

@ -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

View File

@ -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<string>([
'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 <base>..<head> -- 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

View File

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

View File

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

View File

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