wal: flush 20260812T1930

This commit is contained in:
pqhuy1987
2026-08-12 19:30:36 +07:00
parent 7b291014fc
commit c84726e2bd
4 changed files with 132 additions and 7 deletions

View File

@ -26,10 +26,16 @@ chain:
[x] B5 GO_WITH_NOTES — 9 mâu thuẫn (6 CHỐT 0 treo; X-5 comment stale file-2 · KHKK :1763
thiếu nấc-0 null-guard "chép nguyên khuôn cũng là bẫy") · plan 31.9KB sub-b5-plan-final.md
(5 wave block + Đ-1..Đ-10) · spec v2.3 (W5(i) → T-matrix + STATUS 2-ô)
[!] B6 fan-out Opus 5 MAX — TUẦN TỰ: ✅W4 commit 1cc16a2d (4/4 ô máy · 7 dòng · 0 Đ ·
lead-gate PASS — nhánh đúng khối + comment khuôn; 3 ô hành-vi DEFERRED-TO-LOCAL-VERIFY
gộp đo ④ cuối) → 🔄 W1 wf_d3466c9d-0fc (bug menu A+B + slice HD-*, 2 file fe-user)
→ W2 → W3 → W5. Commit per-wave, PUSH GOM CHỜ (CI runner P0). W2/W5 + reviewer-gate.
[!] B6 fan-out Opus 5 MAX — TUẦN TỰ: ✅W4 1cc16a2d (4/4 ô · lead-gate PASS) → ✅W1
09ebd20e (10/10 ô · 2 file · bug A+B fix + slice HD-* 7 mã; lead-gate: tsc EXIT=0 +
2 wire-site :515/:125 — IDE diagnostic never-read = snapshot dở #68, ĐÃ bác bằng đo;
worker tự bắt bẫy tự-trích-dẫn comment + đặt chú CẤM trước dòng set tránh C-7 dương-giả)
→ ✅W2 7b291014 on-behalf (worker #53 chết SAU code TRƯỚC sổ — lead đo trọn ô máy:
C-11 2 vế + X-3 + C-3 4/4 SHA-cặp-mới 4fab77b8/322d19f8 + C-10 0/0 + build×2 EXIT=0 +
eslint 47/42 baseline + tsc 0; diff tự khai delta WorkflowHistoryPanel dời panel-2 +
refactor derived-state né set-state-in-effect) → 🔄 W3 wf_10fe88a1-db6 (pendingMe
đổi-endpoint inbox, 2 file) → W5. PUSH GOM CHỜ. W5 + reviewer-gate.
DEFERRED-TO-LOCAL-VERIFY dồn: W4(i-iii)+W1(i-iii)+W2(ii,iii,v,vi,vii) — đo ④ sau W3.
[!] 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
[ ] chờ anh (10+3 tồn): (76)(77)(78)(79) · (89) · (74) · value_protect · lật ô YC-008↔YC-010

View File

