FILE 4 fable-clone.md -- GAP#6: lane ensemble PHAI mang tier:'opus'.
Thieu => inherit lead => lead=Fable thanh N x Fable = dot quota gap N lan VA pha dung
ly-do lenh ton tai (ensemble RE de THAY 1 luot Fable dat). lead=Opus thi tier:'opus'
≡ inherit => loi VO HINH, chi lo khi Fable UP (dung loi reviewer bat @S108).
+ khai CHUA VERIFY precedence spawn-param vs frontmatter (H23 §2(2)) => DEFER phien lead=Fable.
+ grep tier:'opus' = DIEU-KIEN CAN, KHONG DU (do CHU trong file, Goodhart-able 100%).
FILE 5 agents/README.md -- bo SO khoi 8 cho (khong doi so: doi thi roster ke lai stale).
File nay chinh la VI-DU minh-hoa cho class view-stale-role-desc trong lead-view-auditor.md:47.
+ canh-bao bay glob: `ls .claude/agents/*.md` bat LUON README.md => thua 1 (R2-C1).
+ khai: doi roster = doi 2 BE-MAT DOC-LAP (agents/*.md -> registry | VALID_ROLES -> agentType).
FILE 6 fable-real-runbook.md -- 14 hit (lead bao 8 = SAI, xem duoi). + hmw.js:22-30 -> :22-36 (stale line-ref).
FILE 7 sleep-recovery-memory-l2.md -- `all` tu hardcode 9 -> DAN-XUAT TU DIA (do ra 10).
Danh-sach cung 9 da ROT office-document (them S107) suot tu do. Tro-treu: chinh doc do
da ghi "luon quet dia that" cho con-so 4/9 ngay duoi, nhung hardcode roster phia tren.
FILE 8 workflows/README.md -- TRI-ACCEPT vao ORPHAN-AUTHORITY (:19-20) + B1 pointer.
FILE 9 ACTIVE-MARKS.md -- chu-thich cho mark RC-...20-42-01 (anh CHOT: giu ban ky nguyen ven,
them chu-thich; P4/P8). "roster 12" trong than mark = anh chup luc ky, KHONG phai gioi-han.
+ STATUS.md:25 -- STALE THAT trong chinh file CANONICAL: row ghi | Sub-agents | 14 | nhung
narrative CUNG DONG ghi "ca 12 sub model: inherit" (W2 sua row, bo sot narrative).
Bay mega-line TAI HIEN: grep -c = 1 vs grep -o|wc -l = 2.
+ spec v3-PATCH -- SUA ACCEPTANCE FIX#6 (ban goc BAT-KHA-THI, tien-le WAL:29):
"0 hit song" do CA phan CO Y khop => implementation DUNG van truot. Lan thu BA cung ho
R2-C1 (ls=14) + R3-M3 (TOTAL>=46). Acceptance moi = disposition TUNG DONG theo 6 nhom.
Sweep that sau W3: 14 hit song, 0 cai la stale-can-va (vi-du co chu-dich / trich lich-su /
ban da ky / so tam / W5 chua toi luot / canonical history-delta).
LEAD TU BAT 2 LOI DEM (deu o truc dem-ve-viec-minh, -> adap-report):
(a) bao "fable-real-runbook 8 hit" -- that la 14; lay output `head -40` DA BI CAT lam so tong.
(b) bao "do lai tai-hien CHINH XAC du-bao FIX#4" roi lay trung-khop lam cho dua, trong khi
CA FIX#4 LAN LEAD deu dang do TEN FILE. Con-so dung, huong do sai.
=> khop feedback_meta_count_selfcoverage_blindspot: lead DO tot, lead DEM VE MINH thi sai.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
70 KiB
FABLE-REAL RUNBOOK — vận hành engine-đắt per-invocation (H21 S110; gốc H19 thật/ảo 2 vị-trí)
⚠️ H21 adopt S110 (2026-07-11): mode-marker + 2-vai-mặc-định RETIRED → per-invocation — engine-đắt chỉ chạy trong lượt anh gõ
/fable-real|/fable-clone <vai> <đề-bài>; vai anh gán đích-danh; mỗi run sinh spec-file 3-mục (engine propose → lead verify+ghi → worker theo spec). Các mục marker/$modedướ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.mdPHẦN K (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-markRC-pqhuy1987-03-07-2026-17-46-35(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-Awf_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 commenthmw.js:31snapshot 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)
- 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). - 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.
- 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. - 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.jsN-lane CÙNG vai (§3.3/§4.3 JSON). (🧊 H19: cũ đọc marker — nay per-invocation, §2.1-bis.) - Thu verdict (dòng-1
VERDICT:/Verdict:— chống #53; garble → recover 3-nấc R5: diary → SendMessage-resume → em-main solo) → em-main VERIFY (V1, không rubber-stamp) → harvest 1-entry/vai +[engine: …]stamp (V3/V4) → AC-check 8 tiêu-chí (§5.4) → commit.
2. WIRING — marker, biến hệ thống, hàm hmw.js, 3 GAP-guard
Engine
harness-11-engine.md §K= LUẬT (Harness-19 + K.E per-invocation H21). Section này = cách bấm nút (wiring thi hành ngay), KHÔNG lặp lý-lẽ canonical. Mọi biến có TÊN·KIỂU·NGUỒN; mọi bước có lệnh/hàm chạy được; checklist đánh-tick kèm evidence-form.
2.1 — MARKER lifecycle: .claude/fable-real-mode.on
🧊 Section này = lịch-sử H19 (retired H21 S110) — marker đã xóa; giữ nguyên văn làm record. Lifecycle MỚI = INVOCATION (§2.1-bis dưới).
Đường dẫn (KIỂU: file marker — nội-dung tùy ý, KHÔNG đọc): .claude/fable-real-mode.on — CHỈ xét tồn-tại/vắng.
🔴 Semantic INVERSE (bẫy — khác hmw-mode.on):
| Marker | Mode | Ý nghĩa vận-hành |
|---|---|---|
| VẮNG (mặc-định) | 🟢 Fable-clone (ảo/ensemble) | 2 vị-trí phán-quyết chạy N lane CÙNG vai + em-main synthesize |
| TỒN TẠI | 🔴 Fable-real (thật/single) | 2 vị-trí chạy 1 lần top-model deep pass |
Trái với
.claude/hmw-mode.on(CÓ = feature-ON / VẮNG = OFF). Ở đây VẮNG = clone-default (vẫn là mode SỐNG, KHÔNG phải "tắt"). Nguồn:harness-11-engine.md §K.B:325("⚠️ semantic INVERSE: marker-VẮNG = ảo-DEFAULT");session-start.md:30-31.
Lệnh đổi mode (CHỈ khi anh gõ — KHÔNG auto, §K.B:325):
| Lệnh | Hành-động em-main | Nguồn |
|---|---|---|
🧊 /fable-real (H19) |
Write file .claude/fable-real-mode.on (bật thật) |
fable-real.md:10 |
🧊 /fable-clone (H19) |
Remove-Item .claude/fable-real-mode.on (về ảo; vắng sẵn → "đã ở ảo-mode") |
fable-clone.md:8 |
/fable-real <vai> <đề-bài> |
lệnh-A single top-model (per-invocation, H21 — 0 marker, 0 persist) | fable-real.md (H21 redesign) |
/fable-clone <vai> <đề-bài> |
lệnh-B ensemble tier-2 (per-invocation, H21 — 0 marker, 0 persist) | fable-clone.md (H21 redesign) |
Verify gitignored (BẮT BUỘC — commit marker → thật-mode STUCK-ON = burn quota top-model):
git check-ignore -v .claude/fable-real-mode.on && echo "IGNORED" || echo "NOT-ignored"
# Evidence-form (đã chạy): .gitignore:92:.claude/fable-real-mode.on → IGNORED
Rule gitignore neo tại .gitignore:92 (.claude/fable-real-mode.on), đặt SAU !.claude/** để last-match-wins (.gitignore:89-92). Idiom && IGNORED || NOT = lá-chắn: bất-kỳ output KHÁC "IGNORED" ⇒ DỪNG, KHÔNG toggle.
🧊 Idiom marker chỉ còn giá-trị phòng-hờ (pattern
.gitignore:92GIỮ — file cũ sync lại vẫn ignored, KHÔNG semantics H21).
Reader @session-start (BƯỚC 0.5b — đóng gap WF2-Lane-A "marker write-only"): session-start.md:27-33 — em-main đọc marker → BÁO ngay đầu response mode 2 vị-trí (reviewer + investigator-codebase). Không có reader = marker mù; bước này = consumer chính-thức. (🧊 cite = bản H19 cũ; BƯỚC 0.5b nay = reader per-invocation H21, không còn marker.)
☑ Checklist marker:
- Toggle CHỈ khi anh gõ lệnh (KHÔNG số-dư/cảm-tính) — evidence: đối-chiếu
§K.B:325+fable-real.md:17 - Sau toggle: verify
git check-ignore= IGNORED (output trên) - @session-start BÁO mode qua BƯỚC 0.5b — evidence: dòng "🔴 Fable-real = ON" | "🟢 Fable-clone (MẶC-ĐỊNH)" hiện ở đầu response
- restart CLI sau khi TẠO/SỬA command
.md(no hot-reload) — evidence:fable-real.md:8
2.1-bis — INVOCATION lifecycle (H21 S110 — thay MARKER lifecycle §2.1)
Biến-đọc MỚI = INVOCATION{lệnh, vai, đề-bài} — derive từ CHÍNH lượt lệnh anh gõ, KHÔNG file-state, 0 persist (hết lượt = hết hiệu-lực, khác marker cũ dính qua session).
- 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). - Parse
{lệnh, vai, đề-bài}từ$ARGUMENTSlượt đó — KHÔNG suy từ note/marker phiên trước. - Vai ∉ roster HOẶC thiếu vai/đề-bài → hỏi anh ĐÚNG 1 dòng, KHÔNG tự chọn vai (owner-gated tầng lệnh + kỷ-luật lead — KHÔNG code-enforced).
- 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).
- 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.
- Worker (model thường MAX) thực-thi THEO spec bơm qua args.
- Hết lượt = hết hiệu-lực — 0 trạng-thái persist.
⚠️ 4 ghi-chú trung-thực (H21): (a) "không tự chọn vai" = tầng KỶ-LUẬT owner-gated, KHÔNG claim code-enforced; (b) lệnh/alias = cách anh GÁN VAI NHANH, vẫn phải anh gõ — hệ không tự chọn vai; (c) spec-file do LEAD ghi SAU verify — engine không tự ghi; (d) run chấm/verify CŨNG sinh spec-file (kế-hoạch xử issue = "cách làm" cần kết-tinh).
2.2 — Bảng biến hệ thống (TÊN · KIỂU · NGUỒN · giá-trị)
| # | Biến | KIỂU | NGUỒN (file:line / lệnh đọc) | Giá-trị / ngữ-nghĩa |
|---|---|---|---|---|
| 1 | 🧊 marker-state (H19 retired) | boolean (file tồn-tại?) | .claude/fable-real-mode.on · reader session-start.md:29 |
🧊 CÓ=real · VẮNG=clone(default) — retired H21 |
| 1b | $engine (H21) | enum {real-single, clone-ensemble} |
derive từ TÊN LỆNH lượt này (/fable-real|/fable-clone) — KHÔNG file-state (INVOCATION §2.1-bis) |
thay marker-state; INVOCATION-derived, 0 persist |
| 2 | lead-runtime | enum {Fable-5-1M · Opus-4.8-1M} |
BƯỚC 0.6 probe session-start.md:35-37 (/model resolve / spawn-test) |
per-session — owner-choice CHÍNH (MTv3: anh chọn mỗi phiên, đổi giữa phiên OK, 0 caveat/0 revert-nghĩa-vụ) + outage-path PHỤ (H5); KHÔNG tin note phiên trước, KHÔNG steady-state |
| 3 | tier (per-task) | 'fable' | 'opus' | undefined |
hmw.js:18 (field taskList) + resolveModel hmw.js:38 |
undefined=inherit top-tier (clone mặc-định) · 'opus'=pin tier-2 sweep/cost · 'fable'=nâng lead-tier CHỈ trong lượt lệnh engine-đắt anh gõ (H21 — lead KHÔNG tự ý) |
| 4 | checkpointApproved | boolean | hmw.js:77-79 (THROW nếu ≠true) |
em-main set true SAU khi BÁO {số agent·vai·task} @inform → fan-out |
| 5 | taskList[] | Array<{role,label,prompt,tier?}> |
hmw.js:18 + :71-72 (bắt buộc, non-empty) |
mảng lane; clone = N item CÙNG 1 role |
| 6 | role / agentType | VALID_ROLES | undefined |
hmw.js:22-36 (whitelist) + filter + agentType |
vai engine-đắt = anh gán (H21, mọi vai roster; §3/§4 template = reviewer · investigator-codebase); VALID_ROLES = ĐỦ roster (số canonical → docs/STATUS.md §Sub-agents; +2 monitor S110, +2 monitor H24 S121 W2) |
| 7 | memoryPack | Record<role, slice> |
hmw.js:15,85,103,125 |
SLICE MEMORY.md của đúng vai (KHÔNG full) → inject prompt |
| 8 | spec | string | hmw.js:16,86,126 |
acceptance chung mọi lane |
| 9 | run (alias wave) |
{name,dir} | null |
hmw.js:19,92-93 |
null=return-delta-only (mặc-định) · set=RUN-TRACE (sub ghi sub-<role>-<i>.md) |
| 10 | SCHEMA.memoryDelta | {task,verdict,learned,surprise} 4-field required |
hmw.js:54-64 (required :57) |
RETURN-only; agent KHÔNG tự ghi ký-ức → em-main harvest @P3 |
| 11 | VALID_ROLES | const string[] (ĐỦ roster — KHÔNG chép độ-dài vào đây, B1) |
hmw.js:22-36 |
8 core + database-agent(S57) + office-document(S107) + tooling-auditor/harvest-curator(S110 anh-directed) + lead-view-auditor/lead-omission-auditor(S121 W2, H24) |
| 12 | engine-label | string (em-main stamp — KHÔNG có field trong SCHEMA) | §K.C GAP-2 harness-11:329 |
em-main @P3 gắn nhãn engine đã dùng (xem 2.4) |
resolveModel logic thật (hmw.js:37-45) — trích:
tier==='fable'||'opus' → return tier // pin model (escape-hatch)
tier lạ khác → warn + bỏ qua (:39)
!role && rawRole (typo) → return undefined // fail-UP inherit Fable (:42)
!role (role-less) → return undefined // inherit lead-model (:43)
role có frontmatter → return undefined // H8 all-inherit top-tier (:44)
⇒ Không set tier = mọi lane clone chạy inherit top-tier (mặc-định); muốn ép tier-2 Opus (giữ quota Fable cho lead) = thêm tier:'opus'.
2.3 — Hàm / điểm gọi: việc → lệnh cụ thể
| Việc | Cơ-chế | Lệnh / param chạy được | Khi nào dùng |
|---|---|---|---|
| Clone ensemble (N lane CÙNG vai) | hmw.js parallel (:98) → agent() (:138-143) |
JSON args bên dưới — taskList = N item cùng role |
Lượt anh gõ /fable-clone <vai> + heavy-judgment (H21 per-invocation; 🧊 cũ: marker VẮNG) |
| Real single (1 deep pass) | Agent-tool spawn LẺ (1 agent) | agentType: "reviewer" | "investigator-codebase", prompt deep-pass; model = lead-runtime (inherit) |
Lượt anh gõ /fable-real <vai> + cần 1 lăng-kính sâu nhất (H21 per-invocation; 🧊 cũ: marker CÓ) |
| Resume lane garble/truncate | SendMessage-resume in-session | gửi lại agent đã spawn (KHÔNG re-spawn mới) | Lane trả wrong-slice (#53) — nấc 2 recovery-ladder (diary → SendMessage-resume S105 → em-main solo) |
| Fallback cuối | em-main solo | em-main tự làm vai phán-quyết | 529 overload / spawn truncate / SendMessage cũng garble |
JSON shape clone ensemble (ví dụ reviewer 3 lane đa-lăng-kính) — bơm vào hmw.js @P2:
{
"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 DEFAULTreturn-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.jsVALID_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[*].rolephải đồng-nhất = ĐÚNG vai anh gán trong lệnh (grep taskList trước fan-out; §3/§4 template =reviewer/investigator-codebase). Ghi-chú: engine§K.Ckhai "TOÀN roster" khớphmw.js:22-36(lịch-sử: 9 S101 → +office-documentS107 → +2 monitor H1/H2 S110 → +2 monitor H24 S121 W2) — luật "no-gate → em-main tự-gác" KHÔNG đổi. 🔴 KHÔNG chép số vai vào đây (B1 →docs/STATUS.md§Sub-agents). - Nấc: convention (hmw.js không gate vai; kỷ-luật em-main gác).
🔴 GAP-2 — engine-label stamp (RULE): hmw.js SCHEMA memoryDelta{task,verdict,learned,surprise} KHÔNG có field engine → em-main stamp nhãn engine @P3 harvest (single-writer B3) khi ghi MEMORY entry.
- Mẫu nhãn cụ-thể (chọn 1 theo run thật):
[engine: fable-real-single]·[engine: fable-clone-3lane]·[engine: opus-worker]·[engine: fable-clone-3lane | lead=Opus-1M(H5)] - Evidence-form: mỗi entry harvest có prefix
[engine: …](như S101 "model-note Opus-S101",§K.C:329). - Nấc: convention KHÔNG mechanism (SCHEMA thiếu field → em-main tay-gắn).
🔴 GAP-3 — RETURN-only + em-main 1-entry/vai (RULE): N lane RETURN-only; em-main ghi ĐÚNG 1 MEMORY entry / vai (+ nhãn GAP-2). "Một vai = một trí-nhớ dù chạy thật/ảo/engine nào" (chống AS-10 fragment N-lane).
- Evidence-form: sau clone,
agent-memory/reviewer/MEMORY.md(hoặc investigator-codebase) tăng 1 entry hợp-nhất, KHÔNG N entry rời; git-diff post-P2 = 0 tracked-change NGOÀI run-folder. - Nấc: convention — ⚠️ AS-10 fired LIVE S101 (lane tự-ghi reviewer-memory dù intent RETURN-only; harness-sanctioned "intentional" → KEPT+verified,
§K adopt:317). 2 vị-trí read-only (no Write/Edit) mechanize MỘT PHẦN, nhưng Bash residual mở (G-015) → containment THẬT = em-main single-writer + git-diff, KHÔNG khoá-cứng.
2.5 — Decision-matrix: KHI NÀO real vs clone
Cổng vào (K.D 3 floor-point RC-pqhuy1987-03-07-2026-17-46-35, harness-11:332 / ACTIVE-MARKS.md): (1) lead = frontier-class do anh chọn per-session {Fable 5 | Opus 4.8 — 1M MAX} (model-tier-v3); CẤM Sonnet/Haiku-class ghế lead · (2) top-model deep-run CHỈ trong lượt lệnh engine-đắt anh gõ kèm vai (H21) · (3) mọi vai khác giữ mặc-định. 🧊 (văn K.D gốc: "lead LUÔN top-model — KHÔNG đụng · CHỈ 2 vị-trí phán-quyết chạm top-model, CHỈ real do anh gõ" — superseded model-tier-v3 + H21 per-invocation; giữ ý-nghĩa neo RC-mark.)
4 câu hỏi lọc (H21 per-invocation):
- 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). - 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.
- 🧊 (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.) - Fable up? (BƯỚC 0.6). Chỉ ảnh-hưởng model per-run của lệnh-A (up=single-Fable · outage=single-Opus-1M).
| Tình huống | Engine | Cơ-chế thực-thi |
|---|---|---|
anh gõ /fable-clone <vai> <đề-bài> |
🟢 lệnh-B ensemble | hmw.js parallel N lane same-role + em-main synthesize (2.3 JSON) — VALID_ROLES ĐỦ roster (S110 +2 monitor · S121 W2 +2 monitor H24). 🔴 lane PHẢI mang tier:'opus' (GAP#6 — thiếu ⇒ inherit lead ⇒ lead=Fable thành N× Fable = phá đúng mục-đích lệnh; xem fable-clone.md) |
anh gõ /fable-real <vai> <đề-bài> |
🔴 lệnh-A single | Agent-tool spawn LẺ 1 agent, deep pass |
| anh KHÔNG gõ lệnh engine-đắt | — | mặc-định (sub thường / workflow chuẩn; em-main có thể ĐỀ XUẤT anh gõ khi heavy-judgment) |
| việc NHẸ (không trivial) | — | single spawn thường 1 con (KHÔNG ensemble, KHÔNG deep-pass nghi-thức) |
| trivial / <2-3' / 1-file | — | em-main solo |
| 🧊 (bảng H19 cũ khóa theo marker VẮNG/CÓ + "2 vị-trí" — thay bằng bảng trên, H21 S110.) |
Tương-tác marker (H21): còn 1 marker duy-nhất
hmw-mode.on(HMW fan-out consent — HỆ KHÁC, giữ nguyên, ngoài scope H21); engine-đắt = per-invocation KHÔNG marker. Cả hai độc-lập: HMW-ON + anh gõ lệnh engine-đắt trong phiên = task substantive vẫn HMW, riêng lượt lệnh chạy engine-đắt đúng vai. 🧊 (cũ H19: 2 markerhmw-mode.on+fable-real-mode.on— cái sau retired H21.)
H5 per-run fallback (lệnh-A, fable-real.md:16 / §K.B:323): Fable up → single-Fable; Fable down → single-Opus-1M theo TỪNG LẦN CHẠY trong CHÍNH lượt lệnh đó. Model do BƯỚC 0.6 probe quyết mỗi lần spawn. 🧊 (H19 wording "KHÔNG flip marker, mode vẫn real toàn-cục" — retired: H21 không còn mode toàn-cục để flip.)
💰 Cost-note (honest, §K:334 / broadcast §8): ensemble KHÔNG rẻ hơn nhiều về token thô. Value THẬT ≠ tiết-kiệm mà = anti-consensus-catch (dogfood S101 WF2 Lane-B bắt workflows/README:51 stale-label mà token-sweep sót, commit f229b07) + depth + formalize ensemble-heavy-judgment + Fable-outage timeliness. Chọn real khi cần 1 lăng-kính sâu nhất; chọn clone khi cần N lăng-kính phản-biện (rẻ quota top-model hơn nếu pin tier:'opus' lúc Fable về).
⚠️ VACUOUS-hay-THẬT tùy runtime (
§K.D:332viế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 pintier:'opus'= ensemble tier-2 đúng nghĩa §K.B — cost-lever SỐNG, và S108 = lần đầu (dogfood §5.5).
☑ Checklist decision (mỗi mục tick + evidence):
- Vai ANH GÁN ∈ roster — evidence: quote nguyên văn lệnh anh (H21; 2 monitor × lệnh-B → limitation K.E) (🧊 H19: "việc ∈ {reviewer, investigator-codebase}")
- INVOCATION{lệnh, vai, đề-bài} parse đúng từ lượt lệnh — evidence: quote lệnh (🧊 H19: "đọc marker BƯỚC 0.5b")
- BƯỚC 0.6 probe lead-runtime — evidence: "lead=Fable" | "lead=Opus-1M(H5)"
- Clone:
taskList[*].roleđồng-nhất (GAP-1) — evidence: grep taskList - Harvest: 1 entry/vai + nhãn
[engine: …](GAP-2/3) — evidence: diffagent-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ốcfile:line+sqlcmd+git, chống bịa + RCA).investigator-apivàdatabase-agentEXCLUDED khỏi 2 vị-trí phán-quyết (harness-11-engine.md:320, K.A.b). (H21: section này = template tham-chiếu cho vai hay-gán-nhất; vai thực-tế do ANH GÁN trong lệnh — mọi vai roster hợp-lệ, "EXCLUDED" = ngữ-cảnh 2-vị-trí H19 cũ.) Luật ở đâu, nút ở đâu: ngữ-nghĩa 2 mode + 3 GAP-guard + 3 floor-point = engine §K (harness-11-engine.md:322-334) — KHÔNG lặp lại ở đây. Section này = cách bấm nút: biến vào lane, tham-số spawn, checklist tick-được, fallback.
3.1 Bảng BIẾN đầu vào lane
Mọi biến em-main chốt @P0/P1 rồi bơm vào lane. Kiểu + nguồn đọc (file:line hoặc lệnh) + ví-dụ giá-trị THẬT (domain SOLUTION_ERP):
| Biến | Kiểu | Nguồn đọc (file:line / lệnh) | Ví-dụ giá-trị thật |
|---|---|---|---|
🧊 $mode (H19 retired) |
enum{real,clone} |
Test-Path .claude/fable-real-mode.on → $true=real · $false=clone (marker = source-of-truth, fable-real.md:10; K.B harness-11-engine.md:322-323). Marker gitignored — verify git check-ignore .claude/fable-real-mode.on ✓ |
real (marker CÓ, .claude/fable-real-mode.on:1 — set S108) |
$engine (H21) |
enum {real-single, clone-ensemble} |
derive từ TÊN LỆNH lượt này (/fable-real|/fable-clone) — KHÔNG file-state (INVOCATION §2.1-bis) |
real-single (vd lượt anh gõ /fable-real <vai>) |
$target |
string |
Câu-hỏi sự-thật em-main đóng-khung @P1; nếu qua lệnh = $ARGUMENTS của /fable-real (fable-real.md:12) |
"PE multi-winner đã wire ĐỦ read-site sau đổi field single→multi — TRUE/FALSE + chỗ sót?" |
$claimsList |
array<string> |
em-main tách $target thành claim nguyên-tử @P1 | ["PurchaseEvaluation entity field multi-winner là collection (KHÔNG single Guid)", "PeService.ApproveV2Async đọc multi-winner ở MỌI read-site", "FE PE matrix render N winner"] |
$evidencePaths |
array<path|glob> |
Con-trỏ seed từ recon P1 (KHÔNG giới-hạn — lane mở rộng nếu cần) | ["src/Backend/SolutionErp.Domain/PurchaseEvaluations/*.cs", "src/Backend/SolutionErp.Application/PurchaseEvaluations/**/*.cs", "fe-user/src/**/pe/**/*.tsx"] |
$budgetNote |
string |
Sàn persona: maxTurns 20 (investigator-codebase.md:13) + report ≤500 words (:43) + ưu-tiên search_code BM25 trước Read full-file (:39) |
"single-deep-pass; maxTurns 20; report ≤500 words; search_code trước Read" |
$engineLabel |
string |
Engine runtime THỰC-TẾ lúc spawn — đọc BƯỚC 0.6 probe MỖI PHIÊN (per-session outage-driven; ⚠️ KHÔNG tin comment hmw.js:31 — snapshot S66-era có thể stale). Dùng cho GAP-2 stamp @P3 |
"Fable-S108" (S108 Fable UP, self-report ×5) · khi outage: "Opus-1M(H5)-Sxxx" |
$memSlice |
string |
Clone-mode: slice MEMORY của vai — 200 dòng đầu / 25KB .claude/agent-memory/investigator-codebase/MEMORY.md (investigator-codebase.md:31). Bơm qua memoryPack["investigator-codebase"] (hmw.js:103). Real-mode: auto-inject bởi Agent-tool, KHÔNG cần bơm |
"PE V2 flagship (ApproveV2Async/LevelOpinion) · gotcha #53 truncation · #78/#79 PE finalize-flag · cardinality-change grep-consumers S87/S88" |
$lensList |
array<string> |
Clone-mode only — N lăng-kính em-main thiết-kế @P1 (mỗi lăng-kính = 1 lane CÙNG vai, GAP-1) | ["evidence-lens", "counter-example-lens", "provenance-lens"] |
3.2 REAL-mode — single-deep-pass qua Agent tool
Điều-kiện: lượt này anh gõ /fable-real <vai> <đề-bài> (H21 — quote lệnh làm evidence). 🧊 (H19: $mode == real marker CÓ.) Spawn DUY NHẤT 1 investigator-codebase qua Agent tool (KHÔNG qua hmw.js — hmw dành cho clone-ensemble), đào SÂU 1 lần. 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):
- 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 recoverfeedback_agent_return_garble_recover: (1) đọc diary → (2)SendMessage-resume in-session → (3) em-main solo redo. - GAP-2 (engine-label): stamp
$engineLabel— SCHEMAmemoryDeltaKHÔNG có field engine (hmw.js:57-63), em-main gắn nhãn @P3 (harness-11-engine.md:329, mirror "model-note Opus-S101"). - GAP-3 (RETURN-only): lane KHÔNG tự ghi MEMORY (persona
:6KHÔNG có Write tool; step-5 self-update:54bị H19 override) → em-main single-writer (B3) ghi 1 entry vào.claude/agent-memory/investigator-codebase/MEMORY.mdtừ blockMEMORYDELTA.
3.3 CLONE-mode — N-lane ensemble qua hmw.js parallel
Điều-kiện: lượt này anh gõ /fable-clone <vai> <đề-bài> (H21). 🧊 (H19: $mode == clone marker VẮNG = mặc-định.) N lane CÙNG 1 vai investigator-codebase (GAP-1: đa-lăng-kính, KHÔNG mixed-roster fan-out — harness-11-engine.md:328), mỗi lane 1 lăng-kính ∈ $lensList. Reuse hmw.js parallel (dogfood S101, fable-clone.md:8-9).
args JSON shape thật (em-main bơm @P2 — hmw.js:14-20):
{
"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êmrun:{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 →resolveModeltrả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).memoryPackkeyed 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:truebắt-buộc, thiếu →throw(hmw.js:77-79).
Em-main refute + synthesize (P3/P4):
- Gom N return (mỗi lane
{findings, checklistEvidence, memoryDelta}— SCHEMAhmw.js:47-66). - Đối-chiếu per-claim: evidence-lens=TRUE nhưng counter-example-lens tìm được chứng VỠ cụ-thể → verdict = PARTIAL/FALSE (counter thắng khi có
file:linechứng ngược). Provenance-lens = trọng-tài xuất-xứ khi 2 lane cãi "đã có từ bao giờ" (hash/commit thắng). - 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:51stale-label mà token-exact sweep sót, commitf229b07). - Kết: 1 verdict hợp-nhất + evidence-set gộp (dedupe
file:line). - GAP-2 stamp
$engineLabel+ GAP-3 ghi 1 MEMORY entry (single-writer B3) — KHÔNG N entry, KHÔNG lane tự-ghi (hmw.js:120).
3.4 CHECKLIST lane (tick-được — 12 mục, mỗi mục kèm evidence-form)
Tick mỗi lần chạy lane (cả 2 mode trừ khi ghi [clone]/[real]):
- 1. INVOCATION xác-định đúng — {lệnh, vai, đề-bài} từ lượt lệnh anh; vai ∈ roster (§2.1-bis, H21) — evidence: quote nguyên-văn lệnh anh gõ (🧊 cũ:
$modetừ Test-Path marker) - 2. Mỗi claim ∈
$claimsListcó verdict TRUE/FALSE/PARTIAL/UNCERTAIN — evidence: blockCLAIMS:đủ N dòng =len($claimsList) - 3. Mỗi verdict neo
file:lineMỞ-ĐƯỢC — evidence: re-openRead <path>:<line>/Grep -nkhớp nội-dung (persona:43-48) - 4. Fabricate-guard — thiếu chứng → "uncertain + lý-do", KHÔNG đoán — evidence: grep return có
uncertain|không tìm thấyở claim thiếu chứng (persona:93) - 5. Schema/migration claim đối-chiếu DB THẬT — evidence:
sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Dev -Q "SELECT MigrationId FROM __EFMigrationsHistory"(persona:64) + 3-file rulels src/Backend/SolutionErp.Infrastructure/Migrations/*<Name>*(persona:79) - 6. Wire/endpoint claim = code THẬT KHÔNG mock — evidence:
git grep -nE "// Mock|alert\(|setEditing\(null\) // close UI"= 0 hit + verb POST/PUT/DELETE thật (persona:72-76) - 7. Authz claim: per-action policy (gotcha #44 silent 403) — evidence:
grep -n "\[Authorize(Policy" <controller>.cs(persona:74) - 8. Provenance origin traced — evidence:
git log -1 --oneline -- <path>/git blame -L <n>,<n> -- <path>/ commit hash (persona Bash:23,:40) - 9. Surprises ngoài-câu-hỏi captured RIÊNG — evidence: return có block
SURPRISES:(persona:48; scope-drift-guard:94) - 10. Report ≤500 words + TOKENS tracked — evidence:
word-count(findings) ≤ 500+ dòngTOKENS:(persona:43,:51) - 11. RETURN dòng-1 =
VERDICT:header (anti-#53) — evidence: regex^VERDICT:match dòng đầu; FAIL → recover ladderfeedback_agent_return_garble_recover(diary → SendMessage-resume → em-main solo) - 12. [clone] N lane CÙNG vai + em-main 1-entry — evidence:
taskList[*].role == "investigator-codebase"(GAP-1;hmw.js:22-28) ∧ sau synth.claude/agent-memory/investigator-codebase/MEMORY.md+1 entry duy-nhất có nhãn$engineLabel(GAP-2/3; single-writer B3;agents/README.md:209)
3.5 Fallback H5 per-run (Fable down → single-Opus-1M, KHÔNG đổi mode)
- Trigger: tại thời-điểm spawn, BƯỚC 0.6 probe báo Fable DOWN (H5) →
inheritresolve = 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ừ commenthmw.js:31(snapshot cũ). - Hành-vi: lane VẪN chạy đúng
$modehiện-tại — marker KHÔNG đổi. CHỈ engine resolve khác (top-model = Opus-1M thay Fable). Đây là per-RUN, KHÔNG phải mode-flip (fable-real.md:20; K.B:323). - KHÔNG tự gõ
/fable-clonekhi Fable down. Đổi mode = QUYỀN ANH (K.D point-2;fable-real.md:17) — H5 chỉ hạ engine, giữ mode. $engineLabelghi trung-thực: chạy Opus thì stampOpus-S108, KHÔNG ghi "Fable" → GAP-2 stamp đúng thực-tế (harness-11-engine.md:329).- Khi Fable về:
inherittự 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êmtier:'opus'per-task (hmw.js:38).
⚠️ Honest (pointer §K, KHÔNG re-litigate — nguyên bản viết lúc outage): KHI Fable DOWN → real vs clone hội-tụ Opus-1M, khác-biệt còn lại = cấu-trúc (real=1 deep pass · clone=N-lane + synth). KHI Fable UP + clone pin
tier:'opus'→ khác-biệt model-tier THẬT. Thật-mode-toggle first-real-run S108 (dogfood §5.5 — engine:334đã note-supersede kèm); value = depth + anti-consensus-catch + phân-tầng owner-control.
4. LANE REVIEWER (cổng rà-soát cuối — adversarial)
Vai trò (engine §K.A,
docs/governance/harness-11-engine.md:320):reviewer= (a) Cổng rà-soát cuối — adversarial 6-category + Smart-Friend anti-rubber-stamp + live-curl falsify + phân-xử mâu-thuẫn. Persona canonical:.claude/agents/reviewer.md. Runbook này = cách bấm nút (§K = LUẬT; KHÔNG lặp lại). Engine do TÊN LỆNH lượt này quyết (H21):/fable-real= single deep-pass top-model THẬT ⟺/fable-clone= ensemble N-lane CÙNG vai. 🧊 (H19: 2 mode do marker quyết, clone = mặc-định — retired.)
4.1 — BẢNG BIẾN lane (tên · kiểu · nguồn đọc · ví-dụ)
| Biến | Kiểu | Nguồn (file:line hoặc lệnh đọc) | Ví-dụ |
|---|---|---|---|
🧊 $mode (H19 retired) |
enum real|clone |
Test-Path .claude/fable-real-mode.on — TỒN-TẠI=real, VẮNG=clone-default (session-start.md:27-33 BƯỚC 0.5b · fable-real.md:10) |
clone (marker vắng) |
$engine (H21) |
enum {real-single, clone-ensemble} |
derive từ TÊN LỆNH lượt này (/fable-real|/fable-clone) — KHÔNG file-state (INVOCATION §2.1-bis) |
clone-ensemble (vd lượt anh gõ /fable-clone <vai>) |
$modelTier |
enum fable|opus |
BƯỚC 0.6 runtime probe (session-start.md:35-37) — Fable UP=fable, outage=opus (H5); per-session KHÔNG steady-state |
fable (S108 UP ×5 self-report) |
$reviewTarget |
diff-range | file-set | claim-set | git diff base..head (reviewer.md:37,54) |
HEAD~3..HEAD — 4 file, +180/-40 LOC |
$spec |
string (prompt gốc + acceptance) | em-main P1 → hmw.js:86,126 (spec) · reviewer.md:36-42 |
"Wire CRUD Supplier POST/PUT/DELETE + validator" |
$categories |
enum-set 6 (Cat-6 điều-kiện) | reviewer.md:47-197 (Cat1 Wire · Cat2 Schema · Cat3 Security · Cat4 CodeQ · Cat5 Test · Cat6 Writing*) |
[1,2,3,4,5] (không outward → bỏ 6) |
$deployClaim |
bool Y|N |
em-main spec (reviewer.md:40) |
Y → kích $liveProbe |
$outwardFlag |
bool Y|N |
target chứa email/adap-report/broadcast/shared-doc? (reviewer.md:189) |
N → Cat-6 = N-A |
$liveProbe |
curl cmd-set (chỉ khi $deployClaim=Y) |
reviewer.md:58-88 (login→bearer→POST/PUT/DELETE/PATCH -w "%{http_code}") |
curl -X POST https://api.solutions.com.vn/api/suppliers ... -w "%{http_code}" |
$verdictForm |
struct {verdict, diffScope, catTable[6], issues{critical,major,minor}[file:line], liveVerifyTable, recommendation, tokenCost} |
reviewer.md:201-242 |
verdict=FAIL; catTable[1]=FAIL(1 critical) |
$memoryPackSlice |
string (slice reviewer diary) | .claude/agent-memory/reviewer/MEMORY.md → hmw.js:85,103 (SLICE, KHÔNG full) |
"gotcha #44 silent-403 · #25 IIS 405 · wire-claim FP pattern" |
4.2 — REAL (lệnh-A /fable-real): single deep-pass Agent-tool (🧊 H19: "marker CÓ")
Precondition (H21): lượt này anh gõ /fable-real <vai> kèm đề-bài (quote lệnh làm evidence). REAL = 1 spawn TRỰC-TIẾP (KHÔNG qua hmw.js — hmw = clone ensemble). 🧊 (cũ H19: Test-Path marker = True.)
(a) Spawn param (Agent-tool / Task — 1 lần):
# em-main spawn 1 reviewer trực-tiếp — single top-model deep pass (fable-real.md:20 · §K.B:323)
Task/Agent(
subagent_type: 'reviewer', # = agentType; persona .claude/agents/reviewer.md; VALID_ROLES hmw.js:22-28
description : 'reviewer-real: <$reviewTarget>',
# model : 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 rà lại (reliable, agents/README.md:64,71). 529-Overload transient → solo, KHÔNG retry-loop.
4.3 — CLONE (lệnh-B /fable-clone): N-lane CÙNG vai qua hmw.js (🧊 H19: "marker VẮNG = mặc-định")
Ensemble tier-2 = reuse HMW parallel (dogfood S101 WF2 3-lane bắt README:51 stale-label mà token-sweep sót, commit f229b07 — fable-clone.md:9). em-main bơm args @P2 sau checkpoint:
// 🔴 GAP-1 (§K.C:328): MỌI role='reviewer' — N-lane CÙNG 1 VAI (multi-lens), KHÔNG mixed-roster fan-out.
args = {
checkpointApproved: true, // BẮT BUỘC else throw (hmw.js:77-79)
spec: '<$spec + acceptance + $reviewTarget(base..head) + $deployClaim + $outwardFlag>', // hmw.js:86,126
memoryPack: { reviewer: '<$memoryPackSlice — gotcha #44/#25 + wire-claim FP pattern>' }, // hmw.js:85,103 (SLICE)
taskList: [
{ role:'reviewer', tier:'opus', label:'rev-correctness',
prompt:'LENS=correctness — Cat1 Wire-BE + Cat2 Schema + Cat4 CodeQ (reviewer.md:47/91/146). grep mock+verb, dotnet build clean.' },
{ role:'reviewer', tier:'opus', label:'rev-security',
prompt:'LENS=security — Cat3 (reviewer.md:120): [Authorize] class+per-action #44, FluentValidation, injection/XSS/path-traversal.' },
{ role:'reviewer', tier:'opus', label:'rev-writing',
prompt:'LENS=writing-quality — Cat6 (reviewer.md:187) CHỈ khi $outwardFlag=Y (email/adap-report/broadcast); N → trả N-A.' },
{ role:'reviewer', tier:'opus', label:'rev-reproduce',
prompt:'LENS=does-it-reproduce — Cat5 test + $liveProbe: chạy build/test + (deploy) curl prod reviewer.md:58-88, thử tái-hiện claim.' },
],
}
// invoke: Workflow(hmw.js) với args ↑ — DEFAULT return-delta-only (review nhẹ, KHÔNG cần run-folder; hmw.js:118-122).
4 lăng-kính (lens): correctness · security · writing-quality · does-it-reproduce. Mỗi lane INHERIT persona reviewer.md (cùng 6-category) nhưng FOCUS 1 lens → đa-góc chống điểm-mù.
tier:'opus' (🔴 BẮT BUỘC khi Fable UP — KHÔNG phải option): hiện-thực "ensemble tier-2" (§K.B:324) — escape-hatch hmw.js:36,38 ép Opus. Fable UP mà BỎ pin → N lane inherit = N×Fable = 2 vị-trí chạm top-model NGOÀI chế-độ thật (trái K.D floor-2 "chỉ khi anh gõ"). Khi outage → inherit đã = Opus → pin moot-nhưng-vô-hại, GIỮ nguyên để an-toàn khi Fable về.
em-main synthesize verdict cuối (P3/P4):
- Gom 4 return (findings + memoryDelta 4-field).
- Refute (P3): lane FAIL kèm issue confirmed file:line → GIỮ; lane over-claim không bằng-chứng → BÁC.
- Merge → 1 verdict: bất-kỳ lane FAIL-confirmed → overall FAIL;
rev-writing= N-A khi$outwardFlag=N(KHÔNG kéo verdict). - GAP-2 stamp: em-main gắn engine-label
"clone-ensemble-4lane-opus-<Sxxx>"@P3 harvest (§K.C:329). - GAP-3: 4 lane RETURN-only → em-main ghi 1 MEMORY entry
reviewer(single-writer B3,§K.C:330).
4.4 — 3 GAP-guard §K.C (bắt buộc CẢ 2 mode — pin để stamp CÓ NGHĨA)
| GAP | Rủi-ro (engine) | Cách bấm | Nguồn |
|---|---|---|---|
| GAP-1 scope-creep | hmw.js VALID_ROLES nhận TOÀN roster KHÔNG gate → 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-36 |
| GAP-2 engine-label | SCHEMA memoryDelta KHÔNG field engine |
em-main stamp nhãn engine @P3 harvest (real|clone-<tier>-Sxxx) = convention |
§K.C:329 · hmw.js:54-64 |
| GAP-3 AS-10 fragment | N lane giữ Bash (fails-open) → phân-mảnh trí-nhớ | N lane RETURN-only → em-main ghi 1 entry / vai (+ nhãn) | §K.C:330 · fable-real.md:26 |
4.5 — CHECKLIST thi-hành (tick-được, mỗi mục có evidence-form)
- 1. INVOCATION xác-định đúng — {lệnh, vai, đề-bài} từ lượt lệnh anh; vai ∈ roster (§2.1-bis, H21). Evidence: quote nguyên-văn lệnh anh gõ. 🧊 (cũ H19: Mode resolved từ Test-Path marker + BƯỚC 0.5b.)
- 2. Runtime tier probed — BƯỚC 0.6 xác-định
inherit=Fable|Opus. Evidence: probe self-report"claude-fable-5"|"opus"(session-start.md:35-37). - 3.
$reviewTargetchố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.
$liveProbechạ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:
$verdictFormCritical/Major/Minor list (reviewer.md:219-227). - 9. GAP-1 N-lane CÙNG vai (clone). Evidence:
hmw.jsargstaskListMỌIrole:'reviewer'(§K.C:328). - 10. GAP-3 RETURN-only. Evidence:
git statussạ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
reviewercó nhãn"real\|clone-<tier>-Sxxx"@P3 (§K.C:329). - 12. Synthesize 1 verdict (clone). Evidence: em-main P3/P4 refute-merge note → 1 PASS/FAIL cuối (
§K.B:324).
4.6 — Ranh-giới vs investigator-codebase (2-đầu-khác-trục, L.B §4 engine:344)
| Trục | reviewer (lane NÀY) | investigator-codebase (lane KIA) |
|---|---|---|
| Câu-hỏi | "Diff này ĐÚNG spec + an-toàn commit KHÔNG?" (phán) | "Sự-thật hiện-trạng là GÌ?" (truy) |
| Thế | Adversarial — giả-định CÓ bug, thử-phá (reviewer.md:18) |
Neutral audit — chống bịa + RCA (investigator-codebase.md:4,18) |
| Xuất | Verdict gate PASS/FAIL + issues file:line (reviewer.md:204) |
Conclusion + Evidence file:line + Surprises (investigator-codebase.md:44-52) |
| Trigger | pre-commit / wire-BE claim / heavy diff (reviewer.md:4) |
pre-flight recon / scan >5 file / schema drift (investigator-codebase.md:4) |
KHÔNG trùng việc (chống "cùng-góc-cùng-điểm-mù", engine:344): reviewer PHÁN (adversarial gate) ⟂ investigator TRUY (ground-truth evidence). Khi review cần ground-truth sâu (VD "prod schema thật ra sao") → reviewer KHÔNG tự RCA, mà em-main spawn investigator-codebase song-song feed evidence về. Boundary: reviewer KHÔNG thay investigator gather-evidence; investigator KHÔNG phán PASS/FAIL. Đây chính là cặp dogfood S101 (§K.A:320).
4.7 — Fallback H5 (per-run, KHÔNG đổi mode toàn-cục)
- REAL + Fable outage (BƯỚC 0.6 báo Opus) → spawn tự chạy single-Opus-1M (
inheritresolve Opus) = per-run fallback, KHÔNG đổi marker/mode (fable-real.md:20·§K.B:323). - Revert-free: KHÔNG sửa
reviewer.mdfrontmatter — promoteinherittự theo lead; Fable về → tự lên Fable lại (H5,agents/README.md:10). - CLONE + outage: 4 lane
inherit=Opus (tier:'opus' moot); Fable về →tier:'opus'giữ ensemble ở tier-2. - Spawn fail / truncate #53 / 529 → em-main solo-fallback rà lại (
agents/README.md:64,71).
4.8 — K.D 3 floor-point RC-stamped (governance neo — RC-pqhuy1987-03-07-2026-17-46-35, ACTIVE-MARKS.md)
(1) lead = frontier-class do anh chọn per-session {Fable 5 | Opus 4.8 — 1M MAX} (model-tier-v3); CẤM Sonnet/Haiku-class ghế lead — lane này KHÔNG đụng lead · (2) top-model deep-run CHỈ trong lượt lệnh engine-đắt anh gõ kèm vai (H21) — reviewer+investigator-codebase (khi anh gán) · (3) mọi vai khác giữ default. 🧊 (văn K.D gốc: "lead LUÔN top-model · CHỈ reviewer+investigator-codebase chạm top-model chế-độ THẬT, CHỈ khi anh gõ /fable-real" — superseded model-tier-v3 + H21.) ⚠️ Nấc runtime tùy phiên (§K.D:332 viết lúc outage): Fable DOWN → point-2 vacuously-met (0 delta). Fable UP (vd S108) → point-2 = grant THẬT (real=Fable-deep ⟂ clone=Opus-ensemble tách bạch — phân-tầng sống). Stamp trung-thực theo probe từng phiên.
5. MASTER CHECKLIST + ACCEPTANCE + DOGFOOD
Tầng thi-hành ("cách bấm nút"). Luật ở engine
harness-11-engine.md §K(K.A ánh-xạ vai · K.B 2 mode 🧊 · K.C 3 GAP-guard · K.D 3 floor-point RC-stampRC-pqhuy1987-03-07-2026-17-46-35· K.E per-invocation H21). Section này KHÔNG lặp luật (B1 derived-TRỎ-canonical,harness-11-engine.md:44-49) — chỉ đưa checklist đánh-tick + biến điền-được + lệnh spawn thật. Mọi mục có evidence-form; mọi biến có TÊN·KIỂU·NGUỒN.
5.1 — PRE-FLIGHT (chạy TRƯỚC mọi lượt phán-quyết)
Biến PRE-FLIGHT (đọc 1 lần đầu phiên, tái-dùng cả phiên):
| Biến | Kiểu | Nguồn (lệnh đọc / file:line) |
|---|---|---|
🧊 MARKER_PRESENT (H19 retired) |
bool | Test-Path .claude/fable-real-mode.on (PS) / [ -f .claude/fable-real-mode.on ] (bash) — reader chuẩn = session-start.md:27-31 BƯỚC 0.5b |
🧊 MODE (H19 retired) |
enum {real, clone} |
derive: MARKER_PRESENT → real; VẮNG → clone (mặc-định). Semantic INVERSE hmw (harness-11-engine.md:325) |
LEAD_MODEL |
string | session-start.md:35-37 BƯỚC 0.6 probe → claude-fable-5[1m] HOẶC claude-opus-4-8[1m] (model-tier-v3: anh chọn per-session; outage-fallback H5) |
🧊 ANH_CONSENT_REAL (H19 retired) |
bool | anh đã gõ /fable-real trong transcript phiên (lệnh đó Write marker) — K.D point-2 (harness-11-engine.md:332) |
🧊 POSITION (H19 retired — thay bằng INVOCATION.vai) |
enum {reviewer, investigator-codebase} |
§K.A (harness-11-engine.md:320) — "CHỈ 2 vai" = ngữ-cảnh H19; H21: vai anh gán ∈ roster |
INVOCATION (H21) |
struct {lệnh, vai, đề-bài} |
parse từ lượt lệnh anh gõ (/fable-real|/fable-clone <vai> <đề-bài>) — KHÔNG file-state, 0 persist (§2.1-bis) |
ROLE_VALID (H21) |
bool | INVOCATION.vai ∈ roster? (investigator-codebase · investigator-api · implementer-backend · implementer-frontend · frontend-designer · database-agent · office-document · test-specialist · reviewer · cicd-monitor · tooling-auditor · harvest-curator · lead-view-auditor · lead-omission-auditor) — thiếu/lạ → hỏi anh 1 dòng, KHÔNG tự chọn vai. 🔴 Danh-sách này là BẢN SAO — nguồn thật = hmw.js VALID_ROLES :22-36; lệch ⇒ tin hmw.js |
SPEC_PATH (H21) |
path | spec-file 3-mục [đề-bài · cách-impl · checklist vai+deliverable+acceptance] LEAD ghi SAU verify (engine propose → lead verify+ghi, engine KHÔNG tự ghi) |
Checklist (tick từng mục · evidence bên phải):
- 🧊 P0 (H19 retired) — marker-state đọc THẬT (KHÔNG đoán từ note phiên trước) →
Test-Path .claude/fable-real-mode.on. Evidence: in raMARKER_PRESENT=<CÓ|VẮNG>+mtimemarker. - 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}+ checkROLE_VALID(vai ∈ roster) — thiếu → hỏi anh 1 dòng, KHÔNG tự chọn vai. - 🧊 (H19 retired) P1 — MODE xác-định từ P0. Evidence:
MODE=real(marker CÓ) hoặcMODE=clone(VẮNG, mặc-định). - P1-mới (H21) —
$enginexá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ạysingle-Opus-1Mtheo 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, markRC-…10-29-09; KHÔNG chạy rồi xin phép sau). Evidence: quote nguyên-văn lệnh anh lượt này. - P4 — budget-note Evidence + phân-loại cost-class:
real= 1 lane top-model deep pass (đắt nhất/lần; khi Fable về = single-Fable) — chỉ cho heavy-judgment.clone= N-lane ensemble tier-2 (multi-lens; để dành quota top-model cho lead —fable-clone.md:8).- ⚠️ Cost-delta tùy runtime: Fable DOWN → real vs clone 0 tier-delta (chỉ khác N-lane count). Fable UP → real=Fable-deep (đắt nhất/lần) ⟂ clone
tier:'opus'=tier-2 (giữ quota Fable cho lead). Ghi honest theo probe (harness-11-engine.md:332,334).
- 🧊 (H19 retired) P5 cũ — scope-lock 2 vai (
POSITION ∈ {reviewer, investigator-codebase}, vai khác EXCLUDED). - P5-mới (H21) — scope-lock =
ROLE_VALID:INVOCATION.vai ∈ rosterdo ANH gán (thiếu/lạ → hỏi anh, KHÔNG tự chọn); ⚠️ 2 monitor H1/H2 ĐÃ vào VALID_ROLES (S110) + 2 monitor H24 vào S121 W2 → hết limitation; vai-INVALID nay = STOP-HARD throw (REC-3 2026-07-13, KHÔNG fail-soft). Ngoài lượt lệnh: mọi vai giữ model roster (H8 all-inherit), lead KHÔNG tự elevate (K.D mới). Evidence: vai lượt này + quote lệnh.
5.2 — PER-RUN (mỗi lượt phán-quyết)
Biến PER-RUN:
| Biến | Kiểu | Nguồn |
|---|---|---|
LANE |
enum {invest, review, both-2trục} |
R1 chọn theo task-class |
N |
int (clone) | số lane đa-lăng-kính CÙNG-1-vai; real ⇒ N=1 |
ARTIFACT |
path/diff | đối-tượng phán-quyết (file / git diff base..head / email outward) |
RETURN |
object | SCHEMA hmw.js:47-66 {findings, checklistEvidence, memoryDelta{task,verdict,learned,surprise}} |
Checklist:
- R1 — vai = ANH GÁN trong lệnh (H21) — em-main KHÔNG tự chọn; bảng dưới = gợi-ý khi em-main ĐỀ XUẤT anh gõ (hoặc anh hỏi "nên vai nào") (🧊 H19: R1 = em-main "chọn LANE"):
- wire-BE / deploy-claim / security / test-gate → gợi-ý
reviewer(cổng adversarial,reviewer.md). - "sự-thật gốc / file:line / RCA / schema-drift" → gợi-ý
investigator-codebase(ground-truth,investigator-codebase.md). - artifact hệ-trọng (governance-doc, supersede-sweep, email outward) → đề-xuất anh gõ CẢ 2 = "2-đầu khác-trục" (ground-truth ⟂ adversarial) chống cùng-góc-cùng-điểm-mù (Harness-20 L.B,
harness-11-engine.md:344). - Evidence: quote lệnh anh (vai đã gán) + lý-do 1 dòng nếu em-main có đề-xuất.
- wire-BE / deploy-claim / security / test-gate → gợi-ý
- R2 — điền biến / spawn-args:
- CLONE (hmw.js parallel) — điền JSON
args(hmw.js:13-20);taskList= N entry CÙNGrole(GAP-1):(đổi{ "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>" } ] }reviewer→investigator-codebasecho lane ground-truth;run:{name,dir}OPTIONAL = RUN-TRACE tracked.) Evidence: JSON điền đủ ·checkpointApprovedset SAU khi BÁO {số agent·vai·task} (gate cứnghmw.js:77-79). - REAL (single deep pass) — spawn TRỰC-TIẾP qua Agent/Task tool (KHÔNG cần hmw cho 1 lane):
Agent frontmatter
subagent_type: "reviewer" # hoặc "investigator-codebase" description: "Fable-real judge: <ARTIFACT>" prompt: "<spec + acceptance + diff + RETURN-format bắt-buộc>"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.)
- CLONE (hmw.js parallel) — điền JSON
- R3 — GAP-guard tại spawn (tick cả 3):
- GAP-1: mọi lane CÙNG 1 vai (
taskListroles distinct = 1), KHÔNG mixed-roster (harness-11-engine.md:328). - Lane RETURN-only, 0 Write memory (write-guard
hmw.js:118-122; GAP-3). - Vai lane = ĐÚNG vai anh gán trong lệnh (không leak vai khác vào lane; 🧊 H19: "vai ∈ {reviewer, investigator-codebase}").
- GAP-1: mọi lane CÙNG 1 vai (
- 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 (
findingsmọi-claim-kèm-file:linehmw.js:51+memoryDelta4-fieldhmw.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 diaryagent-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; D9harness-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ÀIruns/<id>/+ code-disjoint = vi-phạm (hmw.js:114). Evidence: commit-sha + git-diff sạch.
5.4 — ACCEPTANCE CRITERIA (1 lượt fable-real "ĐẠT")
Một lượt phán-quyết ĐẠT ⟺ tất-cả AC dưới (đo-được, không cảm-tính):
| # | Tiêu-chí đo-được | Ngưỡng | FAIL nếu |
|---|---|---|---|
| AC-1 | Verdict rõ-ràng nhị-phân | reviewer: có PASS|FAIL · investigator: có Conclusion direct |
mơ-hồ / "có-vẻ ổn" không kết-luận |
| AC-2 | Evidence file:line | ≥3 cite file:line cho artifact review (≥1 / claim); mọi claim kèm evidence (hmw.js:51) |
claim trần, 0 anchor |
| AC-3 | Có refutation-attempt | reviewer: ≥1 category chạy adversarial-probe / ghi "resisted scrutiny" · investigator: ≥1 Surprise / uncertain+reason · clone: em-main refute N-lane (R6) |
rubber-stamp, 0 phản-biện |
| AC-4 | 0 claim không-nguồn | grep verdict: 0 narrative suông, 0 "trust me" thiếu file:line/lệnh | tồn-tại claim vô-nguồn |
| AC-5 | memoryDelta 4-field đầy-đủ |
{task, verdict, learned, surprise} (hmw.js:57-62) |
thiếu field |
| AC-6 | Engine-label stamped | entry chứa [engine: …] (GAP-2) |
vô-danh-engine |
| AC-7 | Cấu-trúc engine đúng mode | clone: N≥2 lane CÙNG-vai + synthesize (GAP-1) · real: single deep pass documented |
mixed-roster / N=1-mạo-danh-ensemble |
| AC-8 | Scope-clean | git-diff: 0 file đụng ngoài run-folder/spec; sub 0 Write memory (hmw.js:114) |
leak ghi agent-memory/canonical |
Gate: thiếu bất-kỳ AC → lượt đó CHƯA đạt → quay R5 recover hoặc redo. Ghi bảng AC-check vào post-run note.
5.5 — DOGFOOD-CASE ghi sẵn: "first real-mode run"
🧊 Form dưới ghi theo khung H19-marker (trước H21 S110) — snapshot lịch-sử, giữ nguyên văn (§5.5 + §2.1 = record H19).
🔴 Engine ghi rõ: thật-mode toggle CHƯA chạy thật lần nào (
harness-11-engine.md:334"thật-mode toggle chưa chạy thật lần nào"). ⇒ Lượt real đầu-tiên = dogfood chính runbook này.
Case định-sẵn:
- ARTIFACT phán-quyết: (1) chính
docs/governance/fable-real-runbook.md(self-review) + (2) email outward S108 (thông-báo H19 runbook ra sister/anh). - LANE:
both-2trục(reviewer adversarial ⟂ investigator-codebase ground-truth — Harness-20 L.B). - Scope reviewer: Category 6 Writing-quality outward cho email S108 (
reviewer.md:187-197) + runbook self-consistency vs engine §K (KHÔNG copy luật, B1) + AC 5.4 đo-được. - Scope investigator-codebase: verify MỌI file:line cite trong runbook khớp disk (chống bịa) + ground-truth marker/gitignore/hmw-args-shape.
FORM kết-quả (điền SAU khi chạy — để trống bây giờ):
| Trường | Giá-trị (điền sau) |
|---|---|
| Ngày / session | S108 · 2026-07-10 |
MODE marker-state |
real (marker CÓ — git check-ignore ✓ .gitignore:92) |
LEAD_MODEL (BƯỚC 0.6) |
claude-fable-5 (Fable UP — real = single-Fable trọn nghĩa) |
N lane (real=1 / clone=N) |
real, N=1 × 2 vai song song (both-2trục L.B) |
| Reviewer verdict (email S108) | FAIL — C1 fact-sai ("đã sửa comment" khi chưa sửa) → fixed cùng phiên (hmw.js:31-32 vá thật, email giữ câu thành ĐÚNG) |
| Reviewer verdict (runbook) | FAIL (4 MAJOR + 6 minor; core JSON-shape/biến/checklist/GAP-guard SOUND — 7 refutation, 5 đứng) → fixes applied cùng phiên |
| Investigator verdict (cite-audit) | PARTIAL — 103/111 exact · 8 lệch (7 off-by-1/2 quanh code-fence + 1 drift-note meta-2-tầng) → fixed |
| Evidence count (AC-2) | ~111 anchor cite-audit + 7 refutation-probe |
| Refutation-attempt (AC-3) | reviewer 7 chủ-động (5 đứng vững · 2 vỡ-về-phía-artifact) + invest bẫy-honesty hmw.js:31 BẮT TRÚNG |
| AC 1-8 pass? | 8 / 8 (sau fix + harvest V3/V4 engine-label) |
| Engine-label stamped (AC-6) | [engine: fable-real-single · Fable-S108 · 2-lane-parallel] |
| Recover-path #53 dùng? (R5) | none — 2/2 judge Fable return dòng-1 đúng header, 0 garble |
| Commit-sha | commit S108 chứa chính file này (chicken-egg — xem git log --oneline --since=2026-07-10) |
5.6 — ANTI-PATTERNS
| # | Anti-pattern | Vi-phạm (nguồn) | Đúng phải làm | Detect |
|---|---|---|---|---|
| AP-1 | Bật real tự-động không anh-gõ | K.D point-2 (harness-11-engine.md:332) — real CHỈ do anh gõ /fable-real <vai> <đề-bài> |
muốn real mà anh chưa gõ LƯỢT NÀY ⇒ STOP + ĐỀ XUẤT anh gõ (🧊 H19: "0 marker + muốn real ⇒ STOP") | transcript lượt đó vắng /fable-real nhưng chạy real |
| AP-2 | Mixed-roster ensemble (fan-out nhiều vai) | GAP-1 scope-creep leak (:328) — all-inherit CHE tới khi Fable về |
N lane CÙNG 1 vai (multi-lens) | taskList roles distinct-count > 1 |
| AP-3 | Lane tự ghi memory (store_memory / MEMORY.md / Bash-append) | GAP-3 / AS-10 fails-open (:330,:120) |
RETURN-only; em-main ghi 1-entry/vai | git-diff agent-memory/* đổi trong P2 · RAG chunk-count |
| 🧊 AP-4 (H19 retired) | Quên báo marker-state cuối phiên | marker persist qua session = BY-DESIGN (fable-real.md:10) nhưng thiếu báo → anh quên mode đang real (burn top-model ngoài ý) |
session-end BÁO marker-state + NHẮC anh gõ /fable-clone nếu muốn về ảo (em-main KHÔNG tự toggle — K.D point-2); KHÔNG commit marker (gitignored .gitignore:92) |
BƯỚC 0.5b @start + session-end marker-report |
| AP-4-mới (H21) | Chạy engine-đắt NGOÀI lượt-lệnh anh gõ | K.D point-2 + H21 §2.1-bis — engine-đắt CHỈ trong lượt anh gõ /fable-real|/fable-clone kèm vai; kể cả HMW-mode ON, kể cả "thấy cần" = VI-PHẠM (lead KHÔNG tự ý) |
Đợi lượt-lệnh anh; thiếu vai → hỏi anh 1 dòng, KHÔNG tự chọn vai | engine-đắt chạy mà transcript lượt đó vắng /fable-real|/fable-clone |
| AP-5 | Dùng real cho việc trivial | burn quota top-model vô-ích (§8 "ensemble không rẻ", :334) + H6.1 substantive→heavy |
real CHỈ heavy-judgment (deploy-gate/security/governance-artifact) | task-class vs MODE |
| AP-6 | Quên engine-label stamp | GAP-2 (:329) verdict vô-danh-engine, mất audit |
em-main stamp [engine:…] @P3 (V4) |
entry thiếu [engine:…] |
| AP-7 | Rubber-stamp verdict (nuốt sub-verdict không VERIFY) | phá D9 single-writer (:80) + Smart-Friend (reviewer.md:268) |
V1 độc-lập kiểm ≥1 claim + refute | post-run note 0 spot-check |
| AP-8 | Copy luật §K vào runbook | phá B1 derived-TRỎ-canonical (:44-49) — 1-sửa-N-drift |
runbook = "cách bấm nút", TRỎ §K cho luật | governance-detectors.ps1 C2 vocab/staleness |