# S187→S188 — YC-023/024/025: module **Duyệt Hợp đồng (GĐ3)** từ KHKK

> 2026-08-10 · phiên-LOGIC **L14** (window 2-3) · lead = Fable 5 (đổi Opus 5 @closeout) · 0 migration · test **668 → 680**
> Run-trace: `.claude/workflows/runs/2026-08-10-S187-duyet-hd-tu-khkk/` (11 artifact) + `…/2026-08-10-S188-bookend-close/`
> Push: `bc309c55..0149f106` (đợt-1) · `0149f106..b275893c` (cụm) · `80febec9` (sổ) — cicd **4/4** + **5/5**

## 1. Owner-decisions (nguyên văn → sổ yêu-cầu)

| mã | tóm | thi hành |
|---|---|---|
| `YC-023` (S187) | mở module Duyệt HĐ GĐ3 mirror PE/KHKK, quy trình per-LOẠI, kế thừa KHKK đã duyệt; điều phối 2 invest + 1 style-review + 1 plan-review ×`/fable-real` → fan-out Opus 5 MAX per-wave | 4/4 lượt Fable xong → spec → 2 đợt fan-out |
| `YC-024` (S188) | **9 đáp án (80)-(88)** | 7-LOẠI · PA-A · mở-tất-cả-trước (W8 HOÃN) · roster sao khuôn KHKK · 2-nút · admin giữ ẩn (W9 HỦY) · khoá cứng · 0-cột-gợi-ý · ruột pre-fill |
| `YC-025` (S188) | *"làm tiếp hết đi, xong hết tao review 1 lần"* | W3-W6 + W10 chạy trọn không dừng giữa wave; push gom; trình review 1 lần |

## 2. Chuỗi 4 lượt `/fable-real` (STAGE A-C) — S187→S188

- **invest BE** (26.119 B) + **invest FE** (21.981 B) song song 2 lăng kính. Lõi: V2 tái dùng 100% · `ApplicableType=3` không phân loại · **phiếu GĐ3 = chính `Contract`** (0 entity mới) · 0-mig · vỏ FE đủ 42 leaf `Ct_*` · khuôn duyệt = `KhkkWorkflowPanel`.
- **style-review** (`back-end-reviewer-style` ×Fable, 21.680 B) — `PASS_WITH_FLAGS — 7 flag`; nặng nhất **FLAG-2 wave MỒ CÔI**: F1/F2 cần BE-DTO mà wave-list không có.
- **plan-review** (`reviewer` ×Fable, 29.647 B) — 12/12 claim re-verify bằng code + **3 phát hiện mới**: ① FE đề xuất DTO khuôn **PE** trong khi panel mirror là khuôn **KHKK** (chọn PE = viết lại panel) · ② `fe-admin` ẩn `Ct_*` **2 TẦNG** (`ADMIN_HIDDEN_KEYS` + prefix-rule `:248`) · ③ đường fetch cây workflow đã có sẵn. Ra **plan 11 wave** + hợp nhất 12 nhãn CHỜ-ANH → **9 câu** + 3 tự-quyết.
- Lead verify + ghi [`spec-duyet-hd-10-08-2026.md`](../../../.claude/workflows/runs/2026-08-10-S187-duyet-hd-tu-khkk/spec-duyet-hd-10-08-2026.md) (H21① 3 heading).

## 3. Thi công — 2 đợt ship

**Đợt-1 (0-chặn-owner, `0149f106`):** W1 gỡ 2 bom per-type (test-before 3 ĐỎ-hành-vi → XANH) · W2 BE-DTO nền (`ContractSourceDto` reverse-join KHKK + `CurrentWorkflowStepIndex` + cây thô khuôn KHKK) · W7 server-filter per-type. Reviewer `PASS_WITH_FLAGS — 8`: **F-1/F-2 MAJOR** (3 tên field FE↔BE lệch + nullability — build xanh nên không máy nào bắt) **vá ngay trước commit**; F-4 sửa AC-W7 + nợ `[carry:w7b-inbox-param]`; F-3 treo W6.

