# FABLE-REAL RUNBOOK — vận hành engine-đắt per-invocation (H21 S110; gốc H19 thật/ảo 2 vị-trí)

> ⚠️ **H21 adopt S110 (2026-07-11):** mode-marker + 2-vai-mặc-định **RETIRED** → **per-invocation** — engine-đắt chỉ chạy trong lượt anh gõ `/fable-real`\|`/fable-clone <vai> <đề-bài>`; vai anh gán đích-danh; mỗi run sinh **spec-file 3-mục** (engine propose → lead verify+ghi → worker theo spec). Các mục marker/`$mode` dưới = 🧊 lịch-sử H19 (giữ nguyên văn); biến-đọc MỚI = **INVOCATION**{lệnh, vai, đề-bài} từ chính lượt lệnh (§2.1-bis). *🔄 Neo model @S151: **default MỌI vị trí (kể cả lead) = Opus 5 MAX** (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`)); cao hơn = anh `/model` đầu phiên hoặc chính lệnh engine-đắt — 🧊 neo MTv3 "owner-choice per-session {Fable|Opus 4.8}" cũ = superseded-VALUE, cấu trúc giữ.*

> **Tầng:** RUNBOOK thi-hành ("cách bấm nút"). **LUẬT** = engine [`harness-11-engine.md` PHẦN K](harness-11-engine.md) (K.A ánh-xạ vai · K.B 2-mode 🧊 · K.C 3 GAP-guard · K.D 3 floor-point · **K.E per-invocation H21**) + RC-mark `RC-pqhuy1987-03-07-2026-17-46-35` ([`ACTIVE-MARKS.md`](../../.claude/governance/ACTIVE-MARKS.md)). **B1: file này TRỎ canonical, KHÔNG copy luật.**
> **Sinh S108 (2026-07-10), anh yêu cầu "plan cụ thể hàm/biến/checklist → ra file":** draft 4-section bởi 4 worker Opus 4.8 Max (HMW mode-A `wf_2f85b3f6-3dc`, role-less tier-2 — đúng phân-tầng "đám Opus xử lý") → em-main assemble + sửa 8 stale-runtime-claim (6 đợt-assemble + 2 reviewer-catch §3.5/§4.3) (worker tin comment `hmw.js:31` snapshot cũ "Fable suspended" — S108 thật ra Fable UP) → **Fable-real review 2-đầu-khác-trục** (first-real-run dogfood §5.5, verdict điền form).
> **Đối-tượng đọc:** em-main (lead) các phiên sau — file này đủ để bấm đúng nút không cần đọc lại broadcast gốc.

## 1. DÙNG NHANH (5 phút)

1. **Xác định engine (lượt lệnh):** từ TÊN LỆNH anh vừa gõ lượt này — `/fable-real` = **real-single** · `/fable-clone` = **clone-ensemble**; KHÔNG còn marker để đọc (🧊 H19 retired — §2.1-bis).
2. **Probe lead-runtime** (BƯỚC 0.6, per-session): Fable hay Opus-1M(H5)? — quyết engine-label + cost-note, KHÔNG quyết mode.
3. **Vai = ANH GÁN trong lệnh** (H21 — INVOCATION, KHÔNG phải em-main chọn): §3/§4 dưới = template 2 vai tham-chiếu hay-gán-nhất (cần SỰ-THẬT/file:line/RCA → `investigator-codebase` §3 · cần PHÁN-QUYẾT gate/adversarial → `reviewer` §4); artifact hệ-trọng → em-main ĐỀ XUẤT anh gõ CẢ 2 (2-đầu-khác-trục), anh quyết.
4. **Spawn:** REAL (lượt anh gõ `/fable-real <vai>`) = Agent-tool LẺ 1 con (§3.2/§4.2 template) · CLONE (lượt anh gõ `/fable-clone <vai>`) = `hmw.js` N-lane **CÙNG vai** (§3.3/§4.3 JSON). *(🧊 H19: cũ đọc marker — nay per-invocation, §2.1-bis.)*
5. **Thu verdict** (dòng-1 `VERDICT:`/`Verdict:` — chống #53; garble → recover 3-nấc R5: diary → SendMessage-resume → em-main solo) → em-main **VERIFY** (V1, không rubber-stamp) → **harvest 1-entry/vai + `[engine: …]` stamp** (V3/V4) → **AC-check 8 tiêu-chí** (§5.4) → commit.

## 2. WIRING — marker, biến hệ thống, hàm hmw.js, 3 GAP-guard

> Engine `harness-11-engine.md §K` = **LUẬT** (Harness-19 + K.E per-invocation H21). Section này = **cách bấm nút** (wiring thi hành ngay), KHÔNG lặp lý-lẽ canonical. Mọi biến có TÊN·KIỂU·NGUỒN; mọi bước có lệnh/hàm chạy được; checklist đánh-tick kèm evidence-form.

---

### 2.1 — MARKER lifecycle: `.claude/fable-real-mode.on`

> 🧊 **Section này = lịch-sử H19 (retired H21 S110)** — marker đã xóa; giữ nguyên văn làm record. Lifecycle MỚI = **INVOCATION** (§2.1-bis dưới).

**Đường dẫn (KIỂU: file marker — nội-dung tùy ý, KHÔNG đọc):** `.claude/fable-real-mode.on` — CHỈ xét tồn-tại/vắng.

🔴 **Semantic INVERSE (bẫy — khác hmw-mode.on):**

| Marker | Mode | Ý nghĩa vận-hành |
|---|---|---|
| **VẮNG** (mặc-định) | 🟢 **Fable-clone** (ảo/ensemble) | 2 vị-trí phán-quyết chạy **N lane CÙNG vai + em-main synthesize** |
| **TỒN TẠI** | 🔴 **Fable-real** (thật/single) | 2 vị-trí chạy **1 lần top-model deep pass** |

> Trái với `.claude/hmw-mode.on` (CÓ = feature-ON / VẮNG = OFF). Ở đây **VẮNG = clone-default (vẫn là mode SỐNG, KHÔNG phải "tắt")**. Nguồn: `harness-11-engine.md §K.B:325` ("⚠️ semantic INVERSE: marker-VẮNG = ảo-DEFAULT"); `session-start.md:30-31`.

**Lệnh đổi mode (CHỈ khi anh gõ — KHÔNG auto, §K.B:325):**

| Lệnh | Hành-động em-main | Nguồn |
|---|---|---|
| 🧊 `/fable-real` (H19) | `Write` file `.claude/fable-real-mode.on` (bật thật) | `fable-real.md:10` |
| 🧊 `/fable-clone` (H19) | `Remove-Item .claude/fable-real-mode.on` (về ảo; vắng sẵn → "đã ở ảo-mode") | `fable-clone.md:8` |
| `/fable-real <vai> <đề-bài>` | lệnh-A single top-model (per-invocation, H21 — 0 marker, 0 persist) | `fable-real.md` (H21 redesign) |
| `/fable-clone <vai> <đề-bài>` | lệnh-B ensemble tier-2 (per-invocation, H21 — 0 marker, 0 persist) | `fable-clone.md` (H21 redesign) |

**Verify gitignored (BẮT BUỘC — commit marker → thật-mode STUCK-ON = burn quota top-model):**

```bash
git check-ignore -v .claude/fable-real-mode.on && echo "IGNORED" || echo "NOT-ignored"
# Evidence-form (đã chạy): .gitignore:92:.claude/fable-real-mode.on  →  IGNORED
```

Rule gitignore neo tại **`.gitignore:92`** (`.claude/fable-real-mode.on`), đặt SAU `!.claude/**` để last-match-wins (`.gitignore:89-92`). Idiom `&& IGNORED || NOT` = lá-chắn: bất-kỳ output KHÁC "IGNORED" ⇒ DỪNG, KHÔNG toggle.

> 🧊 Idiom marker chỉ còn giá-trị **phòng-hờ** (pattern `.gitignore:92` GIỮ — file cũ sync lại vẫn ignored, KHÔNG semantics H21).

**Reader @session-start (BƯỚC 0.5b — đóng gap WF2-Lane-A "marker write-only"):** `session-start.md:27-33` — em-main đọc marker → BÁO ngay đầu response mode 2 vị-trí (`reviewer` + `investigator-codebase`). Không có reader = marker mù; bước này = consumer chính-thức. *(🧊 cite = bản H19 cũ; BƯỚC 0.5b nay = reader per-invocation H21, không còn marker.)*

**☑ Checklist marker:**
- [ ] Toggle CHỈ khi anh gõ lệnh (KHÔNG số-dư/cảm-tính) — evidence: đối-chiếu `§K.B:325` + `fable-real.md:17`
- [ ] Sau toggle: verify `git check-ignore` = IGNORED (output trên)
- [ ] @session-start BÁO mode qua BƯỚC 0.5b — evidence: dòng "🔴 Fable-real = ON" | "🟢 Fable-clone (MẶC-ĐỊNH)" hiện ở đầu response
- [ ] restart CLI sau khi TẠO/SỬA command `.md` (no hot-reload) — evidence: `fable-real.md:8`

---

### 2.1-bis — INVOCATION lifecycle (H21 S110 — thay MARKER lifecycle §2.1)

> **Biến-đọc MỚI = INVOCATION{lệnh, vai, đề-bài}** — derive từ CHÍNH lượt lệnh anh gõ, KHÔNG file-state, **0 persist** (hết lượt = hết hiệu-lực, khác marker cũ dính qua session).

1. **Anh gõ lệnh** kèm vai + đề-bài: `/fable-real <vai> <đề-bài>` (single top-model) HOẶC `/fable-clone <vai> <đề-bài>` (ensemble tier-2).
2. **Parse** `{lệnh, vai, đề-bài}` từ `$ARGUMENTS` lượt đó — KHÔNG suy từ note/marker phiên trước.
3. **Vai ∉ roster HOẶC thiếu vai/đề-bài** → **hỏi anh ĐÚNG 1 dòng, KHÔNG tự chọn vai** (owner-gated tầng lệnh + kỷ-luật lead — **KHÔNG code-enforced**).
4. **Chạy engine-đắt ĐÚNG 1 lượt** — lead KHÔNG tự gọi ngoài lượt-lệnh (kể cả HMW-mode ON, kể cả "thấy cần" — AP-4-mới §5.6).
5. **Engine propose → LEAD verify → LEAD tự ghi spec-file 3-mục** [① Tính-năng/đề-bài · ② Cách implement · ③ Checklist vai+deliverable+acceptance đo-được] — **engine KHÔNG tự ghi**.
6. **Worker (model thường MAX) thực-thi THEO spec** bơm qua args.
7. **Hết lượt = hết hiệu-lực** — 0 trạng-thái persist.

> ⚠️ **4 ghi-chú trung-thực (H21):** (a) "không tự chọn vai" = tầng **KỶ-LUẬT owner-gated**, KHÔNG claim code-enforced; (b) lệnh/alias = cách anh **GÁN VAI NHANH**, vẫn phải anh gõ — hệ không tự chọn vai; (c) spec-file do **LEAD ghi SAU verify** — engine không tự ghi; (d) run **chấm/verify CŨNG sinh spec-file** (kế-hoạch xử issue = "cách làm" cần kết-tinh).

---

### 2.2 — Bảng biến hệ thống (TÊN · KIỂU · NGUỒN · giá-trị)

| # | Biến | KIỂU | NGUỒN (file:line / lệnh đọc) | Giá-trị / ngữ-nghĩa |
|---|---|---|---|---|
| 1 | 🧊 **marker-state** (H19 retired) | boolean (file tồn-tại?) | `.claude/fable-real-mode.on` · reader `session-start.md:29` | 🧊 CÓ=real · VẮNG=clone(default) — retired H21 |
| 1b | **$engine** (H21) | enum `{real-single, clone-ensemble}` | derive từ TÊN LỆNH lượt này (`/fable-real`\|`/fable-clone`) — KHÔNG file-state (INVOCATION §2.1-bis) | thay marker-state; INVOCATION-derived, 0 persist |
| 2 | **lead-runtime** | enum `{Fable-5-1M · Opus-4.8-1M}` | **BƯỚC 0.6 probe** `session-start.md:35-37` (`/model` resolve / spawn-test) | **per-session probe; default = Opus 5 MAX (`9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`))** (🧊 MTv3 "owner-choice CHÍNH" superseded-VALUE; anh `/model` đổi bất kỳ lúc nào — quyền tuyệt đối, 0 caveat/0 revert-nghĩa-vụ) + outage-path PHỤ (H5); KHÔNG tin note phiên trước, KHÔNG steady-state |
| 3 | **tier** (per-task) | `'fable' \| 'opus' \| undefined` | `hmw.js:18` (field taskList) + `resolveModel hmw.js:38` | `undefined`=inherit top-tier (clone mặc-định) · `'opus'`=pin tier-2 sweep/cost · `'fable'`=nâng lead-tier **CHỈ trong lượt lệnh engine-đắt anh gõ** (H21 — lead KHÔNG tự ý) |
| 4 | **checkpointApproved** | boolean | `hmw.js:77-79` (THROW nếu ≠true) | em-main set `true` SAU khi BÁO {số agent·vai·task} @inform → fan-out |
| 5 | **taskList[]** | `Array<{role,label,prompt,tier?}>` | `hmw.js:18` + `:71-72` (bắt buộc, non-empty) | mảng lane; **clone = N item CÙNG 1 role** |
| 6 | **role / agentType** | `VALID_ROLES \| undefined` | `hmw.js:22-36` (whitelist) + filter + `agentType` | vai engine-đắt = **anh gán** (H21, mọi vai roster; §3/§4 template = `reviewer` · `investigator-codebase`); VALID_ROLES = **ĐỦ roster** (số canonical → [`docs/STATUS.md`](../STATUS.md) §Sub-agents; +2 monitor S110, **+2 monitor H24 S121 W2**) |
| 7 | **memoryPack** | `Record<role, slice>` | `hmw.js:15,85,103,125` | SLICE `MEMORY.md` của đúng vai (KHÔNG full) → inject prompt |
| 8 | **spec** | string | `hmw.js:16,86,126` | acceptance chung mọi lane |
| 9 | **run** (alias `wave`) | `{name,dir} \| null` | `hmw.js:19,92-93` | `null`=return-delta-only (mặc-định) · set=RUN-TRACE (sub ghi `sub-<role>-<i>.md`) |
| 10 | **SCHEMA.memoryDelta** | `{task,verdict,learned,surprise}` 4-field required | `hmw.js:54-64` (required `:57`) | **RETURN-only**; agent KHÔNG tự ghi ký-ức → em-main harvest @P3 |
| 11 | **VALID_ROLES** | `const string[]` (ĐỦ roster — **KHÔNG chép độ-dài vào đây**, B1) | `hmw.js:22-36` | 8 core + `database-agent`(S57) + `office-document`(S107) + `tooling-auditor`/`harvest-curator`(S110 anh-directed) + **`lead-stale-auditor`/`lead-gap-auditor`(S121 W2, H24)** |
| 12 | **engine-label** | string (em-main stamp — KHÔNG có field trong SCHEMA) | `§K.C GAP-2` `harness-11:329` | em-main @P3 gắn nhãn engine đã dùng (xem 2.4) |

**resolveModel logic thật (`hmw.js:37-45`) — trích:**
```
tier==='fable'||'opus'  → return tier          // pin model (escape-hatch)
tier lạ khác            → warn + bỏ qua (:39)
!role && rawRole (typo) → return undefined      // fail-UP inherit Fable (:42)
!role (role-less)       → return undefined       // inherit lead-model (:43)
role có frontmatter     → return undefined       // frontmatter tự lo = worker-tier opus (S124; hmw.js:74)
```
⇒ Không set `tier` = mọi lane clone chạy **worker-tier `opus` theo frontmatter** (S124 — hết inherit-lead); `tier:'opus'` mỗi lane VẪN ghi tường-minh (clone = ensemble tier-2 by-definition, GAP#6 — pin chữ rõ hơn pin ngầm).

---

### 2.3 — Hàm / điểm gọi: việc → lệnh cụ thể

| Việc | Cơ-chế | Lệnh / param chạy được | Khi nào dùng |
|---|---|---|---|
| **Clone ensemble** (N lane CÙNG vai) | `hmw.js parallel` (`:98`) → `agent()` (`:138-143`) | JSON args bên dưới — `taskList` = N item cùng `role` | Lượt anh gõ `/fable-clone <vai>` + heavy-judgment (H21 per-invocation; 🧊 cũ: marker VẮNG) |
| **Real single** (1 deep pass) | **Agent-tool spawn LẺ** (1 agent) | `agentType: "<vai anh gán>"`, prompt deep-pass; 🔴 PHẢI set `model:'fable'` param (S124 pin opus ⇒ không set = opus, KHÔNG còn lead-runtime; spawn-param THẮNG pin — đo S126) | Lượt anh gõ `/fable-real <vai>` + cần 1 lăng-kính sâu nhất (H21 per-invocation; 🧊 cũ: marker CÓ) |
| **Resume lane garble/truncate** | **SendMessage-resume in-session** | gửi lại agent đã spawn (KHÔNG re-spawn mới) | Lane trả wrong-slice (#53) — nấc 2 recovery-ladder (diary → SendMessage-resume S105 → em-main solo) |
| **Fallback cuối** | em-main solo | em-main tự làm vai phán-quyết | 529 overload / spawn truncate / SendMessage cũng garble |

**JSON shape clone ensemble (ví dụ `reviewer` 3 lane đa-lăng-kính) — bơm vào `hmw.js` @P2:**
```json
{
  "checkpointApproved": true,
  "spec": "<acceptance chung: diff base..head + spec gốc + deploy-claim Y/N>",
  "memoryPack": { "reviewer": "<slice MEMORY.md reviewer>" },
  "taskList": [
    { "role": "reviewer", "tier": "opus", "label": "clone-L1-security", "prompt": "<lăng-kính: authz/#44 silent-403/injection>" },
    { "role": "reviewer", "tier": "opus", "label": "clone-L2-wire",     "prompt": "<lăng-kính: wire BE grep + live-curl>" },
    { "role": "reviewer", "tier": "opus", "label": "clone-L3-schema",   "prompt": "<lăng-kính: schema/migration 3-file>" }
  ]
}
```
🔴 Mọi `role` GIỐNG NHAU (`"reviewer"`) = GAP-1. Đổi vai investigator ⇒ toàn bộ `role:"investigator-codebase"`. 🔴 `"tier":"opus"` mỗi item = **BẮT BUỘC khi Fable UP** (K.B: clone = ensemble tier-2 by-definition; bỏ pin ⇒ N×Fable trái K.D floor-2); khi outage ⇒ moot-vô-hại, GIỮ (`hmw.js:38`). Sau fan-out, em-main **refute + synthesize** @P3/P4 (`fable-clone.md:9`).

> ⚠️ Cả 2 vị-trí phán-quyết đều **read-only toolset** (`tools:[Read,Grep,Glob,Bash,+RAG]` — `reviewer.md:6` · `investigator-codebase.md:6`) → KHÔNG có Write/Edit. Clone chạy DEFAULT `return-delta-only` (run=null) an-toàn nhất; chỉ bật RUN-TRACE (`hmw.js:92`) khi cần lưu-vết dài (khi đó `*-synthesis.md` = **em-main viết**, lane chỉ `subMdPath` — GAP-3).

---

### 2.4 — 3 GAP-guard §K.C dưới dạng RULE thi hành

Nguồn: `harness-11-engine.md §K.C:327-330`. Pin để stamp CÓ NGHĨA (không paperwork).

**🔴 GAP-1 — scope-creep guard (RULE):** Ảo-run **BẮT BUỘC = N lane CÙNG 1 vai phán-quyết** (multi-lens), **CẤM mixed-roster fan-out**.
- Lý-do: `hmw.js` VALID_ROLES nhận đủ vai KHÔNG gate → worker-tier-pin **CHE** leak qua opus (mọi vai pin opus nên roster-trộn "trông ổn" — như thời all-inherit; lượt `tier:'fable'` mixed-roster = rò top-model sang vai ngoài lệnh).
- Evidence-form: `taskList[*].role` phải đồng-nhất = ĐÚNG vai anh gán trong lệnh (grep taskList trước fan-out; §3/§4 template = `reviewer`/`investigator-codebase`). Ghi-chú: engine `§K.C` khai "**TOÀN roster**" khớp `hmw.js:22-36` (lịch-sử: 9 S101 → +`office-document` S107 → +2 monitor H1/H2 S110 → **+2 monitor H24 S121 W2**) — luật "no-gate → em-main tự-gác" KHÔNG đổi. 🔴 **KHÔNG chép số vai vào đây** (B1 → [`docs/STATUS.md`](../STATUS.md) §Sub-agents).
- Nấc: **convention** (hmw.js không gate vai; kỷ-luật em-main gác).

**🔴 GAP-2 — engine-label stamp (RULE):** `hmw.js` SCHEMA `memoryDelta{task,verdict,learned,surprise}` **KHÔNG có field engine** → em-main **stamp nhãn engine @P3 harvest** (single-writer B3) khi ghi MEMORY entry.
- Mẫu nhãn cụ-thể (chọn 1 theo run thật):
  `[engine: fable-real-single]` · `[engine: fable-clone-3lane]` · `[engine: opus-worker]` · `[engine: fable-clone-3lane | lead=Opus-1M(H5)]`
- Evidence-form: mỗi entry harvest có prefix `[engine: …]` (như S101 "model-note Opus-S101", `§K.C:329`).
- Nấc: **convention KHÔNG mechanism** (SCHEMA thiếu field → em-main tay-gắn).

**🔴 GAP-3 — RETURN-only + em-main 1-entry/vai (RULE):** N lane **RETURN-only**; em-main ghi **ĐÚNG 1 MEMORY entry / vai** (+ nhãn GAP-2). "Một vai = một trí-nhớ dù chạy thật/ảo/engine nào" (chống AS-10 fragment N-lane).
- Evidence-form: sau clone, `agent-memory/reviewer/MEMORY.md` (hoặc investigator-codebase) tăng **1 entry hợp-nhất**, KHÔNG N entry rời; git-diff post-P2 = 0 tracked-change NGOÀI run-folder.
- Nấc: **convention** — ⚠️ AS-10 fired **LIVE S101** (lane tự-ghi reviewer-memory dù intent RETURN-only; harness-sanctioned "intentional" → KEPT+verified, `§K adopt:317`). 2 vị-trí read-only (no Write/Edit) mechanize MỘT PHẦN, nhưng Bash residual mở (G-015) → containment THẬT = em-main single-writer + git-diff, KHÔNG khoá-cứng.

---

### 2.5 — Decision-matrix: KHI NÀO real vs clone

**Cổng vào (K.D 3 floor-point `RC-pqhuy1987-03-07-2026-17-46-35`, `harness-11:332` / `ACTIVE-MARKS.md`):** (1) **lead = DEFAULT Opus 5 MAX (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); cao hơn = anh `/model` · lệnh engine-đắt — 🧊 MTv3 superseded-VALUE @S151-sweep); CẤM Sonnet/Haiku-class ghế lead** · (2) **top-model deep-run CHỈ trong lượt lệnh engine-đắt anh gõ kèm vai (H21)** · (3) **mọi vai khác giữ mặc-định**. 🧊 *(văn K.D gốc: "lead LUÔN top-model — KHÔNG đụng · CHỈ 2 vị-trí phán-quyết chạm top-model, CHỈ real do anh gõ" — superseded model-tier-v3 + H21 per-invocation; giữ ý-nghĩa neo RC-mark.)*

**4 câu hỏi lọc (H21 per-invocation):**
1. **Anh có gõ lệnh engine-đắt lượt này?** (`/fable-real|/fable-clone <vai> <đề-bài>`). KHÔNG → **thoát** (gate/verify thường ngày = sub thường qua workflow chuẩn — KHÔNG phải engine-đắt; lead không tự ý gọi).
2. **Heavy-judgment?** (wire-BE claim / security / schema-migration / cross-stack / RCA-chống-bịa / phân-xử mâu-thuẫn). Đây = tiêu-chí để em-main **ĐỀ XUẤT anh gõ lệnh** khi thấy cần — anh quyết. Nhẹ/trivial → khuyên anh khỏi tốn engine-đắt.
3. 🧊 *(H19 cũ: "anh đã gõ `/fable-real`? marker CÓ? — KHÔNG gõ = clone-default" — retired H21: nay TÊN LỆNH = chọn engine, không còn default-mode.)*
4. **Fable up?** (BƯỚC 0.6). Chỉ ảnh-hưởng model per-run của lệnh-A (up=single-Fable · outage=single-Opus-1M).

| Tình huống | Engine | Cơ-chế thực-thi |
|---|---|---|
| anh gõ `/fable-clone <vai> <đề-bài>` | 🟢 **lệnh-B ensemble** | `hmw.js parallel` N lane same-role + em-main synthesize (2.3 JSON) — VALID_ROLES **ĐỦ roster** (S110 +2 monitor · S121 W2 +2 monitor H24). 🔴 lane PHẢI mang `tier:'opus'` (GAP#6 — thiếu ⇒ inherit lead ⇒ lead=Fable thành N× Fable = phá đúng mục-đích lệnh; xem `fable-clone.md`) |
| anh gõ `/fable-real <vai> <đề-bài>` | 🔴 **lệnh-A single** | Agent-tool spawn LẺ 1 agent, deep pass |
| anh KHÔNG gõ lệnh engine-đắt | — | mặc-định (sub thường / workflow chuẩn; em-main có thể ĐỀ XUẤT anh gõ khi heavy-judgment) |
| việc NHẸ (không trivial) | — | single spawn thường 1 con (KHÔNG ensemble, KHÔNG deep-pass nghi-thức) |
| trivial / <2-3' / 1-file | — | em-main solo |
🧊 *(bảng H19 cũ khóa theo marker VẮNG/CÓ + "2 vị-trí" — thay bằng bảng trên, H21 S110.)*

> **Tương-tác marker (H21):** còn **1 marker duy-nhất** `hmw-mode.on` (HMW fan-out consent — **HỆ KHÁC**, giữ nguyên, ngoài scope H21); engine-đắt = **per-invocation KHÔNG marker**. Cả hai độc-lập: **HMW-ON + anh gõ lệnh engine-đắt** trong phiên = task substantive vẫn HMW, riêng **lượt lệnh** chạy engine-đắt đúng vai. 🧊 *(cũ H19: 2 marker `hmw-mode.on` + `fable-real-mode.on` — cái sau retired H21.)*

**H5 per-run fallback (lệnh-A, `fable-real.md:16` / `§K.B:323`):** Fable **up** → single-**Fable**; Fable **down** → single-**Opus-1M** **theo TỪNG LẦN CHẠY** trong CHÍNH lượt lệnh đó. Model do BƯỚC 0.6 probe quyết mỗi lần spawn. 🧊 *(H19 wording "KHÔNG flip marker, mode vẫn real toàn-cục" — retired: H21 không còn mode toàn-cục để flip.)*

**💰 Cost-note (honest, `§K:334` / broadcast §8):** ensemble **KHÔNG rẻ hơn nhiều về token thô**. Value THẬT ≠ tiết-kiệm mà = **anti-consensus-catch** (dogfood S101 WF2 Lane-B bắt `workflows/README:51` stale-label mà token-sweep sót, commit `f229b07`) + **depth** + formalize ensemble-heavy-judgment + Fable-outage timeliness. Chọn real khi cần **1 lăng-kính sâu nhất**; chọn clone khi cần **N lăng-kính phản-biện** (rẻ quota top-model hơn nếu pin `tier:'opus'` lúc Fable về).

> ⚠️ **VACUOUS-hay-THẬT tùy runtime** (`§K.D:332` viết lúc Fable-outage): KHI Fable DOWN → real vs clone hội-tụ Opus-1M = 0 runtime-delta (vacuously-inert đúng nguyên-văn). KHI **Fable UP** (vd S108) → **phân-tầng THẬT bén**: real = single-Fable deep ⟂ clone pin `tier:'opus'` = ensemble tier-2 đúng nghĩa §K.B — cost-lever SỐNG, và **S108 = lần đầu** (dogfood §5.5).

**☑ Checklist decision (mỗi mục tick + evidence):**
- [ ] Vai ANH GÁN ∈ roster — evidence: quote nguyên văn lệnh anh (H21; 2 monitor × lệnh-B → limitation K.E) *(🧊 H19: "việc ∈ {reviewer, investigator-codebase}")*
- [ ] INVOCATION{lệnh, vai, đề-bài} parse đúng từ lượt lệnh — evidence: quote lệnh *(🧊 H19: "đọc marker BƯỚC 0.5b")*
- [ ] BƯỚC 0.6 probe lead-runtime — evidence: "lead=Fable" | "lead=Opus-1M(H5)"
- [ ] Clone: `taskList[*].role` đồng-nhất (GAP-1) — evidence: grep taskList
- [ ] Harvest: 1 entry/vai + nhãn `[engine: …]` (GAP-2/3) — evidence: diff `agent-memory/<role>/MEMORY.md`
- [ ] git-diff post-P2 = 0 tracked-change ngoài run-folder (GAP-3 containment) — evidence: `git status`

## 3. LANE INVESTIGATOR-CODEBASE (ground-truth — xác minh sự thật)

> **Vị-trí (b) của H19** — "Ground-truth / xác-minh sự-thật" = `investigator-codebase` (truy bằng-chứng gốc `file:line` + `sqlcmd` + `git`, chống bịa + RCA). `investigator-api` và `database-agent` **EXCLUDED** khỏi 2 vị-trí phán-quyết (`harness-11-engine.md:320`, K.A.b). *(H21: section này = **template tham-chiếu** cho vai hay-gán-nhất; vai thực-tế do ANH GÁN trong lệnh — mọi vai roster hợp-lệ, "EXCLUDED" = ngữ-cảnh 2-vị-trí H19 cũ.)*
> **Luật ở đâu, nút ở đâu:** ngữ-nghĩa 2 mode + 3 GAP-guard + 3 floor-point = **engine §K** (`harness-11-engine.md:322-334`) — KHÔNG lặp lại ở đây. Section này = **cách bấm nút**: biến vào lane, tham-số spawn, checklist tick-được, fallback.

### 3.1 Bảng BIẾN đầu vào lane

Mọi biến em-main chốt @P0/P1 rồi bơm vào lane. Kiểu + nguồn đọc (`file:line` hoặc lệnh) + ví-dụ giá-trị THẬT (domain SOLUTION_ERP):

| Biến | Kiểu | Nguồn đọc (file:line / lệnh) | Ví-dụ giá-trị thật |
|---|---|---|---|
| 🧊 `$mode` (H19 retired) | `enum{real,clone}` | `Test-Path .claude/fable-real-mode.on` → `$true`=real · `$false`=clone (marker = source-of-truth, `fable-real.md:10`; K.B `harness-11-engine.md:322-323`). Marker **gitignored** — verify `git check-ignore .claude/fable-real-mode.on` ✓ | `real` (marker CÓ, `.claude/fable-real-mode.on:1` — set S108) |
| `$engine` (H21) | enum `{real-single, clone-ensemble}` | derive từ TÊN LỆNH lượt này (`/fable-real`\|`/fable-clone`) — KHÔNG file-state (INVOCATION §2.1-bis) | `real-single` (vd lượt anh gõ `/fable-real <vai>`) |
| `$target` | `string` | Câu-hỏi sự-thật em-main đóng-khung @P1; nếu qua lệnh = `$ARGUMENTS` của `/fable-real` (`fable-real.md:12`) | `"PE multi-winner đã wire ĐỦ read-site sau đổi field single→multi — TRUE/FALSE + chỗ sót?"` |
| `$claimsList` | `array<string>` | em-main tách $target thành claim nguyên-tử @P1 | `["PurchaseEvaluation entity field multi-winner là collection (KHÔNG single Guid)", "PeService.ApproveV2Async đọc multi-winner ở MỌI read-site", "FE PE matrix render N winner"]` |
| `$evidencePaths` | `array<path\|glob>` | Con-trỏ seed từ recon P1 (KHÔNG giới-hạn — lane mở rộng nếu cần) | `["src/Backend/SolutionErp.Domain/PurchaseEvaluations/*.cs", "src/Backend/SolutionErp.Application/PurchaseEvaluations/**/*.cs", "fe-user/src/**/pe/**/*.tsx"]` |
| `$budgetNote` | `string` | Sàn persona: `maxTurns 20` (`investigator-codebase.md:13`) + report `≤500 words` (`:43`) + ưu-tiên `search_code` BM25 trước Read full-file (`:39`) | `"single-deep-pass; maxTurns 20; report ≤500 words; search_code trước Read"` |
| `$engineLabel` | `string` | Engine runtime THỰC-TẾ lúc spawn — đọc **BƯỚC 0.6 probe MỖI PHIÊN** (per-session outage-driven; ⚠️ KHÔNG tin comment `hmw.js:31` — snapshot S66-era có thể stale). Dùng cho GAP-2 stamp @P3 | `"Fable-S108"` (S108 Fable UP, self-report ×5) · khi outage: `"Opus-1M(H5)-Sxxx"` |
| `$memSlice` | `string` | **Clone-mode**: slice MEMORY của vai — 200 dòng đầu / 25KB `.claude/agent-memory/investigator-codebase/MEMORY.md` (`investigator-codebase.md:31`). Bơm qua `memoryPack["investigator-codebase"]` (`hmw.js:103`). **Real-mode**: auto-inject bởi Agent-tool, KHÔNG cần bơm | `"PE V2 flagship (ApproveV2Async/LevelOpinion) · gotcha #53 truncation · #78/#79 PE finalize-flag · cardinality-change grep-consumers S87/S88"` |
| `$lensList` | `array<string>` | **Clone-mode only** — N lăng-kính em-main thiết-kế @P1 (mỗi lăng-kính = 1 lane CÙNG vai, GAP-1) | `["evidence-lens", "counter-example-lens", "provenance-lens"]` |

### 3.2 REAL-mode — single-deep-pass qua Agent tool

Điều-kiện: lượt này **anh gõ `/fable-real <vai> <đề-bài>`** (H21 — quote lệnh làm evidence). 🧊 *(H19: `$mode == real` marker CÓ.)* Spawn **DUY NHẤT 1** `investigator-codebase` qua **Agent tool** (KHÔNG qua `hmw.js` — hmw dành cho clone-ensemble), đào SÂU 1 lần. Frontmatter `investigator-codebase.md:5` nay = `model: opus` (worker-tier-pin S124) ⇒ 🔴 real-mode PHẢI set `model:'fable'` param tại spawn (spawn-param THẮNG pin — đo S126; không set = opus): Fable up = Fable · Fable down (H5) = set `'opus'` Opus-1M per-run (§3.6).

**Tham-số spawn (Agent tool / Task):**

```
subagent_type: "investigator-codebase"
model:         fable                   # 🔴 PHẢI set param (frontmatter nay pin opus S124; param THẮNG pin — đo S126). Fable-outage → 'opus' (H5 §3.6)
description:   "ground-truth: <$target rút gọn 1 dòng>"
prompt: |
    # NHIỆM-VỤ: ground-truth / xác-minh sự-thật (Fable-real, single-deep-pass)
    Mày là lane phán-quyết DUY-NHẤT — KHÔNG có lane thứ 2. Đào cạn-kiệt bằng-chứng gốc, 1 lần.

    ## ĐỐI-TƯỢNG XÁC-MINH ($target)
    {{$target}}

    ## CLAIM cần chốt TRUE/FALSE ($claimsList)
    {{#each $claimsList}}- {{this}}
    {{/each}}

    ## CON-TRỎ FILE/GLOB seed — KHÔNG giới-hạn, mở rộng nếu cần ($evidencePaths)
    {{#each $evidencePaths}}- {{this}}
    {{/each}}

    ## NGÂN-SÁCH ($budgetNote): {{$budgetNote}}

    ## CÁCH LÀM (sàn persona investigator-codebase.md)
    - Grep/Read/Glob + Bash READ-only (sqlcmd LocalDB · git log/blame/diff · KHÔNG Edit/Write/commit — :88).
    - search_code BM25 TRƯỚC Read full-file (:39, tiết-kiệm token).
    - Schema/migration claim → đối-chiếu DB THẬT: sqlcmd _Dev (:64) + 3-file rule Up/Down·Designer·Snapshot (:79).
    - Wire claim → grep `// Mock|alert(|setEditing(null) // close UI` = 0 + verb POST/PUT/DELETE thật (:72-76).
    - Fabricate-guard: thiếu chứng → GHI "uncertain + lý-do", TUYỆT-ĐỐI KHÔNG đoán (:93).

    ## RETURN FORMAT (BẮT-BUỘC — chống #53 garble; DÒNG 1 = VERDICT header máy-đọc-được)
    VERDICT: TRUE | FALSE | PARTIAL | UNCERTAIN — <1 dòng tổng>
    CLAIMS:
    - <claim> → TRUE/FALSE/UNCERTAIN — <file:line | "không tìm thấy">
    EVIDENCE:
    - <file:line> <dữ-liệu cụ-thể>
    SURPRISES (ngoài câu-hỏi chính):
    - <phát-hiện bất-ngờ | "không">
    RECOMMENDATION: <1 câu | "không">
    TOKENS: <ước-lượng>
    MEMORYDELTA (4-field — để EM-MAIN harvest, GAP-3 RETURN-only):
    - task: <việc> · verdict: <PASS/FAIL/root-cause> · learned: <pattern> · surprise: <edge-case>
    ⚠️ DÒNG 1 PHẢI bắt đầu "VERDICT:" — KHÔNG mở đầu bằng narrative / tóm-tắt-transcript.
```

**Em-main sau spawn (P3):**
1. **Chống #53:** kiểm dòng-1 return khớp regex `^VERDICT:`. Nếu garble (sub trả wrong-slice-of-transcript, #53 ×11 qua S105) → thang recover `feedback_agent_return_garble_recover`: (1) đọc diary → (2) `SendMessage`-resume in-session → (3) em-main solo redo.
2. **GAP-2 (engine-label):** stamp `$engineLabel` — SCHEMA `memoryDelta` KHÔNG có field engine (`hmw.js:57-63`), em-main gắn nhãn @P3 (`harness-11-engine.md:329`, mirror "model-note Opus-S101").
3. **GAP-3 (RETURN-only):** lane KHÔNG tự ghi MEMORY (persona `:6` KHÔNG có Write tool; step-5 self-update `:54` bị H19 override) → em-main single-writer (B3) ghi **1** entry vào `.claude/agent-memory/investigator-codebase/MEMORY.md` từ block `MEMORYDELTA`.

### 3.3 CLONE-mode — N-lane ensemble qua hmw.js parallel

Điều-kiện: lượt này **anh gõ `/fable-clone <vai> <đề-bài>`** (H21). 🧊 *(H19: `$mode == clone` marker VẮNG = mặc-định.)* N lane **CÙNG 1 vai** `investigator-codebase` (GAP-1: đa-lăng-kính, **KHÔNG** mixed-roster fan-out — `harness-11-engine.md:328`), mỗi lane 1 lăng-kính ∈ `$lensList`. Reuse `hmw.js parallel` (dogfood S101, `fable-clone.md:8-9`).

**args JSON shape thật** (em-main bơm @P2 — `hmw.js:14-20`):

```json
{
  "checkpointApproved": true,
  "spec": "GROUND-TRUTH $target. Acceptance: mỗi claim có verdict + file:line; fabricate-guard (uncertain khi thiếu chứng); report ≤500 words. RETURN dòng-1 = 'VERDICT:'.",
  "memoryPack": {
    "investigator-codebase": "<$memSlice — 200 dòng đầu/25KB agent-memory/investigator-codebase/MEMORY.md>"
  },
  "taskList": [
    { "role": "investigator-codebase", "tier": "opus", "label": "inv-evidence-lens",
      "prompt": "LĂNG-KÍNH=EVIDENCE (chứng THUẬN). Tìm file:line CHỨNG-MINH mỗi claim đúng. $claimsList=[...]. $evidencePaths=[...]. RETURN: VERDICT-header + CLAIMS + EVIDENCE + memoryDelta." },
    { "role": "investigator-codebase", "tier": "opus", "label": "inv-counter-example-lens",
      "prompt": "LĂNG-KÍNH=COUNTER-EXAMPLE (phản-chứng, adversarial). Săn nơi claim VỠ: read-site sót, mock còn sót, drift DB-vs-code, cardinality single-vs-multi. RETURN như trên." },
    { "role": "investigator-codebase", "tier": "opus", "label": "inv-provenance-lens",
      "prompt": "LĂNG-KÍNH=PROVENANCE (xuất-xứ). git log/blame + migration 3-file + commit hash: claim vào repo KHI nào, commit nào, mig nào. RCA nếu FALSE. RETURN như trên." }
  ]
}
```

Ghi-chú shape:
- **KHÔNG** key `run` → chạy **DEFAULT return-delta-only** (`hmw.js:88-96`, `wave=null`) — nhẹ, hợp ground-truth. Job cực lớn mới thêm `run:{name,dir}` (RUN-TRACE, phải scaffold folder @P1).
- `"tier":"opus"` mỗi task = **🔴 BẮT BUỘC khi Fable UP** (K.B: clone = ensemble **tier-2** by-definition — bỏ pin → `resolveModel` trả `undefined` = N×Fable-inherit, 2 vị-trí chạm top-model NGOÀI chế-độ thật, trái K.D floor-2). Khi outage: inherit đã = Opus → pin moot-vô-hại, GIỮ nguyên (`hmw.js:37-44`).
- `memoryPack` keyed theo vai → N lane CÙNG vai nhận CÙNG 1 slice (`hmw.js:103`) = đúng "một vai = một trí-nhớ".
- `checkpointApproved:true` bắt-buộc, thiếu → `throw` (`hmw.js:77-79`).

**Em-main refute + synthesize (P3/P4):**
1. Gom N return (mỗi lane `{findings, checklistEvidence, memoryDelta}` — SCHEMA `hmw.js:47-66`).
2. Đối-chiếu per-claim: evidence-lens=TRUE nhưng counter-example-lens tìm được chứng VỠ cụ-thể → verdict = **PARTIAL/FALSE** (counter thắng khi có `file:line` chứng ngược). Provenance-lens = trọng-tài xuất-xứ khi 2 lane cãi "đã có từ bao giờ" (hash/commit thắng).
3. **Refute chống consensus-sai:** cả N đồng-thuận nhưng em-main spot chứng ngược → tự đào thêm (Smart-Friend-style; dogfood S101 bắt `README:51` stale-label mà token-exact sweep sót, commit `f229b07`).
4. Kết: **1** verdict hợp-nhất + evidence-set gộp (dedupe `file:line`).
5. GAP-2 stamp `$engineLabel` + GAP-3 ghi **1** MEMORY entry (single-writer B3) — KHÔNG N entry, KHÔNG lane tự-ghi (`hmw.js:120`).

### 3.4 CHECKLIST lane (tick-được — 12 mục, mỗi mục kèm evidence-form)

Tick mỗi lần chạy lane (cả 2 mode trừ khi ghi `[clone]`/`[real]`):

- [ ] **1. INVOCATION xác-định đúng** — {lệnh, vai, đề-bài} từ lượt lệnh anh; vai ∈ roster (§2.1-bis, H21) — *evidence:* quote nguyên-văn lệnh anh gõ (🧊 cũ: `$mode` từ Test-Path marker)
- [ ] **2. Mỗi claim ∈ `$claimsList` có verdict** TRUE/FALSE/PARTIAL/UNCERTAIN — *evidence:* block `CLAIMS:` đủ N dòng = `len($claimsList)`
- [ ] **3. Mỗi verdict neo `file:line` MỞ-ĐƯỢC** — *evidence:* re-open `Read <path>:<line>` / `Grep -n` khớp nội-dung (persona `:43-48`)
- [ ] **4. Fabricate-guard** — thiếu chứng → "uncertain + lý-do", KHÔNG đoán — *evidence:* grep return có `uncertain|không tìm thấy` ở claim thiếu chứng (persona `:93`)
- [ ] **5. Schema/migration claim đối-chiếu DB THẬT** — *evidence:* `sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Dev -Q "SELECT MigrationId FROM __EFMigrationsHistory"` (persona `:64`) + 3-file rule `ls src/Backend/SolutionErp.Infrastructure/Migrations/*<Name>*` (persona `:79`)
- [ ] **6. Wire/endpoint claim = code THẬT KHÔNG mock** — *evidence:* `git grep -nE "// Mock|alert\(|setEditing\(null\) // close UI"` = 0 hit + verb POST/PUT/DELETE thật (persona `:72-76`)
- [ ] **7. Authz claim: per-action policy** (gotcha #44 silent 403) — *evidence:* `grep -n "\[Authorize(Policy" <controller>.cs` (persona `:74`)
- [ ] **8. Provenance origin traced** — *evidence:* `git log -1 --oneline -- <path>` / `git blame -L <n>,<n> -- <path>` / commit hash (persona Bash `:23,:40`)
- [ ] **9. Surprises ngoài-câu-hỏi captured RIÊNG** — *evidence:* return có block `SURPRISES:` (persona `:48`; scope-drift-guard `:94`)
- [ ] **10. Report ≤500 words + TOKENS tracked** — *evidence:* `word-count(findings) ≤ 500` + dòng `TOKENS:` (persona `:43,:51`)
- [ ] **11. RETURN dòng-1 = `VERDICT:` header** (anti-#53) — *evidence:* regex `^VERDICT:` match dòng đầu; FAIL → recover ladder `feedback_agent_return_garble_recover` (diary → SendMessage-resume → em-main solo)
- [ ] **12. [clone] N lane CÙNG vai + em-main 1-entry** — *evidence:* `taskList[*].role == "investigator-codebase"` (GAP-1; `hmw.js:22-28`) ∧ sau synth `.claude/agent-memory/investigator-codebase/MEMORY.md` **+1** entry duy-nhất có nhãn `$engineLabel` (GAP-2/3; single-writer B3; `agents/README.md:209`)

### 3.5 Fallback H5 per-run (Fable down → single-Opus-1M, KHÔNG đổi mode)

- **Trigger:** tại thời-điểm spawn, BƯỚC 0.6 probe báo Fable DOWN (H5) → `inherit` resolve = **Opus-1M**. Trạng-thái = **per-session outage-driven** (flip-chain canonical → `docs/STATUS.md §Sub-agents`; vd S103/S104/S106 Opus · S105/S107/S108 Fable) — ⚠️ KHÔNG suy từ comment `hmw.js:31` (snapshot cũ).
- **Hành-vi:** lane VẪN chạy đúng `$mode` hiện-tại — **marker KHÔNG đổi**. CHỈ engine resolve khác (top-model = Opus-1M thay Fable). Đây là per-**RUN**, KHÔNG phải mode-flip (`fable-real.md:20`; K.B `:323`).
- **KHÔNG tự gõ `/fable-clone`** khi Fable down. Đổi mode = QUYỀN ANH (K.D point-2; `fable-real.md:17`) — H5 chỉ hạ engine, giữ mode.
- **`$engineLabel` ghi trung-thực:** chạy Opus thì stamp `Opus-S108`, KHÔNG ghi "Fable" → GAP-2 stamp đúng thực-tế (`harness-11-engine.md:329`).
- **Khi Fable về:** `inherit` tự lên Fable (`hmw.js:32`) → real-mode = single-Fable (sâu nhất); clone-mode muốn để-dành quota top-model cho lead thì thêm `tier:'opus'` per-task (`hmw.js:38`).

> ⚠️ **Honest (pointer §K, KHÔNG re-litigate — nguyên bản viết lúc outage):** KHI Fable DOWN → real vs clone **hội-tụ Opus-1M**, khác-biệt còn lại = **cấu-trúc** (real=1 deep pass · clone=N-lane + synth). KHI Fable UP + clone pin `tier:'opus'` → khác-biệt **model-tier THẬT**. Thật-mode-toggle **first-real-run S108** (dogfood §5.5 — engine `:334` đã note-supersede kèm); value = depth + anti-consensus-catch + phân-tầng owner-control.

## 4. LANE REVIEWER (cổng rà-soát cuối — adversarial)

> **Vai trò (engine §K.A, `docs/governance/harness-11-engine.md:320`):** `reviewer` = **(a) Cổng rà-soát cuối** — adversarial 6-category + Smart-Friend anti-rubber-stamp + live-curl falsify + phân-xử mâu-thuẫn. Persona canonical: `.claude/agents/reviewer.md`. Runbook này = **cách bấm nút** (§K = LUẬT; KHÔNG lặp lại). Engine do **TÊN LỆNH lượt này** quyết (H21): `/fable-real` = single deep-pass top-model THẬT ⟺ `/fable-clone` = ensemble N-lane CÙNG vai. 🧊 *(H19: 2 mode do marker quyết, clone = mặc-định — retired.)*

### 4.1 — BẢNG BIẾN lane (tên · kiểu · nguồn đọc · ví-dụ)

| Biến | Kiểu | Nguồn (file:line hoặc lệnh đọc) | Ví-dụ |
|---|---|---|---|
| 🧊 `$mode` (H19 retired) | enum `real`\|`clone` | `Test-Path .claude/fable-real-mode.on` — TỒN-TẠI=real, VẮNG=clone-default (`session-start.md:27-33` BƯỚC 0.5b · `fable-real.md:10`) | `clone` (marker vắng) |
| `$engine` (H21) | enum `{real-single, clone-ensemble}` | derive từ TÊN LỆNH lượt này (`/fable-real`\|`/fable-clone`) — KHÔNG file-state (INVOCATION §2.1-bis) | `clone-ensemble` (vd lượt anh gõ `/fable-clone <vai>`) |
| `$modelTier` | enum `fable`\|`opus` | BƯỚC 0.6 runtime probe (`session-start.md:35-37`) — Fable UP=`fable`, outage=`opus` (H5); per-session KHÔNG steady-state | `fable` (S108 UP ×5 self-report) |
| `$reviewTarget` | diff-range \| file-set \| claim-set | `git diff base..head` (`reviewer.md:37,54`) | `HEAD~3..HEAD` — 4 file, +180/-40 LOC |
| `$spec` | string (prompt gốc + acceptance) | em-main P1 → `hmw.js:86,126` (`spec`) · `reviewer.md:36-42` | "Wire CRUD Supplier POST/PUT/DELETE + validator" |
| `$categories` | enum-set 6 (Cat-6 điều-kiện) | `reviewer.md:47-197` (Cat1 Wire · Cat2 Schema · Cat3 Security · Cat4 CodeQ · Cat5 Test · Cat6 Writing*) | `[1,2,3,4,5]` (không outward → bỏ 6) |
| `$deployClaim` | bool `Y`\|`N` | em-main spec (`reviewer.md:40`) | `Y` → kích `$liveProbe` |
| `$outwardFlag` | bool `Y`\|`N` | target chứa email/adap-report/broadcast/shared-doc? (`reviewer.md:189`) | `N` → Cat-6 = N-A |
| `$liveProbe` | curl cmd-set (chỉ khi `$deployClaim=Y`) | `reviewer.md:58-88` (login→bearer→POST/PUT/DELETE/PATCH `-w "%{http_code}"`) | `curl -X POST https://api.solutions.com.vn/api/suppliers ... -w "%{http_code}"` |
| `$verdictForm` | struct `{verdict, diffScope, catTable[6], issues{critical,major,minor}[file:line], liveVerifyTable, recommendation, tokenCost}` | `reviewer.md:201-242` | `verdict=FAIL; catTable[1]=FAIL(1 critical)` |
| `$memoryPackSlice` | string (slice reviewer diary) | `.claude/agent-memory/reviewer/MEMORY.md` → `hmw.js:85,103` (SLICE, KHÔNG full) | "gotcha #44 silent-403 · #25 IIS 405 · wire-claim FP pattern" |

### 4.2 — REAL (lệnh-A `/fable-real`): single deep-pass Agent-tool *(🧊 H19: "marker CÓ")*

**Precondition (H21):** lượt này anh gõ `/fable-real <vai>` kèm đề-bài (quote lệnh làm evidence). REAL = **1 spawn TRỰC-TIẾP** (KHÔNG qua `hmw.js` — hmw = clone ensemble). 🧊 *(cũ H19: `Test-Path` marker = True.)*

**(a) Spawn param (Agent-tool / Task — 1 lần):**
```
# em-main spawn 1 reviewer trực-tiếp — single top-model deep pass (fable-real.md:20 · §K.B:323)
Task/Agent(
  subagent_type: 'reviewer',          # = agentType; persona .claude/agents/reviewer.md; VALID_ROLES hmw.js:22-28
  description : 'reviewer-real: <$reviewTarget>',
  # model    : 'fable' — 🔴 PHẢI set (S124 frontmatter pin opus ⇒ KHÔNG set = opus; spawn-param THẮNG pin, đo S126)
  #            Fable UP  → single-Fable (sâu nhất, đắt nhất)
  #            Fable DOWN→ set 'opus' = single-Opus-1M (H5 per-run — fable-real.md / §4.7)
  prompt     : <<ADVERSARIAL TEMPLATE (b)>>
)
```

**(b) Prompt-template adversarial (dán thẳng vào `prompt`):**
```
## VAI: reviewer (adversarial cổng-cuối). GIẢ-ĐỊNH implementation CÓ BUG — việc của mày là TÌM RA (reviewer.md:18).
## MODE: Fable-real single-deep-pass. Engine-label = "real-<$modelTier>-<Sxxx>" do EM-MAIN stamp @P3 (mày KHÔNG tự ghi — GAP-2 §K.C:329).

## $reviewTarget (diff soi): <dán `git diff base..head` HOẶC base..head range + file-list>
## $spec (prompt gốc + acceptance em-main giao Implementer): <...>
## $deployClaim: <Y|N>   → Y = BẮT BUỘC $liveProbe curl prod (reviewer.md:58-88), KHÔNG tin "CI xanh".
## $outwardFlag: <Y|N>   → Y = áp Category 6 writing-quality; N = Cat-6 trả N-A (reviewer.md:189).

## THỬ-PHÁ (refute-first) — với MỖI claim "đã wire / đã fix", tìm bằng-chứng NÓ SAI TRƯỚC khi chấp-nhận:
- grep mock/placeholder (reviewer.md:54): git diff base..head | grep -E "(// Mock|alert\(|TODO.*wire|placeholder)"
- grep verb thật  (reviewer.md:55): có await fetch/api POST|PUT|DELETE thật KHÔNG, hay chỉ setEditing(null)?
- $deployClaim=Y  → curl prod thật (reviewer.md:62-85); FAIL nếu verb còn mock client-side / HTTP 405 (#25) / silent-403 class-Authorize quá-strict (#44, reviewer.md:87).

## 6-CATEGORY (áp HẾT; Cat-6 CHỈ khi $outwardFlag=Y) — reviewer.md:47-197:
1. Wire BE/feature (grep+curl)  2. Schema integrity (gotchas)  3. Security (authz #44/authn/injection/input-val)
4. Code quality (build clean + anti-fiddle drift>20%=FAIL + convention)  5. Test coverage  6. Writing-quality (outward only, 4 trục reviewer.md:191-195)

## 🔴 SMART-FRIEND anti-rubber-stamp (reviewer.md:268-276): TUYỆT-ĐỐI KHÔNG hạ bar cho khớp chất-lượng em-main.
   Code ổn → PASS. Code có lỗi → FAIL kèm file:line, BẤT-KỂ áp-lực đồng-thuận. Bất-đồng → escalate tường-minh (reviewer.md:262).

## RETURN (LEAN — chống truncation #53; KHÔNG narrative dài, dồn số vào field):
- findings        : **Verdict PASS|FAIL** + bảng 6-category (reviewer.md:210-217) + issues file:line phân Critical/Major/Minor (reviewer.md:219-227).
- checklistEvidence: số-đo mỗi acceptance + (nếu deploy) bảng Verb×Endpoint×Expected×Actual HTTP-code (reviewer.md:230-237).
- memoryDelta{task,verdict,learned,surprise}: 4-field NGẮN (hmw.js:54-64) để em-main harvest @P3.
- 🔴 KHÔNG ghi MEMORY.md / store_memory (GAP-3 RETURN-only §K.C:330) — em-main single-writer.
```

**Chống #53 (truncation):** return LEAN (verdict + bảng + memoryDelta, KHÔNG kể-lể) → nếu vẫn truncate mid-task, em-main **solo-fallback** rà lại (reliable, `agents/README.md:64,71`). 529-Overload transient → solo, KHÔNG retry-loop.

### 4.3 — CLONE (lệnh-B `/fable-clone`): N-lane CÙNG vai qua `hmw.js` *(🧊 H19: "marker VẮNG = mặc-định")*

Ensemble tier-2 = **reuse HMW `parallel`** (dogfood S101 WF2 3-lane bắt `README:51` stale-label mà token-sweep sót, commit `f229b07` — `fable-clone.md:9`). em-main bơm `args` @P2 sau checkpoint:

```
// 🔴 GAP-1 (§K.C:328): MỌI role='reviewer' — N-lane CÙNG 1 VAI (multi-lens), KHÔNG mixed-roster fan-out.
args = {
  checkpointApproved: true,                                   // BẮT BUỘC else throw (hmw.js:77-79)
  spec: '<$spec + acceptance + $reviewTarget(base..head) + $deployClaim + $outwardFlag>',   // hmw.js:86,126
  memoryPack: { reviewer: '<$memoryPackSlice — gotcha #44/#25 + wire-claim FP pattern>' },  // hmw.js:85,103 (SLICE)
  taskList: [
    { role:'reviewer', tier:'opus', label:'rev-correctness',
      prompt:'LENS=correctness — Cat1 Wire-BE + Cat2 Schema + Cat4 CodeQ (reviewer.md:47/91/146). grep mock+verb, dotnet build clean.' },
    { role:'reviewer', tier:'opus', label:'rev-security',
      prompt:'LENS=security — Cat3 (reviewer.md:120): [Authorize] class+per-action #44, FluentValidation, injection/XSS/path-traversal.' },
    { role:'reviewer', tier:'opus', label:'rev-writing',
      prompt:'LENS=writing-quality — Cat6 (reviewer.md:187) CHỈ khi $outwardFlag=Y (email/adap-report/broadcast); N → trả N-A.' },
    { role:'reviewer', tier:'opus', label:'rev-reproduce',
      prompt:'LENS=does-it-reproduce — Cat5 test + $liveProbe: chạy build/test + (deploy) curl prod reviewer.md:58-88, thử tái-hiện claim.' },
  ],
}
// invoke: Workflow(hmw.js) với args ↑ — DEFAULT return-delta-only (review nhẹ, KHÔNG cần run-folder; hmw.js:118-122).
```

**4 lăng-kính (lens):** `correctness` · `security` · `writing-quality` · `does-it-reproduce`. Mỗi lane INHERIT persona `reviewer.md` (cùng 6-category) nhưng FOCUS 1 lens → đa-góc chống điểm-mù.

**`tier:'opus'` (🔴 BẮT BUỘC khi Fable UP — KHÔNG phải option):** hiện-thực "ensemble **tier-2**" (§K.B:324) — escape-hatch `hmw.js:36,38` ép Opus. Fable UP mà BỎ pin → N lane inherit = **N×Fable** = 2 vị-trí chạm top-model NGOÀI chế-độ thật (trái K.D floor-2 "chỉ khi anh gõ"). Khi outage → `inherit` đã = Opus → pin moot-nhưng-vô-hại, GIỮ nguyên để an-toàn khi Fable về.

**em-main synthesize verdict cuối (P3/P4):**
1. Gom 4 return (findings + memoryDelta 4-field).
2. **Refute (P3):** lane FAIL kèm issue confirmed file:line → GIỮ; lane over-claim không bằng-chứng → BÁC.
3. **Merge → 1 verdict:** bất-kỳ lane FAIL-confirmed → overall **FAIL**; `rev-writing` = N-A khi `$outwardFlag=N` (KHÔNG kéo verdict).
4. **GAP-2 stamp:** em-main gắn engine-label `"clone-ensemble-4lane-opus-<Sxxx>"` @P3 harvest (`§K.C:329`).
5. **GAP-3:** 4 lane RETURN-only → em-main ghi **1 MEMORY entry** `reviewer` (single-writer B3, `§K.C:330`).

### 4.4 — 3 GAP-guard §K.C (bắt buộc CẢ 2 mode — pin để stamp CÓ NGHĨA)

| GAP | Rủi-ro (engine) | Cách bấm | Nguồn |
|---|---|---|---|
| **GAP-1 scope-creep** | `hmw.js` VALID_ROLES nhận **TOÀN roster** KHÔNG gate → worker-tier-pin CHE leak qua opus (như thời all-inherit) | CLONE `taskList` MỌI `role:'reviewer'` (N-lane CÙNG vai, KHÔNG mixed-roster) | `§K.C:328` · `hmw.js:22-36` |
| **GAP-2 engine-label** | SCHEMA `memoryDelta` KHÔNG field engine | em-main **stamp nhãn engine @P3 harvest** (`real\|clone-<tier>-Sxxx`) = convention | `§K.C:329` · `hmw.js:54-64` |
| **GAP-3 AS-10 fragment** | N lane giữ Bash (fails-open) → phân-mảnh trí-nhớ | N lane **RETURN-only** → em-main ghi **1 entry / vai** (+ nhãn) | `§K.C:330` · `fable-real.md:26` |

### 4.5 — CHECKLIST thi-hành (tick-được, mỗi mục có evidence-form)

- [ ] **1. INVOCATION xác-định đúng** — {lệnh, vai, đề-bài} từ lượt lệnh anh; vai ∈ roster (§2.1-bis, H21). *Evidence:* quote nguyên-văn lệnh anh gõ. 🧊 *(cũ H19: Mode resolved từ Test-Path marker + BƯỚC 0.5b.)*
- [ ] **2. Runtime tier probed** — BƯỚC 0.6 xác-định `inherit`=Fable\|Opus. *Evidence:* probe self-report `"claude-fable-5"`\|`"opus"` (`session-start.md:35-37`).
- [ ] **3. `$reviewTarget` chốt** — diff-range/file-set cụ-thể. *Evidence:* `git diff --stat base..head` (số file, +Y/-Z LOC).
- [ ] **4. 6-category áp đủ** (Cat-6 CHỈ khi `$outwardFlag=Y`). *Evidence:* bảng 6-dòng PASS/FAIL trong `$verdictForm` (`reviewer.md:210-217`).
- [ ] **5. Wire-BE grep-proof** (nếu wire claim). *Evidence:* 2 grep `reviewer.md:54-55` → 0 mock-hit + verb POST/PUT/DELETE thật hiện.
- [ ] **6. `$liveProbe` chạy** (nếu `$deployClaim=Y`). *Evidence:* bảng Verb×Endpoint×Expected×Actual HTTP-code (`reviewer.md:230-237`).
- [ ] **7. Smart-Friend giữ** (KHÔNG hạ bar). *Evidence:* verdict độc-lập + refute-note; bất-đồng escalate (`reviewer.md:262,268-276`).
- [ ] **8. Verdict binary PASS\|FAIL + issues file:line.** *Evidence:* `$verdictForm` Critical/Major/Minor list (`reviewer.md:219-227`).
- [ ] **9. GAP-1 N-lane CÙNG vai** (clone). *Evidence:* `hmw.js` args `taskList` MỌI `role:'reviewer'` (`§K.C:328`).
- [ ] **10. GAP-3 RETURN-only.** *Evidence:* `git status` sạch ngoài run-folder; sub 0 ghi MEMORY.md/store_memory (`§K.C:330`).
- [ ] **11. GAP-2 engine-label stamp.** *Evidence:* 1 MEMORY entry `reviewer` có nhãn `"real\|clone-<tier>-Sxxx"` @P3 (`§K.C:329`).
- [ ] **12. Synthesize 1 verdict** (clone). *Evidence:* em-main P3/P4 refute-merge note → 1 PASS/FAIL cuối (`§K.B:324`).

### 4.6 — Ranh-giới vs investigator-codebase (2-đầu-khác-trục, L.B §4 engine:344)

| Trục | **reviewer** (lane NÀY) | **investigator-codebase** (lane KIA) |
|---|---|---|
| Câu-hỏi | "Diff này ĐÚNG spec + an-toàn commit KHÔNG?" (**phán**) | "Sự-thật hiện-trạng là GÌ?" (**truy**) |
| Thế | Adversarial — giả-định CÓ bug, thử-phá (`reviewer.md:18`) | Neutral audit — chống bịa + RCA (`investigator-codebase.md:4,18`) |
| Xuất | Verdict gate PASS/FAIL + issues file:line (`reviewer.md:204`) | Conclusion + Evidence file:line + Surprises (`investigator-codebase.md:44-52`) |
| Trigger | pre-commit / wire-BE claim / heavy diff (`reviewer.md:4`) | pre-flight recon / scan >5 file / schema drift (`investigator-codebase.md:4`) |

**KHÔNG trùng việc (chống "cùng-góc-cùng-điểm-mù", `engine:344`):** reviewer **PHÁN** (adversarial gate) ⟂ investigator **TRUY** (ground-truth evidence). Khi review cần ground-truth sâu (VD "prod schema thật ra sao") → reviewer KHÔNG tự RCA, mà em-main spawn `investigator-codebase` **song-song** feed evidence về. Boundary: reviewer KHÔNG thay investigator gather-evidence; investigator KHÔNG phán PASS/FAIL. Đây chính là cặp dogfood S101 (`§K.A:320`).

### 4.7 — Fallback H5 (per-run, KHÔNG đổi mode toàn-cục)

- **REAL + Fable outage** (BƯỚC 0.6 báo Opus) → spawn tự chạy **single-Opus-1M** (`inherit` resolve Opus) = **per-run fallback**, KHÔNG đổi marker/mode (`fable-real.md:20` · `§K.B:323`).
- **Revert-free:** KHÔNG sửa `reviewer.md` frontmatter — promote `inherit` tự theo lead; Fable về → tự lên Fable lại (H5, `agents/README.md:10`).
- **CLONE + outage:** 4 lane `inherit`=Opus (tier:'opus' moot); Fable về → `tier:'opus'` giữ ensemble ở tier-2.
- **Spawn fail / truncate #53 / 529** → em-main **solo-fallback** rà lại (`agents/README.md:64,71`).

### 4.8 — K.D 3 floor-point RC-stamped (governance neo — `RC-pqhuy1987-03-07-2026-17-46-35`, `ACTIVE-MARKS.md`)

(1) **lead = DEFAULT Opus 5 MAX (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); cao hơn = anh `/model` · lệnh engine-đắt — 🧊 MTv3 superseded-VALUE @S151-sweep); CẤM Sonnet/Haiku-class ghế lead** — lane này KHÔNG đụng lead · (2) **top-model deep-run CHỈ trong lượt lệnh engine-đắt anh gõ kèm vai (H21)** — `reviewer`+`investigator-codebase` (khi anh gán) · (3) mọi vai khác giữ default. 🧊 *(văn K.D gốc: "lead LUÔN top-model · CHỈ reviewer+investigator-codebase chạm top-model chế-độ THẬT, CHỈ khi anh gõ /fable-real" — superseded model-tier-v3 + H21.)* ⚠️ **Nấc runtime tùy phiên** (`§K.D:332` viết lúc outage): Fable DOWN → point-2 vacuously-met (0 delta). **Fable UP** (vd S108) → point-2 = **grant THẬT** (real=Fable-deep ⟂ clone=Opus-ensemble tách bạch — phân-tầng sống). Stamp trung-thực theo probe từng phiên.

## 5. MASTER CHECKLIST + ACCEPTANCE + DOGFOOD

> **Tầng thi-hành ("cách bấm nút").** Luật ở engine `harness-11-engine.md §K` (K.A ánh-xạ vai · K.B 2 mode 🧊 · K.C 3 GAP-guard · K.D 3 floor-point RC-stamp `RC-pqhuy1987-03-07-2026-17-46-35` · **K.E per-invocation H21**). Section này KHÔNG lặp luật (B1 derived-TRỎ-canonical, `harness-11-engine.md:44-49`) — chỉ đưa **checklist đánh-tick + biến điền-được + lệnh spawn thật**. Mọi mục có **evidence-form**; mọi biến có **TÊN·KIỂU·NGUỒN**.

---

### 5.1 — PRE-FLIGHT (chạy TRƯỚC mọi lượt phán-quyết)

**Biến PRE-FLIGHT** (đọc 1 lần đầu phiên, tái-dùng cả phiên):

| Biến | Kiểu | Nguồn (lệnh đọc / file:line) |
|---|---|---|
| 🧊 `MARKER_PRESENT` (H19 retired) | bool | `Test-Path .claude/fable-real-mode.on` (PS) / `[ -f .claude/fable-real-mode.on ]` (bash) — reader chuẩn = `session-start.md:27-31` BƯỚC 0.5b |
| 🧊 `MODE` (H19 retired) | enum `{real, clone}` | derive: `MARKER_PRESENT` → `real`; VẮNG → `clone` (mặc-định). Semantic INVERSE hmw (`harness-11-engine.md:325`) |
| `LEAD_MODEL` | string | `session-start.md:35-37` BƯỚC 0.6 probe → `claude-fable-5[1m]` HOẶC `claude-opus-4-8[1m]` (model-tier-v3: anh chọn per-session; outage-fallback H5) |
| 🧊 `ANH_CONSENT_REAL` (H19 retired) | bool | anh đã gõ `/fable-real` trong transcript phiên (lệnh đó Write marker) — K.D point-2 (`harness-11-engine.md:332`) |
| 🧊 `POSITION` (H19 retired — thay bằng `INVOCATION.vai`) | enum `{reviewer, investigator-codebase}` | §K.A (`harness-11-engine.md:320`) — "CHỈ 2 vai" = ngữ-cảnh H19; H21: vai anh gán ∈ roster |
| **`INVOCATION`** (H21) | struct `{lệnh, vai, đề-bài}` | parse từ lượt lệnh anh gõ (`/fable-real`\|`/fable-clone <vai> <đề-bài>`) — KHÔNG file-state, 0 persist (§2.1-bis) |
| **`ROLE_VALID`** (H21) | bool | `INVOCATION.vai ∈ roster`? (investigator-codebase · investigator-api · implementer-backend · implementer-frontend · frontend-designer · database-agent · office-document · test-specialist · reviewer · cicd-monitor · tooling-auditor · harvest-curator · **lead-stale-auditor · lead-gap-auditor**) — thiếu/lạ → hỏi anh 1 dòng, KHÔNG tự chọn vai. 🔴 Danh-sách này là **BẢN SAO** — nguồn thật = `hmw.js` VALID_ROLES `:22-36`; lệch ⇒ tin `hmw.js` |
| **`SPEC_PATH`** (H21) | path | spec-file 3-mục [đề-bài · cách-impl · checklist vai+deliverable+acceptance] LEAD ghi SAU verify (engine propose → lead verify+ghi, engine KHÔNG tự ghi) |

**Checklist (tick từng mục · evidence bên phải):**

- [ ] 🧊 **P0 (H19 retired) — marker-state đọc THẬT** (KHÔNG đoán từ note phiên trước) → `Test-Path .claude/fable-real-mode.on`. *Evidence:* in ra `MARKER_PRESENT=<CÓ|VẮNG>` + `mtime` marker.
- [ ] **P0-mới (H21) — INVOCATION đọc THẬT từ lượt lệnh** (quote nguyên-văn lệnh anh làm evidence — **KHÔNG đoán**). *Evidence:* dòng lệnh `/fable-real`\|`/fable-clone <vai> <đề-bài>` anh gõ lượt này; parse `{lệnh, vai, đề-bài}` + check `ROLE_VALID` (vai ∈ roster) — thiếu → hỏi anh 1 dòng, KHÔNG tự chọn vai.
- [ ] 🧊 *(H19 retired)* **P1 — MODE xác-định** từ P0. *Evidence:* `MODE=real` (marker CÓ) hoặc `MODE=clone` (VẮNG, mặc-định).
- [ ] **P1-mới (H21) — `$engine` xác-định từ `INVOCATION.lệnh`.** *Evidence:* `/fable-real` → `real-single` · `/fable-clone` → `clone-ensemble` (quote lệnh).
- [ ] **P2 — lead-runtime probe (Fable/Opus)** = BƯỚC 0.6 (`session-start.md:35-37`), per-session KHÔNG tin note cũ. *Evidence:* `LEAD_MODEL=<model-id thật>`. ⚠️ **H5 per-run fallback:** Fable DOWN → lệnh-A chạy `single-Opus-1M` **theo TỪNG lần** trong CHÍNH lượt lệnh (`fable-real.md:16`, `harness-11-engine.md:323`; 🧊 H19 wording "không đổi MODE toàn-cục").
- [ ] 🧊 *(H19 retired — `ANH_CONSENT_REAL`/marker-mtime)* **P3 cũ** — consent qua marker.
- [ ] **P3-mới (H21) — owner-consent = CHÍNH lượt lệnh** 🔴 engine-đắt CHỈ hợp-lệ khi anh gõ `/fable-real|/fable-clone <vai> <đề-bài>` LƯỢT NÀY. Em-main *thấy cần* mà anh chưa gõ → **STOP + ĐỀ XUẤT anh gõ** (KHÔNG auto theo số-dư/cảm-tính, mark `RC-…10-29-09`; KHÔNG chạy rồi xin phép sau). *Evidence:* quote nguyên-văn lệnh anh lượt này.
- [ ] **P4 — budget-note** *Evidence + phân-loại cost-class:*
  - `real` = 1 lane **top-model deep pass** (đắt nhất/lần; khi Fable về = single-Fable) — chỉ cho heavy-judgment.
  - `clone` = **N-lane ensemble tier-2** (multi-lens; để dành quota top-model cho lead — `fable-clone.md:8`).
  - ⚠️ **Cost-delta tùy runtime:** Fable DOWN → real vs clone 0 tier-delta (chỉ khác N-lane count). **Fable UP** → real=Fable-deep (đắt nhất/lần) ⟂ clone `tier:'opus'`=tier-2 (giữ quota Fable cho lead). Ghi honest theo probe (`harness-11-engine.md:332,334`).
- [ ] 🧊 *(H19 retired)* **P5 cũ — scope-lock 2 vai** (`POSITION ∈ {reviewer, investigator-codebase}`, vai khác EXCLUDED).
- [ ] **P5-mới (H21) — scope-lock = `ROLE_VALID`**: `INVOCATION.vai ∈ roster` do ANH gán (thiếu/lạ → hỏi anh, KHÔNG tự chọn); ⚠️ 2 monitor H1/H2 ĐÃ vào VALID_ROLES (S110) + **2 monitor H24 vào S121 W2** → hết limitation; vai-INVALID nay = STOP-HARD throw (REC-3 2026-07-13, KHÔNG fail-soft). Ngoài lượt lệnh: mọi vai giữ model roster (worker-tier-pin `opus` S124), lead KHÔNG tự elevate (K.D mới). *Evidence:* vai lượt này + quote lệnh.

---

### 5.2 — PER-RUN (mỗi lượt phán-quyết)

**Biến PER-RUN:**

| Biến | Kiểu | Nguồn |
|---|---|---|
| `LANE` | enum `{invest, review, both-2trục}` | R1 chọn theo task-class |
| `N` | int (clone) | số lane đa-lăng-kính CÙNG-1-vai; `real` ⇒ `N=1` |
| `ARTIFACT` | path/diff | đối-tượng phán-quyết (file / `git diff base..head` / email outward) |
| `RETURN` | object | SCHEMA `hmw.js:47-66` `{findings, checklistEvidence, memoryDelta{task,verdict,learned,surprise}}` |

**Checklist:**

- [ ] **R1 — vai = ANH GÁN trong lệnh (H21)** — em-main KHÔNG tự chọn; bảng dưới = gợi-ý khi em-main **ĐỀ XUẤT** anh gõ (hoặc anh hỏi "nên vai nào") *(🧊 H19: R1 = em-main "chọn LANE")*:
  - wire-BE / deploy-claim / security / test-gate → gợi-ý **`reviewer`** (cổng adversarial, `reviewer.md`).
  - "sự-thật gốc / file:line / RCA / schema-drift" → gợi-ý **`investigator-codebase`** (ground-truth, `investigator-codebase.md`).
  - artifact **hệ-trọng** (governance-doc, supersede-sweep, email outward) → đề-xuất anh gõ **CẢ 2 = "2-đầu khác-trục"** (ground-truth ⟂ adversarial) chống cùng-góc-cùng-điểm-mù (Harness-20 L.B, `harness-11-engine.md:344`).
  - *Evidence:* quote lệnh anh (vai đã gán) + lý-do 1 dòng nếu em-main có đề-xuất.
- [ ] **R2 — điền biến / spawn-args:**
  - **CLONE** (hmw.js parallel) — điền JSON `args` (`hmw.js:13-20`); `taskList` = **N entry CÙNG `role`** (GAP-1):
    ```json
    {
      "spec": "<acceptance + ARTIFACT + diff/target>",
      "memoryPack": { "reviewer": "<slice reviewer/MEMORY.md liên-quan>" },
      "checkpointApproved": true,
      "taskList": [
        { "role": "reviewer", "tier": "opus", "label": "clone-review-lensA", "prompt": "<lăng-kính A: wire+security>" },
        { "role": "reviewer", "tier": "opus", "label": "clone-review-lensB", "prompt": "<lăng-kính B: schema+test>" },
        { "role": "reviewer", "tier": "opus", "label": "clone-review-lensC", "prompt": "<lăng-kính C: adversarial falsify + Smart-Friend>" }
      ]
    }
    ```
    (đổi `reviewer`→`investigator-codebase` cho lane ground-truth; `run:{name,dir}` OPTIONAL = RUN-TRACE tracked.) *Evidence:* JSON điền đủ · `checkpointApproved` set SAU khi BÁO {số agent·vai·task} (gate cứng `hmw.js:77-79`).
  - **REAL** (single deep pass) — spawn TRỰC-TIẾP qua Agent/Task tool (KHÔNG cần hmw cho 1 lane):
    ```
    subagent_type: "reviewer"        # hoặc "investigator-codebase"
    description:   "Fable-real judge: <ARTIFACT>"
    prompt:        "<spec + acceptance + diff + RETURN-format bắt-buộc>"
    ```
    Agent frontmatter `reviewer.md:5`/`investigator-codebase.md:5` nay = `model: opus` (pin S124) ⇒ 🔴 spawn PHẢI set `model:'fable'` (param THẮNG pin — đo S126; không set = opus, KHÔNG phải `LEAD_MODEL`). *(Thay-thế: hmw 1-task + `tier:'fable'` — `hmw.js:68`.)*
- [ ] **R3 — GAP-guard tại spawn** *(tick cả 3):*
  - GAP-1: mọi lane CÙNG **1 vai** (`taskList` roles distinct = 1), KHÔNG mixed-roster (`harness-11-engine.md:328`).
  - Lane **RETURN-only**, 0 Write memory (write-guard `hmw.js:118-122`; GAP-3).
  - Vai lane = **ĐÚNG vai anh gán trong lệnh** (không leak vai khác vào lane; 🧊 H19: "vai ∈ {reviewer, investigator-codebase}").
- [ ] **R4 — spawn + thu verdict.** *Evidence theo format vai:*
  - `reviewer` → `Verdict: PASS|FAIL` + bảng 6-category + issues `[file:line][severity]` + Live-verify table (nếu deploy-claim) (`reviewer.md:203-242`).
  - `investigator-codebase` → `Conclusion` (1-2 câu) + `Evidence: [file:line][data]` + `Surprises` + `Recommendation` (`investigator-codebase.md:44-52`).
- [ ] **R5 — chống #53 (RETURN garble).** RETURN bắt-buộc theo SCHEMA (`findings` mọi-claim-kèm-file:line `hmw.js:51` + `memoryDelta` 4-field `hmw.js:57-62`). Nếu sub trả **wrong-slice-of-transcript thay verdict** (#53, đã tái-diễn ×11 qua S105) → **recover-path 3 nấc THEO THỨ-TỰ:** (1) đọc **diary** `agent-memory/<vai>/MEMORY.md` (sub có tự-ghi?) → (2) **SendMessage-resume in-session** (yêu-cầu re-emit verdict; hiệu-quả khi diary trống, S105) → (3) **em-main solo redo** lượt phán-quyết đó. *Evidence:* verdict cuối = 1 trong 3 nguồn, ghi nguồn nào.
- [ ] **R6 — (CLONE only) refute + synthesize.** em-main P3/P4: đối-chiếu N verdict, **refute** claim yếu, hợp-nhất → **1 verdict** (`fable-real.md:21`). *Evidence:* bảng N-lane → điểm đồng-thuận / điểm mâu-thuẫn / verdict-hợp-nhất.

---

### 5.3 — POST-RUN (em-main single-writer — D9)

- [ ] **V1 — VERIFY verdict** (KHÔNG rubber-stamp). em-main độc-lập spot-check ≥1 claim file:line trong verdict + thử refute (Smart-Friend, `reviewer.md:268-277`; D9 `harness-11-engine.md:80`). *Evidence:* note "verified <file:line> / refute-attempt: <…>".
- [ ] **V2 — fix theo verdict.** Sub read-only → em-main áp fix qua **file-tool** (Write/Edit, KHÔNG Bash-append — D10 `harness-11-engine.md:81`). *Evidence:* diff fix.
- [ ] **V3 — harvest 1-entry/vai** (GAP-3 anti-fragment). APPEND-only vào `agent-memory/<vai>/MEMORY.md`, **ĐÚNG 1 entry** cho vai đó **dù N lane** (B3 no-overwrite-unverified). *Evidence:* 1 entry mới / vai.
- [ ] **V4 — engine-label stamp @P3** (GAP-2, `harness-11-engine.md:329`). SCHEMA KHÔNG có field engine → em-main **stamp tay** nhãn engine đã dùng, vd `[engine: Opus-1M · clone-3lane · S108]` hoặc `[engine: Fable-real single]`. *Evidence:* entry chứa `[engine: …]`.
- [ ] **V5 — commit gọn.** `[CLAUDE] Governance: <…>` / `[CLAUDE] Docs: <…>`. Nếu RUN-TRACE: run-folder TRACKED → em-main **git-diff audit post-P2**, tracked-file đổi NGOÀI `runs/<id>/` + code-disjoint = vi-phạm (`hmw.js:114`). *Evidence:* commit-sha + git-diff sạch.

---

### 5.4 — ACCEPTANCE CRITERIA (1 lượt fable-real "ĐẠT")

Một lượt phán-quyết **ĐẠT ⟺ tất-cả** AC dưới (đo-được, không cảm-tính):

| # | Tiêu-chí đo-được | Ngưỡng | FAIL nếu |
|---|---|---|---|
| **AC-1** | Verdict rõ-ràng nhị-phân | `reviewer`: có `PASS\|FAIL` · `investigator`: có `Conclusion` direct | mơ-hồ / "có-vẻ ổn" không kết-luận |
| **AC-2** | Evidence file:line | **≥3** cite `file:line` cho artifact review (≥1 / claim); mọi claim kèm evidence (`hmw.js:51`) | claim trần, 0 anchor |
| **AC-3** | Có refutation-attempt | `reviewer`: ≥1 category chạy adversarial-probe / ghi "resisted scrutiny" · `investigator`: ≥1 `Surprise` / `uncertain+reason` · `clone`: em-main refute N-lane (R6) | rubber-stamp, 0 phản-biện |
| **AC-4** | 0 claim không-nguồn | grep verdict: 0 narrative suông, 0 "trust me" thiếu file:line/lệnh | tồn-tại claim vô-nguồn |
| **AC-5** | `memoryDelta` 4-field đầy-đủ | `{task, verdict, learned, surprise}` (`hmw.js:57-62`) | thiếu field |
| **AC-6** | Engine-label stamped | entry chứa `[engine: …]` (GAP-2) | vô-danh-engine |
| **AC-7** | Cấu-trúc engine đúng mode | `clone`: N≥2 lane CÙNG-vai + synthesize (GAP-1) · `real`: single deep pass documented | mixed-roster / N=1-mạo-danh-ensemble |
| **AC-8** | Scope-clean | git-diff: 0 file đụng ngoài run-folder/spec; sub 0 Write memory (`hmw.js:114`) | leak ghi agent-memory/canonical |

> **Gate:** thiếu **bất-kỳ** AC → lượt đó **CHƯA đạt** → quay R5 recover hoặc redo. Ghi bảng AC-check vào post-run note.

---

### 5.5 — DOGFOOD-CASE ghi sẵn: **"first real-mode run"**

> 🧊 **Form dưới ghi theo khung H19-marker (trước H21 S110)** — snapshot lịch-sử, giữ nguyên văn (§5.5 + §2.1 = record H19).

> 🔴 Engine ghi rõ: thật-mode toggle **CHƯA chạy thật lần nào** (`harness-11-engine.md:334` "thật-mode toggle chưa chạy thật lần nào"). ⇒ **Lượt real đầu-tiên = dogfood chính runbook này.**

**Case định-sẵn:**
- **ARTIFACT phán-quyết:** (1) chính `docs/governance/fable-real-runbook.md` (self-review) + (2) **email outward S108** (thông-báo H19 runbook ra sister/anh).
- **LANE:** `both-2trục` (reviewer adversarial ⟂ investigator-codebase ground-truth — Harness-20 L.B).
- **Scope reviewer:** Category 6 **Writing-quality outward** cho email S108 (`reviewer.md:187-197`) + runbook self-consistency vs engine §K (KHÔNG copy luật, B1) + AC 5.4 đo-được.
- **Scope investigator-codebase:** verify **MỌI file:line cite** trong runbook khớp disk (chống bịa) + ground-truth marker/gitignore/hmw-args-shape.

**FORM kết-quả (điền SAU khi chạy — để trống bây giờ):**

| Trường | Giá-trị (điền sau) |
|---|---|
| Ngày / session | **S108 · 2026-07-10** |
| `MODE` marker-state | **real** (marker CÓ — git check-ignore ✓ `.gitignore:92`) |
| `LEAD_MODEL` (BƯỚC 0.6) | **claude-fable-5** (Fable UP — real = single-Fable trọn nghĩa) |
| `N` lane (real=1 / clone=N) | **real, N=1 × 2 vai song song** (both-2trục L.B) |
| Reviewer verdict (email S108) | **FAIL** — C1 fact-sai ("đã sửa comment" khi chưa sửa) → **fixed cùng phiên** (hmw.js:31-32 vá thật, email giữ câu thành ĐÚNG) |
| Reviewer verdict (runbook) | **FAIL** (4 MAJOR + 6 minor; core JSON-shape/biến/checklist/GAP-guard **SOUND** — 7 refutation, 5 đứng) → **fixes applied cùng phiên** |
| Investigator verdict (cite-audit) | **PARTIAL — 103/111 exact** · 8 lệch (7 off-by-1/2 quanh code-fence + 1 drift-note meta-2-tầng) → fixed |
| Evidence count (AC-2) | ~111 anchor cite-audit + 7 refutation-probe |
| Refutation-attempt (AC-3) | reviewer 7 chủ-động (5 đứng vững · 2 vỡ-về-phía-artifact) + invest bẫy-honesty hmw.js:31 BẮT TRÚNG |
| AC 1-8 pass? | **8 / 8** (sau fix + harvest V3/V4 engine-label) |
| Engine-label stamped (AC-6) | `[engine: fable-real-single · Fable-S108 · 2-lane-parallel]` |
| Recover-path #53 dùng? (R5) | **none** — 2/2 judge Fable return dòng-1 đúng header, 0 garble |
| Commit-sha | commit S108 chứa chính file này (chicken-egg — xem `git log --oneline --since=2026-07-10`) |

---

### 5.6 — ANTI-PATTERNS

| # | Anti-pattern | Vi-phạm (nguồn) | Đúng phải làm | Detect |
|---|---|---|---|---|
| **AP-1** | Bật real **tự-động** không anh-gõ | K.D **point-2** (`harness-11-engine.md:332`) — real CHỈ do anh gõ `/fable-real <vai> <đề-bài>` | muốn real mà anh chưa gõ LƯỢT NÀY ⇒ STOP + ĐỀ XUẤT anh gõ *(🧊 H19: "0 marker + muốn real ⇒ STOP")* | transcript lượt đó vắng `/fable-real` nhưng chạy real |
| **AP-2** | **Mixed-roster** ensemble (fan-out nhiều vai) | GAP-1 scope-creep leak (`:328`) — worker-tier-pin CHE qua opus (như all-inherit trước nó) | N lane **CÙNG 1 vai** (multi-lens) | `taskList` roles distinct-count > 1 |
| **AP-3** | Lane **tự ghi memory** (store_memory / MEMORY.md / Bash-append) | GAP-3 / AS-10 fails-open (`:330,:120`) | RETURN-only; em-main ghi 1-entry/vai | git-diff `agent-memory/*` đổi trong P2 · RAG chunk-count |
| 🧊 **AP-4** (H19 retired) | Quên **báo marker-state** cuối phiên | marker persist qua session = BY-DESIGN (`fable-real.md:10`) nhưng thiếu báo → anh quên mode đang real (burn top-model ngoài ý) | session-end **BÁO marker-state + NHẮC anh** gõ `/fable-clone` nếu muốn về ảo (em-main KHÔNG tự toggle — K.D point-2); KHÔNG commit marker (gitignored `.gitignore:92`) | BƯỚC 0.5b @start + session-end marker-report |
| **AP-4-mới** (H21) | Chạy engine-đắt **NGOÀI lượt-lệnh** anh gõ | K.D point-2 + H21 §2.1-bis — engine-đắt CHỈ trong lượt anh gõ `/fable-real`\|`/fable-clone` kèm vai; kể cả **HMW-mode ON**, kể cả "thấy cần" = **VI-PHẠM** (lead KHÔNG tự ý) | Đợi lượt-lệnh anh; thiếu vai → **hỏi anh 1 dòng, KHÔNG tự chọn vai** | engine-đắt chạy mà transcript lượt đó vắng `/fable-real`\|`/fable-clone` |
| **AP-5** | Dùng real cho việc **trivial** | burn quota top-model vô-ích (§8 "ensemble không rẻ", `:334`) + H6.1 substantive→heavy | real CHỈ heavy-judgment (deploy-gate/security/governance-artifact) | task-class vs MODE |
| **AP-6** | Quên **engine-label** stamp | GAP-2 (`:329`) verdict vô-danh-engine, mất audit | em-main stamp `[engine:…]` @P3 (V4) | entry thiếu `[engine:…]` |
| **AP-7** | **Rubber-stamp** verdict (nuốt sub-verdict không VERIFY) | phá D9 single-writer (`:80`) + Smart-Friend (`reviewer.md:268`) | V1 độc-lập kiểm ≥1 claim + refute | post-run note 0 spot-check |
| **AP-8** | **Copy luật §K** vào runbook | phá B1 derived-TRỎ-canonical (`:44-49`) — 1-sửa-N-drift | runbook = "cách bấm nút", TRỎ §K cho luật | `governance-detectors.ps1` C2 vocab/staleness |

