# run: 2026-08-10-S187-duyet-hd-tu-khkk

goal: Module "Duyệt Hợp đồng" (GĐ3 pipeline) từ KHKK — YC-023 (owner 2026-08-10 @S187).
      Khuôn mirror PE/KHKK cả FE+BE+menu; quy trình duyệt V2 per-LOẠI-HĐ (thầu phụ, nguyên tắc, …);
      phiếu kế thừa từ KHKK ĐÃ DUYỆT (bridge K7 `aaed6992` có sẵn — CreateContractFromSigningPlanFeatures 251 dòng).
      Điều phối owner chỉ định: 2×/fable-real invest (BE ⟂ FE) → 1×/fable-real style-review →
      1×/fable-real review tổng thể + tổng hợp plan → fan-out Opus 5 MAX theo wave.

engine: /fable-real per-invocation (H21 lệnh-A) ×4 — single Fable deep-pass, propose-only, lead ghi spec.

## taskList snapshot
1. [x] invest-BE — XONG @15:44 → `sub-invest-be-fable.md` 26.119 B, §0-§7 + `== HẾT ==` (return garble
       #53 nhưng đĩa TRỌN — 0 mất). Lõi: V2 tái dùng 100% · thiếu = quan-hệ workflow↔loại (PA-A/B/C
       §2d) · 2 bom per-type §2c · phiếu GĐ3 = chính Contract (0 entity mới) · mặc định 0-mig · 7 CHỜ-ANH.
