--- description: /fable-clone <đề-bài> — ENGINE-ĐẮT LỆNH-B per-invocation (H21): vai anh GÁN chạy ENSEMBLE tier-2-mạnh-nhất (N lane đa-lăng-kính CÙNG 1 VAI qua hmw.js parallel + em-main refute+synthesize) cho đề-bài đó — KHÔNG marker, KHÔNG mode persist. Thiếu/sai vai → em main hỏi lại anh 1 dòng, KHÔNG tự chọn. Cặp /fable-real. argument-hint: <đề-bài phán-quyết> — vd "reviewer rà commit X" · "investigator-codebase truy bug Y" --- # /fable-clone — ENGINE-ĐẮT LỆNH-B: 1 vai × ENSEMBLE tier-2 (per-invocation, H21) > Cặp **`/fable-real`** (lệnh-A single top-model). 🔴 restart Claude Code sau khi tạo/sửa (no hot-reload). > **Adopt H21 S110 (2026-07-11)** — supersede semantics **toggle-marker H19 (S101)**. KHÔNG còn mode-ảo mặc-định để "về", KHÔNG còn marker: cả 2 lệnh giờ = engine-đắt **per-invocation**, chỉ SỐNG trong lượt anh gõ. > 📘 **Runbook:** [`docs/governance/fable-real-runbook.md`](../../docs/governance/fable-real-runbook.md) · 🔧 **Guard §K:** [`docs/governance/harness-11-engine.md`](../../docs/governance/harness-11-engine.md) §K (engine). **Vai + đề-bài lượt này:** $ARGUMENTS ## 🔴 Semantics per-invocation (H21 ①/②) - **`/fable-clone <đề-bài>`** = vai anh gán chạy **ENSEMBLE tier-2-mạnh-nhất** = **N lane đa-lăng-kính CÙNG 1 VAI** (qua HMW `parallel`) + em-main **refute + synthesize** (P3/P4) = "bản sao Fable". Rẻ quota top-model, giữ tầng phản-biện chống-đồng-thuận-sai. - **Hiệu-lực CHỈ lượt đó** — **KHÔNG còn "về mặc-định"**, KHÔNG marker, KHÔNG persist (H19 mode thật/ảo đã retired H21). Lượt sau muốn ensemble = gõ lại lệnh. ## 🔴 Vai BẮT BUỘC ∈ roster (canonical → STATUS §Sub-agents; B1 — KHÔNG hardcode số) (H21 ②) `investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-stale-auditor` · `lead-gap-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`** · **`ring1-audit` · `ring2-audit` · `ring4-audit`** (round-KIỂM ×3 S145). - **Thiếu `` HOẶC vai ngoài roster** → em main **hỏi lại anh 1 dòng**, **KHÔNG tự chọn vai**. - ✅ **VALID_ROLES đủ roster** — canonical đếm ở [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical; **KHÔNG chép số ở đây khi roster đổi** — đó chính là class `view-stale-role-desc` mà `lead-stale-auditor` soi). Lịch-sử: 10→12 (S110, +2 monitor `tooling-auditor`/`harvest-curator`) → 12→14 (S121 W2, +2 monitor H24 `lead-stale-auditor`/`lead-gap-auditor`) → **14→17 (S141, +3 trio-memory `harness-eval`/`harness-refine`/`harness-audit` — read-only INFORM-only, TUẦN TỰ eval→refine→audit)** → **17→20 (S145, +3 round-KIỂM `ring1-audit`/`ring2-audit`/`ring4-audit` — C4/C4b TÁCH mỗi-vòng-1-con, AUTO fire-after-measure)**. *(🧊 limitation cũ 10-vai + H6-design "monitor ngoài workflow" superseded; monitor vẫn INFORM-only, lane RETURN-only.)* - 🔒 **Honest-note (a/b):** bảo-đảm = **owner-gated tầng lệnh + kỷ-luật lead**, **KHÔNG code-enforced**; lệnh/alias = cách anh **gán vai nhanh**, hệ **KHÔNG tự chọn vai**. ## 🔴 Spec-file 3-mục BẮT BUỘC mỗi run (H21 ①) Mỗi lần chạy engine-đắt PHẢI kết-tinh 1 spec theo pipeline **propose → verify → ghi → thực-thi**: 1. **Engine propose-only** — vai chạy ensemble đề-xuất [đề-bài · cách làm · checklist]. Engine KHÔNG tự ghi. 2. **Lead verify** — lead soi + chỉnh (P3/P4 refute + synthesize N lane). 3. **Lead ghi** file `.claude/workflows/runs//spec--.md` — **3 heading cố-định:** ① Tính-năng/đề-bài · ② Cách implement · ③ Checklist (vai + deliverable + acceptance **ĐO ĐƯỢC**). 4. **Worker thực-thi THEO spec** — spec bơm **QUA ARGS/prompt** (worker KHÔNG tự Read file). - 🔒 **Honest-note (c):** file spec do **LEAD ghi SAU khi verify** — engine KHÔNG tự ghi. - 🔒 **Honest-note (d):** run **chấm/verify CŨNG sinh spec-file** (kế-hoạch xử issue = "cách làm" cần kết-tinh). ## 🔴 Cờ `args.run` — RUN-TRACE BẮT BUỘC khi ≥3 lane (Sàn-1 H22, cơ-khí-hoá S121 W2) 🔴 **`/fable-clone` ensemble hầu như LUÔN ≥3 lane** (run S119 = 5 lane) ⇒ **cờ này gần như LUÔN bắt buộc**. Trước khi gọi Workflow `hmw`, lead **PHẢI** @P1: 1. Scaffold `.claude/workflows/runs//` (TRACKED) + `run.md` kèm **`## taskList snapshot`**. 2. Truyền `args.run = { name:'', dir:'.claude/workflows/runs/' }`. **Thiếu cờ + ≥3 task ⇒ `hmw.js` THROW (STOP-HARD), KHÔNG fail-soft.** Vì sao gate: script chạy JS-sandbox **KHÔNG filesystem** ⇒ tự nó không tạo được folder ⇒ trước S121 sàn này chỉ là **kỷ-luật người** (đo thật @S119: `git grep args.run .claude/commands/` = **0 hit** ⇒ 4/4 wrapper KHÔNG cờ ⇒ sàn danh-nghĩa). Hậu-quả thật khi thiếu: chết giữa run ⇒ **per-turn returns mất theo phiên, chỉ file trên đĩa sống sót** ⇒ `/tiep` §4 không có vật-liệu cắt-gọt ⇒ chạy lại TỪ ĐẦU (S118 raw-Agent 7-spawn ⇒ 0 run-folder). 🔸 **Khai thật:** gate chỉ phủ đường `hmw.js`. Ngưỡng *"hoặc ước >5 phút"* **KHÔNG cơ-khí-hoá được** (script không đo trước thời-lượng) ⇒ phần đó vẫn là kỷ-luật lead. **raw `Workflow`/`Agent` tool = kẽ CÒN-LẠI**, đi thẳng không qua file này ⇒ mất writeGuard + run-trace. ## 🔴 ĐÓNG GÓI LANE THEO TRẦN LƯỢT (C2 — adap đợt-11 S144, có repro) **Sự cố gốc `wf_491c05a8-6dc` (2026-07-22):** 5 lane `investigator-codebase` (`maxTurns: 20`) — **3 CHẾT, ~490K token đốt, 0 sản phẩm**. Đo từ transcript: lane **sống** dùng 21/23 tool-use · lane **chết** dùng 28/34/35 ⇒ cháy lượt **khi vẫn đang đọc**, chưa tới bước ghi. 🔴 **Cơ chế phạt NGƯỢC ĐỜI:** lane càng cẩn thận càng chắc chết. Lỗi ở **LỆNH của lead**, không ở lane — lead giao lane-5 **mười file** với trần 20 lượt. **3 luật đóng gói (áp mọi `/fable-clone` từ nay):** 1. **≤3 file/lane.** Lane phải đọc nhiều hơn ⇒ **tách lane**, đừng nới việc. 🔸 Số 3 = **AI tự đặt, đảo được** (không phải số owner). 2. 🔴 **ÉP GHI KHUNG RỖNG Ở LƯỢT 1-2** — trước khi đọc bất cứ gì. Rồi append dần. *Vì sao "dặn ghi sớm" KHÔNG đủ:* prompt run-hỏng **đã** ghi *"ghi NGAY khi tìm ra từng cái"*, lane vẫn tự xếp việc ghi **sau** việc đọc ⇒ "ngay" của lead rơi **sau** vạch chết. **Bằng chứng đối chứng:** run review `wf_301d3943-144` đổi đúng chỗ này (ép khung rỗng lượt 1-2, `maxTurns: 25`) ⇒ **3/3 lane sạch, 0 chết**. Cùng harness, cùng model, khác **thứ tự ghi**. 3. **Nêu trần lượt NGAY ĐẦU prompt** + phân bổ gợi ý (đọc → verify → chốt), để lane tự lượng sức. **Acceptance (đã siết theo R3 — bỏ đếm-chữ):** - ❌ **KHÔNG** dùng `grep -c 'trần lượt'` làm tiêu chí (gõ đúng cụm chữ là đạt = Goodhart thuần). - ✅ Đo ở **run KẾ**: 0 lane chết. - 🔸 **Khai hạn chế thật:** `hmw.js` C1 chỉ biết lane trả `null`, **KHÔNG phân biệt được NGUYÊN NHÂN** ⇒ mệnh đề *"chết vì cháy lượt"* hiện **chưa đo được bằng máy**, phải mở transcript đếm tool-use. ## 🔴 KHUÔN LABEL 4 THÀNH-PHẦN (C3 — `spawn-label:22-27`, BINDING) Mọi spawn (Agent-tool `description` · `hmw` `label` · monitor · cổng review) mang đủ **4 thành-phần**: ``` {nhóm|Vòng-N|Core|Gate|WF} {vai} {pha/wave} s{N} ``` Ví dụ đang chạy: `Gate reviewer anchor s144` (24 ký tự) · `Vòng-3 harness-eval w1 @start s144`. - **Vừa panel** ~≤40 ký tự; xung đột thì **đủ-thành-phần thắng ngắn-gọn** (`:25`). - **Một khuôn duy nhất** toàn repo (`:26`). - **Áp từ phiên kế** (`:51`) — spawn trước đó **giữ nguyên làm vết, KHÔNG sửa lùi** (khuôn hub `:43`). **Acceptance (siết theo R3 — thêm control + neo artifact):** - ✅ **Negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc-lại **PHẢI TRƯỢT**. Không trượt = thước mù. - ✅ **Neo artifact**: label phải xuất hiện trong `runs//run.md` — panel là **ephemeral**, `grep` không truy được ⇒ không neo thì không tái lập, không audit được. - ❌ Bỏ tiêu chí "chọn 3 task nói được {ai·gì·nhịp·phiên}" **đứng một mình** — đó là **tự chấm chính label mình vừa viết**, n=3, không artifact. ## 🔴 Guard ensemble (§K engine — 3 floor-fidelity) - **ảo-ensemble = N lane CÙNG 1 vai phán-quyết** (multi-lens trên 1 vai), **KHÔNG** mixed-roster fan-out (`hmw.js` VALID_ROLES = **roster đầy-đủ**, canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents; KHÔNG gate vai — worker-tier-pin S124 **che** leak qua frontmatter `opus` (xem :57), hết thời all-inherit ăn-theo-lead). - **N lane RETURN-only**; em-main **single-writer** (B3) ghi **1 MEMORY entry** đúng vai đó + **gắn nhãn engine đã dùng** (hmw SCHEMA `memoryDelta` KHÔNG field engine → em-main stamp @P3 harvest). - **Một vai = một trí-nhớ** dù N lane (chống AS-10 fragment N-lane). ## 🔴 GAP#6 — lane ensemble PHẢI mang `tier:'opus'` (KHÔNG để inherit) 🔴 **Lệnh này tự định-nghĩa mình là "ENSEMBLE **tier-2**" ⇒ lane BUỘC phải chạy tier-2, KHÔNG phải tier của lead.** ```js taskList: [ { role:'', tier:'opus', label:'lens-1', prompt:'…' }, { role:'', tier:'opus', label:'lens-2', prompt:'…' }, … ] ``` **Vì sao GIỮ (đổi nấc S124)** (`hmw.js` `resolveModel()`: `if (tier==='fable'||tier==='opus') return tier`): - 🔴 **N×Fable-risk NAY được PIN che:** frontmatter đổi `inherit`→`opus` (worker-tier-pin S124) ⇒ **thiếu `tier`** → role-có-frontmatter → `model: opus` → lane = **opus (tier-2), KHÔNG còn ăn lead**. Vậy dù lead=Fable, lane vẫn opus (KHÔNG còn N×Fable). ⇒ `tier:'opus'` nay = **belt-and-suspenders** (explicit-is-better), KHÔNG còn là chốt-chặn DUY-NHẤT như thời all-inherit. - ⇒ Lỗi cũ 🟥 reviewer @S108 (lead=Fable → ensemble N×Fable) = **đã vá bằng pin**, giữ mô-tả làm lịch-sử. - 🔴 **Lỗ THẬT còn lại = `tier:'fable'` của `/fable-real`** (KHÁC frontmatter opus) → H23-precedence (xem dưới): nếu frontmatter thắng, `/fable-real` KHÔNG lên Fable được. ### ✅ ĐÃ VERIFY S126 (2026-07-16) — precedence spawn-param ⟂ frontmatter (H23 §2(2); flip từ "CHƯA VERIFY") **Đo thật (run `wf_f960dae2-fa0`, phiên đầu sau restart kích-hoạt frontmatter S124):** lane `reviewer` (frontmatter `opus`) + `tier:'fable'` → resolved **`claude-fable-5`** ⇒ **SPAWN-PARAM THẮNG hard-pin** ⇒ `tier:'fable'` của `/fable-real` KHÔNG NO-OP — escalate Fable ĐƯỢC (`hmw.js:44-51` mang kết-quả + caveat cùng nội-dung). *(`tier:'opus'` trùng frontmatter, vô-hại như cũ.)* Control: lane no-tier → `claude-opus-4-8` **DÙ lead=Fable** ⇒ pin ăn runtime (loại inherit-lead). **Caveat GIỮ:** retrospective (không hứa spawn tương-lai — PA-2b) · **ALIAS-pin only** (hub full-id KHÔNG covered) · **fix#8a vẫn mở** (param từ-chối full-id? chưa thử). Evidence: `runs/2026-07-16-S126-adap-spec-execute/runtime-verify-synthesis.md`. **PA-2 (anh chốt O1) = 2 lớp GIÁN-TIẾP bổ-trợ:** PA-2a hằng-số `TIER2_EXPECTED_FULL_ID = 'claude-opus-4-8'` (`hmw.js:53`) + PA-2b `scripts/spawn-model-audit.ps1` so resolved-vs-expected. > ⚠️ **Grep `tier:'opus'` ≥1 hit = ĐIỀU-KIỆN CẦN, KHÔNG ĐỦ** — nó chỉ đo **CHỮ trong file**, không đo runtime ⇒ **Goodhart-able 100%**. ## 🔴 Floor model-tier v3 + lead-discipline - **Lead = DEFAULT Opus 5 MAX** (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); cao hơn = anh `/model` hoặc `/fable-real` — 🧊 idiom owner-choice-per-session superseded-VALUE); **CẤM Sonnet/Haiku-class ghế lead**. Engine-đắt per-invocation = đường DUY NHẤT nâng 1 vai lên hạng-nhất. - ⚠️ **Lead KHÔNG tự ý gọi engine-đắt** — **kể cả khi HMW-mode ON**; chỉ chạy khi anh gõ lệnh.