[CLAUDE] Docs: S162 closeout - cay 4-folder GD ship prod + bookend-close 5 vong/10 vai
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m54s

- Cay 4-folder giai doan duoi tung goi thau (bfc7b79, cicd PASS 5/5 Run #432)
- Bookend-close: H1 PASS_WITH_FLAGS · H2 GATE-FAIL 4 · H24 20 FLAG · trio MIXED
  · ring1 26D/2T · ring2 19D/1T · harness-audit 43D/4T · ctx-audit TRUOT 7 FLAG
- Lead va trong phien: F-01/F-02/F-04 + A1 archive + A2 distill + skill KHKK
  + comment mirror self-ref (SHA-pair 6/6 giu, build x2 EXIT 0)
- MIND-5 = refresh @closeout dau tien (nhip thu 5, theo de ctx-audit)
- STATUS 3 row canonical + dong CURRENT · HANDOFF 6 slot danh so (54)-(59)
- gotcha #85 · error-ledger E-015/E-016 + AS-19/AS-20 · Phase 12 roadmap
- 4 errata khai thang: tally view-stale-count thoi 1 · enum thieu 1 class
  · tong L1 lech 54 B · A2 tren trigger duong-gia (R10)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-30 15:13:18 +07:00
parent bfc7b79f72
commit e5123ff5e1
52 changed files with 2221 additions and 157 deletions

View File

@ -1376,6 +1376,16 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
---
### 85. Menu-key OR-gate FE ≠ policy per-action BE — gate rộng hơn endpoint ⇒ 403 rải khắp UI (Session 162)
**Triệu chứng (chưa kịp xảy ra trên prod — reviewer bắt trước ship):** cây 4-folder gate quyền GĐ2 bằng `['Khkk_List','Khkk_G1','KeHoachKyKet'].some(can)`, nhưng endpoint `/contract-signing-plans` gắn `[Authorize(Policy="KeHoachKyKet.Read")]` (`ContractSigningPlansController.cs:36`) `MenuPermissionHandler.cs:40` **so khớp CHÍNH XÁC 1 key** KHÔNG kế thừa cha, KHÔNG OR key con. role `Khkk_List=1` `KeHoachKyKet=0` sẽ: FE mở cổng gọi API **403** folder GĐ2 hiện "—" **dưới MỌI gói thầu**, claim "gate trước fetch 0 rác 403" **vỡ**.
**Vì sao dễ mắc:** luật *"gate phải OR nhiều key"* **ĐÚNG cho tầng HIỂN THỊ** `GetMyMenuTreeQuery.cs:61-96` trả node khi `CanRead=true` **hoặc có con CanRead** nên root thể tồn tại với `canRead=false`. Người viết mang nguyên luật đúng-ở-tầng-này sang **tầng API-authz** nơi sai. Đây mặt thứ hai của #82 (menu-hiện API-mở); lần này **menu-hiện rộng hơn API-cho**.
**Fix:** gate mỗi query bằng **đúng key policy của endpoint** (`['KeHoachKyKet']`). Endpoint chỉ `[Authorize]` trần (`/contracts` #82 còn treo chủ đích) thì OR key hiển-thị **vô hại** không policy per-action để đá. Trước khi wire gate: **mở controller đích đọc attribute**, đừng suy từ cây menu.
**Đo trước khi tin:** Dev DB 13/13 role đều `Contracts=1 ∧ KeHoachKyKet=1` ca này **chưa lộ**; chờ đúng 1 lần chỉnh ma-trận quyền. Lớp lỗi "chưa vỡ dữ-liệu hiện tại may mắn" phải ngay, không đợi triệu chứng.
## Checklist debug bug mới
1. Build pass không? fail check using + package version compat