From 5cbf516a78c867832b4c95a39a178c50ae8d4fb2 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Fri, 15 May 2026 14:11:56 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20Scripts=20Docs:=20Chunk=20R=20?= =?UTF-8?q?=E2=80=94=20Cleanup=20destructive=20prod=20database=20(52=20row?= =?UTF-8?q?s=20+=20~600=20cascade=20child)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- docs/HANDOFF.md | 4 +- docs/STATUS.md | 3 +- ...s23-turn8-plan-r-cleanup-prod-test-data.md | 167 ++++++++++++++++++ scripts/plan-r-backup.sql | 11 ++ scripts/plan-r-cleanup.sql | 98 ++++++++++ 5 files changed, 281 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/sessions/2026-05-15-s23-turn8-plan-r-cleanup-prod-test-data.md create mode 100644 scripts/plan-r-backup.sql create mode 100644 scripts/plan-r-cleanup.sql diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 6be5254..c75f46c 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -1,6 +1,8 @@ # HANDOFF — Brief 5 phút cho session tiếp theo -**Last updated:** 2026-05-15 (Session 23 turn 6 — **🎯 Plan P HOTFIX: Controller TransitionPeBody record missing 3 fields — bug ROOT CAUSE thực sự F1+F2 fail**. CICD Monitor Plan O Run #202 catch CRITICAL caveat: Controller `TransitionPeBody:267` MISSING ReturnMode + ReturnTargetUserId + SkipToFinal. Investigator audit FE confirm: FE × 2 app mirror SEND ĐÚNG 7 fields qua `api.post()` — BE drop tại Controller body record + mediator.Send line 70. Bug present 2 ngày prod từ Mig 28 deploy 2026-05-13 → 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. Plan P fix BE-only ~10 LOC: TransitionPeBody +3 field default null/false + mediator.Send pass 7 fields + using import WorkflowReturnMode namespace. **111/111 PASS unchanged**. Pattern reinforced: Controller body record MUST mirror Command record fields. Multi-agent ROI: Investigator avoid cross-stack fix sai + CICD Monitor catch root cause invaluable chain. Stats: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · **111 test** · 47 gotcha · 20 memory · 6 skills.) +**Last updated:** 2026-05-15 (Session 23 turn 8 — **🧹 Plan R: Cleanup destructive prod database**. Bro chốt sau Plan P+Q wire OK: "xóa hết phiếu test + quy trình ko ghim". Investigator pre-flight audit ~64K confirm scope 28 PE active + 7 soft + 15 V2 unghim + 2 V1 inactive. Backup mandatory `SolutionErp_pre_cleanup_2026-05-15.bak` 18.5MB. Hard-DELETE 52 rows + ~600 cascade child (PE child + workflow Steps+Levels+Approvers). Post-cleanup: **0 PE · 2 V2 ghim · 2 V1 active**. Smoke verify 3/3 endpoints 200 — BE healthy. Stats: 31 mig · 59 tables · ~145 endpoints · 111 test · 47 gotcha · 20 memory · 6 skills. UAT clean slate. Bro test workflow 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ự F1+F2 fail**. CICD Monitor Plan O Run #202 catch CRITICAL caveat: Controller `TransitionPeBody:267` MISSING ReturnMode + ReturnTargetUserId + SkipToFinal. Investigator audit FE confirm: FE × 2 app mirror SEND ĐÚNG 7 fields qua `api.post()` — BE drop tại Controller body record + mediator.Send line 70. Bug present 2 ngày prod từ Mig 28 deploy 2026-05-13 → 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. Plan P fix BE-only ~10 LOC: TransitionPeBody +3 field default null/false + mediator.Send pass 7 fields + using import WorkflowReturnMode namespace. **111/111 PASS unchanged**. Pattern reinforced: Controller body record MUST mirror Command record fields. Multi-agent ROI: Investigator avoid cross-stack fix sai + CICD Monitor catch root cause invaluable chain. Stats: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · **111 test** · 47 gotcha · 20 memory · 6 skills.) **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 chỉ catch 1/5 sites**. Bro UAT sau Plan N: Actor NV Test trong OR-of-N click "Trả lại Người chỉ định" → "Không phải lượt bạn" mặc dù đúng slot. Em main grep audit phát hiện 5 lookup sites cùng bug, Plan N chỉ catch 1. Plan O fix 4 sites còn lại: Service.cs:201 (EnsureCanRejectV2Async = bug bro), Service.cs:248 (ApplyReturnModeAsync read Allow flag), DetailFeatures.cs:72 (F3 guard), Features.cs:311 (F4 AdjustBudget guard). ApplyReturnModeAsync signature +`Guid? actorUserId` 4th param + caller TransitionAsync:94 update. 3 regression test mới `PurchaseEvaluationPerNvLookupRegressionTests`. **111/111 PASS** (+3 từ 108). Pattern reinforced 5 sites checklist + audit grep `FirstOrDefault.*Order ==`. Bug 2 (F2 chỉ đến Phan Văn Chương) defer follow-up — F2 logic đúng, verify workflow v14 DB. Stats: **31 mig** · 59 tables · ~145 endpoints · 34 FE pages · **111 test (+3)** · 47 gotcha · 20 memory · 6 skills.) diff --git a/docs/STATUS.md b/docs/STATUS.md index 029ba13..4d5ee48 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -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.) diff --git a/docs/changelog/sessions/2026-05-15-s23-turn8-plan-r-cleanup-prod-test-data.md b/docs/changelog/sessions/2026-05-15-s23-turn8-plan-r-cleanup-prod-test-data.md new file mode 100644 index 0000000..506b559 --- /dev/null +++ b/docs/changelog/sessions/2026-05-15-s23-turn8-plan-r-cleanup-prod-test-data.md @@ -0,0 +1,167 @@ +# Session 23 turn 8 — 2026-05-15 — Plan R Cleanup destructive prod database + +**Dev:** Claude Opus 4.7 1M (em main solo execute, 1 Investigator pre-flight spawn) +**Duration:** ~30 phút +**Base commit:** `108268a` (Plan Q FE banner fix) +**Final HEAD:** `` (Plan R scripts + docs) + +## 🎯 Trigger session + +Bro UAT confirm Plan P+Q deploy wire OK (Run #203+#204 PASS) + chỉ thị cleanup: + +> "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." + +→ 2 cleanup destructive trên prod database SolutionErp: +- **Scope A:** Phiếu test cũ (PurchaseEvaluation rows tất cả) +- **Scope B:** Quy trình cũ không ghim (ApprovalWorkflowsV2 với IsUserSelectable=false + PurchaseEvaluationWorkflowDefinitions V1 với IsActive=false) + +## 🔍 Investigator pre-flight audit (~64K spawn) + +🟦 Investigator sqlcmd prod audit confirm scope cụ thể: + +**Scope A — 35 PE rows total:** +- 28 active (Phase 3:1 / Phase 6:1 / Phase 7:4 / Phase 10 DaDuyet:20 / Phase 98 TraLai:1 / Phase 99 TuChoi:1) +- 7 soft-deleted (IsDeleted=1 carry from prior sessions) +- Pin scheme: 25 BOTH V1+V2 / 3 V1-only / 0 None +- Cascade khi DELETE PE: 42 Details + 49 Suppliers + 64 Approvals + 238 Changelogs + 10 Attachments + 43 LevelOpinions = **446 child rows** + +**Scope B — 17 V2 + 4 V1 workflows:** + +| Type | Total | Keep | Delete | +|---|---|---|---| +| ApprovalWorkflowsV2 | 17 | 2 (`QT-DN-V2-001 v16` + `QT-DN-PA-V2-001 v2` ghim+active) | 15 (IsUserSelectable=false v2..v15 + PA v1) | +| PurchaseEvaluationWorkflowDefinitions (V1) | 4 | 2 (`QT-DN-A v3` + `QT-DN-B v1` active + PE pinned) | 2 (`QT-DN-A v1` + `v2` inactive) | + +**Critical gotcha findings:** +- PE.ApprovalWorkflowId FK **Restrict** ([PurchaseEvaluationConfiguration.cs:40](src/Backend/SolutionErp.Infrastructure/Persistence/Configurations/PurchaseEvaluationConfiguration.cs:40)) → soft-delete PE KHÔNG release FK → phải HARD DELETE +- ApprovalWorkflow extend `BaseEntity` (KHÔNG `AuditableEntity`) → hard DELETE only, no IsDeleted flag +- Filtered indexes (Mig 29+) require `SET QUOTED_IDENTIFIER ON` cho DELETE statement +- LevelOpinion FK Restrict to ApprovalWorkflowLevel → KHÔNG cascade khi DELETE workflow → phải DELETE PE first + +**Backup constraint discoveries:** +- SQL Express KHÔNG support `BACKUP DATABASE WITH COMPRESSION` +- `RESTORE VERIFYONLY` require sysadmin permission (vrapp KHÔNG có) → verify qua file size + Get-Item + +## 🌳 Plan R 7-step execution + +### Step 1+2 — BACKUP DATABASE + verify file existence + +File: `scripts/plan-r-backup.sql` upload qua scp → sqlcmd -i + +```sql +BACKUP DATABASE SolutionErp + TO DISK = 'C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak' + WITH INIT, STATS = 20, + NAME = 'SolutionErp Plan R pre-cleanup 2026-05-15', + DESCRIPTION = 'Backup before destructive cleanup: 28 PE + 15 V2 unghim + 2 V1 inactive workflows'; +``` + +Output: `Processed 2249 pages in 0.099 seconds (177.413 MB/sec)`. File size: **18,506,240 bytes (~18.5MB)** verified via `Get-Item`. + +### Step 3-5 — DELETE 3 transaction commits + +File: `scripts/plan-r-cleanup.sql` 3 separate BEGIN/COMMIT TRANSACTION blocks + TRY/CATCH rollback per step. + +```sql +SET QUOTED_IDENTIFIER ON; -- filtered indexes require +SET ANSI_NULLS ON; + +-- Step 3: DELETE 28 active + 7 soft-deleted PE (cascade 446 child rows) +DELETE FROM PurchaseEvaluations WHERE IsDeleted = 0; -- 28 rows +DELETE FROM PurchaseEvaluations WHERE IsDeleted = 1; -- 7 rows + +-- Step 4: DELETE 15 V2 workflows unghim (cascade ~140 Steps+Levels) +DELETE FROM ApprovalWorkflows WHERE IsUserSelectable = 0; + +-- Step 5: DELETE 2 V1 workflows inactive (cascade ~37 Steps+Approvers) +DELETE FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0; +``` + +Execute output: +``` +PE active rows deleted: 28 +PE soft-deleted rows deleted: 7 +V2 workflows deleted: 15 +V1 workflows deleted: 2 +``` + +**Total: 52 rows direct + ~600 cascade child = ~650+ rows wiped clean.** + +### Step 6 — Post-cleanup verify + +``` +PE total (expect 0) 0 ✅ +V2 workflow total (expect 2 ghim) 2 ✅ +V2 ghim remaining 2 ✅ +V1 workflow total (expect 2 active) 2 ✅ +V1 active remaining 2 ✅ +``` + +Remaining V2 workflows: +- `QT-DN-PA-V2-001 v2` (ApplicableType=2) — ghim + active +- `QT-DN-V2-001 v16` (ApplicableType=1) — ghim + active + +Remaining V1 workflows: +- `QT-DN-A v3` (EvaluationType=1) — active +- `QT-DN-B v1` (EvaluationType=2) — active + +### Step 7 — BE smoke verify alive post-cleanup + +Plan F precedent (S22): drop V1 workflow → BE crash startup vì PE pin V1 không có V2 fallback. Plan R KHÔNG đụng V1 active (`QT-DN-A v3` + `QT-DN-B v1`) → BE expect healthy. + +```bash +curl -X POST /api/auth/login → HTTP 200 (admin token len 468) +curl /api/purchase-evaluations → HTTP 200 +curl /api/approval-workflows-v2?applicableType=1 → HTTP 200 +curl /api/pe-workflows → HTTP 200 +``` + +→ 3/3 endpoints 200, BE healthy post-cleanup. KHÔNG crash. + +## 📊 Stats Plan R chốt + +| Metric | Trước (S23 t7) | Sau (S23 t8) | Δ | +|---|---|---|---| +| **PE rows** | 35 (28 active + 7 soft) | **0** | -35 | +| **ApprovalWorkflows V2** | 17 | **2** | -15 | +| **PE Workflow Definitions V1** | 4 | **2** | -2 | +| **Total entity rows deleted** | — | **52 + ~600 cascade** | -650+ | +| Migrations | 31 | 31 | 0 | +| Endpoints | ~145 | ~145 | 0 | +| FE pages | 34 | 34 | 0 | +| Unit tests | 111 | 111 | 0 | +| Backup file | — | `SolutionErp_pre_cleanup_2026-05-15.bak` 18.5MB | rollback ready | + +## 🎯 Multi-agent ROI evidence Plan R + +| Spawn | Agent | Cost | Output | Catch | +|---|---|---|---|---| +| Pre-flight audit | 🟦 Investigator | ~64K | 4 SQL queries enum 35 PE + 17 V2 + 4 V1 + FK Restrict gotcha + soft-delete vs hard-delete decision tree + 3 Option compare | **Saved em main hard-delete without backup risk** + catch SQL Express constraint (no COMPRESSION) + catch QUOTED_IDENTIFIER filter index requirement | +| Execute | 👤 Chủ trì | ~self | 2 SQL script files upload qua scp + sqlcmd -i + post-cleanup smoke verify | Iterated 2× SQL constraint fix (COMPRESSION + QUOTED_IDENTIFIER) | + +**Total Plan R cost:** ~64K Investigator + em main solo execute. Multi-agent value: avoid em main hard-delete blind without backup → bro production data loss risk. + +## 📋 Pattern reinforced cross-project + +1. **Destructive operation prod BẮT BUỘC pre-flight audit + backup mandatory** — KHÔNG em main solo blind execute. Investigator catch SQL constraint + FK gotcha + Option compare. +2. **SQL Express limitations** — KHÔNG support BACKUP COMPRESSION + RESTORE VERIFYONLY require sysadmin. Workaround: verify backup file size via Get-Item. +3. **SET QUOTED_IDENTIFIER ON + ANSI_NULLS ON** required cho DELETE statement nếu schema có filtered indexes (Mig 29+). +4. **FK Restrict gotcha** — soft-delete KHÔNG release FK reference. Hard DELETE only nếu cần unblock cascade. +5. **Plan F precedent learn** — KHÔNG drop V1 active workflow (PE pin → BE crash). Plan R giữ V1 active `QT-DN-A v3` + `QT-DN-B v1` → BE healthy. +6. **scp + sqlcmd -i workflow** cho complex SQL trên prod — clean local file upload + execute remote, avoid shell escaping hell qua SSH PowerShell. + +## ⏭ Pending S23 t9+ + +- 🟢 **Bro UAT test workflow mới fresh** — admin Designer tạo workflow mới (nếu cần) + Drafter NV Test tạo phiếu mới test cumulative Plan K → P + Q fix +- 🟡 **Plan B Contract V2 wire (Mig 32+33)** — HIGH priority next, PE V2 pattern proven 4 plan +- 🔍 Discovery #4 ASP.NET enum body deserialization — LOW priority polish (register JsonStringEnumConverter) +- 🔍 Discovery #3 anomaly CI trigger docs-only — 3× reinforced, recommend Investigator follow-up +- 🔧 Gotcha #47 paths-ignore agent-memory — pending + +## References + +- Scripts: + - [scripts/plan-r-backup.sql](scripts/plan-r-backup.sql) — BACKUP DATABASE + - [scripts/plan-r-cleanup.sql](scripts/plan-r-cleanup.sql) — DELETE 3 transactions +- Backup file: `vietreport-vps:C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak` (18.5MB) +- Rules: §destructive operation discipline (pre-flight + backup + verify), `feedback_drastic_refactor_scope` diff --git a/scripts/plan-r-backup.sql b/scripts/plan-r-backup.sql new file mode 100644 index 0000000..ab6f487 --- /dev/null +++ b/scripts/plan-r-backup.sql @@ -0,0 +1,11 @@ +-- Plan R S23 t8 (2026-05-15) — Pre-cleanup backup +-- Bro request: "xóa hết các phiếu test cũ + quy trình cũ ko ghim cũng xóa hết" +-- Investigator pre-flight: 28 PE + 15 V2 unghim + 2 V1 inactive + +-- SQL Express KHÔNG hỗ trợ COMPRESSION. RESTORE VERIFYONLY require sysadmin. +-- Verify backup file qua filesize check sau khi sqlcmd return success. +BACKUP DATABASE SolutionErp + TO DISK = 'C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak' + WITH INIT, STATS = 20, + NAME = 'SolutionErp Plan R pre-cleanup 2026-05-15', + DESCRIPTION = 'Backup before destructive cleanup: 28 PE + 15 V2 unghim + 2 V1 inactive workflows'; diff --git a/scripts/plan-r-cleanup.sql b/scripts/plan-r-cleanup.sql new file mode 100644 index 0000000..6b965bb --- /dev/null +++ b/scripts/plan-r-cleanup.sql @@ -0,0 +1,98 @@ +-- Plan R S23 t8 (2026-05-15) — Destructive cleanup prod +-- Bro request 2026-05-15: "xóa hết các phiếu test cũ + quy trình cũ ko ghim cũng xóa hết" +-- Pre-flight Investigator audit: 28 PE active + 15 V2 unghim + 2 V1 inactive workflows +-- Backup: C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak (18.5MB verified) + +USE SolutionErp; +GO + +-- Filtered indexes require QUOTED_IDENTIFIER ON + ANSI_NULLS ON (Mig 29+ FilteredIndex) +SET QUOTED_IDENTIFIER ON; +SET ANSI_NULLS ON; +GO + +PRINT '=== Plan R cleanup execute START ==='; +PRINT 'Pre-cleanup state:'; + +SELECT 'PE active' AS Entity, COUNT(*) AS Cnt FROM PurchaseEvaluations WHERE IsDeleted = 0 +UNION ALL SELECT 'PE soft-deleted', COUNT(*) FROM PurchaseEvaluations WHERE IsDeleted = 1 +UNION ALL SELECT 'V2 workflow total', COUNT(*) FROM ApprovalWorkflows +UNION ALL SELECT 'V2 unghim (target)', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 0 +UNION ALL SELECT 'V2 ghim (KEEP)', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 1 +UNION ALL SELECT 'V1 workflow total', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions +UNION ALL SELECT 'V1 inactive (target)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0 +UNION ALL SELECT 'V1 active (KEEP)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 1; + +PRINT ''; +PRINT '=== Step 3: DELETE 28 PE active (cascade 446 child rows) ==='; +BEGIN TRY + BEGIN TRANSACTION DeletePE; + DELETE FROM PurchaseEvaluations WHERE IsDeleted = 0; + DECLARE @PEDeleted INT = @@ROWCOUNT; + PRINT 'PE active rows deleted: ' + CAST(@PEDeleted AS NVARCHAR(10)); + + -- Also clear soft-deleted ones for clean slate + DELETE FROM PurchaseEvaluations WHERE IsDeleted = 1; + DECLARE @PESoftDeleted INT = @@ROWCOUNT; + PRINT 'PE soft-deleted rows deleted: ' + CAST(@PESoftDeleted AS NVARCHAR(10)); + + COMMIT TRANSACTION DeletePE; + PRINT 'Step 3 COMMIT OK'; +END TRY +BEGIN CATCH + ROLLBACK TRANSACTION DeletePE; + PRINT 'Step 3 FAILED — rollback. Error: ' + ERROR_MESSAGE(); + THROW; +END CATCH; + +PRINT ''; +PRINT '=== Step 4: DELETE 15 V2 workflows unghim (cascade Steps + Levels) ==='; +BEGIN TRY + BEGIN TRANSACTION DeleteV2; + DELETE FROM ApprovalWorkflows WHERE IsUserSelectable = 0; + DECLARE @V2Deleted INT = @@ROWCOUNT; + PRINT 'V2 workflows deleted: ' + CAST(@V2Deleted AS NVARCHAR(10)); + COMMIT TRANSACTION DeleteV2; + PRINT 'Step 4 COMMIT OK'; +END TRY +BEGIN CATCH + ROLLBACK TRANSACTION DeleteV2; + PRINT 'Step 4 FAILED — rollback. Error: ' + ERROR_MESSAGE(); + THROW; +END CATCH; + +PRINT ''; +PRINT '=== Step 5: DELETE 2 V1 workflows inactive (cascade Steps + Approvers) ==='; +BEGIN TRY + BEGIN TRANSACTION DeleteV1; + DELETE FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0; + DECLARE @V1Deleted INT = @@ROWCOUNT; + PRINT 'V1 workflows deleted: ' + CAST(@V1Deleted AS NVARCHAR(10)); + COMMIT TRANSACTION DeleteV1; + PRINT 'Step 5 COMMIT OK'; +END TRY +BEGIN CATCH + ROLLBACK TRANSACTION DeleteV1; + PRINT 'Step 5 FAILED — rollback. Error: ' + ERROR_MESSAGE(); + THROW; +END CATCH; + +PRINT ''; +PRINT '=== Post-cleanup verify ==='; + +SELECT 'PE total (expect 0)' AS Entity, COUNT(*) AS Cnt FROM PurchaseEvaluations +UNION ALL SELECT 'V2 workflow total (expect 2 ghim)', COUNT(*) FROM ApprovalWorkflows +UNION ALL SELECT 'V2 ghim remaining', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 1 AND IsActive = 1 +UNION ALL SELECT 'V1 workflow total (expect 2 active)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions +UNION ALL SELECT 'V1 active remaining', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 1; + +PRINT ''; +PRINT 'Remaining V2 workflows (ghim+active):'; +SELECT Code, Version, ApplicableType, IsActive, IsUserSelectable, Name FROM ApprovalWorkflows ORDER BY Code, Version DESC; + +PRINT ''; +PRINT 'Remaining V1 workflows:'; +SELECT Code, Version, EvaluationType, IsActive, Name FROM PurchaseEvaluationWorkflowDefinitions ORDER BY Code, Version DESC; + +PRINT ''; +PRINT '=== Plan R cleanup execute END ===';