# run — YC-032 · Tách HĐ Thầu phụ thành 2 · form document-view · pre-fill 3 tầng

- **run-id:** `2026-08-13-S194-yc032-hd-thauphu-2form`
- **phiên:** S194 (phiên-LOGIC L16, cửa-sổ 3)
- **lệnh owner:** `/fable-clone invest` — ENGINE-ĐẮT lệnh-B, ensemble tier-2, **1 VAI × N lăng-kính**
- **vai:** `investigator-codebase` × 5 lane · `tier:'opus'` (belt-and-suspenders trên worker-tier-pin)
- **mở:** 2026-08-13T22:2x+07:00 · HEAD lúc phóng `4837fffd`

## Đề bài (nguyên văn owner → xem `so-yeu-cau` YC-032)

4 vế: **(1)** tách `01. HĐ Thầu phụ` → 2 menu *(Nhân công & Vật tư)* / *(Nhân công & Thiết bị)* · **(2)** khung form nhập đổi sang **document-view cuộn từ trên xuống** đúng thân HĐ, nội dung lấy từ `SOL-CCM-FO-002.02` / `002.03` · **(3)** **pre-fill 3 tầng** Duyệt NCC → KHKK → điền nốt phần thiếu ⇒ 1 hợp đồng trọn **chỉ để in trình ký** · **(4)** upload bản cứng đã ký → **KHÓA**.
**Phạm vi lượt này:** làm trước **2 HĐ đó** cho owner xem — KHÔNG làm cả 7 loại.

## Recon lead đã chốt TRƯỚC khi phóng (lane khỏi đốt lượt đi tìm)

| Việc | Kết quả đo |
|---|---|
| `ContractType.HopDongThauPhu` | `= 1`, khai ở `src/Backend/SolutionErp.Domain/Contracts/ContractType.cs:5` |
| Họ workflow | `ContractApprovalWorkflowFamily.cs:35` → `HD-TP` "Thầu phụ" (1 trong 7) |
| Policy nhóm | `WorkflowPolicy.cs:155` gộp TP + GiaoKhoan + NCC ⇒ `"Standard"` |
| 2 file form | tồn tại thật: `002.02` **516.608 B** · `002.03` **591.360 B** · 🔴 `.doc` binary (KHÔNG phải `.docx`) |
| Trích `.doc` | ✅ **`antiword` CHẠY ĐƯỢC** (`/mingw64/bin/antiword`) — 002.02 ra **346 dòng**, thấy rõ `ĐIỀU 1..N` + bảng `DANH MỤC HỢP ĐỒNG`. `soffice` KHÔNG có ở đường mặc định. |
| Cảnh báo | `~$...002.02` = file khoá Word ⇒ **owner đang mở bản đó** — CHỈ ĐỌC, cấm ghi đè bản gốc |

## taskList snapshot (5 lane — RUN-TRACE bắt buộc vì ≥3)

| # | label (neo đĩa, khuôn 4 thành-phần) | lăng-kính | file pin (≤3/lane) | artifact |
|---|---|---|---|---|
| 1 | `WF invest lens-taxonomy s194` | tách 2 menu tốn gì: enum mới ⟂ cờ biến-thể | `ContractType.cs` · `ContractApprovalWorkflowFamily.cs` · `WorkflowPolicy.cs` | `sub-investigator-codebase-1.md` |
| 2 | `WF invest lens-formshape s194` | khuôn nhập HIỆN TẠI ⟂ document-view | `fe-user/.../ContractCreatePage.tsx` · `MyContractsPage.tsx` · `ContractDetailContent.tsx` | `sub-investigator-codebase-2.md` |
| 3 | `WF invest lens-prefill s194` | chuỗi kế thừa PE → KHKK → HĐ: field nào ĐÃ chảy | `ContractFeatures.cs` · `ContractDtos.cs` · `IContractWorkflowService.cs` | `sub-investigator-codebase-3.md` |
| 4 | `WF invest lens-hardcopy s194` | bản-cứng 1-MỐC + KHÓA của KHKK W7 — mirror được không | `Domain/ContractSigningPlans/**` · `Application/ContractSigningPlans/**` | `sub-investigator-codebase-4.md` |
| 5 | `WF invest lens-formdoc s194` | ruột 2 file `.doc`: cấu trúc ĐIỀU/khoản + ô cần fill | 2 file `FORM/*.doc` (qua `antiword`) | `sub-investigator-codebase-5.md` |

## Vòng

