# S168 (2026-08-01, window-6 phiên-LOGIC L9) — GĐ3-D + K8-blocker Lines-editor + K8 dry-run toàn trình + bộ fixture TEST

> Vào bằng `/tiep` (không bookend @open). Lead model: Fable 5 → **Opus 5** (anh `/model` cuối phiên, trước closeout).
> Mandate owner trong phiên: `(63)(b)=D` · *"Cứ mở rộng đi nhé"* · *"Chạy dry-run hết luôn đi rồi tao giao tiếp plan khác"* · *"để là ADMIN_TEST… tạo luôn master data test… bộ User test… chữ test trước"* · *"mỗi bộ 2-3 dữ liệu thôi"* · *"tạo 1 bộ dữ liệu test từ PE → Hợp đồng luôn"*.

## 1. Nghi-thức `/tiep` (cửa vào)

Sàn-3: tín-hiệu ①④⑤ kêu nhưng **khớp 1:1 danh-sách nợ WAL tự khai** (orphan 4-folder + `sessions/` L9 đang mở) ⇒ không phải sổ-trống-giả. verify 5/5 KHỚP (`sub-implfe-gd3` BLOCKED · `sub-cicd-verify-k7` PARTIAL · git log · porcelain rỗng · suite 639/0). Tick CLEAN **41→42** (S168). `NHIP-NO: light 2/6 deep 2/15 ok`. `thu-moi: se=0 all=0`. `mind-check` **11Đ/0T**. `ctx-verifier` **CO-11-cờ** → biên-nhận `_tiep-5.md` (5 trường máy + verdict — vá luôn lỗi ⑧ chính vai bắt: `_tiep-4.md` rỗng ruột).

🔴 **Bug DÒ thư tự bắt:** lượt đầu báo `se=23 all=26` — sai vì so id **kèm đuôi `.md`** với `_index` (ghi id không đuôi). Đo lại strip đuôi ⇒ `0/0`. *Bài: phép đếm ra số LỚN bất thường = nghi phép đo trước, đừng nghi dữ liệu.*

## 2. Closeout-nợ (9 món trả trọn) — `a2b37dc`

Gotcha **#86** (2-push-sát → Gitea auto-CANCEL run đầu; CANCELLED ≠ fail, verifier đọc run CUỐI của range) + cheatsheet-34 + STATUS row · **H24-DEEP-S166 11 FLAG resolve từng dòng** (F-4 `CLAUDE.md` mig 70/71 + module-row `69, 71` · F-5/F-6 HANDOFF segment S163→S168 + disposition NEXT-em cũ · F-9 persona `cicd-monitor` bỏ 5 literal → trỏ STATUS · F-10 bỏ-neo-phase 3 site · F-11 `governance/README.md` lật nhãn trial-đã-đóng · **F-8 KHÔNG ÁP** — `ring2-audit` @S166 đã **bác** vai-đo [đo sai phạm-vi HANDOFF, kết-luận lật ngược] ⇒ slot (59) giữ SỐNG) · orphan S163+S166 **harvest** (2 synthesis, verdict verbatim-từ-đĩa 10/10 + 3/3) · diary `ctx-verifier`/`ctx-curator` seed 3 lượt L9 mỗi vai · tally #53 ghi sự-kiện per-window · spec-cụm1 đính-chính PUT-Conflict · `run.md` ledger +8 row.

## 3. GĐ3-D — `081557b` (owner slot (63)(b) = D)

Cây toàn trình vào **Panel-3 khi `!selectedId`**; "mở rộng" ⇒ **cả 3 trang 3-panel** (`MyContractsPage` · `InboxPage` fe-user · `ContractsListPage` fe-admin). `WorkflowMatrixViewPage` **KHÔNG áp** (trang bảng full-width, 0 Panel-3 — gate F-8 phán lead ĐÚNG).

Gate `reviewer` **PASS-WITH-FLAGS-10 / 0 blocker** (garble → resume). **F-1 MAJOR vá:** `max-h` khuôn hiệu-chỉnh cho trang giấy-cuộn, vượt chỗ Panel-3 `/inbox` **~26px** ⇒ 2 thanh cuộn lồng. Vá = khuôn **+prop `bodyMaxHClass`** (default GIỮ NGUYÊN — 3 host cũ 0 đổi hành-vi), 3 host mới truyền `lg:max-h-none` ⇒ panel giữ **đúng 1 thanh cuộn**, bền cả 3 trang (không phụ thuộc biên 5px/13px mong manh). SHA-pair khuôn mới `7baf6247` ×2 app. 6 finding còn lại CHẤP-NHẬN-có-khai → UAT-NÓI-TRƯỚC.

