All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m1s
ContractNStageApprovalTests.cs (NEW, 6 test) cover N-stage logic Mig 20 mirror PeNStageApprovalTests pattern: 1. NStage_FirstInner_NV_Approve_Blocks_Phase_Transition NV cấp 1 → 1 row InnerStepId set, phase chưa đổi. 2. NStage_All_3_Levels_Sequential_Pass_Allow_Phase_Transition NV → PP → TP duyệt lần lượt → 3 rows + phase chuyển. 3. NStage_TP_Bypass_Skips_Lower_Levels_Same_Dept TP có CanBypassReview → 1 transition tạo 3 rows (NV+PP IsBypassed, TP exact match). 4. NStage_Wrong_Department_Throws_Forbidden Actor dept khác inner step's dept → ForbiddenException. 5. NStage_Reject_Clears_InnerStep_Rows_At_Phase NV approve → 1 row. Admin reject → DangSoanThao + RejectedFromPhase set + N-stage rows cleared. 6. LegacyFallback_NoInnerSteps_Uses_2Stage_Logic Contract không pin WorkflowDefinitionId → fallback hardcoded Standard policy → no inner steps → legacy 2-stage Stage=Review row. Phase pair DangKiemTraCCM → DangTrinhKy + role CostControl khớp Standard.Transitions (DangGopY → DangDamPhan trong test ban đầu fail vì policy chỉ cho [Drafter, DeptManager]; switched to phase pair work). Helper SeedWorkflowDefinitionAsync 2 step adjacent (DangGopY + DangDamPhan) + SeedContractAsync với Project + Supplier seed cho FK. FakeChangelogService + FakeContractCodeGenerator stubs (no-op cho tests không cần verify changelog/codegen path). Verify: 89 → **95 test pass** (54 Domain + 41 Infra: 17 codegen + 6 PE WF versioning + 6 PE 2-stage + 6 PE N-stage + 6 Contract N-stage). Pending Chunk E: API check (Workflows controller likely auto-bind via DTO, skip nếu OK). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>