**Cụm W3-W6 (`b275893c`):** W3 seed 7 quy trình `HD-*` sao khuôn KHKK (builder chung; cờ finalize **false** có khai — tránh config-lie #78) + 7 key `AwV2_Hd*` **by-construction** + menu-row T6 + 2 row canonical STATUS · W4 guard 4-cửa nhà chung `ContractWorkflowGuards` (khoá cứng theo loại; bridge `ApprovalWorkflowId` → nullable auto-pin) · W6-BE Đ2 guard đúng-trạm V2 (V1 giữ nguyên) + test security · W5 card "Nguồn gốc KHKK" · W6-FE panel duyệt **2 nút** mirror `KhkkWorkflowPanel` (dual-render V1) + Designer type-3 family-slice.

## 4. Nghiệm thu

- **cicd đợt-1** 4/4 · **cicd cụm PASS 5/5**: run #482 success (gate 680) · bundle rotate ×2 app · **seeder chạy thật prod: 7 `HD-*` + 7 menu-row, FK sạch, 8 `KHKK-N*` control nguyên** · smoke 9/9 · DLL marker `ContractWorkflowGuards` 0→4.
- **W10 dry-run Dev PASS 5/5** (lead tự chạy sau 4 đời agent chết non): nhánh A `HD-TP` auto-pin → 5 trạm → **DaPhatHanh** (`APVN01/HDTP/SOL&NCC-DIEN/01`) · sai-trạm **403 nêu đích danh Bước/Cấp** · nhánh B gửi mã sai họ → **409 nêu tên mã**, auto-pin → `APVN01/HĐDV/SOL&DV-BAOVE/01` · F3 inbox 2 chiều đúng (approver thấy / ngoài cấp không).
- Sổ ID Dev (seq đã cháy — không phải data thật): `KHKK/2026/901` + 2 HĐ `ZZTEST-W10`.

## 5. Bài học phiên (ứng viên gotcha/memory)

1. 🔴 **#53 garble ~90% return** (≈15/17 lượt sub) — **đĩa cứu 100%, 0 byte mất**. Lượt nào lead ép "ghi file TRƯỚC TIÊN" thì recover trọn; lượt reviewer-cụm **không ép** → chết trắng 0 trace ×2 ⇒ *ép-ghi-trước-tiên là biến quyết định, không phải lời khuyên*.
2. **Agent chết non ≠ mất việc, NHƯNG ledger phải tiến từng đời**: W10 qua 4 đời agent, mỗi đời để lại B0/B1 trên trace ⇒ đời sau nối được; cuối cùng lead tự chạy B2-B5. Trace = đơn vị tiến-độ, không phải return.
3. **Tiền-đề spec sai 3/4 ở W7** (fe-admin không có `MyContractsPage`; inbox không có param) — implementer **BLOCKED đúng kỷ luật** thay vì làm bừa ⇒ nợ có mã thay vì bug câm.
4. **Build xanh ≠ hợp đồng đúng**: 3 tên field FE lệch BE mà `tsc`/680 test đều im (0 consumer) — chỉ reviewer đọc chéo 2 phía mới bắt.
5. **sqlcmd `-i` mặc định `QUOTED_IDENTIFIER OFF`** ⇒ mọi DML trên bảng có filtered index chết `Msg 1934`; `sqlcmd < file` (stdin) chạy **im lặng 0 dòng**. Dùng `-I`.
6. **Rate-limit login 5/phút/IP** (`Program.cs` `RateLimit:AuthLoginPerMinute`) — kịch bản nhiều danh tính phải cache token, không login lại mỗi bước.

## 6. Nợ mang sang

- `[carry:w7b-inbox-param]` — BE `/contracts/inbox` thêm `?type=` + bỏ `Take(100)`, rồi FE gỡ client-filter (kèm `ContractCreatePage` ×2 cùng lớp).
- **W8 authz Đ1 HOÃN** theo (82) — chờ anh nói "ổn rồi". **W9 HỦY** theo (85).
- F-3 `ActiveOthers` — Designer đã đi hướng lát-cắt-history (khuôn KHKK) ⇒ field API còn 0 consumer, quyết giữ/gỡ ở wave sau.
- Slot chờ anh còn: (74)(76)(77)(78)(79) + tồn (22)(67)(72).

## 7. memory-triple + gate (điền ở closeout)

```
memory-triple: do=scripts/measure-agent-memory.ps1 · exit 0
memory-triple: de-xuat=scripts/memory-archive-gate.ps1 DRY · (xem harness-eval return)
memory-triple: kiem=harness-audit · (verdict trong run-folder bookend-close)
memory-triple: do-record=governance-detectors TOTAL=59 (INFORM 24 tách riêng)
memory-triple: do-record=NHIP-NO: kiem light 2/6 deep 2/1 OVERDUE:deep | tran-bo-nho 5 over-cap l2idx 0 over | run-chua-gom 1 | pull-cach 0 ngay | so-yc treo 4 / nhac2+ 2
```

## 8. Chạy-bù bookend TRỌN theo PN-001/YC-027 (owner bác "ngân sách" — cùng phiên)

```
completeness-gate S188 (SAU chạy-bù): vong 5/5 chuc-nang (khong-nhip: V4-shard-8/15) | phep DAT 3 / TRUOT 1 / vacuous 0
  V1 ring1 (roster 29 5/5-nguon + A-00 bat loi lead-pin) · V2 ring2 lan-3 (2Đ1T2KC — TRƯỢT=RESET-tally-sai ⇒ HOÀN 8 class tu git + history entry) ·
  V3 trio (eval MIXED-35 [return v2 TRANSCRIBE TRỌN — v1 lead scribe TÓM làm mất bảng, audit C1 bắt] · refine 2A/16BÁC/4E · audit gộp 4Đ2T1KC) ·
  V4 khong-nhip · V5 floor áp mọi verdict. Phép-1 tick (62, 3 số) ĐẠT · phép-2 NHIP-NO nguyên văn ĐẠT · phép-3 closeout-4-sổ ĐẠT · phép-4 vai-có-sổ TRƯỢT-lúc-đo→SEED-12-vai-đã-vá.
memory-triple: kiem=harness-audit gộp 3 lượt · 4Đ2T1KC (2 TRƯỢT đều lỗi phía lead: scribe-tóm + đề-bài sai tiền-đề)
ring5: 6 nhãn — 1Đ·5T·0-xoá-án ⇒ 6 `tự ý bỏ` + SÓT-1 (đảo thứ tự §6.4 — cửa sổ mù Sàn-2 ~73') ⇒ RCA ONESHOT-S188 + [carry:sentinel-truoc-bu]
headroom @audit-tick = 122.555 (giảm tiếp — hotload đo 6 file docs, HANDOFF phình do chính RE-STAMP; N4 đúng)
```
