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

613 lines
59 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 H19 thật/ảo cho 2 vị-trí phán-quyết (reviewer · investigator-codebase)
> **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.**
> **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).
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 đã gõ `/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).
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.
---
### 2.1 — MARKER lifecycle: `.claude/fable-real-mode.on`
**Đườ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` | `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` |
**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.
**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.
**☑ 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.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 |
| 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`** |
| 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[10]` | `hmw.js:22-28` | 8 core + `database-agent`(S57) + `office-document`(S107) |
| 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` | 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 |
| **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 = `reviewer` HOẶC `investigator-codebase` (grep taskList trước fan-out). Ghi-chú: engine `§K.C:328` đã cập-nhật "cả 10 vai (9 lúc adopt S101; +office-document S107)" khớp `hmw.js:22-28` — 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 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**.
**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.
| Tình huống | Mode | 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 |
> 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.
**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.
**💰 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
- [ ] 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).
> **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` | `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) |
| `$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: `$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).
**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: `$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. `$mode` xác-định đúng** *evidence:* `Test-Path .claude/fable-real-mode.on` `real`/`clone` (K.B; `fable-real.md:10`)
- [ ] **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** (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).
### 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) |
| `$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-mode (marker CÓ): single deep-pass Agent-tool
**Precondition:** `Test-Path .claude/fable-real-mode.on` = `True`. REAL = **1 spawn TRỰC-TIẾP** (KHÔNG qua `hmw.js` hmw = clone ensemble).
**(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-mode (marker VẮNG = MẶC-ĐỊNH): N-lane CÙNG vai qua `hmw.js`
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ả 10 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-28` |
| **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. Mode resolved** `Test-Path .claude/fable-real-mode.on` `real`\|`clone`. *Evidence:* bool + BƯỚC 0.5b báo (`session-start.md:27-33`).
- [ ] **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 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.
## 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**.
---
### 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` | 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 |
**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).
- [ ] **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.
---
### 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 — 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.
- [ ] **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 ∈ {reviewer, investigator-codebase} (không leak vai ngoài).
- [ ] **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"**
> 🔴 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` | 0 marker + muốn real ⇒ STOP + nhắc anh | transcript 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-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 |