[CLAUDE] Scripts Docs: Chunk R — Cleanup destructive prod database (52 rows + ~600 cascade child)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m27s

Bro UAT confirm Plan P+Q wire OK + chỉ thị cleanup test data:
> "OK Tao thấy tạm ổn rồi đấy, mày xóa hết các phiếu test cũ đi nhé,
> các quy trình cũ ko ghim cũng xóa hết đi. Cho gọn đẹp."

Investigator pre-flight audit prod DB ~64K spawn confirm scope:
- 35 PE rows total (28 active + 7 soft-deleted)
- 17 ApprovalWorkflowsV2 (15 IsUserSelectable=false + 2 ghim+active)
- 4 PurchaseEvaluationWorkflowDefinitions V1 (2 IsActive=false + 2 active)

Critical gotchas:
1. PE.ApprovalWorkflowId FK Restrict → soft-delete KHÔNG release FK,
   hard-DELETE PE first
2. ApprovalWorkflow extend BaseEntity (NO soft-delete) → hard DELETE only
3. Filtered indexes Mig 29+ require SET QUOTED_IDENTIFIER ON
4. SQL Express constraints: NO BACKUP COMPRESSION + RESTORE VERIFYONLY
   require sysadmin (vrapp KHÔNG có)

Execute via scripts/plan-r-*.sql upload scp + sqlcmd -i workflow:

Step 1+2 — BACKUP DATABASE:
- C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak (18.5MB, 2249 pages)
- Verified via Get-Item file size

Step 3-5 — 3 separate transactions DELETE:
- 28 PE active + 7 soft-deleted → cascade 446 child rows
  (42 Details + 49 Suppliers + 64 Approvals + 238 Changelogs +
   10 Attachments + 43 LevelOpinions)
- 15 V2 workflows unghim → cascade ~140 Steps+Levels
- 2 V1 workflows inactive → cascade ~37 Steps+Approvers

Total: 52 rows direct + ~600 cascade child = ~650+ rows wiped.

Step 6 — Verify post-cleanup state:
- PE total: 35 → 0 ✓
- V2 workflows: 17 → 2 (QT-DN-V2-001 v16 + QT-DN-PA-V2-001 v2 ghim+active)
- V1 workflows: 4 → 2 (QT-DN-A v3 + QT-DN-B v1 active, PE pin protected)

Step 7 — BE smoke verify alive post-cleanup:
- /api/auth/login → 200
- /api/purchase-evaluations → 200
- /api/approval-workflows-v2 → 200
- /api/pe-workflows → 200
→ KHÔNG crash startup (Plan F precedent avoid được)

Multi-agent ROI: Investigator save em main hard-delete blind without
backup + catch SQL Express constraint + catch FK Restrict gotcha.

Pattern reinforced:
- Destructive operation prod BẮT BUỘC pre-flight audit + backup + verify
- scp + sqlcmd -i workflow cho complex SQL trên prod (avoid shell escape
  hell qua SSH PowerShell)
- Plan F precedent: KHÔNG drop active workflow (PE pin → BE crash)

Stats final S23 t8:
- 31 mig · 59 tables · ~145 endpoints · 34 FE pages · 111 test unchanged
- 47 gotcha · 20 memory · 6 skills · 4 sub-agents
- **0 PE phiếu test + 4 workflow ghim/active** — UAT clean slate
- Backup rollback ready: vietreport-vps:C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-15 14:11:56 +07:00
parent 108268a2e2
commit 5cbf516a78
5 changed files with 281 additions and 2 deletions

View File

