REVIEW-F1: (đang soi — dòng verdict ghi lại ở §7 khi xong) # Reviewer F-1 — ô-tích opt-out `applyLevelFinalize` panel duyệt KHKK Ghi-đĩa TRONG LÚC SOI (chống #53). Đo từ ĐĨA, HEAD `24ea71e`, diff CHƯA commit. Phạm vi: `git diff -- src fe-user fe-admin` = **5 file M, +137 / −14**. ## §0 Mirror 2 app — chứng bằng blob-SHA của git (KHÔNG tin lời khai) `git diff` in ra index-line của cả 2 app: | Cặp file | blob TRƯỚC | blob SAU | |---|---|---| | `fe-{admin,user}/src/pages/khkk/KhkkWorkflowPanel.tsx` | `e2fa3bc` (cả hai) | `6913182` (cả hai) | | `fe-{admin,user}/src/types/khkk.ts` | `a99658c` (cả hai) | `1ffd79b` (cả hai) | ⇒ 2 cặp **byte-identical cả trước lẫn sau** (git blob = sha1 nội dung) — mirror §3.9 ĐẠT, và không có nhánh "sửa 1 app quên app kia". ✅ ## §1 Ranh giới BE — cờ có tới FE bằng ĐÚNG một đường - `ContractSigningPlanWorkflowLevelDto` (`ContractSigningPlanFeatures.cs:116`) +1 positional `bool AllowApproverFinalize`; **construction site = 1** (`:640`, grep toàn `src/Backend` cho đúng 3 hit: `:116` def · `:132` kiểu List · `:640` new) ⇒ không có site thứ 2 lỡ truyền `false` cứng. - `l.AllowApproverFinalize` đọc thẳng từ `ApprovalWorkflowLevel` của **đúng workflow đã pin** (cùng bảng, cùng row mà `ResolveActingLevel` sẽ chấm lúc duyệt) ⇒ không có nguồn thứ hai. - 0 đổi logic BE: `git diff` trên `src` chỉ 2 hunk, cả 2 nằm trong DTO + projection. ✅ (các mục dưới điền dần)