wal: flush 20260808T0108

This commit is contained in:
pqhuy1987
2026-08-08 01:08:01 +07:00
parent b7140ea9c7
commit 11bb2b9d11
5 changed files with 156 additions and 13 deletions

View File

@ -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)

View File

@ -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)`.

View File

@ -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**`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`.

View File

@ -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)

View File

@ -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)_