# sub-b6-w2-worker — implementer-frontend (WAVE W2, YC-029)

## BƯỚC 2 — BASELINE (đo TRƯỚC khi sửa, 2026-08-12)

| Đo | Lệnh | Số |
|---|---|---|
| eslint fe-user | `npx eslint .` | **47** problems (41E/6W) — khớp mốc plan |
| eslint fe-admin | `npx eslint .` | **42** problems (37E/5W) — khớp mốc plan |
| SHA `usePipelineStages.ts` | `sha256sum` ×2 app | `1b9b5c611663666d3c8853a88b020d57b712c3cfd9bb524790bcd0359152ff48` — **KHỚP CẶP** |
| SHA `PipelineTreePanel.tsx` | `sha256sum` ×2 app | `4ffc96beded5788a7463efa0e7df405c217a5d60ef7f5ca1ce83f323c4c6c334` — **KHỚP CẶP** |
| C-11 vế-2 baseline | `grep -c '{!selectedId && <PipelineTreePanel' MyContractsPage.tsx` | **1** (kỳ vọng plan = 1 ✔) |

Baseline khớp trọn plan §W2 + §D ⇒ KHÔNG chạm Đ-5 (spec lệch đĩa) · KHÔNG chạm Đ-9.

Phụ: literal JSDoc đo lại — `grep -cE "hông truyền" usePipelineStages.ts` = **4** (4 hit đều là
`không truyền` chữ **k thường**) ⇒ prop mới PHẢI viết `không truyền ⇒ giữ nguyên …` (viết
`KHÔNG truyền` in hoa là **0 hit** vì grep case-sensitive — bẫy thật, suýt vấp).

## Việc đã làm (6 mục)

_(worker chết #53 SAU khi code xong 5 file, TRƯỚC khi ghi sổ — phần dưới do LEAD điền on-behalf
từ diff dirty + đo độc lập @S190, đúng khuôn recover WRITE-lane→disk-truth)_

1-2. hook + panel (cặp mirror): 2 opt-in FLAT `onOpenContract`/`stage3TypeFilter` + JSDoc
   "không truyền ⇒ giữ nguyên" (grep "hông truyền" = 7 ≥6) + ternary khuôn + vế filter thà-thừa.
3. Host panel-1 TRÁI: Select loại (native wrapper, option đầu "Tất cả loại HĐ") + cây
   `currentStage={3} hideHeader hideSearch bodyMaxHClass="lg:max-h-none"`. Sync Select bằng
   DẪN XUẤT đóng-dấu `forType` thay useEffect — bản đầu ăn lỗi eslint `set-state-in-effect`
   (47→48), refactor về derived ⇒ 47 (diagnostic IDE `setTreeType` = snapshot giữa refactor).
4. Panel-3 PHẢI = danh-sách nguyên chức năng + search ĐỔI client→server (`?search=`, queryKey
   +trục, gỡ vế client theo SF-25, diện tìm rộng hơn: +tên dự án).
5. Panel-2 giữa giữ detail + `WorkflowHistoryPanel` DỜI XUỐNG dưới detail (delta plan-không-nêu,
   khai trong comment header — không bỏ khối nào, đúng Q1).
6. Copy-byte 2 file cặp sang fe-admin.

## Ô acceptance (LEAD đo độc lập @S190 sau khi worker chết)

- C-11: `grid-cols-[400px` = 1 ✅ · `{!selectedId && <PipelineTreePanel` = 0 ✅ (baseline 1)
- X-3: `bodyMaxHClass` = 1 ✅
- C-3: 4/4 cặp OK — 2 cặp W2 SHA MỚI khớp-cặp (`4fab77b84a1c` · `322d19f85d78`), 2 cặp kia
  giữ nguyên (`a2d486c5c366` · `cd81508f97cb`) ✅
- C-10: onOpenContract=0 · stage3TypeFilter=0 ngoài 2 file mirror fe-admin ✅
- Select native: 0 hit radix ✅
- Build: fe-user EXIT=0 · fe-admin EXIT=0 ✅ · tsc -b fe-user EXIT=0 ✅
- eslint: fe-user 47 (41E/6W) = baseline · fe-admin 42 (37E/5W) = baseline — KHÔNG TĂNG ✅

## DEFERRED/DỪNG

- Ô hành-vi W2 (ii)(iii)(v)(vi)(vii) = DEFERRED-TO-LOCAL-VERIFY (đo ④ gộp sau W3).
- Đ-kích-hoạt: 0. Commit do LEAD thực hiện on-behalf (worker chết trước bước commit).
