From 11bb2b9d11628c9919e574a585c6eb53399f426e Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Sat, 8 Aug 2026 01:08:01 +0700 Subject: [PATCH] wal: flush 20260808T0108 --- .claude/WAL.md | 27 ++++---- .../owner-decisions-08-08-2026.md | 11 +++ .../spec-khkk-awf-mirror-ncc-DRAFT.md | 68 +++++++++++++++++++ .../sub-review-1-fable.md | 23 +++++++ .../sub-review-2-fable.md | 40 +++++++++++ 5 files changed, 156 insertions(+), 13 deletions(-) create mode 100644 .claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/owner-decisions-08-08-2026.md create mode 100644 .claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/spec-khkk-awf-mirror-ncc-DRAFT.md create mode 100644 .claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-1-fable.md create mode 100644 .claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-2-fable.md diff --git a/.claude/WAL.md b/.claude/WAL.md index 4b5c9db..adb15c5 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -1,21 +1,22 @@ # WAL — auto-generated, không sửa tay -updated: 2026-08-08T00:52+07:00 | session: S182/L13 | branch: main +updated: 2026-08-08T01:08+07:00 | session: S182/L13 | branch: main -goal: YC-013 — 8 workflow "Duyệt KHKK — Nhóm 1..8" mirror ĐỦ chức năng trang Duyệt NCC (thêm/sửa/xóa/edit/ghim, UI không lệch); pipeline anh chỉ định 3-invest-Fable → wave-plan → 2-review-Fable → hmw fan-out Opus 5 MAX +goal: YC-013 — 8 workflow "Duyệt KHKK — Nhóm 1..8" mirror ĐỦ chức năng trang Duyệt NCC (UI không lệch); pipeline anh chỉ định 3-invest-Fable → wave-plan → 2-review-Fable → hmw fan-out Opus 5 MAX chain: -[x] bookend @open 5 vòng + ctx-audit (7/7 garble, recover 7/7) — runs/2026-08-07-S182-bookend-open/ -[x] YC-013 ghi sổ nguyên văn (so-yeu-cau:46) + run-folder khkk-awf-mirror-ncc + run.md -[!] wf: B1 3× fable-real invest — DB ✅ XONG-TRỌN (18KB, VERDICT 0-MIG + 3 mìn M1/M2/M3) · BE đang resume điền §4/§5 (§1-§3 đã đầy 11.7KB) · FE đang chạy -[ ] B2 lead tổng hợp wave-plan (spec DRAFT) -[ ] B3 2× fable-real reviewer -[ ] B4 spec final -[ ] B5 hmw fan-out Opus 5 MAX execute +[x] bookend @open 5 vòng + ctx-audit — runs/2026-08-07-S182-bookend-open/ +[x] YC-013 ghi sổ (so-yeu-cau:46) + run-folder +[x] B1 3× fable-real invest XONG-TRỌN-ĐĨA: BE 21KB (generic ~85%, 4 site sửa) · DB 18KB (VERDICT 0-MIG, 3 mìn M1/M2/M3) · FE 14KB (1 file chính ~60-90 dòng, SHA-mirror KHÔNG áp dụng) +[x] B2 spec DRAFT ghi (spec-khkk-awf-mirror-ncc-DRAFT.md — W0..W5) +[x] D3 anh chốt = C "Mờ ô chưa nghe" (YC-014, sổ + owner-decisions-08-08-2026.md) ⇒ W3 HỦY +[!] wf: B3 2× fable-real reviewer — spawn @01:05, artifact-first, skeleton đã trên đĩa +[ ] B4 lead merge → spec FINAL (spec-khkk-awf-mirror-ncc-08-08-2026.md) +[ ] B5 hmw fan-out Opus 5 MAX execute (W0 prep-local → W1 BE-1 4-fix → W2 FE → W4 test → W5 review+cicd) -wf: run-id=2026-08-08-S182-khkk-awf-mirror-ncc | script=Agent-tool model:fable ×3 parallel | trạng-thái=B1-đang-chạy | artifact=runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-invest-{be,db,fe}-fable.md | relaunch=re-spawn lens còn thiếu artifact, KHÔNG re-chạy lens đã có sub-file đầy +wf: run-id=2026-08-08-S182-khkk-awf-mirror-ncc | script=Agent-tool model:fable ×2 parallel (reviewer) | trạng-thái=B3-đang-chạy | artifact=sub-review-{1,2}-fable.md | relaunch=re-spawn reviewer còn thiếu ruột artifact; KHÔNG re-chạy invest (3 sub-invest đã đầy) -next: khi 3 invest trả → lead đọc 3 sub-file → dựng spec DRAFT (B2) → spawn 2 reviewer Fable (B3) +next: khi 2 reviewer trả → đọc 2 sub-review → merge finding + WAVE-PLAN FINAL của review-2 → ghi spec final → B5 fan-out (Workflow scriptPath hmw.js, worker-pin opus+max sẵn) -verify: ls runs/2026-08-08-S182-khkk-awf-mirror-ncc/ (3 sub-invest phải ≥1KB mỗi cái, không 0-byte) ; grep VERDICT mỗi file +verify: grep -c 'REVIEW-[12]:' runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-*.md (2 verdict) ; wc -c sub-review-* (≥5KB mỗi cái) -treo-chờ-anh (từ bookend @open): slot(67) upload-khi-duyệt · VK-5 nhánh A/B · (72) mfe-eval · ring5-audit slot(41) +treo-chờ-anh (từ bookend @open, KHÔNG chặn YC-013): slot(67) upload-khi-duyệt · VK-5 nhánh A/B · (72) mfe-eval · ring5-audit slot(41) diff --git a/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/owner-decisions-08-08-2026.md b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/owner-decisions-08-08-2026.md new file mode 100644 index 0000000..6a3dd26 --- /dev/null +++ b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/owner-decisions-08-08-2026.md @@ -0,0 +1,11 @@ +# owner-decisions — YC-013 pipeline (S182, 2026-08-08) + +## D3 — 9 checkbox quyền duyệt trên panel KHKK (YC-014, AskUser ~01:20) +**Anh chọn: "C — Mờ ô chưa nghe (Recommended)"** +- Giữ layout y khuôn ảnh; ô nào máy KHKK chưa nghe ⇒ **disabled + tooltip "chưa áp dụng cho KHKK"** — tiền lệ chính trang này (ô Duyệt-thẳng-Cấp-cuối đã mờ cho type-10 từ K3, `ApprovalWorkflowsV2Page.tsx:1292-1302`). +- Hệ quả scope: **W3 (port semantics) HỦY đợt này**. W2d thi hành theo C. +- Danh sách ô mờ CHÍNH XÁC = chờ 2 reviewer chấm (đặc biệt ô #4 Trả-về-Drafter: hành-vi thật = luôn-cho dù cờ tắt — mờ-tick-sẵn hay mờ-thường, reviewer khuyến nghị). +- Ô "Ngưỡng giá trị gói CEO" (`:944-961`): cùng cách — KHKK cố ý không port (OG-3 NĐUQ human-gate). + +## D4 — nhãn panel (lead quyết theo đề xuất FE-lens, reviewer chấm) +Title = menu-label "Duyệt KHKK — Nhóm {g}" + phụ đề nghiệp vụ `khkkGroupMenuLabel(g)`. diff --git a/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/spec-khkk-awf-mirror-ncc-DRAFT.md b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/spec-khkk-awf-mirror-ncc-DRAFT.md new file mode 100644 index 0000000..f572736 --- /dev/null +++ b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/spec-khkk-awf-mirror-ncc-DRAFT.md @@ -0,0 +1,68 @@ +# SPEC DRAFT — YC-013: 8 panel "Duyệt KHKK — Nhóm 1..8" mirror trang Duyệt NCC (S182/L13) + +> Tổng hợp từ 3 Fable deep-pass: `sub-invest-be-fable.md` (§1-§5+VERDICT) · `sub-invest-db-fable.md` (§1-§7) · `sub-invest-fe-fable.md` (§1-§6). Trạng thái: **DRAFT chờ 2 reviewer Fable + anh chốt D3**. + +## MỤC 1 — Mục tiêu + phạm vi + tiền đề đã chứng + +**Mục tiêu (YC-013):** 8 mục sidebar "Duyệt KHKK — Nhóm 1..8" ra ĐÚNG khuôn trang `approval-workflows-v2/DuyetNcc`: panel active-card + 4 nút (Sửa-tại-chỗ / Tạo-phiên-bản-mới / Ghim-Bỏ-ghim / Xoá-version) + Lịch sử versions + dialog Designer 9-checkbox per-NV + rule-box. **UI không lệch.** + +**Tiền đề 3 lens hội tụ (mỗi cái có file:line trong artifact):** +- **0 MIGRATION** — 9/9 checkbox = 9 cột bit sẵn trên `ApprovalWorkflowLevels` dùng chung; versioning UNIQUE `(Code,Version)` + `IsActive`; Archived = `IsActive=false`. +- **BE generic ~85%** — 5 action controller + PUT diff-by-Id + guard chữ-ký 3-site ĐÃ KHKK-aware + `SetUserSelectable`/`Delete` by-Id. +- **Danh tính nhóm = `Code` (`KHKK-N{n}`), KHÔNG phải ApplicableType** — 8 workflow cùng type=10. Đây là gốc của MỌI việc phải sửa. +- **Hiện trạng "lệch":** 8 route `/system/approval-workflows-v2/KhkkN{n}` (Layout `:188`) đổ về **landing grid** vì `TYPE_CODE_TO_INT` không có key `KhkkN*` (`ApprovalWorkflowsV2Page.tsx:164-172`). +- **Authz:** giữ `Workflows.Create` y trang DuyetNcc (32 policy `AwV2_KhkkN*` 0-consumer BE — đo + control-dương; per-group-authz = đổi hình controller 9-type, KHÔNG làm trừ khi anh lệnh). +- Runtime 9-flag: KHKK hiện chỉ nghe **#8 Finalize**; 4 Trả-về + Sửa-S2 + Sửa-NS + Duyệt-thẳng + XÓA = **BỎ QUA/CHƯA WIRE** ⇒ điểm quyết D3 (dưới). + +## MỤC 2 — WAVE-PLAN chi tiết + +### W0 — prep local (bắt buộc trước mọi test) +1. `dotnet ef database update` ×2 DB (Dev + Design **đang kẹt Mig 71**, đĩa = Mig 72 — committed-but-unapplied class S53). +2. Boot API 1 lần → `SeedKhkkGroupWorkflowsAsync` đẻ 8 row local. ⚠️ Local 8 workflow **RỖNG NGƯỜI là ĐÚNG** (seeder resolve email prod) — acceptance cấu trúc chạy local, acceptance đội-hình chạy prod. + +### W1 — BE-1: 4 fix, 2 file, 0-mig (`ApprovalWorkflowV2AdminFeatures.cs` + `ContractSigningPlanFeatures.cs` +1 helper) +| # | Fix | Site | Cách | +|---|---|---|---| +| a | 🔴 **Deactivate-per-Code cho type-10** (mìn M1, 3 lens hội tụ) | `:339-343` | `typeEnum == ContractSigningPlan` ⇒ scope `w.Code == request.Code`; type khác giữ per-type (P1 — KHÔNG làm P2 per-Code toàn cục: đổi hành vi PE/Contract chưa lường) | +| b | **Group-match guard 2-site** (bypass rào-v) | `:603-607` + `SubmitAsync` | extract rào (v) `:479-486` → `EnsureWorkflowGroupMatchAsync(db, awId, group)`; gọi ở Create + UpdateDraft + Submit (chốt-cuối, khuôn 2-tầng `:179-187`). Message lỗi chỉ việc cần làm cho phiếu lỡ pin lệch trước vá | +| c | **Changelog type-10 khi PUT sửa-tại-chỗ** | `:863-893` | thêm nhánh mirror block PE → `ContractSigningPlanChangelogs` (bảng sẵn Mig 69; khuôn ghi `ContractSigningPlanWorkflowService.cs:546-557`), query phiếu pin `def.Id` Phase ∉ {DaDuyet, TuChoi} | +| d | **DELETE usage-check → 409 đích danh** (lợi MỌI type) | `:1193-1205` | pre-count pin 8 module có cột `ApprovalWorkflowId` + LevelOpinions (khuôn `CountLiveOpinionsAsync` theo workflow-id) → 409 "N phiếu đang pin"; hết cảnh `SqlException 547 → 500 thô` (`GlobalExceptionMiddleware.cs:32-39` không map DbUpdateException) | + +**Test W1 (test-before cho a/b, test-after c/d):** tạo v2 `KHKK-N1` ⇒ N2..N8 `IsActive` bất biến + regression DuyetNcc tạo-Code-mới-cùng-type vẫn tắt Code cũ · UpdateDraft re-pin lệch nhóm ⇒ 409 · PUT workflow nhóm có phiếu treo ⇒ 1 row `ContractSigningPlanChangelogs` · DELETE version có pin ⇒ 409 (không 500). + +### W2 — FE: 1 file chính `fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx` (~60-90 dòng diff) +| # | Chạm | Site | Cách | +|---|---|---|---| +| a | Parse kind | `:164-172` | `match(/^KhkkN([1-8])$/)` → `khkkGroup`; `selectedTypeInt = khkkGroup ? 10 : TYPE_CODE_TO_INT[typeCode]` (query overview giữ `applicableType=10`) | +| b | Synthetic slice per-Code | `:299-301` | từ type-10: `versions = history.filter(d => d.code === khkkGroupWorkflowCode(g))` · `active = versions.find(v => v.isActive) ?? null` (🔴 KHÔNG tin ô `Active` per-type của BE — nó số-ít, 8 nhóm trộn) · title = "Duyệt KHKK — Nhóm {g}" + phụ đề nghiệp vụ `khkkGroupMenuLabel(g)` (D4 — lead chọn theo đề xuất FE, reviewer chấm) | +| c | `lockedCode` xuyên suốt | `TypePanel:357` → `Designer:620/:650/:798/:927` | prop `lockedCode?: string`; ô Mã `disabled={isEdit || !!lockedCode}`; POST gửi `lockedCode ?? code`. 🔴 Thiếu = "Tạo quy trình mới" từ panel nhóm với mã tự gõ đẻ version **rơi khỏi slice** + không được rào (v) nhận | +| d | **D3 — 7 ô chưa-wire** (chờ anh chốt, xem MỤC 3) | `:1275/:1284/:944-961/…` | thi hành theo phương án anh chọn {A giữ / B port / C mờ-ô} | +| e | (optional) mirror menuKeys | `fe-{admin,user}/src/lib/menuKeys.ts:31-32` | +8 const `AwV2_KhkkN*` — 0 hệ quả runtime, mirror-completeness | + +**SHA-mirror 2 app: KHÔNG áp dụng** — Designer là fe-admin-only (đã CHỨNG: fe-user 0 route/0 page/0 nhánh `AwV2_*`); `types/khkk.ts` 2 app identical sẵn, không chạm. +**Regression:** 4 route cũ (`DuyetNcc`/`PhuongAn`/`Contract`/`ContractSigningPlan`) render như cũ · fe-user tạo phiếu nhóm auto-pin `KHKK-N{g}` không đổi API · **hệ quả nghiệp vụ THẬT của nút Ghim:** `IsUserSelectable=false` 1 nhóm ⇒ CHẶN TẠO PHIẾU nhóm đó cả 2 app (`KhkkCreatePage.tsx:104/:113-116`) — acceptance phải nêu để anh biết nút này có răng. + +### W3 — CHỈ KHI anh chọn D3=B: port semantics vào `ContractSigningPlanWorkflowService` +F6 XÓA-đúng-lượt (mirror PE 3-rào `PeSoftDeleteFeatures.cs:110-114`) · F1×4 return-modes per-level (mirror switch `PurchaseEvaluationWorkflowService.cs:421-424`) · F3-analog sửa-Lines-lúc-duyệt · F2 skip-to-final (+gỡ ép-false `:387` + gỡ disable FE `:1292-1302` **CÙNG WAVE** — tiền lệ F5 @K3). Mỗi cờ = test RED→GREEN riêng. `CeoApprovalThreshold` **KHÔNG port** (OG-3 NĐUQ human-gate — owner đã chốt trước). + +### W4 — test-specialist đóng suite (baseline 645 → +N per W1/W3) +### W5 — reviewer adversarial pre-commit → commit → cicd-monitor 3-chân (bundle **admin rotate**, eoffice giữ nguyên nếu chỉ W2a-d; +eoffice nếu e) → acceptance prod + 3 query SQL verify (DB §4 bàn giao) + +## MỤC 3 — Điểm quyết + acceptance + rollback + +**D3 (ANH CHỐT — chặn scope W2d/W3):** 6/9 checkbox tick được mà KHKK-runtime KHÔNG nghe (#78 config-lie class): +- **A** — giữ 9 ô tick được (uniform tuyệt đối với ảnh; cờ lưu DB nằm chờ; risk: người cấu hình tưởng có hiệu lực). +- **B** — port cho sống thật (W3; đổi hành vi duyệt KHKK; nặng + cần test per-cờ). +- **C** — mờ ô chưa-wire + tooltip "chưa áp dụng cho KHKK" (tiền lệ CHÍNH TRANG NÀY: SkipToFinal đã disabled cho type-10 `:1292-1302`; + ô Ngưỡng CEO cùng cách; trung thực #78; port sau gỡ dần). + +**D4 (lead quyết, reviewer chấm):** title panel = menu-label "Duyệt KHKK — Nhóm {g}" + phụ đề nghiệp vụ từ `khkkGroupMenuLabel(g)`. + +**Acceptance (đo được, từ FE §5):** +1. 8 leaf sidebar → 8 slice panel khác nhau (URL `/KhkkN{n}`, header đúng nhóm, card `KHKK-N{n} v01` + badge + 3 Bước + 4 nút + Lịch sử) — hết landing grid. +2. Dialog Sửa-tại-chỗ: title `KHKK-N{n} v{NN} (giữ nguyên phiên bản)`, khối cam 9 checkbox đúng khuôn (theo D3), Drafter tick sẵn, rule-box. +3. "Tạo phiên bản mới" nhóm N1 ⇒ v02 nằm ĐÚNG panel N1; **badge "Đang áp dụng" 7 nhóm khác KHÔNG mất** (W1a). +4. Regression 4 route cũ + fe-user auto-pin + 645 test cũ xanh. + +**Rollback:** 0 mig ⇒ revert commit là sạch; W1a có regression-test 2 chiều giữ hành vi cũ cho type ≠ 10. + +## Nợ NGOÀI scope (khai, không lặng): GET Overview 0-policy lộ roster+9-flag cho mọi user authenticated (BE §5.2 — information-disclosure mềm, owner ngó sau) · roster 8 nhóm = snapshot email lúc seed, KHÔNG tự sync theo QT-DN-V2-001 (BE §5.3) · `Khkk_WfView` panel aggregate giấu 7/8 nhóm (FE §6.1 — slice này vá cho 8 leaf mới; re-point mục cũ = việc riêng) · comment "7 bảng" stale `:1120`. diff --git a/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-1-fable.md b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-1-fable.md new file mode 100644 index 0000000..8ae869c --- /dev/null +++ b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-1-fable.md @@ -0,0 +1,23 @@ +# REVIEW-1 (Fable, adversarial ĐÚNG-SAI) — S182 khkk-awf-mirror-ncc + +> Vai: `/fable-real reviewer` #1/2 — lens SAI/SÓT/MÂU-THUẪN trên spec DRAFT + 3 invest. +> Trạng thái: ĐANG ĐỔ RUỘT (skeleton @spawn, Edit liên tục). + +## VERDICT (điền cuối) +- (pending) + +## Checklist việc (8 mục từ lệnh) +- [ ] 1. W1a deactivate-per-Code — đọc `ApprovalWorkflowV2AdminFeatures.cs:339-343` + grep consumer `IsActive` +- [ ] 2. W2b synthetic slice — `ApprovalWorkflowsV2Page.tsx:286-353` + DTO `AwTypeSummaryDto` `:199-213` +- [ ] 3. W2c lockedCode — PUT đổi Code 409 `:539-550` + đường rơi khỏi slice +- [ ] 4. W1b group-match Submit — phiếu cũ pin lệch +- [ ] 5. W1d DELETE 409 — đếm module pin từ ModelSnapshot +- [ ] 6. D3 chấm A/B/C — bảng 9-flag, #4 Trả-về-Drafter +- [ ] 7. Mâu thuẫn 3 lens +- [ ] 8. Sót chung (notification / invalidate keys / optimistic) + +## FINDINGS +- (đang đổ) + +## TỔNG HỢP WAVE FINAL ĐỀ XUẤT +- (điền cuối) diff --git a/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-2-fable.md b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-2-fable.md new file mode 100644 index 0000000..2a5fd0b --- /dev/null +++ b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-2-fable.md @@ -0,0 +1,40 @@ +# SUB-REVIEW-2 (Fable) — lens HOÀN-CHỈNH-VẬN-HÀNH + tổng hợp WAVE-PLAN FINAL + +> Run: 2026-08-08-S182-khkk-awf-mirror-ncc · Reviewer #2/2 (`/fable-real reviewer`, YC-013) +> Trạng thái: ĐANG ĐỔ RUỘT — skeleton viết lúc spawn, Edit liên tục. + +## VERDICT (điền cuối) + +_(pending)_ + +## 1. Thứ tự wave + phụ thuộc + +_(pending)_ + +## 2. Deploy-safety + +_(pending)_ + +## 3. Seeder tương tác (wipe-durability #75/#76) + +_(pending)_ + +## 4. Acceptance prod — đủ đo chưa + +_(pending)_ + +## 5. Test coverage W1 + +_(pending)_ + +## 6. D3/D4 — chấm phương án + +_(pending)_ + +## 7. Rollback + monitoring + +_(pending)_ + +## 8. WAVE-PLAN FINAL + +_(pending)_