[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

@ -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:** `<pending>` (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`