[CLAUDE] Docs: S133 closeout — PE budget freeze DaDuyet (STATUS Mig 67/520 + HANDOFF UAT-script 9-carry + gotcha #81-EXT + session-log + close-synthesis dong orphan)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-17 14:27:19 +07:00
parent d4fbced02f
commit e53a69307f
7 changed files with 108 additions and 10 deletions

View File

@ -1348,6 +1348,8 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
**Bài học:** derived-invariant phải re-establish **MỌI mutation đổi tập-nguồn — kể cả DELETE + cascade-delete**, không chỉ write/select. **Enumeration writer trong spec KHÔNG đáng tin** grep độc-lập MỌI `.Remove(` chạm entity chứa field-nguồn (S87/S88 cardinality class mở rộng lên tầng mutation-path: writer-miss read-site-miss). Chỉ **verify adversarial-refute** bắt (invest/review/implement đều sót cùng theo enumeration). Liên-quan #72/#73 (cardinality) + `feedback_cardinality_change_grep_consumers`.
**EXT S133 (instance 2 — indirect-assignment):** snapshot ngân-sách-at-DaDuyet (Mig 67) đặt hook finalize choke-point (`ApplyApprovedPriceOnFinalize` + helper `PeBudgetAccumulator` 4-site) NHƯNG 2 site gán `Phase` TRỰC TIẾP bypass hook: admin-override `PurchaseEvaluationWorkflowService.cs:308` (`= targetPhase`) + seeder `DbInitializer:1323` (`= current`) phiếu vào DaDuyet qua 2 đường này KHÔNG snapshot (frozen=0, display rơi về live đúng bug đang , chỉ nhánh hiếm hơn). Reviewer adversarial bắt pre-commit; em-main + 3 invocation implement đều sót cùng bài enumeration. Fix: site-5 chốt snapshot trong admin-override (comment `[S133 site 5]`) + seeder + test `AdminOverride`. **Meta-class chung với instance 1:** field-đích hook/derive/snapshot grep MỌI assignment-site của field đó (`= targetPhase`, `.Phase =`, seeder, override) chứ không chỉ mutation-API chính-tắc.
### 82. Menu-flag permission grant ≠ quyền API thật — controller gate GET bằng `[Authorize]` trần (Session 118)
**Triệu chứng:** S118 phân quyền role Procurement grant menu `Suppliers` (R+C+U) tưởng "menu hiện = làm được mọi thứ". THỰC TẾ 2 chiều lệch: (1) `PUT/DELETE /suppliers` gate `[Authorize(Roles="Admin,CatalogManager")]` PRO vẫn **403 khi Sửa/Xóa NCC** CanUpdate=1 (chỉ Publish/Import theo policy `Suppliers.Update` ăn); nút Sửa hiện nhưng bấm lỗi. (2) Ngược lại `ReportsController` chỉ `[Authorize]` **trần (KHÔNG policy)** menu bị S92 ẩn nhưng **MỌI user đăng nhập** vẫn gọi `GET /reports/dashboard` lấy tổng giá trị + top NCC/dự án theo giá trị ( URL/API trực tiếp, bỏ qua menu).