[CLAUDE] Docs: S110 adopt H21 + model-tier-v3 — engine-đắt per-invocation (/fable-real|/fable-clone <vai> <đề-bài>, marker RETIRED) + spec-file 3-mục K.E + MTv3 lead owner-choice + triage-S5 env-dependent; WF wf_0c3b307f-a64 3-worker-Opus + invest/reviewer Fable PASS_WITH_FIXES 5M-fixed + email 01d9096e + 2 adap-report + STAGE-2 ×4

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-11 20:39:15 +07:00
parent 162f0b9dc5
commit debe82fce5
25 changed files with 566 additions and 112 deletions

View File

@ -1,25 +1,29 @@
# FABLE-REAL RUNBOOK — vận hành H19 thật/ảo cho 2 vị-trí phán-quyết (reviewer · investigator-codebase)
# FABLE-REAL RUNBOOK — vận hành engine-đắt per-invocation (H21 S110; gốc H19 thật/ảo 2 vị-trí)
> **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) + 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.**
> ⚠️ **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. **Đọc marker:** `Test-Path .claude/fable-real-mode.on` → CÓ = **real** · VẮNG = **clone** (⚠️ semantic INVERSE vs hmw-mode — §2.1).
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. **Chọn lane** (R1 §5.2): 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 (governance-doc, email outward, supersede-sweep) → **CẢ 2 song-song** (2-đầu-khác-trục).
4. **Spawn:** REAL (marker CÓ + anh đã`/fable-real`) = Agent-tool LẺ 1 con (§3.2/§4.2 template) · CLONE (default) = `hmw.js` N-lane **CÙNG vai** (§3.3/§4.3 JSON).
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). 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.
> 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):**
@ -35,8 +39,10 @@
| Lệnh | Hành-động em-main | Nguồn |
|---|---|---|
| `/fable-real` | `Write` file `.claude/fable-real-mode.on` (bật thật) | `fable-real.md:10` |
| `/fable-clone` | `Remove-Item .claude/fable-real-mode.on` (về ảo; vắng sẵn → "đã ở ảo-mode") | `fable-clone.md:8` |
| 🧊 `/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):**
@ -47,7 +53,9 @@ git check-ignore -v .claude/fable-real-mode.on && echo "IGNORED" || echo "NOT-ig
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.
**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.
> 🧊 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`
@ -57,16 +65,33 @@ Rule gitignore neo tại **`.gitignore:92`** (`.claude/fable-real-mode.on`), đ
---
### 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** | boolean (file tồn-tại?) | `.claude/fable-real-mode.on` · reader `session-start.md:29` | CÓ=real · VẮNG=clone(default) |
| 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, outage-driven**; 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'`=force lead-tier hệ-trọng |
| 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-28` (whitelist) + `:100` (filter) + `:139` (`agentType`) | 2 vị-trí phán-quyết ⊂ 10: **`reviewer`** hoặc **`investigator-codebase`** |
| 6 | **role / agentType** | `VALID_ROLES \| undefined` | `hmw.js:22-28` (whitelist) + `:100` (filter) + `:139` (`agentType`) | vai engine-đắt = **anh gán** (H21, mọi vai roster 12; §3/§4 template = `reviewer` · `investigator-codebase`); ⚠️ 2 monitor ∉ VALID_ROLES(10) → lệnh-B fail-soft default-subagent (limitation K.E) |
| 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`) |
@ -90,8 +115,8 @@ role có frontmatter → return undefined // H8 all-inherit top-tier (
| 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` | Mặc-định (marker VẮNG) + heavy-judgment 1 trong 2 vị-trí |
| **Real single** (1 deep pass) | **Agent-tool spawn LẺ** (1 agent) | `agentType: "reviewer"` \| `"investigator-codebase"`, prompt deep-pass; model = lead-runtime (inherit) | Marker CÓ (anh gõ `/fable-real`) + cần 1 lăng-kính sâu nhất |
| **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 |
@ -137,33 +162,34 @@ Nguồn: `harness-11-engine.md §K.C:327-330`. Pin để stamp CÓ NGHĨA (khôn
### 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 LUÔN top-model — KHÔNG đụng** · (2) CHỈ **2 vị-trí phán-quyết** chạm top-model, CHỈ real do **anh gõ** (KHÔNG auto) · (3) **mọi vai khác giữ mặc-định**.
**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:**
1. **Việc có phải 1 trong 2 vị-trí phán-quyết?** (`reviewer`=cổng-cuối · `investigator-codebase`=ground-truth). KHÔNG → **thoát** (vai khác giữ mặc-định, floor-3). `investigator-api`/`database-agent` EXCLUDED (`§K.A:320`).
2. **Heavy-judgment?** (wire-BE claim / security / schema-migration / cross-stack / RCA-chống-bịa / phân-xử mâu-thuẫn). Nhẹ/trivial → single spawn thường, KHÔNG ensemble.
3. **anh đã gõ `/fable-real`?** (marker CÓ?). KHÔNG gõ = clone-default.
4. **Fable up?** (BƯỚC 0.6). Chỉ ảnh-hưởng real-mode model per-run.
**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 | Mode | Cơ-chế thực-thi |
| Tình huống | Engine | Cơ-chế thực-thi |
|---|---|---|
| marker VẮNG + heavy-judgment 2 vị-trí | 🟢 **CLONE** | `hmw.js parallel` N lane same-role + em-main synthesize (2.3 JSON) |
| marker CÓ (anh gõ) + heavy-judgment | 🔴 **REAL** | Agent-tool spawn LẺ 1 agent, deep pass |
| việc KHÔNG thuộc 2 vị-trí | — | mặc-định, KHÔNG áp toggle (floor-3) |
| việc thuộc 2 vị-trí + NHẸ (không trivial) | — | single spawn thường 1 con (KHÔNG ensemble, KHÔNG deep-pass nghi-thức) — mode chỉ đổi CÁCH chạy heavy-judgment |
| trivial / <2-3' / 1-file | | em-main solo, không ensemble/không real |
| anh gõ `/fable-clone <vai> <đề-bài>` | 🟢 **lệnh-B ensemble** | `hmw.js parallel` N lane same-role + em-main synthesize (2.3 JSON) — ⚠️ 2 monitor ∉ VALID_ROLES → limitation K.E |
| 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 2 marker: `hmw-mode.on` (H6.1) quyết **CÓ fan-out HMW hay không** cho task substantive; `fable-real-mode.on` quyết **CÁCH chạy lane phán-quyết** (real/clone). Độc-lập — cả 2 ON: task substantive vẫn HMW, riêng lượt phán-quyết chạy real.
> **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 (real-mode, `fable-real.md:20` / `§K.B:323`):** Fable **up** single-**Fable**; Fable **down** single-**Opus-1M** **theo TỪNG LẦN CHẠY** **KHÔNG flip marker** (mode vẫn "real" toàn-cục). Model do BƯỚC 0.6 probe quyết mỗi lần spawn.
**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):**
- [ ] Xác nhận việc {reviewer, investigator-codebase} evidence: `agentType` chọn `hmw.js:22-28`
- [ ] Đọc marker BƯỚC 0.5b mode đúng evidence: dòng BÁO mode @session-start
- [ ] 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`
@ -171,7 +197,7 @@ Nguồn: `harness-11-engine.md §K.C:327-330`. Pin để stamp CÓ NGHĨA (khôn
## 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).
> **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
@ -180,7 +206,8 @@ Mọi biến em-main chốt @P0/P1 rồi bơm vào lane. Kiểu + nguồn đọc
| Biến | Kiểu | Nguồn đọc (file:line / lệnh) | Ví-dụ giá-trị thật |
|---|---|---|---|
| `$mode` | `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) |
| 🧊 `$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"]` |
@ -191,7 +218,7 @@ Mọi biến em-main chốt @P0/P1 rồi bơm vào lane. Kiểu + nguồn đọc
### 3.2 REAL-mode — single-deep-pass qua Agent tool
Điều-kiện: `$mode == real` (marker ). 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).
Đ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):**
@ -245,7 +272,7 @@ prompt: |
### 3.3 CLONE-mode — N-lane ensemble qua hmw.js parallel
Điều-kiện: `$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`).
Đ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`):
@ -284,7 +311,7 @@ Ghi-chú shape:
Tick mỗi lần chạy lane (cả 2 mode trừ khi ghi `[clone]`/`[real]`):
- [ ] **1. `$mode` xác-định đúng** *evidence:* `Test-Path .claude/fable-real-mode.on` `real`/`clone` (K.B; `fable-real.md:10`)
- [ ] **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`)
@ -309,13 +336,14 @@ Tick mỗi lần chạy lane (cả 2 mode trừ khi ghi `[clone]`/`[real]`):
## 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** (H19 §K = LUẬT; KHÔNG lặp lại). 2 mode do marker quyết: **Fable-real** (single deep-pass top-model THẬT)**Fable-clone** (ensemble N-lane CÙNG vai, MẶC-ĐỊNH).
> **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` | 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) |
| 🧊 `$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" |
@ -326,9 +354,9 @@ Tick mỗi lần chạy lane (cả 2 mode trừ khi ghi `[clone]`/`[real]`):
| `$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-mode (marker CÓ): single deep-pass Agent-tool
### 4.2 — REAL (lệnh-A `/fable-real`): single deep-pass Agent-tool *(🧊 H19: "marker CÓ")*
**Precondition:** `Test-Path .claude/fable-real-mode.on` = `True`. REAL = **1 spawn TRỰC-TIẾP** (KHÔNG qua `hmw.js` hmw = clone ensemble).
**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):**
```
@ -374,7 +402,7 @@ Task/Agent(
**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-mode (marker VẮNG = MẶC-ĐỊNH): N-lane CÙNG vai qua `hmw.js`
### 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:
@ -419,7 +447,7 @@ args = {
### 4.5 — CHECKLIST thi-hành (tick-được, mỗi mục có evidence-form)
- [ ] **1. Mode resolved** `Test-Path .claude/fable-real-mode.on` `real`\|`clone`. *Evidence:* bool + BƯỚC 0.5b báo (`session-start.md:27-33`).
- [ ] **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`).
@ -452,11 +480,11 @@ args = {
### 4.8 — K.D 3 floor-point RC-stamped (governance neo — `RC-pqhuy1987-03-07-2026-17-46-35`, `ACTIVE-MARKS.md`)
(1) **lead LUÔN top-model** — lane này KHÔNG đụng lead · (2) **CHỈ** `reviewer`+`investigator-codebase` chạm top-model **chế-độ THẬT**, CHỈ khi anh gõ `/fable-real` (KHÔNG auto) · (3) mọi vai khác giữ default. ⚠️ **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.
(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`). 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**.
> **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**.
---
@ -466,23 +494,30 @@ args = {
| Biến | Kiểu | Nguồn (lệnh đọc / file:line) |
|---|---|---|
| `MARKER_PRESENT` | 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` | 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]` (up) HOẶC `claude-opus-4-8[1m]` (H5-fallback) |
| `ANH_CONSENT_REAL` | bool | anh đã gõ `/fable-real` trong transcript phiên (lệnh đó Write marker) — K.D point-2 (`harness-11-engine.md:332`) |
| `POSITION` | enum `{reviewer, investigator-codebase}` | §K.A (`harness-11-engine.md:320`) — CHỈ 2 vai, KHÔNG vai khác |
| 🧊 `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 — 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.
- [ ] **P1 — MODE xác-định** từ P0. *Evidence:* `MODE=real` (marker CÓ) hoặc `MODE=clone` (VẮNG, mặc-đị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 → 2 vị-trí chạy `single-Opus-1M` **theo TỪNG lần** (KHÔNG đổi `MODE` toàn-cục — `fable-real.md:20`, `harness-11-engine.md:323`).
- [ ] **P3 — anh-consent check (K.D point-2)** 🔴 `MODE=real` **CHỈ hợp-lệ** khi `ANH_CONSENT_REAL=true` (anh gõ `/fable-real`). Nếu em-main *muốn* real mà 0 marker → **STOP + nhắc anh gõ lệnh** (KHÔNG auto-bật theo số-dư/cảm-tính, mark `RC-…10-29-09`). *Evidence:* dòng `/fable-real` trong transcript **HOẶC** marker mtime (marker gitignored `.gitignore:92` nên không có git-log).
- [ ] 🧊 **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`).
- [ ] **P5 — scope-lock** = `POSITION ∈ {reviewer, investigator-codebase}` (§K.A). `investigator-api` / `database-agent` / mọi vai khác **EXCLUDED**. Lead + vai khác **KHÔNG đụng model** (K.D point-1/point-3). *Evidence:* vai lượt này ∈ tập 2.
- [ ] 🧊 *(H19 retired)* **P5 — 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.
---
@ -499,11 +534,11 @@ args = {
**Checklist:**
- [ ] **R1 — chọn LANE** *(decision rule):*
- wire-BE / deploy-claim / security / test-gate → **`reviewer`** (cổng adversarial, `reviewer.md`).
- "sự-thật gốc / file:line / RCA / schema-drift" → **`investigator-codebase`** (ground-truth, `investigator-codebase.md`).
- artifact **hệ-trọng** (governance-doc, supersede-sweep, email outward) → **CẢ 2 song-song = "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:* ghi `LANE=<…>` + lý-do 1 dòng.
- [ ] **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
@ -529,7 +564,7 @@ args = {
- [ ] **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 ∈ {reviewer, investigator-codebase} (không leak vai ngoài).
- 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`).
@ -569,6 +604,8 @@ Một lượt phán-quyết **ĐẠT ⟺ tất-cả** AC dưới (đo-được,
### 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:**
@ -601,10 +638,11 @@ Một lượt phán-quyết **ĐẠT ⟺ tất-cả** AC dưới (đo-được,
| # | 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` | 0 marker + muốn real ⇒ STOP + nhắc anh | transcript vắng `/fable-real` nhưng chạy real |
| **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** | 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** (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 |