105 lines
7.6 KiB
Markdown
105 lines
7.6 KiB
Markdown
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.
|
||
|
||
|
||
|
||
|