wal: flush 20260729T1917

This commit is contained in:
pqhuy1987
2026-07-29 19:17:10 +07:00
parent d5635e10b5
commit 22bd8997d4
4 changed files with 63 additions and 3 deletions

View File

@ -9,7 +9,8 @@ chain:
- [x] ctx-verifier @tiep-2 CO-CO 10 cờ (biên-nhận `_tiep-2.md`) → vá ngay run.md ledger (hàng 2/3/4/6b flip [x] + xoá 2 dòng duplicate stale); còn lại → housekeeping
- [x] 3 quyết owner @S161: (1) mã phiếu OK `KHKK/{YYYY}/{Seq:D3}` · (2) "Bỏ cái MB đi" → dry-run cấm HĐ MuaBan + codegen = nợ tuyên án · (3) GĐ4 = 1-MỐC (verbatim "Upload file cứng lên -> Là xem như xong") — khắc vào plan-cha #6/#7/#8/#9 + W1/W2/W5/W7 (16 edit)
- [x] gate 5-anchor W1 PASS 5/5 (mở tươi @S161 — slot 10 trống · :41 const · ∉All · :138-139 lưới · :1779-1786 seed)
- [!] wf: hmw W1 đợt-1 `wf_7d6fb81b-640` ĐANG CHẠY NỀN — 2 lane {implementer-backend: 7 entity+Mig 69+seeder UPGRADE+CodeGen+3 site AWV2Admin · implementer-frontend: Designer type-10 + ẩn 2 checkbox} — run-folder `.claude/workflows/runs/2026-07-29-S161-khkk-w1-schema/` (taskList 7 stage trong run.md)
- [x] wf đợt-1 `wf_7d6fb81b-640`: FE lane CLEAN (Designer type-10, containment 2-lớp, build tươi lead-verify PASS, đã harvest) · BE lane chết #53 sau Domain-layer (8 entity + type-10 + 4/7 config trên đĩa, 0 sub-md)
- [!] wf: RELAUNCH-CẮT-GỌT BE `wf_f8c806d2-5a3` ĐANG CHẠY — còn {3 config · DbSets · Mig 69 · MenuKeys All+= · seeder UPGRADE · CodeGen KHKK · 3 site AWV2Admin · build} — run-folder `.claude/workflows/runs/2026-07-29-S161-khkk-w1-schema/`
- [ ] đợt-2 SAU khi wf về: test-specialist + database-agent (song song) → lead acceptance §③-B (build·test·sqlcmd 96·Down sạch·đo CỜ) → reviewer → commit/push → cicd-monitor 3-chân-kiềng
- [ ] setup thủ công TRƯỚC W5 (SAU W1 vì type=10 cần mig 69): dựng workflow type=3 + type=10 3-trạm qua Designer (seed chỉ 1 trạm)
- [ ] housekeeping @pause/closeout kế: nén MIND-1 5.447B (trần `_mind` 83,2% — MIND-5 chắc vượt) · re-carry 2 ý D rơi (vá-GỐC-Phase-3.5-refresh {mới-nêu} CÒN SỐNG + khuôn-5-đợt→sổ bền {gần-chốt}) · STATUS:6 bổ arc dry-run S160 (mù có lý do — land 15:27 trước pipeline) · hạ nhãn DR/WF-3-trạm đã-định-đoạt · E đếm 7 sub-file (không 6) · mở lại slot-45 trần `_mind` (tiền-đề lật: file SỐNG 83,2%) · quyết bookkeeping OVERDUE:light (cặp H24 chạy @S159 bookend mà `last_audit` đứng 27)

View File