@ -2,7 +2,8 @@
> **Update rule:** trước khi bắt đầu 1 task → ghi row vào `🔥 In Progress`. Xong → chuyển sang `✅ Recently Done`.
**Last updated:** 2026-05-15 (Session 23 turn 6**🎯 Plan P: HOTFIX Controller TransitionPeBody record missing 3 fields — bug ROOT CAUSE thực sự của F1+F2 fail**. 1 commit Plan P atomic. CICD Monitor Run #202 verify Plan O CRITICAL caveat catch: `PurchaseEvaluationsController.cs:267` `TransitionPeBody` record CHỈ có 3 fields (TargetPhase, Decision, Comment) — MISSING 3 fields có trong Command record `TransitionPurchaseEvaluationCommand` (ReturnMode + ReturnTargetUserId + SkipToFinal). `mediator.Send` line 70 cũng drop 3 field. → FE × 2 app SEND ĐÚNG 7 fields qua `api.post(/transitions)` body (Investigator verify FE wire OK 100%) → ASP.NET Core deserialization silently DROP 3 fields ở Controller layer → Handler nhận `ReturnMode=null` + `SkipToFinal=false` → fallback default Drafter mode + F2 không trigger. Bug present 2 NGÀY PROD từ Mig 28 deploy 2026-05-13 — gây TẤT CẢ F1+F2 wire fail từ FE side (Plan N + Plan O fix lookup sites nhưng controller bug block flow trước khi đến lookup site). Fix Plan P: Controller body record +3 field default null/false + `mediator.Send` pass 7 fields + add `using SolutionErp.Application.PurchaseEvaluations.Services` cho WorkflowReturnMode enum import. ~10 LOC BE 1 file. dotnet test **111/111 PASS** (+0 từ 108 — không cần test mới vì Investigator confirm scope BE Controller only, FE wire đúng, Mig 28/31 Domain test đã cover handler logic). Multi-agent ROI: 🟦 Investigator audit FE 2 spawn ~58K confirm hypothesis BE-only scope, avoid em main fix sai cross-stack. 🟩 CICD Monitor Run #202 catch caveat critical lúc verify Plan O — invaluable bug catch chain. Pattern reinforced: **Controller body record MUST mirror Command record fields** khi Command thêm optional params — Mig 28 + Mig 31 cumulative thêm 3 fields nhưng Controller body record chưa update → silent drop bug. Stats final S23 t6: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · **111 test pass unchanged** · 47 gotcha · 20 memory · 6 skills · 4 sub-agents (Investigator FE wire + CICD Monitor verify spawns). CHƯA push remote — chờ CICD verify cuối.)
**Last updated:** 2026-05-15 (Session 23 turn 8**🧹 Plan R: Cleanup destructive prod database — phiếu test + workflow ko ghim**. Bro UAT confirm Plan P+Q wire OK + chỉ thị "OK Tao thấy tạm ổn rồi đấy, mày xóa hết các phiếu test cũ đi nhé, các quy trình cũ ko ghim cũng xóa hết đi. Cho gọn đẹp." 🟦 Investigator pre-flight audit prod ~64K spawn confirm scope: 28 PE active + 7 soft-deleted + 15 V2 workflows IsUserSelectable=false + 2 V1 workflows IsActive=false. FK Restrict gotcha: PE.ApprovalWorkflowId Restrict → phải hard-DELETE PE trước (soft-delete KHÔNG release FK). Entity extend `BaseEntity` (workflow) KHÔNG hỗ trợ soft-delete. Bro chốt Option A (Recommended) qua AskUserQuestion. Em main execute 6 steps qua sqlcmd ssh vietreport-vps: (1) BACKUP `SolutionErp_pre_cleanup_2026-05-15.bak` 18.5MB qua `scripts/plan-r-backup.sql` upload scp + sqlcmd -i (workaround SQL Express no COMPRESSION + no RESTORE VERIFYONLY permission cho vrapp). (2) Script `scripts/plan-r-cleanup.sql` 3 BEGIN/COMMIT TRANSACTION + SET QUOTED_IDENTIFIER ON (filtered index Mig 29+ require). (3) DELETE 35 PE rows (28 active + 7 soft-deleted, cascade ~446 child: 42 Details + 49 Suppliers + 64 Approvals + 238 Changelogs + 10 Attachments + 43 LevelOpinions). (4) DELETE 15 V2 unghim (cascade ~140 Steps+Levels). (5) DELETE 2 V1 inactive (cascade ~37 Steps+Approvers). Total: **52 rows + ~600 cascade child deleted**. Post-cleanup state: **0 PE · 2 V2 workflows ghim** (`QT-DN-V2-001 v16` + `QT-DN-PA-V2-001 v2`) · **2 V1 workflows active** (`QT-DN-A v3` + `QT-DN-B v1`). Smoke verify BE alive post-cleanup: 3/3 endpoints 200 (auth login + PE list + V2/V1 workflow list) → KHÔNG crash startup (Plan F precedent S22 avoid được — V1 active workflow giữ nguyên). Multi-agent ROI: Investigator catch FK Restrict gotcha + recommend backup mandatory + 3 Option compare — saved em main hard-delete without backup risk. Stats final S23 t8: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · 111 test unchanged · 47 gotcha · 20 memory · 6 skills · **0 PE phiếu test + 4 workflow ghim/active** (gọn đẹp UAT clean slate). Pending: bro UAT test workflow mới fresh.)
**Last updated S23 t6:** 2026-05-15 (Session 23 turn 6 — **🎯 Plan P: HOTFIX Controller TransitionPeBody record missing 3 fields — bug ROOT CAUSE thực sự của F1+F2 fail**. 1 commit Plan P atomic. CICD Monitor Run #202 verify Plan O CRITICAL caveat catch: `PurchaseEvaluationsController.cs:267` `TransitionPeBody` record CHỈ có 3 fields (TargetPhase, Decision, Comment) — MISSING 3 fields có trong Command record `TransitionPurchaseEvaluationCommand` (ReturnMode + ReturnTargetUserId + SkipToFinal). `mediator.Send` line 70 cũng drop 3 field. → FE × 2 app SEND ĐÚNG 7 fields qua `api.post(/transitions)` body (Investigator verify FE wire OK 100%) → ASP.NET Core deserialization silently DROP 3 fields ở Controller layer → Handler nhận `ReturnMode=null` + `SkipToFinal=false` → fallback default Drafter mode + F2 không trigger. Bug present 2 NGÀY PROD từ Mig 28 deploy 2026-05-13 — gây TẤT CẢ F1+F2 wire fail từ FE side (Plan N + Plan O fix lookup sites nhưng controller bug block flow trước khi đến lookup site). Fix Plan P: Controller body record +3 field default null/false + `mediator.Send` pass 7 fields + add `using SolutionErp.Application.PurchaseEvaluations.Services` cho WorkflowReturnMode enum import. ~10 LOC BE 1 file. dotnet test **111/111 PASS** (+0 từ 108 — không cần test mới vì Investigator confirm scope BE Controller only, FE wire đúng, Mig 28/31 Domain test đã cover handler logic). Multi-agent ROI: 🟦 Investigator audit FE 2 spawn ~58K confirm hypothesis BE-only scope, avoid em main fix sai cross-stack. 🟩 CICD Monitor Run #202 catch caveat critical lúc verify Plan O — invaluable bug catch chain. Pattern reinforced: **Controller body record MUST mirror Command record fields** khi Command thêm optional params — Mig 28 + Mig 31 cumulative thêm 3 fields nhưng Controller body record chưa update → silent drop bug. Stats final S23 t6: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · **111 test pass unchanged** · 47 gotcha · 20 memory · 6 skills · 4 sub-agents (Investigator FE wire + CICD Monitor verify spawns). CHƯA push remote — chờ CICD verify cuối.)
**Last updated S23 t5:** 2026-05-15 (Session 23 turn 5 — **🎯 Plan O: HOTFIX 4 lookup sites cùng pattern per-NV cascade — Plan N point 9 chỉ catch 1/5 sites**. 2 commits Plan O atomic + docs. Bro UAT 2026-05-15 sau Plan N deploy phát hiện tiếp: Actor NV Test (UAT V2) trong OR-of-N slot 4 NV click "Trả lại Người chỉ định" → toast "Không phải lượt bạn" mặc dù NV Test đúng trong slot. Em main audit grep `FirstOrDefault.*Order ==` toàn project — discovered 5 lookup sites total: Plan N catch 1 (GetPe handler), 4 sites khác CÙNG BUG còn nguyên: (1) `Service.cs:201` `EnsureCanRejectV2Async` actor match guard ← Bug bro UAT ROOT CAUSE, (2) `Service.cs:248` `ApplyReturnModeAsync` read Allow flag từ row đầu, (3) `DetailFeatures.cs:72` F3 `EnsureEditableForDetailsAsync` cùng bug, (4) `Features.cs:311` F4 `AdjustBudgetCommand` cùng bug. 👤 Chủ trì Solo fix 4 sites surgical ~30 LOC + add `Guid? actorUserId` param vào `ApplyReturnModeAsync` (4 param signature change) + caller `TransitionAsync:94` update + 3 regression test mới `PurchaseEvaluationPerNvLookupRegressionTests` (Actor non-first-row OR-of-N trả lại / Outsider không slot ForbiddenException / Actor có flag while others don't AllowsMode). dotnet test **111/111 PASS** (+3 từ 108 baseline Plan N). Pattern reinforced: **5 lookup sites checklist** sau Mig 29 OR-of-N — Plan N chỉ catch 1/5. Memory `feedback_per_nv_permission_scope.md` CRITICAL HOTFIX S23 t5 section updated với 5 sites enum + audit grep checklist. Bug 2 (F2 Duyệt thẳng chỉ đến Phan Văn Chương thay vì Nguyễn Văn Trường BOD) defer follow-up — F2 logic line 483-524 đã đúng, cần verify workflow v14 DB structure thực tế. Stats final S23 t5: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · **111 test pass (+3)** · 47 gotcha · 20 memory (1 entry CRITICAL HOTFIX section reinforced 2 lần) · 6 skills · 4 sub-agents (em main solo Plan O — bug fix reasoning chain cross 4 sites). CHƯA push remote — chờ CICD verify.)
**Last updated S23 t4:** 2026-05-15 (Session 23 turn 4 — **🎯 Plan N: HOTFIX per-NV lookup site discrimination — BE bug critical UAT block**. 2 commits N1+N2 batch atomic + N4 docs. Bro UAT screenshot post-Plan M deploy: Admin Designer tick TRUE 7 flag cho NV Test (UAT V2) slot Bước 2 Cấp 1 workflow QT-DN-V2-001 v12/v13 (4 NV cùng Cấp) — actor login → dialog ✓ Duyệt KHÔNG có checkbox F2 skipToFinal + dialog ← Trả lại CHỈ 1 radio Drafter + KHÔNG có F3+F4 Edit options. 🟦 Investigator audit (~80K spawn) verify Hypothesis B: BE bug `PurchaseEvaluationFeatures.cs:765` `FirstOrDefault(l => l.Order == curLevelOrder)` thiếu discriminator `ApproverUserId == currentUser.UserId` — schema Mig 29 (S21 t5) refactor: 1 row per ApproverUserId (OR-of-N cùng Order) → handler luôn lấy row đầu DB (Lê Văn Bính — Drafter only), bỏ qua admin tick per-NV của actor. Bug PRESENT từ Mig 29 deploy 2026-05-13 nhưng chỉ bộc lộ khi lần đầu admin tick selectively per-NV. 👤 Chủ trì Solo fix N1 (5 LOC BE) + N2 regression test (~200 LOC test) + N4 docs — KHÔNG spawn Implementer vì bug fix reasoning chain. Fix: `var curLevel = curStep?.Levels.FirstOrDefault(l => l.Order == curLevelOrder && l.ApproverUserId == currentUser.UserId) ?? curStep?.Levels.FirstOrDefault(l => l.Order == curLevelOrder);` — actor match per-NV slot, admin/non-approver fallback row đầu (giữ behavior view detail). Test regression `GetPurchaseEvaluationCurrentLevelOptionsTests` 2 method: 4 actor distinct flag profile + admin fallback. dotnet test **108/108 PASS** (+2 từ 106). Pattern reinforced: **Per-NV admin opt-in flag** wire checklist phải bao gồm **9 surface points** (KHÔNG 8) — thêm point 9 "Handler lookup site `currentLevelOptions` MUST discriminate ApproverUserId". Cumulative Mig 29 + 30 + 31 đã wire 8 points đúng nhưng MISS point 9 — bug present 2 days production. Stats final S23 t4: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · **108 test pass (+2)** · 47 gotcha · 20 memory (1 entry reinforced narrative wire checklist 9 points) · 6 skills · 4 sub-agents (1 Investigator spawn). CHƯA push remote — chờ Reviewer/CICD verify.)
**Last updated S23 t3:** 2026-05-15 (Session 23 turn 3 — **🎯 Plan M: Fix F1.OneLevel/OneStep edge case Bước 1 → giữ ChoDuyet (KHÔNG fallback Drafter) + FE label phase TraLai rename**. 3 commits Plan M `c2042ef..4dd6f9c` chuỗi M1→M3→M2: M1 (`c2042ef`) BE Service `ApplyReturnModeAsync` 2 edge case block (line 287-333) → reset (0, 1) giữ Phase=ChoDuyet thay vì fallback Phase=TraLai (semantic mới per bro chốt AskUserQuestion: "Cho phép nhưng vẫn giữ ChoDuyet, clear pointer thôi") + M3 (`508b17a`) FE × 2 app rename `PurchaseEvaluationPhaseLabel[98]` + `PeDisplayStatusLabel.TraLai` + 2 inline literal trong PeWorkflowPanel F1 dialog "Trả lại" → "Cần chỉnh sửa lại" (phase status badge, KHÔNG đụng action verb "← Trả lại" + mode picker "Trả về Người soạn thảo") + M2 (`4dd6f9c`) Tests add 2 edge case test `OneLevel_AtStep1Level1_ResetsToBuoc1Cap1_KeepsChoDuyet` + `OneStep_AtStep1_ResetsToBuoc1Cap1_KeepsChoDuyet` + helper `SeedWorkflowAsync` extend 2 param optional. Multi-agent execution: 🟦 Investigator audit pre-flight catch fact code main path đã đúng (F1.OneLevel/Assignee + F2 + F3 + F4 main path giữ ChoDuyet) chỉ edge case Bước 1 fallback sai + 🟨 Implementer 2 spawns Case 2+3 (M2 + M3) + 🟥 Reviewer pre-commit pending + 👤 Chủ trì M1+M4. Test final: **106/106 PASS** (+2 từ 104, 58 Domain + 48 Infra) — K7 Approver F2 NO cascade. F1.Drafter mode 4 GIỮ NGUYÊN Phase=TraLai semantic (explicit role mode). Memory user-level update 2 entry: `feedback_per_nv_permission_scope.md` reinforcement S23 t3 "edge case không lùi được KHÔNG fallback role khác" + `feedback_uat_skip_verify.md` Plan L lesson "Service refactor semantic BẮT BUỘC update test cùng commit". Stats final S23 t3: **31 mig** (no change) · 59 tables · **~145 endpoints** (no change) · 34 FE pages · **106 test pass (+2)** · 47 gotcha · 20 memory (2 entry reinforced) · 6 skills · 4 sub-agents. CHƯA push remote — chờ Reviewer verdict.)