# SPEC — adap wave 3 bản AI_INFRA 17-07 (v2 — sau gate GO_WITH_FIXES)

> **v2 (22:55):** review-lane Fable `wf_a0aa62f5-9e8` #53-garble trước verdict → **em-main-solo gate** (tiền lệ S116; ladder + evidence → `review-synthesis.md`) = **GO_WITH_FIXES 3M/3m/1n ĐÃ ÁP TRỌN**: M-1 H24-4 boundary `^**Prev S` đầu-dòng (HANDOFF:7 chứa "Prev S134" giữa dòng — marker-collision) · M-2 H24-4 scope v1 = HANDOFF-only (STATUS In-Progress toàn section cũ S117/S113) · M-3 đoạn-logic = split ` · `/` ; ` cùng-mảnh · m-1 C6 +2 khai limit +ca 🧊 · m-2 L1 acceptance concretize 3 điểm · m-3 L3 phủ cả edit reviewer.md (no-self-exempt) · n-1 scope-grant tường-minh.

> Run `2026-07-17-S138-adap-3-ban-17-07` · Nguồn: invest `/fable-real` `wf_56d248ea-f8e` (model `claude-fable-5`, sub-MD `sub-investigator-codebase-0.md` 7-phần) → **lead verify 4/4 claim chịu-lực khớp đĩa** (`reviewer.md:46` 4-nhãn thiếu `grounded` verbatim · detector inventory `:14-26` 0 resolver path:line · outbox errata `:20` "13 dương-giả (12 .docx + 1 .xlsx)" SE-originated · sub-MD trọn trên đĩa) + 1 chỉnh: union bề-mặt-đo K1 đọc theo `memory-budget.json:hotload_sources` thật (sub ghi "CLAUDE.md(?)" — sai; đúng = STATUS/HANDOFF/ACTIVE-MARKS/migration-todos/gotchas/agents-README).
> Pipeline anh chỉ định: invest fable → spec → review fable → hmw Opus 4.8 MAX. Add-only §F4.1 · 0 số nhịp/cap mới (quyền anh) · 2 detector mới INFORM-only exit-0.

## ① Tính-năng / đề-bài

Adopt wave 3 bản: **(A)** re-verify 2 delta bản đính-chính-kép `624c378d` — vá `grounded` vào câu cửa-duyệt `reviewer.md:46` (landing-site THẬT — SE chép nguyên danh-sách 4-nhãn lỗi của hub) + ghi-nhận Δ2 already-compliant SE-originated; **CẤM adopt lại 2 bản gốc** (luật của chính bản update). **(B)** master-checklist `cadd24ae` — nâng 4 cửa vòng-đời phiên (`session-start` · `session-end` · `pause` · `tiep`) đạt 5 điểm sàn: khối **MASTER-CHECKLIST HAI TẦNG** là **VIEW derive tươi** từ nguồn durable (WAL · STATUS · HANDOFF · ACTIVE-MARKS), tầng-2 = 4 nhóm {xong · đang-dở+breakdown · **chờ-anh LUÔN ĐÁNH SỐ** · chưa-làm}, **CẤM file checklist nguồn-đôi**; sàn-3/4/5 đã đạt sẵn (chỉ +1 dòng luật-hoá đánh-số). **(C)** năm-quyết `123d8272` — K1: 2 câu đóng-băng-bề-mặt-đo (ngoại-lệ WAL + state-write bộ-đo); K2: detector **C6 cite-2-nấc** (`path:line` → file tồn-tại + line ≤ EOF); K3: sweep hứa-máy ĐÃ chạy = 0 unbacked (chỉ ghi-nhận); K4: 1 câu ngoại-lệ relay-attribution (verb-durable cần attribution cạnh verb); K5: detector **H24-4 pending-flip** (token chờ + mã RC ⟷ ACTIVE-MARKS stamped/RESOLVED, scope segment-hiện-hành); K6: +2 dòng `do-record` vào memory-triple + 1 câu luật re-base-số-sống (generalize E-010).

## ② Cách implement per-khoản

**(A1) `reviewer.md:46`** — em-main micro-edit 1-từ: `(measured/empirical/calibrated/đã-đo)` → `(measured/empirical/calibrated/grounded/đã-đo)`. Agent `.md` no hot-reload → nấc executed→**verified-pending-restart** (khai trong report). **(A2) Δ2:** 0 code (standing script `agent-frontmatter-eol-check.ps1` đếm byte-CR, KHÔNG dùng ext-filter — `:253-257`/`:135-198`); adap-report bản-1 ghi evidence SE-originated + re-grep 5-nhãn (0 hằng-số `grounded` mọi bề-mặt sống — scripts/=0 · budget.json=0 · hmw.js=0 · docs/=8 prose · .claude/=10 lineage).

