Files
solution-erp/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-gate-k4a.md
2026-08-01 09:26:34 +07:00

105 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.
## Mục 6 — vá-10/11/13 (comment) — ĐO
- Vá-13 `1893`: `grep -n 1893 DbInitializer.cs` = **0 hit**; `grep -rn 1893 src/` chỉ ra file .dll nhị
phân (nhiễu, không phải mã nguồn). 2 comment đã trỏ `:2162-2179` + mỏ neo `existingItems.TryGetValue`.
Kiểm neo mới: `existingItems.TryGetValue` THẬT ở `:2164`, vòng `foreach` bắt đầu `:2162`, `added++`
kết `:2178`, đóng ngoặc `:2179` ⇒ khoảng trỏ ĐÚNG (chứa trọn nhánh "key đã tồn tại → re-set Order
→ continue" `:2164-2176`). PASS.
- Vá-11 revoker: comment `:2335-2340` khai "filter chỉ bắt prefix Hrm*/Off* + key Personal ⇒ 0 match
Khkk_*" — sẽ verify bằng đọc `RevokeTemporarilyHiddenModulesAsync` (mục dưới).
- Vá-10 lý-do site-2: comment khai `GetMyMenuTreeQuery.cs:96 HasAccess` — sẽ verify.
## Mục 4 — nhãn 8 nhóm vs transcribe (ĐO BẰNG SCRIPT, không mắt)
So khớp CHUỖI THÔ (`==`, không chỉ NFC) giữa `khkkGroupLabels[2..8]` + `("Khkk_G1", …)` trong
`DbInitializer.cs` và bảng `danh-muc-sp002-transcribe.md:22-29`: **8/8 rawEq=True**, gồm cả nhóm dài
nhất N2 `"2. Kết cấu, hạ tầng, phá dỡ & DV hỗ trợ thi công (A2-A3)"` (CÓ vế "phá dỡ") và N8 có em-dash
`—` `"8. HĐ chưa ủy quyền — CEO (5.2)"`. Ngoài ra `tree.Add("Khkk_G1", …)` == `labelBackfill["Khkk_G1"]`
đúng từng ký tự ⇒ DB-trống và DB-đang-chạy hội tụ CÙNG một chuỗi. PASS.
## Mục 1 — routes/params fe-user (ĐO TRÊN ĐĨA)
Khớp:
- `/khkk/workflow-matrix` CÓ route fe-user (`App.tsx:83`), KHÔNG có fe-admin (`:107-110` chỉ
list/create/:id) ⇒ lời khai "fe-admin không có WorkflowMatrixViewPage" ĐÚNG.
- `filter=ChoDuyet` / `filter=DaDuyet`: `FILTER_TO_PHASE` (`KhkkListPage.tsx:40-46`) có ĐÚNG 2 khoá
`ChoDuyet`/`DaDuyet` — khớp hoa/thường từng ký tự (`Record<string,…>` ⇒ case-SENSITIVE, sai chữ là
`?? null` = list không lọc, câm).
- `view=deleted`: `:62 searchParams.get('view') === 'deleted'` — khớp chính xác, đổi endpoint sang
`/contract-signing-plans/deleted`.
- Không leaf nào rơi `if (!path) return null` Ở FE-USER: regex phủ đúng 6 action, mọi nhánh có return.
- Thứ tự query param: `queryMatches` dựng `URLSearchParams` 2 phía rồi so theo KHOÁ ⇒ thứ tự không
ảnh hưởng. OK.
🔴 **FLAG A (MAJOR) — `?group=n` KHÔNG AI ĐỌC.** Phép đo:
`grep -rn "get('group')" fe-user/src fe-admin/src` = **0 hit**; `grep -n group WorkflowMatrixViewPage.tsx`
chỉ ra `<colgroup>` (:195/:200). Hệ quả đo được, không phải suy diễn:
- `/khkk/list?group=5&filter=ChoDuyet` trả **cùng dữ liệu** với `group=2` (query key
`['khkk-list', {phase, search, page, deletedView}]` — không có `group`; `params` gửi BE cũng không có).
- `/khkk/create?group=5` KHÔNG chọn sẵn nhóm 5.
- `/khkk/workflow-matrix?type=10&group=5` bỏ qua `group` hoàn toàn (`:53` chỉ đọc `type`) ⇒ 7 leaf
"Luồng duyệt" của 7 nhóm hiện **y hệt nhau**: toàn bộ workflow type-10.
⇒ Sau K4a, sidebar có 8 nhóm nhưng **nội dung 8 nhóm giống hệt nhau** (trừ nhóm 1 vốn cũng vậy).
Comment `Layout.tsx:196-199` CÓ khai đúng bản chất ("`?group=` là DANH TÍNH điều hướng, không phải bộ
lọc") ⇒ đây là **khai-báo-thật, không phải claim sai**; nhưng nó là trạng-thái người dùng NHÌN THẤY
và chưa thấy dòng nào trong artifact 3 lane nói "K4a giao 8 nhóm rỗng-lọc". Cần lead/owner dispose
tường minh (giống FLAG-3) TRƯỚC khi commit, kèm chỉ đích wave nào nối (K4b? K5?).
🔴 **FLAG B (MAJOR) — 2 mỏ-neo dòng MỚI trong `fe-user/Layout.tsx` SAI, lệch đúng bằng chính khối vừa
chèn.** Cùng lớp lỗi mà diff này vừa VÁ ở BE (vá-13 `1893`), tái phát ở FE trong CÙNG một lượt:
| Comment mới nói | Dòng THẬT (đo `grep -n`) | Lệch |
|---|---|---|
| `TRANSIENT_QUERY_KEYS` (`:311`) — `Layout.tsx:198` | `:345` | +34 |
| `MenuLeaf :342 if (!path) return null``Layout.tsx:189` | `:376` (và `:431`) | +34 |
Khối K4a chèn vào fe-user `Layout.tsx` đúng **+34 dòng** ⇒ tác giả tính mỏ neo trên bản TRƯỚC khi chèn
chính khối của mình. Đây là mỏ-neo **tự-vô-hiệu ngay lúc land**, không phải trôi theo thời gian.
Đối chứng: 6 mỏ neo còn lại trong cùng đợt vá ĐỀU ĐÚNG (`MenuKeys.cs:77` ✔ · `DbInitializer.cs:1960` ✔ ·
`khkkGroupLabels :2127-2136` ✔ · `labelBackfill:2235` ✔ · `GetMyMenuTreeQuery.cs:96` ✔ ·
`ContractSigningPlanFeatures.cs:420` regex `^KHKK-N([1-8])$` ✔ · `KhkkListPage :61/:62` ✔) ⇒ lệch chỉ ở
đúng 2 mỏ neo TRỎ VÀO CHÍNH FILE ĐANG SỬA. Không chặn chạy, nhưng chính vá-13 vừa chứng loại lỗi này
tốn 1 lượt điều tra.
## Mục 6 (tiếp) — vá-8/10/11/15 nội dung có tự-mâu-thuẫn không
- Vá-11 (revoker) **ĐÚNG, đã đo**: `RevokeTemporarilyHiddenModulesAsync` `:2554-2567` lọc
`StartsWith("Hrm") || StartsWith("Off") || MenuKey == Personal``Khkk_G*` **0 match**. Comment khớp.
- Vá-10 (lý-do site-2) **ĐÚNG**: `GetMyMenuTreeQuery.cs:96`
`static bool HasAccess(MenuNodeDto n) => n.CanRead || n.Children.Any(HasAccess);` ⇒ group KHÔNG cần
row của chính nó; đính chính lý-do sai cũ là chính xác.
- Vá-8 (fe-admin `isAdminHidden`) **ĐÚNG**: `:207-209` thân hàm đúng là `return key.startsWith('Ct_')`
⇒ lời khai "hàm này CHỈ ẩn `Ct_*`" khớp đĩa; `KeHoachKyKet` KHÔNG bị ẩn. Và `MenuGroup`
(`fe-admin/Layout.tsx:223-262`) render header + container **vô điều kiện** ⇒ 7 nhóm rỗng THẬT SỰ hiện
trên sidebar admin (khớp FLAG-3 lead đã dispose, không phải suy đoán).
- Vá-15 (2 khuôn key trong `MenuKeys.cs`) **ĐÚNG**: `Ct_*`/`Pe_*` thật sự KHÔNG có trong `All`
(chỉ factory), còn `AwV2_*`/`Khkk_G*` có ⇒ mô tả 2 khuôn không tự mâu thuẫn.