# run: 2026-08-05-S174-khkk-style-audit

**Lệnh:** `/fable-clone frontend-designer` — ENGINE-ĐẮT LỆNH-B, ensemble tier-2, per-invocation (H21).
**Owner chốt vai:** "frontend-designer đồng ý" · **Owner chốt phạm vi:** "cho nó quét lại hết luôn, design lại".
**Đề bài:** quét TOÀN BỘ style/UX module KHKK (GĐ2) đối chiếu Duyệt NCC (GĐ1 — golive, owner coi là CHUẨN);
mỗi lệch phải có `file:line` CẢ HAI phía; đầu ra = spec thi-hành-được cho Opus 5 MAX.

## Bối cảnh bắt buộc

- 2 app **mirror SHA256 identical**: `fe-admin` ⟂ `fe-user`. Mọi sửa land CẢ HAI, bằng nhau từng byte.
- `.card-accent` (`fe-*/src/index.css:112`) khai NGOÀI `@layer` ⇒ **THẮNG utility Tailwind v4** (gotcha #66).
  CẤM đề xuất tắt bằng `border-0`/`shadow-none` — phải GỠ CLASS theo điều kiện. **Đã cắn thật trong phiên này.**
- `PipelineTreePanel` có **6 host còn lại** sau khi gỡ khỏi Inbox (PE-list · GĐ3 ×2 · GĐ4 ×2 · KHKK-list).
  Sửa 1 màn làm hỏng 6 màn = lỗi nặng nhất phiên này ⇒ mọi đề xuất phải nói RÕ host nào đổi / host nào giữ.
- Gate quyền KHKK = policy `KeHoachKyKet.Read`, **KHÔNG OR key menu `Khkk_*`** (gotcha #85).
- Palette accent Tailwind v4 thiếu stop `-300` cho teal/violet/amberx/greenx (gotcha #67).

## Owner-items phải phủ hết trong spec

| # | Việc | Trạng thái |
|---|---|---|
| O1 | `KhkkWorkflowPanel` style ≠ `PeWorkflowPanel` (banner · icon tròn · chip NS PRO/CCM · HÀNH ĐỘNG · file đính kèm · lịch sử duyệt) | ✅ **LAND `43e1bd7`** (đợt B — bê style PE sang KHKK) |
| O2 | Badge **"SẮP"** trên cây → **đổi thành 0** ("bỏ hết đi đổi thành 0") | ✅ **LAND `a1b9cbb`** — gỡ `SoonChip` 3 ca 3 cách (đếm-được→số · khoá-quyền→trắng · failed→`—`); deploy verify 2-vế @S175 |
| O3 | Hạng mục cho chọn **NHIỀU** + **SUM tổng**; tổng giá duyệt ghi **PHÍA TRÊN** — ✅ **N-ROW 0-MIGRATION** (`ContractSigningPlanLineConfiguration.cs:37-38` unique **3 cột**, máy rộng sẵn từ Mig 71) | ✅ **LAND cả 2 vế** — vế (2) `a0ccac3` · vế (1) N-hạng-mục+giá+ghi-chú `b811e11` |
| O4 | Shopdrawing / căn cứ hồ sơ cho **đính kèm file** | ✅ **LAND `a0ccac3`** (đợt D) |
| O5 | Menu Đang duyệt / Đã duyệt / Đã xóa "lọc đúng trạng thái" — lead đã truy 5/5 mắt xích, **chuỗi lọc ĐÚNG**; nghi vấn thật = `KhkkListPanel:202 flatMode` đổi CÂY→PHẲNG khi có filter | cần phán |
| O6 | **Bấm card PE trong cây ở màn KHKK phải GIỮ NGUYÊN màn KHKK** (view tại chỗ), không văng sang phiếu gốc — "tương tự với duyệt NCC" | ✅ **LAND `a0ccac3`** (đợt D — `onOpenPe` nạp thẳng vào form, ở lại màn) |
| O7 | **Nút EDIT trên card KHKK** ở tầng dưới panel Thao tác — mirror `PeListPanel` `onEditClick` (bút chì hiện khi hover, bấm = mở thẳng chế-độ sửa) | ✅ **LAND `a0ccac3`** (đợt D) |
| O8 | **Tầng TRÊN panel Thao tác cho ra CÂY THƯ MỤC Dự án › Hạng mục** — "cho cây thư mục dự án hạng mục ra luôn nhé". Hiện mới gom-theo-dự-án 1 cấp (`KhkkWorkListPanel` `byProject`), owner muốn cây 2 cấp như cây toàn trình | ✅ **LAND `a0ccac3`** (đợt D) — sau đó `0db1b99` thay bằng **dùng LẠI `PipelineTreePanel`** (Năm›Dự án›Hạng mục›4GĐ, `+56/−300` dòng) |

> 🔴 **O7/O8 đến SAU khi 5 lane đã phóng** (`wf_016b1bed-b85`) ⇒ lane KHÔNG thấy 2 mục này.
> Lead PHẢI tự phủ chúng ở bước synthesis; đừng đọc "lane không nhắc" thành "không có việc".

## Đã land trong phiên (đừng đề xuất lại)

`14a917f` · `3f339c0` · `f86f30d` · `d0453ba` — gỡ 2 tiêu-đề chồng · bỏ ô "Tất cả nhóm" · `hideHeader` cho cây ·
gỡ khối Quy-trình-duyệt khỏi trang chi tiết · gỡ Section 5 · dựng `/khkk/create` thành host 2-panel ·
gán cứng nhóm+quy trình theo leaf menu · tầng dưới chỉ {Nháp,Trả lại,Từ chối} · gỡ vỏ card của cây KHKK ·
gỡ cây khỏi Hộp thư. Prod hiện tại: admin `index-BXwdUVmD.js` · eoffice `index-DdcCH2oZ.js`.

## taskList snapshot

5 lane, cùng vai `frontend-designer`, `tier:'opus'`, **≤3 file/lane** (luật C2), **ép ghi khung rỗng lượt 1-2**.

| lane | lăng-kính | file được giao (≤3) |
|---|---|---|
| L1 | panel DUYỆT | `components/pe/PeWorkflowPanel.tsx` · `components/khkk/KhkkWorkflowPanel.tsx` |
| L2 | panel DANH SÁCH | `components/pe/PeListPanel.tsx` · `components/khkk/KhkkListPanel.tsx` · `components/khkk/KhkkWorkListPanel.tsx` |
| L3 | HOST / bố cục | `pages/pe/PurchaseEvaluationWorkspacePage.tsx` · `pages/khkk/KhkkCreatePage.tsx` · `pages/khkk/KhkkListPage.tsx` |
| L4 | CÂY toàn trình | `components/pipeline/PipelineTreePanel.tsx` · `components/pipeline/PipelineStageFolders.tsx` · `hooks/usePipelineStages.ts` |
| L5 | NỘI DUNG phiếu | `components/pe/PeDetailTabs.tsx` · `components/khkk/KhkkDetailContent.tsx` |

## Stages

- [x] L1..L5 chạy song song (hmw parallel) — `wf_016b1bed-b85`, 5/5 xong · 0 chết · 0 rỗng · 755K tok · 147 tool-use · ~17′
- [x] lead refute + synthesize (P3/P4) — tự verify 2 claim nặng nhất, cả 2 lane ĐÚNG (dưới)
- [x] lead ghi `spec-khkk-style-dong-bo-05-08-2026.md` — 3 heading đủ

## Synthesis

**VERDICT từng lane** (dòng-1 lấy từ END-line của chính sub-file):

| lane | verdict |
|---|---|
| L1 panel-duyệt | 15 lệch có-thể-sửa (13 bê-thẳng + 1 bán-bê kèm vá lỗi 401 + 1 chờ-owner) · 1 KHÔNG-BÊ vì thiếu khái niệm (NS PRO/CCM) · H2+H4 đã khớp · **lệch nặng nhất = vỏ `card-accent`, owner KHÔNG nêu** |
| L2 panel-list | **CHƯA-PASS** — 13 delta + 3 trục rubric đỏ · O5 = **GIỮ-MÁY-R11-SỬA-HÌNH** (bỏ `term` khỏi `flatMode` + gộp 2 ô tìm + công-tắc Cây/Danh-sách + chip lọc) |
| L3 host | **KHỚP-MỘT-PHẦN** — 4 trục khớp · **2 lệch nặng: grid 300→260 · `<lg` ngõ cụt không tạo được phiếu** · 3 lệch vừa · 3 mục CHỐT-KHÔNG-SỬA |
| L4 cây | **SHIP-SPEC-READY** — O2: **không GĐ nào còn đúng nghĩa "sắp"**, `SoonChip` không export, 0 host phụ thuộc · O6: đường điều hướng = `usePipelineStages.ts:219` |
| L5 nội-dung | **AUDIT-DONE** — O3 = **N-ROW 0-migration** (máy rộng sẵn từ Mig 71) · O4 = **FE-ONLY 0-BE** (rail `dossierItemId` đủ 6 tầng từ Mig 69) · 6 P0 + 8 P1 + 3 P2 |

**LEAD REFUTE — 2 claim nặng nhất tự đo lại, lane ĐÚNG cả hai:**
- `ContractSigningPlanLineConfiguration.cs:37-38` unique index **3 CỘT** `(PlanId, SupplierId, CatalogEntryId)` ⇒ O3 **0-migration**. Lead từng báo owner "nặng nhất, cần migration" — **SAI, đã đính chính**.
- KHKK `:501` `<a href>` trần ⟂ PE `:331` `responseType:'blob'` ⇒ **401 xác nhận**, không phải lệch style.

**ĐÃ LAND ngay trong phiên (đợt A + 2 câu owner chốt)** — commit `a1b9cbb`: vá 401 · vá `<lg` ngõ cụt · trả nút duyệt mobile · gỡ `SoonChip` (3 ca 3 cách) · gỡ nút Từ chối · grid 260/320.

✅ **HẾT NỢ đợt B + đợt D — flush @S176** (`/tiep` ground-truth reconcile, cờ 3 `ctx-verifier`): đợt B = `43e1bd7` · đợt D (O6·O4·O7·O8) = `a0ccac3` · O3 vế-1 = `b811e11`. Bản cũ ghi "CÒN NỢ" **sống sót 4 cửa pause** trong khi hàng đã lên prod; sổ dẫn-xuất này lệch canonical (`git log` + WAL) chứ không phải việc chưa làm.
🔴 **CÒN LẠI ĐÚNG 1: O5 "cần phán"** (`KhkkListPanel:202 flatMode` đổi CÂY→PHẲNG khi có filter) — chưa ai định đoạt, và **0 hit** ở WAL/`_mind`/`next:` ⇒ đang mồ-côi, xem cờ 6.
🔴 **KHÔNG lane nào có screenshot** — dev-rig chặn (chỉ `:8080` LISTENING, API `:5443` không có, trang sau `ProtectedRoute`, gotcha #3) ⇒ mọi kết luận là **đọc mã, không phải đã nhìn**; người land BẮT BUỘC soi 375/1366/1440 trên prod.
🧪 **Luật C2 có răng:** run trước cùng khuôn 3/5 lane chết cháy-lượt; run này **0/5**. Cùng model, cùng harness, khác **thứ tự ghi**.
