wal: flush 20260812T1712

This commit is contained in:
pqhuy1987
2026-08-12 17:12:17 +07:00
parent c0b40e1823
commit a4f81d9913
3 changed files with 49 additions and 5 deletions

View File

@ -9,9 +9,9 @@ chain:
[x] /tiep S190 trọn (sàn-3 ⑤ cân sổ · verify site+marker+A/059 Phase=10 · tick 64 · se=0/all=0 [x] /tiep S190 trọn (sàn-3 ⑤ cân sổ · verify site+marker+A/059 Phase=10 · tick 64 · se=0/all=0
· ctx-verifier 13 cờ → vá run.md S189 + di-trú 2 carry vào HANDOFF + WAL số mục) · ctx-verifier 13 cờ → vá run.md S189 + di-trú 2 carry vào HANDOFF + WAL số mục)
[!] B1 /fable-real investigator-codebase — invest 5 điều chỉnh + đối chiếu khuôn KHKK/NCC [!] B1 /fable-real investigator-codebase — invest 5 điều chỉnh + đối chiếu khuôn KHKK/NCC
→ propose wave+checklist. Lượt-1 wf_c8b1d8ba-4b0 #53-partial (Thứ-1+Thứ-3 XONG trên → propose wave+checklist. #53 ×2 (return rỗng) nhưng artifact cứu: lượt-1 Thứ-1+Thứ-3
đĩa — root-cause bug menu A+B đủ file:line). wf: B1b wf_9094b868-9ea relaunch-cắt-gọt (root-cause A+B) · B1b Thứ-2+Thứ-4 (máy per-loại OK, lẫn = 3 lỗ UI; thiếu nút Xóa màn
làm nốt Thứ-2/4/5+Đọc-ý+PROPOSE · artifact sub-invest-b1-fable.md (append cùng file) duyệt). wf: B1c wf_09951efa-970 chốt Thứ-5+Đọc-ý+PROPOSE · sub-invest-b1-fable.md
[ ] B2 /fable-clone reviewer — review spec/wave B1 (≥3 lane opus, đóng-gói C2) [ ] B2 /fable-clone reviewer — review spec/wave B1 (≥3 lane opus, đóng-gói C2)
[ ] B3 /fable-real ×2 style: front-end-reviewer-style + back-end-reviewer-style → spec-list [ ] B3 /fable-real ×2 style: front-end-reviewer-style + back-end-reviewer-style → spec-list
style đồng nhất khuôn KHKK/DuyetNCC style đồng nhất khuôn KHKK/DuyetNCC

View File

@ -39,3 +39,14 @@ HEAD lúc mở run: ae1dcf4a · HMW-mode ON · lead Opus 5 MAX (default)
`view=approved`, `Ct_*` không bắt chước). Thứ-2/4/5 + Đọc-ý + PROPOSE = pending. `view=approved`, `Ct_*` không bắt chước). Thứ-2/4/5 + Đọc-ý + PROPOSE = pending.
- **B1b relaunch-cắt-gọt** (tiep.md §4 tinh thần): lane fable MỚI làm nốt 5 phần pending, - **B1b relaunch-cắt-gọt** (tiep.md §4 tinh thần): lane fable MỚI làm nốt 5 phần pending,
append CÙNG file `sub-invest-b1-fable.md`; phần đã xong = ground-truth CẤM làm lại. append CÙNG file `sub-invest-b1-fable.md`; phần đã xong = ground-truth CẤM làm lại.
- **B1b kết quả** `wf_9094b868-9ea` (34 tool-use · 167K tok · ~9'): return RỖNG (#53 lần 2 —
cùng vân tay "completed without StructuredOutput") nhưng artifact +2 mục DÀY: **Thứ-2**
(máy ĐÃ per-loại: 7 mã HD-* + 4 cửa guard + PA-A; "lẫn" = 3 lỗ UI [WfView không đọc `ct`
· bug A+B · comment stale Layout.tsx:141-142]; van-xả mã ngoài họ HD- = CỐ Ý, muốn tuyệt
đối thì thay QT-HD-V2-001 bằng 7 bản HD-* = việc DATA/Designer 0-code) + **Thứ-4** (6 leaf
seed GIỐNG HỆT; lệch hành-vi: Luồng-duyệt 🔴 + Danh-sách 🔴 + Đang-duyệt ⚠️ pendingMe +
Đã-duyệt 🔴 + Đã-xóa ✅; màn duyệt THIẾU nút Xóa [cột AllowApproverDelete sẵn — delta BE
nhỏ 0-mig] + 3 món cố-ý-không-port khai rõ). Còn pending: Thứ-5 + Đọc-ý + PROPOSE.
- **B1c chặng chót** `wf_09951efa-970`: 3 mục cuối (Thứ-5 admin Designer · Đọc-ý · PROPOSE
spec/wave/checklist — gợi ý W1 bug-menu → W2 cây-trái → W3 slice-WfView → W4 admin-7-leaf
→ W5 nút-Xóa-BE-nhỏ, lane được quyền chỉnh).