@ -3,14 +3,76 @@
Run: 2026-08-12-S190-soltuon-dieu-chinh-hd · plan SOLTUON-12-08-2026
Ranh: Write/Edit CHỈ {fe-user/src/components/Layout.tsx, fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx, file này}
## BASELINE ĐO TRƯỚC KHI SỬA (BƯỚC 2 — 2026-08-12)
| Phép đo | Lệnh | Baseline | Khớp pin? |
|---|---|---|---|
| eslint app | `cd fe-user; npx eslint .` | **47 problems (41 errors, 6 warnings)**, EXIT=1 | ✅ khớp pin 47 (41E/6W) |
| eslint file-wave | `npx eslint src/components/Layout.tsx` | **4 errors, 0 warning**, EXIT=1 | ✅ khớp pin 4E |
| ruleId baseline Layout.tsx (json) | — | `325:10 react-hooks/static-components` · `416:8 react-hooks/static-components` · `453:8 react-hooks/static-components` · `478:17 react-hooks/set-state-in-effect` | ✅ đúng 4 dòng 325/416/453/478 |
| C-6 baseline | `grep -c "chung 1 bộ" fe-user/src/components/Layout.tsx` | **1** | (phải về 0 sau W1) |
| ô X-5 baseline | `grep -ci "chung 1 bộ" …/WorkflowMatrixViewPage.tsx` | **1** (chữ HOA "CHUNG 1 bộ" ⇒ `grep -c` case-sensitive = 0, `-ci` = 1 — ô X-5 dùng `-ci` nên CÓ RĂNG) | (phải về 0) |
| C-7 baseline | `grep -A6 "TRANSIENT_QUERY_KEYS = " … \| grep -cE "'(ct\|view\|pendingMe)'"` | **0** | (giữ 0) |
| C-8 vế-1 baseline | `grep -cnE "get\(['\"]ct['\"]\)" Layout.tsx` | **0** | (phải ≥1 sau W1) |
| C-8 vế-2 baseline | `grep -rnF 'workflow-matrix?type=3&ct=' fe-user/src \| wc -l` | **1** | canh-thoái-lui (phải CÒN) |
| C-9 baseline | `grep -oE "['\"]HD-(…)['\"]" WfViewPage \| sort -u \| wc -l` | **0** | (phải = 7) |
Tiền-đề đối chiếu ĐĨA (không chép plan): `ContractType.cs:5-11` = 1..7 đúng thứ tự `ContractApprovalWorkflowFamily.cs:33-42`; `Layout.tsx:16-29` có sẵn `TYPE_CODE_TO_INT`/`INT_TO_TYPE_CODE`; accordion `:470-485`; `TRANSIENT_QUERY_KEYS :350`; `WorkflowMatrixViewPage.tsx:84-99` khuôn `group`.
## Việc đã làm (7 mục)
(đang chạy)
- **[1] Layout accordion — ưu tiên `ct` + allowlist pathname EXACT.** `fe-user/src/components/Layout.tsx`: thêm const module-level `CT_TYPE_PARAM_PATHS = ['/my-contracts','/contracts/new','/inbox'] as const` (đặt ngay dưới `INT_TO_TYPE_CODE`, kèm chú vì-sao-KHÔNG-`startsWith`); trong `useEffect` accordion, khối `ct` ĐI TRƯỚC `type` (`rawCt !== null && /^[1-7]$/.test(rawCt)``INT_TO_TYPE_CODE[Number(rawCt)]``setExpandedCtCode``return`); nhánh Pe `startsWith('/purchase-evaluations')` GIỮ NGUYÊN VỊ TRÍ ĐẦU của khối `type`; nhánh Ct đổi `else` trần → `else if ((CT_TYPE_PARAM_PATHS as readonly string[]).includes(location.pathname))`. Cast `as readonly string[]` vì tuple `as const` không nhận `.includes(string)` (TS6).
- **[2] Layout `&view=approved`.** Leaf `Ct_*_Approved`: `/my-contracts?type=${typeInt}&phase=9``…&phase=9&view=approved` + 3 dòng chú khoá-định-danh (khuôn PE `:185`).
- **[3] Layout comment stale lật.** Khối chú trên regex `Ct_<Code>_<Action>` bỏ câu "HĐ chung 1 bộ workflow V2", viết lại: 7 bộ per-loại `HD-*` @S188 + nguồn BE + phân biệt `type=3`=ApplicableType ⟂ `ct`=danh-tính leaf.
- **[4] TRANSIENT_QUERY_KEYS KHÔNG đụng** — set giữ nguyên 6 phần tử `['id','q','editHeader','page','phase','awId']`. Chỉ THÊM chú CẤM-thêm 3 param danh-tính, đặt **TRƯỚC** dòng `const TRANSIENT_QUERY_KEYS = …` (cố ý: ô C-7 quét `-A6` từ dòng đó xuống ⇒ để chú phía sau sẽ tự tạo dương-giả).
- **[5] WfView `INT_TO_HD_CODE` 7-entry.** `fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx`: const cục-bộ `Record<number,string>` chép TỪNG KÝ TỰ từ `ContractApprovalWorkflowFamily.cs:33-42` (đã MỞ file BE đọc; `ContractType.cs:5-11` xác nhận 1..7 khớp thứ tự `Members`), mỗi dòng chú tên enum nguồn. KHÔNG import từ fe-admin.
- **[6] WfView nhánh `ct` gate 3 vế.** `const rawCt = searchParams.get('ct')` + `typeInt === 3 && rawCt !== null && /^[1-7]$/.test(rawCt) ? INT_TO_HD_CODE[Number(rawCt)] : null`; `workflows` = ternary lồng `khkkGroup !== null ? … : hdCode !== null ? filter(wf.code === hdCode) : allWorkflows` (nhánh `group` GIỮ NGUYÊN). `queryKey` KHÔNG đổi (vẫn `['workflow-matrix', typeInt]`) + chú lý do lọc-client-side.
- **[7] WfView comment stale thứ 2 lật (X-5).** Khối `:58-60` bỏ "HĐ dùng CHUNG 1 bộ workflow V2", viết lại 7 bộ per-loại + vì sao 7 leaf vẫn chung `type=3`.
## Ô acceptance (kết quả từng ô)
(đang chạy)
> Mọi ô đo SAU khi 7 việc đã land. **Răng của phép đo = DELTA so baseline đo ở đầu file** (ô nào 0→N hoặc 1→0 thì chính baseline là control: nó chứng lệnh grep bắt được cái nó phải bắt, không phải "im vì câm").
| Ô | Lệnh | Kỳ vọng | ĐO ĐƯỢC | Verdict |
|---|---|---|---|---|
| **C-8 vế-1** | `grep -nE "get\(['\"]ct['\"]\)" fe-user/src/components/Layout.tsx` | ≥1 | **1**`:501 const rawCt = params.get('ct')` (baseline 0) | ✅ PASS |
| **C-8 vế-2** (canh-thoái-lui) | `grep -rnF 'workflow-matrix?type=3&ct=' fe-user/src` | ≥1 (PHẢI CÒN) | **2 hit thô** → xem ghi chú bẫy dưới; hit CODE THẬT = **1** (`Layout.tsx:165`) | ✅ PASS (URL giữ nguyên `?type=3&ct=`) |
| **C-9** | `grep -oE "['\"]HD-(NT-NCC\|NT-DV\|TP\|GK\|NCC\|DV\|MB)['\"]" …/WorkflowMatrixViewPage.tsx \| sort -u \| wc -l` | =7 | **7** (`HD-DV`,`HD-GK`,`HD-MB`,`HD-NCC`,`HD-NT-DV`,`HD-NT-NCC`,`HD-TP`) — baseline 0 | ✅ PASS |
| **C-6 vế-âm** | `grep -c "chung 1 bộ" …/Layout.tsx` | =0 | **0** (baseline 1) | ✅ PASS |
| **C-6 vế-dương** | `grep -cE "7 bộ\|per-loại\|S188" …/Layout.tsx` | ≥1 | **1** | ✅ PASS |
| **ô X-5** | `grep -ci "chung 1 bộ" …/WorkflowMatrixViewPage.tsx` | =0 | **0** (baseline **1** — chữ HOA, chỉ `-ci` mới thấy) | ✅ PASS |
| **C-7** | `grep -A6 "TRANSIENT_QUERY_KEYS = " …/Layout.tsx \| grep -cE "'(ct\|view\|pendingMe)'"` | =0 | **0** — cửa sổ 7 dòng in ra để mắt nhìn: set vẫn đúng `['id','q','editHeader','page','phase','awId']` | ✅ PASS |
| **C-1a** (app) | `cd fe-user; npx eslint .` | ≤47, KHÔNG TĂNG | **47 problems (41 errors, 6 warnings)** — Y HỆT baseline | ✅ PASS |
| **C-1b** (file-wave) | `npx eslint src/components/Layout.tsx -f json` | ≤4E **và 0 ruleId mới** | **4 errors / 0 warning**; ruleId: `react-hooks/static-components` ×3 (`342`,`438`,`475`) + `react-hooks/set-state-in-effect` ×1 (`504`) = **cùng bộ 4 ruleId baseline**, chỉ trôi số dòng do +comment | ✅ PASS |
| **C-2** (build) | `cd fe-user; npm run build` | EXIT 0 | **EXIT=0**, `✓ built in 12.15s` | ✅ PASS |
**Ô máy: 10/10 PASS.**
⚠️ **Bẫy TỰ-TRÍCH-DẪN ở C-8 vế-2 (đúng lớp bài S188).** Lệnh `-rnF` ra **2 hit**, nhưng hit thứ 2 (`Layout.tsx:496`) là **chính comment tôi vừa viết** đang nhắc lại nguyên văn URL đó, không phải code. Discriminator: bỏ dòng bắt đầu bằng `//` ⇒ còn **1 hit code thật** `Layout.tsx:165` `` return `/contracts/workflow-matrix?type=3&ct=${typeInt}` ``. Ô vẫn PASS theo cả 2 cách đếm, nhưng ghi ra đây để lượt sau đừng đọc "2" thành "có 2 chỗ sinh URL".
**Build warning = PRE-EXISTING, không phải sản phẩm của W1:** `chunk > 500 kB` + `[INEFFECTIVE_DYNAMIC_IMPORT] src/lib/realtime.ts` — cả 2 đã có từ trước (đối chứng: nhật ký vai này ghi đúng 2 warning này ở S167).
### Ô hành-vi — DEFERRED (không dựng dev server theo lệnh giao việc)
| Ô | Nội dung | Trạng thái |
|---|---|---|
| ✅W1(i) | mở nhóm 01 → click "Luồng duyệt" → accordion GIỮ nhóm 01; control-âm `ct=5` → mở nhóm 05 | **DEFERRED-TO-LOCAL-VERIFY** |
| ✅W1(ii) | `?type=1&phase=9&view=approved` ⇒ CHỈ leaf "Đã duyệt" sáng | **DEFERRED-TO-LOCAL-VERIFY** |
| ✅W1(iii) | vòng `ct ∈ 1..7`: ≥1 quy trình đúng họ + 0 dòng khác họ + `ct=1` VẮNG `QT-HD-V2-001` + control `ct=99` KHÔNG lọc | **DEFERRED-TO-LOCAL-VERIFY** — 🔴 ô này là ô DUY NHẤT khoá được mapping int→mã (C-9 chỉ đếm 7 mã distinct, mapping sai vẫn xanh). Bù rủi ro bằng đường khác: mapping chép trực tiếp từ `ContractApprovalWorkflowFamily.cs:33-42` đã MỞ ĐĨA, và `ContractType.cs:5-11` được đo để xác nhận 1..7 đúng thứ tự `Members`. Vẫn CẤM tick tới khi chạy thật. |
## DEFERRED/DỪNG
(đang chạy)
**COMMIT: `09ebd20e`** — `[CLAUDE] FE-User: YC-029 W1 — danh-tính menu 7 loại HĐ (accordion ct + view=approved + WfView slice HD-*)`, **ĐÚNG 2 file** (`fe-user/src/components/Layout.tsx` +50/?, `fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx`), 84 insert / 9 delete. `git add` đích danh (Đ-4). **KHÔNG push** (deploy CHỜ). Cây fe-user sạch sau commit.
### Điều kiện dừng Đ-1..Đ-10: **0 điều kiện chạm**
- Đ-1 eslint: app 47→**47** (không tăng), file-wave 4E→**4E**, 0 ruleId mới ⇒ không chạm. KHÔNG dùng `eslint-disable` chỗ nào.
- Đ-4 scope: chỉ 2 file wave. Cây có 5 file khác đang `M` (`.claude/commands/pause.md`, `tiep.md`, `.session-counter.json`, `docs/HANDOFF.md`, `docs/governance/so-yeu-cau-chu-du-an.md`) — **KHÔNG phải của tôi, KHÔNG add, KHÔNG chạm**.
- Đ-5 neo lệch: 0. Mọi neo plan W1 đo lại khớp đĩa trước khi sửa (accordion `:470-485` · comment `:141-142` · Approved `:152` · `TRANSIENT :350` · WfView `:58-60` + khuôn `group` `:84-99`).
- Đ-8 ranh chờ-anh: không chạm Q3/Q4/Q5/W8/W9.
### DEFERRED (không phải bỏ — là nợ có tên)
1. **3 ô hành-vi W1(i)(ii)(iii) = `DEFERRED-TO-LOCAL-VERIFY`** — lệnh giao việc cấm dựng dev server. 🔴 Trong đó **W1(iii) là ô DUY NHẤT có răng với mapping `int → HD-*`**: C-9 chỉ đếm 7 mã distinct, nếu tôi chép lệch cặp (vd `6: 'HD-NT-DV'`, `7: 'HD-NT-NCC'`) thì C-9 VẪN = 7 và build VẪN xanh. Người chạy local-verify phải làm đúng vòng `ct ∈ 1..7` + control `ct=99`.
2. **Gợi ý cho worker W3** (không phải việc của tôi, chỉ khai để khỏi trùng): chú CẤM-thêm ở trên `TRANSIENT_QUERY_KEYS` đã nêu sẵn cả `pendingMe` ⇒ W3 chỉ cần GIỮ, không phải viết lại; và ô C-7 dùng chung 1 lệnh cho cả 3 param.
3. **Ghi nhận (không hành động):** khối chú "lọc client-side" của nhánh `group` nay nằm TRƯỚC khối `ct` mới trong file WfView, đọc hơi so-le. Không sửa vì (a) đúng nghĩa cả 2 nhánh, (b) chạm thêm = drift ngoài 7 việc được giao (Đ-4).

View File

@ -0,0 +1,50 @@
# 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).

View File

@ -0,0 +1,7 @@
# sub-b6-w3-worker — implementer-frontend (W3, YC-029)
## Việc đã làm
## Ô acceptance
## DEFERRED/DỪNG