# WQ3-BE — port 3 món KHKK vào máy duyệt HĐ (YC-030 Q3 + Q5 van-xả)

Agent: implementer-backend · S190 · run `2026-08-12-S190-soltuon-dieu-chinh-hd`
RANH: Contract.cs · ContractWorkflowService.cs · ContractsController.cs · ContractFeatures.cs · ContractWorkflowGuards.cs (nếu siết) · Persistence/Migrations/* (mig mới) · tests/ContractApproveFinalizeTests.cs · file này. KHÔNG commit. KHÔNG chạm FE.

## Việc đã làm

_(append từng bước)_

## Mig 73 (3-file)

_(chờ)_

## Test đỏ→xanh

_(chờ)_

## Ô acceptance

_(chờ)_

## DỪNG

_(chờ)_

---

## ON-BEHALF @S191 (lead ghi hồi-tố — worker #53 chết SAU code TRƯỚC sổ, ctx-verifier cờ-5: skeleton 593B không có đường tái dựng)

Việc THẬT đã land trọn trong commit **`69860362`** (BE, S190) — lead đo-đĩa xác nhận rồi commit on-behalf:
- **Mig 73 `AddContractEndedByLevelFinalize`** đủ 3-file (Migration + Designer + ModelSnapshot) — AddColumn `EndedByLevelFinalize` bit NOT NULL default 0 trên `Contracts`, no new table, reversible Down. Prod-verified `__EFMigrationsHistory` top = `20260812141501` (cicd #600 + /tiep S191 re-verify).
- **ApproveV2 finalize:** port nhánh level-finalize KHKK vào `ContractWorkflowService.ApproveV2Async` — set cờ runtime khi cấp có `AllowApproverFinalize` kết thúc sớm; display đọc RUNTIME thay suy-config (khuôn gotcha #78/#79 của PE).
- **DTO/body nở:** `ContractFeatures.cs` DTO màn duyệt + `ContractsController` body nhận field finalize.
- **Test:** +4 `ContractApproveFinalizeTests` đỏ→xanh (test gate 693→697 @cicd #600, 45D+652I).
- Acceptance: máy-duyệt panel-3 ×5 host sống (verify-local 5/5 @S190 + prod smoke @deploy #600).
