# W2-SYNTHESIS — Wave W2 KHKK: CRUD phiếu nháp + căn cứ b.8-9 + FE 3 page ×2 app (S161, 2026-07-29) — VERIFIED

> Lead-verified synthesis (đóng run). Chi tiết: 4 sub-md + cicd-verify cùng cấp.

## KẾT QUẢ: W2 SHIP PROD — cicd VERDICT=PASS 6/6, commit `6cbc6ad` (20 file, +5.020/−23)

- **BE:** mega-file `ContractSigningPlanFeatures.cs` (Create 4-rào + auto-Lines snapshot per-winner + MaKeHoach @CREATE + UpdateDraft null-safe + Get/List/inbox-precompute-V2/deleted + Dossier + Attachments + Delete allow-list M6 + picker) + Controller **15 action policy per-action 15/15**. 4 quyết D1-D4 lane khai → lead duyệt cả 4.
- **FE:** 3 page + types ×2 app SHA-pair · 6 leaf `Khkk_*` hết ComingSoon · WfView 2-app-2-đường (user=matrix?type=10 whitelist+10 · admin=Designer deep-link) · root `KeHoachKyKet` → `/khkk/list`.
- **Test:** 566 → **574/0** (+8: 2 PIN + 6 acceptance — authz reflection ĐỘNG + không-đốt-mã-khi-409 + fixture-có-interceptor).
- **Review:** PWF **12 finding (3 CRIT · 5 MAJ · 4 MIN)** → **11 FIXED cùng lượt + 1 GIỮ** (F-10). Prod: picker trả PE thật `PE/2026/A/045` — đường ống sống end-to-end.

## BÀI ĐẮT NHẤT WAVE — "hợp-đồng 2-lane-song-song vỡ 6 điểm, mọi máy xanh"
2 lane viết FE↔BE song song từ CÙNG spec ⇒ 6 điểm đứt (route picker · `peId` body · dossier planId · PUT-vs-POST · `peTenGoiThau` · `winnerSupplierNames`) mà tsc + build + 574 test đều KHÔNG thấy; F-1/F-6 còn **che nhau** (mảng rỗng do 404 làm crash chưa lộ). Lập luận D1 của BE ("FE đọc cùng spec sẽ khớp") = **lời khai là giả định, không phải phép đo** — FE thực tế theo convention repo. ⇒ Luật cho wave sau: **spec-là-hợp-đồng chưa đủ — sau khi 2 lane land phải có bước ĐỐI CHIẾU ROUTE+FIELD từng cái trên đĩa** (reviewer trục-1 chính là bước đó; cân nhắc đưa thành checklist §③ chuẩn cho W3/W5/W6/W7).

## An ninh: F-8/F-9 vá — "list bịt mà detail mở = rào thành UX"
Detail + download/view 0-rào trong khi twin PE có guard + luật nháp-riêng-tư S89 ⇒ `EnsureCanViewAsync` (owner ∥ Admin ∥ [rời-nháp ∧ wf-approver]) áp 2 site.

## VẬN HÀNH — #53: 4/4 lượt spawn chết, THIỆT HẠI 0 BYTE
BE 16.5KB sub-md (tự mở 5 anchor + grep-cùng-lớp 3 site khi lead giao 1) · FE 4.5KB + 4 file land · test 3KB + 8 test land · reviewer 13.9KB ghi-từng-trục · cicd 7.9KB tới PHÉP 4. Mọi phần đuôi = lead solo theo sub-md. Ghi-đĩa-từng-mục tiếp tục là biến số quyết định.

## TỒN SANG WAVE SAU
1. **F-10** upload/delete-attachment no-owner-check = lỗ CHUNG khuôn PE → bịt ĐỒNG BỘ 2 module 1 đợt riêng — **cần anh gật** (đụng PE prod).
2. Dựng tay workflow type-3 + type-10 3-trạm qua Designer (trước W5; type-10 giờ dựng được — prod đã nhận type 10, picker có PE chờ).
3. Tài khoản UAT non-Admin (carry từ W1).