- [x] P1 scaffold (folder + run.md + taskList snapshot) — **xong**
- [x] P2 phóng ensemble 5 lane — **`wf: wf_5f43c10f-506`** @2026-08-13T22:3x
- [ ] P2b lane trả → cập nhật bảng verdict NGAY khi từng lane trả (bài @S193: ledger đứng yên 45′ ⇒ bookend đã đóng vẫn đọc ra *chưa xong*)
- [ ] P3 lead refute + synthesize (chống đồng-thuận-sai)
- [ ] P4 lead ghi `spec-hd-thauphu-2form-13-08-2026.md` 3 heading
- [ ] P5 báo owner: wave cụ thể + câu cần owner phán

## Verdict lane

| lane | verdict | artifact | ghi chú |
|---|---|---|---|
| 1 lens-taxonomy | **A1 rẻ hơn — 13 site mã sống, ~6/13 by-construction, 0 migration nếu dùng chung `ThauPhuDetails`** | 13.738 B | 🔸 **mục C + D còn `(đang đo)`** — cháy trần lượt; lead đo bù (xem `synthesis §W1`) |
| 2 lens-formshape | **(i) HTML dựng tay làm TRỤC + (ii) docx làm đường XUẤT BẢN IN — 11 field create / 6+4 edit** | 17.570 B | ✅ trọn |
| 3 lens-prefill | **17 ô có nguồn / 5 gõ tay / 2 chưa xác định — nhưng CHỈ 3/17 đã thực chảy tới `Contracts`** | 13.398 B | ✅ trọn |
| 4 lens-hardcopy | **bản-cứng 0 migration (đã có `SealedCopy=3`) · KHÔNG khoá · đường IN đứt 3 chỗ** | 13.713 B | ✅ trọn |
| 5 lens-formdoc | **002.02 = 5 điều / 002.03 = 6 điều / chung 5 — "1 xương chung + 1 lớp delta"** | 26.555 B | ✅ trọn — lane DUY NHẤT return được |

## 🔴 Sự-cố tầng RETURN (ghi làm vết, KHÔNG phải mất việc)

`4/5 lane` báo `agents_empty_result` — *"subagent completed without calling StructuredOutput"*. **Việc KHÔNG mất**: 5/5 lane đã ghi file (85 KB tổng) nhờ luật **ép-ghi-khung-rỗng-lượt-1-2**. Lead thu hoạch bằng **đọc đĩa**, không bằng return. ⇒ đây là bằng chứng vận-hành thứ 2 (sau `ctx-verifier` cùng phiên) rằng **chống-#53 phải thiết-kế ARTIFACT, không phải viết prompt khéo hơn**.
🔸 Lane-5 tự khai 1 lệch: TASK body bảo ghi `-5.md`, footer RUN-TRACE bảo `-4.md` ⇒ trùng tên với lane-4. Lane theo TASK, không đẻ file thứ 2. Đây là `[carry:hmw-subfile-index-collision]` **tái hiện lần nữa** — footer đánh số theo index 0-based.

## Lead refute @P3 — 2 mâu thuẫn phải giải bằng đo, không bằng chọn phe

**M-1 — lane 5 ⟂ lane 2 về "2 form có phải sinh đôi không":** lane 5 nói *1 xương chung + delta*; lane 2 nói *KHÔNG phải sinh đôi, dựng 1-thân-1-cờ là **sai ngay từ giả thiết*** (căn cứ `diff | grep -c '^[<>]'` = 400).
**Thước thứ 3 của lead (so tập DÒNG, không so diff):** `f02` 200 dòng không-rỗng → **133 dòng (66%) có mặt nguyên văn trong `f03`**; `f03` 378 dòng không-rỗng → **245 dòng RIÊNG**.
⇒ **CẢ HAI ĐÚNG MỘT NỬA.** Xương chung có thật và lớn (133 dòng) — nhưng `f03` gấp ~1,9× nên "1 thân + 1 cờ boolean" không chứa nổi. **Chốt: component thân dùng chung + 2 bản LẮP RÁP riêng**, không phải 1-cờ, cũng không phải 2 bản chép tay độc lập.
🔸 Bài: `diff` đếm dòng **không phân biệt** *"khác cấu trúc"* với *"cùng cấu trúc, thêm phần"* ⇒ lane 2 kết luận vượt quá bằng chứng của chính nó.

