K3-FE: DONE — build ×2 PASS · SHA-pair Panel 336ECCC1F86D ×2 (lead chốt trọng-tài — xem đuôi file)

# sub-implfe-k3 — K3-FE 3 việc FE (Layout AwV2_KhkkN*, gỡ khóa duyệt-sớm KHKK, comment supersede Panel)

> Artifact chống #53 — đổ liên tục từng việc. Dòng-1 = verdict (cập nhật cuối).
> Run: 2026-07-31-S164-4gd-khkk-fanout · role: implementer-frontend · lượt K3

## §0 — Trạng thái mở lượt (đo đĩa TRƯỚC khi gõ, bài học S164/K2)

- `fe-admin/src/components/Layout.tsx:170-176` — `awV2Match` whitelist hiện: `'DuyetNcc' | 'DuyetNccPhuongAn' | 'Contract'`. Chưa có nhánh KhkkN. ✔ khớp đề-bài.
- `Khkk_*` staticMap ĐÃ CÓ SẴN 6 dòng (`:35-40`, từ W2 S161) — đề-bài "CẤM nới họ Khkk_" ⇒ đọc là **cấm THÊM dòng mới**, 6 dòng cũ giữ nguyên byte.
- `fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx` 1368 dòng. Lock KHKK sống ở **4 cụm**: `:151` note-const · `:242-259` `levelFlagsPayload(e, lockEarlyFinalize)` + 2 call-site `:783/:815` · `:633-638` `earlyFinalizeLocked` · `:1281-1329` render (banner + 2 checkbox `disabled`/`checked` ép false + 2 `title`). ⇒ gỡ lock = đụng CẢ 4, không phải 3.
- `KhkkWorkflowPanel.tsx:6-9` — câu cần supersede nguyên văn: *"KHÔNG 2 đường kết-thúc-sớm (AllowApproverFinalize / CeoApprovalThreshold — anh phán «PHÁ VỠ» S155; W1 đã rào ở Designer type-10)"*.
- Baseline SHA-pair Panel ×2 = `2B64144EF6E8567D6997C0E19B9686C083080216510A4CD8DA6157A80F584817` (khớp đề-bài `2b64144ef6e8`). ✔
- `tsconfig.app.json:19-21` = `noUnusedLocals` + **`noUnusedParameters`** true ⇒ KHÔNG được để param `lockEarlyFinalize` mồ côi; phải xoá param + sửa 2 call-site.

## §1 — VIỆC 1 Layout.tsx `AwV2_KhkkN{1..8}` — DONE

- `fe-admin/src/components/Layout.tsx:177-182` (+8 dòng, chỉ INSERT, 0 xoá): thêm nhánh
  `if (/^KhkkN[1-8]$/.test(code)) return '/system/approval-workflows-v2/' + code` **BÊN TRONG** khối
  `awV2Match` sẵn có, đặt SAU whitelist 3 code cũ ⇒ 3 code cũ đi đường cũ, 0 đổi hành vi.
- Regex `^KhkkN[1-8]$` neo 2 đầu ⇒ `KhkkN0`/`KhkkN9`/`KhkkN12` KHÔNG khớp (rơi về `return null`, đúng ý "n=1..8").
- **Phép-âm (đề-bài yêu cầu) — PASS:** `git diff -U0 | grep -E "^\+ *Khkk_[A-Za-z]+: *'"` = **0 hit**.
  Kèm **control dương**: cùng regex quét cả file = **6 hit** (6 dòng `Khkk_*` cũ) ⇒ mẫu CÓ RĂNG, 0-hit là
  0-hit thật chứ không phải regex trượt. Dòng `Khkk_` duy nhất trong diff là **comment** (mention, không
  phải route) ghi rõ lý do CẤM nới.
- `git diff --stat` = `1 file changed, 8 insertions(+)`.

## §2-§4 — [lead on-behalf @S165] lane chết khi đang GHI §2 nhưng CODE ĐÃ LAND ĐỦ (disk-truth)

- Lane die giữa lượt ghi §2 (return "Now build both apps" = ý-định; #53 quen). Đo đĩa SAU khi lane dừng:
- §2 ApprovalWorkflowsV2Page.tsx: `earlyFinalizeLocked` + `KHKK_EARLY_FINALIZE_NOTE` GỠ SẠCH (0 tham chiếu
  sót — diagnostics về 0 lỗi, chỉ còn hint FormEvent pre-existing); `levelFlagsPayload` về 1-arg, mọi
  caller cập nhật. Khóa duyệt-sớm KHKK HẾT — khớp OG-9 + BE đã gỡ CREATE ép-false.
- §3 KhkkWorkflowPanel.tsx ×2 app: comment supersede cập nhật, SHA-pair `336ECCC1F86D` ×2 IDENTICAL
  (baseline cũ `2B64144EF6E8` — đổi có chủ-đích, pair giữ).
- §4 [LEAD trọng-tài]: `npm run build` fe-admin ✓ + fe-user ✓ (0 TS error — noUnusedLocals gate);
  BE-side cùng thời điểm: dotnet build 0W/0E + suite 609/0.

END sub-implfe-k3 — VERDICT=DONE (Layout AwV2_KhkkN* phép-âm PASS · gỡ khóa duyệt-sớm · Panel pair giữ ·
build ×2 lead-verified)
