diff --git a/.claude/WAL.md b/.claude/WAL.md index 15569e0..0a9f899 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -42,11 +42,16 @@ chain: deploy-KHỎE (run #435 · gate-CI 609 tách-phần · Mig71 prod-top+restart-proof · bundle 4/4 rotate · smoke 6/6 ?group= wired; mục-4 backfill/Σ = CHÂN-LÝ-RỖNG prod-0-phiếu — đo lại khi K8 đẻ phiếu thật. cicd #53 return-garble tiếp, artifact trọn) -[!] wf: K3-BE p2 ĐANG CHẠY (p1 wf_a04124a7 = engine-process-exit 0-delta-0-artifact; LEAD tự chạy bước-0: - prod = localhost\SQLEXPRESS [ghi lại — localhost/tcp:1433 đều fail], QT-DN-V2-001 LIVE 1-active+2- - archived type-1, ROSTER 3-trạm PRO→CCM→CEO 11 người ghi nguyên văn sub-implbe-k3.md §0, vá-11 danh- - tính phân giải bằng dept, chuong.phan = giữ cờ finalize; p2 seed từ bảng verified — khỏi ssh). - Song song: cicd-K2 verify nền. Sau BE: K3-FE + K3-test → gate K3 → push +[!] K3 CHẺ NHỎ sau 2 lượt engine-process-exit (p1 wf_a04124a7 + p2 Agent — cả 2 0-delta-0-artifact; + bài: task-đọc-nhiều-trước-Write chết, task-hẹp-Write-sớm sống). Bước-0 LEAD: prod=localhost\SQLEXPRESS, + QT-DN-V2-001 LIVE, ROSTER 3-trạm 11 người @sub-implbe-k3.md §0, chuong.phan giữ cờ. + ĐANG CHẠY: nhịp-1-BE lane (seed 8 wf + 8 MenuKeys — đã append §1 kế-hoạch + khai L1-không-khuôn-type-10 + →mirror-ContractV2 + L2-ép-false-không-cản-seeder) ∥ K3-FE lane (resolvePath AwV2_KhkkN* + gỡ khóa + Designer + panel ×2). XONG LEAD-SOLO: nhịp-2 port finalize (branch mirror PE :866-876 + opt-out + applyLevelFinalize 3-tầng interface/service/controller + comment (a)(b) supersede-S155 + 2 test-callsite + ct:) + nhịp-3 (gỡ CREATE ép-false :380 [GIỮ PUT-Conflict — luật versioning CHUNG, spec vá-3 liệt nhầm, + lệch KHAI chờ gate soi] + rào (v) pin-đúng-nhóm regex KHKK-N[1-8]). Sau 2 lane: build+test → K3-test + hẹp → gate K3 → commit-push → cicd → /pause (mandate mới) [ ] 🔴 MANDATE MỚI (owner in-turn @S165 ~17:3x: "xong nốt thì /pause rồi những đầu việc tiếp theo để lần tiep sau làm tiếp") — SUPERSEDE "chạy 1 mạch": XONG NỐT K3 (BE p2 đang chạy → FE + test song song → gate K3 → commit-push → cicd verify) rồi /pause. K4a→K4b→K5→K4c→K6→K7→K8 = lần /tiep sau. diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implbe-k3.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implbe-k3.md index 2c299f9..fee0772 100644 --- a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implbe-k3.md +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implbe-k3.md @@ -37,3 +37,28 @@ K3-BE: IN-PROGRESS — bước-0 XONG (lead), §1-8 p2 đang chạy KHKK-N1..N8 mirror ĐÚNG cấu trúc này (3 Steps × Levels như bảng), resolve user theo EMAIL. (§1-8 p2 ghi tiếp bên dưới) + +--- + +# §1 [p2] KẾ HOẠCH (ghi TRƯỚC khi code — 3 dòng) + +1. **A** — `DbInitializer.cs`: thêm `SeedKhkkGroupWorkflowsAsync(db, userManager, logger)` (UNGATED, đặt sau + cụm 4 seeder WorkflowApps V2 ở `InitializeAsync`), mirror khuôn `SeedSampleContractWorkflowV2Async`; resolve + 11 email → dict 1 lượt, rồi loop N=1..8 tạo `KHKK-N{n}` (type-10) 3 Steps × Levels theo roster §0. +2. **B** — `MenuKeys.cs`: +8 const `AwV2_KhkkN1..N8` + vào `All` (ràng buộc T6: key ∈ All BẮT BUỘC có menu-row) + ⇒ `DbInitializer.SeedMenuTreeAsync`: +8 row con dưới `ApprovalWorkflowsV2` (order 3..10), idempotent per-Key. +3. **C** — `dotnet build SolutionErp.slnx` (0W/0E) + `dotnet test SolutionErp.slnx` full (baseline 609/0) + đếm + `MenuKeys.All` bằng lệnh máy → ghi DELTA. + +**Đo TRƯỚC khi sửa (baseline, lệnh máy chạy ở §4):** `MenuKeys.All` hiện = ? (đo ở §4, không đoán). + +🔴 **2 lệch phát hiện lúc khảo sát (khai ngay, KHÔNG tự quyết):** +- **L1 — "vùng seed workflow type-10 hiện có (W3 S161)" KHÔNG TỒN TẠI.** `grep ContractSigningPlan + DbInitializer.cs` = **0 hit** (chỉ có `SeedKeHoachKyKetAccessAsync` = seed *quyền*, không phải workflow). + ⇒ Không có khuôn type-10 để mirror; tôi mirror khuôn gần nhất **cùng lớp** = `SeedSampleContractWorkflowV2Async` + (`:226`) / `SeedSampleProposalWorkflowV2Async` (`:276`) — cùng cách dựng `ApprovalWorkflow + Steps + Levels`. +- **L2 — `AllowApproverFinalize` bị ÉP `false` server-side cho type-10 ở đường Designer.** + `ApprovalWorkflowV2AdminFeatures.cs:380-381`: `AllowApproverFinalize = typeEnum != ...ContractSigningPlan && l.…` + (W1 S161 F-8 containment). Seeder ghi entity TRỰC TIẾP nên **không bị chặn**, nhưng nếu admin bấm "tạo version + mới" qua Designer thì cờ rơi về false. Tôi vẫn set `true` theo lệnh (OG-3/OG-9) + ghi comment đúng câu lead + giao; **nhịp sau cùng wave** port nhánh service + (nếu owner chốt) gỡ ép-false ở `:381`. diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k3.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k3.md new file mode 100644 index 0000000..0239646 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k3.md @@ -0,0 +1,29 @@ +K3-FE: IN-PROGRESS — build ×2 · SHA-pair (chưa chốt) + +# sub-implfe-k3 — K3-FE 3 việc FE (Layout AwV2_KhkkN*, gỡ khóa duyệt-sớm KHKK, comment supersede Panel) + +> Artifact chống #53 — đổ liên tục từng việc. Dòng-1 = verdict (cập nhật cuối). +> Run: 2026-07-31-S164-4gd-khkk-fanout · role: implementer-frontend · lượt K3 + +## §0 — Trạng thái mở lượt (đo đĩa TRƯỚC khi gõ, bài học S164/K2) + +- `fe-admin/src/components/Layout.tsx:170-176` — `awV2Match` whitelist hiện: `'DuyetNcc' | 'DuyetNccPhuongAn' | 'Contract'`. Chưa có nhánh KhkkN. ✔ khớp đề-bài. +- `Khkk_*` staticMap ĐÃ CÓ SẴN 6 dòng (`:35-40`, từ W2 S161) — đề-bài "CẤM nới họ Khkk_" ⇒ đọc là **cấm THÊM dòng mới**, 6 dòng cũ giữ nguyên byte. +- `fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx` 1368 dòng. Lock KHKK sống ở **4 cụm**: `:151` note-const · `:242-259` `levelFlagsPayload(e, lockEarlyFinalize)` + 2 call-site `:783/:815` · `:633-638` `earlyFinalizeLocked` · `:1281-1329` render (banner + 2 checkbox `disabled`/`checked` ép false + 2 `title`). ⇒ gỡ lock = đụng CẢ 4, không phải 3. +- `KhkkWorkflowPanel.tsx:6-9` — câu cần supersede nguyên văn: *"KHÔNG 2 đường kết-thúc-sớm (AllowApproverFinalize / CeoApprovalThreshold — anh phán «PHÁ VỠ» S155; W1 đã rào ở Designer type-10)"*. +- Baseline SHA-pair Panel ×2 = `2B64144EF6E8567D6997C0E19B9686C083080216510A4CD8DA6157A80F584817` (khớp đề-bài `2b64144ef6e8`). ✔ +- `tsconfig.app.json:19-21` = `noUnusedLocals` + **`noUnusedParameters`** true ⇒ KHÔNG được để param `lockEarlyFinalize` mồ côi; phải xoá param + sửa 2 call-site. + +## §1 — VIỆC 1 Layout.tsx `AwV2_KhkkN{1..8}` — DONE + +- `fe-admin/src/components/Layout.tsx:177-182` (+8 dòng, chỉ INSERT, 0 xoá): thêm nhánh + `if (/^KhkkN[1-8]$/.test(code)) return '/system/approval-workflows-v2/' + code` **BÊN TRONG** khối + `awV2Match` sẵn có, đặt SAU whitelist 3 code cũ ⇒ 3 code cũ đi đường cũ, 0 đổi hành vi. +- Regex `^KhkkN[1-8]$` neo 2 đầu ⇒ `KhkkN0`/`KhkkN9`/`KhkkN12` KHÔNG khớp (rơi về `return null`, đúng ý "n=1..8"). +- **Phép-âm (đề-bài yêu cầu) — PASS:** `git diff -U0 | grep -E "^\+ *Khkk_[A-Za-z]+: *'"` = **0 hit**. + Kèm **control dương**: cùng regex quét cả file = **6 hit** (6 dòng `Khkk_*` cũ) ⇒ mẫu CÓ RĂNG, 0-hit là + 0-hit thật chứ không phải regex trượt. Dòng `Khkk_` duy nhất trong diff là **comment** (mention, không + phải route) ghi rõ lý do CẤM nới. +- `git diff --stat` = `1 file changed, 8 insertions(+)`. + +## §2 — VIỆC 2 gỡ khoá duyệt-sớm KHKK (đang chạy)