# GATE W5 — reviewer (YC-029, commit 2ae62f3f)

> ⚠️ Lane reviewer chết non #53 (40 tool-use, 0 ruột — ca đầu tiên của chuỗi không để lại gì
> trên đĩa). LEAD tự gate on-behalf @S190 bằng đo trực tiếp — KHAI rõ đây là lead-gate, không
> phải reviewer độc lập. Cân nhắc: W5 đã qua 4 tầng kiểm trước đó (13 test T-matrix xanh vòng-1
> · lead-awk thứ-tự 5 nấc · W5c artifact đối-chiếu FE⟂BE từng vế "đọc handler không tin plan"
> · style-gate B4 be2 soi trước khi viết) ⇒ chi phí relaunch 155K > giá trị biên; 3 câu sắc
> còn lại đo được trực tiếp.

## Verdict

**GATE-W5: PASS (lead-gate) — 3/3 câu sắc đo PASS, 2 FLAG treo phán xong, 0 finding mới.**

## Findings (G-1..) — 3 câu sắc đo trực tiếp

- **G-1 Roles shape** ✅ — `ICurrentUser.Roles = IReadOnlyList<string>` (`ICurrentUser.cs:8`);
  khuôn KHKK prod dùng Y HỆT `Roles.Contains(AppRoles.Admin)` (`ContractSigningPlanFeatures.cs:285,298`)
  ⇒ W5b cùng khuôn đã-deploy, không có case-sensitivity drift.
- **G-2 FE isAdmin nguồn thật** ✅ — `ContractDetailContent.tsx:123`
  `currentUser?.roles?.includes('Admin')`; `UserInfo.roles: string[]` TỒN TẠI (`types/auth.ts:5`)
  ⇒ không phải optional-chain-trên-field-ma; render-condition `:125-127` khớp từng vế BE-guard
  (phase-set + isDrafter-null-safe ‖ isAdmin).
- **G-3 hành-vi sau xoá khi host không truyền `onDeleted`** ✅ chấp nhận — detail 404 →
  `ContractDetailPage.tsx:22` placeholder "Không tìm thấy HĐ." (không crash, không toast đỏ đè
  — W5c đã chứng 0 QueryCache onError toàn cục); từ MyContractsPage panel-2: list invalidate
  rụng dòng + panel về placeholder.

## Phán 2 FLAG treo

1. **`reason` dây-chưa-kéo → GIỮ.** Trạng thái Y HỆT khuôn KHKK prod: BE `[FromQuery] reason`
   sống, UI confirm-only không thu lý do (khuôn `KhkkDetailContent:1090`). Đường ống sống
   end-to-end (API gọi được với reason) — khác class ghost-wire (defined-but-unread). Khi nào
   owner muốn thu lý do = 1 việc FE nhỏ, 0 đổi BE.
2. **5 host chưa truyền `onDeleted` → KHÔNG vá NGAY.** Hành vi thay thế (G-3) acceptable.
   Polish "clear selection sau xoá" = nợ nhỏ: `[carry:w5-host-ondeleted]` (5 site đã liệt trong
   sub-b6-w5c-fe.md — fe-user ContractDetailPage:28 · MyContractsPage:282 · InboxPage:347 ·
   fe-admin ContractDetailPage:28 · ContractsListPage:254).
