# SPEC v2 — Adap wave đợt-9/10 (S141, 2026-07-20) — FINAL sau fable-real gate

> v1 = 5-lane fable-clone invest `wf_3b74219c-561` + lead synthesize. **v2 = v1 + fold TRỌN fable-real review `wf_25210715-f7d` GO-WITH-FIXES 0C/7M/9n** (M1-M7 + n1-n9 đều áp — disposition từng dòng ở sub-reviewer-fable-spec.md). Worker thực thi THEO spec bơm qua args.

## ① Đề-bài

Adopt 7 thư hub đợt-9/10 (verify 7/7): **(A)** tạo bộ-ba sub `harness-eval/refine/audit` theo khuôn canonical 5-câu (`58e28bae` khối B) + wire nhịp 2-đầu-phiên consent-gated có-vết; **(B)** contract-fix dangling-head khuôn ①a APPROVED (squash-benign 3-điều-kiện) + H24-5 INFORM-sink + fault-inject 2 ca × 2 biến-thể + carve-out ô3 note; **(C)** stamp-decode đầu-đọc khoan-dung + port stamp_verify.py; **(D)** annex baseline phép-8 + note gộp tick-invariant; **(E)** sweep roster 14→17 co-land (13 site) — REPO-WIDE acceptance; **(F)** session-model: CHỈ sửa draft prereq-stale (cả (a) và (b)) — KHÔNG wire (carry #13(c)); **(G)** process closeout em-main (adap-report 7-disposition + email + STAGE-2). Governance-only: 0 prod-code, 0 mig, test 528 không đụng.

## ② Cách implement

### Lane W-A — Trio + toàn bộ wiring roster

**A1. 3 persona `.claude/agents/harness-{eval,refine,audit}.md`** — cookie-cutter khớp `lead-view-auditor.md:5-10`: `model: opus` (ALIAS theo policy worker-tier-pin S124; **[n1] hedge:** doc harness nói param nhận enum-alias, full-id CHƯA AI THỬ (fix#8a mở) — alias = dạng ĐÃ-test per `d68de5e7`; đây là form-deviation có-chủ-đích vs câu-5a hub "ghim full-id" → khai trong adap-report) · `effort: max` · `tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects]` · `memory: project` · `maxTurns: 18` · KHÔNG skills. CẤM Write/Edit trong tools (chặn-bằng-thiếu-tool).
- **harness-eval (con ĐO):** đọc output 5+1 instrument (`measure-agent-memory.ps1` JSON `agents[].l1_hot_bytes…` · `mfe-eval.ps1` FIT/strikes/per-role-pct · `memory-archive-gate.ps1` strike+A7 · `crystallized-backfill.ps1` headroom · `nhip-no-probe.ps1` 1-dòng) + `memory-budget.json` + diary mình. TRẢ SỐ NGUYÊN-VĂN + so-baseline + verdict {HEALTHY|REGRESSION|MIXED} + đề-xuất-signal. 🔴 CẤM số-từ-trí-nhớ. KHÔNG hành-động/chấm/harvest-op/lead-view. Body §: role · contract bảng {instrument·số·baseline·delta·verdict} · file-đọc · ranh-trục (đụng harvest→NHƯỜNG harvest-curator; KHÔNG chấm diff=reviewer) · 2 caveat (Bash-kênh-ghi→lead git-status; registry→spawn-probe) · anti-pattern (❌số-trí-nhớ ❌re-implement máy ❌đề-xuất-action ❌PASS-cạnh-số-ngược).
- **harness-refine (con ĐỀ-XUẤT):** input = `harness-eval-return.md` **PIN đích-danh (lead truyền path; [n5] missing/rỗng → TỪ-CHỐI đề-xuất, mirror fail-closed audit)** + reinject-ledger + diary mình. TRẢ action 4-LỚP {nạp-lại · thăng-hạng lặp≥2 · lưu-kho L1→L2 · chưng-cất} — MỖI action {đối-tượng file:path · trigger=số-con-ĐO · CHỐT-DỪNG (đề-xuất 1 lần không đạt→leo-thang lead, CẤM lặp) · owner-gate} + mục "đã cân-nhắc→BÁC" **[n4] PHẢI HIỆN DIỆN — 0-item thì khai lý-do vì sao không có gì để bác** (chống nghi-thức rỗng). 🔴 RANH SẮC: LEAD hot-feed/carry/work-state = lead-omission-auditor → NHƯỜNG; refine CHỈ acts AGENT-MEMORY corpus. KHÔNG đo-lại/chấm/ghi.
- **harness-audit (con KIỂM):** đọc **ĐÚNG run-folder PIN đích-danh** (🔴 CẤM tự tìm "run mới nhất"; pin missing/rỗng → **TRƯỢT/TỪ-CHỐI, CẤM ĐẠT-ảo**) + spec/checker (memory-budget.json, scripts) + diary mình. TRẢ verdict ĐẠT/TRƯỢT per-claim + falsify-log HELD/BROKE + **re-chạy ≥2 số load-bearing** đối-chứng byte-exact. KHÔNG chấm diff-code (reviewer) · KHÔNG lead-view · đụng harvest→NHƯỜNG. Anti-pattern: ❌tự-tìm-run ❌ĐẠT-ảo ❌tin-số-không-re-run.

**A2. Seed 3 folder `agent-memory/harness-{eval,refine,audit}/MEMORY.md`** — non-empty (role baseline + boundary + "S141 seed, chưa chạy lần nào" — trung thực).

**A3. `hmw.js`:** chèn sau dòng 35: `'harness-eval', 'harness-refine', 'harness-audit',` + comment 3 dòng (trục CHÍNH-HỆ-MEMORY khác H1/H2/H24/reviewer · TUẦN TỰ eval→refine→audit CẤM song song · lead scribe return từng con). Comment `:41` "14/14"→"17/17" · `:55` "(14/14)"→"(17/17)". **[n9] writeGuard `:186-187` HOÀN THIỆN enum read-only:** thêm CẢ `tooling-auditor, harvest-curator, lead-view-auditor, lead-omission-auditor` (thiếu sẵn — drift cũ) + 3 trio vào nhóm "CHỈ có Bash".

**A4. `session-start.md`:** (i) **§2.1.8(b) REWRITE 3-điều-kiện** — counter-lùi → FAIL-LOUD báo anh; head not-reachable → phân loại TRƯỚC: object-exists (`git cat-file -t`=commit) ∧ counter-không-lùi → **squash-benign** ghi 1 dòng vết `history[]` event-class `squash-benign` đi tiếp KHÔNG báo anh (nhãn-phiên cũ intact = corroborate); object-MISSING ∨ counter-lùi → FAIL-LOUD như cũ. (ii) **THÊM §2.1.9 "Bộ-ba đồng-kiểm memory (2-đầu-phiên, consent-gated)"** sau §2.1.8: em-main IN đề-xuất-chạy 1 dòng → 🔴 KHÔNG auto-run (consent-form như sleep-check §2.1.2) → anh gật → chạy **TUẦN TỰ** eval→refine→audit (3 spawn RIÊNG — hmw `parallel()` KHÔNG dùng cho trio); lead scribe return từng con → `runs/<run-id>/harness-{eval,refine,audit}-return.md` NGAY; Mirror C1 đóng-băng trong cửa-sổ đo; refine+audit nhận **PIN đích-danh**; post-wave `git status` assertion; KHAI script-arm (§2.1.2/6/7) ⟂ sub-arm (trio); "phiên-LOGIC" map tạm = phiên `S<nn>`; KHÔNG cadence-key/KHÔNG tick. **[M4] Vết-2-lớp:** (a) **proposal-line IN CẢ khi Light-session** (không skip im); (b) khi skip (anh không gật / Light) → **ghi 1 dòng vết vào WAL** `trio: skipped S<nn> (lý-do)` — chuỗi skip nhìn thấy được. Light → skip hợp lệ NHƯNG proposal-line + vết vẫn in.
(iii) **[M3] §2.1 checklist roster `:97-113`:** thêm 3 bullet trio vào topology list + sửa dòng `:97` "10 product/quality + 4 monitor INFORM-only" → **BỎ-số dạng liệt-kê-nhóm:** "10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory — số vai canonical → docs/STATUS.md §Sub-agents)".

**A5. `session-end.md`:** (i) THÊM **§L.b(k) "Bộ-ba đồng-kiểm @đóng-phiên"** — mirror §2.1.9 (consent + tuần-tự + scribe + PIN + git-status + vết-skip; đọc số instrument ĐÃ chạy trong closeout thay chạy lại). **[M6] Sửa header `:52`** "(a)→(j)" → "(a)→(k)" (giữ nguyên ghi-chú :53 "đếm từ thân"). **[M3] Sửa `:142`** "10 product/quality + 4 monitor" → cùng dạng BỎ-số liệt-kê-nhóm như A4(iii). (ii) **Annex phép-8** 1 dòng tại §L.b(j)(vi): "*baseline-ghi-bù (phép-8 annex `dede7ec5`, khai-1-lần): cơ-chế force-fire bù closeout-gộp tồn tại từ 2026-07-17 (`da349fc`, S135 — re-đo 19:12:41+07). Phép-8 CHỈ tính FAIL cho closeout SINH SAU mốc; closeout trước = baseline hợp-lệ ghi n/a, KHÔNG đếm FAIL. Không lặp mỗi lần chạy.*"

**A6. Roster sweep 14→17 (CO-LAND cùng commit với A1 — R3-M2), 13 site:** `agents/README.md:5` → BỎ-số dạng liệt-kê-nhóm (**[n8]** theo chính README:3 "vá bằng BỎ số, không ĐỔI số") + `:222` "14 folder"→"17 folder" (+3 tên) + decision-tree nhánh trio + skill-matrix 3 row (ref-only instrument) · `fable-clone.md:3/:18/:19` + `fable-real.md:3/:19/:20` enum +3, "roster 14"→"roster 17" · `harness-11-engine.md:345` enum +3 + **[n6] sửa cite ":22-36" → bỏ line-range (ghi "hmw.js VALID_ROLES")** · `vocab-alias-map.md:51` "14/14"→"17/17" · `workflows/README.md:64` "9 roster" → con-trỏ canonical (KHÔNG chép số) · **[M3] `session-start.md:97` + `session-end.md:142`** (đã cover A4(iii)/A5(i)) · STATUS §Sub-agents cell 14→17 + narrative = em-main @closeout CÙNG COMMIT.

**A7. `memory-budget.json`:** thêm 3 row `measured` — **chạy `measure-agent-memory.ps1` SAU seed A2, chép số THẬT script in ra** (hợp lệ no-hand-edit — tiền lệ S138 addendum), rollout-note "S141 seed — first-run pending restart+consent; re-measure @drift-audit 2026-08-01". **[n2] Cập nhật `measured._note`** thêm câu addendum kiểu S138: "+3 row trio S141 do tươi script". KHÔNG cadence-key · KHÔNG block harness_trio (skip-có-lý-do: sequential-rule sống ở §2.1.9 + persona).

### Lane W-B — Contract v2 + stamp + carve-out + draft-fix

**B1. `.session-counter.json`:** thay `_contract.fail_loud_on_regress` bằng wording v2 EN (2 trigger 2 verdict: counter-regress → FAIL-LOUD report-owner; not-reachable → classify: object-exists ∧ counter-monotonic → SQUASH-BENIGN append 1 history-entry event-class `squash-benign` CONTINUE no-alarm — prior session-label intact corroborates; object-missing ∨ regress → FAIL-LOUD; rationale: closeout squash lifts tick-head every cycle = expected drift). THÊM `_tick_invariant_note`: tick invariant verbatim hub (+1/cặp) · SE form tick-at-entry-gate NET +1/label ≡ hub +1/cặp **[n3] trên cặp ĐÃ-ĐÓNG; cặp đang-MỞ transient +0 (đóng cặp mới +1) — hub bless (`9a35405b` khối-1 phép dừng–nối)** · guard sống-còn = label-convention · history[] append-unbounded by design; NẾU sau này cap FIFO PHẢI xử eviction tường-minh.

**B2. `governance-detectors.ps1` — detector MỚI H24-5 `counter-ancestor-classify`** (read-only, `-RepoRoot`, git-based mirror H25): đọc `.session-counter.json`; `merge-base --is-ancestor last_ticked_head HEAD` exit-0 → `OK-reachable`; else `cat-file -t`=commit → `SQUASH-BENIGN (trace)` 0-flag; else → flag `object-missing`. **[M1] Nhánh counter-regress DEFAULT-ON:** flag khi `counter < last_audit.light_at_counter` ∨ `counter < last_audit.deep_at_counter` (static read-only; repo thật 15≥14/3 → 0-flag). **[M2] Day-one = INFORM-sink:** MỌI flag H24-5 in dòng `INFORM-ONLY` RIÊNG cuối output (như C6/H24-4), **KHÔNG vào TOTAL** (luật `:65-68` brand-new net; promote = post-triage owner-gated; răng không mất — contract §2.1.8(b) runtime vẫn FAIL-LOUD độc lập detector).

**B3. Fault-inject cây tạm (`$env:TEMP`, cleanup sau):** ca-1 seed→wal-commit→tick-json→reset-soft-squash → `-RepoRoot $T` → KỲ VỌNG `SQUASH-BENIGN` 0-flag; **[M1] ca-2 CẢ 2 biến-thể:** (2a) fake-sha `000…0` → INFORM-flag `object-missing`; (2b) counter giảm dưới `light_at_counter` → INFORM-flag `counter-regress`. Evidence PASS/FAIL từng ca vào sub-file.

**B4. `error-ledger.md` Active-Guards** — note-block carve-out ô3: VALID chỉ khi CẢ 2 lưới sống {`nhip-no-probe.ps1` in mọi điểm dừng + H25-closeout detector wired}; 1 lưới chết → RE-EVAL nấc, tụt chạy-vô-điều-kiện; basis `9a35405b` khối-2; live-evidence S139→S140 (light 8/6 → gật → chạy → 0/6). **+1 câu:** trio-consent S141 cùng CLASS carve-out (đề-xuất-chạy + vết-skip WAL = lưới; khai nấc PASS-với-carve-out trong adap-report).

**B5. Stamp-decode:** `check-email.md` bước 4(b) — pin mẫu rút declared: khoan-dung `content_sha256:\s*"?([0-9a-fA-F]{8,64})"?` (3 dạng: có-ngoặc · không-ngoặc · rút-gọn ≥8-hex tiền-tố) + 🔴 CẤM quote-strict `([0-9a-fA-F]+)` (whiff hash-có-ngoặc → false-tamper, S141 suýt oan 3/3) + ƯU TIÊN `python scripts/stamp_verify.py <file>` · `send-email.md` 6c — align cùng mẫu + prefer script · **PORT `scripts/stamp_verify.py`** từ `AI_INFRA/scripts/stamp_verify.py` verbatim + header-note "mirror-of AI_INFRA — re-pull khi hub đổi §N canon". **[n7] Verify 3-dạng:** chạy trên thư quoted thật (6239dd40) exit 0 **+ tự tạo 1 file synthetic tạm (frontmatter hash KHÔNG-ngoặc + 1 file rút-gọn 8-hex) → cả 2 verify OK → xoá**; python vắng → khai + regex-pin làm chính.

**B6. `session-model-se-draft.md` §4 prereq:** **[M7] flip CẢ (a) VÀ (b):** (a) "mẫu-áp-dụng hub" → "✅ ĐÃ VỀ 2026-07-18 (`101e69d6` kit+manifest; Q4 van-ngưỡng CHƯA trả lời — hub cố-ý bỏ counter)"; (b) "khuôn bộ-ba SUB" → "✅ ĐÃ VỀ 2026-07-18 (`58e28bae` khối B — trio adopt S141)". +1 dòng: K4-form-conflict (hub `sessions/session-<N>` vs draft `logic-sessions/L<mm>`) + `session_ctx_kb` + meld-forward-gap (hook 3→4-path) = "chờ anh duyệt cùng bảng VC". Còn lại (c) anh duyệt VC = ĐIỀU KIỆN CUỐI. KHÔNG wire.

### ②G — Process closeout (EM-MAIN, sau verify) **[M5]**
Adap-report: bảng **disposition TỪNG thư 7/7** (nấc per-khoản theo thang 5; trio = executed-file/verified-pending-restart; annex/design-note = executed-doc/verified-pending-first-real-closeout-gộp; form-deviation n1 + Light-carve-out M4 khai thẳng) → update/new `docs/governance/adap-reports/` · email báo-nấc hub (selftest-stamp 6c) · STAGE-2 move 7 thư → `inbox/ai_infra/` + `_index` processed · STATUS/HANDOFF (cell 17 + carry #11 ĐÓNG + #12 ĐÓNG + #13 cập "chờ anh VC" + carry #2 data-point inv-cb 24.5K hook-fired) · commit + push theo §5.2 squash→count→push.

### KHÔNG làm wave này
Session-model wire · hướng (i) neo-mốc (defer — ghi adap-report) · liveness-detector carve-out (follow-up) · precedence re-sync (0 site sống — VERIFIED grep độc lập) · trio first-run (sau restart + consent).

## ③ Checklist (acceptance ĐO ĐƯỢC)

1. 3 persona: tồn tại, frontmatter khớp cookie-cutter (grep `model: opus`+`effort: max`, KHÔNG Write/Edit trong tools) · 3 MEMORY.md non-empty.
2. TRIPLE 17/17/17: `ls .claude/agents/*.md|grep -v README|wc -l`==17 == VALID_ROLES==17 == README enum==17. CẤM xoá README.
3. §2.1.9 + §L.b(k) + header "(a)→(k)" + §2.1.8(b) chứa "squash-benign"+giữ FAIL-LOUD + annex chứa "da349fc".
4. **[M3] Sweep REPO-WIDE:** `grep -rn "roster 14\|14/14\|14 folder\|14 vai" --include="*.md" --include="*.js"` TRỪ frozen-history (docs/_archive/ · docs/changelog/sessions/ · runs/ · broadcasts/ · agent-memory/ · adap-reports/ · outbox/) = **0 site SỐNG** · session-start:97 + session-end:142 hết "4 monitor" · workflows/README:64 hết "9 roster".
5. budget 3 row: số THẬT từ `measure-agent-memory.ps1` (fresh-run diff = 0-mismatch) + `_note` addendum.
6. Contract v2 + `_tick_invariant_note`: JSON parse OK (`ConvertFrom-Json` exit 0) + chứa "SQUASH-BENIGN" + "transient".
7. H24-5: repo thật `OK-reachable` 0-flag · **FI 3 ca PASS** (ca-1 SQUASH-BENIGN 0-flag · 2a object-missing INFORM-flag · 2b counter-regress INFORM-flag) · dòng INFORM-ONLY riêng, TOTAL không đổi vì H24-5.
8. Carve-out note present (error-ledger, 2 lưới đích danh + câu trio).
9. Stamp: mẫu khoan-dung trong 2 command + `stamp_verify.py` exit 0 trên {quoted thật + synthetic không-ngoặc + rút-gọn}.
10. Draft prereq (a)+(b) "ĐÃ VỀ", (c) giữ chờ-anh, 0 wire khác.
11. Detector suite exit 0; flag MỚI giải thích TỪNG cái (dự kiến: C2-class từ roster/STATUS edits trước khi STATUS cập nhật cell — phải về 0 sau closeout STATUS).
12. Spawn-probe trio 3/3 = PHIÊN SAU restart — nấc **executed-file / verified-pending-restart** (khai thật trong adap-report).
13. git-status: 0 tracked-change ngoài file-set giao + run-folder.
14. **[M5] Process:** adap-report 7-disposition + email selftest-PASS + STAGE-2 moved + _index processed — đủ 4.

**Chờ-anh (không block implement):** (1) ranh refine⟂lead-omission ratify · (2) 5 câu session-model (session_ctx_kb=64? · N=L map + folder-form? · VC từng dòng · hook 4-path? · prereq unblock) · (3) consent-form trio dài hạn (mỗi phiên gật hay luật đứng).