**(B) Khối MASTER-CHECKLIST — khuôn CHUNG in ở 4 cửa (VIEW-derive, KHÔNG file mới):**
- Khuôn: **Tầng-1** = mỗi arc/đầu-việc-lớn 1 dòng {đóng · đang · chưa} (nguồn: STATUS Phase-line + Plan cha/con + WAL `goal`). **Tầng-2** = 4 nhóm: **xong** (WAL `[x]` + Recently-Done phiên này) · **đang-dở + breakdown** đã-xong-gì/đang-giữa-gì/còn-gì (WAL `[!]` + chain evidence) · **chờ-anh — LUÔN ĐÁNH SỐ, anh trả lời bằng số** (HANDOFF NEXT-anh + ⚑ pending-decisions + mark treo) · **chưa-làm/hẹn-cuối-phiên tách từng khoản** (WAL `[ ]` + NEXT-em). Kèm câu cấm: "Checklist = VIEW derive tươi — CẤM tạo file checklist nguồn-đôi (sàn-3)."
- `session-start.md` Phase 3: + khối Tầng-2 4-nhóm vào template REPORT (work-state §2.1.5 GIỮ NGUYÊN làm nguồn — REPORT trỏ nó; nhóm chờ-anh BẮT BUỘC đánh số).
- `session-end.md` Phase 4: + **"TỔNG-HỢP CHỐT"**: arc nào ĐÓNG trong phiên + MỌI mục chưa-đóng → chỉ đích nơi đổ (carry-slug HANDOFF / WAL-line / STATUS-row); + 1 dòng luật-hoá sàn-5 tại §L.b(j)(iv): "khối chờ-anh trong HANDOFF LUÔN đánh số".
- `pause.md` bước 5: + ý-6 "in MASTER-CHECKLIST rút-gọn (Tầng-1 + đếm 4-nhóm + liệt chờ-anh đánh số) — derive từ WAL vừa ghi + HANDOFF".
- `tiep.md` §3-bis (sau "Ground-truth thắng WAL"): "in MASTER-CHECKLIST cập-nhật từ WAL đã reconcile (vừa-xong · vẫn-treo · chờ-anh đánh số)".
- Giữ mỗi khối NGẮN (khuôn ≤15 dòng/file); KHÔNG đổi cấu-trúc section hiện có; KHÔNG chạm con-số config nào.

**(C1) 2 câu đóng-băng bề-mặt-đo** — `session-end.md §L.b(c)` ĐẦU khối: "Từ lúc chạy script đo đầu-tiên của khối (c) tới verdict cuối: KHÔNG ghi vào **bề-mặt-đo** = `.claude/agent-memory/**` + `.claude/governance/{.session-counter.json, ACTIVE-MARKS.md}` + `docs/{STATUS,HANDOFF,gotchas}.md` + `docs/governance/error-ledger.md` + `docs/changelog/migration-todos.md` + `.claude/agents/*.md` + `runs/*/run.md`; việc ghi phát sinh giữa chừng → xếp hàng SAU verdict. Ngoại-lệ: `.claude/WAL.md` (ngoài vùng đọc cả 5 script đo) + state-write của chính bộ-đo (`.mfe-state.json`)." + 1 câu mirror ngắn ở `session-start.md §2.1.2`. Text-only.