2. [x] invest-FE — XONG @15:41 → `sub-invest-fe-fable.md` 21.981 B, §0-§7 + CHỜ-ANH + `== HẾT ==`
       (garble #53 lượt-1 → SendMessage resume → CLEAN; vai TỰ APPEND diary S187). Lõi: vỏ đủ 42 leaf
       `Ct_*` · khuôn duyệt = KhkkWorkflowPanel owner-trim · per-loại = `?type=N` KHÔNG `:kind` ·
       0 key mới · wave F1-F5 chặn-bởi-BE-DTO · 5 CHỜ-ANH. Mâu-thuẫn 2-lens: F3 inbox — BE §1c đính
       chính S156 STALE (đã vá @W6 S161) ⇒ F3 nghiêng verify-only, giao plan-review chốt.
3. [x] style-review — XONG @15:56 (về NGAY TRONG lúc /pause đang chạy; mốc cũ "16:0x" = CỜ-10 ctx-verifier vá @S188, đĩa mtime 15:56) → `sub-style-review-fable.md`
       `== HẾT ==` · `STYLE-REVIEW: PASS_WITH_FLAGS — 7 flag` (spawn-probe ALIVE ✓ datum slot 73).
       FLAG-1 mâu-thuẫn 2-lens phân xử BẰNG CODE (inbox V2-aware `ContractFeatures:530-593` ⇒ F3 hạ
       verify-only) · FLAG-2 🔴 WAVE MỒ CÔI: F1/F2 cần BE-DTO (reverse-join + currentApproval/
       approvalFlow) mà W0-W5 KHÔNG có wave DTO ⇒ stage C PHẢI thêm wave BE-DTO · FLAG-3 FE §5 cứng
       trục 7-type khi BE#1 treo · FLAG-4 "0 key mới" vs khuôn KHKK kèm 8 key AwV2_* + 32 policy —
       quyết tường minh · FLAG-5/6/7 nit W1/W2/W3. PA-A đúng khuôn deploy nhất (điều kiện gỡ 2 bom).
4. [x] plan-review (reviewer × Fable) — XONG @S188 ~17:05 → `sub-plan-review-fable.md` 29.647B
       `== HẾT ==` (return garble #53 — đĩa TRỌN). 12/12 claim re-verify code + 3 phát hiện mới
       (§1b: DTO khuôn-KHKK ≠ PE · fe-admin ẩn `Ct_*` 2-TẦNG `:248` · đường fetch cây sẵn) +
       plan 11 wave §7 + hợp nhất 12 nhãn → 9 câu Q1-Q9 (= slot (80)-(88)) + 3 tự-quyết T1-T3 §8
5. [x] lead verify + ghi spec — @S188: spot-check độc lập `Contract.CurrentWorkflowStepIndex` TỒN TẠI
       (`Contract.cs:40` — nghi ban đầu là thước grep head-limit cắt, không phải claim sai) →
       `spec-duyet-hd-10-08-2026.md` (3 heading H21①; W1/W2/W7 đủ AC thi công; W3+ AC bổ sung khi Q chốt)
6. [ ] fan-out Opus 5 MAX theo wave (Workflow hmw, args.run BẮT BUỘC) — đợt-1 = W1→W2→W7 (0 chặn owner,
       bất biến mọi nhánh Q), TỪNG wave qua gate rồi ship; W3+ chờ đáp án (80)(81)(83)

## luật cho mọi sub của run này
- Ghi file TRONG-LÚC-LÀM vào đúng sub-file của mình (APPEND từng mục xong — chống #53; return chỉ là tóm).
- Return: dòng-1 = `<NHÃN>: <verdict ngắn>`; thân đầy đủ Ở FILE.
- Propose-only: KHÔNG Write/Edit ngoài sub-file của mình; KHÔNG code; câu nghiệp-vụ cần owner → liệt "CHỜ-ANH".

## Stages
- [x] A: 2 invest song song — 2/2 XONG trên đĩa (cả 2 garble #53 ở return; artifact-đổ-ruột cứu 100%)
- [x] B: style-review — XONG @15:56 (về CLEAN trong cửa dừng; mốc vá CỜ-10 @S188) — PASS_WITH_FLAGS 7 flag
- [x] C: plan-review + tổng hợp — XONG @S188 (garble #53, đĩa trọn 29.647B) — F3-inbox CHỐT verify-only
- [ ] D: fan-out wave — spec ĐÃ GHI @S188 (`spec-duyet-hd-10-08-2026.md`); đợt-1 W1→W2→W7 (0 chặn),
      hmw Opus MAX per-wave từng wave qua gate; W3+ chờ (80)(81)(83)

## CHỜ-ANH tổng — ✅ ĐÃ HỢP NHẤT @S188: 9 câu = slot **(80)-(88)** (nhà durable: `docs/HANDOFF.md` khối
"CHỜ ANH @S188" + chi tiết `sub-plan-review-fable.md §8`; BE#5≡FE#2+FE#5 gộp (82), FE#4→(82b), 12 nhãn
= 11 câu thật → 9 sau gộp) + 3 tự-quyết T1-T3. Nhãn GỐC giữ dưới làm vết (chưa-hợp-nhất @S187):
BE#1 trục 7-type⟂8-nhóm · BE#2 PA-A/B/lộ-trình · BE#3 catalog gợi-ý-loại · BE#4 line-level ruột HĐ ·
BE#5≡FE#2 authz Đ1/Đ2/Đ3 · BE#6 roster 7 workflow · BE#7 bridge auto-pin override · FE#1 bộ nút 2/3 ·
FE#3 admin thấy menu GĐ3 · FE#4 per-loại policy API · FE#5 menu public 13/13 giữ?

## đợt-1 fan-out taskList snapshot (S188, sau YC-024 — hmw RUN-TRACE wf_58d6f783-395) — ✅ XONG @~18:30
- [x] t0 `test-specialist` — CLEAN: 4 test (+295/-0), 3 ĐỎ-hành-vi + 1 control → `sub-test-specialist-0.md` 13.534B
- [x] t1 `implementer-backend` — W2 code LAND (+89 Features +76 Dtos); return rỗng #53, KHÔNG sub-file (harvest từ diff @close)
- [x] t2 `implementer-frontend` — PARTIAL rồi W7-FINISH nối (Agent lẻ): types×2 + ContractsListPage(3-fix) + MyContractsPage; Inbox BLOCKED đúng → [carry:w7b-inbox-param] → `sub-implementer-frontend-2.md` 14.481B
- [x] W1-GREEN (Agent lẻ) — 2 bom fix, 3 ĐỎ→XANH → `sub-implementer-backend-w1green.md` 8.874B (return #53, đĩa trọn)
- [x] GATE lead: full test **672/672 XANH** · 0 Migrations · scope 9 file đúng · reviewer `PASS_WITH_FLAGS — 8` (`sub-reviewer-dot1.md` 20.840B): F-1/F-2 (3 tên field + nullability FE↔BE) **VÁ NGAY ×2 app** · F-4 AC-W7 sửa vào spec + nợ w7b · F-3 quyết treo cho W6 (ghi spec) · F-5..F-8 ghi nhận

Sau workflow (lead): gate build+test (t0 tests ĐỎ đúng lý-do, còn lại XANH) → spawn W1-GREEN (impl-be fix 2 bom cho xanh) → full test xanh → reviewer diff → 3 commit (W1·W2·W7) + 1 push (gotcha #86) → cicd-monitor verify.