## 4. 🔴 K8-blocker: Lines-editor KHKK — dry-run bắt TRƯỚC giờ chạy → `0bfadc2`

**Phát hiện:** auto-gen line mồi `CatalogEntryId=null` + comment HỨA *"gán sau qua `UpdateContractSigningPlanLineCommand`"* — **command đó chỉ tồn tại TRONG COMMENT** (grep toàn src+FE = 0 impl/0 route/0 call); submit-guard vá-5 **chặn thật** line null; FE tự khai *"đường GÁN = K4b"* nhưng K4b thật ship `?group=` (`git show --name-only 88e7ecf`). ⇒ **mọi phiếu KHKK tạo sau K2 kẹt Nháp vĩnh viễn** — đúng chỗ cicd-K2 từng khai *"mục-4 chân-lý-rỗng, đo lại khi K8 đẻ phiếu thật"*.

**Vá:** command+validator+handler (EnsureDraftEditable + rào `ContractId!=null` 409 + fail-fast entry sống/IsActive/đúng-nhóm 409 + denorm `TenHangMuc` + changelog `EntityId=line.Id` + tên NCC) · route `PUT /contract-signing-plans/{id}/lines/{lineId}` policy `KeHoachKyKet.Update` · FE select tại bảng ×2 app (SHA-pair `0d6147d0`) + option-fallback giữ hạng-mục-đã-lưu + dòng lỗi query + amber nhóm-0-hạng-mục + `aria-label` per-dòng · **+5 Fact**.

Gate `reviewer` **PASS-WITH-FLAGS-8 / 0 blocker** — 2 MAJOR (F-1 changelog thiếu `EntityId` = chỗ DUY NHẤT lệch quy ước file · F-2 `<select>` **nuốt hạng mục đã lưu** khi option vắng — 3 ca loading/error/ngừng-hiệu-lực) + F-3/F-4/F-6/F-8 đều **VÁ**; F-5 (race gán-vs-trình) + F-7 (unique 3-cột) **ghi nợ** cùng gói RowVersion/unique với nợ-K7.

