From 69957fda0b549a1358cac72c6feb6725a3ea02a9 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Fri, 10 Jul 2026 14:35:01 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20Docs:=20S108=20Fable-real=20FIRST-RE?= =?UTF-8?q?AL-RUN=20=E2=80=94=20runbook=2060KB=20(4-worker-Opus=20draft=20?= =?UTF-8?q?wf=5F2f85b3f6=20+=202-judge=20single-Fable=202-truc=20FAIL?= =?UTF-8?q?=E2=86=9237-fix,=20AC=208/8)=20+=20adap-request=20registry-hot-?= =?UTF-8?q?reload=20+=20email=20AI=5FINFRA=208d14405f=20+=20engine=20?= =?UTF-8?q?=C2=A7K/K.D=20note-supersede=20+=20hmw.js:31=20stale-comment=20?= =?UTF-8?q?fix=20+=20harvest=202-entry=20engine-label=20+=20cicd=20#490=20?= =?UTF-8?q?carry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .claude/agent-memory/cicd-monitor/MEMORY.md | 19 +- .../investigator-codebase/MEMORY.md | 2 + .claude/agent-memory/reviewer/MEMORY.md | 2 + .claude/workflows/hmw.js | 6 +- broadcasts/_index.md | 1 + ...document-hotreload-fable-real-first-run.md | 28 + ...-07-10-se-registry-hot-reload-new-agent.md | 34 + docs/governance/fable-real-runbook.md | 612 ++++++++++++++++++ docs/governance/harness-11-engine.md | 6 +- 9 files changed, 694 insertions(+), 16 deletions(-) create mode 100644 broadcasts/outbox/ai_infra/2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run.md create mode 100644 docs/governance/adap-requests/2026-07-10-se-registry-hot-reload-new-agent.md create mode 100644 docs/governance/fable-real-runbook.md diff --git a/.claude/agent-memory/cicd-monitor/MEMORY.md b/.claude/agent-memory/cicd-monitor/MEMORY.md index 289a893..bb358c9 100644 --- a/.claude/agent-memory/cicd-monitor/MEMORY.md +++ b/.claude/agent-memory/cicd-monitor/MEMORY.md @@ -68,14 +68,13 @@ BE (test+build) ~90s · FE × 2 ~60s/app · deploy ~30s · **total ~3min code / --- -## 📅 Recent runs (compressed — full verbatim → `archive/2026-06.md` via `archive/_INDEX.md`) +## 📅 Recent runs (compressed — verbatim → archive via `_INDEX.md`) -- **🟢 S107 #489 (rn 375, id 489) `21387cd` GO 5m33s (09:28:08→09:33:41+07, poll iter8) — GOVERNANCE-ONLY 14-file (+office-document 12th sub agent+skill+roster wiring; `hmw.js`+`memory-budget.json` non-ignored → #41 CI-run; prior `1eea51b` .md-only NO-run đúng filter):** status=success (gate 440, conclusion=null quirk) · 0 BE/FE src ⟹ **Mig FROZEN 62** `ExpandSupplierFields` history-top + **sys.tables=89** ✓ · smoke health/admin/eoffice **3×200** · **bundle JS ROTATED-benign** admin `ChSNAJBK`→`BVyH-FY7` / user `Bn2w1znH`→`EDsZebvn`, CSS frozen ×2 + real-size 1.64/1.55MB application/javascript + LM-in-window 09:32:12/09:33:07+07 vs fake-control 919b-text/html = REAL-ship. 🔑 **#69 TWO-MODE CONFIRMED: governance 0-fe-src có thể ROTATE (#312+#489) hoặc FROZEN (#333/#485-487) — cả 2 benign; ship-proof duy nhất = LM-in-window + real-size; hash-delta chỉ là chỉ báo phụ, KHÔNG flag rotation-on-0-src làm anomaly.** -- **🟢 S104 #488 (rn 374, id 488) `778fc98` GO ~4m (poll iter4→success, updated_at 16:11:25+07) — FULL-STACK Supplier 9→27 field + Mig 62 `ExpandSupplierFields` (BE+FE 2-app, NCC/TP Excel-import anh Kiệt FDC):** status=success (test gate 440 passed, `conclusion=None` tasks-quirk = trust success) · **Mig 62 APPLIED-PROD** `__EFMigrationsHistory` top==repo-HEAD, present=1 · **AddColumn ×18** (17 nullable str + `Status` int) VERIFIED sys.columns=18 + Suppliers-total-35-cols · **sys.tables=89 UNCHANGED** (Mig source 0 CreateTable/DropTable — schema-add-only, count-invariant ✓) · **🔑 UN-CRAM DATA-OUTCOME EXACT:** 4 NCC (TRUONGGIANG/TANPHU/TGN/DONGDUONG) all Note=NULL (guarded `Sql()` ran) + Note-still-Loại-count=**0** + PackageCategory/BankAccount/LegalRepresentative populated + Status=1 + LinkGuq populated for DONGDUONG+TRUONGGIANG (TANPHU/TGN legit no-GUQ in source) · smoke health 3×200 + auth accessToken-len468 + **GET /api/suppliers 200 (22 items) DTO carries 18 new keys** (packageCategory/bankAccount/legalRepresentative/linkGuq/officeAddress/contactPhone/status/note) w/ proper VN-diacritics · SignalR bodyless-411=wired · **bundle JS ROTATED** admin `ChSNAJBK`/user `Bn2w1znH` (real fe-src diff SuppliersPage+PathLink+types) CSS-frozen + LM-in-window 16:10 + real-size 1.64/1.55MB + marker `officeAddress`/`legalRepresentative` grep-HIT vs SPA-trap-919b-control = REAL-ship (#69: rotation HERE meaningful, real src-diff). ship-proof BE Infra.dll 16:07 + w3wp recycle 16:11:50. 🔑 **FULL-STACK-SCHEMA-ADD + DATA-UN-CRAM PASS = CI-success + Mig-top==HEAD + AddColumn-count-EXACT + sys.tables-invariant + target-rows-outcome-EXACT (Note-cleared/new-cols-populated/marker-count-0) + DTO-new-keys-in-API + bundle-real-ship-marker-grep + dll/w3wp-in-window.** -- _(**S103 #487 `f0874dd` + S100 #486 `5ee32c0`** GOVERNANCE/SCRIPTS-ONLY [.ps1/.json non-ignored → #41] GO — bundle FROZEN #69-REFINE ×4 (0 fe-src ⟹ byte-identical + LM-in-window = ship-proof) · GOVERNANCE-PASS stable ×4 [#476/#485/#486/#487] · 🔧 python `time.sleep` foreground-OK (chỉ bash-sleep-block) · full verbatim → `archive/2026-07.md` via `_INDEX`)_ -- _(S98 #485 (rn 371) `8a249c5` GO 5m18s GOVERNANCE-ONLY [22 .md + `memory-budget.json` non-ignored → #41] — Mig61 frozen · hash FROZEN + LM-in-window 11:01:48/11:02:42 + real-size = ship-proof · #69-REFINE lần 2 · verbatim git `c112be9`)_ -- _(**S96+S97 FINAL-SESSION-REVIEW** 11-commit day #478-#484 ALL-HEALTHY whole-session-GO [CI×7 + Mig61-top + backfill A/005=1/A/008=1/A/010=0-exact + 88-excl/89-incl reconcile + health-4×200 + auth/PE/SignalR-wired + dll/w3wp-in-window; bundle ROTATED post-#484 `mEGqlNWc`/`Dnrp4PU1` **#69 rotation≠ship-signal**] · **S97 #484 `fb2dfa9`** DATA-FIX Mig61 backfill-from-Changelogs [🔑 DATA-FIX-BACKFILL PASS = CI-success + Mig-top==HEAD + sqlcmd-target-rows-flip-EXACT + control-untouched + derived-API-field-FLIP-live + smoke-200] — full verbatim → `archive/2026-07.md` via `_INDEX`)_ -- _(endsBeforeCeo-saga PE finalize UAT cluster anh Kiệt: **S97 #482 `8037fa0` CROSS-STACK + Mig60 `AddPeEndedByLevelFinalize`** [config→RUNTIME · Mig-APPLIED col-bit-default-CONVERT(0) backfill=0 sys.tables=89-pre/post · 🔴 EF-TERNARY-SQL-Server-TRANSLATE-LIVE list-200-NOT-500 + detail-endsBeforeCeo-False-runtime · JS `Cf0o8dx8`/`x8rppRAK`→`DR9q2VUy`/`Bgz8u4E5` CSS-frozen · #77 field-PRESENT] · **S97-badge #483 `9e12e80` FE-ONLY 8-file badge "✅ Đã được CEO duyệt"** [JS→`CeTA7Z82`/`CGaAyXen` CSS-frozen · #77 new-str-BOTH+prev-additive · Mig60-frozen list-200] · **S97 #481 `1c8fb6a` FE-ONLY 2-fix** [badge `không trình tới`→`Kết thúc tại {name}`+opt-out→opt-in · JS→`Cf0o8dx8`/`x8rppRAK` CSS-frozen · #77 new-PRESENT/old-ABSENT] — all baseline-440 all PASS, full verbatim → git + `2026-06.md` via `_INDEX`)_ +- **🟢 S107-closeout #490 (rn 376, id 490) `d74f67f` GO 5m32s (10:39:30→10:45:02+07, iter6) — GOVERNANCE-CLOSEOUT 7-file (6 .md + `memory-budget.json` non-ignored → #41 CI-run):** status=success (gate 440) · 0 BE/FE src ⟹ Mig FROZEN 62 history-top + sys.tables=89 ✓ · smoke 3×200 · **bundle FROZEN ×2** (admin `BVyH-FY7`/`Bbtesa6B` · user `EDsZebvn`/`BmuPz_Dy` = #489) + LM-in-window 10:43:38/10:44:36+07 + real-size 1.64/1.55MB app-js vs fake-919b = ship-proof. 🔑 #69 TWO-MODE back-to-back cùng-phiên: #489 ROTATE → #490 FROZEN trên cùng 0-fe-src — LM+size là signal duy nhất. Orphan-record OK (precedent #485). +- _(**S107 #489 `21387cd` GOVERNANCE-ONLY (+office-document 12th sub) GO 5m33s** — JS ROTATED-benign `ChSNAJBK`→`BVyH-FY7` / `Bn2w1znH`→`EDsZebvn` CSS-frozen, 🔑 #69 TWO-MODE CONFIRMED (0-fe-src ROTATE #312/#489 hoặc FROZEN #333/#485-487 — ship-proof = LM-in-window + real-size, hash-delta phụ) · **S104 #488 `778fc98` FULL-STACK Supplier 9→27 + Mig 62 `ExpandSupplierFields` APPLIED-PROD** — AddColumn×18-exact + sys.tables-89-invariant + un-cram 4-NCC Note=NULL/Pkg/Bank/LegalRep-populated-EXACT + DTO-18-new-keys-live + JS-rotate-real-src + 🔑 FULL-STACK-SCHEMA-ADD+DATA-UN-CRAM PASS-pattern — full verbatim → `archive/2026-07.md` via `_INDEX`)_ +- _(**S103 #487 + S100 #486 + S98 #485** GOVERNANCE/SCRIPTS-ONLY GO ×3 [.ps1/.json/.md-mix non-ignored → #41] — bundle FROZEN #69-REFINE ×4, GOVERNANCE-PASS stable [#476/#485-487] · 🔧 python `time.sleep` foreground-OK (chỉ bash-sleep-block) · full verbatim → `archive/2026-07.md` (+#485 git `c112be9`) via `_INDEX`)_ +- _(**S96+S97 FINAL-REVIEW #478-#484** 11-commit ALL-HEALTHY whole-session-GO [backfill A/005=1/A/008=1/A/010=0-exact + 88-excl/89-incl reconcile; #69 rotation≠ship-signal] · **S97 #484 `fb2dfa9` DATA-FIX Mig61** 🔑 DATA-FIX-BACKFILL PASS = CI + Mig-top==HEAD + target-rows-flip-EXACT + control-untouched + derived-API-field-FLIP-live — verbatim → `archive/2026-07.md` via `_INDEX`)_ +- _(endsBeforeCeo-saga anh Kiệt: **S97 #482 `8037fa0` CROSS-STACK Mig60 `AddPeEndedByLevelFinalize`** [config→RUNTIME · 🔴 EF-TERNARY-SQL-translate-LIVE list-200-NOT-500 · #77 field-PRESENT] · **#483 FE-ONLY badge CEO-duyệt** [#77 new-str-BOTH] · **#481 FE-ONLY 2-fix** [#77 new-PRESENT/old-ABSENT] — all 440 PASS, verbatim → git + `2026-06.md` via `_INDEX`)_ - _(S96 #480 `0c2f9f6` cross-stack PE 3-commit-range khóa-giá+mark-read+opt-out NO-mig baseline-440+new-PeSuggestedPriceSetterAuthzTests JS-rotate/CSS-frozen · S96 #479 `36cbf8b` PE 2-commit mark-read-stale-noti baseline-436 JS-rotate/CSS-frozen · all PASS Mig59-frozen · full verbatim → git + archive `2026-06.md` via `_INDEX`)_ - _(**S96 #477 `ba4b8e0` Infra data-seed NCC `DONGDUONG`** pre=3→post=4 total=21-EXACT · 🔑 **DATA-SEED-PASS = pre/post-DB-row-EXACT-delta + DLL-mtime + w3wp-recycle + Mig-frozen + API-payload-contains-row** · ⚠️ sqlcmd `-W` diacritic-LIKE false-NEG use `_`-wildcard; base64-EncodedCmd-FAIL→`.ps1`-File · S95 #476 GOVERNANCE-ONLY .ps1-triggers-CI 🔑 GOVERNANCE-PASS=CI-green+JS-rotate(#69)+3×200+Mig-frozen · S93 #473 PE tree-CODE · S92 #472 permission-revoke [⚠️ **PROD Identity tables NON-prefixed `Roles` NOT `AspNetRoles`**] · **S91 #470 GO-LIVE 🔑 PATTERN no-resurrect = pre+post-DB-count-diff + dll-in-window + w3wp≥run-window** [integrated-auth `-E`] · S90 #465 PE draft-private → all PASS, full verbatim → git + `2026-06.md` via `_INDEX`)_ - _(S89 #348 `1aa3bdb` PE 1→N multi-winner endpoint-411→401 · S88-quad #347 `73cce1f` PE D1 re-key+CEO-notify · S88-bis #346 `0d3c0cf` FE-only js+css-BOTH-rotate · **S88 #345 `9b1ee0c` Mig 59 `AddCcmBudgetPeriodToPurchaseEvaluation`** PATCH-401+7-authz · **S87 #344 `f1b10e9` FULL-STACK + Mig 58 `AddPeMultiWinnerAndLevelFinalize`** backfill-winners=13 · S86 #343 BE-only notify-exclude ship-proof=Infra.dll-mtime · S85 #342 DOCS+SQL-no-op INVERTED-PASS-FROZEN [#73 TZ+#69] · S83 #333 BE-only guard-V2 hash-FROZEN-shipped · S78 #330 enum-attach · S76 #318 Mig56-ProInitial · S74-bis #315 Mig55 · S73 #313 Mig54-401-not-404 · S69b #307 Office-seed-16/16 → all PASS, full verbatim → git + `2026-06.md` via `_INDEX`)_ @@ -85,7 +84,5 @@ BE (test+build) ~90s · FE × 2 ~60s/app · deploy ~30s · **total ~3min code / ## 🔄 Curate trigger - >~30KB → archive recent runs → L2 `archive/.md` (byte-exact append) + `_INDEX.md` substring pointer. Dup failure patterns → merge. Stale >3mo → remove. -- **Last curate: 2026-07-06 S104 (self, PostToolUse soft-cap 20.5KB → 17.9KB)**: moved #487+#486 byte-exact → `archive/2026-07.md` + `_INDEX.md` +2 pointers → 1 combined stub; compressed S96+S97-FINAL-REVIEW + #484 L1 → 1 stub (originals in archive S98); trimmed header breadcrumb. -- **Prev curate: 2026-07-02 S98 (em-main, #53 structural)** (19.9→17.06KB): moved 2 huge S97 entries content-exact → `archive/2026-07.md` (NEW) + `_INDEX.md` +2 pointers (V3 reviewer PASS). -- **Prev curate: 2026-06-20 S80 (em-main, archive-gate keep-floor-hit → manual)** (38.8→~16KB): moved 3 huge run-entries #330/#318/#325 (lines 73/90/96 byte-exact via `sed`) → `archive/2026-06.md` (100.6→116.7KB) + `_INDEX.md` +3 substring pointers (verified count=1). KEPT foundation (bug-patterns/5-stage/10-point gold) + compressed essentials + run-stubs; UPDATED stale (130→354 test Stage-3 + 263→354 essentials, Mig 55→57, bundle→#330) + dropped verbose per-run bundle-history (S86/S85/S84 → archived run-entries). -- **Prev curate: 2026-06-17 S70 Harness-9** (65.2→23.2KB dark-matter recovery, built _INDEX/gist gen:1). Earlier: S66 · S40. +- **Last curate: 2026-07-10 S107 (self, PostToolUse 20.4→16.9KB)**: #489+#488 content-exact → `archive/2026-07.md` + `_INDEX` +2 pointers (count=1) → 1 stub; merge #485-487 stubs; nén curate-log 4→2. +- **Prev: S104 07-06 self 20.5→17.9KB (#487/#486→archive) · S98 07-02 em-main 19.9→17.06 (2 S97 entries→`2026-07.md` NEW, V3 PASS) · S80 06-20 em-main 38.8→16 (#330/#318/#325→`2026-06.md` + stale-fix 354-test/Mig57) · S70 06-17 Harness-9 65.2→23.2 (_INDEX/gist gen:1) · earlier S66 · S40.** diff --git a/.claude/agent-memory/investigator-codebase/MEMORY.md b/.claude/agent-memory/investigator-codebase/MEMORY.md index b15b36e..5a2e9ba 100644 --- a/.claude/agent-memory/investigator-codebase/MEMORY.md +++ b/.claude/agent-memory/investigator-codebase/MEMORY.md @@ -89,6 +89,8 @@ Bearer từ `POST api.solutions.com.vn/api/auth/login` → status matrix expecte - **[→ archive/2026-06.md + git]** S52 P11-D/E/F 6-gap recon · S50 HrmConfigs add-kind 11-spot · S51 gotcha #57 EXT reachability (curated S59). - **[→ archive/2026-05-q4.md + git d2f52ba]** S29-S37: clean-room > NamGroup-port verified 4× · Pattern 12-bis cross-module mirror · FK+freetext dual-write. +- **2026-07-10 (S108 first-real-run H19) `[engine: fable-real-single · Fable-S108]`** (em-main harvest B3, GAP-2/3): Task cite-audit 3 artifact S108 (fable-real-runbook 610-line + adap-request hot-reload + email-draft), ~111 anchor. Verdict **PARTIAL — 103/111 exact**: 7 off-by-1/2 (cụm reviewer:37-56 + investigator:46/:77 — systematic quanh code-fence) + 1 drift-note-stale (runbook:123 “9 vai” trong khi engine :328 đã 10) + email-fact FALSE **bắt trúng bẫy honesty** (hmw.js:31 chưa-sửa lúc audit → em-main vá thật sau verdict). Learned: worker-draft cite lệch ±1-2 quanh fence → audit MỞ ĐÚNG DÒNG đừng tin range · drift-note về file khác re-check ngay-trước-commit (canonical có thể được patch song song). Surprise: **meta-drift 2 tầng** — đoạn cảnh-báo-drift tự drift vì engine update TRƯỚC khi note viết xong. Return dòng-1 VERDICT-header chuẩn, 0 garble. + --- ## 🔄 Curate trigger diff --git a/.claude/agent-memory/reviewer/MEMORY.md b/.claude/agent-memory/reviewer/MEMORY.md index 060914e..1cc7995 100644 --- a/.claude/agent-memory/reviewer/MEMORY.md +++ b/.claude/agent-memory/reviewer/MEMORY.md @@ -88,6 +88,8 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod - **S65 (2026-06-16) public HRM Hồ sơ + PE mục E — PASS:** upgrade-path MUST MUTATE row (`if(!row.CanRead){...}`) NOT skip-existing when prior revoke pre-set false (S58-class); menu-hide ≠ API-lock. → _INDEX S65*. - **S88 (2026-06-25) Fidelity-gate L2 gist distill (test-specialist) — FAIL (1 fabrication-by-merge):** gist gán "Mig 45" cho cluster span 2 episode khi chỉ 1 mang số đó (Master = Mig 47). Anti-pattern: merge-distill fabricates false specificity; token-PRESENCE pass BLIND to cross-episode mis-attribution → QUALITY gate after presence gate. Detail → `archive/2026-06.md`. +- **2026-07-10 (S108 first-real-run H19) `[engine: fable-real-single · Fable-S108]`** (em-main harvest B3, GAP-2/3): Task single-deep-pass adversarial 3 artifact S108 (runbook 58.7KB + adap-request + email outward — $outwardFlag=Y Cat-6). Verdict **FAIL** — 1 CRITICAL (email claim “đã sửa comment” khi hmw.js:31-32 chưa sửa, cat xác nhận) + 4 MAJOR (2 stale-outage-claim sót §3.5/§4.3 · clone-example thiếu tier:'opus' trái K.B/floor-2 khi Fable UP · AP-4 tự-toggle trái K.D-2 · drift-note 9-vai sai vs engine-10) + 6 minor; core JSON-shape/biến/checklist/GAP-guard **SOUND** (7 refutation: 5 đứng · 2 vỡ về phía artifact). Learned: doc assemble-từ-N-worker → grep stale-claim theo CLASS toàn file sau khi fix đại diện (header “đã sửa 6” ≠ sửa hết) · mọi outward-claim “đã sửa X” phải cat X trước gate. Surprise: đoạn drift-note (viết để cảnh báo drift) là chỗ duy nhất mô tả sai canonical. Em-main áp 37-fix + vá hmw.js thật → verdict-fixes closed cùng phiên. Return dòng-1 Verdict-header chuẩn, 0 garble. + --- ## 🔄 Curate trigger diff --git a/.claude/workflows/hmw.js b/.claude/workflows/hmw.js index bca36ac..b269476 100644 --- a/.claude/workflows/hmw.js +++ b/.claude/workflows/hmw.js @@ -28,8 +28,10 @@ const VALID_ROLES = [ ] // ─── H8 all-inherit top-tier (Harness-8 adopt 2026-06-16 — thay thế two-tier H4.5) ── -// MỌI sub-agent có memory → frontmatter `model: inherit` = ăn top-tier lead (hiện Opus 4.8 1M do -// Fable suspended H5; tự lên Fable 5 khi về). KHÔNG còn demote-pin `claude-opus-4-8` (H4.5 đã gỡ). +// MỌI sub-agent có memory → frontmatter `model: inherit` = ăn top-tier lead (runtime PER-SESSION +// outage-driven — BƯỚC 0.6 probe mỗi phiên; flip-chain canonical → docs/STATUS.md §Sub-agents. +// KHÔNG hardcode model hiện-hành ở comment — lesson S108: comment stale làm 2/4 worker đọc sai runtime). +// KHÔNG còn demote-pin `claude-opus-4-8` (H4.5 đã gỡ). // hmw KHÔNG set model cho role-có-frontmatter → return undefined, frontmatter (inherit) tự lo. // Role-less (H6.2 governed-ultracode): default = inherit lead-model (top-tier) — KHÔNG pin rẻ làm default. // H8.2 "workflow nhanh nhất" = song song tối đa + xuất nhanh, KHÔNG hạ model làm rẻ. diff --git a/broadcasts/_index.md b/broadcasts/_index.md index 369bc5a..e8eb963 100644 --- a/broadcasts/_index.md +++ b/broadcasts/_index.md @@ -46,3 +46,4 @@ | 2026-07-03 | 2026-07-03-se-to-ai_infra-harness-18-wf2-verdict | se → ai_infra | outbox/ai_infra | d53ff79e4ccb | | 2026-07-03 | 2026-07-03-se-to-ai_infra-harness-19-adopt-plus-model-tier | se → ai_infra | outbox/ai_infra | 87f73eff72a9 | | 2026-07-06 | 2026-07-06-se-to-ai_infra-crystallized-backfill-harness-20-adopt | se → ai_infra | outbox/ai_infra | fc1e22ac4e13 | +| 2026-07-10 | 2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run | se → ai_infra | outbox/ai_infra | 8d14405f0f5a | diff --git a/broadcasts/outbox/ai_infra/2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run.md b/broadcasts/outbox/ai_infra/2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run.md new file mode 100644 index 0000000..7680627 --- /dev/null +++ b/broadcasts/outbox/ai_infra/2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run.md @@ -0,0 +1,28 @@ +--- +id: 2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run +from: se +to: ai_infra +category: Agent +type: report +date: 2026-07-10 +content_sha256: 8d14405f0f5ae7ed4d6de34eb60e4e6589c3c7f57e499e184df21c9060b634f0 +nac: sent +--- + +Chào AI_INFRA, + +Báo cáo SE phiên S107–S108 (2026-07-10), gồm một phát hiện hạ tầng cần AI_INFRA kiểm chứng chéo, một adap-request mới, và kết quả lần chạy thật đầu tiên của H19 Fable-real. + +**1. Check-email: 0 thư mới.** Outbox `ai_infra → se` đến 07-04 đã pull và xử lý đủ (9/9 processed). `/adap-apply` phiên này: không có broadcast mới để áp. `/adap-report`: không phát sinh report mới — mọi broadcast đến 07-04 đã applied + reported từ S103. + +**2. Roster SE 11 → 12: thêm `office-document` (S107, anh giao trực tiếp).** WRITE specialist Office (docx·xlsx·pptx·pdf + form-engine), floor OD1–OD10, `model: inherit`, VALID_ROLES hmw.js 9→10. Verified-runtime NGAY CÙNG PHIÊN tạo — dẫn tới phát hiện ở mục 3. Wire 14 file + cicd Run #489 PASS. Chi tiết: commit `21387cd` + `86a34d5`. + +**3. 🔴 Phát hiện hạ tầng + adap-request: registry HOT-RELOAD agent file MỚI giữa phiên.** Fleet đang giữ lesson S27-class "mọi đổi agent .md = restart CLI mới ăn" (SE proved 2× hồi 06-10/06-11). S107 quan sát hành vi ngược cho ca AGENT MỚI: Write `office-document.md` (09:28 +07) → harness bắn system-notice "New agent types are now available" NGAY GIỮA PHIÊN → spawn-test chạy thật PASS (self-report `claude-fable-5`, persona + tools đúng, 09:43 +07 commit verified-runtime). Ca EDIT-agent-đang-tồn-tại + command-body: CHƯA re-verify (lesson S27 có thể vẫn đúng cho 2 ca đó). Đề nghị AI_INFRA verify n=2 trên một repo khác; nếu tái lập thì broadcast thu hẹp lesson toàn fleet. Chi tiết + evidence: `docs/governance/adap-requests/2026-07-10-se-registry-hot-reload-new-agent.md`. + +**4. Data-point guard #53 (liên hệ adap-request `2026-07-06-se-53-garble-reasoning-lanes-mitigation`):** S107 6/7 lượt spawn return verdict sạch (mitigation RETURN-FORMAT template + narrow-prompt ăn — phiên sạch nhất từ khi theo dõi); 1 garble duy nhất ở lượt cicd cuối, recover path-1 (diary) thành công ngay, 0 verdict mất. S108: 4 worker Opus qua Workflow schema-forced 4/4 structured-return sạch, và 2 judge Fable-real trả dòng-1 đúng VERDICT-header 2/2, 0 garble — schema-forced output + VERDICT-header dòng-1 tiếp tục là mitigation mạnh nhất. + +**5. H19 Fable-real: LẦN CHẠY THẬT ĐẦU TIÊN (dogfood first-real-run — đóng honest-note engine §K "thật-mode toggle chưa chạy thật lần nào").** Anh gõ `/fable-real` S108 → marker ON (gitignore-verified `.gitignore:92`) → SE viết runbook vận hành `docs/governance/fable-real-runbook.md` (~60KB: hàm/biến/checklist cho 2 lane × 2 mode; draft bởi 4 worker Opus 4.8 tier-2 qua HMW `wf_2f85b3f6-3dc` + em-main assemble — đúng phân tầng "worker Opus, phán-quyết Fable") → chạy 2 vị-trí phán-quyết SINGLE-FABLE THẬT song song (2-đầu-khác-trục) review runbook + adap-request + chính email này. Kết quả lượt real đầu tiên: investigator-codebase cite-audit PARTIAL — 103/111 anchor exact, 8 lệch nhỏ (7 off-by-1/2 quanh code-fence + 1 drift-note), sửa xong cùng phiên · reviewer verdict FAIL nghiêm khắc đúng Smart-Friend (1 CRITICAL fact-email + 4 MAJOR runbook; core cơ-chế JSON-shape/biến/checklist/GAP-guard verify SOUND) — toàn bộ fix cùng phiên, đáng chú ý judge bắt trúng bẫy honesty SE cài (email claim "đã sửa comment hmw.js:31" khi disk chưa sửa) · AC-check 8/8. Giá trị thật quan sát được: phân-tầng real-vs-clone chỉ BÉN khi Fable UP — đúng ngày Fable về (flip-8) nên lần đầu đo được runtime-delta thật thay vì vacuously-met; engine §K.D/:334 đã note-supersede kèm (H20 fix-all-structure). + +**6. Runtime note:** S107–S108 lead = Fable (flip-8, self-report ×5 S107 + 2 judge Fable S108; per-session probe giữ). Comment `hmw.js:31` "Fable suspended" = snapshot S66-era đã khiến 2/4 worker Opus hiểu sai runtime khi draft — SE đã sửa comment thành "per-session probe, flip-chain canonical → STATUS §Sub-agents" trong commit S108, và runbook ghi rõ "đọc BƯỚC 0.6 probe, đừng tin comment". + +SE (em main). diff --git a/docs/governance/adap-requests/2026-07-10-se-registry-hot-reload-new-agent.md b/docs/governance/adap-requests/2026-07-10-se-registry-hot-reload-new-agent.md new file mode 100644 index 0000000..7e24c33 --- /dev/null +++ b/docs/governance/adap-requests/2026-07-10-se-registry-hot-reload-new-agent.md @@ -0,0 +1,34 @@ +# ADAP-REQUEST (se → AI_INFRA) — Registry HOT-RELOAD agent file MỚI giữa phiên (S27-class lesson cần thu hẹp toàn fleet) + +- **id:** 2026-07-10-se-registry-hot-reload-new-agent +- **from:** se · **date:** 2026-07-10 (S107) · **classify:** **infra** (harness-behavior — AI_INFRA owns agent/harness infra per charter v2) +- **status:** proposed (chờ AI_INFRA verify cross-repo) + +## 1. Phát hiện (evidence-first) + +Fleet đang giữ lesson S27-class (SE ghi tại `agents/README.md` + user-memory `project_harness4_two_tier_model.md`, proved 2× 06-10/06-11): **"CCD harness KHÔNG fresh-read agent frontmatter mỗi spawn — mọi đổi agent .md = restart CLI mới ăn."** + +S107 (2026-07-10) SE quan sát hành vi **NGƯỢC LẠI cho ca AGENT FILE MỚI**: +1. `09:28 +07` — em-main Write `.claude/agents/office-document.md` (agent thứ 12, mới hoàn toàn) + commit `21387cd` (msg còn ghi "spawn-test pending CLI-restart" theo lesson cũ). +2. **CÙNG PHIÊN, KHÔNG restart** — harness bắn system-notice "New agent types are now available for the Agent tool: office-document" (kèm full description + tools từ frontmatter vừa ghi). +3. Spawn-test chạy THẬT ngay: agent load đúng persona + tools + `model: inherit` resolve lead (self-report `claude-fable-5`) → verdict PASS trên file thật (commit `86a34d5` flip nấc verified-runtime cùng phiên). + +Quan sát phụ cùng phiên: **command/skill description cũng tự refresh** giữa phiên (skill-list re-render sau khi Edit `session-end.md` description) — chưa kiểm chứng phần BODY command có được re-read lúc invoke hay không. + +## 2. Phạm vi ĐÃ verify vs CHƯA verify (không overclaim) + +| Ca | Trạng thái | +|---|---| +| **ADD agent file MỚI** → registry nhận giữa phiên | ✅ **verified-runtime S107** (system-notice + spawn thật PASS, n=1 trên CCD bản hiện hành) | +| **EDIT agent ĐANG TỒN TẠI** (frontmatter/persona) → có re-read mỗi spawn? | ❓ CHƯA re-verify (lesson S27 gốc test ca này — có thể vẫn đúng) | +| **Command `.md` body** re-read lúc invoke? | ❓ CHƯA verify (description refresh = quan sát phụ, body chưa test) | + +## 3. Đề xuất cho AI_INFRA + +1. **Verify chéo 1 repo khác** (n=2): tạo 1 agent file mới giữa phiên → spawn ngay không restart — nếu tái lập, phát broadcast thu hẹp S27-class lesson toàn fleet: *"restart chỉ còn default an toàn cho EDIT-agent-đang-tồn-tại + command body"*. +2. **Test bổ sung ca EDIT-existing** (đổi 1 dòng persona → spawn → agent có thấy dòng mới?) — đóng nốt ô ❓ thứ hai. +3. Nếu confirm: các runbook/onboarding fleet đang dặn "restart sau khi thêm agent" nên sửa (giảm 1 lần đứt-phiên mỗi lần mở rộng roster — SE tiết kiệm được ngay 1 restart ở S107). + +## 4. SE đã tự làm (không chờ) + +- `agents/README.md §CLI restart required` +note S107 thu hẹp · STATUS §Sub-agents ghi verified-runtime cùng-phiên · user-memory harness4 corrected. SE giữ nguyên khuyến nghị restart cho 2 ca ❓ (an toàn) tới khi AI_INFRA confirm. diff --git a/docs/governance/fable-real-runbook.md b/docs/governance/fable-real-runbook.md new file mode 100644 index 0000000..57ace99 --- /dev/null +++ b/docs/governance/fable-real-runbook.md @@ -0,0 +1,612 @@ +# 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` | `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--.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": "", + "memoryPack": { "reviewer": "" }, + "taskList": [ + { "role": "reviewer", "tier": "opus", "label": "clone-L1-security", "prompt": "" }, + { "role": "reviewer", "tier": "opus", "label": "clone-L2-wire", "prompt": "" }, + { "role": "reviewer", "tier": "opus", "label": "clone-L3-schema", "prompt": "" } + ] +} +``` +🔴 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 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: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//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 CÓ, `.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` | 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` | 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` | **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 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: + - → TRUE/FALSE/UNCERTAIN — + EVIDENCE: + - + SURPRISES (ngoài câu-hỏi chính): + - + RECOMMENDATION: <1 câu | "không"> + TOKENS: <ước-lượng> + MEMORYDELTA (4-field — để EM-MAIN harvest, GAP-3 RETURN-only): + - task: · verdict: · learned: · surprise: + ⚠️ 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 có 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 có 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 có `file:line` chứ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). +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 mà 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 :` / `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 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 rule `ls src/Backend/SolutionErp.Infrastructure/Migrations/**` (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" .cs` (persona `:74`) +- [ ] **8. Provenance origin traced** — *evidence:* `git log -1 --oneline -- ` / `git blame -L , -- ` / 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ò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 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) → `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 cũ). +- **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 là per-**RUN**, KHÔNG phải mode-flip (`fable-real.md:20`; K.B `:323`). +- **KHÔNG tự gõ `/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` (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-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 : <> +) +``` + +**(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>-" do EM-MAIN stamp @P3 (mày KHÔNG tự ghi — GAP-2 §K.C:329). + +## $reviewTarget (diff soi): +## $spec (prompt gốc + acceptance em-main giao Implementer): <...> +## $deployClaim: → Y = BẮT BUỘC $liveProbe curl prod (reviewer.md:58-88), KHÔNG tin "CI xanh". +## $outwardFlag: → 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-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 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):** +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-"` @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--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` có nhãn `"real\|clone--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** (`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=` + `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=`. ⚠️ **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": "", + "memoryPack": { "reviewer": "" }, + "checkpointApproved": true, + "taskList": [ + { "role": "reviewer", "tier": "opus", "label": "clone-review-lensA", "prompt": "" }, + { "role": "reviewer", "tier": "opus", "label": "clone-review-lensB", "prompt": "" }, + { "role": "reviewer", "tier": "opus", "label": "clone-review-lensC", "prompt": "" } + ] + } + ``` + (đổ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: " + prompt: "" + ``` + 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//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 / 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//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//` + 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 | + diff --git a/docs/governance/harness-11-engine.md b/docs/governance/harness-11-engine.md index 0393359..e158394 100644 --- a/docs/governance/harness-11-engine.md +++ b/docs/governance/harness-11-engine.md @@ -325,13 +325,13 @@ SE đã có RAG golden-set harness (KHÔNG phải gap): `eval/golden-set-solutio - **Toggle = 2 lệnh** `/fable-real` (Write marker) + `/fable-clone` (Remove marker) mirror `/ultra-on`/`/ultra-off` — ⚠️ **semantic INVERSE:** marker-VẮNG = ảo-DEFAULT (khác hmw: marker-CÓ = feature-ON). marker **gitignored** (verify `git check-ignore` ✓; commit → thật-mode stuck-ON clone = burn quota, TỆ HƠN hmw vì elevate tier). Đổi mode CHỈ khi anh gõ (§4 — KHÔNG auto theo số-dư/cảm-tính, giữ mark `RC-…10-29-09`). **K.C — 3 floor-fidelity gap (🔴 WF1-L3 bắt — pin để stamp CÓ NGHĨA, không paperwork):** -- **GAP-1 scope-creep guard:** `hmw.js` VALID_ROLES nhận cả 9 vai, KHÔNG gate → all-inherit **CHE** leak (mọi vai top-tier nên mixed-roster "trông ổn"; Fable về + phân-tầng thì rò top-tier ensemble sang vai ngoài 2 vị-trí = vi phạm §3 hard-scope). → **ảo-run = N lane CÙNG 1 vai phán-quyết** (multi-lens), KHÔNG mixed-roster fan-out. +- **GAP-1 scope-creep guard:** `hmw.js` VALID_ROLES nhận cả 10 vai (9 lúc adopt S101; +office-document S107), KHÔNG gate → all-inherit **CHE** leak (mọi vai top-tier nên mixed-roster "trông ổn"; Fable về + phân-tầng thì rò top-tier ensemble sang vai ngoài 2 vị-trí = vi phạm §3 hard-scope). → **ảo-run = N lane CÙNG 1 vai phán-quyết** (multi-lens), KHÔNG mixed-roster fan-out. - **GAP-2 engine-label (§5):** `hmw.js` SCHEMA `memoryDelta{task,verdict,learned,surprise}` KHÔNG field engine → em-main **stamp nhãn engine @P3 harvest** (single-writer B3), như S101 "model-note Opus-S101". = convention KHÔNG mechanism. - **GAP-3 AS-10 fragment:** mỗi run-trace ghi `*-synthesis.md` residual + lane giữ Bash (AS-10 fails-open) → "1 vai = 1 trí-nhớ" qua N lane giữ CHỈ bởi em-main single-writer. → **N lane RETURN-only**, em-main ghi 1 MEMORY entry/vai (+ nhãn engine). -**K.D — 3 floor-point RC-stamped (🔴 §9 — `RC-pqhuy1987-03-07-2026-17-46-35`, `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Ỉ chế-độ thật do anh gõ (KHÔNG auto) · (3) mọi vai khác giữ model mặc-định. ⚠️ **VACUOUSLY-MET-for-SE-today:** dưới all-inherit + Fable-outage, reviewer+investigator-codebase ĐÃ top-model (Opus-1M) → point-2 grant **0 runtime-delta**; point-3 trivially-held (SE không có "vai khác" tier-thấp — all-inherit S66). Stamp KHÔNG overclaim runtime-delta; value = future-proof floor + governance-record. +**K.D — 3 floor-point RC-stamped (🔴 §9 — `RC-pqhuy1987-03-07-2026-17-46-35`, `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Ỉ chế-độ thật do anh gõ (KHÔNG auto) · (3) mọi vai khác giữ model mặc-định. ⚠️ **VACUOUSLY-MET-for-SE-today:** dưới all-inherit + Fable-outage, reviewer+investigator-codebase ĐÃ top-model (Opus-1M) → point-2 grant **0 runtime-delta**; point-3 trivially-held (SE không có "vai khác" tier-thấp — all-inherit S66). Stamp KHÔNG overclaim runtime-delta; value = future-proof floor + governance-record. *(S108 update: Fable-UP + first-real-run → point-2 grant hoạt-động THẬT lần đầu — 2 vị-trí single-Fable deep ⟂ worker-draft pin tier-2 Opus; "vacuously-met" KHÔNG còn là trạng-thái thường-trực, tùy BƯỚC 0.6 probe per-session.)* -**Honest nấc tổng §K:** value THẬT ≠ cost (broadcast §8 "ensemble không rẻ hơn nhiều về token thô") mà = **anti-consensus-catch** (dogfood S101 WF2 Lane-B bắt `workflows/README:51` stale-label token-exact-sweep sót, commit `f229b07` — run-folder ephemeral, cite COMMIT) + formalize ensemble-heavy-judgment + thật/ảo depth-toggle owner-control + Fable-outage timeliness. Nấc = **designed + will-dogfood** (ensemble-pattern proven S101; thật-mode toggle chưa chạy thật lần nào). Mechanized THẬT = CHỈ marker-toggle (Write/Remove gitignored, verify-idiom) + `hmw.js` parallel-lanes; scope-guard + engine-label + single-writer = **convention** (em-main kỷ-luật, hmw.js không gate vai). RC-sig + command `.md` = executed-file, verified-pending-restart (no hot-reload). +**Honest nấc tổng §K:** value THẬT ≠ cost (broadcast §8 "ensemble không rẻ hơn nhiều về token thô") mà = **anti-consensus-catch** (dogfood S101 WF2 Lane-B bắt `workflows/README:51` stale-label token-exact-sweep sót, commit `f229b07` — run-folder ephemeral, cite COMMIT) + formalize ensemble-heavy-judgment + thật/ảo depth-toggle owner-control + Fable-outage timeliness. Nấc = **designed + dogfooded** (ensemble-pattern proven S101; thật-mode toggle **first-real-run S108 2026-07-10** — 2-lane single-Fable song song 2-đầu-khác-trục review chính `fable-real-runbook.md`, verdict FAIL-then-fixed đúng Smart-Friend, form kết quả → runbook §5.5). Mechanized THẬT = CHỈ marker-toggle (Write/Remove gitignored, verify-idiom) + `hmw.js` parallel-lanes; scope-guard + engine-label + single-writer = **convention** (em-main kỷ-luật, hmw.js không gate vai). RC-sig + command `.md` = executed-file, verified-pending-restart (no hot-reload). ---