**(C2) Detector C6 `cite-2-nấc`** (`scripts/governance-detectors.ps1` ONLY):
- Scope: `docs/governance/*.md` top-level (EXCLUDE `adap-reports/` dir = 90 occ lineage) + `.claude/commands/*.md` + `.claude/agents/*.md`. Regex path:line trên ext `md|ps1|js|cs|tsx?`.
- 2 nấc: file KHÔNG tồn-tại (resolve repo-rel + root quen `.claude/`, `docs/`) → FLAG LOW `cite-dead-file`; tồn-tại mà line > EOF (`ReadAllLines.Length`) → FLAG LOW `cite-line-past-eof`. *(LOW không MED — suite convention: net mới chưa-triage đọc bằng phán-đoán, tránh MED-noise ngày đầu; fold TOTAL + nâng sev = quyết sau triage, owner-gated.)*
- 3 loại-trừ: (a) code-fence + inline-backtick qua **`Test-Quoted`** (matcher prose ⇒ BẮT BUỘC — luật S123); (b) lineage: dir-exclude adap-reports + dòng mang marker đóng-băng 🧊 (khai thẳng: lineage ngoài 2 proxy này chấp-nhận dương-giả đầu, tune sau first-run); (c) self-def: đăng-ký `Test-Excluded` (C4) cho chính detector + spec/sub-MD run này.
- INFORM-only exit-0 · first-run BÁO count riêng, **KHÔNG fold TOTAL baseline 45** (chống Goodhart flag-giảm).
- Fault-inject cây tạm `-RepoRoot` **7 ca** (m-1 +1): cite-gãy-file → FLAG · cite đúng → IM · cite trong fence → IM · line>EOF file thật → FLAG · cite trong backtick → IM · **anti-Goodhart: 2 cite cùng dòng (1 đúng 1 gãy) → FLAG đúng 1** · **(m-1 mới) cite trên dòng mang marker 🧊 → IM**.
- Header khai limit (m-1 mở rộng): (a) KHÔNG bắt trôi-mềm trong-EOF (class S108 ±1-2); (b) multi-root resolve có thể **mask dead-cite** khi file trùng basename tồn tại ở root khác; (c) range-cite `file.md:12-15` chỉ bắt + kiểm **line đầu** (12). Script ASCII-only + build token bằng code-point (gotcha #30).

**(C3) K3:** 0 code — adap-report bản-3 ghi bảng 3-hit/3-traced (`session-end.md:103`→H24-2 · `tiep.md:70`/`:73`→DUAL-ACCEPT block) + verdict candidate-list RỖNG, trình anh 1 dòng. *(Optional owner-gated: câu cửa-duyệt reviewer "diff thêm câu hứa-máy? → mã nào làm?" — chỉ liệt trong report, KHÔNG tự thêm.)*

**(C4) 1 câu relay-attribution** — nhà ĐỀ-XUẤT-MẶC-ĐỊNH = `docs/rules.md §6.6` *(em-main ghi; [owner-reviewable] — anh đổi nhà sang error-ledger được khi đọc report)*: "Thuật-lại quyết-định owner mang verb-durable (vĩnh-viễn/đóng-hẳn/bỏ-hẳn) = hợp-lệ KHI VÀ CHỈ KHI attribution tường-minh NGAY CẠNH verb (anh-chốt / anh-confirm S<nn> / mã RC-* / quote nguyên văn); verb-durable trần = tự-phán. Ranh máy-kiểm nếu mai port scanner lớp-từ: token-attribution cùng dòng + matcher PHẢI `Test-Quoted`." Kèm 1 dòng trỏ **G-011 ladder** (agreed/executed/verified-pending — "KHÔNG tự khai verified") vào `docs/governance/error-ledger.md` vì hiện 0 định-nghĩa canonical on-disk *(surprise-2 invest; [owner-reviewable])*.

**(C5) Detector H24-4 `pending-flip`** (`scripts/governance-detectors.ps1` ONLY) — **v2 sau M-1/M-2/M-3**:
- Nguồn A: `docs/HANDOFF.md` **segment HIỆN-HÀNH ONLY** — boundary = dòng đầu-tiên **BẮT ĐẦU** bằng `**Prev S` (anchor `^`, match đầu-dòng; 🔴 M-1: CẤM substring — HANDOFF:7 current-segment chứa "segment Prev S134 dưới" GIỮA dòng, substring sẽ cắt sớm mất :7-:8 = marker-collision). **STATUS BỎ khỏi scope v1** (M-2: §In-Progress hiện chỉ còn section lineage S117/S113 @:578/:585 — quét = dương-giả nền; mở rộng = sau triage, khai thẳng trong header detector).
- Match (M-3 concretize): split dòng theo separator ` · ` hoặc ` ; ` (đoạn-LOGIC per O3) → token chờ (`CHỜ GẬT|CHỜ ANH|chờ-ký` — build code-point #30) và mã `RC-pqhuy1987-*`/slug-mark phải nằm **CÙNG MẢNH split** × Nguồn B `ACTIVE-MARKS.md`: mã đó ĐÃ stamped (row Active/Active-High) hoặc `✅ RESOLVED` → FLAG LOW `pending-flip-stale`.
- Biết-trượt **6 ca** (cây tạm): hàng giả CHỜ-GẬT RC-fake cùng-mảnh + mark RC-fake stamped → FLAG · mark 📦 SUPERSEDED → IM · token cạnh RC-khác chưa-stamp → IM · token trong backtick/fence (`Test-Quoted` — spec này TỰ-QUY-CHIẾU vì mô tả token chờ, khai trước) → IM · quét segment lineage (sau boundary) → 0 flag · **(M-1 mới) current-segment chứa "Prev S…" GIỮA dòng → boundary KHÔNG cắt, dòng đó VẪN được quét**.
- Live đầu kỳ-vọng **0 flag** (đúng thiết-kế — giá-trị ở phiên tới). Khai thẳng: class "đề-xuất-landed-in-CODE không mark" (ca S137) NGOÀI tầm máy → GIỮ H24 view-audit mắt-người theo nhịp.

**(C6) K6 — 2 mảnh:** (i) `session-end.md` §L.b(c) Item 3-bis: +2 dòng khuôn `memory-triple: do-record=<governance-detectors TOTAL=n>` + `memory-triple: do-record=<nhip-no 3-vế>` (0 script mới — vào session-log đã committed). (ii) 1 câu luật re-base — nhà ĐỀ-XUẤT-MẶC-ĐỊNH = `docs/governance/error-ledger.md` Active-Guards (generalize E-010 đang sống ở đó; *[owner-reviewable]*): "Re-base baseline = chốt số SỐNG tại lúc re-base — mọi số vào sổ đọc lại từ nguồn sống tại thời-điểm ghi (CẤM chép từ ghi-chú/phiên trước, kể cả ghi-chú của chính mình); byte = `(Get-Item).Length` (E-010)."

## ③ Checklist thi-công (vai + deliverable + acceptance ĐO ĐƯỢC)

| # | Vai | Deliverable | Acceptance (đo được) |
|---|---|---|---|
| L1 | **implementer-backend** (lane-1 — CHỈ 4 file: `.claude/commands/{session-start,session-end,pause,tiep}.md`; scope-grant governance-file tường-minh per tiền-lệ S135-S136, n-1) | Khối MASTER-CHECKLIST 4 cửa (B) + 2 câu đóng-băng (C1) + 2 dòng do-record (C6i) + 1 dòng luật-số sàn-5 + câu cấm nguồn-đôi | grep anchor `MASTER-CHECKLIST` = 4/4 file · `find -iname "*checklist*.md"` delta = 0 file mới · **(m-2) heading-count TRƯỚC=SAU từng file (chỉ THÊM nội-dung dưới heading có sẵn — 0 heading mất/đổi tên)** · **(m-2) "BƯỚC 0" echo session-start còn nguyên (grep intact)** · diff 0 chạm con-số config/nhịp · **(m-2) dry-run = EM in-thử khối từ WAL/HANDOFF THẬT ngay post-land: mỗi nhóm ≥1 mục hoặc ghi "(trống)" tường-minh, nhóm chờ-anh CÓ SỐ** |
| L2 | **implementer-backend** (lane-2 — CHỈ `scripts/governance-detectors.ps1`; scope-grant n-1) | +C6 cite-2-nấc + H24-4 pending-flip + đăng-ký `Test-Excluded` + `Test-Quoted` CẢ 2 matcher + fault-inject harness cây tạm | fault-inject: **C6 7/7 + H24-4 6/6** đúng cả 2 chiều (FLAG đúng + IM đúng) · live-run: H24-4 = 0 flag / C6 báo count riêng KHÔNG fold TOTAL (45 giữ) · exit 0 · suite cũ 0 flag mới (`comm` before/after chỉ ra dòng detector mới) · ASCII-only (#30) |
| L3 | **reviewer** (workflow RIÊNG sau implement — Harness-9 2-workflow) | Falsify acceptance L1/L2 độc-lập + add-only-floor check + `Test-Quoted` coverage MỌI matcher prose trong diff (S123) + measured-label gate mọi con-số mới + **(m-3) diff-check PHỦ CẢ edit `reviewer.md` của EM (no-self-exempt)** | re-run fault-inject byte-exact khớp · 0 floor hạ · verdict GO/GO-WITH-FIXES kèm file:line |
| EM | **em-main single-writer** | `reviewer.md:46` +grounded · C4 câu (rules §6.6) + G-011 line + C6ii câu (error-ledger) · adap-reports ×3 · STAGE-2 move + _index processed · email hub · STATUS/HANDOFF | grep `grounded` reviewer.md = 1 hit đúng `:46` · adap-reports 3 file đủ 5-trường REPORT-FORMAT · nấc G-011 đúng từng mục (agent-file = verified-pending-restart, KHÔNG tự khai verified) · selftest-stamp email MATCH |

**Owner-gated (trình anh trong report cuối, KHÔNG chờ giữa pipeline):** nhà 2 câu luật (mặc-định đã chọn ở trên — anh veto được) · optional câu cửa-duyệt hứa-máy · fold C6 vào TOTAL + nâng sev sau triage · wording luật nếu anh muốn chỉnh.

**Thi-công:** hmw 1 invocation 2 lane (L1 ⟂ L2 file-disjoint, index 0/1 — không collision sub-file per fix S134) · Opus 4.8 MAX qua worker-tier-pin frontmatter (đúng lệnh anh "hmw cho Opus 4.8 MAX") · L3 = invocation reviewer riêng sau khi L1+L2 land · EM micro-edits sau L3 GO.
