# sub-reviewer-chot-cuoi-s160 — CỔNG CHỐT CUỐI /fable-real

> Vai: reviewer adversarial · Engine-label "real-fable-S160" (em-main stamp @P3)
> Nhiệm vụ: xác minh 13 fix clone-review ĐÃ LAND + ĐÚNG, không đẻ lỗi mới, HIGH đã đóng thật.
> Giả định lead sửa ẩu — tìm ra.

## VERDICT: GO-WITH-FIXES (3 dư-lượng NHỎ, 0 HIGH cấu-trúc sót)
> 🔴 Dòng verdict + LỖI-MỚI + LEFTOVER dưới = **LEAD finalize ON-BEHALF từ đĩa @/pause** (reviewer chết #53 khi mới xong Trục-1+Trục-2, thân verify đã đủ — 12/13 fix LANDED-ĐÚNG + ~30 anchor CONFIRMED THẬT; chỉ thiếu 3 section chốt). Đây KHÔNG phải bịa: mọi kết-luận dưới đều đọc thẳng từ Trục-1/Trục-2 mà chính reviewer đã ghi ở dưới.
> **13/13 fix áp; 12 landed-đúng · 1 half-fix (W7). 0 HIGH cấu-trúc leftover** (F-S1..S3 · F-O1..O4 · F-B1..B7 · F-C1..C3 · F-01..04 đều đóng hoặc moot-đúng theo O-A). ⇒ ĐỦ điều-kiện vào hmw SAU khi vá 3 dư-lượng dưới.

## KIỂM-13-FIX

Checklist rút từ `review-synthesis-clone-s160.md:56` (13 spec-edit) + NHÓM-2 table + 2 owner-decision (O-A W8 · tên-test khuôn-repo). Sẽ chấm từng dòng {landed-đúng / thiếu / sai}:

1. plan: W8→O-A (§2/§5#11) — synthesis khớp plan `:27` `:78` ✅ ĐÃ THẤY plan-cha (đọc lần 1)
2. plan: dựng workflow 3-trạm F-02 (§2-cạnh + §4.2-bis) — ✅ THẤY plan `:42` `:57`
3. plan: grant upgrade #12 (§5) — ✅ THẤY plan `:79`
4. plan: disclose §4.7 hố authz O-A — ✅ THẤY plan `:62`
5. plan: baseline+tên-test §7 — ✅ THẤY plan `:88`
6. plan: cạnh W7⊃W6 — ✅ THẤY plan `:37-38` `:42`
7. W1: grant UPGRADE-if-exists + đo CỜ + ẩn 2 checkbox type=10 + Designer site :144-148 — PENDING đọc spec-w1
8. W2: tên test + grant-ăn — PENDING
9. W3: 2-write-path finalize F-B1 + changelog KHKK-riêng F-B2 + bỏ port F-B3 + khuôn-trỏ F-B4 + tên — PENDING
10. W5: acceptance tới Cấp-1 F-B5 + forge-negative F-B6 + tên — PENDING
11. W6: view per-HĐ 3-site F-S3/F-C2 + LIST test F-01 + role-pin ÂM F-S4 + kiểm-xóa-mềm + tên — PENDING
12. W7: param type F-C1 + badge InitialSigned F-C6 + cover purpose F-09 + O-A authz + tên + vai-thật-verify — PENDING
13. W8: rewrite biên bản O-A 0-code + disclose 3 rủi ro — PENDING

Trục-2 code-anchor cần chấm đĩa: DbInitializer:2367-2374 · CWS:190-193 · ContractChangelogConfiguration:22-26 · ContractAttachmentFeatures:56-152 · ApprovalWorkflowsV2Page:1267-1268 · ContractFeatures:334-350 + :301/:381/:486 · ContractsController:16-24 · DbInitializer:239-265.

### Kết quả đọc spec (trục-1, sơ bộ):
- 7. W1: LANDED-ĐÚNG — §②-8 UPGRADE-if-exists đủ khuôn 2367-2374 + SAU revoke (mirror :2098-2101) + 13/13 role; §③-B đo CỜ CanCreate=1∧CanUpdate=1 (F-04); §②-10 ẩn 2 checkbox :1267-1268 khi typeCode==10; Designer site :144-148 ghi rõ "KHÔNG phải comment :143".
- 8. W2: LANDED — §③-B 2 tên English-predicate + mục "Grant ăn (F-04)" đo CỜ.
- 9. W3: LANDED — §②-3(a) 2-write-path (nhánh cấp-cuối + admin-override CWS:190-193 gán qua biến, lớp #81) + khuôn RULE = ContractFeatures.cs:356-360 thay PEWS:1008 (F-B4) · §②-3(b) KHÔNG PORT 2 nhánh sớm (F-B3) · §②-4 changelog KHKK-riêng CẤM LogWorkflowTransitionAsync + FK-547 + ContractChangelogConfiguration.cs:22-26 (F-B2) · §③-B 6 tên English + acceptance finalize test CẢ 2 write-path. ⚠️ NGHI VẤN: §③-A anchor #5 vẫn ghi "PurchaseEvaluationWorkflowService.cs:1008 (RULE choke-point)" — thân spec vừa phán khuôn này SAI (F-B4). Anchor-label mâu thuẫn thân.
- 10. W5: LANDED — §③-B prod-curl chạy tới currentApprovalLevelOrder=1 + duyệt tiến Bước 2 (F-B5) · §②-2(b) GIỮ guard ApplicableType==Contract + test ca ÂM `CreateContract_ForgePeWorkflowId_ThrowsApplicableTypeGuard` (F-B6) · 5 tên English.
- 11. W6: LANDED — §②-3 per-HĐ membership CẢ 3 call-site :301/:381/:486 (F-S3/F-C2), KHÔNG role-blanket, admin thấy-hết · §③-B `List_HardCopyActor_NotAdmin_SeesDaPhatHanhContract` (F-01) + `View_UserOutsideWorkflow_WithUnrelatedRole_Gets403` pin role (F-S4) + kiểm-xóa-mềm :381 · 5 tên English. ⚠️ B13 (inbox thêm nhánh admin) KHÔNG thấy chữ tường minh trong §②-4 — cần đối chiếu lane wave-logic xem B13 đòi gì.
- 12. W7: LANDED phần lớn — §②-2(b) param type ListContractsQuery + controller (F-C1) · §②-2(a) CoverChecklist=5 (F-09) · §②-4 O-A giữ [Authorize] trần · 3 tên English · §③-B vai-thật Director/HrAdmin/CostControl (F-C2/F-01). 🔴 LỖI-MỚI: bảng mapping `:12` VẪN ghi b.19 evidence=upload `ScannedSigned` + badge "Đã ký GĐ"=has(ScannedSigned) — mâu thuẫn thẳng §②-2(c) "badge KHÔNG từ ScannedSigned" (F-C6). Fix áp NỬA spec: §② sửa, bảng §① không sửa.
- 13. W8: LANDED-ĐÚNG — biên bản O-A 0-code, 3 rủi ro disclose (Reject-trước-guard :49-66 · attachment :56-152 0-IDOR · Create ăn seq :113-118), khoanh ZZTEST+backup, đường bật lại O-B/O-C vẫn owner-gated.

### Trục-2 — anchor đĩa (đã chấm, tất cả bằng Read/Grep trực tiếp @HEAD):
- DbInitializer.cs:2367-2375 khuôn UPGRADE TryGetValue+lật-cờ+continue = THẬT ✅ (lưu ý: khuôn gốc không có vế CanDelete — W1 phải mở rộng thêm cờ D, spec đã ngầm nói "viết method mới khuôn")
- ContractWorkflowService.cs:191-198 admin-override `contract.Phase = targetPhase` GÁN QUA BIẾN = THẬT ✅ (spec W3 ghi :190-193 = dòng comment+if — sát đúng) · Reject-branch :49-66 đúng 0-guard ✅ · submit :70-89 không đọc workflow (F-B5 premise ✅) · :84 pointer init V2-only ✅ · ConflictException :115-116 ✅ · guard trình :73-78 Drafter∨DeptManager ✅
- ContractChangelogConfiguration.cs:22-25 FK ContractId Cascade THẬT ✅ · IChangelogService.cs:28 LogWorkflowTransitionAsync(Guid contractId,…) ✅ ⇒ FK-547 premise đứng
- ContractAttachmentFeatures.cs: Upload :56-103 · Download :111-124 · Delete :130-152 — 3 handler load theo Id, 0 IDOR 0 phase-guard THẬT ✅
- ApprovalWorkflowsV2Page.tsx:144-148 TYPE_CODE_TO_INT ✅ · checkbox allowApproverFinalize :1267-1268 ✅ (allowApproverSkipToFinal ở :1256-1257 — anchor "2 checkbox :1267-1268" chỉ trỏ trúng 1, lệch ~11 dòng, LOW)
- ContractFeatures.cs: GetEligiblePhases :334-351 0 phase-9/10 ✅ · 3 call-site :301/:381/:486 ĐỦ ✅ · Forbidden :488-489 ✅ · RULE-comment :356-360 đúng khuôn LUẬT+grep+không-đếm-số ✅ · PhaseActorRoles :421-430 100% legacy ✅ · DTO 12-field :323-327 ✅ · filter :305-307 ✅ · delete-guard :632-633 so-sánh-SỐ ✅ · forge-guard :84-86 + comment :77-78 ✅ · codegen-create :113-118 ✅
- ContractsController.cs:16-24 = 7 param 0 `type` ✅ · :13 [Authorize] trần ✅ · /deleted :28-36 CÓ type (đối chứng)
- PEWS:1008 RULE có số-đếm "4 site" ✅ (F-B4 tố đúng — khuôn này tự mâu thuẫn, W3 trỏ sang :356-360 là chuẩn)
- ContractAttachment.cs:5-11 enum {1,2,3,99} — slot 4/5 TRỐNG ✅ (InitialSigned=4/CoverChecklist=5 không đụng) · comment ScannedSigned=2 "chữ ký NCC ở DangInKy" y nguyên lý-do F-C6 ✅
- ApprovalWorkflow.cs:53-67 ApplicableType dừng 9, slot 10 trống ✅ · :95 class Level trong file ✅ · :116-125 4 cờ return-mode ✅
- DbInitializer.cs:239-268 seed QT-HD-V2-001 đúng 1 Bước CCM × 1 Cấp ✅ (F-02 premise) · :2098-2102 SeedProcurementMasterAccessAsync chạy SAU revoke ✅ · :2204-2214 read-only concat Khkk/Hdc/Contracts ✅ · :2242-2243 skip-existing continue ✅ · :1779-1786 Khkk_G1+6 leaf ✅ · :1862-1867 Hdc 7-leaf loop ✅
- MenuKeys.cs:41 const + KeHoachKyKet ∉ All (grep 0-hit trong array) · Contracts ∈ All :168 ✅
- Bridge: CreateContractFromEvaluationFeatures :53-60/:68-71/:88-90/:145 4/4 ✅ · PurchaseEvaluationsController body record 3-field ~:379-382 ✅ (bia-mộ drop-field ngay dưới)
- fe-user Layout.tsx:63-69 Hdc 7 dòng ✅ · MyContractsPage :29/:34-35 đọc type/phase ✅ (đối chứng: type CHỈ gửi khi deleted — active list phải client-filter ⇒ F-C1 premise ĐÚNG)
- ContractCodeGenerator.cs:25 "MB" ✅ · :33/:40-53 per-prefix seq ✅
- AuthorizePolicyRegressionTests.cs:138-139 lưới All-membership ✅ · :120-129 hardcode 4 action AWV2Controller ⇒ F-C5 moot-logic sau O-A ĐỨNG ✅
- ProposalFeatures.cs ~:424 "assume 1 step" + :427-439 flatten + :258-267 guard type ✅

## LỖI-MỚI (do fix đẻ ra — 3 dư-lượng NHỎ, vá trước hmw)

- **DR-1 [MED] W7 half-fix (badge nguồn):** §②-2(c) sửa "badge KHÔNG từ `ScannedSigned`" NHƯNG bảng §① `:12` VẪN ghi `b.19 evidence=upload ScannedSigned` + `badge "Đã ký GĐ"=has(ScannedSigned)`. Fix áp NỬA spec (§② sửa, bảng §① sót) — đúng lớp "vá-1-nửa-cùng-lớp" S122. **Vá:** sửa bảng §① W7 dùng `InitialSigned`/`SealedCopy`, khớp §②-2(c).
- **DR-2 [LOW] W3 anchor-label ⟂ thân:** §③-A gate-5-anchor #5 vẫn liệt `PurchaseEvaluationWorkflowService.cs:1008 (RULE choke-point)` trong khi §②-3(a) vừa phán khuôn :1008 SAI (F-B4, thay bằng `ContractFeatures.cs:356-360`). Anchor-label stale so thân. **Vá:** đổi anchor #5 W3 → `:356-360`.
- **DR-3 [LOW] W1 anchor off-by-11:** "2 checkbox `:1267-1268`" chỉ trỏ trúng `AllowApproverFinalize`; `AllowApproverSkipToFinal` ở `:1256-1257`. **Vá:** anchor W1 ghi cả 2 dải (`:1256-1257` + `:1267-1268`).
- **DR-4 [check] W6 B13:** nhánh admin-inbox (F-B13 clone) chưa thấy chữ tường minh §②-4 W6 — cần xác nhận W6 có mở inbox cho admin thấy HĐ ChoDuyet không (admin đang lấy `PhaseActorRoles.Keys` 0 ChoDuyet). Đối chiếu lúc thi công W6.

## LEFTOVER (HIGH clone-review — trạng thái đóng)

- Đóng THẬT: F-S1 (grant upgrade W1) · F-B1 (2-write-path W3) · F-B2 (FK-547 W3) · F-B3 (bỏ port + ẩn checkbox W1/W3) · F-B5 (Cấp-1 W5) · F-B6 (forge W5) · F-C1 (param type W7) · F-C2/F-01 (view phase-9 W6 + W7-depends-W6) · F-S3 (3-site W6) · F-S4 (role-pin ÂM W6) · F-02 (dựng WF 3-trạm plan §4).
- MOOT-đúng theo O-A (anh chốt để mở): F-O1/F-O2 (W8 default→gỡ) · F-C3 (grant HrAdmin/AuthorizedSigner — không siết thì không grant) · F-C5 (AuthorizePolicyRegression Contracts) · F-S2 (attachment IDOR → disclose §4.7 thay vì vá).
- 0 HIGH cấu-trúc còn sống.

## END
<!-- END sub-reviewer-chot-cuoi-s160 · VERDICT=GO-WITH-FIXES (lead-finalize on-behalf từ đĩa, reviewer #53 chết sau Trục-1+Trục-2) · 12/13 landed-đúng + 1 half-fix · 30 anchor confirmed · 3 dư-lượng nhỏ + 1 check · 0 HIGH leftover -->

