From 036ad3b603564d54aed96ccbe3a8f0686f59295a Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Wed, 12 Aug 2026 18:24:29 +0700 Subject: [PATCH] wal: flush 20260812T1824 --- .claude/WAL.md | 10 +- .../run.md | 16 ++ .../spec-soltuon-dieu-chinh-hd-12-08-2026.md | 7 +- .../style-gate-v2.md | 117 ++++++++ .../sub-b5-plan-final.md | 20 ++ .../sub-style-review-b4-be2.md | 265 +++++++++++++++++- .../sub-style-review-b4-fe1.md | 158 ++++++++++- .../sub-style-review-b4-fe2.md | 152 +++++++++- 8 files changed, 718 insertions(+), 27 deletions(-) create mode 100644 .claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/style-gate-v2.md create mode 100644 .claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-b5-plan-final.md diff --git a/.claude/WAL.md b/.claude/WAL.md index 405d361..983e356 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -18,9 +18,13 @@ chain: [x] B3 style ×2 fable: FE 25-SF+10-bẫy+13-C (#53, đĩa trọn) · BE 20-SB+7-BS+18-C (sạch). 2 FLAG xử vào spec v2.1: BS-3 policy-khoá-oan → W5(d) đổi owner-check-handler (khớp chốt (82) W8-hoãn) · SF-17 ContractDetailContent identical-chưa-khai-MIRROR → W5(iv) -[!] B4 /fable-clone ×2 style — 4 lane opus (anchor+khuôn ⟂ ô-đo+Goodhart ×2 vai). - wf: wf_6b7f00c2-c26 · artifact sub-style-review-b4-{fe1,fe2,be1,be2}.md -[ ] B5 /fable-real reviewer — tổng hợp cuối → plan wave cụ thể "SOLTUON-12-08-2026" +[x] B4 4-lane: fe1 FIXES-11 (bỏ sót khuôn ContractsListPage + gate typeInt===3) · fe2 + FIXES-12 (eslint baseline ĐỎ 47/42 ⇒ ô delta; 4 false-green fault-injected) · be1 CHẾT + non (be2 phủ anchor 9/9 — khai, không relaunch) · be2 FIXES-15 (style-list tự đánh nhau + spec v2.1 → LẬT; BS-3 số thật 12/13 CanDelete=0; T-matrix 13 ca; ghost-wire + AuditBehavior). → STYLE-GATE-V2 land (style-gate-v2.md, delta-thắng-nền) + spec v2.2. +[!] B5 /fable-real reviewer — tổng hợp cuối → plan wave FINAL. wf: wf_bc763d7d-aca · + artifact sub-b5-plan-final.md (mâu-thuẫn-chéo 3 tầng + plan per-wave + Đ-dừng) [ ] B6 hmw fan-out Opus 5 MAX execute toàn plan (per-wave gate + cicd 2 app + prod verify) [!] TỒN CŨ — CỬA NGOÀI-GIỜ (anh gật giờ): dọn workspace runner + dispatch verify CI · (3B) Gitea cron + compact Vietreport_Master + báo VIETREPORT · đo lại A/059 diff --git a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/run.md b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/run.md index dc5f32f..e6dc1b4 100644 --- a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/run.md +++ b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/run.md @@ -97,3 +97,19 @@ HEAD lúc mở run: ae1dcf4a · HMW-mode ON · lead Opus 5 MAX (default) 2 biến thể grep/rg) · `WF be-style b4-anchor s190` (soi cả SB-3 policy thành thừa sau v2.1?) · `WF be-style b4-odo s190` (T-matrix hợp nhất ca test + đo CanDelete LocalDB). Artifact: sub-style-review-b4-{fe1,fe2,be1,be2}.md. +- **B4 KẾT QUẢ** (101 tool-use · 588K · ~15'): fe1 PASS_WITH_FIXES-11 (2 MAJOR: bỏ sót + khuôn `ContractsListPage.tsx:141,265` [bodyMaxHClass] · SF-21 thiếu vế gate typeInt===3; + 0 anchor chết, 0 luật tự-chế) · fe2 PASS_WITH_FIXES-12 (BLOCKER C-1 eslint baseline ĐỎ + 47/42 → ô DELTA; C-3/C-7/C-13 false-green CHỨNG bằng fault-inject cây tạm; C-9 0-răng + drift 7 token → -oE sort-u) · **be1 CHẾT NON** (skeleton 3-heading — #53 class; be2 phủ + anchor chồng lấn 9/9 SỐNG ⇒ lead chấp nhận không relaunch, KHAI) · be2 PASS_WITH_FIXES-15 + (🔴 R-1 style-list ĐÁNH NHAU spec v2.1 [SB-13/14/18+C10/C13 còn đòi policy] → LẬT · + R-2 BS-3 xác nhận SỐ THẬT: `Contracts` 12/13 role CanDelete=0, Drafter=0, control + KHKK Drafter=1 · R-7 ca "V1-nháp-2" TRÙNG DangSoanThao(2) → thay phase-3 legacy · + R-13 ghost-wire comment `AuditBehavior` — file KHÔNG tồn tại · T-matrix 13 ca + phản-ca). + → **STYLE-GATE-V2** land (`style-gate-v2.md` — delta-thắng-nền + checklist thay-thế + fault-inject-proof + T-matrix) + spec **v2.2** trỏ sang. +- **B5 phóng** `wf_bc763d7d-aca` — /fable-real reviewer tổng hợp cuối: + label `WF reviewer b5-tonghop s190` — rà mâu-thuẫn CHÉO 3 tầng {spec v2.2 ⟂ style-gate-v2 + ⟂ T-matrix} + PLAN FINAL per-wave worker-cầm-làm-được + điều kiện dừng/leo-thang Đ-1.. + Artifact: sub-b5-plan-final.md. diff --git a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/spec-soltuon-dieu-chinh-hd-12-08-2026.md b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/spec-soltuon-dieu-chinh-hd-12-08-2026.md index 656cb3a..f19eaa8 100644 --- a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/spec-soltuon-dieu-chinh-hd-12-08-2026.md +++ b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/spec-soltuon-dieu-chinh-hd-12-08-2026.md @@ -82,9 +82,10 @@ Tổng: **W4/W1/W2/W3 FE-only · W5 BE nhỏ + FE (0 migration)**. DEPLOY CHỜ `Guid?` — khuôn `PeSoftDeleteFeatures.cs:56-58` (BS-6); (e) xác nhận sẵn: `Remove` = SOFT-delete qua `AuditingInterceptor.cs:54-62` (H-6 — wave chỉ assert, đừng đo lại). - **STYLE-GATE cho B6:** worker MỌI wave phải theo 2 spec-list style đã land cùng folder — - `sub-style-fe-b3.md` (SF-1..25 + checklist C-1..C-13) + `sub-style-be-b3.md` (SB-1..20 + 18 ô C) - — lệch luật nào phải kèm trích lời anh cho phép, không có = FLAG khi gate. + **STYLE-GATE cho B6 (🔄 v2.2 sau B4):** nguồn = **`style-gate-v2.md`** (delta THẮNG nền; nền = + `sub-style-{fe,be}-b3.md`). Checklist ô đo CHỈ dùng bảng trong style-gate-v2 (bảng B3 gốc bị B4 + chứng có false-green/dương-giả bằng fault-inject). Ca test W5 = **T-matrix T-1..T-13 + phản-ca + T-14** trong style-gate-v2 §C (thay danh sách ca ở ✅W5(i) cũ — ca "V1 nháp 2" đã bị chứng TRÙNG). FE: nút "Xóa phiếu" ở **thanh nút đáy `ContractDetailContent`** (port khuôn `KhkkDetailContent.tsx:1077-1096` — KHÔNG lấy `KhkkWorkflowPanel` làm khuôn, phần xoá trong đó là CODE CHẾT S175), hiện khi phase ∈ allow-list + user là Drafter/Admin; mirror ×2 app SHA-pair. diff --git a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/style-gate-v2.md b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/style-gate-v2.md new file mode 100644 index 0000000..83a1bc8 --- /dev/null +++ b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/style-gate-v2.md @@ -0,0 +1,117 @@ +# STYLE-GATE v2 — bản HỢP NHẤT sau B4 (lead synthesize, 2026-08-12) + +> **Cách đọc (B1 trỏ-nền + delta):** nền = `sub-style-fe-b3.md` (25 SF + 10 bẫy) + `sub-style-be-b3.md` +> (20 SB + 7 BS) — VẪN LÀ LUẬT, **trừ các delta dưới đây (delta THẮNG nền)**. Checklist ô đo: DÙNG +> BẢNG Ở ĐÂY (bảng trong 2 file B3 đã bị B4 chứng có false-green/dương-giả — giữ làm vết, không chạy). +> Nguồn vá: `sub-style-review-b4-fe1.md` (11 R) · `-fe2.md` (12 R, fault-inject cây tạm) · +> `-be2.md` (15 R + T-matrix + đo LocalDB). Lane be1-anchor chết non (skeleton) — phần anchor BE được +> be2 spot-check chồng lấn **9/9 khuôn SỐNG**, lead chấp nhận không relaunch (khai). + +## A. DELTA luật FE (đè lên SF tương ứng) + +1. **[fe1-R1] +Khuôn bị bỏ sót:** `fe-admin/src/pages/contracts/ContractsListPage.tsx:141` grid + `[340px_1fr_360px]` + `:265` `{!selectedId && }` — đây là khuôn GĐ3-prod ĐỜI TRƯỚC (KhkkListPage + tự khai copy từ nó). **Luật mới SF-26:** W2 đặt cây vào panel host PHẢI quyết `bodyMaxHClass` + tường minh (mặc định của panel đẻ "2 cuộn lồng nhau" — `PipelineTreePanel.tsx:112-115`). +2. **[fe1-R2] SF-21/SF-8 bổ vế GATE:** khuôn thật `WorkflowMatrixViewPage.tsx:85-86` là + `typeInt === 10 && rawGroup !== null && /^[1-8]$/`. Nhánh `ct` mới PHẢI `typeInt === 3 && + rawCt !== null && /^[1-7]$/` — thiếu vế `typeInt === 3` thì `?type=1&ct=5` lọc HD-* trên bộ + non-HĐ = trang trắng. +3. **[fe1-R3] SF-24 literal sửa:** câu khuôn thật là **"hông truyền ⇒ …"** (6 hit) — gate đo theo + NGHĨA: JSDoc opt-in phải có mệnh đề "(kh|h)ông truyền ⇒ giữ nguyên/behavior cũ", regex + `grep -cE "hông truyền"` ≥1 per prop mới. +4. **[fe1-R4] SF-14 sửa tên:** Select của repo = **wrapper `` NATIVE**: `forwardRef>` (`:4,:6`), render `` (`:7-19`). +- `grep -rn "radix-ui/react-select" fe-user/package.json fe-user/src` = **0 hit** ⇒ repo KHÔNG có shadcn/Radix Select. + +Worker "làm cho đúng shadcn" sẽ dựng `SelectTrigger/SelectContent/SelectItem` + thêm dependency = lệch khuôn, và mất luôn idiom đang đo ở `KhkkListPanel.tsx:352-359` (`value={phase ?? ''}` · `aria-label="Lọc trạng thái"` · `onChange={e => … Number(e.target.value) as KhkkPhaseValue}` · ``). +**Sửa:** *"`Select` của repo (`@/components/ui/select` — wrapper ``, KHÔNG Radix)". +5. **SỬA SF-15** (R-5): chép đủ chuỗi header `:157` hoặc chèn `…`. +6. **SỬA SF-10** (R-6): "10/10 … `:243-320`" → "**11/11 … `:243-367`**". +7. **SỬA Bẫy-1** (R-7): `removePlan :231-237` → `:230-240`; thay bằng phép đo bền: *"0 caller `setConfirmDelete(true)`"*. +8. **SỬA Bẫy-9** (R-8): "0 hit" → "0 hit NGOÀI comment tự-khai" (hôm nay grep ra 1). +9. **THÊM ô C-6b** (R-9): `grep -cE "7 bộ|per-loại|S188" fe-user/src/components/Layout.tsx` ≥1. +10. **DÁN NHÃN** (R-10): C-4 và C-8-vế-2 = `[regression-guard, no-delta]`. +11. **SỬA C-1** (R-11): thêm `tseslint.configs.recommended` (`eslint.config.js:14`) vào phần "máy đã phủ". + +**KHÔNG gỡ luật nào.** 25/25 SF đều có khuôn thật đứng sau; không có luật tự chế trái prod, không có luật mâu thuẫn spec v2.1. + +— HẾT (sub-style-review-b4-fe1 · lane-1/2 ANCHOR+KHUÔN · read-only, không sửa code) — diff --git a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-style-review-b4-fe2.md b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-style-review-b4-fe2.md index bd9fc98..f7e2087 100644 --- a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-style-review-b4-fe2.md +++ b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-style-review-b4-fe2.md @@ -1,16 +1,156 @@ # B4 ensemble — front-end-reviewer-style lane-2/2 (lens Ô-ĐO CHẠY-ĐƯỢC + GOODHART) -> Soi lại `sub-style-fe-b3.md` §Checklist C-1..C-13 bằng cách **CHẠY THẬT** từng ô đo trên repo baseline (trước wave sửa). -> Câu hỏi mỗi ô: (a) baseline đo được bao nhiêu? (b) kỳ-vọng-sau-wave có RĂNG không — ca chết nào vẫn xanh? (c) lệnh có chạy được trên bash Windows không? +> Soi lại `sub-style-fe-b3.md` §Checklist C-1..C-13 bằng cách **CHẠY THẬT** trên repo baseline (HEAD `b2f5d6f9`, 0 file `fe-*` dirty — `git status --porcelain` chỉ có `.claude/*` + `docs/*`). +> Mỗi ô: (a) baseline đo được (b) sau-wave có RĂNG không — **ca chết nào vẫn xanh?** (c) chạy được trên bash Windows không. +> Phép chứng răng = **fault-inject cây tạm** (scratchpad `c3lab/`, `lab7/9/13.tsx`), không phải happy-path. ## Verdict -_(điền cuối)_ +**B4-FE-ODO: PASS_WITH_FIXES — 12 findings** (4 BLOCKER phải sửa TRƯỚC khi checklist đóng vai STYLE-GATE cho B6). + +Phần **SPEC-LIST SF-1..25 + anchor**: 5/5 claim nặng em kiểm đều **ĐÚNG** (xem §Kiểm-chứng dưới) — không có ca "khuôn X sẵn" bịa như bài B2. +Phần **checklist C-1..C-13**: 1 ô **bất-khả-thi** (C-1), 3 ô **FALSE-GREEN đã chứng bằng fault-inject** (C-3 / C-7 / C-13), 1 ô **0 răng đúng trục nó sinh ra để canh** (C-9), 3 ô Goodhart-được (C-6 / C-11 / C-12), 1 ô hở phạm-vi (C-10), 1 ô đã-xanh-từ-baseline dễ đọc nhầm thành bằng-chứng (C-8 vế 2), 2 lỗi cơ-học (C-4/C-5 + exit-code). + +## Kiểm-chứng claim của B3 (lens B2 "khuôn có sẵn" — MỞ RA ĐỌC) + +| Claim trong `sub-style-fe-b3.md` | Đo được | Kết | +|---|---|---| +| SF-17 baseline SHA `1b9b5c61…`/`4ffc96be…`/`a2d486c5…`/`cd81508f…` | `sha256sum` fe-user: `1b9b5c611663` · `4ffc96beded5` · `a2d486c5c366` · `cd81508f97cb` | ✅ ĐÚNG 4/4 | +| SF-17 "`ContractDetailContent` identical nhưng **CHƯA tự khai MIRROR**" | 4 dòng header `:1-4` = mô-tả reusable body, **0 chữ MIRROR**; khuôn thật `KhkkDetailContent.tsx:2` = `// File MIRROR SHA256 identical với fe-admin counterpart.` | ✅ ĐÚNG | +| C-12 path `fe-user/src/components/contracts/ContractDetailContent.tsx` | file TỒN TẠI (21 359 B, ×2 app cùng byte); `window.confirm`=0; `s && /^ }$/{print NR; exit}' $F) +hit=$(grep -n "findContractWfByTypeCode(code)" $F | cut -d: -f1) +k=$(grep -n "KhkkN\[1-8\]" $F | cut -d: -f1) +[ -n "$hit" ] && [ "$hit" -gt "$k" ] && [ "$hit" -lt "$close" ] && echo OK || echo FAIL +``` +Baseline: `hit` rỗng ⇒ FAIL (đúng — chưa làm). Mốc verify: `open=176 · KhkkN=188 · close=189 · return null=191`. + +### R-5 🔴 BLOCKER — C-9 **0 RĂNG đúng trục nó sinh ra để canh** (drift 7 token) + 2 đường false-alarm +``` +FAULT-INJECT (lab9*.tsx) +ca A map viết 1 DÒNG (đúng) : grep -c "'HD-" = 1 ⇒ ≠7 ⇒ BÁO ĐỎ OAN +ca B worker dùng "HD-TP" (đúng) : grep -c "'HD-" = 0 ⇒ BÁO ĐỎ OAN +ca C typo 'HD-NTNCC' (SAI) : grep -c "'HD-" = 2… và nếu 7 dòng thì =7 ⇒ XANH DÙ SAI +ô đề xuất (quote-agnostic, sort -u): A=7 ✅ · B=7 ✅ · C=6 ⇒ ĐỎ ✅ +``` +`grep -c` đếm **DÒNG** không đếm **lần**; và giả định nháy-đơn **không có gì cưỡng chế**: repo **không có `.prettierrc`** (`ls` 0 hit) và eslint config **không có rule `quotes`** (chỉ 4 `recommended`) — tỉ lệ nháy đơn chỉ là thói quen (`Layout.tsx` 40:4, `WorkflowMatrixViewPage.tsx` 22:2). +**Sửa:** +```bash +grep -oE "['\"]HD-(NT-NCC|NT-DV|TP|GK|NCC|DV|MB)['\"]" fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx | sort -u | wc -l # = 7 +``` +(alternation để token DÀI trước — đã chạy, bắt đúng typo.) Baseline: `grep -rn "'HD-" fe-user/src` = **0 hit** ⇒ 0 → 7 vẫn là ô tiến-độ tốt, chỉ cần đổi cách đếm. + +### R-6 🟠 C-10 hở phạm-vi — `fe-admin/src/pages` **bỏ sót 2 host thật** đang truyền callback kiểu này +Đo: fe-admin host `PipelineTreePanel` ở **4 chỗ**, trong đó 2 chỗ NGOÀI `pages/` và **đang truyền callback qua `stage2Options`**: +`fe-admin/src/components/khkk/KhkkListPanel.tsx:387` (`stage2Options={{ stage2Content, stage2Count, onOpenKhkk: onSelect, onOpenPe }}`) · `fe-admin/src/components/khkk/KhkkWorkListPanel.tsx:176`. (GĐ3 host thì đúng là ở `pages/`: `ContractsListPage.tsx:265` — nên scope cũ không sai hoàn toàn, chỉ **thủng**.) +**Sửa:** đo cả `fe-admin/src`, trừ đúng 2 file mirror có quyền chứa token: +```bash +grep -rn "onOpenContract" fe-admin/src | grep -vE "hooks/usePipelineStages\.ts|components/pipeline/PipelineTreePanel\.tsx" | wc -l # = 0 +``` +Baseline: 0 (toàn `fe-admin/src` cũng 0). Ô này còn CHẶT hơn: sau W2 nó chứng "định-nghĩa CÓ ở mirror, site truyền KHÔNG có ở fe-admin" = đúng control-âm W2-v. + +### R-7 🟠 C-6 Goodhart — **xoá sạch** câu stale cũng cho 0 +Baseline: `grep -c "chung 1 bộ" fe-user/src/components/Layout.tsx` = **1** (`:142` `// đều ?type=3 (HĐ chung 1 bộ workflow V2) — thêm &ct=N để active-state riêng từng leaf.`); toàn `fe-user/src`+`fe-admin/src` chỉ 1 hit ⇒ ô có răng, chạy được, `grep`/`rg` cho cùng kết quả (diacritic UTF-8 OK trên Git Bash). +Nhưng SF-2 đòi **LẬT** comment, mà `=0` thoả luôn khi worker **xoá cả dòng** ⇒ mất WHY của `&ct=N`, đẻ vùng câm mới. +**Sửa:** thêm ô sinh-đôi dương: `grep -cE "7 bộ|per-loại|S188" fe-user/src/components/Layout.tsx` **≥1** (baseline: cần đo lại sau wave; hiện khối `:141-142` không có chữ nào trong 3 chữ đó). + +### R-8 🟠 THIẾU ô cho acceptance W5-iv (dòng tự-khai MIRROR) — C-3 **không thể** bắt +SHA-pair vẫn khớp khi **cả 2 bên đều thiếu** header tự-khai ⇒ spec ③ W5-iv + SF-17 yêu-cầu "thêm dòng tự-khai MIRROR cùng bytes" mà checklist **không có ô nào đo**. +**Thêm:** `grep -c "File MIRROR SHA256 identical" fe-admin/src/components/contracts/ContractDetailContent.tsx fe-user/src/components/contracts/ContractDetailContent.tsx` ⇒ **1 mỗi bên** (baseline **0/0** — đã đo). + +### R-9 🟠 C-11 Goodhart — đổi con số 320→400 **không chứng minh HOÁN ĐỔI** +Baseline: `MyContractsPage.tsx:153` = `lg:grid-cols-[320px_1fr_360px]`; `grep -F "grid-cols-[400px"` = 0 hit ⇒ ô có răng cho *bề rộng*, nhưng W2 là **đổi chỗ 2 khung**: sửa mỗi token vẫn xanh. +**Thêm ô đồng-hành (đã đo baseline = 1):** `grep -c "{!selectedId && `" mà **không nêu lấy từ đâu**. Theo bài S179 của chính vai này: `git diff` **mù file untracked** ⇒ file MỚI (nếu wave đẻ) thoát ô comment-header. Nguồn đúng: +```bash +{ git diff --name-only origin/main...HEAD; git diff --name-only HEAD; git ls-files -o --exclude-standard; } \ + | sort -u | grep -E '^fe-(admin|user)/src/' +``` +(baseline cửa-sổ này = 0 file `fe-*` ⇒ mọi hit sau wave đều là của wave.) + +### R-12 🟡 C-2 build — nửa `tsc` XANH baseline; nửa `vite build` CHƯA đo +`npm run build` = `tsc -b && vite build`. Đo được: `npx tsc -b` (fe-user) **exit 0, 0 dòng lỗi** ⇒ tầng type baseline SẠCH — nên C-2 **không** dính bệnh R-1 (khác hẳn eslint). Chưa đo: `vite build` (bundle) và `tsc -b` của `fe-admin` ⇒ 2 ô này để **CHƯA ĐO**, cấm đọc thành xanh. +Hệ quả cho gate: C-2 là ô **có răng thật** (baseline sạch ⇒ đỏ sau wave = do wave) — ngược với C-1. Ghi rõ cặp này trong checklist để worker không gộp "máy" thành một cục. + +## Ô đo phải sửa (bảng gọn cho B6) + +| Ô | Baseline ĐO ĐƯỢC | Bệnh | Ô thay thế (đã chạy thử) | +|---|---|---|---| +| C-1 | fe-user 47 (41E/6W) · fe-admin 42 (37E/5W) · 6 file wave = 4E toàn `Layout.tsx` {325,416,453,478} | PASS bất-khả-thi | delta: app không tăng · file-wave ≤4E, 0 ruleId mới; dùng `${PIPESTATUS[0]}` | +| C-3 | 4/4 OK | mất-2-bên ⇒ in OK | thêm `[ -f A ] && [ -f U ] \|\| echo MISSING` | +| C-6 | `chung 1 bộ` = 1 (`Layout.tsx:142`) | xoá-trắng cũng =0 | + ô dương `grep -cE "7 bộ\|per-loại\|S188"` ≥1 | +| C-7 | Set 1 dòng `:350`, 0 key danh-tính | reformat ⇒ xanh giả | `grep -A6 … \| grep -cE "'(ct\|view\|pendingMe)'"` = 0 | +| C-8 | vế1 = 0 · **vế2 = 1 (đã xanh)** | vế2 là canh-thoái-lui; vế1 brittle nháy | label rõ + `grep -nE "get\(['\"]ct['\"]\)"` | +| C-9 | 0 hit `'HD-` trong `fe-user/src` | đếm DÒNG · giả định nháy · typo vẫn xanh | `grep -oE "['\"]HD-(NT-NCC\|NT-DV\|TP\|GK\|NCC\|DV\|MB)['\"]" \| sort -u \| wc -l` = 7 | +| C-10 | 0 (cả `fe-admin/src`) | scope `pages/` bỏ sót 2 host `components/khkk/` | quét `fe-admin/src` trừ 2 file mirror ⇒ 0 | +| C-11 | `grid-cols-[320px_1fr_360px]` `:153`; 400px = 0 | đổi số ≠ hoán đổi | + `{!selectedId &&