7.5 KiB
7.5 KiB
REVIEW-1 (Fable, adversarial ĐÚNG-SAI) — S182 khkk-awf-mirror-ncc
Vai:
/fable-real reviewer#1/2 — lens SAI/SÓT/MÂU-THUẪN trên spec DRAFT + 3 invest. Trạng thái: ĐANG ĐỔ RUỘT (skeleton @spawn, Edit liên tục).
VERDICT (điền cuối)
- (pending)
Checklist việc (8 mục từ lệnh)
- 1. W1a deactivate-per-Code — đọc
ApprovalWorkflowV2AdminFeatures.cs:339-343+ grep consumerIsActive - 2. W2b synthetic slice —
ApprovalWorkflowsV2Page.tsx:286-353+ DTOAwTypeSummaryDto:199-213 - 3. W2c lockedCode — PUT đổi Code 409
:539-550+ đường rơi khỏi slice - 4. W1b group-match Submit — phiếu cũ pin lệch
- 5. W1d DELETE 409 — đếm module pin từ ModelSnapshot
- 6. D3 chấm A/B/C — bảng 9-flag, #4 Trả-về-Drafter
- 7. Mâu thuẫn 3 lens
- 8. Sót chung (notification / invalidate keys / optimistic)
GHI NHẬN SAU KHI ĐỌC 4 PIN (trước khi mở code)
- Spec DRAFT 68 dòng, 3 invest đọc đủ. Nghi vấn dựng sẵn để đo:
- (i) W2b: BE
HistorytrongAwTypeSummaryDtochứa TẤT CẢ version hay LOẠI active? Nếu loại →versions.find(v=>v.isActive)chết → active=null giả. PHẢI đọc:199-213. - (ii) W1a P1: scope
w.Code == request.CodeCÓ kèmApplicableType == typeEnumkhông? UNIQUE(Code,Version) là GLOBAL — Code trùng xuyên-type khả thi về schema. - (iii) FE-invest D1 đề xuất scope theo REGEX
^KHKK-N[1-8]$, BE-invest P1 theo typeEnum==10 — 2 công thức KHÁC NHAU (codeQT-KHKK-V2-001rơi vào nhánh nào?). Spec chọn P1 mà không khai lệch lens. - (iv) W1b: rào (v) "code NGOÀI họ → CHO QUA" — extract giữ nguyên lỗ này? Phiếu ChoDuyet đã pin lệch TRƯỚC vá không bị đụng — cần SQL audit prod, spec chưa có.
- (v) W1d: module pin loose-Guid (không FK) → hard-delete THÀNH CÔNG vật lý → dangling pin. Danh sách FK-Restrict của DB-invest chỉ có 3 (PE/Contract/KHKK) — WorkflowApps pins = FK hay loose? PHẢI đếm ModelSnapshot.
- (vi) D3=C: ô #4 Trả-về-Drafter hành-vi = LUÔN-CHO dù cờ tắt → mờ kiểu "chưa áp dụng" là NÓI DỐI CHIỀU NGƯỢC; phải hiển thị forced-true.
- (vii) Acceptance #3 (tạo v02 N1) chạy Ở ĐÂU? Prod = mutate config thật, local = workflow rỗng người. Không có activate-endpoint để rollback IsActive.
- (i) W2b: BE
ĐO TRỰC TIẾP (đợt 1 — AdminFeatures:80-420 + FE page:150-364)
- HELD (i):
AwTypeSummaryDto.History= FULL list mọi version (BE:206-211—versionsdùng cho CẢActivelẫnHistory) ⇒ synthetic slice W2bhistory.filter(code)+.find(isActive)ĐÚNG shape. Ordering: queryOrderByDescending(Version)⇒ slice giữ Version DESC per code — đủ cho render. - HELD: deactivate
:340-343đúng như invest tả:Where(ApplicableType == typeEnum && IsActive). Comment dòng 339 tự khai "only ONE active per type". - Đo thêm:
nextVersion:334-337đã tính theo Code (per-Code sẵn) — chỉ deactivate là per-type ⇒ vá P1 là nhất quán hoá scope với chính hàm. - Đo FE: queryKey
['approval-workflow-v2-overview', selectedTypeInt](:292) — 8 kind nhóm sẽ share key với panel ContractSigningPlan (cùng 10) = cache chung, invalidate:348prefix-match toàn key ⇒ mutation từ panel nhóm tự làm tươi panel type-10 và ngược lại. KHÔNG cần key mới. - Đo FE:
DEFAULT_CODE_BY_TYPE[10]='QT-KHKK-V2-001'(:179) — nút "Tạo quy trình mới" từ panel ContractSigningPlan (không lockedCode) vẫn đề xuất code NGOÀI-họ type-10. Sau P1 (scope theo typeEnum==10 ⇒ per-Code) code lạ này KHÔNG tắt 8 nhóm. Nếu executor lỡ implement theo công-thức FE-invest D1 (regex^KHKK-N[1-8]$) thì code lạ rơi nhánh per-type ⇒ NUKE cả 8 nhóm — 2 công thức KHÁC HÀNH VI, spec phải khoá công thức.
ĐO TRỰC TIẾP (đợt 2 — guards/delete/FK/middleware/scope/fe-user)
- HELD: PUT T2 Code-echo 409 (
:539-541) · CEO-echo (:547-550) · F5/F2-echo (:598-603) · ô Mã FEdisabled={isEdit}(:927) · CEO boxdisabled={isEdit}only (:954— CREATE-mode mở cho MỌI type kể cả 10). - HELD: DELETE handler
:1196-1204= load+Remove+Save, 0 guard; comment:1187-1189tự khai nợ. Middleware chỉ map 5 app-exception (GlobalExceptionMiddleware.cs:32-40),_→ 500. - 🔴 MỚI — pin FK thật: grep
HasForeignKey("ApprovalWorkflowId")snapshot = 4 hit (Steps-Cascade + KHKK/Contract/PE-Restrict). Domain có 8 cột pin (thêm Proposal/Leave/Ot/Vehicle/Travel — ItTicket KHÔNG có) ⇒ 5 module Office pin = LOOSE 0-FK ⇒ DELETE hôm nay với office-pin THÀNH CÔNG vật lý → dangling pin. DB-invest M3 "data KHÔNG mất (DB chặn được)" = SAI cho 5 module này. W1d usage-check là guard DUY NHẤT cho office. - 🔴 MỚI — query filter: PE (
:84) + Contract (:44) + KHKK (:55) đềuHasQueryFilter(!IsDeleted)⇒ đếm-pin naive sẽ BỎ SÓT phiếu xoá-mềm (FK vẫn chặn 547) ⇒ W1d PHẢIIgnoreQueryFilters()cho 3 module này, không thì đúng ca "đã xoá phiếu rồi mà vẫn 500" tồn tại tiếp. - HELD: 8 bảng
*LevelOpinion(8 FKApprovalWorkflowLevelId) khớp claim "CẢ 8". - 🔴 MỚI — W1b unbuildable như viết:
ContractSigningPlanScope=internal static(ContractSigningPlanFeatures.cs:263);InternalsVisibleToCHỈ cóSolutionErp.Infrastructure.Tests(csproj:25). Submit KHÔNG có Application-handler (comment:19— controller gọi thẳng service Infrastructure) ⇒ helper internal KHÔNG gọi được từSubmitAsync. Executor phải chọn: public-guard-class mới (Application) / inline-duplicate / InternalsVisibleTo-Infrastructure. Spec chưa khai. - HELD:
ContractSigningPlanEntityType.Workflow = 4tồn tại + changelog entity đủ cột ⇒ W1c 0-enum-extend. Phase filter {DaDuyet=3, TuChoi=99} đúng tên enum. - HELD: rào (v)
:479-486cho-qua code ngoài-họ LÀ CHỦ ĐÍCH (comment :477-478). UpdateDraft:603-607chỉ EnsureWorkflowTypeAsync. Submit:163-213chỉ check Lines↔group. - 🔴 MỚI — IsActive server-side cho KHKK-create = KHÔNG CÓ: bridge KHKK→HĐ đã vá đòi
IsActive ∧ IsUserSelectable(vá-3,CreateContractFromSigningPlanFeatures.cs:141-147— chính comment nêu "khuôn ContractFeatures thiếu 2 vế ⇒ forge POST pin được quy trình retired"); Create/UpdateDraft phiếu KHKK thì CHỈ check type ⇒ pin bản archived = 200. fe-user KhkkCreatePage:104filterisUserSelectableKHÔNG lọcisActive,:114find(code)ăn theo ordering Version-DESC. Hệ quả SAU W1a: (a) tạo v02 xong, v01 vẫn selectable=true (POST không đụng cờ này) — auto-pin trúng v02 chỉ NHỜ ordering; (b) "Bỏ ghim v02" ⇒ rơi về v01 archived im lặng, KHÔNG chặn tạo như spec mô tả răng nút Ghim. - Grep IsActive consumer (W1a regression): Office features 0 lọc IsActive trên ApprovalWorkflows (mọi hit IsActive = Users/MeetingRooms/OtPolicies/Catalog) · V1
WorkflowDefinitions.IsActivekhông liên quan · consumer THẬT của IsActive-V2: OverviewActive(display) + bridge type-3 vá-3 + FE dropdowns (PE/Contract create lọc client-side). KHÔNG AI resolve "active-per-type-10" server-side ⇒ P1 đổi scope type-10 an toàn, P2 không cần.
FINDINGS
- (đang đổ)
TỔNG HỢP WAVE FINAL ĐỀ XUẤT
- (điền cuối)