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

7.6 KiB
Raw Blame History

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 nullLayout.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 == PersonalKhkk_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.