**Push 1 lượt 2 commit** (`a2b37dc..0bfadc2` — đúng bài #86) → **cicd #444 PASS 6/6**: gate **644 = 45D+599I** · bundle rotate `RgvHZkPH→DLRf9TeA` / `D65FJPGd→C7TGA4Kn` + marker · route mới `404→401` (bearer→400 gọi tên đủ 3 field) · Mig prod GIỮ **71**.

## 5. K8 DRY-RUN — PASS toàn trình 2 nhánh (`sub-k8-dryrun.md`)

**B0** backup prod 27.877.888 B (script default `D:\` → VPS **không có ổ D** ⇒ vá `C:\`) · roster LIVE 3 workflow (`QT-DN-V2-001` · 8 nhóm `KHKK-N*` · `QT-HD-V2-001` 1-trạm) · form 14 dòng đủ chủ · catalog 86 · `$env:PROD_DB_PASSWORD` **KHÔNG tồn tại** cả 3 scope VPS ⇒ `sqlcmd -E`.

| GĐ | Nhánh A | Nhánh B |
|---|---|---|
| PE | `PE/2026/A/052` finalize-CCM **không qua CEO** (OG-9 ✓) | `PE/2026/A/053` **5 lượt full-CEO** (`applyLevelFinalize=false` — checkbox opt-out F-1 sống) |
| KHKK | `KHKK/2026/001` (gán hạng mục qua **endpoint MỚI**) | `KHKK/2026/002` |
| HĐ | bridge K7 → **HĐ ĐẦU TIÊN prod** `ZZTEST-K8/NCC/SOL&ZZTEST-NCC-K8/01` DaPhatHanh, `giaTri == ApprovedAmount` | — |
| Bản cứng | `hasSealedCopy=True` (LIST-level EXISTS) | — |
| **QĐ9** | (a) sửa quote nguồn PE DaDuyet → **409 khoá cứng** · (b) catalog-rename → line **GIỮ** `Xi măng` → restore | y hệt, 2/2 |

**8 thuốc-thử guard ghi lại cho buổi người-thật:** detail đòi `GroupCode/GroupName` · `QuoteBody` decimal non-null · submit-guard đòi **Bảng so sánh** (purpose=4) · cấp cuối đòi **giá chốt** (Mig 66) · auth **429 rate-limit** ⇒ cache token · phiếu nháp orphan DELETE-204 · KHKK enum `ChoDuyet=2/DaDuyet=3` (≠ PE 10/7) · password policy **≥12 ký tự**.

## 6. Bộ fixture TEST + bộ dữ liệu toàn trình fx3 — `dd7db21` + `6918fa9`

**Users:** `ADMIN_TEST` (Admin) · `TEST Nhân viên Soạn thảo` (Drafter+Procurement) · `TEST Người duyệt` (CostControl+DeptManager) — pass chung `Test@12345678`, phòng `TEST Phòng thử nghiệm`. **Master:** 2 project · 3 supplier (đủ 3 loại) · 2 workitem. 🔴 **LUẬT: test CHỈ trên fixture TEST, CẤM master/user thật.**

**fx3 — danh tính TEST 100%** (0 lượt dùng admin thật): `test.drafter` soạn+**bridge** (hội-2-khóa mở đúng Drafter — chứng lần 2) · `ADMIN_TEST` duyệt-thay ×9 lượt ⇒ `PE/2026/A/054` → `KHKK/2026/003` → HĐ `ZZTEST-K8-2/NCC/SOL&ZZTEST-NCC-K8/01` DaPhatHanh → bản cứng ✓.

🔴 **Seq cháy (không thu hồi):** `KHKK/2026` = 001-003 (**phiếu thật đầu tiên = 004**) · PE `2026/A` = 052-054 · 2 HĐ prefix TEST.

## 7. Bài học phiên

1. **Dry-run là phép đo, không phải nghi-thức** — nó bắt được thứ 3 vòng gate + 8 wave cicd đều không thấy: một command **chỉ sống trong comment**. Guard chặn thật + đường ghi không tồn tại = feature chết câm, chỉ lộ khi có người đi hết đường.
2. **Comment hứa việc cho wave sau = nợ vô hình.** `K4b` trong comment ≠ K4b thật ship. Grep tên command trước khi tin comment.
3. **`grep -c` + `|| echo 0`** (bẫy cũ) và **so id kèm/không kèm đuôi** (bẫy mới) cùng một họ: phép đo sai cho ra số tin được nhưng sai hướng.
4. **2 writer 1 file JSON** — `main()` save-đè làm mất token cache do `login_as` vừa ghi; vá = merge-trước-save.
5. **Vá F-1 GĐ3-D chọn "panel cuộn" thay "cây tự cuộn"**: lệch tiêu-chí-CHỮ của gate nhưng đạt tiêu-chí-Ý (1 thanh cuộn), bền cấu-trúc thay vì phụ thuộc biên 5px — khai thẳng chỗ lệch trong disposition.

## 8. memory-triple + do-record

```
memory-triple: do=<scripts/measure-agent-memory.ps1 · exit 0>
memory-triple: de-xuat=<scripts/memory-archive-gate.ps1 DRY · A7 GATE PASS 429/429 pointer, 0 failed>
memory-triple: kiem=<trio harness-{eval,refine,audit} · xem runs/2026-08-01-S168-bookend-close/>
memory-triple: do-record=<governance-detectors TOTAL=50 (+10 INFORM tách riêng, 0 self-match)>
memory-triple: do-record=<NHIP-NO: kiem light 2/6 deep 2/15 ok | tran-bo-nho 0 over-cap l2idx 0 over | run-chua-gom 2 | pull-cach 10 ngay>
memory-triple: do-record=<SHARD-PROBE pending=17 nguong=15 => KEU ⇒ V4 sleep AUTO>
```

## 9. Commit chain

`a2b37dc` closeout-nợ · `081557b` GĐ3-D · `0bfadc2` Lines-editor · `b41f002` STATUS/WAL/artifact · `dd7db21` fixture TEST · `6918fa9` fx3 toàn trình (+ commit closeout này).