**M-2 — PHẦN 2 "17 ĐIỀU" đi đâu (lane 3 + lane 5 cùng nêu, không lane nào truy được vì ngoài file-pin):**
Mục lục CẢ 2 file khai `PHẦN 2 — ĐIỀU KIỆN CHUNG` gồm **ĐIỀU 1→17**, thân 2 file **không chứa**. Ứng viên duy nhất = `SOL-CCM-FO-002.04.v01 Dieu kien chung hop dong tron goi.docx`.
**Lead đo (gộp `run` như `DocxRenderer` làm, vì tách run ra chỉ thấy 1 hit — đúng bẫy repo đã tự khai):** bản repo và bản gốc FORM **byte-identical 192.608 B**; `62 w:p · 0 bảng · 40 đoạn có chữ`; đúng **5 ĐIỀU**: 1 Am hiểu · 2 Nội dung công việc · 3 Tiến độ-chất lượng · **4 = "Xử lý khi có tranh chấp" (mục lục gọi là ĐIỀU 16)** · **5 = "Sửa đổi, bổ sung" (mục lục gọi là ĐIỀU 17)**.
⇒ 🔴 **THIẾU 12 điều: 4 Đơn giá · 5 Tiện ích công trường · 6 Phát sinh · 7 Nghiệm thu · 8 TẠM ỨNG & THANH TOÁN · 9 Quyền-nghĩa vụ · 10 Phạt · 11 Chấm dứt · 12 BẢO HÀNH · 13 Bất khả kháng · 14 Thông tin-thông báo · 15 Quy tắc ứng xử.** Bảng tóm tắt PHẦN 1 lại trỏ sang ĐIỀU 2/3/8/10/12 của PHẦN 2 ⇒ **trỏ vào chỗ trống**. Đây là câu **CHẶN vế (2)**: "toàn bộ cái hợp đồng" hiện **không tồn tại đủ** trong tài liệu đã cấp.

## Vòng 2 — `/fable-clone review` (`wf_71a58432-f90`) · 4 lane `reviewer` tier-2

| lane | verdict | artifact | ghi chú |
|---|---|---|---|
| r1-taxonomy | `PASS-WITH-FINDINGS — 10 finding (3 nặng)` | 22.356 B | A1 GIỮ (2 trụ đỡ HELD) · site thật **17** không phải 13 · W1 bỏ sót trọn tầng chi-tiết per-loại |
| r2-formshape | `PASS-WITH-FINDINGS — 9 finding (6 nặng)` | 26.903 B | **W2⟂W3 tranh cột `DraftData`** · `DraftData` 0 validator/0 RowVersion · **mảnh thứ 4: template rỗng sau tách** |
| r3-prefill | `PASS-WITH-FINDINGS — 9 finding (4 nặng)` | 25.058 B | **chuỗi VAT của spec SAI** · **HĐ tự mâu thuẫn tiền, Dev 2/2 lệch** · **5/8 ô master in trắng** |
| r4-plan | `PASS-WITH-FINDINGS — 12 finding (6 nặng)` | 17.931 B | chạy **LẦN 2** (lần 1 chết chỉ ghi khung 758 B) · bác 2 tiền-đề của spec (S-1/S-2) · 3 việc 0-wave |

**Tổng 40 finding / 19 nặng.** Vá ghi ở `spec-…§⑤` (APPEND, không sửa đè §①-④ — giữ vết spec-trước ⟂ spec-sau).

### Sự-cố tầng RETURN vòng 2 (vết thứ 3 cùng phiên)
`r4` lượt 1 mất return **và** chết trước khi đổ ruột ⇒ **file 758 B chỉ có khung**. Đây là ca đầu tiên trong phiên mà **kỷ-luật khung-rỗng KHÔNG cứu được nội dung** — nó cứu được *file*, không cứu được *việc*. Phục hồi = **phóng lại ĐÃ-CẮT-GỌT** (agent lẻ, pin sẵn 3 verdict anh em để khỏi lặp) ⇒ lần 2 ra 12 finding.
🔸 Lượt 2 cũng mất return (`"Updating my diary before returning"`) nhưng **artifact đầy đủ trên đĩa** ⇒ lead thu hoạch bằng đọc đĩa. **3/3 lần garble trong phiên này đều phục hồi trọn** — 2 lần qua đĩa, 1 lần qua resume.

### Lead tự bắt lỗi của chính mình (ghi làm vết, không giấu)
Spec §①-④ có **4 câu SAI** (bảng `§⑤.a`), trong đó 2 câu **đã lỡ nói với owner** trước khi review chạy xong:
1. *"upload bản cứng xong vẫn sửa được HĐ"* — sai, phase 9 đã khoá sửa từ trước.
2. *"W1 và W2 chạy song song được"* — sai, không cặp wave nào song song thật.
Gốc chung của S-1/S-2: lane invest **đọc bộ lọc của một MÀN HÌNH** (`HardCopiesPage` lọc phase 9 + 4 role) rồi suy ngược ra luật BE — mà **BE rộng hơn FE** (`DrafterUserId == userId` là vế OR đầu). ⇒ **Bài: đọc bộ lọc của một màn hình không bằng đọc câu `Where` của truy vấn.**
