wal: flush 20260801T0921

This commit is contained in:
pqhuy1987
2026-08-01 09:21:16 +07:00
parent ce15c649b3
commit 21908b445f
3 changed files with 89 additions and 2 deletions

View File

@ -1,4 +1,4 @@
IMPLFE-K4A: IN-PROGRESS
IMPLFE-K4A: DONE
# Lane FE K4a — route regex 42 leaf + single-source nhãn nhóm (S166, 2026-08-01)
@ -41,5 +41,64 @@ SPEC PIN: `spec-cum2-chi-tiet-31-07-2026.md` vá 1/8/15 + `sub-invest-fable-b2-c
**(b) `isAdminHidden` KHÔNG hề ẩn `KeHoachKyKet`.** `fe-admin/Layout.tsx:194-196` = `return key.startsWith('Ct_')` — chỉ ẩn `Ct_*`. ⇒ mệnh đề "gỡ `KeHoachKyKet` khỏi ẩn-admin ⇒ phải nới regex trước" **mô tả một điều kiện tương lai KHÔNG tồn tại**; ràng buộc thật đã **ĐANG hiệu lực NGAY** (fe-admin đang hiện KHKK). Comment phải viết theo đĩa, không theo tiền-đề.
## §2 THỰC THI (append sau MỖI file)
## §2 THỰC THI
### F1 — `fe-user/src/components/Layout.tsx` (+34 / 0)
Nhánh `khkkMatch` đặt **SAU** khối `peMatch`, **TRƯỚC** `return null` cuối `resolvePath`. Regex ĐÚNG literal spec `/^Khkk_G([1-8])_(WfView|List|Create|Pending|Approved|Deleted)$/`. 6 route (đọc từ App.tsx thật, không tin literal spec):
`WfView → /khkk/workflow-matrix?type=10&group={n}` · `List → /khkk/list?group={n}` · `Create → /khkk/create?group={n}` · `Pending → …&filter=ChoDuyet` · `Approved → …&filter=DaDuyet` · `Deleted → …&view=deleted`.
+comment khai lệch fe-admin (không có `WorkflowMatrixViewPage`, lead chốt 2026-07-27) + khai `[1-8]` rộng hơn tập seed `[2-8]` là cố ý + khai `group` không transient nên active-state phân biệt được.
### F2 — `fe-admin/src/components/Layout.tsx` (+13 / 0, COMMENT-ONLY)
Ràng buộc ngược đặt ngay trên `isAdminHidden` `:194`. **KHÔNG nới regex** (diff 0 dòng xoá, 0 dòng code — chỉ comment). Nội dung viết theo ĐĨA chứ không theo tiền-đề lead (xem §1.6b).
### F3 — `types/khkk.ts` ×2 app (+25 / +25, SHA-pair)
KHÔNG đẻ `KHKK_GROUP_LABELS` (sẽ thành nguồn thứ 2 — xem §1.6a). Thay bằng 2 export DERIVE trên map sẵn có:
- `khkkGroupMenuLabel(n)` → `` `${n}. ${KHKK_APPROVAL_GROUP_LABELS[n]}` `` , fallback `Nhóm {n}`. Comment khai TO: **không phải nguồn sidebar** (sidebar đọc `/api/menus/me` → `MenuItems.Label`, admin còn override `displayLabel` Mig 27); dùng cho cây K5 / leaf-title / WfView.
- `khkkGroupWorkflowCode(n) => \`KHKK-N${n}\`` (O-2) — khớp regex BE `^KHKK-N([1-8])$` `Features.cs:420`.
0 call-site cũ bị đụng ⇒ 5 chỗ đang dùng `KHKK_APPROVAL_GROUP_LABELS` giữ nguyên hành vi, ô select `N{g} - {label}` không bị lặp số.
## §3 CHỨNG (đo bằng lệnh, kèm control-âm)
**A. Nhãn byte-exact 8/8** — script trích chuỗi từ `DbInitializer.cs` (`Khkk_G1` tuple `:1960` + dict `:2127-2136`) và từ `types/khkk.ts`, so `"{n}. "+short` với BE:
```
OK N1..N8 -> --- byte-exact 8/8 khop, 0 lech
CONTROL(âm giả, thêm 'x' vào N4): OK-phep-do-bat-duoc-lech
```
N2 có "phá dỡ" ✅. Control-âm chứng phép so có RĂNG (không phải happy-path mù).
**B. Regex ăn đủ 42 leaf** — `new Function()` chạy CHÍNH khối text đã ship trong `Layout.tsx` (không chép tay), key sinh từ `KhkkGroupNumbers`/`KhkkLeafActions` đọc thẳng `MenuKeys.cs`:
```
BE nhom=[2,3,4,5,6,7,8] actions=[WfView,List,Create,Pending,Approved,Deleted]
--- 42 leaf, 0 tra null (drop im lang)
CONTROL Khkk_G9_List -> null
CONTROL Khkk_G2_Bogus -> null
CONTROL Khkk_List -> null (đúng: nhóm 1 không-infix đi staticMap, chặn trước regex)
```
**C. SHA-pair types (acceptance-5)**
| file | sha256 |
|---|---|
| baseline trước K4a (cả 2 app) | `eba649cc6fc7eccfeec5262f2e4d58265dbf8caaac4d53c6bc7120fc8065976d` |
| `fe-user/src/types/khkk.ts` | `7a99b865189480933c57a46a9d9aac9be525d14a78e7743f3a82293b706f22b6` |
| `fe-admin/src/types/khkk.ts` | `7a99b865189480933c57a46a9d9aac9be525d14a78e7743f3a82293b706f22b6` |
→ **IDENTICAL**. Layout.tsx 2 app KHÁC NHAU by-design (fe-user +34 có regex · fe-admin +13 comment-only) — không mirror, đúng chủ đích.
**D. Build ×2 PASS, 0 TS error** (`npm run build` = `tsc -b && vite build`, `noUnusedLocals:true` ⇒ build LÀ phép thử TS6133 thật, không tin IDE — gotcha #68)
| app | modules | bundle js | css | time |
|---|---|---|---|---|
| fe-user | 1950 | `index-B2v0kn5F.js` 1,640.21 kB (gzip 414.27) | `index-my6T4K7V.css` 92.62 kB | 20.75s |
| fe-admin | 1961 | `index-84zDBHE-.js` 1,723.20 kB (gzip 428.44) | `index-Ct6-3cYU.css` 86.80 kB | 8.17s |
Warning >500KB + `INEFFECTIVE_DYNAMIC_IMPORT realtime.ts` = PRE-EXISTING cả 2 app.
**E. Rào** — `git status` sau lượt: 4 file của tôi. `MenuKeys.cs` + `DbInitializer.cs` M nhưng là **lane BE land trước** (tôi chỉ Read/Grep, 0 Edit). `KhkkListPage.tsx` · `KhkkCreatePage.tsx` · `KhkkWorkflowPanel.tsx` · `KhkkDetailPage.tsx` **KHÔNG có trong diff**. `KhkkGroupMenuSeedTests.cs` untracked = lane test. **0 commit.**
## §4 FLAG cho lead (3 — cần quyết, KHÔNG tự quyết)
**FLAG-1 (MAJOR, đã tự bẻ — báo để lead soát lại spec):** đề bài yêu cầu export `KHKK_GROUP_LABELS` mới, nhưng đĩa đã có `KHKK_APPROVAL_GROUP_LABELS` (`types/khkk.ts:129`, K2 land, 5 call-site). Đẻ map thứ 2 là **phá đúng acceptance-5 mà nó phục vụ**. K2 còn để sẵn uỷ quyền trong comment `:125-127` ("nếu K4a land nhãn khác thì SỬA Ở ĐÂY (1 const, 2 app)"). Tôi đi đường DERIVE. **Nếu lead vẫn muốn đúng tên `KHKK_GROUP_LABELS`** thì đó là đổi TÊN của const sẵn có (+ sửa 5 import), không phải thêm const — 1 lượt nhỏ, nói là làm.
**FLAG-2 (MAJOR, bàn giao K4b/K5):** `?group=n` **chưa có ai đọc**. `KhkkListPage:61-62` chỉ đọc `filter` + `view`; `KhkkCreatePage` lấy nhóm từ state default, không đọc URL. ⇒ 42 leaf điều hướng đúng + sáng đúng, nhưng trang **hiện toàn bộ nhóm**. Câu hỏi treo cho K4b: **leaf "Danh sách" của NHÓM 1 (`Khkk_List` → `/khkk/list`, KHÔNG có `group=`) nghĩa là "nhóm 1" hay "tất cả"?** Nếu K4b coi vắng-`group` = nhóm 1 thì mất đường xem-tất-cả; nếu coi = tất cả thì leaf nhóm 1 nói dối tên nó. Đây là quyết định UX ⇒ tôi KHÔNG tự chọn, và cố ý KHÔNG sửa 6 dòng staticMap nhóm 1.
**FLAG-3 (MINOR, hệ quả đã biết của vá-15/`:94`):** `isAdminHidden` chỉ ẩn `Ct_*` ⇒ fe-admin ĐANG hiện root KHKK. Sau khi BE seed land, sidebar admin sẽ có **7 nhóm rỗng** (`Khkk_G2..G8` render header nhưng 42 leaf con trả null → thân rỗng), vì `MenuGroup` chỉ xét `children.length > 0` chứ không xét con có resolve được không. Nhóm 1 vẫn đủ 6 mục. Nếu lead thấy 7 nhóm rỗng là nhiễu thì có 2 đường (đều 1 lượt nhỏ): (a) nới regex admin, `WfView` trỏ Designer `AwV2_KhkkN{n}`; (b) thêm `Khkk_G` vào `isAdminHidden`. **Không tự chọn.**
IMPLFE-K4A-END

View File

@ -0,0 +1,26 @@
GATE-K4A: IN-PROGRESS
# Gate K4a — adversarial review wave K4a (49 row menu KHKK 8-nhóm)
- Spawn: S166 2026-08-01, HEAD `7a903cf`, diff CHƯA commit.
- Artifact ghi TỪNG MỤC (anti-#53). Dòng-1 = verdict.
## Mốc đo (neo — sẽ re-đo trước verdict, bài S166 cây-phình)
- HEAD THẬT lúc review = `ce15c64` ("wal: flush 20260801T0914"), KHÔNG phải `7a903cf` như đề bài.
Đã kiểm `git show --stat ce15c64`: chỉ chạm `.claude/**` (WAL + agent-memory + run-folder) ⇒
KHÔNG có code src/fe lọt vào commit đó. Đề bài lệch 1 commit governance = vô hại, ghi để neo.
- `git diff --stat -- src fe-user fe-admin` @T0 = **6 file, +213 / 5**.
- `git status --porcelain -- src fe-user fe-admin tests` @T0 = 6 M + 1 `??`
(`tests/SolutionErp.Infrastructure.Tests/Application/KhkkGroupMenuSeedTests.cs`) — khớp kỳ vọng 7 file.
- Ngoài scope code: 5 file `.claude/**` M (memory/run-folder/session-counter) — KHÔNG tính cây-phình
code, nhưng lead PHẢI `git add` có chọn lọc (đừng `git add -A` kéo `.session-counter.json` vào commit code).
## Mục 7 — thứ tự static initializer (ĐO)
`MenuKeys.cs`: `KhkkGroupNumbers` :72 → `KhkkLeafActions` :73 → `KhkkGroup/KhkkLeaf` :76-77 →
`KhkkGroupMenuKeys` :81-84 → spread `.. KhkkGroupMenuKeys` trong `All` :244. Thứ tự văn bản ĐÚNG.
Nếu ai dời khai báo xuống dưới `All`: spread mảng `null` → NRE trong static ctor →
`TypeInitializationException` ở BẤT KỲ truy cập `MenuKeys.*` ⇒ T1+T2 (và ~mọi test chạm MenuKeys) ĐỎ.
⇒ có răng, tuy răng là "nổ" chứ không phải assert-đẹp. PASS.