# sub-d2-be-1 — ĐỢT 2 BACKEND (xóa-by-approver + list "Đã xóa" + menu + test)

> run `2026-07-27-S155-pe-delete-approver` · vai `implementer-backend` · 2026-07-27
> Luật ghi: flush TỪNG PHẦN + tự `wc -c` (run này đã mất 1 diary 0-byte + 7 return).

## 0. Checklist tự theo dõi

- [x] đọc `run.md` mục ĐỢT 2 (hợp-đồng liên-lane) + `spec` PHẦN I mục 4-13, 21-28
- [x] đo nền từ ĐĨA (không tin spec): controller · handler xóa · list IDOR · MenuKeys · DbInitializer
- [ ] A. đường xóa MỚI `/by-approver`
- [ ] B. list `/deleted`
- [ ] C. menu (MenuKeys +2 factory · tree +2 · labelBackfill · 2 danh sách permission)
- [ ] D. test 21-26 + 22b/22c/25b
- [ ] build + test, dán SỐ THẬT

## 1. Nền ĐO TỪ ĐĨA (verify lại, không chép spec)

| Thứ | Vị trí đọc được | Khớp MEMORY-PACK? |
|---|---|---|
| Endpoint xóa CŨ | `PurchaseEvaluationsController.cs:146-151` — `[HttpDelete("{id:guid}")]`, class `[Authorize]` trần `:15` | ✅ |
| Handler xóa CŨ | `PurchaseEvaluationFeatures.cs:1396-1411` — ctor CHỈ `IApplicationDbContext`, guard allow-list `:1404-1406` | ✅ |
| Khối IDOR list | `PurchaseEvaluationFeatures.cs:596-617` (3 điều kiện: Drafter ∥ eligiblePhases ∥ V2-approver + `!= DangSoanThao`) | ✅ |
| Khuôn per-ROW | `PurchaseEvaluationWorkflowService.cs:744-745` `matchingLevel` (fallback `.First()`), guard lượt `:694-720` | ✅ (spec ghi `:859` cho F5 — đây là chỗ ĐỌC cờ) |
| `LogTransitionAsync` | `PurchaseEvaluationWorkflowService.cs:1169-1196` | ✅ |
| `MenuKeys.All` | `MenuKeys.cs:147-165` — 0 `Pe_*` (chỉ root `PurchaseEvaluations` `:153`) | ✅ |
| factory `Pe_*` | `MenuKeys.cs:134-141` (Group/List/Create/Pending/WfView) | ✅ |
| tree menu | `DbInitializer.cs:1867-1878` trong `foreach PurchaseEvaluationTypeCodes` | ✅ |
| upsert chỉ update Order | `DbInitializer.cs:1893-1905` (`continue` sau Order, KHÔNG đụng Label) | ✅ |
| `labelBackfill` | `DbInitializer.cs:1918-1924` | ✅ |
| permission seed ×2 | `DbInitializer.cs:2092-2096` (grant-all-roles) **VÀ** `:2492-2496` (PE defaults) | ✅ |

(đang cập nhật — phần thi công ghi tiếp bên dưới)