@ -1,5 +1,7 @@
# Implementer-Frontend Agent — Persistent Memory
- **S161 (07-29) W1 KHKK Designer type-10 fe-admin `[hmw wf_7d6fb81b-640 lane-2 · return CLEAN · lead verify: build tươi PASS + disk khớp từng site; diagnostics IDE giữa-agent = stale (#68) đĩa thắng]`:** 1 file `ApprovalWorkflowsV2Page.tsx` (+67/9): `TYPE_INT_CONTRACT_SIGNING_PLAN=10` (:147) → `TYPE_CODE_TO_INT:162` (deep-link `/ContractSigningPlan`, route sẵn `App.tsx:76`) + `DEFAULT_CODE_BY_TYPE:170` `'QT-KHKK-V2-001'` (suy diễn khuôn — spec KHÔNG chốt, đổi 1 dòng) + rào 2 checkbox early-finalize **2 LỚP**: render (`disabled` + `checked` ép false + tooltip dùng chung `KHKK_EARLY_FINALIZE_NOTE` :1284-1330, className ternary chuỗi ĐẦY ĐỦ Pattern-14) **VÀ** payload (`levelFlagsPayload(e, lockEarlyFinalize)` :247 ép false :254-255 — 2/2 call-site PUT :783 + POST :815) — chỉ disable ô = containment GIẢ vì `copyFromDefinition()` vẫn tuồn `true` vào state→BE. Cân 409: PUT echo-so-BẰNG (`AWV2AdminFeatures:580-585`) KHÔNG nổ vì type-10 mọi bản đều POST-ép-false + cloneFrom cùng-type. **2 tiền-đề đề bài SAI, lane tự bẻ (mirror bài S160):** (i) FE KHÔNG có bảng nhãn ApplicableType — nhãn từ BE `applicableTypeLabel`; (ii) khuôn "entry type=9" không tồn tại (`TYPE_CODE_TO_INT` dừng ở 3) → mirror `Contract:3`. **Cờ đỏ báo lead:** type-10 (và cả type-3 xưa nay) KHÔNG có đường sidebar — allowlist `Layout.tsx:162-168` chỉ có 2 key `AwV2_` PE; admin vào bằng URL trực tiếp; BE seed leaf mới thì PHẢI nới `Layout.tsx:165` cùng lượt. Tag `[s161, w1-designer-type10, two-layer-containment-render-payload, fe-khong-label-map, tien-de-de-bai-sai-tu-be, stale-diag-68]`
- **S153 (07-26) arc ctx-adopt T2 + T5 (2 lượt hmw) `[lead seed on-behalf @closeout M9; T2 return mất schema-fail (#53 +1) → derive-from-body, template VẪN LAND 8.819B; T5 return CLEAN]`:** **T2 template** `.claude/templates/session-mind-template.md` — 3 marker (RULES-START/END · MIND-TOP) · **0 dòng key `ts:`** (ts sống trong HEADING sau em-dash ⇒ không phạm rào-2) · 6 hit `rào-` (3 rào × tên+lý-do) · chiều chèn **NGƯỢC** `_context` khai TO trong khối luật · placeholder `<k>` trong schema-comment chống parser false-match (mirror trick template `_context:32`) · kiểm `_SECRET_RES` để ví-dụ rào-3 không tự khớp mẫu (secrets-sweep rglob TRỌN session-dir, KHÔNG biết enclosure).
**T5 `hmw.js`** 3/3 acceptance: VALID_ROLES 20→21 (sau T10/T11 = **23**) + 🔴 **writeGuard là 2 ĐIỂM không phải 1**`:228` JS-comment doc **và** `:235` template-literal ĐI VÀO PROMPT sub; chỉ sửa `:235` ⇒ doc lệch trong CÙNG file, chỉ sửa `:228`**prompt runtime KHÔNG đổi** ⇒ vai read-only bị hướng-dẫn như write-sub ⇒ Bash-write MD ⇒ mojibake G-009. `:235` = **điểm có RĂNG**. Vùng CẤM đo bằng diff: `WIDTH_CAP` 0 hit · `TIER2_EXPECTED_FULL_ID` 0 hit.
**2 kẽ báo lead:****naming-collision cùng-role 2-invocation** (index `i` reset mỗi invocation ⇒ đợt-2 suýt đè `sub-implementer-frontend-1.md` của đợt-1; tự né bằng `-2`, verify đợt-1 nguyên 2020B) — kẽ CÒN LẠI sau S134 (S134 chỉ vá ca 2-role-cùng-invocation) ② `node --check` file thô **luôn** SyntaxError (top-level await) ⇒ acceptance phải là **wrapped-parse + đối-chứng HEAD**, không phải check thô.

View File

