# ship-synthesis — W7 KHKK GĐ4 "Hợp đồng cứng" 1-MỐC (VERIFIED, lead tổng hợp @S162 2026-07-30) > Wave build 5/5 (W1→W2→W3→W6→W7) của dry-run KHKK. Commit **`3119cb9`** (12 file, +1358/−18) — cicd **PASS 3/3 chân**. ## Giao được gì (đúng chốt @S161 "Upload file cứng lên → Là xem như xong") - **BE** (+31/−4, đo 2 phương pháp — errata BE tự-khai +35): `ListContractsQuery` +`ContractType? type` filter server-side (F-C1/F-05) + DTO `HasSealedCopy` derive `Attachments.Any(purpose=SealedCopy=3)` append-cuối default false. 0 policy mới · 0 migration · attachment endpoints 0-diff (O-A giữ). - **FE ×2 SHA-PAIR** (`C7DCC20B…`): trang `/hard-copies` — list phase=9 hardcode phía gọi + badge bản-cứng + panel upload multipart (`file`+`purpose=3`+`note`) khớp endpoint Contract có sẵn + Ý kiến cấp duyệt readonly + hộp amber "ký/đóng dấu NGOÀI hệ thống". 7 leaf `Hdc_*` re-point `?type=1..7`, coming-soon co-occurrence 0/0. - **Tests**: `ContractHardCopyTests` 3 PIN — suite **587→590/0**; probe vi-phân `_TempMutationProbe.cs` (tạm, đã xoá + verify 2 chiều) 5/5 phân biệt bản-hỏng (`>=DangDongDau`, `>=DaPhatHanh`, bỏ-type, `>=ScannedSigned`, `Any()`); 2 invariant ghim: cờ-không-xét-phase (FE chặn ở phía gọi) + cờ-chết-2-màn (Đã xóa/Hộp thư default false — 3 căn cứ giữ nguyên). ## Chuỗi verify | Cổng | Kết quả | |---|---| | Gate 5-anchor | 5/5 | | Review adversarial | PASS-có-điều-kiện → điều kiện ĐÃ XỬ (FLAG-1 untracked→F-0 gate; FLAG-2/3 comment vá giữ SHA-pair; FLAG-4 UX backlog) | | CI #431 | success ~5m50s · gate **590/590** tách-phần 45+545, delta +3 Infra khớp đúng 3 PIN | | sqlcmd prod | MenuItems **142 GIỮ** · `__EFMigrationsHistory` **69 GIỮ** · tables 96 · pool recycle PID `5576` StartTime 00:23:20 > DLL mtime 00:21:02 | | Bundle ×2 | rotate 4/4 · marker khớp dự-đoán-chốt-trước từng đồng: `hasSealedCopy`=1 · `hard-copies`=10 · DƯƠNG 7 (distinct 1..7) / ÂM 0 · control 3-tầng old-hash+fake-hash→text/html | | Smoke | `?phase=9` 200 · `?phase=9&type=1` 200 · âm `?type=999` **400** ValidationProblemDetails thật · route bịa 404 | ## Treo có chủ đích (KHÔNG phải lỗi) 1. **`hasSealedCopy` per-item UNVERIFIED-LIVE** — prod 0 hợp đồng (sqlcmd CONTRACTS_TOTAL=0) ⇒ `all()` trên N=0 không tính. Tự đóng khi E2E (sau W5) tạo HĐ đầu tiên → re-curl `?phase=9` 1 lần. 2. **§3.1 an-ninh hồ sơ W8**: upload/download attachment Contract 0-rào (hiện trạng O-A anh chốt để mở; W7 thêm lối vào nổi bật nhưng không mở rộng bề mặt lộ). 3. **FLAG-4 UX backlog**: multi-file upload dùng chung 1 `note` + `isPending` chỉ phản ánh mutation cuối. ## Bài học wave (đã ghi run.md + diaries) - Memory-pack slice lead soạn cũng là giả-định — lane BE đo và bác (`IsDeleted` không tồn tại trên `ContractAttachment`). - "Số đoán trúng ≠ số đo được" — test lane tự cắt §5-§8 viết-trước-đo rồi đo lại. - Control ÂM chỉ có nghĩa khi vế DƯƠNG cùng hình-dạng regex trả >0 (regex nháy-kép chết trên bundle backtick — suýt FALSE-CLEAN). - PS5.1 `commit -m @'…"…'@` vỡ native-arg mà `; push` vẫn chạy ⇒ message-có-quote dùng `-F ` + tách commit/push. - #53 ×3 wave này (FE lane, reviewer, cicd) — 0 byte mất nhờ sub-md ghi-từng-mục; cicd còn 2 chân đo-xong-trước-garble, resume nối đúng chỗ. **W7 ĐÓNG ⇒ HẾT wave build được. Còn lại: W5 (cầu KHKK→HĐ) + E2E — BLOCKED chờ anh chốt NGƯỜI DUYỆT 3 trạm (PRO/CCM/CEO trong 18 user prod).**