Files
solution-erp/docs/governance/fable-real-runbook.md

651 lines
69 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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-tier-v3: lead = frontier-class anh chọn per-session {Fable 5 \| Opus 4.8 — 1M MAX}.*
> **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 12 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 — owner-choice CHÍNH** (MTv3: anh chọn mỗi phiên, đổi giữa phiên OK, 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-30` (whitelist) + filter + `agentType` | vai engine-đắt = **anh gán** (H21, mọi vai roster 12; §3/§4 template = `reviewer` · `investigator-codebase`); VALID_ROLES = 12 đủ roster (+2 monitor S110) |
| 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[12]` | `hmw.js:22-30` | 8 core + `database-agent`(S57) + `office-document`(S107) + `tooling-auditor`/`harvest-curator`(S110 anh-directed) |
| 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 // H8 all-inherit top-tier (:44)
```
⇒ Không set `tier` = mọi lane clone chạy **inherit top-tier** (mặc-định); muốn ép tier-2 Opus (giữ quota Fable cho lead) = thêm `tier:'opus'`.
---
### 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: "reviewer"` \| `"investigator-codebase"`, prompt deep-pass; model = lead-runtime (inherit) | 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 → all-inherit **CHE** leak (mọi vai top-tier nên roster-trộn "trông ổn"; Fable về + phân-tầng thì rò top-tier ensemble sang vai ngoài 2 vị-trí).
- 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:332` đã cập-nhật "cả 12 vai (9 S101; +office-document S107; +2 monitor S110)" khớp `hmw.js:22-30` — luật "no-gate → em-main tự-gác" KHÔNG đổi.
- 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 = frontier-class do anh chọn per-session {Fable 5 | Opus 4.8 — 1M MAX} (model-tier-v3); 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 12 đủ roster (S110) |
| 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 = **anti-consensus-catch** (dogfood S101 WF2 Lane-B bắt `workflows/README:51` stale-label 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 12 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 12 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 , `.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 `/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 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. `model: inherit` (frontmatter `investigator-codebase.md:5`) top-tier lead: Fable up = Fable · Fable down (H5) = Opus-1M per-run 3.6).
**Tham-số spawn (Agent tool / Task):**
```
subagent_type: "investigator-codebase"
model: inherit # frontmatter model:inherit (investigator-codebase.md:5) → top-tier lead
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 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 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 `file:line` chứng ngược). Provenance-lens = trọng-tài xuất-xứ khi 2 lane cãi "đã 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 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 12 2.1-bis, H21) *evidence:* quote nguyên-văn lệnh anh (🧊 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 `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 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 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 ).
- **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 per-**RUN**, KHÔNG phải mode-flip (`fable-real.md:20`; K.B `:323`).
- **KHÔNG tự `/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 `/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` (loginbearerPOST/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 `/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 : KHÔNG set → inherit top-tier (H8 all-inherit; resolveModel hmw.js:44 role-có-frontmatter → undefined)
# Fable UP → single-Fable (sâu nhất, đắt nhất)
# Fable DOWN→ single-Opus-1M (H5 per-run auto, KHÔNG đổi marker/mode — fable-real.md:20 / §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** 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 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 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 "). 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 cả 12 vai KHÔNG gate all-inherit CHE leak | CLONE `taskList` MỌI `role:'reviewer'` (N-lane CÙNG vai, KHÔNG mixed-roster) | `§K.C:328` · `hmw.js:22-30` |
| **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 12 2.1-bis, H21). *Evidence:* quote nguyên-văn lệnh anh . 🧊 *(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` 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 ?" (**truy**) |
| Thế | Adversarial giả-định 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 = frontier-class do anh chọn per-session {Fable 5 | Opus 4.8 — 1M MAX} (model-tier-v3); 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 12 |
| **`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 12`? (investigator-codebase · investigator-api · implementer-backend · implementer-frontend · frontend-designer · database-agent · office-document · test-specialist · reviewer · cicd-monitor · tooling-auditor · harvest-curator) — thiếu/lạ → hỏi anh 1 dòng, KHÔNG tự chọn vai |
| **`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 12) — 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 12` do ANH gán (thiếu/lạ → hỏi anh, KHÔNG tự chọn); ⚠️ 2 monitor × lệnh-B → limitation K.E (fail-soft default-subagent). Ngoài lượt lệnh: mọi vai giữ model roster (H8 all-inherit), 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 `model: inherit` (`reviewer.md:5` / `investigator-codebase.md:5`) → tự ăn top-tier (`LEAD_MODEL`). *(Thay-thế: hmw 1-task + `tier:'fable'` ép lead-tier nếu cần RUN-TRACE — `hmw.js:38`.)*
- [ ] **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`) — all-inherit CHE tới khi Fable về | 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 |