@ -9,8 +9,8 @@
| # | Stage | Vai / cách | Trạng thái |
|---|---|---|---|
| 1 | Đợt-1a BE: Domain 7 entity + 3 enum + ApplicableType=10 + EF Config ×7 + DbSets + **Mig 69** 3-file (apply 2 DB) + MenuKeys All+= + DbInitializer UPGRADE-if-exists (13/13 role) + CodeGen KHKK + 3 site AWV2AdminFeatures | hmw `implementer-backend` | [ ] |
| 2 | Đợt-1b FE: Designer type-10 `ApprovalWorkflowsV2Page.tsx` (TYPE_CODE_TO_INT + option + ẩn 2 checkbox early-finalize khi type=10) | hmw `implementer-frontend` | [ ] |
| 1 | Đợt-1a BE: Domain 7 entity + 3 enum + ApplicableType=10 + EF Config ×7 + DbSets + **Mig 69** 3-file (apply 2 DB) + MenuKeys All+= + DbInitializer UPGRADE-if-exists (13/13 role) + CodeGen KHKK + 3 site AWV2AdminFeatures | hmw `implementer-backend` | [!] lane-1 `wf_7d6fb81b-640` chết #53 SAU Domain-layer (8 file entity ĐỦ RUỘT + ApplicableType=10 + 4/7 config — lead verify đĩa; 0 sub-md) → **RELAUNCH-CẮT-GỌT `wf_f8c806d2-5a3`** (3 config + DbSets + Mig 69 + MenuKeys + seeder + CodeGen + 3-site + build) ĐANG CHẠY |
| 2 | Đợt-1b FE: Designer type-10 `ApprovalWorkflowsV2Page.tsx` (TYPE_CODE_TO_INT + option + ẩn 2 checkbox early-finalize khi type=10) | hmw `implementer-frontend` | [x] `wf_7d6fb81b-640` lane-2 CLEAN — +67/9, containment 2-LỚP render+payload; **lead verify build tươi PASS** (bundle `index-iNZq9job`; diagnostics giữa-agent = stale #68); harvest diary xong. Cờ đỏ: type-10 chưa có đường sidebar (allowlist `Layout.tsx:162-168` — cả type-3 xưa nay cũng vậy, đúng spec "menu KHÔNG đổi") |
| 3 | Đợt-2a: schema test + codegen format test (`ContractSigningPlanSchemaTests` + `SigningPlanCodeGenerator_Format_KhkkYearSeqD3`, N ≥ 2) | hmw `test-specialist` | [ ] |
| 4 | Đợt-2b: design-review Mig 69 TRƯỚC deploy (reversible Down · snapshot drift · FK/index) | hmw `database-agent` | [ ] |
| 5 | Lead: build ×2 + `dotnet test` + sqlcmd 89→96 + Down-script sạch + acceptance §③-B sweep | lead | [ ] |

View File

@ -0,0 +1,57 @@
# sub-implementer-frontend-1 — W1 §②-10 Designer type-10 KHKK (fe-admin only)
**Verdict: DONE — 1 file sửa, `npm run build` fe-admin PASS 0 TS error.**
Scope thi công: CHỈ `fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx`. KHÔNG đụng `fe-user` (không tồn tại bản sao — `fe-user/src/pages/system/` không có thư mục), KHÔNG đụng `src/Backend/**`, KHÔNG commit.
---
## 1. Khảo sát trước khi sửa (grep cùng-lớp mọi chỗ liệt kê ApplicableType)
**Trong file Designer — đúng 2 chỗ liệt kê tay, không có chỗ thứ 3:**
| Chỗ | Trước | Vai trò |
|---|---|---|
| `TYPE_CODE_TO_INT` (site THỰC `:144-148` bản cũ, không phải comment `:143`) | `DuyetNcc:1, DuyetNccPhuongAn:2, Contract:3` | map `:typeCode` URL → int, dùng ở `:257` `selectedTypeInt` |
| `DEFAULT_CODE_BY_TYPE` (`:149-153` bản cũ) | `1/2/3``QT-DN-V2-001` / `QT-DN-PA-V2-001` / `QT-HD-V2-001` | prefill ô "Mã quy trình", fallback `'QT-V2-001'` (`:614` bản cũ) |
**Không có "option list" / bảng nhãn trong FE** — trái với giả định của đề bài. Danh sách loại quy trình + nhãn tiếng Việt đến TỪ BACKEND qua `GET /approval-workflows-v2``TypeSummaryDto.applicableTypeLabel` (khai type ở `:92-97`, render card `:294-296`, tiêu đề trang `:278`, tiêu đề dialog `:833`). ⇒ FE **không** phải chép chuỗi 'Kế hoạch ký kết HĐ'; nhãn hiển thị đúng hay không là do BE map (`ApprovalWorkflowV2AdminFeatures.cs` — lane implementer-backend).
**Khuôn "entry type=9 TravelRequest" mà đề bài bảo mirror: KHÔNG TỒN TẠI trong file này.** `TYPE_CODE_TO_INT` dừng ở 3 — các loại Office 4..9 (ProposalGeneral…TravelRequest) chưa bao giờ có deep-link riêng ở Designer; chúng vào Designer qua trang tổng (không `:typeCode`) hoặc module page (`WorkflowAppDetailPage.tsx:216` truyền `config?.applicableType`). ⇒ Khuôn thật để mirror là **entry `Contract: 3`** (loại có deep-link nhưng không có menu leaf). Đã mirror theo đó.
**Repo-wide (fe-admin) không có bảng nhãn ApplicableType nào khác** — grep `Record<number,string>` toàn `src/`: toàn label map của enum KHÁC (ContractPhase, PeType, WorkflowAppStatus, Employee…). `Layout.tsx:18 TYPE_CODE_TO_INT` là enum **ContractType** (Ct_*/Wf_*), không phải ApplicableType.
## 2. Thay đổi đã land (file:line SAU khi sửa)
1. **`:147` `const TYPE_INT_CONTRACT_SIGNING_PLAN = 10`** — đặt tên cho số 10 vì nó dùng ở 3 nơi (map, default-code, rào checkbox); số trần rải nhiều chỗ là kiểu sửa-1-quên-1.
2. **`:151-152` `KHKK_EARLY_FINALIZE_NOTE`** — 1 chuỗi dùng chung cho tooltip 2 ô + dòng ghi chú (không chép 3 lần rồi lệch chữ).
3. **`:162` `ContractSigningPlan: TYPE_INT_CONTRACT_SIGNING_PLAN`** trong `TYPE_CODE_TO_INT` → mở deep-link `/system/approval-workflows-v2/ContractSigningPlan` (route đã có sẵn `App.tsx:76`, không cần route mới).
4. **`:170` `[TYPE_INT_CONTRACT_SIGNING_PLAN]: 'QT-KHKK-V2-001'`** trong `DEFAULT_CODE_BY_TYPE` — 🔴 **suy diễn của tôi theo khuôn 3 dòng trên, spec KHÔNG chốt chuỗi này**. Chỉ là giá trị GỢI Ý điền sẵn ô "Mã quy trình *" (admin sửa được trước khi Lưu); bỏ dòng này thì rơi về `'QT-V2-001'`. Lead/reviewer muốn chuỗi khác thì sửa đúng 1 dòng.
5. **`:247` `levelFlagsPayload(e, lockEarlyFinalize: boolean)`** — 2 cờ `allowApproverSkipToFinal` / `allowApproverFinalize` ép `false` khi khoá (`:254-255`). 2 call-site cùng truyền cờ: PUT `:783`, POST `:815`.
6. **`:638` `const earlyFinalizeLocked = applicableType === TYPE_INT_CONTRACT_SIGNING_PLAN`** trong `Designer` (prop `applicableType` có sẵn `:589/:596`, `TypePanel` truyền `:417`).
7. **`:1284-1288`** dòng ghi chú xám `col-span-2` (chỉ hiện khi khoá) + **`:1291-1310`** ô "Cho phép duyệt thẳng Cấp cuối khi đang duyệt" và **`:1313-1330`** ô "Duyệt là KẾT THÚC quy trình (không trình tiếp CEO)": `disabled={earlyFinalizeLocked}` (`:1306` / `:1325`), `checked={earlyFinalizeLocked ? false : entry.…}`, `title={… ? KHKK_EARLY_FINALIZE_NOTE : undefined}`, className ternary **chuỗi class ĐẦY ĐỦ** 2 nhánh (Pattern 14 Tailwind JIT — không nội suy mảnh class).
**Anchor Edit (bài S133):** className `col-span-2 flex items-center gap-1 text-[11px] text-slate-700` xuất hiện **6 lần** trong khối 9 ô tick ⇒ old_string bao trọn từ comment `{/* Mig 31 (S23 t1) … */}` tới hết `<span>Duyệt là KẾT THÚC…</span>` (2 câu chữ hiển thị là phần độc nhất). Không dùng className làm neo.
## 3. Vì sao khoá ở HAI lớp (render + payload), không chỉ ẩn ô tick
Chỉ `disabled` ô tick = containment giả: giá trị `true` vẫn có thể lọt vào state qua `copyFromDefinition()` (`:165-193`) rồi đi thẳng lên BE trong payload. Ép `false` ngay trong `levelFlagsPayload` là điểm duy nhất mọi đường ghi đi qua (comment `:232-240` của chính file khẳng định POST+PUT dùng chung đúng 1 hàm).
**Rủi ro 409 đã cân:** PUT sửa-tại-chỗ ECHO 2 cờ này và BE so BẰNG (`ApprovalWorkflowV2AdminFeatures.cs:580-585`) ⇒ ép `false` sẽ nổ 409 NẾU DB đang giữ `true`. Với type 10 điều đó không xảy ra: mọi bản type-10 đều do chính màn này tạo (POST đã ép false), và `cloneFrom` luôn cùng-type (`TypePanel` truyền `type.applicableType` `:417`) ⇒ display và payload luôn khớp, không có màn-hình-nói-một-đằng. Ghi rõ trong comment `:242-246`.
## 4. Cờ đỏ / việc KHÔNG thuộc lane này
- 🔴 **Chưa có đường vào bằng sidebar cho type 10.** Trang tổng (`:291-311`) render card mỗi loại nhưng card là `<div>` **không** link. Điều hướng per-type đi qua menu leaf `AwV2_<Code>``Layout.tsx:162-168` allowlist `resolvePath` (chỗ thứ 4 của Pattern 16-bis, gotcha #50). Hiện `MenuKeys.cs:74-75` chỉ có `AwV2_DuyetNcc` + `AwV2_DuyetNccPhuongAn`**không có cả `AwV2_Contract`**, tức type 3 xưa nay cũng chỉ vào được bằng gõ URL. W1 chốt "menu KHÔNG đổi (142 giữ)" ⇒ **đúng spec**, admin vào bằng URL trực tiếp `/system/approval-workflows-v2/ContractSigningPlan`. Nếu về sau BE seed leaf `AwV2_ContractSigningPlan` thì **BẮT BUỘC** nới `Layout.tsx:165` cùng lượt, không thì MenuLeaf trả null → rơi khỏi sidebar im lặng. Tôi KHÔNG sửa `Layout.tsx` (ngoài scope task).
- Acceptance §B "Admin tạo được quy trình type=10 3 Bước" chỉ chạy được sau khi BE: (a) `ApprovalWorkflowApplicableType.ContractSigningPlan = 10`, (b) overview trả type 10 kèm nhãn 'Kế hoạch ký kết HĐ', (c) 3 site liệt-kê-tay trong `ApprovalWorkflowV2AdminFeatures.cs` (`:911/:929`, `:971/:992`, `:1044/:1056`). Lane implementer-backend.
- KHÔNG viết test (đợt-2 test-specialist). KHÔNG commit/push.
## 5. Bằng chứng build
```
cd fe-admin && npm run build → tsc -b && vite build
✓ 1952 modules transformed. ✓ built in 17.39s
dist/assets/index-iNZq9job.js 1,645.50 kB │ gzip: 411.12 kB
dist/assets/index-B5heFn8x.css 84.18 kB │ gzip: 14.04 kB
```
0 TS error. 3 warning đều PRE-EXISTING: `@import` Google Fonts phải đứng trước rule khác · chunk >500 kB · `realtime.ts` vừa dynamic vừa static import.
`git status --porcelain` phần của tôi: **đúng 1 dòng** `M fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx` (`git diff --numstat` = **67 thêm / 9 xoá**). 2 mục còn lại trong cây KHÔNG phải của tôi: `.claude/governance/.session-counter.json` (harness) và `?? src/Backend/SolutionErp.Domain/ContractSigningPlans/` (lane implementer-backend chạy song song).