View File

@ -28,7 +28,25 @@
## Thứ-2 per-loại-HĐ ## Thứ-2 per-loại-HĐ
(pending) **VERDICT: máy ĐÃ per-loại (S188), dữ-liệu KHÔNG lẫn; cái "lẫn" anh thấy = 3 lỗ UI (WfView không slice + 2 bug menu Thứ-3) + 1 comment stale tự khai "chung 1 bộ".**
**Dòng chảy route `?type=N` (N = ContractType 1..7):**
1. Menu → `Layout.tsx:148` `Ct_<Code>_List → /my-contracts?type=N` (`TYPE_CODE_TO_INT`).
2. `MyContractsPage.tsx:34-36` parse chặn NaN (khuôn HardCopiesPage GĐ4) → `:47-62` gửi `type` LÊN SERVER cả 2 nhánh (`/contracts` + `/contracts/deleted`) — W7 S187 đã gỡ lọc client (`:74-76` tự khai lý do: >100 HĐ thì loại hiếm biến mất im lặng).
3. BE lọc TRƯỚC paging: `ListContractsQuery` filter `ContractFeatures.cs:356`, `ListDeletedContractsQuery` `:479` (số dòng `:325` trong comment FE đã trượt — khái niệm còn đúng).
4. Riêng "Đang duyệt": `/inbox?type=N` → BE `GET /contracts/inbox` **KHÔNG nhận type** (`ContractsController.cs:41-43`, `GetMyInboxQuery()` 0 arg) → FE lọc client `InboxPage.tsx:64,103`. Chạy đúng (payload inbox nhỏ) nhưng là nhánh DUY NHẤT còn lọc client — lệch khuôn W7, chấp nhận được, KHÔNG phải bug dữ-liệu.
**Workflow per-loại — máy ĐÃ khoá (đối chiếu ảnh-2 "mỗi 1 HĐ 1 quy trình khác nhau"):**
- Nhà 7 mã: `ContractApprovalWorkflowFamily.cs:33-42``HD-TP/GK/NCC/DV/MB/NT-NCC/NT-DV` map 1-1 ContractType 1..7.
- 4 cửa guard (`ContractWorkflowGuards.cs`): Create `ContractFeatures.cs:87` · sửa-nháp re-pin `:198` · cầu K7 `CreateContractFromSigningPlanFeatures.cs:166` · cửa TRÌNH `ContractWorkflowService.cs:143`. Pin chéo loại trong họ `HD-*` ⇒ 409 (`EnsureFamilyLock :137-160`).
- Máy TỰ PIN đúng loại khi user không chọn: PA-A `ResolveDefaultWorkflowAsync` (`ContractWorkflowGuards.cs:88-102`, gọi ở `ContractFeatures.cs:90`).
- V1 legacy fallback cũng per-loại sẵn: `ContractFeatures.cs:70` `.Where(w => w.ContractType == request.Type && w.IsActive)`.
- Van xả CÓ CHỦ ĐÍCH: mã NGOÀI họ `HD-` (vd `QT-HD-V2-001` đặt tay — bản duy nhất trên Dev đo 2026-08-10) cho qua mọi loại (`ContractWorkflowGuards.cs:141-143`) — đây KHÔNG phải lỗ, là quyền admin tự tạo quy trình; nhưng nếu anh muốn "TUYỆT ĐỐI mỗi loại 1 quy trình" thì phải gỡ ghim/thay QT-HD-V2-001 bằng 7 bản HD-* (việc DATA/Designer, 0 code).
**3 chỗ CÒN lẫn (đều FE/UI):**
1. **WfView không slice theo loại:** trang matrix (`fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx`) đọc `type` (`:57`) + fetch `applicableType=3` (`:67`) nhưng **KHÔNG đọc `ct`** (0 hit `get('ct')` toàn file) ⇒ leaf "Luồng duyệt" của HĐ Thầu phụ hiện CẢ 7 họ HD-* + QT-HD-V2-001 trộn chung. KHKK đã có khuôn slice sẵn ngay trong CÙNG file: `group` → lọc `code === khkkGroupWorkflowCode(n)` (`:84-98`, mirror `KHKK-N{n}`) ⇒ fix = thêm nhánh `ct` → lọc `code === HD-<token>` y khuôn.
2. **Bug menu A+B** (Thứ-3 đã root-cause ở trên) — `?type=3` WfView đá accordion + `phase=9` transient làm 2 leaf cùng sáng.
3. **Comment stale:** `Layout.tsx:141-142` tự khai "HĐ chung 1 bộ workflow V2" — đúng ở S159, SAI từ S188 (7 bộ per-loại). Comment này chính là hoá thạch của thời-chưa-per-loại, sửa cùng lượt với route WfView.
## Thứ-3 BUG menu nhảy lẫn (root-cause) ## Thứ-3 BUG menu nhảy lẫn (root-cause)
@ -50,7 +68,22 @@
## Thứ-4 bộ thao-tác vs khuôn KHKK ## Thứ-4 bộ thao-tác vs khuôn KHKK
(pending) **Bộ 6 leaf submenu GIỐNG HỆT theo seed** — cả 2 họ cùng {Luồng duyệt·Danh sách·Thao tác·Đang duyệt·Đã duyệt·Đã xóa} cùng label + icon (`DbInitializer.cs:2094-2099` Khkk G1 / `:2271-2276` Khkk G2-8 / `:2196-2201` Ct_×7). LỆCH nằm ở HÀNH VI từng leaf + màn duyệt:
| Trục | KHKK (chuẩn prod, owner S176) | HĐ GĐ3 hiện tại | Verdict |
|---|---|---|---|
| Luồng duyệt | slice đúng nhóm: `group` → lọc `code===KHKK-N{n}` (`WorkflowMatrixViewPage.tsx:84-98`) | `?type=3&ct=N` — trang KHÔNG đọc `ct`, hiện trộn cả 7 họ; `type=3` đá accordion (bug A) | 🔴 LỆCH — fix bug A + slice `ct``HD-*` y khuôn group |
| Danh sách | cây toàn trình đứng TRÁI 400px (`KhkkListPage.tsx:171`) | list trái 320px, cây bên PHẢI (`MyContractsPage.tsx:153,242`) | 🔴 LỆCH — chính là Thứ-1 |
| Thao tác | `/khkk/create?group=n` | `/contracts/new?type=N` | ✅ tương đương (form tạo riêng loại) |
| Đang duyệt | Ở LẠI CÙNG trang list: `filter=ChoDuyet``filter` KHÔNG transient (`Layout.tsx:350`) nên vừa lọc vừa là danh tính hợp lệ | văng sang trang RIÊNG `/inbox?type=N`; BE inbox KHÔNG nhận type (`ContractsController.cs:41-43`) → lọc client (`InboxPage.tsx:103`) | ⚠️ LỆCH KHUÔN — muốn y KHKK thì "Đang duyệt" về `/my-contracts?type=N&pendingMe=1` (param `pendingMe` BE ĐÃ có, khuôn PE `Layout.tsx:176`); giữ InboxPage cho vai trò hộp thư tổng |
| Đã duyệt | `filter=DaDuyet` = danh tính chuẩn | `phase=9` transient → 2 leaf cùng sáng (bug B) | 🔴 LỆCH — fix `view=approved` (đã đề xuất Thứ-3) |
| Đã xóa | `view=deleted` + title "· đã xóa" + placeholder "chỉ xem danh sách, không mở chi tiết" (`KhkkListPage.tsx:151-152,198-200`) | `deleted=1` + badge "Đã xóa — chỉ xem" + chặn select (`MyContractsPage.tsx:94,134-137`) | ✅ TƯƠNG ĐƯƠNG hành vi (khác chữ; danh tính `deleted=1` hợp lệ) |
**Màn duyệt — `ContractWorkflowPanel.tsx` (MIRROR SHA256 2 app, khuôn nguồn tự khai = `KhkkWorkflowPanel` bản owner-trim S175 `:2-5`):**
- ✅ ĐÃ GIỐNG: 2 nút Duyệt/"← Trả lại" (`:347`, Từ chối KHÔNG render đúng trim S174 `:69,:317`) · banner "✓ Đến lượt bạn duyệt" (`:291`) · banner TRẢ LẠI/TỪ CHỐI (`:307,:312`) · sơ đồ Bước→Cấp. 4 host cùng render (`:42-43`: ContractDetailPage ×2 app · MyContractsPage · ContractsListPage · InboxPage).
- 🔴 KHKK CÓ mà GĐ3 THIẾU (đáng làm — anh nhắc "xóa" trong lời Thứ-4): **nút Xóa phiếu ở màn duyệt** (KHKK panel mục 4 `KhkkWorkflowPanel.tsx:12-14,118,233`; cờ `AllowApproverDelete` per-Level Mig 68 nằm trên bảng `ApprovalWorkflowLevels` DÙNG CHUNG V2 — cột ĐÃ có sẵn cho workflow HD-*). Phía HĐ: `ContractFeatures.cs` 0 hit `AllowApproverDelete`, và **delete-guard còn so SỐ `Phase >= DangInKy` (`:896-897`)** ⇒ HĐ V2 ở ChoDuyet(10)/TraLai(98) KHÔNG xóa được (S160 finding còn sống) — muốn y KHKK bắt buộc delta BE nhỏ (nới guard V2-aware + đọc cờ), 0-mig vì cột sẵn.
- 🟡 KHKK CÓ mà GĐ3 CỐ Ý KHÔNG PORT (panel tự khai "đo ra, không phải cắt cho gọn" `:26-39`): ① ô-tích "Cấp này KẾT THÚC" (API `TransitionContractBody` 3 field, `skipToFinal` không trên surface) ② badge "⚑ Duyệt thay CEO" (`ApproveV2Async` HĐ không đọc `allowApproverFinalize`, `ContractWorkflowService.cs:230-407`) ③ **banner kết-thúc-sớm + meta `{code} v{NN}`** — chặn bởi `ContractDetail` DTO 0 field (`endedByLevelFinalize`/`workflowCode`/`workflowVersion`). Nếu anh muốn ngang KHKK tuyệt đối → cần nở DTO (BE), còn không thì giữ nguyên khai-lệch.
- 🟢 KHÁC CÓ CHỦ ĐÍCH: file đính kèm lúc duyệt — KHKK có section riêng trong panel (`KhkkWorkflowPanel.tsx:502`, đường `approval-attachments` riêng); HĐ dùng `ContractAttachmentsSection` sẵn trong detail (`ContractWorkflowPanel.tsx:44-46`) — không thiếu chức năng, chỉ khác chỗ đặt.
## Thứ-5 admin Designer per-loại ## Thứ-5 admin Designer per-loại