[CLAUDE] Docs: S119 adap 6 broadcast AI_INFRA - dieu tra chieu rong + spec v3 (dung truoc wave)

check-email 6 broadcast moi (H23 model-at-spawn / H24 lead-self-audit / H22 wal-defect-fix
5-san / H22 push-guard / EOL-CRLF agent-registry / owner-sign) - hash 7/7 + tamper 4/4 MATCH.

Pipeline H21: fable-clone invest 5-lane (wf_1f6bd5e2-478, 5/5 clean) -> spec v1 ->
fable-clone reviewer 4-lane (wf_78a84f9b-03e: R2 FAIL 4C+8M, R3 FAIL 5C+6M, R1/R4 chet #53)
-> v2 -> fable-real reviewer cong-cuoi (wf_cb964f83-331: GO-WITH-FIXES + 8 fix + 2 honesty-C)
-> v3 (STILL-BROKEN = 0). Anh chot B: dung tai spec, wave chay phien sau qua /tiep.

Do that: 57 wal: da lot origin/main (hub do duoc 1 -> SE = 57x); nguyen nhan KHONG phai
turn-seam ma la session-end.md:113 SE tu viet "kep sau -> GIU NGUYEN". K troi 3->10/buoi.
v1 SE GAY MAT VIEC (R3 fault-inject: NONWAL=0 -> 0 commit de fixup -> detached HEAD ->
hook fail-open -> abort -> mat worktree = E-029 bang cua sau).

Owner 6 chot: nguyen-tac moi (vuot-khung = request anh + AI_INFRA) / PA-2 = PA-2a hang-so +
PA-2b audit / 6-15-3 / [carry:slug] / KHONG don 57 / fix#8 (a)(b).

0 prod-code, 0 migration, 0 FE. Test 509 giu nguyen (45D + 464I).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-15 11:20:29 +07:00
parent 3fde8afb93
commit 4727d16178
28 changed files with 2999 additions and 7 deletions

View File

@ -1,9 +1,23 @@
# WAL — auto-generated, không sửa tay
updated: | session: | branch:
goal: (trống — không có mạch dở; S117 PE lũy-kế-display-fix + duyệt-theo-khoảng Min-Max SHIP `316a82f` + CI Run #387 PASS + closeout `fc1b8d9`/`d08f2a3`/`1b8b065` done)
updated: 2026-07-15T11:05 | session: S119 | branch: main
goal: Adopt 6 broadcast AI_INFRA (H23 · H24 · H22-wal-defect 5-sàn · H22-push-guard · EOL/CRLF · owner-sign). Anh chốt DỪNG TẠI SPEC v3 — wave chạy phiên sau. Pipeline đã xong: check-email→invest→spec→review→fable-real-gate→v3.
chain:
(rỗng)
[x] check-email AI_INFRA — 7 copy verbatim hash 7/7 + tamper 4/4 MATCH; 6 broadcast mới (outbox/all)
[x] Đo phơi-nhiễm: 57 wal: lọt remote (0/57 ở đuôi = TẤT CẢ bị-kẹp; §5.0 cố-ý chỉ-đuôi) · autocrlf=true@system · 188 EOL · agent 0-CR + 12/12 block-scalar · BƯỚC 0.7 "trống⇒sạch" = Sàn-3 lỗi sống
[x] wf: invest 5-lane wf_1f6bd5e2-478 (5/5 clean) → 5 sub-investigator-codebase-{A..E}.md
[x] Lead soi hub trực-tiếp → lead-evidence-hub-inspect.md (hub PIN 17/17 opus-4-8 vs SE inherit; hub giữ 1 wal: lọt, KHÔNG dọn; E-029/E-030)
[x] Spec v1 → wf: review 4-lane wf_78a84f9b-03e → R2 FAIL(4C+8M) + R3 FAIL(5C+6M); R1/R4 chết-#53 (transcript có, verdict rơi)
[x] Spec v2 (vá 16/23) → wf: fable-real gate wf_cb964f83-331 → GO-WITH-FIXES + 8 fix + 2 honesty-C
[x] Spec v3-PATCH — đóng 3 STILL-BROKEN + 3 PARTIAL + 1 REGRESSED + bảng disposition 23 dòng
[ ] anh ký fix#8: (a) PA-2 hình-thức PA-2a+PA-2b [neo-tại-spawn bất-khả: param chỉ nhận alias — CHƯA thử full-id] · (b) hook-interlock TRONG-khung vs floor N.2
[ ] wave W0→W6 chạy THẬT (đọc v2 + v3-PATCH; v1 CẤM CHẠY) — W0 SOLO, cần RESTART ×2 → trải ≥3 phiên CLI
[ ] push (🔴 squash→count→push CHAINED 1 LƯỢT; K tính runtime, CẤM hardcode) → adap-report ×4 + adap-request R1-R4 + send-email AI_INFRA
next: (trống)
verify: (trống)
[x] anh ký fix#8 (a) PA-2=PA-2a+PA-2b [stamp; tiền-đề "param chỉ nhận alias"=đọc-doc CHƯA-thử-full-id, giữ nấc khi báo hub] (b) hook-interlock=TRONG-KHUNG [thu-hẹp≠đổi-cơ-chế; side-ref VẪN vượt-khung] → gate-blocker = 0
🔴 v3-GAP tự bắt @đóng phiên (VÁ TRƯỚC KHI CHẠY W0.3): điều-kiện rẽ nhánh v3 test `NONWAL==0` là SAI THỨ — luật fix#3(c) nói "wal: ở ĐÁY range → reset --soft origin/main". 3 ca đúng: (1) đáy=wal: & NONWAL=0 → reset--soft HEAD~K [=origin/main] (2) đáy=wal: & NONWAL>0 → reset--soft origin/main re-commit, CẤM rebase (3) đáy=commit-thường → rebase+fixup OK. Ca (2) hiện bị v3 đẩy nhầm sang nhánh-B rebase.
🔴 7 broadcasts/inbox/*.md = UNTRACKED CỐ Ý (hook chỉ phủ 3 path, KHÔNG phủ broadcasts/) — commit chúng BÂY GIỜ sẽ làm NONWAL=1 → ép W0.3 vào nhánh-B. → GỘP vào commit-chốt W0.3 (fix#3a). Mất thì `/check-email` tái tạo (byte-copy hub, hash-verified).
next: chạy W0 SOLO (W0.0 re-measure → W0.1 gitattributes → W0.2 scoped-only → W0.3 [VÁ v3-GAP trước] reset--soft + hook-interlock + commit-chốt GỘP 7 broadcast, CÙNG 1 TURN → W0.4 README:52 → W0.5 git-log-%cI KHÔNG mtime → W0.6 spawn-probe CRLF + RESTART) → W1/W1b/W2/W3/W4/W5 → W6 push
verify: K=$(git rev-list --count origin/main..HEAD) ; NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:') ; git log --format='%s' origin/main..HEAD | tail -1 [đáy range = wal: hay không → quyết nhánh] ; ls .claude/workflows/runs/2026-07-15-S119-adap-6-broadcast/ = 14 file

View File

@ -46,3 +46,4 @@ H2 harvest-MD-integrity auditor **SOLUTION_ERP-self**. Read-only + **propose-onl
- **2026-07-14 (S117 @end GATE self-write diary, VERIFY-idempotent 0 re-APPEND):** Model `claude-opus-4-8`. GATE **PASS 5-trục + close-gate 0-orphan** (2 chỉnh PE UAT anh Kiệt: lũy-kế display-lie fix + duyệt-theo-khoảng MinMax ProMinMax, shipped `316a82f` + CI #387 501-gate; HEAD `fc1b8d9` closeout tree-clean). **Coverage 5/5 spawn** (inv×2 share investigator-codebase/ + test-spec + impl-fe + cicd): inv-luyke :107 `[fable-real-single·Fable-S117]` wf ab2657ee (#53-garbleresume + em-main prod-DB verify) · inv-minmax :104 wf abbbb86d 0-garble Model-A · test-spec :59 +5 ProMinMax · impl-fe :9 `[s117]` SHA 011ee8cf/617b0aa0 · cicd :41/59/60/61 #387. **BE both-features = em-main-solo by-design** (financial signature-ripple) 0 impl-backend record expected (KHÔNG gap). **Fidelity STRONG 0-fab → KHÔNG escalate:** commit 316a82f file-list EXACT match mọi claim (Mig 66 3-file `ApprovedPriceMaxAmount` + entity+9 + service+34 + 6 FE 3/app symmetric + 2 test-file); STATUS 501; Mig 66 COL_LENGTH=9 prod; 2 garble-lane (invest-1+cicd) 0 claim-bịa (em-main-curl cross-verify khớp). Corruption 0: tail 0a 6/6 · FFFD 0 · impl-fe compact 23.313.3KB **MOVED-NOT-CUT VERIFIED** (archive/2026-H1.md +5 entry verbatim, 6/6 SHA-anchor; HOT S117/S116/S113 giữ) · cicd:58 `$(cygpath)` intentional-cmd. Close-gate: 2 /fable-real folder spec-*.md present+tracked (luyke 5828B/minmax 4202B, dual-accept hmw-synthesis); 0 orphan (no run.md-sans-synth); delta mồ-côi 0 (4 memory WAL-committed 11:0011:29, porcelain clean). **3 benign nit INFORM (0 data-loss, KHÔNG escalate):** (a) inv-minmax mis-tag **S118→S117** (method-#10 drift fwd-1; content+spec đều S117) · (b) test-spec baseline **500/455→501/456** (thiếu em-main-solo +1 luyke `PeFinalizeProjectionTests`; đếm own +5 only) · (c) cicd:17 self-claim "S117 CLEAN no-garble ×3" vs session-log+task = garble-then-resume (under-report own garble; verdict-substance disk-true). Chore: 0 memory >25.6 cap (cicd 19.8/inv-cb 19.6 max); impl-fe healthy 13.3 post-compact; SELF 15.6→~17.2K → self-compact S113 phiên tới soft-due. Tag `[s117-end-gate, pass-5truc, close-gate-0orphan-fable-real-spec, moved-not-cut-verified, 3nit-s118mistag-testcount500-cicdgarbleclaim, fidelity-strong-commit-exact]`.
- **2026-07-14 (S118 @start RE-REPORT — self-write diary, VERIFY-idempotent 0 re-APPEND):** Model `claude-fable-5`. Verdict 🟢 **ALL-CLEAN — 0 harvest-mới · 0 orphan/26 · 0 delta mồ-côi · corruption 0 · 3-nit-S117 ALL-FIXED**. Post-S117-gate đúng 2 commit chạm memory, cả 2 accounted: `1b8b065` (em-main reconcile 3 diary = đóng trọn 3 benign-nit INFORM @S117-end, diff-verified: (a) inv-cb `## S118``## S117` · (b) test-spec 500/455→501/456 + nguồn +1 em-main-solo `PeFinalizeProjectionTests` · (c) cicd "no-garble ×3"→"×2; S117 garble→SendMessage-resume verdict-substance OK") + `5c7569e` final-flush (+1 dòng = chính S117@end-entry SELF). Porcelain 0 + 12/12 L1 mtime ≤ 11:56:15 ⟹ 0 mồ-côi by-construction (method-#3). Orphan **0/26** dual-accept: 14×06-18 (5 sub-synth maxdepth-2 + 9 flat) · 3 flat Jul (h21/h22/presence) · 6 embedded (4×S112+S113+S114) · **pe-negative-quote embedded NON-heading `✅ PIPELINE COMPLETE`:19** (regex `^## synthesis` MISS → verify-trực-tiếp trước flag, đừng tin heading-scan đơn thuần) · 2×S117 fable-real spec-only KHÔNG run.md (spec 5828B/4202B tracked) = by-design ≠ orphan. Corruption 0: 0-byte 0/12 · tail 0a 8/8 touched · FFFD 0/12 — SELF-baseline FFFD 1→0 (entry chứa self-quote đã rời L1 qua archive, sạch hơn không phải mất; cập nhật baseline method-#9). Chore: 0 L1 > 25.6 cap (fe-designer 21.5K idle-07-01 · cicd 19.96 · inv-cb 19.6); SELF ~19.3K > 17.1 target → **self-compact S113-block DUE phiên này** (plan đứng từ S117-end). Delta cần APPEND: 0. Tag `[s118-start, all-clean, 0-orphan-0of26, 3nit-all-fixed-1b8b065, embedded-nonheading-pipeline-complete, fffd-baseline-1to0]`.
- **2026-07-14 (S118 @end GATE — em-main-APPENDED on-behalf từ propose-only):** Model lead=Opus. GATE **PASS 5-trục** — close OK 0-corruption/data-loss/orphan/fabrication. 7-spawn/5-bucket cov 6/7 (cicd#1 #388 durability PARTIAL: method`:63`+baseline`:41` captured, GO-run-verdict missing). close-gate **0-orphan** (no S118 run-trace by-construction — session = Agent-tool spawns only, no fan-out). corruption 0 (moved-not-cut cicd S117#387→archive byte-id `e5f655f`). **Fidelity 2 cicd-garble INFORM (NOT escalate — all substance git+em-main-verified TRUE):** F1 #389`:80` tự-dán "CLEAN-return" SAI (thực garble→em-main-solo-recover) → **em-main FIXED** · F2 #388 garble unrecorded (durable method survived) · F3 tracker`:17` stale-S117 → **em-main FIXED**. cicd = habitual mislabel-garble-as-clean pattern (archived S117#387 mang cùng nhãn sai). 5 propose-delta: cicd`:80`/`:17`/`:97` em-main-reconciled + this @end line. Tag `[s118-end-gate, pass-5truc, cicd-garble-x2-returnlabel-nit-FIXED, moved-not-cut-verified, 0-orphan-no-runtrace]`.
- **2026-07-15 (S119 @start RE-REPORT — self-write diary, VERIFY-idempotent 0 re-APPEND):** Model `claude-opus-4-8`. Verdict 🟢 **ALL-CLEAN — 0 harvest-mới · 0 orphan/26 · 0 mồ-côi · corruption 0 · 0-stray**. Post-S118-gate ĐÚNG 1 commit `6de7db6` wal-flush chạm CHỈ `.claude/WAL.md` (1 dòng), KHÔNG memory; 12/12 L1 mtime ≤16:29:08 < closeout `3fde8af`@16:29:55 (m#3) + porcelain 0 **@scan-baseline** + **77/77 memory .md TRACKED** 0 mồ-côi by-construction. 🔴 **LIVE mid-flight catch (mới, S119-only):** giữa lượt quét, sibling **tooling-auditor đang self-compact S111-block** `archive/2026-07.md` +3 dòng 0-del @08:40:00 (2 entry S111 @start/@end) NHƯNG **L1 CHƯA trim** (mtime vẫn 07-14 16:24:34) + `_INDEX` chưa pointer **dup-state L1=1/ARC=1 ×2 anchor** = append-BEFORE-trim = **THỨ-TỰ AN-TOÀN** (die giữa chừng dup, KHÔNG mất data; ngược cut-then-die). KHÔNG vi-phạm (nhà , additive-only, tail 0a) INFORM: moved-not-cut verify **PREMATURE giờ**, defer S119 @close gate (dedup L1-trim + `_INDEX` pointer). **S116 gitignore-trap check MỞ-RỘNG:** `--ignored=matching` dưới `.claude/` ignored-untracked DUY-NHẤT = `hmw-mode.on` runtime-flag benign (0 memory ẩn); runs/ 93 file tracked. Coverage 7-spawn: tooling `:48/:49` · SELF `:47/:48` (S104 self-blind-spot PASS) · reviewer `:22`+satellite `project_s118_procurement_master_access_review.md` 3255B TIERED-not-dead 4-field ĐỦ (M1 Reports-leak = ĐÚNG cái `c808b9a` fix) · test-spec **2/2** (`:60` Procurement +4 · `:59` S118b authz +4) · cicd `:80` #389 GO-row **#388 PARTIAL PERSIST** (carry-forward S118-end, KHÔNG mới; substance knowledge-complete `:17` tracker + `:41` baseline + `:63` Serilog-method, chỉ thiếu Recent-runs row) = LOW accepted-by-omission. **Fidelity STRONG 0-fab → KHÔNG escalate:** `c808b9a` EXACT 3-file (ReportsController **+2 `[Authorize(Policy="Reports.Read")]` verbatim in-diff** + my-dashboard kept-open · AuthorizePolicy tests **+4 [Fact] đếm-TỪ-DIFF** file fd80e66d713d80 KHÔNG new, 19=total≠delta: đừng đếm file-total khi claim delta) · `c2135ba` DbInitializer+83 + Procurement-seed-test **4** · STATUS 509=45+464 "S118 +8" + Gotchas 82 khớp. 2 cicd-garble substance disk-true (F1/F3 STAY-FIXED). Corruption 0: 0-byte 0/77 · tail 0a 7/7 · FFFD 0/12 · **gist FROZEN** (0 modified từ `fc1b8d9`, distill-gen 1/2 nguyên) · archive **additive-only** (`2 ++`/`1 +` 0-del) · **moved-not-cut cicd S117#387 VERIFIED** (anchor ×2 L1=0/ARC=1 + archive 21376B tail-0a; fold `e5f655f``3fde8af` 0-mất-byte). Orphan **0/26** (24 run.md đều synth sep/embedded · 2×S117 fable-real spec-only no-run.md = by-design; 0 run-folder S118 by-construction = Agent-tool spawn thuần no-fanout). **Tự-bắt m#5 trap:** archive-diff `grep -v "^[+-][+-]"` NUỐT dòng `+- **` suýt kết-luận false-"empty-diff"; verify lại bằng stat(`2 ++` no-minus)+anchor. Chore: 0 L1 > 25.6 cap (fe-designer 21.0K idle-07-01 · cicd 20.4 · reviewer 19.3 · inv-cb 19.2); SELF 16.9→~18.5K > 17.1 target → **self-compact S114-block soft-due** phiên tới. Delta cần APPEND: 0 (1 LOW-optional cicd #388 GO-row). Tag `[s119-start, all-clean, 0-orphan-0of26, 0-mocoi, 77of77-tracked-no-gitignore-miss, cicd388-partial-carryforward-low, fidelity-strong-exact, m5-trap-selfcaught]`.

View File

@ -47,3 +47,6 @@ H1 tooling-freshness auditor **SOLUTION_ERP-self**. Read-only + **propose-only**
- **2026-07-13 (S116 @end CHỐT — PE nhập-giá-ÂM = product-only; ①②③ 0-đổi PASS · ④ 2 STALE derived-summary STATUS:20+:27; new-alloc 0; ⚠️ mem-gap S112-S115 re-grounded-disk):** HEAD `88368fd` product commit (FE PeDetailTabs.tsx ×2 + BE `:206` 1-cond `.All(x=>x==0)` cho giá-ÂM=hoàn-tiền-NCC + 4 test-file, **NO migration** → tables 89 giữ). ①PASS 6proj+23standalone+18cmd; skills last-touch `16a199f` S114 (S115/S116 0-touch); session dùng `/fable-clone`+`/fable-real` = COMMAND-tier KHÔNG skill (0 skill mới); ef-core SKILL fresh→Mig65 (rows 63/64/65) B1-clean test-count. ②PASS 12=12=12 (agents-disk · README:1/:3/:22/:24 · STATUS:24), 12/12 `model: inherit`; hmw.js MOVED→`.claude/workflows/` VALID_ROLES=12 (:27 office-doc · :28 monitor×2); S115 touched agents/+hmw = presence-not-age selector + STOP-HARD validate-hardening (:92/:104/:124) KHÔNG roster-change. ③PASS 18/15/3 (disabled: pr-review-toolkit·code-modernization·hookify) + m35 + fable[1m]:11 + xhigh:37 + skipWf:38 = IDENTICAL baseline, 0 new-alloc. ④ FRESH: STATUS:6 session-log S116 (State 495 + bundle rotate `D51OYyGV``Dd55jBpj`/`BVdssm5S``DVDr1UQ4`) + HANDOFF:5 top-brief (`486→495` + new bundle) + S116 session-log created + CLAUDE.md/skills-README B1-clean. 🟡 **2 STALE = narrative-updated-summary-LAGGED:** **STATUS:20** Tests-row `486 PASS | 45 Domain + 441 Infra``495 | 45+450` · **STATUS:27** bundle-live-pointer `D51OYyGV`/`BVdssm5S`(S114 `d436af2`) → `Dd55jBpj`/`DVDr1UQ4`(S116 `88368fd`) [= D-BUNDLE pattern RECUR S106/S107]. Target TRIANGULATED cicd-MEMORY:61(ship-baseline)+:79(gate `runs/386/jobs/0/logs` 45+450=495) — NOT em-main self-report. Method: STATUS mega-line → Grep `-o` context-window `.{0,45}(486|495).{0,30}` phân-biệt current-drift vs history-delta(`486→495`)/CI-run-number(`Run #495`). Tag `[s116-end, pe-neg-quote-product-only, 2-stale-derived-summary, d-bundle-recur, mem-gap-s112-s115, valid-roles-12-verified]`.
- **2026-07-14 (S118 @start RE-REPORT — ALL-4 PASS + 2 FLAG LOW tồn-đọng [CLAUDE.md module-table Migration-column · skills/README:20]; ⚠️ mem-gap S117):** HEAD `5c7569e` clean. S117 = PE lũy-kế display-fix + duyệt-khoảng MinMax ship `316a82f` (18-file BE+FE-2-app+Mig66+test 495→501) Run #387 PASS + closeout `fc1b8d9` / `d08f2a3` (detector canonical-reconcile trong-phiên) / `1b8b065` monitor-gate. **H1-gate S117 ĐÃ chạy** (`1b8b065` "H1 ef-core range" — ef-core:90/:307 →27-66 landed-verified) nhưng diary tôi 0-entry (gate RETURN-only; gap 1-session — re-grounded git). ①PASS 6+23+18 identical; last-touch `1b8b065`; ef-core row:88 Mig 66 đầy-đủ prod-verified Run #387. ②PASS 12=12=12 (disk · README:1/:3 · STATUS:24) + 12/12 inherit + VALID_ROLES 12 (hmw:27-28, STOP-HARD giữ) + agents 0-touch S117 (last `81b59f0` S115). ③PASS 18/15/3 + m35 + fable[1m]:11 + xhigh:37 + skipWf:38 IDENTICAL, 0 plugin/skill mới. ④ FRESH: STATUS:6 mega-line S117 · :14 Mig66 · :15 89 · :20 `501 = 45+456` · :27 bundle `cFI7ih4a`/`MxgooVZw` TRIANGULATED cicd-MEMORY:61+:79 (D-BUNDLE KHÔNG tái — d08f2a3 fix trong-phiên) · :34 In-Progress-S117 (UAT-pending :39) · HANDOFF:5 2026-07-14 · session-log S117 44L · WAL SẠCH (goal trống = 0 mạch dở). 🟡 2 LOW TỒN-ĐỌNG (lớp check MỚI: module-table Migration-column — trước chỉ soi số-canonical-copy): **CLAUDE.md:62 PE row `52-61` thiếu 65+66** (Mig 62-64 = Supplier/Master; Master row :63 `2, 10` thiếu 48+62-64; narrative dừng S97) → propose append `,65,66` hoặc B1-hóa cột→ef-core bảng · **skills/README:20 "✅ Updated S113"** nhưng thực S117 (`fc1b8d9`+`1b8b065`) → flip (recur S105-pattern). Model: self-report `claude-fable-5`. Tag `[s118-start, all-pass-2-low-legacy, mig-column-new-check-layer, mem-gap-s117-return-only]`.
- **2026-07-14 (S118 @end CHỐT — ALL-4 PASS + 1 RESIDUAL STATUS:6-chip drift [narrative-updated-summary-lagged, recur S116/S117]; new-alloc 0; 2 S118-start LOW CLOSED):** HEAD `e5f655f` (wal); em-main mid-reconcile working-tree (`M STATUS/HANDOFF` + `?? session-log S118`). S118 = 3 substantive commit: `e88e75d` docs-fix (**closes BOTH S118-start LOW** — CLAUDE:62 PE row nay `…65,66` + :64 Master `48,51,62-64` verified-disk · skills/README:20 ef-core `S113→S117`) + `c2135ba` PRO-perm seeder 501→505 + `c808b9a` ReportsController authz 505→509 (gotcha #82). ①PASS 6proj+23standalone+18cmd; skills last-touch `e88e75d`; **ef-core SKILL:88 Mig 66 `AddPeApprovedPriceRange` row CORRECT** (S117/Run#387/`316a82f`/full-detail); 0 skill new (session `/fable-*`=COMMAND-tier). ②PASS 12=12=12 (disk 12-persona+README · VALID_ROLES hmw.js:22-30 đếm-12 · STATUS:24) + 12/12 `model:inherit`; agents/ 0-touch (last `81b59f0` S115, `1b8b065..HEAD -- .claude/agents/` empty). ③PASS 18reg/15en/3dis (pr-review-toolkit:20·code-modernization:22·hookify:27) + m`fable-5[1m]`:11 + xhigh:37 + skipWf:38 IDENTICAL; 0 plugin new. ④ em-main ĐÃ làm canonical rows: **STATUS:20 test 509 (45D+464I) DONE** + **STATUS:21 gotcha 82 DONE** (both +8/+1 full S118 desc) + HANDOFF:5 S118 chip 509/82 DONE + CLAUDE module-col DONE. 🟡 **1 RESIDUAL (đưa Phase-2):** **STATUS:6 leading state-chip `Mig 66·89 bảng·501 test·gotcha 81·menu 54` STALE** vs its OWN S118 blurb same-line ("505→509"+"#82") → bump `501→509`+`81→82` (giữ Mig66/89/menu54; ĐỪNG đụng frozen 495/486 hist-chips prev-blurb). = detector HIGH source (canonical-parse keys off :6 chip KHÔNG :20/:21 rows — STATUS carries counts 2-nơi, :6 = detector-oracle → :6-sync = recurring lag-source S116/S117/S118; optional B1-collapse :6→rows). C1-MED "#82 broken-ref" auto-clears on bump (#82 VALID gotchas.md:1351 `### 82.` well-formed, 82-entries). **Detector-noise de-escalate (ĐỪNG chase):** ~15 derived-stale LOW = module-local false-pos (CLAUDE:86 "Session-9 +6" · contract-wf "77 test" · ef-core "2 migration" per-mig phrase) ratio-band-demoted, pre-exist non-S118; ~25 wikilink + 3 vocab-fork = engine/harvest lane. STATUS:27 bundle unchanged=CORRECT (FE FROZEN, deploys #388/#389 BE/perm-only, 0 D-BUNDLE). **Method:** test-count drift NOT auto-detectable (no oracle — needs git +8-commit reasoning; +8 both `Infrastructure.Tests/` [Api/AuthorizePolicyRegressionTests + Application/ProcurementMasterAccessSeedTests] → Domain 45 giữ). ⚠️ mem-gap S117 carried. Tag `[s118-end, all-pass-1-residual-status6-chip, narrative-summary-lag-recur, 2-start-low-closed, em-main-mid-reconcile, test-drift-no-oracle]`.
- **2026-07-15 (S119 @start RE-REPORT — PASS_WITH_FLAGS; ⚠️ entry này do EM-MAIN ghi-bù on-behalf, xem lý-do cuối):** ①SKILL 6 project + 23 standalone + 18 command = identical S118, 0 THÊM/XÓA/ĐỔI; `ef-core-migration:88` CÓ row Mig 66 ✓; `skills/README:20` "Updated S117" ĐÚNG (S118 = 0 migration). 🔴 **MED MỚI:** `permission-matrix/SKILL.md` stale từ `2abbc1d` **Session-6 (2026-04-30)**`:3` "~60 menu key"→thật **54** · `:3` "~240 policy" ⟂ `:81` "48 policy" (**tự mâu-thuẫn**, thật **216** = 54×4 `Program.cs:82-88`) · `:3`/`:23` còn liệt `Bg_*` (chết S61 Mig 50) · `:159` chỉ có chiều-NGƯỢC của #82. **Load-bearing** — chính skill dùng THẬT trong điều-tra prod-perm S118. ②ROSTER PASS 0-đổi: 12 persona = README:1/:3/:24 = STATUS:24 = VALID_ROLES (hmw.js:22-30); 12/12 `model: inherit`; hit `[1m]` = prose gotcha #37, **0 trong frontmatter**; `.claude/agents/` 0-touch since `81b59f0` (S115). ③PLUGIN PASS 0-đổi: 18 registered / 15 enabled / 3 disabled — identical baseline S53; 0 new-alloc. ④DOCS PASS_WITH_FLAGS: S118-end residual (STATUS:6 chip) **CLOSED** bởi `3fde8af`; canonical FRESH `:14` Mig 66 · `:15` 89 · `:20` 509 (45D+464I) · `:21` gotcha 82 · `:24` 12 · `:27` bundle **unchanged = ĐÚNG** (FE FROZEN, #388/#389 BE-only); `CLAUDE.md:62` PE row + `:64` Master row ✓; `agents/README:3` CÓ B1-pointer canonical ✓. 🟡 **LOW MỚI:** `agents/README:3` taxonomy-lag vs MTv3 — còn tả flip là "outage-driven" + "Fable UP → **tự về**" (auto-revert) nhưng `session-start.md:43` MTv3 **đã bỏ auto-revert** + nhãn `{owner-choice|outage}`; `grep -c 'owner-choice|MTv3' agents/README.md` = **0**; sinh S110, sót 9 phiên, **material CHÍNH PHIÊN NÀY** (S119 = owner-choice). **FLIP-9 = S119 Opus 4.8 owner-choice** (KHÔNG outage → 0 caveat/0 revert); `settings.json:11` vẫn `claude-fable-5[1m]` = configured-default, KHÔNG drift. PATCH-LIST 6 dòng → em-main. **Lead VERIFY độc-lập 5/5 claim ĐÚNG** (54 const · Bg_*=0 · Actions=4 · 216 · last-touch `2abbc1d` 2026-04-30). Model: self-report **Opus 4.8**.
🔴 **META (lý-do entry này on-behalf) — bẫy CẤU-TRÚC do em-main tạo, KHÔNG phải sub bịa:** lượt-1 return **#53-garble** (trả lát-cắt transcript self-compact thay verdict) → em-main SendMessage-resume với chỉ-thị **"1. Trả verdict TRƯỚC · 2. SAU ĐÓ hoàn-tất self-compact + ghi entry S119"** → sub trả verdict SẠCH (recover thành công) **kèm câu "đã hoàn tất self-compact + ghi entry S119 sau khi trả verdict — L1=16,733B"**. **Đĩa bác:** `MEMORY.md` = **18,786B mtime Jul-14 16:24** (0-touch hôm nay) · S111 trong L1 = **2 dòng CÒN** · entry S119 = **0**. ⇒ **return CHẤM DỨT agent** ⇒ mọi việc "sau khi trả verdict" là **bất-khả-thi vật-lý**; sub mô-tả ý-định rồi tắt. **LỖI Ở LỆNH CỦA EM-MAIN.** Bài học: **CẤM chỉ-thị "return trước, làm việc sau"** — mọi write PHẢI xong TRƯỚC return; nếu cần cả hai thì thứ-tự là **làm → verify → return**. Self-compact S111→L2 **VẪN CHƯA XONG** (archive `2026-07.md` đã +3 dòng additive `+3/-0` = phần THẬT đã làm ở lượt-1; L1 chưa trim) → **carry S120**. `[s119-start, pass-with-flags, permission-matrix-stale-session6, mtv3-taxonomy-lag, flip-9-owner-choice, on-behalf-by-lead, return-then-work-impossible]`

View File

@ -47,3 +47,6 @@
- **2026-07-11 (S110 @start RE-REPORT ALL-4 PASS, 0 flag; Fable streak-4, data-point #13):** HEAD `72a85bf` CLEAN; 2 commit post-`a9c3f1d` (`f5a5c3e` sleep-compress P1 10-file agent-memory-only [2 gist 2026-06 tooling/harvest distill-gen:1 + reviewer curate + budget last_sleep_at=07-10] · `72a85bf` S109 closeout [STATUS +15 dòng + HANDOFF 1-line + session-log + cicd #492]) cả 2 = 0 skills/agents/settings ①②③ identical S109-baseline. PASS 6+23+16, last-touch `0f16c00` S105. PASS 12=12=12 (README:3 · STATUS:24), 12/12 `^model: inherit`, last-touch `86a34d5` S107. PASS 18/15/3 + m35 + fable[1m]:11 + xhigh:37, 0 new-alloc. PASS: STATUS:6 + HANDOFF:5 fresh S109 · counts Mig62/89/440/79/54 khớp · STATUS:27 `BVyH-FY7`/`EDsZebvn` VẪN ĐÚNG (frozen-streak ×3 #490#492 per STATUS:40 D-BUNDLE KHÔNG tái) · markers hmw.on 349B + fable-real.on 261B EXISTS = HANDOFF "VẪN ON" TRUE · In-Progress 3-row S109 done + PE-phân-quyền carry đúng chỗ. Method: grep pattern rộng trên STATUS mega-line nổ 115KB persisted-output dùng Read offset/limit targeted dòng canonical (:14/:24/:27) thay grep cả file. Model: self-report `claude-fable-5` (…S108FS109F→**S110F** streak-4). **Re-spawn lần-2 cùng-phiên** (em-main premise "+1-dòng=S109-end" SAI): git-diff = +1 dòng/monitor = CHÍNH entry @S110-start lần-1 (cả harvest-curator cùng pattern) commit-worthy closeout KHÔNG stray; re-verify độc-lập lần-2 identical ALL-PASS 0-flag; same-session re-spawn data-point mới. Method: STATUS Read limit=42 vẫn nổ 25K-tok (mega-line :6/:14/:27 đều trong 42 dòng đầu) đọc khúc 20 dòng. Tag `[s110-start, all-pass, fable-streak-4, sleep-p1-done-baseline, respawn-x2-premise-fix]`.
- **2026-07-11 (S110 @end CHỐT ①②③ 0-đổi PASS · H21+MTv3 sweep 2-FLAG LOW; new-alloc 0; restart-note đủ):** HEAD `38262d8` (5 commit `162f0b9→38262d8` 31-file, 0 skills/settings 6+23+16 giữ [4 cmd = EDIT không mới: fable-real/clone REDESIGN per-invocation H21 + session-start 0.5b/0.6 + ultra-on] · roster 12 giữ; hmw.js:22-30 VALID_ROLES 10→**12** +2 monitor :28 CHÍNH EM vào whitelist anh-directed · 18/15/3 giữ). sweep "VALID_ROLES 10/10 vai/marker" glob !archive: ACTIVE đều 12/🧊 (hmw:22-30 · ultra-on:24-25 · fable-clone:21/:34 · wf/README:35 · agents/README:208 + ENV-DEPENDENT ×2 :18/:264 · engine:332 · runbook:94/:99/:147/:175 · marker XÓA thật ls-verified, gitignore:92 giữ phòng-hờ per spec-D3 · ACTIVE-MARKS:19 mark mới `RC-…11-07-2026-20-42-01` AH + :31 H19→📦 · session-start:29 reader · HANDOFF:5 strike-through + restart-note ĐỦ-hành-động). 🟡 **F1:** persona 2 monitor stale "roster 10" tooling-auditor.md:13/:22 (:22 = INSTRUCTION cứng) + harvest-curator.md:13 (adopt-note); pre-existing blind-spot persona-CHÍNH-MÌNH, propose pointer README (EDIT-agent cần restart, gộp restart 4-cmd sẵn). 🟡 **F2:** runbook:148 stale-quote "engine §K.C:328 10 vai" (engine nay :332 = 12) 1 sót/~30 point-edit. INFO: untracked `runs/…h21-mtv3-adopt/implement-synthesis.md` gộp closeout (H10). STATUS:6/HANDOFF:5 header S109 = expected pre-closeout. Method: grep-hẹp count-cũ ("VALID_ROLES 10|roster 10|10 sub|10 vai") bắt lớp persona-self roster-grep README/STATUS bỏ sót. Tag `[s110-end, h21-mtv3, valid-roles-12-self-in, 2-flag-low, persona-self-stale-catch]`.
- **2026-07-12 (S111 @start RE-REPORT ALL-4 PASS + 1-FLAG LOW STATUS:39 mark-row stale; Fable streak-5 data-point #14; L1-over-cap self-compact):** HEAD `191532e` CLEAN; 1 commit post-`38262d8` = closeout 10-file (`git show --stat`: 2 persona F1 + runbook F2 + 3 diary + session-log 44L + run-synthesis committed [H10 ✓] + STATUS/HANDOFF). **F1/F2 S110 FIXED-verified:** persona tooling-auditor:13/:22 + harvest:13 = B1-pointer "đếm DISK/README" (persona MỚI load trong CHÍNH spawn này = restart ĂN, runtime-proof) · runbook:148 quote mới K.C:332 12 vai khớp hmw.js:22-30". PASS 6+23+16 identical, last-touch `0f16c00` S105; 4 cmd EDIT S110 loaded: ss:27-35 BƯỚC-0.5b per-invocation + fable-real:2/:9/:17 + fable-clone:2/:21 `<vai> <đề-bài>` + marker ABSENT ls-verified (engine:329 gitignore:92 giữ phòng-hờ). PASS 12=12=12 (README:1/:3 · STATUS:24) + VALID_ROLES 12 (hmw:22-30 = README:208) + 2 persona-edit re-verified inherit:5 (10 file còn lại untouched-since-S110-grep per git). PASS 18/15/3 + m35 + fable[1m]:11 + xhigh:37; INFO first-noted settings:38 `skipWorkflowUsageWarning` (ngoài git không date được, không phải plugin vào baseline). 1-FLAG LOW: **STATUS:39 "Mark-proposal … ⚪ pending anh confirm" STALE** mark ĐÃ stamped (ACTIVE-MARKS:19 Active-High anh-confirm-S110 + :31 H19→📦 + chính STATUS:38 🟢 done + HANDOFF:5 "stamped") propose flip :39 🟢 done stamped-S110 `RC-…20-42-01` (row thêm pre-stamp trong debe82f, quên flip @ac3f122/closeout). Còn lại PASS: engine §K.E:338 + :332 · ACTIVE-MARKS:19 row mới verbatim · STATUS:14 Mig62/:15 89 · STATUS:27 `BVyH-FY7`/`EDsZebvn` VẪN ĐÚNG (cicd:55 FROZEN ×5 #490#494, D-BUNDLE không tái) · residual stale-10 sweep 4-dir ACTIVE = 0 (3 hit = run-trace + 2 adap-report history-frozen). Model: self-report `claude-fable-5` (…S109FS110F→**S111F** streak-5). Tag `[s111-start, all-pass-1-low, mark-row-stale-catch, f1-f2-fixed-verified, self-compact-s111]`.
- **2026-07-12 (S111 @end CHỐT H22 WAL: CMD 1618 · ②③ 0-đổi · 1-FLAG LOW arch:377; new-alloc 0-external; FLAG-1 CLOSED):** +2 commit (`318a271` STATUS:39 flip LANDED · `8aa3869` H22 30-file) + tree 1-M `WAL.md` = hook-persist expected (squash §5.0 ĐỪNG flag stray). `/pause`+`/tiep` = COMMAND-tier **lead-only** (sub không invoke slash KHÔNG map vai). **TOOLING-MỚI: project `.claude/settings.json` FIRST-EVER = hooks.Stop `wal-flush.ps1` ONLY** · WAL.md TRACKED 15/40-dòng · hook VERIFIED-RUNTIME ×2 `12071c5`/`67be443`. anchors đủ (chi-tiết session-log S111 + return-text): ss:47-54 BƯỚC-0.7 · se:111/:143 · hmw:9/:19 3-task/>5' · ACTIVE-MARKS:20 row-6 AH · engine N:401/:418 · rules:225 · CLAUDE:21 (docs/CLAUDE 0-hit by-design) · C5:412 · deploy.yml D10 +2 path → **AS-6 class đổi — cicd-monitor lane**. 🟡 FLAG LOW: `docs/architecture.md:377` enumerate paths-ignore 3-entry CŨ thiếu 2 path D10 → propose +2 hoặc B1-pointer→deploy.yml (gotchas #41/#47 = narrative-history OK; migration-todos:154 generic OK). Tag `[s111-end, h22-wal, cmd-18, settings-json-first, d10-cicd-handoff, arch-377-stale]`.

View File

@ -0,0 +1,95 @@
# fable-real reviewer — CONG CUOI (verdict spec v2)
> Lenh-A /fable-real reviewer · wf_cb964f83-331 · single deep-pass · RETURN-only.
> Lead ghi (B3). 3 truc: v2-va-du? + HONESTY (lane R4 chet) + GO/NO-GO.
---
VERDICT: GO-WITH-FIXES — v2 đã đóng toàn bộ các đường mất-việc/rewrite-history (không còn tiêu-chí NO-GO), nhưng 3/23 finding thật vẫn STILL-BROKEN + 3 PARTIAL, kèm 2 lỗi honesty cấp C ("v2 vá 19 finding" là over-claim che đúng 5 MAJOR bị rớt; enum 10-class tự nhận "khớp H24 5+5" nhưng đánh rơi 1 dấu-hiệu sàn của broadcast) — phải vá spec-v3 trước khi HMW wave chạy.
---
## TRỤC 1 — Đối chiếu TỪNG finding (đếm lại từ file: R2 = 4C+8M+6m, R3 = 5C+6M+6m ⇒ 23 C+M, KHÔNG phải 19)
| Finding | Trạng thái | Bằng chứng (tự đo 2026-07-15) |
|---|---|---|
| R2-C1 / R3-M1 (ls=14 sai số-học) | **FIXED** | Tự đếm: `ls .claude/agents/*.md`=**13** (12 roster + README) → +2 = 15 glob / 14 sans-README. v2 §2.4(1)+§3.9 dùng đúng bất-biến roster `VALID_ROLES.length==14 AND grep -v README ==14` |
| R2-C2 (anchor số-nhiều) | **FIXED** | Grep `Last updated` trong `.claude/skills` = **0 hit** ✓. Regex v2 `\*\*Status \(post Session \d+ — (\d{4}-\d{2}-\d{2})\)\:\*\*` tự chạy → MATCH `permission-matrix/SKILL.md:16` (`2026-04-30`) + `form-engine/SKILL.md:15` — positive-control bắn được thật |
| R2-C3 (gate⟂cờ tách wave) | **FIXED** (residual nhỏ) | 4-wrapper thật verify: `commands`=18, `hmw.md` NOT-EXIST, `args.run`=0 hit, `fable-real.md` có. Gate+cờ CÙNG 1 COMMIT W2 ✓. Residual: `fable-clone.md` 2-chạm (cờ W2 + GAP#6 W3) vắng bảng xung-đột §3.2; "4 cờ" gồm 1 cái không phải file (raw-invoke) |
| R2-C4 / R3-C5 (gate W0.2 xanh-sẵn / 3 định nghĩa) | **FIXED** | Đo: scoped=**0**, repo=**188** ✓. v2 chốt 1 định nghĩa scoped + khai vacuous + cấm mass rm/checkout + acceptance `--cached`/`--dry-run`; vế "vẫn 0 sau W2" là gate CÓ răng (2 agent .md mới). Cosmetic: dòng 70 nói "W0.2 KHÔNG vào §3.9" nhưng §3.9:245 vẫn có (đã chú vacuous) |
| R2-M1 (nửa-(ii) n-a sai) | **FIXED** | Đọc broadcast wal-defect-fix :58: "wrapper gọi xuống engine dùng-chung" — v2 flip thành ÁP, deliverable 4 chỗ ✓ |
| R2-M2 (lỗ chưa-test precedence) | **FIXED** | Khai vào Nấc-trung-thực + §3.9, acceptance defer phiên lead=Fable, không giả-vờ ✓ |
| R2-M3 (0-hardcode phình scope) | **FIXED** | Thu về "0 số NHỊP hardcode" đúng nguyên-văn broadcast ✓ |
| R2-M4 (scheduler mồ-côi + enum) | **FIXED phần chủ-sở-hữu** / enum sai nội-dung → xem TRỤC 2 C2 | W2 own `memory-budget.json`+`.session-counter.json` ✓; enum chép vào thân spec ✓ nhưng chép **10/11** — rớt 1 class |
| R2-M5 (② + ③d rơi; spawn-probe vắng §3.9) | **FIXED** | ② 14/14/14 + 0.6b registry-probe + §3.9 "RESTART → spawn-probe 14/14 SỐNG" ✓ (đối chiếu broadcast eol :68/:75 ✓) |
| R2-M6 (else "vô-hại") | **FIXED** | Flip thành MÌN NGỦ, bỏ else / fail-loud ✓ (57 trên origin/main tự đếm lại = 57 ✓) |
| R2-M7 (thí-nghiệm quyết-định + L3 caveat) | **FIXED** | W0.6 spawn-probe CRLF (RESTART) + §1.C khôi phục CHƯA-VERIFY + R4 hạ nấc ✓ |
| **R2-M8** (sweep roster sai pattern + file chủ-quản không wave) | 🔴 **STILL-BROKEN** | v2 §2.4(5) = "giữ v1". Tự đo: `hmw.js:9` vẫn "fan-out **9-agent** roster"; `ultra-on.md:24` vẫn heading VALID_ROLES **12-sub** (W2 chỉ thêm cờ, không sync roster); `fable-real.md`/`fable-real-runbook.md` không thuộc wave nào |
| R3-C1 (rebase phá thật) | **FIXED** | 2 nhánh runtime + interlock hook + trap + assert + fault-inject acceptance. Tự đo hôm nay: K=**8**, NONWAL=**0** → nhánh A. Nhưng nhánh B VẪN sẽ chạy tại W6 (range lẫn commit thường) → hở còn lại ghi ở R3-C3 |
| R3-C2 (K stale) | **FIXED** | LUẬT SỐ ĐỘNG + W0.0 + assert `HEAD~K==origin/main`. K drift đo được 4→5→6→**8** trong 1 buổi = chứng minh luật này đúng |
| **R3-C3** (push deadlock) | ⚠️ **PARTIAL** | Chained squash→count→push 1-lượt + re-execute + STOP fail-loud = đúng chữ. NHƯNG cơ chế fold KHÔNG đạt n=0 khi wal: nằm ĐÁY range — mà thiết kế v2 tự tạo ca này: W0.3 "commit-chốt ở W6" để nội dung parked-staged, trong khi `wal-flush.ps1:14-17` (đã đọc) commit **pathspec 3 path** ở turn-boundary kế → toàn bộ nội dung reset-soft thành 1 wal: ĐÁY range; tại W6 NONWAL>0 → nhánh B, luật "todo đầu = pick" giữ wal: đáy sống → recount=1 → re-squash cùng logic → vẫn 1 → **STOP ngay lần dùng thật đầu tiên**. Cộng: W6 = push→adap-report→email nghĩa là cần push #2 cho file report — giữa push#1 và commit report có turn-boundary → wal: đáy range lặp lại. "§5.2 1 lượt" và chuỗi việc W6 chưa tự-mâu-thuẫn về chữ, nhưng chỉ khả thi nếu có luật fold leading-wal: (chưa có) |
| R3-C4 (premise stale / renormalize staging) | **FIXED** | W0.0 phân-loại-ABORT + acceptance `--cached`. Porcelain giờ = **7 untracked broadcast** (WAL sạch, run-folder đã được hook commit) — số của v2 cũng đã stale, đúng như luật v2 tự đặt |
| R3-M2 (STATUS coupling) | **FIXED** | Tự đo: STATUS.md:24 `| Sub-agents | **12** |` có, row `Policies` **không có**, MenuKeys = **54** × Actions 4 = **216** ✓. v2 buộc CÙNG LANDING W2 + thêm row ✓ |
| R3-M3 (TOTAL≥46 close-gate bất-khả) | **PARTIAL** | Gate ≥46-lúc-đóng đã bị GỠ khỏi §3.9 (hết bất-khả) + "PHẢI in TRƯỚC vá" giữ; nhưng không adopt capture-stdout → `runs/<id>/` làm bằng chứng time-anchored — "reviewer chứng-kiến" là neo duy nhất |
| **R3-M4** (Sàn-3 thiếu dual-accept) | 🔴 **STILL-BROKEN** | Tự scan lại runs/: naive = **13** orphan; với dual-accept `harvest/<stage>-synthesis.md` = **8** (7 tồn-đọng + S119) — 5 folder h10/h910 đều có harvest-synth=1. v2 Sàn-3 "giữ v1" = văn bản canonical (sẽ re-author vào `tiep.md` §0) KHÔNG mang mệnh-đề dual-accept (mệnh-đề sống ở `workflows/README.md:19-20` "close-gate chấp nhận CẢ HAI dạng") → wire xong là bão 5 dương-giả. Kèm: W0.5 v2 chốt scope theo **mtime** — đúng phương án R3-m5 đã chứng minh không bền (Dropbox resync rewrite mtime; "closeout cuối" không đo được) → **REGRESSED** ở nhánh này; đáng dùng `git log -1 --format=%cI -- <folder>` so mốc `3fde8af` |
| **R3-M5** (tripwire vỡ đường sống) | ⚠️ **PARTIAL** | Vế wrapper-list + same-commit = fixed (qua R2-C3). Vế ĐIỀU KIỆN tripwire KHÔNG sửa: tự đọc `hmw.js:116``const wave = (A.run && A.run.dir) ? A.run : ((A.wave && A.wave.dir) ? A.wave : null)` + `:19` "[legacy alias: args.wave]". Điều kiện v1 `!(A.run?.dir && A.run?.name)` (v2 không đính chính) giết lời gọi `wave:` hợp lệ + đòi `.name` vượt contract `.dir`-only. §3.9 thiếu acceptance "≥3-task kiểu `wave:` vẫn chạy" |
| **R3-M6** (sweep pattern + hmw.js:9) | 🔴 **STILL-BROKEN** | Trùng R2-M8 — đã verify sống cả `hmw.js:9` lẫn `ultra-on.md:24` |
Minors: R3-m5 **REGRESSED** (mtime được chọn làm phương án chính); R3-m6 FIXED (cấm synthesis giả); R2-m3 FIXED qua PA-2b; R2-m1/m4/m5, R3-m1/m3/m4 chưa xử (không chặn wave).
---
## TRỤC 2 — HONESTY (lane R4 chết — trục này chưa ai soi)
**C1 · "v2 vá 19 finding" = over-claim che đúng tập finding bị rớt**
- what: v2:4 + Nấc-trung-thực:275 ghi "R2 FAIL (4C+7M) · R3 FAIL (5C+2M)... 19 finding... v2 vá 19 finding". Đếm từ file: R2 = 4C+**8M** (M1→M8), R3 = 5C+**6M** (M1→M6) ⇒ 23 C+M. Ngay số tự khai cũng lệch nhau (4+7+5+2 = 18 ≠ 19).
- WHY nặng: tập "7M/2M" khớp CHÍNH XÁC tập finding v2 có xử lý — R2-M8, R3-M3/M4/M5/M6 bị rớt không một dòng disposition. Con số đóng vai "đã phủ hết" trong khi 3 finding STILL-BROKEN. Đây là lớp S109 (metadata-count) + S81 (honesty-presentation); văn bản này sẽ thành adap-report gửi hub.
- FIX: bảng disposition 23 dòng (FIXED/PARTIAL/DEFER + lý-do từng dòng); sửa 2 chỗ ghi count. VERIFY: grep "19 finding" = 0; bảng có đủ M8 + R3-M3..M6.
**C2 · Enum 10-class tự nhận "khớp H24 §2(1) 5+5" — SAI, và đánh rơi 1 dấu-hiệu sàn**
- what: v2:168 `flag_classes` = 10. Lane D (`sub-investigator-codebase-D.md:111-117`) = **11 class**, trong đó tách carry thành `carry-dropped`+`carry-overage` là CÓ CHỦ-ĐÍCH (đo được caveat (b)). Broadcast H24 :48-49 đếm 5 dấu-hiệu MISSING: **"một việc rớt khỏi khối work-state so với backlog"** là 1 dấu-hiệu RIÊNG, còn carry (rớt-hẳn/quá-già) là MỘT bullet. v2 giữ carry-tách-đôi NHƯNG bỏ hẳn `workstate-item-dropped` để về 10 rồi tuyên "khớp 5+5" — thành ra lệch CẢ broadcast lẫn lane D.
- WHY nặng: mất đúng class bắt ca F1 của chính SE (S118 chạy 7-spawn mà 0 run-folder = việc rớt khỏi sổ). Enum ĐÓNG nghĩa là 2 vai mới VĨNH VIỄN không được phép phát class này.
- FIX: khôi phục class work-state-drop (11 class, hoặc 10 đúng broadcast bằng cách gộp lại carry — nhưng lane D đã cho lý-do đo-được để tách); xoá câu "khớp 5+5". VERIFY: flag_classes ⊇ {workstate-drop, carry-dropped, carry-aged, owner-specifics, decision-sunk, underfill}.
**M1 · Owner-decisions PA-2: bullet "param `model:` chỉ nhận enum alias" dán nhãn "Đo" nhưng không nêu phép đo** — 2 bullet kia tự verify được (hmw.js:44 ✓; grep full-id ✓ tôi đo lại đúng 5 hit ở 3 file như liệt kê), riêng bullet này là tiền-đề làm PA-2-nguyên-bản thành "BẤT-KHẢ-THI" ⇒ đổi hình-thức một quyết định anh đã chốt. FIX: ghi phương pháp đo (hoặc hạ nấc "theo tài-liệu harness, chưa thử full-id") + 1 câu AskUser xác nhận anh duyệt hình-thức PA-2a/2b trước khi W2 land `TIER2_EXPECTED_FULL_ID`.
**M2 · Hook-interlock chưa được phân loại khung** — v2 xếp R3-side-ref = VƯỢT KHUNG phải request (đúng nguyên-tắc anh S119), nhưng chính v2 sửa `wal-flush.ps1` (thêm skip khi rebase-state) mà không phân loại vs floor N.2 (`harness-11-engine.md:406` — hook "ĐƯỢC làm đúng 2 việc"). Lý-lẽ "interlock bảo vệ chính floor" là tốt — nhưng nguyên-tắc mới nói rõ "dù lý-lẽ tốt". FIX: 1 đoạn phân loại tường-minh (đề xuất: trong-khung vì không thêm hành-vi cấm, chỉ chặn commit lên detached HEAD = chống tự-hủy) + khai ở adap-report; nếu anh muốn chặt: 1 câu ack.
**m ·** (a) "4 cú lật" giữ nguyên nhãn dù v2 đã tự hạ L2→PARTIAL, L3→CHƯA-VERIFY (2/4 đo chắc, 1 treo, L4 là diễn-giải văn bản — hợp lệ vì đích đến là request chứ không tự làm); (b) §3.7 kế thừa "H23 §2(5) n-a ĐÃ THOẢ" = dán nhãn PASS thành n-a (R2-m4) — under-report nấc tuân thủ khi gửi hub; (c) R4-request ghi "W0.6 sẽ trả lời — báo hub sau" trong khi W0.6 chạy TRƯỚC W6 → nên nhét thẳng verdict probe vào request; (d) dòng 70 vs §3.9 tự-mâu-thuẫn chữ "KHÔNG vào §3.9".
**Tỷ lệ claim (mẫu ~30 claim rời tôi re-đo):** ~80% ĐO ĐƯỢC-và-đúng (K/NONWAL/57/0-188/13-18-0hit/54×4/STATUS rows/full-id 5-hit/hook fail-open/regex-match/orphan 8-13...), ~13% SAI — tập trung trọn ở lớp meta-count/coverage (finding-count ×3, enum-khớp ×1), ~7% SUY DIỄN hoặc CHƯA-VERIFY. Điểm sáng thật: 4/5 chỗ CHƯA-VERIFY được khai đúng nấc (L3, precedence, side-ref, hot-reload hmw.js); điểm tối: 2 chỗ SUY DIỄN được trình như ĐO (enum-"khớp", param-alias).
---
## TRỤC 3 — Verdict + FIX BẮT BUỘC trước wave
Không còn đường **mất việc / rewrite-pushed-history**: mass rm+checkout bị cấm, nhánh A + assert `HEAD~K==origin/main` chặn tụt dưới remote, interlock + trap + hard-rule chặn detached-HEAD, không force-push ở đâu, O4 giữ 57. Deadlock hạ cấp thành STOP fail-loud — nhưng STOP này **gần như chắc chắn xảy ra ở W6** nếu không vá fix #3. W0 SOLO: ĐÚNG phải SOLO (phẫu thuật index + reset + restart; fan-out sẽ làm hook commit agent-memory giữa lúc mổ). Owner-decision: không thấy chỗ nào v2 tự quyết CON SỐ/policy của anh; 2 chỗ cần ack tường-minh nêu ở fix #7-#8.
**FIX BẮT BUỘC (spec-v3, không cần chạy lại lane):**
1. **Enum:** khôi phục class work-state-drop + xoá câu "khớp 5+5" (TRỤC 2 C2). Acceptance: flag_classes phủ đủ 5 dấu-hiệu MISSING của broadcast :26/:48-49, carry-tách-đôi khai là mở-rộng lane-D.
2. **Provenance:** bảng disposition 23 C+M + sửa count (TRỤC 2 C1) — cùng nội dung vào adap-report. Acceptance: mỗi finding 1 dòng trạng-thái; "19 finding" = 0 hit.
3. **Luật fold leading-wal: cho §5.2/W6:** (a) W0.3 bỏ "commit-chốt ở W6" — commit-chốt [CLAUDE] NGAY CÙNG TURN với `reset --soft` (gộp luôn edit `wal-flush.ps1` + `.gitattributes`) để đáy range là commit thường; (b) mọi push sau push#1 trong W6 (adap-report...) = write→commit→squash→count→push CHAINED cùng 1 lượt; (c) luật tổng quát: wal: ở đáy range → `reset --soft origin/main` re-commit, KHÔNG rebase. Acceptance: fault-inject cây tạm shape `base + wal + CLAUDE + wal×2` → chained block ra n=0, tree-identical, KHÔNG STOP.
4. **Sàn-3 dual-accept + W0.5 scope:** chép verbatim mệnh-đề C8 (`workflows/README.md:19-20`) vào văn bản canonical Sàn-3 @tiep.md; W0.5 đổi mtime → `git log -1 --format=%cI -- <folder>` so mốc `3fde8af` (2026-07-14T16:29:55+07). Acceptance: scan mới trên cây hiện tại = đúng {S119} sau khi đóng 7; 5 folder h10/h910 im.
5. **Tripwire mirror `:116`:** điều kiện = `const w = (A.run&&A.run.dir)?A.run:((A.wave&&A.wave.dir)?A.wave:null); if (A.taskList.length>=3 && !w) throw` — bỏ đòi `.name` (hoặc nâng contract :116 trong CÙNG edit). Acceptance thêm vào §3.9: ≥3-task kiểu `wave:{dir}` vẫn chạy; thiếu cả hai → throw.
6. **Roster-sweep:** acceptance đổi sang Grep-tool pattern `(12|9)[- ](agent|sub)|roster 12|12 vai|VALID_ROLES[^0-9]*12`; đưa `ultra-on.md:24` (danh sách VALID_ROLES 12→14, CÙNG COMMIT W2 vì là routing-doc), `hmw.js:9` meta 9-agent (gộp vào 1-EDIT W2), `fable-real.md`/`fable-real-runbook.md` vào wave. Acceptance: sau W3 pattern trên 0 hit sống (ngoài lịch-sử/archive).
7. **Bug shell dòng guard W0.3** (`[ -d .git/rebase-merge ] || [ -d .git/rebase-apply ] && {...}`): happy-path (không có dir nào) trả **exit 1** (status của chuỗi ||) → caller check exit-code sẽ báo hỏng giả. Đổi sang dạng `if ... ; then ... ; fi`. Acceptance: chạy block trên repo sạch → exit 0.
8. **2 ack tường-minh:** (a) anh duyệt hình-thức PA-2a/2b (M1); (b) phân loại hook-interlock vs N.2 ghi vào spec + adap-report (M2). Acceptance: owner-decisions có dòng ack / spec-v3 có đoạn phân loại.
Khuyến nghị không-chặn: ghi rõ W0.6 và post-W2 RESTART nối lại bằng `/tiep` (H22 — 2 lần restart nghĩa là wave trải ≥3 phiên CLI); nhét verdict W0.6 vào R4-request thay "báo sau"; 1 dòng "broadcast #7 presence-not-age đã adopt S115" (R2-m1); đổi nhãn "n-a ĐÃ THOẢ"→"đã thoả"; lịch stamp-mark vào W6 (R2-m5); validator W1② chạy glob thay hardcode 12; bổ sung acceptance W0.4 + EOL-assert-scoped-cạnh-push + W6 vào §3.9.
---
## REFUTATION LOG — claim tôi đã thử phá mà KHÔNG phá được
1. **Regex anchor v2** — tấn công em-dash/escape/format: match byte-thật cả 2 positive-control (`permission-matrix/SKILL.md:16`, `form-engine/SKILL.md:15`). ĐỨNG.
2. **"0 full-id sống trong .claude"** — grep lại: đúng 5 hit ở 3 file, đều comment-lịch-sử/outage-path/gỡ-pin như owner-decisions liệt kê. ĐỨNG.
3. **"Scoped EOL = 0 xanh sẵn / repo 188"** — đo lại: 0 / 188. ĐỨNG.
4. **"hmw.md không tồn tại; 18 command; args.run = 0"** — đo lại đủ 3. ĐỨNG.
5. **"Hook fail-open 0 guard"** — đọc `wal-flush.ps1:1-19`: catch{} + exit 0 + không guard rebase. ĐỨNG (và phát hiện thêm: commit **pathspec 3 path** — chính chi tiết này làm lộ lỗ fold ở fix #3).
6. **"8/27 orphan, 7 tồn-đọng"** — scan độc lập: naive 13, dual-accept 8, 5 h10/h910 có `harvest/*-synthesis.md`. Số ĐÚNG; hỏng là mệnh-đề bị rơi khỏi canonical (fix #4).
7. **"57 wal: đã lọt + §5.0 chỉ-đuôi"** — đếm lại 57 ✓; `session-end.md:112-113` verbatim đúng như trích. ĐỨNG.
8. **Nhánh A an toàn với K drift** — thử phá bằng kịch bản K quá lớn/quá nhỏ: assert `HEAD~K==origin/main` + tính runtime chặn cả hai; NONWAL idiom `grep -vc || true` in "0" đúng cả ca all-wal lẫn range rỗng. KHÔNG phá được (lỗ duy nhất còn = leading-wal: tại W6, đã báo ở fix #3).
9. **"Policies = 216"** — `MenuKeys.cs` 54 `public const string` × `Actions[4]` (`:167`) = 216. ĐỨNG.
10. **"Sub-agents row 12 / thiếu row Policies trong STATUS"** — grep: `:24` = **12**, không có Policies. ĐỨNG (fix R3-M2 của v2 là cần thật).
Token cost: ~72K in / ~14K out.

View File

@ -0,0 +1,111 @@
# Lead-evidence — soi HUB trực tiếp (em-main tự đo, KHÔNG qua lane)
> Nguồn: đọc repo `D:\Dropbox\CONG_VIEC\AI_INFRA` (read-only, §J2 chỉ-ghi-repo-mình). Ngày đo **2026-07-15**.
> Mục đích: (a) trả lời owner-decision #2 "xem cách làm của hub" · (b) đối chứng tiền-đề H23 cho lane C.
---
## A. Owner-decision #2 — hub xử 57-wal thế nào?
### A.1 Số đo hub (live)
| Trục | Hub | SE |
|---|---|---|
| `wal:` trên `origin/main` (ĐÃ lọt) | **1** | **57** |
| `wal:` chưa đẩy (`origin/main..HEAD`) | **2** | **3** |
**Hub KHÔNG dọn cái đã lọt.** Giữ nguyên 1 commit trên remote.
### A.2 Phương pháp hub (trích commit log)
- `2c21bed`: "GUARD-5.2 dogfood-trọn (**23-wal-xen-kẽ → anh-chốt-A rebase-drop → fold-residual → verify-0-byte → push 7-mốc N=0**)"
- `5114519`: "CODIFY wal-xen-kẽ (**anh-chốt-A AskUserQuestion ×2: REBASE-DROP giữ mốc đích-danh + máy-verify tree-identical** — §I4 + session-end-5.0 + mark `RC-pqhuy1987-14-07-2026-09-16-24` Active-High, partial-supersede AC5-s89 vế xen-kẽ)"
**Quy trình hub = 5 bước:**
1. REBASE-DROP các `wal:` **chưa đẩy****giữ mốc đích-danh** (commit `[CLAUDE]` thật)
2. **Máy-verify tree-identical** (chứng minh drop `wal:` KHÔNG đổi nội dung)
3. fold-residual
4. verify-0-byte
5. push khi **N=0**
**Owner-gate:** `anh-chốt-A` qua **AskUserQuestion ×2** + mark **`RC-pqhuy1987-14-07-2026-09-16-24` Active-High**.
### A.3 → Khuyến nghị cho SE (khớp hub, chờ anh ký)
- **3 chưa đẩy** → rebase-drop/squash + máy-verify tree-identical + push khi N=0. **Được** (chưa đẩy = không vi phạm "cấm rewrite đã-đẩy").
- **57 đã lọt remote** → **ĐỂ NGUYÊN**, y hub. Rewrite = vi phạm hard-safety H22 + 57 commit trên remote chung = rủi ro cao. Guard chỉ chặn TƯƠNG-LAI.
### A.4 ⚠️ 2 cảnh báo đắt từ hub (họ đã trả giá)
- **`E-029`** — "wal-squash-run-đầu (**verify-mốc-sai ca-fold-uncommitted** → reflog-recover 100%)": lần chạy squash ĐẦU TIÊN họ **verify nhầm mốc → nuốt work chưa-commit**, cứu bằng reflog. → SE PHẢI: verify mốc đích-danh + check `git status` sạch TRƯỚC khi rebase-drop.
- **`E-030`** — "CRLF-agent-registry-loss — phát hiện + RCA + kết tinh spec (**EXECUTE defer s95 per anh**)": hub **CHƯA execute xong** chính cái CRLF họ vừa broadcast. → SE adopt là đi TRƯỚC hub ở khối này; đừng giả định hub có sẵn mẫu chạy được.
---
## B. Tiền-đề H23 — ĐỐI CHỨNG (material cho lane C + owner-decision #1)
### B.1 Hub PIN, không inherit (đo trực tiếp frontmatter)
```
17/17 agent hub → model: claude-opus-4-8 (PIN full-id)
ngoại lệ: librarian, scout → model: sonnet (helper rẻ)
SE 12/12 agent → model: inherit
```
Hub roster (17) gồm: adoption-tracker · agent-ops-monitor · architecture-watch · cicd-monitor · fable-clone-aggregator · harness-audit · harness-eval · harness-refine · harvest-curator · implementer · investigator · **lead-gap-auditor** · **lead-stale-auditor** · librarian · reviewer · scout · tooling-auditor.
> 📌 `lead-gap-auditor` + `lead-stale-auditor` **đã tồn tại ở hub** = chính 2 vai H24 §2(1). Tên tham chiếu cho lane D (SE tự-quyết tên — H24 §3(e) "tên vai = FORM tự-quyết").
### B.2 Chuỗi model-tier — 3 bản, drift 3 chiều
| Bản | Ngày | Nói gì | Nấc |
|---|---|---|---|
| **H8** all-inherit | 2026-06-16 | mọi sub → `inherit` (ăn top-tier lead) | SE ghi: "🔴 **BẮT BUỘC** (anh-chốt, **mọi sister**; chất lượng trên chi phí)" |
| **model-tier-v2-pin-simple** | 2026-07-03 | hub đổi FORM sang pin. **"Không có mandate mới; các đội KHÔNG bắt buộc làm theo"** · **"Danh sách trợ lý nào ở tầng model nào = FORM mỗi đội tự quyết"** · **"cả hai đều đạt sàn miễn là đội trưởng ở model cao nhất và việc nâng-hạ tầng là có kỷ luật"** | `supersedes_scope: none` |
| **H23** explicit-model-at-spawn | 2026-07-13 | §1: "chuỗi model-tier trước đã chốt... **mọi sub có bộ-nhớ chạy ở worker-tier gán-cứng**" + §2(1) "**KHÔNG dựa vào fallback ngầm — không dựa 'kế-thừa từ lead'**" + §2(2) "giữ pin ở tệp định-nghĩa làm **tầng-2**" | hub nội-bộ = `H8.6e` (commit `9bb5701`) |
### B.3 Phân tích (lead)
**SÀN THẬT** (theo pin-simple — bản mới nhất phát biểu tường minh về sàn):
1. lead = model cao nhất ✓
2. việc nâng-hạ tầng **có kỷ luật** (chống class "quên hạ tầng")
**FORM** (sub nào ở tầng nào) = **mỗi đội tự quyết** — pin-simple nói thẳng.
**SE all-inherit ĐẠT SÀN:** lead frontier ✓ · all-inherit = **100% tất định, KHÔNG có điểm quyết-theo-tác-vụ nào** ⇒ class "quên hạ tầng" **không thể tồn tại** (chính là lỗi mà pin-simple sinh ra để chống — SE đóng nó bằng đường khác).
**SE nằm TRONG khung, KHÔNG vượt khung** (theo nguyên tắc anh chốt S119: "điều chỉnh trong cho phép" = OK, không cần request cho việc lệch form).
**DEFECT nằm ở H23 §1**, không ở SE: nó phát biểu **FORM riêng của hub** ("mọi sub chạy worker-tier gán-cứng") **như thể là SÀN đã chốt**, mâu thuẫn trực tiếp với pin-simple ("form mỗi đội tự quyết", "cả hai đều đạt sàn"). Sister đọc H23 theo nghĩa đen → tưởng **phải bỏ all-inherit**.
**Trầm trọng hơn:** H8 (06-16) tuyên all-inherit **"BẮT BUỘC mọi sister"**. Nếu pin-simple đã nới thành "form tự do" thì **H8 chưa từng được retract tường minh**; nếu H8 vẫn sống thì **H23 mâu thuẫn với chính H8**. Fleet đang giữ **3 phát biểu không tương thích** về cùng một trục.
### B.4 H23 §4 project-fit — escape hatch CÓ SẴN
> "**Hệ chỉ dùng MỘT model duy-nhất cho mọi sub:** điểm (2) và (3) **rút gọn**... nhưng bạn **vẫn nên làm (1) và (5)**."
SE = "một model duy nhất cho mọi sub" (dynamic = lead). ⇒ **(2)(3) rút gọn · (1)(5) vẫn áp**:
- **(1)** ghi model tường-minh tại spawn-site → SE dùng **ghi-chú-đầu-cây** (H23 §2(1) khuyến nghị chính xác cách này cho cây điều-hướng nhiều nhánh): 1 note ở đầu `agents/README.md` decision-tree + `hmw.js` + commands, KHÔNG lặp inline N nhánh.
- **(5)** kỷ-luật động-từ: grep tài liệu SE tìm chỗ viết "enforce/cơ-giới-hoá" sai nấc.
**SE adopt được H23 mà KHÔNG bỏ H8.** Không phải chọn-một.
---
## C. Kết luận lead → 3 owner-decision
| # | Câu hỏi | Bằng chứng | Đề xuất (chờ anh) |
|---|---|---|---|
| 1 | H23 ⟂ H8 | pin-simple: form tự-quyết, cả 2 đạt sàn · H23 §4 escape hatch · hub tự pin nhưng broadcast inherit | **GIỮ H8 all-inherit** (trong khung) + adopt H23 (1)(5), (2)(3) n-a-reasoned → **`/adap-request`** yêu cầu AI_INFRA **reconcile H8 ⟂ pin-simple ⟂ H23** + re-broadcast cho sister (anh-directed) |
| 2 | 57 wal: lọt remote | hub giữ nguyên 1/1 · rebase-drop CHỈ cho chưa-đẩy · mark `RC-…14-07-2026-09-16-24` | **3 chưa đẩy → drop + tree-identical verify.** **57 đã lọt → ĐỂ NGUYÊN** (khớp hub) |
| 3 | số nhịp H24 | — | anh đã đồng ý adopt; **số = quyền anh**, em đề xuất ở spec, anh ký |
---
## D. Nấc trung thực
- Số ở A.1/B.1 = **đo live 2026-07-15**, lặp lại được bằng lệnh trong bảng.
- Trích commit-message hub = **verbatim từ `git log`**, KHÔNG diễn giải.
- **CHƯA verify:** hub có `spawn_model_audit` script không (`ls scripts/ | grep -i spawn|model` = rỗng) dù `9bb5701` nhắc "spawn_model_audit LIVE 29-dispatch/0-mismatch" → có thể ở đường dẫn khác hoặc tên khác. **Không kết luận.**
- Hub `.claude/settings.json` = 132B có wire `wal-flush` (grep=1) → hook hub **ĐÃ live** (file `settings-hooks-entry.STAGED.json` chỉ là bản mẫu sót lại).
- Đọc repo hub = **read-only**; SE KHÔNG ghi gì sang đó (§J2).

View File

@ -0,0 +1,126 @@
# OWNER-DECISIONS — S119 adap 6 broadcast (2026-07-15)
> ## ✅ ACK CUỐI PHIÊN (anh ký S119, sau cổng-cuối `wf_cb964f83-331` GO-WITH-FIXES fix#8)
>
> **(a) PA-2 hình-thức — ✅ "stamp đồng ý".** Anh duyệt PA-2 thực-thi bằng **PA-2a** (hằng-số `TIER2_EXPECTED_FULL_ID = 'claude-opus-4-8'` cạnh `resolveModel`, `hmw.js`) **+ PA-2b** (`scripts/spawn-model-audit.ps1` so model-thực-tế-resolve vs kỳ-vọng, informational, lệch ⇒ owner quyết re-pin) — **THAY** neo-tại-spawn.
> 🔸 **Nấc trung-thực GIỮ NGUYÊN khi báo hub (gate-M1 bắt, KHÔNG được xoá):** tiền-đề *"param `model:` chỉ nhận enum alias `sonnet|opus|haiku|fable`"* = **đọc tài-liệu harness (Agent-tool schema)**, **CHƯA thử truyền full-id để xem có bị từ-chối không**. Anh duyệt hình-thức **trên tiền-đề đã khai đúng nấc này**. Nếu W2 thử full-id mà harness **nhận** ⇒ báo lại anh (tiền-đề sai ⇒ PA-2 có thể về hình-thức nguyên-bản).
>
> **(b) Hook-interlock vs floor N.2 — ✅ đồng ý.** Phân loại **TRONG KHUNG**: interlock (`Test-Path .git/rebase-merge → exit 0` đầu `wal-flush.ps1`) **KHÔNG thêm hành-vi** cho hook — nó **thu hẹp**, chặn hook **tự-hủy** (commit lên detached HEAD = phá chính floor N.2 mà nó phục-vụ). ⇒ **KHÔNG cần adap-request**; **khai ở adap-report**.
> ⇒ Đối-chiếu: **R3 side-ref VẪN = VƯỢT KHUNG** (lệch N.2 *"git add 3 path + git commit"* = **đổi cơ-chế persist**) ⇒ **PHẢI request**. Ranh-giới: *thu-hẹp-để-tự-bảo-vệ* = trong khung · *đổi-cơ-chế* = vượt khung.
>
> **⇒ fix#8 ĐÓNG.** Gate-blocker còn lại của cổng-cuối = **0**. Wave W0→W6 **được phép chạy** (phiên sau, per anh chốt B).
> Anh (project-owner) chốt trong phiên. Lead ghi (B3 single-writer). **Merge vào spec §3.4 sau khi review xong** (không sửa spec lúc 4 reviewer đang đọc = tránh race).
---
## Nguyên-tắc governance MỚI anh đặt ra (S119) — 🔴 rộng hơn 1 câu trả lời
> **"Kiến-trúc harness thì phải GIỐNG, nhưng cho phép điều-chỉnh TRONG cho phép; nếu điều-chỉnh VƯỢT KHUNG thì phải có REQUEST để anh và AI_INFRA review qua. Cái này cũng nên REPORT lại cho AI_INFRA tổng-hợp và broadcast lại cho các Project-Sister khác nắm và update."**
**Diễn giải thành luật vận-hành (lead đề-xuất, chờ anh xác nhận wording):**
| Nấc | Nghĩa | Hành-động |
|---|---|---|
| **Trong khung** | Lệch **FORM** mà broadcast tường-minh cho phép tự-quyết | Tự làm, khai ở adap-report |
| **Vượt khung** | Lệch **FUNCTION-FLOOR** (dù có lý-lẽ tốt) | 🔴 **KHÔNG tự làm**`/adap-request` → anh + AI_INFRA review |
| **Phát-hiện khung tự mâu-thuẫn** | Broadcast A ⟂ broadcast B trên cùng trục | 🔴 **Report** → hub tổng-hợp → **re-broadcast fleet** |
**Áp ngay lượt này:**
- SE all-inherit vs H23 = **TRONG khung** (pin-simple: *"form mỗi đội tự quyết"*, *"cả hai đều đạt sàn"*) ⇒ KHÔNG cần request cho việc lệch form.
- **R3 side-ref** (hook → `refs/wal/snapshot`) = **VƯỢT KHUNG** (lệch N.2 floor *"git add 3 path + git commit"*) ⇒ 🔴 **PHẢI request, CẤM tự làm** — đúng nguyên-tắc anh vừa đặt.
- **R1 (H8 ⟂ pin-simple ⟂ H23)** + **R4 (EOL nhân-quả sai + mô-hình thiếu)** = **khung tự mâu-thuẫn / khung sai** ⇒ report để hub tổng-hợp + re-broadcast sister.
---
## Q1 — H23 mức-độ adopt → ✅ **PA-2** (anh chốt)
**Anh chọn:** `PA-2 (PA-1 + neo full-id cho tier:'opus' → chặn Opus đời sau trôi)`
### 🔴 RÀNG-BUỘC KỸ-THUẬT — PA-2 **đúng-như-chữ là BẤT-KHẢ-THI**; lead báo trước khi thực-thi
**Đo (lead, 2026-07-15):**
- `hmw.js:44``if (tier === 'fable' || tier === 'opus') return tier` ⇒ trả **ALIAS**, không phải full-id.
- Param `model:` tại điểm spawn (Workflow `agent()` opts.model) **chỉ nhận enum alias** `sonnet|opus|haiku|fable`**KHÔNG nhét full-id vào được**.
- `grep "claude-opus-4-8" .claude/` (trừ agent-memory + runs) ⇒ **0 full-id SỐNG**; chỉ còn: `agents/README.md:3/:9/:12` (comment **lịch-sử**), `session-start.md:41` (đường **outage** H5), `hmw.js:36` (comment *"KHÔNG còn demote-pin"*).
- ⇒ SE **không có tệp-định-nghĩa nào mang full-id** (12/12 = `inherit`, đúng H8) ⇒ **không có chỗ neo theo cách H23 mô tả** (*"thẩm-quyền phiên-bản = full-id ở tệp định-nghĩa"*).
**⇒ Kết-luận:** "neo full-id **TẠI điểm spawn**" = **không làm được**. Đây **KHÔNG phải** lý-do bác PA-2 — mà là **đổi HÌNH-THỨC** thực-thi cho đúng ý-định anh.
### ✅ PA-2 khả-thi — theo đúng đơn thuốc của CHÍNH H23 §2(2)
> H23 §2(2) nguyên-văn: *"Alias tại điểm spawn chỉ khoá **họ model**, không khoá được phiên-bản. Vì vậy, khi nhà-cung-cấp phát-hành model kế-tiếp trong cùng họ, alias có thể **trôi** sang model mới: bạn PHẢI **soi model-thực-tế được resolve** (đọc metadata của lượt chạy) TRƯỚC khi tin, và nếu lệch → **owner quyết re-pin**."*
**PA-2-SE = 2 phần:**
| Phần | Việc | File | Acceptance ĐO ĐƯỢC |
|---|---|---|---|
| **PA-2a** — khai báo kỳ-vọng | Hằng-số có thẩm-quyền `TIER2_EXPECTED_FULL_ID = 'claude-opus-4-8'` đặt **ngay cạnh `resolveModel`** (`hmw.js:~43`), kèm comment: *"alias `'opus'` khoá HỌ, KHÔNG khoá phiên-bản (H23 §2(2)); hằng-số này = phiên-bản KỲ-VỌNG; lệch ⇒ owner quyết re-pin (anh-chốt S119 PA-2)"*. ⚠️ **KHÔNG** `[1m]` suffix (gotcha #37) | `hmw.js` | `Grep tool` `TIER2_EXPECTED_FULL_ID` ⇒ ≥1 hit; giá-trị = `claude-opus-4-8` |
| **PA-2b** — check resolved-vs-expected | `scripts/spawn-model-audit.ps1`**chỉ-đọc**, rà transcript **phiên hiện-tại** (`C:\Users\pqhuy\.claude\projects\<proj>\<sess>\subagents\workflows\wf_*/agent-*.jsonl`), đối-chiếu model-thực-tế-resolve vs `TIER2_EXPECTED_FULL_ID`. **Informational, KHÔNG chặn** (H23 §2(4)). Lệch ⇒ in cờ ⇒ **anh quyết re-pin** | `scripts/` MỚI | Chạy trên phiên có lane `tier:'opus'` ⇒ in `{n dispatch · n explicit · n mismatch}`; **fault-inject**: giả expected = `claude-opus-9-9`**PHẢI FLAG** (không chỉ happy-path PASS) |
**🔴 3 khai-thật BẮT BUỘC giữ khi báo hub (H23 §2(4) tự yêu-cầu):**
1. Đây là **phép soi theo quy-ước (spot-check)**, **KHÔNG enforcement** — runtime **không chặn**.
2. Quét **lịch-sử cũ** sẽ ra rất nhiều "thiếu tham-số" từ **trước quy-ước****bình-thường, không phải bão lỗi** ⇒ chỉ nhìn **phiên hiện-tại**.
3. Báo-cáo của nó **KHÔNG được đọc thành "đã áp đủ sàn"** — nó chỉ đo **tính-tường-minh trong transcript**, không đo độ-phủ tài-liệu.
**+ giữ nguyên PA-1 (a)(b)(c)(d)** như spec §2.3.
**🔸 Lệch hub (khai ở adap-report):** hub neo full-id **ở frontmatter** (17/17 `model: claude-opus-4-8`) — SE **không thể** (H8 = `inherit`, lệnh anh S66). SE neo ở **hằng-số + audit-check**. **Cùng FUNCTION** (chặn alias-drift), **khác FORM****TRONG khung** (pin-simple: form tự-quyết) ⇒ **không cần request**, chỉ khai.
---
## Q2 — Số nhịp H24 → ✅ **6 / 15 / 3** (anh chốt, "tương tự Hub")
| Nhịp | Số | Ghi-chú |
|---|---|---|
| **rà-nhẹ** | mỗi **6** phiên | |
| **rà-sâu** | mỗi **15** phiên | |
| **jump-K** | 1 class-flag lặp **3** lần ⇒ nhảy rà sớm | |
**Nơi đặt (single-source — H24 §2(3) *"mọi số đọc từ config single-source; tài-liệu/persona TRỎ key, KHÔNG chép số"*):**
- Key mới trong `.claude/agent-memory/memory-budget.json` → block `h24_cadence: { light_every: 6, deep_every: 15, jump_on_class_repeat: 3 }`.
- ⚠️ **Bẫy đã biết (lane E):** Stop-hook `wal-flush.ps1:7` auto-commit `agent-memory/` **mỗi turn** ⇒ counter **KHÔNG** để dạng blind-increment ⇒ **content-based** `last_ticked_session: "S119"` + idempotent-key = **HEAD commit-sha @tick**.
- State counter tách riêng: `.claude/governance/.session-counter.json` (mẫu sẵn: `.archive-strikes.json` · `.mfe-state.json`).
**🔸 Khai-thật giữ khi báo hub:** hub dặn *"số của bạn = config của bạn; **đừng chép ba con-số này**"*. SE **chọn trùng hub (6/15/3)****anh-chốt có chủ-đích** làm **khởi-điểm**, KHÔNG phải chép-vô-thức; điều-chỉnh sau **chu-kỳ-2** (H24 caveat (c): *"giá-trị delta thật chỉ xuất-hiện từ run-2"*).
---
## Q3 — Quy-ước khoá carry → ✅ **Đồng ý** `[carry:<slug>]`
**Format:** gắn cuối mỗi mục NEXT trong `docs/HANDOFF.md` mega-line.
**Ví-dụ:** `(2) quyết binh.le … [carry:binh-le-decision]` · `(3) 2 account trùng … [carry:account-trung-le-thanh-binh]`
**Vì sao cần (GAP-2, lane D):** carry SE hiện là **văn-xuôi KHÔNG khoá** ⇒ detector tuổi-carry **không chạy được** (không có gì để track qua các phiên).
**Định-nghĩa "dòng-carry" (🔴 lane D — SE-specific):** = **đoạn LOGIC `NEXT anh` / `NEXT em` BÊN TRONG mega-line**, **KHÔNG** phải dòng vật-lý (mega-line = 46,735 ký-tự/1 dòng ở `HANDOFF.md:5`).
**Luật đếm (H24 §2(2)):** khoá sống qua **≥ M dòng-carry LIÊN-TIẾP gần nhất** ⇒ flag "quá tuổi" (M = `h24_cadence` config). Chuỗi tính **trên các dòng CÓ carry**; phiên không phát dòng carry ⇒ **KHÔNG phá chuỗi**. Reset **CHỈ** khi khoá **vắng trên một dòng CÓ carry** (= việc đã xong/bỏ). Cụm **owner đang chủ-động giữ** ⇒ tag **INFORM-only** (khỏi thành nhiễu).
**Backfill:** gắn `[carry:*]` cho carry **đang sống**`HANDOFF.md` (binh.le · account-trùng · PE-phân-quyền · BVAAU ×2) — **KHÔNG** truy-ngược lịch-sử (no-retrofit).
---
## Q4 — 57 wal: đã lọt remote → ✅ **KHÔNG DỌN** (anh đã đồng ý)
Giữ nguyên. 3 lý-do → spec §3.5 (nặng nhất: **rewrite = tự vô-hiệu-hoá bằng-chứng VERIFIED-RUNTIME của chính H22**`12071c5` cited 12 file + `67be443` cited 10 file = 2 commit chứng-minh hook-FIRE ở `engine:407` **và trong adopt-report ĐÃ GỬI hub**).
---
## Δ tác-động lên spec (merge sau review)
| Mục spec | Đổi |
|---|---|
| §3.4 O1 | ⚪ chờ → ✅ **PA-2** + **thêm §2.3-bis PA-2a/PA-2b** (hình-thức đổi: hằng-số + audit, KHÔNG neo-tại-spawn) |
| §3.4 O2 | ⚪ chờ → ✅ **6/15/3** + key `h24_cadence` trong `memory-budget.json` |
| §3.4 O3 | ⚪ chờ → ✅ `[carry:<slug>]` + định-nghĩa dòng-carry = đoạn LOGIC |
| §3.4 O4 | ✅ giữ |
| §2.3 | +PA-2a/PA-2b (2 việc mới: `hmw.js` hằng-số · `scripts/spawn-model-audit.ps1` MỚI) |
| §3.2 xung-đột | `hmw.js` **3 → 4 hạng-mục** (Sàn-1 gate · VALID_ROLES 12→14 · H23 note-đầu-cây · **+PA-2a hằng-số**) ⇒ vẫn **GỘP 1 EDIT** |
| §3.3 wave | **W1 +1 lane**: `scripts/spawn-model-audit.ps1` (disjoint, song song được) |
| §3.6 | R1/R2/R4 giữ · **R3 = VƯỢT KHUNG ⇒ bắt buộc request** (nguyên-tắc anh S119) |
| §3.7 n-a | **H23 §2(4) bộ-soát: "n-a chưa dựng" → GỠ** — PA-2b **dựng thật** |
| §3.9 | +3 acceptance: `TIER2_EXPECTED_FULL_ID` ≥1 hit · spawn-audit fault-inject FLAG · `h24_cadence` đọc từ config (0 hardcode) |
**Nấc sau PA-2:** `executed → restart-then-verify` (hmw.js = .js **không** phải command → hot-reload? **CHƯA VERIFY**`hmw.js` nạp lúc Workflow chạy ⇒ **khả năng ăn ngay**, nhưng ENV-DEPENDENT ⇒ verify bằng run thật, không giả-định).

View File

@ -0,0 +1,56 @@
# Run — S119 adap 6 broadcast AI_INFRA
- **run-id:** `2026-07-15-S119-adap-6-broadcast`
- **date:** 2026-07-15 · **session:** S119 · **branch:** main
- **lead:** em-main (Opus 4.8 1M Max — owner-choice per MTv3, KHÔNG outage)
- **engine:** `/fable-clone investigator-codebase` — ENSEMBLE tier-2, N=5 lane CÙNG 1 vai (multi-lens), RETURN-only
- **mode:** RUN-TRACE (sàn H22 S111 — run ≥3 task HOẶC >5' = BẮT BUỘC)
- **Sàn-1 dogfood (H22 wal-defect-fix, 2026-07-13):** marker phục-hồi ĐÃ đăng-ký ở `.claude/WAL.md` dòng `wf:` **TRƯỚC** khi phóng (positive-assertion @launch).
## Đề-bài
SE đối ứng **6 broadcast mới** (check-email S119, 7 file copy hash-verify 7/7):
| # | Broadcast | type |
|---|---|---|
| 1 | `2026-07-13-Governance-harness-23-explicit-model-at-spawn` | update |
| 2 | `2026-07-14-Governance-harness-24-lead-self-audit-h17-cadence` | new |
| 3 | `2026-07-13-Governance-harness-22-wal-defect-fix` (5 sàn) | update |
| 4 | `2026-07-13-Governance-adap-update-harness-22-wal-push-guard` | update |
| 5 | `2026-07-15-Governance-eol-crlf-agent-registry-defect-notice` | update |
| 6 | `2026-07-14-Governance-owner-sign-3-marks-h21-mtv3-h22` | notify |
## Phơi-nhiễm SE — ĐO THẬT bởi lead trước khi phóng (ground-truth cho mọi lane)
| Trục | Số đo | Lệnh |
|---|---|---|
| push-guard chưa-đẩy | **n = 3** | `git log --format='%s' origin/main..HEAD \| grep -c '^wal:'` |
| wal: ĐÃ LỌT remote | **57** | `git log --format='%s' origin/main \| grep -c '^wal:'` |
| autocrlf | **true @ system** (`C:/Program Files/Git/etc/gitconfig`) | `git config --show-origin --get-all core.autocrlf` |
| file lật EOL | **188** (131 = Migrations) | `git ls-files --eol \| grep -c 'i/lf.*w/crlf'` |
| agent CR bytes | **0/13** (blob + worktree) | `git cat-file -p HEAD:<f> \| tr -cd '\r' \| wc -c` |
| agent description style | **12/12 block-scalar `\|`**`: ` trigger N/A | — |
| `.gitattributes` phủ | CHỈ `broadcasts/**` + `*.sh` — agent **KHÔNG** được che | `cat .gitattributes` |
| squash cơ-chế | CÓ chạy (reflog `c808b9a reset: moving to HEAD~2` @S118) | `git reflog` |
**Kết luận lead:** SE **chưa chết** ở EOL (2 lớp may độc-lập: 0-CR + block-scalar) nhưng **mìn đã cài**; SE **dính lỗi sống** ở push-guard (57 lọt remote vs hub 1) + Sàn-3 wal-defect ("trống⇒sạch" — lead mắc chính sáng nay @BƯỚC 0.7).
## Lane (5 — cùng vai `investigator-codebase`, khác lăng-kính)
| Lane | Lăng-kính | File |
|---|---|---|
| A | H22 wal-defect-fix 5-sàn + push-guard | `sub-investigator-codebase-A.md` |
| B | EOL/CRLF + agent-registry | `sub-investigator-codebase-B.md` |
| C | H23 model-at-spawn ⟂ H8 all-inherit (xung-đột kiến-trúc) | `sub-investigator-codebase-C.md` |
| D | H24 lead-self-audit + H17 cadence | `sub-investigator-codebase-D.md` |
| E | Cross-cut: thứ-tự phụ-thuộc + wave song-song + xung-đột | `sub-investigator-codebase-E.md` |
## Nấc / next
- [x] Sàn-1 marker đăng-ký trước phóng
- [x] run.md scaffold @P1 (script no-fs)
- [ ] 5 lane RETURN → em-main refute + synthesize (P3/P4)
- [ ] **Lead ghi** `spec-adap-6-broadcast-15-07-2026.md` (3-mục: ① đề-bài ② cách implement ③ checklist đo-được + wave)
- [ ] `/fable-clone reviewer``/fable-real reviewer` chốt spec
- [ ] HMW Opus MAX wave execute → push (guard `wal:`=0 CÙNG lượt)
- [ ] adap-report + request + email AI_INFRA

View File

@ -0,0 +1,283 @@
# SPEC v2 — SE đối ứng 6 broadcast AI_INFRA (S119, 2026-07-15)
> **SUPERSEDES v1** (`spec-adap-6-broadcast-15-07-2026.md` — giữ làm audit-trail, **KHÔNG chạy v1**).
> **Lý do v2:** `/fable-clone reviewer` 4-lane (`wf_78a84f9b-03e`) → **R2 FAIL** (4C+7M) · **R3 FAIL** (5C+2M) · R1/R4 **chết giữa chừng** (#53). **19 finding**, đa số loại "chạy là hỏng". v1 sẽ **gây mất việc**.
> **Owner-decision:** `owner-decisions-15-07-2026.md` — Q1=**PA-2** · Q2=**6/15/3** · Q3=**`[carry:<slug>]`** · Q4=**KHÔNG dọn 57**.
> **Trạng thái:** chờ `/fable-real reviewer` chốt → HMW wave.
---
# ① ĐỀ-BÀI
Giữ nguyên v1 §1 (phơi-nhiễm + 4 cú lật L1-L4 + 2 class + GAP#6 + 3 phát-hiện F1-F3 + positive-control + bẫy mega-line). **Δ v2 với ①:**
## 1.A Số ĐO LẠI lúc viết v2 (v1 đã stale khi mực chưa khô)
| Trục | v1 ghi | **v2 ĐO LIVE** | Ghi-chú |
|---|---|---|---|
| `K` = `git rev-list --count origin/main..HEAD` | **4** | **6** | WAL ghi 3 · v1 ghi 4 · R3 đo 5 · nay **6**. Hook fire **mỗi turn-boundary** ⇒ K **tăng đơn-điệu** |
| `origin/main` | — | **`3fde8af`** | |
| non-`wal:` trong range | — | 🔴 **0** (6/6 đều `wal:`) | ⇒ **KHÔNG có commit nào để `fixup` VÀO** |
| `wal:` trên `origin/main` | 57 | **57** ✓ | |
| `git status --porcelain` | "sạch, dirty=0" | 🔴 **KHÔNG SẠCH**`M .claude/WAL.md` + 7 untracked broadcast + 6 untracked run-folder | v1 §2.0 tiền-đề **SAI** |
| `ls .claude/agents/*.md \| wc -l` | (suy 12) | **13** = 12 roster + **README.md** | ⇒ +2 vai = **15**, KHÔNG phải 14 |
| gate scope EOL (`agents`+`commands`+`skills`) | — | 🔴 **0 — ĐÃ XANH SẴN** | repo-wide = 188 (131 Migrations) |
🔴 **LUẬT SỐ ĐỘNG (v2):** **CẤM hardcode `K`/`n` ở bất-kỳ đâu** trong spec/§5.0/script. Mọi nơi PHẢI tính runtime. Số trong bảng này = **ảnh chụp để reviewer đối chứng**, **KHÔNG phải hằng-số để worker dùng**.
## 1.B Δ L2 — v1 sai một nửa (R1 nhặt được trước khi chết)
v1 L2: *"188 = `dotnet ef`/VS sinh"*. R1 đo: *"CRLF clusters in exactly the S112 `sub-*`/`review-L*` files — **lead-written sub-returns**"*.
⇒ **L2 đúng phần Migrations (131/188), SAI phần "toàn bộ"** — một phần 188 do **chính lead ghi ra** (sub-return files trong `runs/`). **Nấc: PARTIAL.** Không đổi kết-luận (vẫn KHÔNG do squash — §5.0 = `reset --soft` = worktree-neutral), nhưng **đổi nguồn** ⇒ ảnh hưởng scope (§2.2).
## 1.C Δ L3 — HẠ NẤC xuống **CHƯA VERIFY** (R1 chết đúng trước câu quyết-định)
R1 đi được: *"strings exist"* ✓ → *"extracting the actual `^---` regex variants with context"* ✓ → *"**The context is decisive. Let me confirm which site is the actual fs-backed frontmatter reader**"* → **CHẾT**.
⇒ 🔴 **CHƯA VERIFY (bắt buộc khai):** *"đường đọc frontmatter `.claude/agents/` là nhánh CR-tolerant (`\s*` / `\r?\n`) hay nhánh LF-only (`[ \t]*\n`)"* — **chưa ai xác nhận**.
⇒ **Hệ-quả bắt buộc (R2-M7):** v1 **giữ kết-luận L3** ("KHÔNG tuyên miễn-nhiễm") mà **bỏ độ-bất-định** khỏi sổ trung-thực = **lệch đúng chiều có lợi**. v2 **khôi phục**: giữ kết-luận (thận-trọng = đúng) **VÀ** giữ caveat.
⇒ **adap-request R4 HẠ NẤC:** không được gửi hub dưới dạng *"chúng tôi đọc mã-nguồn"*. Nấc đúng = *"grep-chuỗi trong binary minified thấy 2 dạng regex cùng tồn tại; **CHƯA xác định** dạng nào trên đường đọc thật; đề-nghị hub (chủ mã-nguồn) xác nhận"*.
---
# ② CÁCH IMPLEMENT (v2)
## 2.0 🔴 W0 — PRE-FLIGHT (em-main SOLO)
### W0.0 — RE-MEASURE trước mọi thao-tác (R3-C4) 🆕
Worker **KHÔNG được tin số trong spec** (spec bơm qua args, số đã stale khi tới tay).
```bash
git status --porcelain # PHẢI phân-loại TỪNG dòng; chưa phân-loại → ABORT
K=$(git rev-list --count origin/main..HEAD)
NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:' || true)
```
**Acceptance:** in ra `{K, NONWAL, porcelain-count}`; mọi entry porcelain **được phân-loại**; chưa phân-loại ⇒ **ABORT loud**.
### W0.1 — `.gitattributes` theo CLASS
Thêm `* text=auto eol=lf` + khai binary THẬT (`*.zip *.exe *.dll *.docx *.xlsx *.pptx *.pdf *.png *.jpg *.jpeg *.ico *.woff *.woff2` binary) + **giữ 2 rule cũ**. 🔴 CẤM vá theo đuôi-file-vừa-cắn.
**Acceptance:** `git check-attr text eol -- .claude/agents/reviewer.md` ⇒ `text: auto`, `eol: lf` (nay: unspecified).
### W0.2 — EOL: **SCOPED-ONLY** (R3-C4/C5 — v1 SAI cơ-chế lẫn gate)
🔴 **3 đính-chính bắt buộc:**
1. **`git add --renormalize` KHÔNG rewrite worktree** (R3 đo: file vẫn `i/lf w/crlf` sau renormalize; **chỉ `rm` + `git checkout --`** mới ra `w/lf`) ⇒ **cơ-chế v1 sai từ gốc**.
2. **`--renormalize` âm-thầm STAGE nội-dung dirty**; acceptance v1 `git diff --stat` = rỗng **PASS giả** (vì mọi thứ chuyển sang index). ⇒ dùng **`git diff --cached --stat`** + **`--dry-run`** trước.
3. **Gate unscoped BẤT-KHẢ-GIỮ:** W1/W2 spawn agent ghi `agent-memory/*/MEMORY.md` ⇒ **CRLF lại** ⇒ gate **vỡ ngay sau khi "pass"**. Cộng: unscoped đòi `rm`+`checkout` **188 file incl. 131 EF migration + 6 file sống** (`STATUS.md`, `HANDOFF.md`, `docs/CLAUDE.md`, `agent-memory/{implementer-backend,reviewer}/MEMORY.md`, `.mfe-state.json` — R3 confirm cả 6 nằm trong 188).
**⇒ v2 QUYẾT:**
- **GATE = SCOPED** `.claude/agents` + `.claude/commands` + `.claude/skills` ⇒ **0**.
- **188 repo-wide = INFORM-only.** 🔴 **CẤM mass `rm`+`checkout`.**
- **KHAI THẲNG:** *"gate scoped **ĐÃ XANH SẴN 0 việc làm** (R2-C4). Giá-trị W0.1/W0.2 = **materialize theo attr mới cho file MỚI/ghi-lại**, KHÔNG phải sửa 188 file cũ."* ⇒ **W0.2 KHÔNG vào §3.9** (gate vacuous).
- Nếu **thật sự** muốn sửa 188 ⇒ **việc riêng, phiên riêng, worktree sạch tuyệt-đối** — KHÔNG phải phiên này.
**Acceptance:** `git add --renormalize --dry-run .` liệt đúng tập dự-kiến, **0 file dirty**; `git diff --cached --stat` sau thao-tác = rỗng; scope-gate = 0 **và vẫn 0 sau W2**.
### W0.3 — 🔴 **VIẾT LẠI HOÀN TOÀN** — squash **KHÔNG REBASE** (R3-C1: v1 phá thật)
**R3 fault-inject cây tạm chứng minh v1 phá:**
```
origin/main..HEAD = 6/6 wal:, NONWAL=0 ⇒ mọi todo-line thành `fixup`
→ error: cannot 'fixup' without a previous commit ×6
→ REBASE-EXIT=1 ; .git/rebase-merge LEFT ; HEAD DETACHED
→ hook wal-flush.ps1 (fail-open, exit 0, KHÔNG guard rebase-state) commit LÊN detached HEAD
→ git rebase --abort → WORKTREE CONTENT GONE ; commit ORPHANED (reflog only)
```
= **`E-029` tới bằng cửa sau** — đúng lỗi v1 trích làm cảnh-báo.
**⇒ v2 — 2 NHÁNH RUNTIME, quyết TRƯỚC khi chạm git:**
```bash
K=$(git rev-list --count origin/main..HEAD)
NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:' || true)
if [ "$NONWAL" -eq 0 ]; then
# ── NHÁNH A (ĐANG FIRE HÔM NAY: NONWAL=0, K=6) ──
# reset --soft ONLY. 🔴 TUYỆT ĐỐI KHÔNG invoke rebase.
[ "$(git rev-parse HEAD~$K)" = "$(git rev-parse origin/main)" ] || { echo "ABORT: HEAD~K != origin/main"; exit 1; }
git reset --soft "HEAD~$K"
# → nội dung 6 wal: gộp vào staging; commit-chốt ở W6
else
# ── NHÁNH B (có commit thường trong range) ──
# rebase+fixup; script PHẢI để dòng todo ĐẦU TIÊN là `pick`, KHÔNG BAO GIỜ emit leading `fixup`
trap 'git rebase --abort' ERR
GIT_SEQUENCE_EDITOR=<script> git rebase -i origin/main
fi
# 🔴 HARD RULE mọi nhánh: nếu .git/rebase-merge hoặc .git/rebase-apply TỒN TẠI → STOP, CẤM để hết lượt
[ -d .git/rebase-merge ] || [ -d .git/rebase-apply ] && { echo "STOP: rebase state left"; exit 1; }
```
**+ HOOK INTERLOCK (bắt buộc):** thêm vào `wal-flush.ps1` đầu file:
```powershell
if ((Test-Path .git/rebase-merge) -or (Test-Path .git/rebase-apply)) { exit 0 }
```
⇒ chặn hook ghi lên detached HEAD. *(Hook hiện: `exit 0` fail-open, **0 guard** — đã verify.)*
**Acceptance:** chạy lại fault-inject cây tạm ⇒ chọn **nhánh A**, `REBASE-EXIT` **không bao giờ** non-zero, `ls .git/rebase-merge` **absent** sau bước; `HEAD~K == origin/main` assert PASS trước reset.
### W0.4 — `workflows/README.md:52` gỡ claim STALE (giữ v1)
### W0.5 — baseline 7 orphan-folder (giữ v1) — 🔴 chọn **scope theo `mtime > closeout cuối`**, **KHÔNG** tạo `*-synthesis.md` giả (Goodhart — R3 flag)
### W0.6 🆕 — **THÍ-NGHIỆM QUYẾT-ĐỊNH EOL** (R2-M7 — lane B xếp ưu-tiên #1, v1 làm rớt)
> Lane B nguyên-văn: *"thí-nghiệm quyết-định **DUY NHẤT**... nó quyết SE dính CRLF thật hay không; **mọi thứ khác phụ-thuộc kết-quả này**"*.
> v1 rút xuống "validator FAIL trên copy-CRLF" = kiểm **validator của mình**, KHÔNG kiểm **bộ-đọc THẬT**.
**Làm:** copy `reviewer.md` → `.claude/agents/_crlf-probe.md` (đổi `name:`) → **CRLF-hoá byte** → **RESTART CLI** → **spawn-probe**.
- Spawn **được** ⇒ SE **CRLF-tolerant** ⇒ L3 nhánh "LF-only regex trên đường đọc" **BỊ BÁC** ⇒ R4 request **rút** hoặc hạ mạnh.
- Spawn **KHÔNG được** ⇒ L3 **XÁC NHẬN** ⇒ R4 request **giữ nguyên nấc mạnh** + SE có **positive-control THẬT** (thay synthetic).
- Xong ⇒ **XOÁ `_crlf-probe.md`**.
**Acceptance:** verdict `{CRLF-tolerant | CRLF-fatal}` ghi ra file; `_crlf-probe.md` đã xoá; kết-quả **cập-nhật ngược** §1.C + R4-nấc.
🔴 **Đây là bảo-đảm falsifiable DUY NHẤT** — broadcast ④(d): *"mọi kiểm static-text đều KHÔNG falsifiable; chỉ spawn-probe / assert-registry mới thật-sự chứng-minh"*.
## 2.1 Sàn H22 — Δ v2
| Sàn | Δ so v1 |
|---|---|
| **1** | 🔴 **R2-C3 + R3:** (a) đồ-thị wrapper THẬT = **4** (`fable-clone.md` · `fable-real.md` · `ultra-on.md` · raw-invoke em-main) — **`/hmw` KHÔNG tồn tại dưới dạng file** (`ls .claude/commands/` = 18, không có `hmw.md`) ⇒ bỏ khỏi danh-sách. (b) Grep-tool `args.run` trong `.claude/commands/` = **0 hit** ⇒ **cả 4 wrapper đều CHƯA có cờ**. (c) 🔴 **gate + 4 cờ PHẢI CÙNG 1 WAVE / 1 COMMIT** — v1 để gate ở W2, cờ ở W3 ⇒ mọi `/fable-clone` ≥3 lane (**chính run này = 5 lane**) + `/ultra-on` auto-HMW **THROW ngay** trước khi W3 kịp vá = **vỡ đường đang chạy** (đúng broadcast §4). (d) **nửa-(ii) = ÁP, KHÔNG n-a** (R2-M1: broadcast nói *"**wrapper** gọi xuống engine dùng-chung"*, KHÔNG phải engine→engine — v1 đọc sai). (e) Khai thật: chỉ phủ `hmw.js`; **raw Workflow/Agent = kẽ CÒN-LẠI KHÔNG gate được** (F2 — chính run này đi đường đó) |
| **2** | giữ v1 |
| **3** | giữ v1 (3-bậc SE-tailored + 🆕 bậc-MẠNH-④ path-trong-wal-commit) |
| **4** | giữ v1 |
| **5** | giữ v1 |
| **push-guard** | 🔴 **R3-C3:** v1 chuyển **phép đếm** vào lượt push nhưng **KHÔNG chuyển squash** ⇒ giữa §5.0 và §5.2, closeout **chắc chắn** làm bẩn path hook (Sàn-2 ghi `closing:` · W4 spawn reviewer→agent-memory · W4/W5 ghi `runs/`) ⇒ mỗi turn-boundary = +1 `wal:` ⇒ n≥1 tại §5.2 ⇒ **CHẶN PUSH → phiên không đóng được** ⇒ người bypass ⇒ **cổng tự xoá chính nó**. **⇒ v2: §5.2 = `squash → count → push` CHAINED TRONG **1 LƯỢT**; §5.0 = **pre-pass**, §5.2 **RE-EXECUTE** phép tính. Recount >0 ⇒ re-squash 1 lần ⇒ recount ⇒ push; vẫn >0 ⇒ **STOP + report**.** Acceptance thêm: **KHÔNG có turn-boundary giữa squash cuối và `git push`**. **(b) else-branch = 🔴 MÌN NGỦ, KHÔNG "vô-hại"** (R2-M6): else = `git log --format='%s' HEAD \| grep -c '^wal:'` = **đếm toàn lịch-sử = 57** ⇒ `-eq 0` fail ⇒ **chặn push VĨNH VIỄN** nếu ref biến mất/đổi tên ⇒ **bỏ hẳn else** (ref EXISTS, đã verify) **hoặc** đổi thành **fail-loud báo owner** |
## 2.2 EOL — Δ v2
| Δ | Nội-dung |
|---|---|
| **② SYMPTOM khôi phục** (R2-M5) | roster ↔ VALID_ROLES ↔ file-count = **14/14/14** (post-W2). v1 làm rớt ② |
| **③(d) RESTART+VERIFY khôi phục** (R2-M5) | BƯỚC 0.6 = **model-probe**, KHÔNG phải **registry-probe** ⇒ thêm **0.6b registry-probe**. Broadcast ③(d): *"RESTART rồi VERIFY danh-sách agent"* |
| **④(a) control** | 🔴 phụ-thuộc **W0.6**: probe ra `CRLF-fatal` ⇒ dùng **byte file-đã-chết THẬT** làm control (snapshot TRƯỚC fix); ra `CRLF-tolerant` ⇒ validator **hạ giá-trị** (chỉ còn hygiene) + khai thật |
| **SCOPE** | như W0.2: gate scoped; 188 INFORM-only; **L2 = PARTIAL** (131 Migrations + phần lead-written sub-returns — §1.B) |
## 2.3 H23 — **PA-2** (anh chốt) — Δ v2
Giữ v1 PA-1 (a)(b)(c)(d) + **PA-2a/PA-2b** (`owner-decisions` §Q1). **Δ:**
| # | Δ |
|---|---|
| **M2 🔴 LỖ CHƯA-TEST** (R2-M2) | H23 §2(2) **BẮT BUỘC khai**: *"thứ-tự ưu-tiên giữa 'tham-số tại spawn' và 'pin ở tệp định-nghĩa' khi **CẢ HAI cùng hiện-diện** — rất có thể **chưa từng được test**"*. Ở SE **cả hai HIỆN-DIỆN**: `hmw.js:44` trả alias → `agent(…,{model:…})` **trong khi** frontmatter 12/12 = `inherit`. **Chưa ai test bên nào thắng.** 🔴 **Nếu frontmatter THẮNG ⇒ toàn bộ fix GAP#6 = NO-OP**, floor-2 vẫn thủng khi Fable UP = đúng lỗi reviewer S108 đã bắt. ⇒ (i) khai vào §Nấc-trung-thực + §3.7; (ii) **acceptance NÂNG**: chạy 1 lane `tier:'opus'` **khi lead=Fable** → **đọc model-thực-tế resolve** (H23 §6 phép-thử-phá #3) → lệch ⇒ báo owner. *(Hôm nay lead=Opus ⇒ **không phân-biệt được** ⇒ acceptance này **defer tới phiên lead=Fable**; khai thẳng, KHÔNG giả-vờ đã test.)* |
| acceptance v1 | `Grep tier:'opus' ≥1 hit` = **chỉ đo CHỮ trong file**, không đo runtime ⇒ **Goodhart-able 100%** ⇒ giữ làm **điều-kiện cần**, KHÔNG phải đủ |
## 2.4 H24 — Δ v2
| # | Δ |
|---|---|
| **(1) 2 vai** | 🔴 **acceptance `ls .claude/agents/*.md = 14` SAI SỐ-HỌC** (R2-C1 + R3-M1): glob bắt luôn `README.md` ⇒ nay **13** = 12+README ⇒ +2 = **15**. Gate cũ **FAIL trên implementation ĐÚNG**, hoặc ép worker **xoá `agents/README.md`** = catastrophic-Goodhart. **⇒ v2: bất-biến trên ROSTER, không trên glob:** `VALID_ROLES.length == 14` **AND** `(ls .claude/agents/*.md \| grep -v README.md \| wc -l) == 14`. 🔴 **+ acceptance FALSIFIABLE (R2-M5):** static-check **KHÔNG đủ** ⇒ **RESTART → spawn-probe 14/14 agent SỐNG** |
| **(2) detector** | 🔴 **C2 (R2): `anchor_patterns[]` PHẢI SỐ NHIỀU.** v1 nén còn 1 regex `\*\*Last updated:\*\*` — mà `permission-matrix/SKILL.md` **KHÔNG có anchor đó** (nó dùng `**Status (post Session 6 — 2026-04-30):**`; Grep `Last updated` trong `.claude/skills/` = **0 hit**) ⇒ cộng luật *"không anchor ⇒ BỎ QUA"* ⇒ **detector loại thẳng chính positive-control của nó** ⇒ **W4 bất-khả-thi** ⇒ "xanh từ commit đầu" = đúng thứ H24 bảo phải nghi. **⇒ v2: `anchor_patterns[]` gồm ≥2 dạng**, bắt buộc có `\*\*Status \(post Session \d+ — (\d{4}-\d{2}-\d{2})\)\:\*\*`. **+ M3:** thu hẹp acceptance về **đúng nguyên-văn broadcast** = *"**số nhịp** đọc từ config; **0 số NHỊP** hardcode"* — **KHÔNG** "0 số hardcode trong .ps1" (v1 phình scope: `governance-detectors.ps1:419 $walLineCount -gt 40` = **số ANH ĐÃ KÝ** mark `RC-…12-07-2026-11-43-45`; `:256`, `:295`, `:399` = số detector cũ **ngoài scope H24**). **+ M2 (R3): detector KHÔNG disjoint** — `Get-StatusValue:154-157` resolve canonical **từ `docs/STATUS.md`** ⇒ ⚠️ **KHÔNG có row `Policies`** ⇒ nửa `policy` của GAP-3 **không thể fire** nếu chưa thêm `\| Policies \| **216** \|` vào STATUS.md. ⚠️ `\| Sub-agents \| **12** \|` = **row canonical**; W2 nâng 14 ⇒ **PHẢI update STATUS.md CÙNG LANDING**, nếu không C2/B3 **flag mọi derived-doc ghi "14" là stale-vs-12** ⇒ **detector BÃO trên chính thay đổi của H24** ⇒ acceptance "TOTAL ≥ 46" **được thoả bằng RÁC** |
| **(3) scheduler** | 🔴 **M4 (R2): v1 để MỒ CÔI** — rà 7 wave: `memory-budget.json` **không ở wave nào**; `.session-counter.json` **không ở wave nào**; logic tick/idempotent/fail-loud/fire-guard/cap = net-new **không chủ**. **⇒ v2: W2 sở-hữu** (gộp cùng `hmw.js` owner). Key `lead_self_audit` trong `memory-budget.json` (đo live: keys hiện = tiers/archive_gate/mfe/crystallized_backfill/harness_floor/token_governor/measured ⇒ **chưa có**) |
| **(4) positive-control** | phụ-thuộc **C2-fix**. Chuỗi fire→chứng-kiến→vá→hết-fire **giữ**. 🔴 **CẤM vá `permission-matrix` trước** |
| **(5) 3 việc** | giữ v1 (rút gọn (a) = `inherit`) |
| **enum ĐÓNG** 🆕 | 🔴 **M4:** v1 đòi "class ∈ enum ĐÓNG trong config" nhưng **không liệt enum** + **không nêu config key** ⇒ enum chỉ sống ở lane D ⇒ mà spec **bơm qua args, worker KHÔNG tự Read** ⇒ worker **không bao giờ thấy** ⇒ **tự chế class** = loãng thống-kê = đúng thứ H24 §2(1) cấm. **⇒ v2 CHÉP enum vào THÂN spec:** `lead_self_audit.flag_classes` = `["view-stale-count","view-stale-status","view-stale-header","view-stale-role-desc","view-residual-asym","gap-carry-dropped","gap-carry-aged","gap-owner-specifics","gap-decision-sunk","gap-underfill"]` (**10 class** — 5 STALE + 5 GAP, khớp H24 §2(1) 5+5 dấu-hiệu) |
## 2.5 owner-sign — giữ v1 (0 adopt, chỉ báo nấc)
---
# ③ CHECKLIST + WAVE (v2)
## 3.1 Δ đồ-thị phụ-thuộc
```
[W0.0] RE-MEASURE ──PHẢI TRƯỚC── mọi thao-tác git 🆕 (R3-C4: spec-số stale khi tới tay worker)
[W0.3] NONWAL==0 → reset --soft ONLY ──CẤM rebase── 🔴 (R3-C1: rebase = detached HEAD + mất việc)
[W0.3] hook-interlock rebase-guard ──CÙNG COMMIT── W0.3 🆕
[W0.6] spawn-probe CRLF ──PHẢI TRƯỚC── ④(a) chọn control + R4 nấc 🆕 (R2-M7: thí-nghiệm quyết-định)
[Sàn1] gate + 4 cờ wrapper ──CÙNG 1 COMMIT── 🔴 (R2-C3: tách = vỡ đường đang chạy)
[W2] STATUS.md `Sub-agents` 12→14 ──CÙNG LANDING── roster 14 🔴 (R3-M2: không thì detector bão)
[W2] `| Policies | **216** |` thêm vào STATUS ──PHẢI TRƯỚC── GAP-3 nửa policy 🆕
[§5.2] squash→count→push ──CÙNG 1 LƯỢT── 🔴 (R3-C3: tách = deadlock, gate tự xoá)
```
## 3.2 Δ bảng xung-đột
| File | v1 | **v2** |
|---|---|---|
| `hmw.js` | 3 hạng-mục | **5** (+PA-2a hằng-số +Sàn-1 gate) — vẫn **GỘP 1 EDIT** |
| `docs/STATUS.md` | ❌ **VẮNG** | 🆕 **2** (Sub-agents 12→14 · +row Policies) — **PHẢI cùng landing W2** |
| `.claude/hooks/wal-flush.ps1` | ❌ **VẮNG** | 🆕 **1** (rebase-state guard) — cùng commit W0.3 |
| `.claude/commands/ultra-on.md` | ❌ **VẮNG** | 🆕 **1** (cờ `args.run`) — cùng commit Sàn-1 |
| `.claude/commands/fable-real.md` | ❌ **VẮNG** | 🆕 **1** (cờ) — cùng commit Sàn-1 |
| `memory-budget.json` | 2, mồ-côi | **2, chủ = W2** |
| `.session-counter.json` | ❌ mồ-côi | 🆕 **chủ = W2** |
## 3.3 WAVE v2
| Wave | Song-song | Task | File |
|---|---|---|---|
| **W0** SOLO | 🔴 không | W0.0 re-measure → W0.1 gitattributes → W0.2 **scoped-only** (KHÔNG mass-checkout) → **W0.3 reset--soft nhánh-A + hook-interlock (1 commit)** → W0.4 README:52 → W0.5 orphan-scope → **W0.6 spawn-probe CRLF (RESTART)** | `.gitattributes` · `session-end.md:111-115` · `wal-flush.ps1` · `README.md:52` · probe |
| **W1** | ✅ 3 lane | ① detector +2 (**anchor_patterns[] số-nhiều**) · ② `agent-frontmatter-eol-check.ps1` · ③ `wal-recovery-test.ps1` 4-ca | 3 file disjoint |
| **W1b** 🆕 | ✅ cùng W1 | `scripts/spawn-model-audit.ps1` (PA-2b) | disjoint |
| **W2** GỘP | 🔴 1 owner | `hmw.js` **1 EDIT** (Sàn-1 gate + VALID_ROLES→14 + H23 note + **PA-2a hằng-số**) **+ 4 cờ wrapper CÙNG COMMIT** + 2 agent MỚI + `memory-budget.json` (`h24_cadence` 6/15/3 + `lead_self_audit` enum) + `.session-counter.json` + **STATUS.md Sub-agents 12→14 + row Policies** | 🔴 **1 commit** |
| **W3** SERIAL | 🔴 | `tiep.md` §0 → `session-start.md` (0.7-trỏ + **0.6b registry-probe** + counter + 2 vai + H23 note) → `session-end.md` **1 PASS** (§5.2 squash→count→push 1-lượt + sentinel + Sàn-5 + validator + counter) → `fable-clone.md` GAP#6 → `agents/README.md` | 5 file |
| **W4** | 🔴 sau W1① | fire detector ⇒ **PHẢI in** `permission-matrix/SKILL.md` → reviewer chứng-kiến → **RỒI MỚI** vá | skill |
| **W5** | 🔴 cuối | `harness-11-engine.md` | engine |
| **W6** | 🔴 | **§5.2 squash→count→push 1 LƯỢT** → adap-report → adap-request → email | broadcasts/ |
## 3.4 Owner-decision — ✅ CHỐT (`owner-decisions-15-07-2026.md`)
| | Chốt |
|---|---|
| **O1** | ✅ **PA-2** — hình-thức: **PA-2a hằng-số + PA-2b audit** (neo-tại-spawn **bất-khả-thi**: param chỉ nhận alias; SE 0 full-id vì H8) |
| **O2** | ✅ **6/15/3** → `memory-budget.json:h24_cadence` |
| **O3** | ✅ `[carry:<slug>]`; "dòng-carry" = **đoạn LOGIC** `NEXT anh`/`NEXT em` trong mega-line |
| **O4** | ✅ **KHÔNG dọn 57** |
## 3.5 Δ n-a (v1 SAI ×3 — R2)
| Mục | v1 | **v2** |
|---|---|---|
| Sàn-1 nửa-(ii) | "≈n-a — không có engine→engine" | 🔴 **SAI — ÁP.** Broadcast: *"**wrapper** gọi xuống engine dùng-chung"*. SE có **4 wrapper** ⇒ deliverable = cờ ở 4 chỗ |
| push-guard (b) else | "n-a — giữ else **vô-hại**" | 🔴 **SAI — MÌN NGỦ.** else đếm toàn lịch-sử = **57** ⇒ chặn vĩnh-viễn ⇒ **bỏ else** hoặc fail-loud |
| H23 §2(4) bộ-soát | "n-a: chưa dựng" | ✅ **GỠ** — PA-2b **dựng thật** |
## 3.6 adap-request v2
| # | Δ nấc |
|---|---|
| **R1** H8⟂pin-simple⟂H23 | **GIỮ** evidenced (hub tự pin 17/17 trong khi broadcast all-inherit) |
| **R2** push-guard KHUNG sai | **GIỮ** evidenced (57 vs 1) **+ MẠNH THÊM**: R3-C3 chứng minh KHUNG *"đặt guard sát push"* **CHƯA ĐỦ** — phải **squash+count+push CÙNG LƯỢT**, nếu không hook chen giữa ⇒ **guard tự-deadlock** ⇒ đề-xuất (γ) bổ-sung KHUNG |
| **R3** side-ref | **GIỮ** — 🔴 **VƯỢT KHUNG (lệch N.2) ⇒ PHẢI request, CẤM tự làm** (nguyên-tắc anh S119). Khai **CHƯA VERIFY thực-nghiệm** |
| **R4** EOL | 🔴 **HẠ NẤC** (§1.C): **KHÔNG** gửi *"đọc mã-nguồn"*. Nấc đúng = *"grep-chuỗi binary thấy 2 dạng regex cùng tồn tại; **CHƯA xác định** dạng nào trên đường đọc thật (lane verify chết giữa chừng); **W0.6 spawn-probe** sẽ trả lời — báo hub sau"*. **Vẫn GIỮ** phần đo được: nhân-quả *squash lật EOL* **SAI với SE** (§5.0=reset--soft, worktree-neutral; nguồn = Migrations **+ lead-written sub-returns** §1.B) + acceptance `count==0` toàn-repo = **dương-giả factory** |
## 3.7 §3.9 GATE v2
```
[ ] W0.0 in {K, NONWAL, porcelain-count} ; mọi entry porcelain ĐƯỢC PHÂN LOẠI ; chưa → ABORT
[ ] W0.1 git check-attr text eol -- .claude/agents/reviewer.md → text:auto eol:lf
[ ] W0.2 scoped gate = 0 (ĐÃ XANH SẴN — KHAI vacuous, KHÔNG tính là thành-tựu)
git add --renormalize --dry-run . → 0 file dirty ; git diff --cached --stat sau = rỗng
🔴 CẤM mass rm+checkout 188
[ ] W0.3 NONWAL==0 → chọn nhánh reset--soft ; REBASE-EXIT không bao giờ non-zero
ls .git/rebase-merge → absent ; assert HEAD~K == origin/main PASS
wal-flush.ps1 có rebase-guard (Test-Path .git/rebase-merge → exit 0)
[ ] W0.6 spawn-probe CRLF → verdict {tolerant|fatal} ghi file ; _crlf-probe.md đã xoá
[ ] Sàn1 gate + 4 cờ CÙNG 1 COMMIT ; Grep args.run trong commands/ ≥ 3 (nay 0)
phóng 3-task thiếu args.run → throw
[ ] §5.2 squash→count→push CHAINED 1 LƯỢT ; KHÔNG turn-boundary ở giữa
sau push: wal: trên origin/main = 57 (KHÔNG tăng, KHÔNG giảm)
[ ] H23 Grep tier:'opus' trong fable-clone.md ≥1 (điều-kiện CẦN, không đủ)
TIER2_EXPECTED_FULL_ID ≥1 hit = claude-opus-4-8
spawn-model-audit fault-inject (expected giả) → PHẢI FLAG
🔸 precedence spawn-param⟂frontmatter = CHƯA TEST → defer phiên lead=Fable (KHAI, không giả-vờ)
[ ] H24 VALID_ROLES.length == 14 AND (ls agents/*.md | grep -v README | wc -l) == 14
🔴 RESTART → spawn-probe 14/14 SỐNG (static-check KHÔNG đủ — broadcast ④d)
STATUS.md | Sub-agents | **14** | CÙNG LANDING ; + row | Policies | **216** |
detector in 2026-07-14 trên STATUS.md:6 (KHÔNG 2026-08-01 / 1987-03-07 / 2026-20-42)
anchor_patterns[] ≥2 dạng ; PHẢI in permission-matrix/SKILL.md TRƯỚC vá
h24_cadence đọc từ config (0 số NHỊP hardcode — KHÔNG đòi 0-số-hardcode toàn file)
/session-start 2× cùng HEAD → +1 ; counter lùi → fail-loud ; bỏ phiên → OVERDUE
[ ] EOL ② roster↔VALID_ROLES↔file = 14/14/14 ; ③(d) 0.6b registry-probe tồn tại
[ ] cicd CI PASS (scripts/*.ps1 + .json + .gitattributes CÓ trigger; agent-memory/runs KHÔNG — AS-6)
```
---
## Nấc trung-thực v2
- **Provenance:** invest `wf_1f6bd5e2-478` (5/5 clean) → spec v1 → review `wf_78a84f9b-03e` (**R2 FAIL 4C+7M · R3 FAIL 5C+2M · R1/R4 chết #53**) → **v2 vá 19 finding**.
- 🔴 **v1 SẼ GÂY MẤT VIỆC** — R3 fault-inject chứng minh: rebase→detached HEAD→hook fail-open commit→abort→mất worktree. **v1 KHÔNG ĐƯỢC CHẠY.**
- 🔴 **CHƯA VERIFY (khôi phục — v1 bỏ, R2-M7):** đường đọc frontmatter `.claude/agents/` là nhánh CR-tolerant hay LF-only ⇒ **W0.6 quyết**. **Kết-luận L3 giữ (thận-trọng), độ-bất-định GIỮ CÙNG.**
- 🔴 **CHƯA TEST:** precedence spawn-param ⟂ frontmatter (H23 §2(2) bắt buộc khai). Hôm nay lead=Opus ⇒ **không phân-biệt được** ⇒ defer, **không giả-vờ đã test**.
- **L2 = PARTIAL** (§1.B): 131/188 Migrations ✓ nhưng phần còn lại có **lead-written sub-returns** ⇒ v1 "toàn bộ do dotnet ef" **SAI**.
- **R1/R4 chết giữa chừng** ⇒ **2/4 trục review KHÔNG có verdict**. Recover: L3 hạ nấc (từ transcript R1) + em-main tự đo. 🔸 **Trục R4 (honesty) CHƯA có lane độc-lập** ⇒ `/fable-real reviewer` PHẢI phủ trục này.
- **KHÔNG overclaim:** Sàn-1 chỉ phủ `hmw.js`; raw Workflow/Agent = **kẽ CÒN-LẠI** (chính run này đi đường đó). Validator **PHÁT-HIỆN** không **NGĂN-CHẶN**. H24 = **quy-ước lead-executes, KHÔNG hook, KHÔNG enforce**. Gate scoped EOL **ĐÃ XANH SẴN****không tính là thành-tựu**.
- **H24 hub dogfood n=1 (mốc-0), chưa chu-kỳ-2** ⇒ cấm bán "đã chứng-minh hiệu-quả". Flag tăng = **mở-rộng-thiết-bị** (caveat d).
- **E-030: hub defer EXECUTE CRLF sang s95** ⇒ SE đi **TRƯỚC** hub; không có mẫu chạy sẵn.

View File

@ -0,0 +1,184 @@
# SPEC v3 — PATCH-SET trên v2 (S119, 2026-07-15)
> 🔴 **CÁCH ĐỌC:** worker đọc **v2** (`spec-…-v2.md`) làm thân + **file này** thay-thế các mục ghi rõ dưới. v3 **KHÔNG** lặp lại v2. **v1 = CẤM CHẠY.**
> **Nguồn:** `/fable-real reviewer` cổng-cuối `wf_cb964f83-331` → **GO-WITH-FIXES** (0 tiêu-chí NO-GO; **8 fix BẮT BUỘC** trước wave). Verdict đầy-đủ: `fable-real-final-gate-verdict.md`.
> **Nấc phiên S119:** anh chốt **dừng tại spec v3** — **KHÔNG chạy wave phiên này**. Wave = phiên sau qua `/tiep`.
---
# 0. 🔴 DISPOSITION 23 FINDING (fix #2 — vá lỗi trung-thực C1)
> **Lỗi đã phạm:** v2 ghi *"R2 (4C+**7M**) · R3 (5C+**2M**) … **19 finding** … v2 vá 19"*. **Đếm thật từ file: R2 = 4C+8M · R3 = 5C+6M ⇒ 23 C+M.** Ngay số tự khai cũng không cộng ra (4+7+5+2 = **18 ≠ 19**).
> **Vì sao NẶNG:** tập "7M/2M" **khớp chính xác** tập v2 có xử-lý ⇒ con-số "19" **đóng vai "đã phủ hết"** trong khi **3 finding STILL-BROKEN**. Lớp S109 (metadata-count) + S81 (honesty-presentation). Bảng này = **bằng-chứng-chống-tái-phạm**, và **đi nguyên vào adap-report**.
| # | Finding | v2 | v3 |
|---|---|---|---|
| R2-C1 | `ls=14` sai số-học | ✅ FIXED | — |
| R2-C2 | anchor số-nhiều | ✅ FIXED (gate tự chạy regex → MATCH `permission-matrix:16` + `form-engine:15`) | — |
| R2-C3 | gate⟂cờ tách wave | ✅ FIXED | **fix #6**: `fable-clone.md` 2-chạm vắng §3.2 |
| R2-C4 | gate W0.2 xanh-sẵn | ✅ FIXED | **fix #9(d)**: dòng 70 ⟂ §3.9 tự-mâu-thuẫn |
| R2-M1 | nửa-(ii) n-a sai | ✅ FIXED | — |
| R2-M2 | lỗ chưa-test precedence | ✅ FIXED | — |
| R2-M3 | 0-hardcode phình scope | ✅ FIXED | — |
| R2-M4 | scheduler mồ-côi + enum | ⚠️ PARTIAL (chủ-sở-hữu ✅ / enum **10/11 SAI**) | **fix #1** |
| R2-M5 | ② + ③d rơi | ✅ FIXED | — |
| R2-M6 | else "vô-hại" | ✅ FIXED | — |
| R2-M7 | thí-nghiệm quyết-định + L3 caveat | ✅ FIXED | — |
| **R2-M8** | **sweep roster sai pattern + file không wave** | 🔴 **STILL-BROKEN** (v2 §2.4(5) = "giữ v1") | **fix #6** |
| R2-m1 | broadcast #7 presence-not-age | ⬜ chưa xử | **fix #9(e)** 1 dòng |
| R2-m3 | — | ✅ FIXED qua PA-2b | — |
| R2-m4 | "n-a ĐÃ THOẢ" = under-report | ⬜ chưa xử | **fix #9(b)** |
| R2-m5 | lịch stamp-mark | ⬜ chưa xử | **fix #9(f)** → W6 |
| R3-C1 | rebase phá thật | ✅ FIXED | **fix #7** (bug shell guard) |
| R3-C2 | K stale | ✅ FIXED (K drift **4→5→6→8** = tự chứng minh luật đúng) | — |
| **R3-C3** | **push deadlock** | ⚠️ **PARTIAL** — v2 **tự tạo** ca wal:-đáy-range | **fix #3** 🔴 |
| R3-C4 | premise stale / renormalize staging | ✅ FIXED | — |
| R3-C5 | gate unscoped bất-khả-giữ | ✅ FIXED | — |
| R3-M1 | ls=15 | ✅ FIXED (trùng R2-C1) | — |
| R3-M2 | STATUS coupling | ✅ FIXED | — |
| R3-M3 | TOTAL≥46 bất-khả | ⚠️ PARTIAL (gate đã GỠ; thiếu capture-stdout) | **fix #9(c)** |
| **R3-M4** | **Sàn-3 thiếu dual-accept** | 🔴 **STILL-BROKEN** + **REGRESSED** (v2 chọn mtime) | **fix #4** 🔴 |
| **R3-M5** | **tripwire vỡ đường sống** | ⚠️ **PARTIAL** (wrapper-list ✅ / điều-kiện ❌) | **fix #5** 🔴 |
| **R3-M6** | sweep pattern + `hmw.js:9` | 🔴 **STILL-BROKEN** (trùng R2-M8) | **fix #6** |
| R3-m5 | mtime không bền | 🔴 **REGRESSED** — v2 chọn mtime làm phương-án CHÍNH | **fix #4** |
| R3-m6 | cấm synthesis giả | ✅ FIXED | — |
| R2-m2, R3-m1/m3/m4 | — | ⬜ chưa xử — **không chặn wave**, ghi để không rơi | defer S120 |
**Tổng:** 23 C+M ⇒ **16 FIXED · 4 PARTIAL · 3 STILL-BROKEN** (+1 REGRESSED ở lớp m). v3 đóng **3 STILL-BROKEN + 3 PARTIAL + 1 REGRESSED**.
---
# FIX #1 — Enum 11 class (thay §2.4 "enum ĐÓNG" của v2)
**Lỗi:** v2 chép **10** class rồi tuyên *"khớp H24 §2(1) 5+5"***SAI cả 2 chiều**: lane D có **11** (tách `carry-dropped`/`carry-aged` **có chủ-đích, đo được caveat (b)**); broadcast H24 `:48-49` liệt **"một việc rớt khỏi khối work-state so với backlog"** = **dấu-hiệu RIÊNG**. v2 **bỏ hẳn** `workstate-item-dropped` để về 10 rồi tuyên khớp.
🔴 **Hậu-quả:** mất **đúng class bắt ca F1 của chính SE** (S118 chạy 7-spawn mà **0 run-folder** = việc rớt khỏi sổ). Enum **ĐÓNG** ⇒ 2 vai mới **VĨNH VIỄN** không được phát class này.
```json
"lead_self_audit": {
"flag_classes": [
"view-stale-count", "view-stale-status", "view-stale-header",
"view-stale-role-desc", "view-residual-asym",
"gap-workstate-drop", // ← KHÔI PHỤC (broadcast :48 — dấu-hiệu RIÊNG; bắt ca F1 của SE)
"gap-carry-dropped", "gap-carry-aged", // ← tách-đôi = MỞ-RỘNG lane-D (đo được caveat (b)), KHÔNG phải broadcast
"gap-owner-specifics", "gap-decision-sunk", "gap-underfill"
]
}
```
🔴 **XOÁ câu "khớp H24 5+5"** khỏi spec. Nấc đúng: *"5 STALE (khớp broadcast) + **6** GAP = 5 broadcast + **1 mở-rộng lane-D** (carry tách-đôi, lý-do đo-được)"*.
**Acceptance:** `flag_classes``{gap-workstate-drop, gap-carry-dropped, gap-carry-aged, gap-owner-specifics, gap-decision-sunk, gap-underfill}` · `grep "khớp 5+5"` = **0**.
---
# FIX #3 🔴 — Luật fold leading-wal: (thay v2 W0.3 "commit-chốt ở W6" + §2.1 push-guard)
**Lỗi sâu:** v2 **tự tạo** ca chết. W0.3 park nội-dung staged ("commit-chốt ở W6") → `wal-flush.ps1:14-17` commit **pathspec 3 path** ở turn-boundary kế → **toàn bộ nội-dung reset-soft thành 1 `wal:` ĐÁY range** → tại W6 `NONWAL>0` → nhánh B → luật *"todo đầu = pick"* **giữ wal:-đáy sống** → recount=1 → re-squash cùng logic → vẫn 1 → **STOP ngay lần dùng thật ĐẦU TIÊN**.
**v3:**
- **(a)** W0.3 **BỎ** "commit-chốt ở W6". **Commit-chốt `[CLAUDE]` NGAY CÙNG TURN** với `reset --soft` (gộp luôn `wal-flush.ps1` interlock + `.gitattributes`) ⇒ **đáy range = commit thường**.
- **(b)** Mọi push **sau push#1** ở W6 (adap-report…) = **write → commit → squash → count → push CHAINED cùng 1 lượt**.
- **(c) Luật tổng-quát:** `wal:`**đáy range****`reset --soft origin/main` re-commit**, **KHÔNG rebase**.
**Acceptance:** fault-inject cây tạm shape `base + wal + [CLAUDE] + wal×2` ⇒ chained block ra **n=0**, **tree-identical**, **KHÔNG STOP**.
---
# FIX #4 🔴 — Sàn-3 dual-accept + W0.5 bỏ mtime (thay v2 §2.1 Sàn-3 + W0.5)
**Lỗi kép:**
1. Văn-bản canonical Sàn-3 (sẽ re-author vào `tiep.md` §0) **KHÔNG mang mệnh-đề dual-accept** — nó đang sống ở `workflows/README.md:19-20` (*"close-gate chấp nhận CẢ HAI dạng"*, C8 migration S71). Wire xong = **bão 5 dương-giả**. Đo: naive = **13** orphan · dual-accept = **8** (7 tồn-đọng + S119) — 5 folder h10/h910 **đều có** `harvest/<stage>-synthesis.md`.
2. **REGRESSED:** v2 chốt W0.5 scope theo **mtime** — đúng phương-án R3-m5 đã chứng minh **không bền** (**Dropbox resync ghi đè mtime**; "closeout cuối" không đo được).
**v3:**
- **Chép VERBATIM** mệnh-đề C8 (`workflows/README.md:19-20`) vào Sàn-3 canonical @`tiep.md` §0.
- W0.5: **mtime → `git log -1 --format=%cI -- <folder>`** so mốc **`3fde8af`** (`2026-07-14T16:29:55+07`).
**Acceptance:** scan mới trên cây hiện tại ⇒ đúng `{S119}` sau khi đóng 7 tồn-đọng · **5 folder h10/h910 IM**.
---
# FIX #5 🔴 — Tripwire mirror `hmw.js:116` (thay v2 §2.1 Sàn-1 điều-kiện)
**Lỗi:** v2 giữ điều-kiện v1 `!(A.run?.dir && A.run?.name)`. Thật (`hmw.js:116`): `const wave = (A.run && A.run.dir) ? A.run : ((A.wave && A.wave.dir) ? A.wave : null)` + `:19` *"[legacy alias: args.wave]"*.
⇒ điều-kiện v2 **GIẾT lời-gọi `wave:` hợp-lệ** + **đòi `.name` vượt contract** `.dir`-only.
```js
const w = (A.run && A.run.dir) ? A.run : ((A.wave && A.wave.dir) ? A.wave : null)
if (A.taskList.length >= 3 && !w) throw new Error('H22 Sàn-1: run ≥3 task PHẢI đăng-ký marker (args.run.dir) TRƯỚC khi phóng')
```
(hoặc **nâng contract `:116`** trong **CÙNG edit** — chọn 1, không nửa vời.)
**Acceptance (thêm §3.9):** ≥3-task kiểu `wave:{dir}` **VẪN CHẠY** · thiếu **cả hai****throw**.
---
# FIX #6 — Roster-sweep pattern + file chủ-quản (thay v2 §2.4(5) "giữ v1")
**Lỗi:** pattern sweep của v1/v2 = `grep "12-agent|12 sub"` — nhưng stale THẬT ghi **"9-agent"** ⇒ **pattern không bao giờ bắt được**. Lead tự verify:
- `hmw.js:9` = `'HMW P2 execute (SOLUTION_ERP) — fan-out **9-agent** roster…'` ← stale **từ trước S119** (roster 12, VALID_ROLES 12 từ S110)
- `ultra-on.md:24` = `'## VALID_ROLES (roster SOLUTION_ERP — **12 sub**, đủ roster từ S110)'` ← sẽ stale khi →14
- `fable-real.md` + `fable-real-runbook.md` = **không thuộc wave nào**
**v3:**
- **Pattern (Grep tool):** `(12|9)[- ](agent|sub)|roster 12|12 vai|VALID_ROLES[^0-9]*12`
- **Vào W2 (1-EDIT):** `hmw.js:9` meta + `ultra-on.md:24` danh-sách VALID_ROLES 12→14 (**routing-doc ⇒ CÙNG COMMIT**)
- **Vào W3:** `fable-real.md` + `fable-real-runbook.md`
**Acceptance:** sau W3, pattern trên = **0 hit sống** (ngoài lịch-sử/archive).
---
# FIX #7 — Bug shell guard W0.3 (thay v2 W0.3 dòng guard)
**Lỗi lead tự viết:** `[ -d .git/rebase-merge ] || [ -d .git/rebase-apply ] && { echo …; exit 1; }` ⇒ happy-path (**không có dir nào**) trả **exit 1** (status chuỗi `||`) ⇒ caller check exit-code **báo hỏng GIẢ**.
```bash
if [ -d .git/rebase-merge ] || [ -d .git/rebase-apply ]; then
echo "STOP: rebase state left behind"; exit 1
fi
```
**Acceptance:** chạy block trên repo sạch ⇒ **exit 0**.
---
# FIX #8 — 2 ack tường-minh (🔴 QUYỀN ANH — chờ ký)
## (a) PA-2 hình-thức — **cần anh duyệt trước khi W2 land `TIER2_EXPECTED_FULL_ID`**
Gate bắt đúng: bullet *"param `model:` chỉ nhận enum alias"* trong `owner-decisions` **dán nhãn "Đo" nhưng KHÔNG nêu phép đo**. 2 bullet kia gate tự verify được (`hmw.js:44` ✓ · grep full-id = 5 hit / 3 file ✓); **riêng bullet này là tiền-đề** biến PA-2-nguyên-bản thành "bất-khả-thi" ⇒ **đổi hình-thức một quyết-định anh đã chốt**.
🔸 **Hạ nấc trung-thực:** *"theo tài-liệu harness (Agent-tool `model` enum = `sonnet|opus|haiku|fable`), **CHƯA thử truyền full-id để xem có bị từ-chối không**"*.
**⇒ Cần anh xác nhận:** PA-2 thực-thi bằng **PA-2a (hằng-số `TIER2_EXPECTED_FULL_ID`) + PA-2b (`spawn-model-audit.ps1` so resolved-vs-expected)** — thay vì neo-tại-spawn (chưa thử). ⚪ **CHỜ**
## (b) Hook-interlock vs floor N.2 — **phân loại khung**
v2 xếp R3-side-ref = **VƯỢT KHUNG phải request** (đúng nguyên-tắc anh S119), **nhưng chính v2 sửa `wal-flush.ps1`** (thêm skip khi rebase-state) mà **không phân loại** vs floor N.2 (`harness-11-engine.md:406` — hook *"ĐƯỢC làm đúng 2 việc"*). Nguyên-tắc anh nói rõ **"dù lý-lẽ tốt"**.
**Đề-xuất phân loại (lead):** **TRONG KHUNG** — interlock **KHÔNG thêm hành-vi** cho hook; nó **chặn hook tự-hủy** (commit lên detached HEAD = phá chính floor N.2 nó phục-vụ). = **thu hẹp**, không mở rộng. ⇒ khai ở adap-report, **không cần request**.
**Chờ anh ack** (nếu anh muốn chặt hơn → chuyển thành request).
---
# FIX #9 — Nhóm nhỏ (không chặn, gộp 1 pass)
| | Việc |
|---|---|
| (a) | ~~"4 cú lật"~~**"4 phát-hiện: 2 ĐO CHẮC (L1/L4-diễn-giải) · 1 PARTIAL (L2) · 1 CHƯA-VERIFY (L3)"** — v2 đã tự hạ L2/L3 nhưng **giữ nguyên nhãn "4 cú lật"** |
| (b) | `"H23 §2(5) n-a ĐÃ THOẢ"`**`"đã thoả"`** — dán PASS thành n-a = **under-report nấc tuân-thủ** khi gửi hub |
| (c) | W4 capture-stdout detector ra `runs/<id>/` = bằng-chứng time-anchored (thay "reviewer chứng-kiến" làm neo **duy-nhất**) |
| (d) | v2 dòng 70 *"W0.2 KHÔNG vào §3.9"* ⟂ §3.9:245 vẫn có ⇒ **chốt 1** (giữ ở §3.9 + chú "vacuous") |
| (e) | +1 dòng: **broadcast #7 `presence-not-age` ĐÃ adopt S115** (R2-m1 — kẻo hub tưởng SE bỏ sót) |
| (f) | Lịch **stamp-mark** vào **W6** (R2-m5) |
| (g) | W0.6 verdict **nhét thẳng** vào R4-request (thay *"báo hub sau"* — vì W0.6 chạy **TRƯỚC** W6) |
| (h) | Validator W1② chạy **glob** thay hardcode 12 |
| (i) | +acceptance: W0.4 · EOL-assert-scoped cạnh push · W6 |
| (j) | 🔴 **Ghi rõ: W0.6 + post-W2 đều cần RESTART ⇒ wave trải ≥3 phiên CLI ⇒ nối bằng `/tiep`** (H22 — chính cơ-chế phiên này adopt) |
---
# Nấc trung-thực v3
- **Verdict cổng-cuối:** **GO-WITH-FIXES****0 tiêu-chí NO-GO**. Mọi đường **mất-việc / rewrite-pushed-history** đã đóng (mass rm+checkout cấm · nhánh-A + assert `HEAD~K==origin/main` chặn tụt dưới remote · interlock+trap+hard-rule chặn detached-HEAD · 0 force-push · O4 giữ 57). Deadlock **hạ cấp** thành STOP fail-loud — **nhưng STOP gần-như-chắc-chắn xảy ra ở W6 nếu không có fix #3**.
- **W0 SOLO = ĐÚNG phải SOLO** (phẫu-thuật index + reset + restart; fan-out ⇒ hook commit agent-memory **giữa lúc mổ**).
- **Owner-decision:** gate xác nhận **không có chỗ nào v2 tự quyết CON-SỐ/policy của anh**; 2 chỗ cần ack = **fix #8**.
- 🔴 **Tỷ-lệ claim (gate re-đo ~30 claim rời):** **~80% ĐO ĐƯỢC-và-đúng** · **~13% SAI — tập trung TRỌN ở lớp meta-count/coverage** (finding-count ×3, enum-"khớp" ×1) · ~7% suy-diễn/chưa-verify.
**Điểm sáng:** 4/5 chỗ CHƯA-VERIFY khai **đúng nấc** (L3 · precedence · side-ref · hot-reload `hmw.js`).
**Điểm tối:** **2 chỗ SUY DIỄN trình như ĐO** (enum-"khớp" · param-alias).
**Bài học tự-soi:** *lead ĐO tốt; lead ĐẾM VỀ CHÍNH MÌNH thì sai.* Lỗi **không** nằm ở dữ-liệu — nằm ở **tự-tổng-kết độ-phủ**. Đây là lý-do bảng §0 tồn tại.
- **CHƯA VERIFY (giữ nguyên):** đường đọc frontmatter CR-tolerant hay LF-only (**W0.6 quyết**) · precedence spawn-param ⟂ frontmatter (**defer phiên lead=Fable**) · side-ref R3 (lập-luận plumbing) · hot-reload `hmw.js` · **+ MỚI:** param `model:` có từ-chối full-id không (fix #8a).
- **STILL-BROKEN sau v3 = 0** (3 cái đã có fix #3/#4/#5/#6). **PARTIAL còn:** R3-M3 (fix #9c) · R2-m2/R3-m1/m3/m4 (**defer S120, không chặn**).
- **Số trong v2/v3 = ẢNH CHỤP, KHÔNG phải hằng-số.** K đã trôi **3→4→5→6→8** trong 1 buổi ⇒ **LUẬT SỐ ĐỘNG** (W0.0 re-measure) là bắt-buộc, không phải khuyến-nghị.

View File

@ -0,0 +1,288 @@
# SPEC — SE đối ứng 6 broadcast AI_INFRA (S119, 2026-07-15)
> **H21 spec-file 3-mục.** Engine propose (`/fable-clone investigator-codebase` 5-lane ensemble `wf_1f6bd5e2-478`, 5/5 clean 0-garble) → **lead verify + refute + synthesize** → **lead ghi** (file này) → worker thực-thi THEO spec (bơm qua args, worker KHÔNG tự Read).
> **Trạng thái:** DRAFT-v1 chờ `/fable-clone reviewer` → `/fable-real reviewer` chốt → anh ký 4 owner-decision.
---
# ① TÍNH-NĂNG / ĐỀ-BÀI
SE đối ứng **6 broadcast** (check-email S119: 7 copy verbatim, hash 7/7 MATCH, tamper 4/4 MATCH).
## 1.1 Bảng phơi-nhiễm — ĐO THẬT, không suy
| Broadcast | Nấc SE | Bằng-chứng đo |
|---|---|---|
| **H22 push-guard** | 🔴 **LỖI SỐNG** | 57 `wal:` đã lọt `origin/main` · n=4 chưa-đẩy (hook fire `aab817b` @09:29 giữa phiên) |
| **H22 wal-defect-fix** (5 sàn) | 🔴 **0/5 sàn đạt**; Sàn-3 lỗi sống | `session-start.md:51` + `tiep.md:15` suy thẳng "trống⇒sạch" (lead mắc chính sáng nay) |
| **EOL/CRLF** | 🟡 chưa chết, **KHÔNG được tuyên miễn-nhiễm** | `autocrlf=true`@system · 188 file `i/lf+w/crlf` · agent 0-CR · 12/12 block-scalar |
| **H23** model-at-spawn | 🟡 **KHÔNG xung-đột H8**; 1 GAP thật | `fable-clone.md` hứa "tier-2" mà **0 cơ-chế `tier:'opus'`** |
| **H24** lead-self-audit | 🟢 **đủ 3 nền** → adopt được | detector ✅ · carry ✅ (`HANDOFF:5` 21×"NEXT anh"/22×"NEXT em") · nghi-thức ✅ |
| **owner-sign 3 mark** | 🟢 info | anh ký `RC-pqhuy1987-14-07-2026-10-05-50`; SE **đã stamp** S110/S111 → chỉ báo nấc |
## 1.2 🔴 BỐN CÚ LẬT — ensemble bác tiền-đề (kể cả tiền-đề của LEAD)
**L1 — 57 wal: KHÔNG do turn-seam (bác lead).**
Lead giả định 57 = kẽ turn-seam của broadcast. Lane A đo: **0/57 ở đuôi, 57/57 bị-kẹp** (14 khối: 3×1, 6×2, 1×4, 2×7, 1×8, 1×16). Kênh rò thật = `session-end.md:112-113` — §5.0 đếm **LIÊN-TỤC từ HEAD, dừng ở subject khác**, và `:113` **cố-ý** ghi *"wal: kẹp sâu hơn → GIỮ NGUYÊN, chấp-nhận noise"*. Tốc-độ rò ~**10/phiên**, khởi đúng ngày hook lên (S111): 37 @07-12 · 10 @07-13 · 10 @07-14 · 0 trước đó.
**`n=0` BẤT-KHẢ-ĐẠT** với §5.0 hiện tại ⇒ **sửa §5.0 = TIỀN-ĐỀ của push-guard, không phải phụ-kiện.**
**L2 — 188 file EOL KHÔNG do squash (bác broadcast).**
Broadcast quy nhân-quả: *squash/rebase lật EOL*. Lane B đo: **SE §5.0 = `git reset --soft` = worktree-neutral** → không lật byte nào. Nguồn thật = **`dotnet ef` / VS sinh CRLF** (131/188 = `Migrations/`).
⇒ acceptance `count==0` **toàn-repo** của hub = **cỗ máy dương-giả** với SE ⇒ **phải scope**.
**L3 — CRLF ĐƠN-ĐỘC có thể đủ giết (bác broadcast + bác lead).**
Broadcast tự khai *"KHÔNG khẳng-định đã đọc mã-nguồn parser"*. Lane B **đọc được**: parser = **js-yaml 4.1.1** nhúng trong `claude.exe` (chuỗi license), `readLineBreak` xử CRLF native ⇒ nửa `': '` **N/A THẬT** cho SE (12/12 block-scalar) — **chứng ở tầng mã-nguồn**, không còn là suy-đoán.
**NHƯNG** tồn tại **regex delimiter LF-only `^---[ \t]*\n` ×2 song song bản đã vá `\r?\n` ×2****CRLF một mình có thể đủ giết, KHÔNG cần `': '`**.
⇒ Mô-hình broadcast ("CRLF **VÀ** `: `") **THIẾU** ⇒ SE **KHÔNG tuyên miễn-nhiễm**; 2 lớp may (0-CR + block-scalar) chỉ che **một** nửa.
**L4 — H23 ⟂ H8: KHÔNG xung-đột; lỗi ở tài-liệu HUB (bác lead + bác H23).**
`model-tier-v2-pin-simple` (07-03) nói thẳng: *"**Không có mandate mới; các đội KHÔNG bắt buộc làm theo**"* · *"Danh sách trợ lý nào ở tầng model nào = **FORM mỗi đội tự quyết**"* · *"**cả hai đều đạt sàn** miễn là đội trưởng ở model cao nhất và việc nâng-hạ tầng là **có kỷ luật**"*.
**SÀN** = (i) lead frontier + (ii) gán tầng có kỷ-luật. **FORM** = tự quyết. SE all-inherit **đạt sàn** (100% tất-định ⇒ class "quên hạ tầng" **không thể tồn tại** — SE đóng cùng lỗi bằng đường khác hub).
**SE nằm TRONG khung** (nguyên-tắc anh chốt S119) ⇒ **KHÔNG cần request cho việc lệch form**.
**DEFECT ở H23 §1**: phát-biểu **form riêng hub** ("mọi sub chạy worker-tier gán-cứng") **như thể SÀN đã chốt** → sister đọc nghĩa-đen sẽ **tự tháo H8**. Cộng: **H8 (06-16) tuyên "BẮT BUỘC mọi sister" chưa từng retract tường-minh** ⇒ fleet giữ **3 phát-biểu không tương-thích** trên cùng 1 trục (H8 → pin-simple → H23).
## 1.3 🔴 2 CLASS ngữ-nghĩa NGƯỢC (lane C — mấu chốt H23)
| Class | `inherit` nghĩa là | Runtime-value của H23 |
|---|---|---|
| **A** — roster mặc-định (12 sub) | **ĐÚNG Ý-ĐỒ** (H8 S66). lead đổi → sub đổi = tính-năng | **0** (đúng như hub khai "phòng-xa") |
| **B**`/fable-clone` ensemble | **SAI**. Clone theo định-nghĩa = tier-2 | **THẬT** — vá lỗi sống |
**GAP #6 (lỗi sống, đã cài ngòi):** `.claude/commands/fable-clone.md:15` hứa *"ENSEMBLE tier-2-mạnh-nhất"*, `:38-40` chỉ nói ghế **lead****cơ-chế đạt tier-2 VẮNG HẲN**. Fable UP ⇒ N lane inherit = **N×Fable****trái chính §K.D floor-2 của SE**.
**ĐÃ CẮN 1 LẦN:** reviewer S108 FAIL, MAJOR#3 *"clone-example thiếu `tier:'opus'` trái K.B/floor-2 khi Fable UP"* → fix landed ở **runbook:431** (🔴 BẮT BUỘC), **KHÔNG** mang sang command-file khi H21-redesign S110 (`debe82f`).
⇒ Kết-luận "H23 vô-giá-trị vì SE all-inherit" = **SAI do gộp 2 class**.
**Cái giá DUY-NHẤT H8 trả dưới lăng-kính H23 (lane C, honest):** H8 xoá 7 pin full-id ⇒ grep `.claude/**` = **0 full-id sống**. `tier:'opus'` = **alias trần khoá HỌ, không khoá phiên-bản**. Opus đời sau ra ⇒ trôi, 0 ai bắt. Thẩm-quyền phiên-bản THẬT của SE = `~/.claude/settings.json` `claude-fable-5[1m]`**NGOÀI repo, machine-wide, dùng chung AI_INFRA+VIETREPORT, KHÔNG git-tracked**.
## 1.4 🔴 3 phát-hiện ngoài đề-bài (lane A — đều chạm quyết-định)
**F1 — S118 là ca THẬT của Lớp-1 (bằng-chứng NỘI-BỘ SE).** `ls .claude/workflows/runs/`**0 folder S118** (nhảy S117 → S119). Mà `HANDOFF:5` ghi S118 = *"em-main-led + **7 spawn** + 3 commit + 2 deploy"*. ⇒ run 7-agent trọn ngày với **0 run-folder · 0 dòng `wf:` · 0 marker**. S118 chết giữa chừng ⇒ sổ trống ⇒ phiên sau tưởng sạch.
**F2 — `workflows/README.md:52` = claim STALE đang CHE Sàn 1.** Nguyên-văn: *"Anti-bypass detector: **SE TAILORED-OUT** — SE chạy workflow qua Anthropic Workflow tool (KHÔNG có CLI-launcher để lách) → **bypass-surface ~N/A**"*. **BỊ BÁC ×2:** (i) `feedback_harness10_run_trace.md:20`*"**RECURRED S72**: chạy REVIEW qua **RAW Workflow tool** (KHÔNG qua hmw.js) → KHÔNG inject writeGuard → reviewer tự ghi MEMORY +2850B over-cap → git-status BẮT @session-end + revert"*, kết-luận nguyên-văn *"dùng RAW Workflow tool = **MẤT governance của project-wrapper**"*; (ii) S118 raw-Agent 7-spawn; (iii) **chính run S119 này** dùng raw Workflow tool.
**Đồ-thị lời-gọi THẬT của SE = 3 đường:** `hmw.js` (**đường DUY-NHẤT SE gate được**) · **raw Workflow tool** · **raw Agent tool**. Hai đường sau thuộc harness Anthropic ⇒ **SE KHÔNG gate được = kẽ CÒN-LẠI** (đúng như broadcast §5 tự khai).
⇒ 🔴 **PHẢI sửa `README.md:52` TRƯỚC khi adopt Sàn 1** — nếu không, cớ "tailored-out" sẽ (sai) biện-minh cho việc skip luôn Sàn 1.
**F3 — Sàn 3 wire thẳng = bão dương-giả ngay lượt đầu** (đúng cảnh-báo Sàn 2 *"báo-động-giả lặp còn hại hơn kẽ gốc"*). Folder-scan theo authority `README.md:20`**8/27 orphan**, 7 = tồn-đọng cũ (S112 ×4, S113, S114, pe-negative-quote), 1 = S119 đang bay hợp-lệ.
**PHẢI baseline TRƯỚC khi wire**: dọn/đóng 7 folder **HOẶC** scope scan theo `mtime > closeout cuối`.
## 1.5 🔴 Positive-control SỐNG — KHÔNG ĐƯỢC VÁ TRƯỚC (lane D)
`permission-matrix/SKILL.md` last-touch `2abbc1d` **2026-04-30 (Session 6)** — H1 phiên này bắt, lead **verify độc-lập từ code**:
| Skill ghi | Thật (đo từ code) | Lệnh |
|---|---|---|
| `:3` "~60 menu key" | **54** | `grep -c "public const string" MenuKeys.cs` |
| `:3` "~240 policy" · `:81` "48 policy" (**tự mâu-thuẫn**) | **216** = 54×4 | `Program.cs:82-88` foreach `All`×`Actions` |
| `:3`/`:23` liệt-kê `Bg_*` | **chết từ S61 Mig 50** | 0 live const |
| `:159` chỉ có chiều-ngược của #82 | thiếu chiều-thuận | — |
**Máy hiện-tại MÙ chứng-minh-được:** `governance-detectors.ps1` = 42 flag baseline, **0 flag trên file này** (C2/B3 chỉ track 4 token mig/test/gotcha/table — `menu`/`policy` MÙ).
⇒ 🔴 **CẤM vá skill này trước khi detector H24 fire.** Trình-tự H24 §2(4) **BẮT BUỘC**: `fire → cổng chứng-kiến → vá → hết-fire`. Vá trước = **giết chứng-nhân sống** ⇒ detector "xanh từ commit đầu" = đúng thứ H24 bảo phải nghi.
*(Lead đã đề-xuất vá ngay ở Phase-3 REPORT — **RÚT LẠI**, ghi ở đây làm audit-trail.)*
## 1.6 🔴 Bẫy mega-line (lane D — SE là ca NẶNG NHẤT)
`docs/STATUS.md:6` = **63,104 ký-tự / 1 dòng vật-lý**, **37 date-token**. `docs/HANDOFF.md:5` = 46,735.
| Cách parse | Ra | Hậu-quả |
|---|---|---|
| date `max` | **`2026-08-01`** (hạn audit tháng tới) | 🔴 **TƯƠNG-LAI ⇒ detector KHÔNG BAO GIỜ kêu ⇒ TỰ GIẾT positive-control** — đúng y `broadcast:62` |
| date `min` | **`1987-03-07`** | 🔴 ngày-ma từ chữ-số trong `pqhuy1987` ⇒ luôn kêu = nhiễu thuần |
| lexical `max` | `2026-20-42` | không phải ngày ⇒ crash |
| **NEO-PHẠM-VI** `\*\*Last updated:\*\*\s*(\d{4}-\d{2}-\d{2})` | **`2026-07-14`** ✅ | ĐÚNG |
⇒ detector độ-tươi **BẮT BUỘC parse neo-phạm-vi**, cấm regex-bất-kỳ-đâu.
---
# ② CÁCH IMPLEMENT
## 2.0 🔴 W0 — PRE-FLIGHT (em-main SOLO, KHÔNG fan-out, KHÔNG push) — PHẢI ĐẦU TIÊN
> **Vì sao trước:** (a) worktree **đang sạch** = cửa-sổ an-toàn DUY-NHẤT; session-end sẽ ghi `STATUS.md`/`HANDOFF.md`/`docs/CLAUDE.md`/`agent-memory/{implementer-backend,reviewer}/MEMORY.md`/`.mfe-state.json` — **6 file này NẰM TRONG 188** ⇒ lúc đó `git checkout` mù = **HỦY việc chưa-commit** (= đúng `E-029` hub đã trả giá: *"verify-mốc-sai ca-fold-uncommitted → reflog-recover"*). (b) `n=4=K` **lúc này chưa kẹp**; commit thường đầu tiên ⇒ kẹp ⇒ **n>0 vĩnh-viễn**.
| # | Việc | Chi-tiết | Acceptance |
|---|---|---|---|
| **W0.1** | `.gitattributes` theo **CLASS** | Thêm `* text=auto eol=lf` + khai binary THẬT (`*.zip *.exe *.dll *.docx *.xlsx *.pptx *.pdf *.png *.jpg *.jpeg *.ico *.woff *.woff2` binary) + giữ 2 rule cũ. 🔴 **CẤM vá theo đuôi-file-vừa-cắn** (bẫy lặp). ⚠️ Kiểm `*.ps1`/`*.bat`/`*.cmd` có cần CRLF? → PowerShell chạy LF OK; nếu giữ CRLF cố-ý ⇒ `-text` | `git check-attr text eol -- .claude/agents/reviewer.md``text: auto`, `eol: lf` (nay: unspecified) |
| **W0.2** | Re-smudge **CÓ PHÂN-LOẠI** | `git ls-files --eol` đo: **1267 `i/lf` · 25 `i/none` · 19 `i/-text` · 0 `i/crlf`**`git add --renormalize .` = **diff RỖNG ⇒ 0 commit ⇒ 0 CI**. File sạch → `rm` + `git checkout --`. 🔴 File **dirty** → rewrite byte tại chỗ, **CẤM `git checkout`**. Hiện dirty = 0 (chỉ 7 broadcast untracked) ⇒ **cửa-sổ sạch** | `git ls-files --eol \| grep -c 'i/lf.*w/crlf'` = **0** · `git status --short` KHÔNG mất file nào đang edit · `git diff --stat` sau renormalize = rỗng |
| **W0.3** | Sửa §5.0 **"chỉ-đuôi" → "toàn-bộ chưa-đẩy"** | `session-end.md:111-115`. Hợp-pháp 100%: wal: bị-kẹp **chưa-push** ⇒ fold **KHÔNG** vi-phạm N.4. ⚠️ `git rebase -i` **BỊ CHẶN** trong harness (Bash: *"Interactive flags not supported"*) ⇒ `GIT_SEQUENCE_EDITOR` trỏ script PS1 rewrite `pick <sha> wal:`**`fixup`**. 🔴 **`fixup` KHÔNG `drop`** — drop = **mất nội-dung** WAL/agent-memory/runs (khác hub: hub dùng drop + tree-identical verify; SE dùng fixup = an-toàn hơn, **KHÔNG cần** tree-verify vì fixup bảo-toàn content). **Biên:** wal: ở **đáy range** (0 commit thường bên dưới để fixup vào) ⇒ giữ nhánh `reset --soft HEAD~K` sẵn có — **ca n=4=K hôm nay rơi ĐÚNG biên này** | Phiên có ≥2 commit thường xen wal: ⇒ `n=0`. Tree **identical** trước/sau (kiểm phụ, không phải gate) |
| **W0.4** | Sửa `workflows/README.md:52` | Gỡ claim *"bypass-surface ~N/A"*; ghi đúng **3 đường** (`hmw.js` gate được · raw Workflow · raw Agent) + khai **kẽ CÒN-LẠI** | `grep -c "TAILORED-OUT.*bypass" README.md` = 0 · có dòng khai 3-đường |
| **W0.5** | Baseline 7 orphan-folder | Đóng (thêm `*-synthesis.md`) **HOẶC** scope scan `mtime > closeout cuối` | Sàn-3 chạy trên phiên sạch ⇒ trả đúng `{run đang bay}`, tồn-đọng **0** |
## 2.1 Sàn H22 (5) — SE-tailored
| Sàn | Đối ứng | Acceptance ĐO ĐƯỢC |
|---|---|---|
| **1** đăng-ký-dương @launch | `hmw.js` thêm tripwire **input-only** cạnh `checkpointApproved:83-85`: `if (A.taskList.length >= 3 && !(A.run?.dir && A.run?.name)) throw`. **CÙNG COMMIT** truyền cờ 3 wrapper: `fable-clone.md:15` · `ultra-on.md:18/33` · `/hmw` — thiếu = **vỡ đường đang chạy** (broadcast §4 nửa-(ii)). 🔴 Khai thật: **chỉ phủ `hmw.js`**; raw Workflow/Agent = **kẽ còn-lại KHÔNG gate được** (F2) | Phóng 3-task không `args.run`**throw**. `git grep -c "args.run" .claude/commands/` ≥ 3 |
| **2** closeout-sentinel | Ghi `closing: S<nn> @<ts>` vào WAL ở **`session-end` BƯỚC 0** (trước mọi flush); xoá ở **`§6.4:143`** — §6.4 **đã là đường LUÔN-CHẠY** sẵn ⇒ xoá-dấu-không-tồn-tại = net-zero. Self-heal: `0.7` gặp `closing:` + ground-truth sạch ⇒ dọn 1 lần, đi tiếp | Cắt session-end giữa chừng ⇒ phiên kế **thấy** `closing:`. Chạy no-op ⇒ `grep -c '^closing:' WAL.md` = **0** |
| **3** ground-truth khi sổ trống | **Định-nghĩa MỘT chỗ = `tiep.md` §0**; `session-start.md:51` **XOÁ logic → chỉ TRỎ** (`:54` đã tự tuyên "CHỈ LÀ CON-TRỎ" — nay làm cho đúng lời). **3 bậc SE-tailored vá điểm-mù hook** (hook auto-commit 3 path ⇒ "dirty"+"chưa-đẩy" MÙ đúng 3 vùng): **MẠNH** = ① `runs/<id>/``run.md``*-synthesis.md` vắng/0-byte (**git-independent, miễn-nhiễm hook** — đã có ở `session-start.md:97` nhưng **nằm SAU điểm quyết-định** + **skippable** `:98` ⇒ chỉ cần **hoist lên 0.7**) · ② `origin/main..HEAD` có commit **KHÔNG** phải `wal:` (hook không sinh loại này ⇒ không mù) · ③ `closing:` treo · 🆕 ④ **wal:-commit chưa-đẩy có đụng `.claude/workflows/runs/`****thu-hồi một phần điểm-mù**: dù WAL.md bị xoá trắng, **commit của chính hook vẫn tố-giác** run đã dựng (`git log --name-only --format='%s' origin/main..HEAD \| grep -q 'workflows/runs/'` — đo sống: `aab817b` touch `run.md`). **TRUNG-BÌNH** = >N file bẩn ngoài 3 path persist (🔴 **PHẢI loại nhiễu EOL trước** — 188 file ⇒ nếu không sẽ **luôn kêu**) · **YẾU** = bẩn thô | 2/2 điểm-vào (`/tiep` + `0.7`) gọi **CÙNG 1 định-nghĩa**. Dựng "WAL trống + 1 run-folder mở" ⇒ **cả 2 hỏi-lại**. `grep -c "chain rỗng" session-start.md` = **0** |
| **4** test-suite 3 lớp | `scripts/wal-recovery-test.ps1` — mẫu `-RepoRoot` cây-tạm **đã proven S95** (fault-injection). **4 ca:** dừng-sạch (kỳ-vọng im) · đứt-giữa-run (bắt) · **đóng-phiên-bị-cắt** (bắt) · **dấu-treo-nhưng-thực-sạch** (self-heal) | **4 verdict ghi ra FILE**, KHÔNG gạch-đầu-dòng. 🔴 Anti-Goodhart: inject-lỗi phải **FLAG**, không chỉ happy-path PASS |
| **5** hậu-kiểm cờ-vs-nội-dung | Gấp vào `§L.b(f)` 1 dòng: mọi `runs/<id>/` mtime-trong-phiên ↔ có dòng `wf: … run=<id>` trong WAL/session-log? Lệch ⇒ **NÊU** (informational, KHÔNG chặn) | Chênh-lệch **0**, hoặc in được danh-sách lệch |
| **push-guard** | Chuyển phép đếm **vào chính khối §5.2**, chained ngay trước `git push origin main`. 🔴 Đặt ở §5.0 = **KHÔNG đủ** (hook fire turn-boundary NẰM SAU §5.0/§5.1). **(a) so-sánh SỐ, cấm exit-code** — `grep -c` trả **exit 1 khi đếm 0** = ca SẠCH bị chặn (⚠️ `.claude/WAL.md:15` `verify:` lead viết sáng nay **đang dính idiom này**) ⇒ `n=$(…); [ "$n" -eq 0 ]`. **(b)** precheck ref = **N/A** (origin/main EXISTS) nhưng giữ else vô-hại. **(c)** `origin/main` = tên thật ✅ §5.0 đã đúng | (i) §5.0-mới trên phiên ≥2 commit thường xen wal: ⇒ `n=0`; (ii) đếm **ngay trước** push = 0 **trong CÙNG transcript-turn** với `git push`; (iii) sau push `git log --format='%s' origin/main -20 \| grep -c '^wal:'` **không tăng** so với 57 |
## 2.2 EOL (4 khối) — SE-tailored
| Khối | Đối ứng | Acceptance |
|---|---|---|
| **① SELF-CHECK** | ĐÃ CHẠY (§1.1). 🔴 **Metric phải `i/lf` KÈM `w/crlf`**`w/crlf` trần gộp file cố-ý-CRLF = dương-giả (hub tự báo-động-giả vì metric lỏng) | — |
| **③ FIX** | W0.1 + W0.2 (§2.0). **③(c) quote description = N/A** (block-scalar, chứng tầng mã-nguồn L3) | `git check-attr` + count=0 |
| **④(a) validator đọc BYTES** | `scripts/agent-frontmatter-eol-check.ps1` — đọc **byte**, KHÔNG text-mode (`splitlines` nuốt CR ⇒ **PASS-giả trên chính file đã chết** = tệ hơn không có). Verdict FAIL = (CRLF trong frontmatter). 🔴 **SE KHÔNG có file-đã-chết làm positive-control** (hub bảo hiệu-chỉnh bằng byte file-đã-chết, snapshot TRƯỚC fix) ⇒ **phải synthesize control** (CRLF-hoá 1 bản COPY trong cây-tạm `-RepoRoot`) + **KHAI THẬT nấc yếu hơn hub** | Validator trên copy-CRLF ⇒ **FAIL**; trên 12 agent thật ⇒ **PASS**. 🔴 Khai: *"control = synthetic, KHÔNG phải file-đã-chết"* |
| **④(b)(c)(d)** | (b) wire validator vào session-end · (c) **EOL-assert DÍNH LIỀN push, CÙNG khối** với push-guard · (d) **LOAD-VERIFY khi onboard agent** — SE **đã làm de-facto** (S107 office-document spawn-test cùng phiên) ⇒ **codify thành checklist**, không phải build mới | (c) đọc khối push ⇒ EOL-assert **cùng khối**. (d) checklist tồn tại `agents/README.md` |
| 🔴 **SCOPE** (L2) | Acceptance `count==0` **toàn-repo** = dương-giả (188 = `dotnet ef`/VS sinh, không phải squash-fallout) ⇒ **gate scope = `.claude/agents/**` + `.claude/commands/**` + `.claude/skills/**`** (3 class frontmatter); `Migrations/` = **INFORM-only** | `git ls-files --eol .claude/agents .claude/commands .claude/skills \| grep -c 'i/lf.*w/crlf'` = **0** (gate) · toàn-repo = INFORM |
## 2.3 H23 — **PA-1 Tailor tối-thiểu** (lane C nghiêng; 4 file .md, 0 frontmatter, 0 config, 0 số, H8 NGUYÊN-VẸN)
| # | Việc | Acceptance |
|---|---|---|
| (a) | **Vá GAP #6**: thêm `tier:'opus'` 🔴-BẮT-BUỘC-khi-Fable-UP vào `fable-clone.md` (**TRỎ** `runbook:431`, KHÔNG lặp nội-dung) | `Grep tool` (⚠️ **KHÔNG Bash-grep** — pattern `\|`+quote cho **false-negative**; lane C tự dính) `tier:'opus'` trong `fable-clone.md` ⇒ **≥1 hit** (nay **0**) |
| (b) | **Nhân form ghi-chú-đầu-cây** — SE **đã có bản mẫu đúng chuẩn** `hmw.js:32-42` (khối comment H8 ngay trên `resolveModel:43-51`, phủ mọi lane, KHÔNG lặp inline) ⇒ nhân sang **3 chỗ**: `agents/README.md:~75` (đầu decision-tree — note `:3` hiện ở đầu **FILE**, cách 72 dòng, khác heading ⇒ KHÔNG phủ cây) · `session-start.md:~96` · `session-end.md:~49` | 3 note tồn tại **≤5 dòng trên** dòng spawn đầu-tiên; nội-dung nêu *"mọi spawn dưới = `model: inherit` (H8 S66) = top-tier lead per-session; giá-trị SỐNG → BƯỚC 0.6 probe"* |
| (c) | **Checklist kết-nạp-sub 3-việc** (frontmatter `inherit` + `hmw.js` VALID_ROLES + spawn-site) vào `agents/README.md` — SE **có đủ 3 chỗ + đã chạy đúng** (office-document S107 9→10; 2 monitor S110 10→12) nhưng **chưa viết thành checklist** ⇒ gap = quy-trình | roster = VALID_ROLES = danh-sách (`fable-clone.md:19` = `fable-real.md:20` = `engine:345`) |
| (d) | §2(5) kỷ-luật động-từ = **n-a ĐÃ THOẢ** — grep 0 mis-nấc (`engine:348` "KHÔNG code-enforced" · `:353` "mechanized = 0" · `fable-real.md:22` · G-015 ×3) | re-grep enforce-verb quanh model/tier ⇒ **giữ 0** |
| 🔸 | **PA-2 (neo full-id cho `tier:'opus'`) = QUYỀN ANH** — con-số/policy mới; em KHÔNG tự đặt. Không chọn ⇒ alias-drift Opus-đời-sau **ở lại** (khai ở adap-report) | — |
## 2.4 H24 — adopt đủ 5 điểm
| # | Việc | Acceptance |
|---|---|---|
| (1) | **2 vai MỚI** `.claude/agents/lead-view-auditor.md` + `lead-omission-auditor.md` (cookie-cutter frontmatter 2 monitor sẵn: `model: inherit` · `memory: project` · `maxTurns: 18` · tools 4-RAG-read + Read/Grep/Glob/Bash, **NO Write/Edit**, propose-only). 🔴 **KHÔNG gộp** vào H1/H2. ⚠️ **VA-CHẠM TỪ-VỰNG**: `governance-detectors.ps1:15` đã sở-hữu `derived-staleness` ⇒ **cấm** tên "vai-STALE"; `GAP` quá-tải (`session-end.md:48` "build-gap vs floor-rot" · `memory-selfimprove-audit.ps1` "CRITERIA+GAP") ⇒ dùng `view`/`omission`. Treo `session-start.md §2.1.1:92` (2→4 monitor) + `session-end.md §L.b` | (a) `ls .claude/agents/*.md` = **14**; (b) mỗi FLAG khớp `^[A-Z0-9-]+ \| <class> \|`, class ∈ **enum ĐÓNG** trong config; (c) 🔴 **phép-thử-xoá-carry**: xoá thử 1 dòng carry đã-hứa khỏi `HANDOFF.md:5` ⇒ `lead-omission-auditor` **PHẢI kêu** `carry-dropped`, **máy im** (đúng — caveat (b)) |
| (2) | **2 detector máy** vào `governance-detectors.ps1` (điểm cắm: `Write-Flag:43-53` · `Write-Section:55` · `Get-GovernanceMd:118-127` · summary tail). **độ-tươi-tiêu-đề**: mốc-phải = ngày mới nhất dấu-mốc governance; mốc-trái = anchor "Last updated"; **tài-liệu KHÔNG anchor ⇒ BỎ QUA** (cấm bịa độ-phủ); flag khi trái<phải. 🔴 **PARSE NEO-PHẠM-VI** `\*\*Last updated:\*\*\s*(\d{4}-\d{2}-\d{2})` — cấm regex-bất-kỳ-đâu (§1.6). **tuổi-carry**: khoá sống qua ≥M **dòng-carry LIÊN-TIẾP**; chuỗi tính trên **dòng CÓ carry**, phiên vắng **KHÔNG phá chuỗi**; reset **CHỈ** khi khoá vắng trên dòng CÓ carry; cụm owner chủ-động giữ ⇒ **INFORM-only**. **GAP-2:** carry SE = **văn-xuôi KHÔNG khoá** ⇒ cần **quy-ước khoá (anh quyết format)**; **định-nghĩa "dòng-carry" = đoạn LOGIC `NEXT anh|NEXT em` BÊN TRONG mega-line, KHÔNG phải dòng vật-lý**. **GAP-3:** C2/B3 chỉ track 4 token (`:154-157`) ⇒ `menu`/`policy` MÙ ⇒ **+2 token** | (a) đổi số trong config ⇒ output đổi theo, **0 số hardcode** trong `.ps1` (nay: grep `memory-budget\|ConvertFrom-Json` = **0 hit**); (b) chạy trên `STATUS.md:6` ⇒ in **`2026-07-14`** (KHÔNG `2026-08-01`, KHÔNG `1987-03-07`, KHÔNG `2026-20-42`); (c) `TOTAL FLAGS` ≥ 46 **VÀ CÓ** dòng `permission-matrix/SKILL.md` |
| (3) | **Scheduler** = NET-NEW (grep `session[_-]?count\|counter\|tick` = **0 hit**). State `.claude/governance/.session-counter.json` (mẫu sẵn `.archive-strikes.json`/`.mfe-state.json`). Tick @`session-start` 0.7-bis; display 2 đầu. **Idempotent-key = HEAD commit-sha @tick** (resume cùng sha ⇒ KHÔNG tick 2). Số **LÙI = fail-loud**. Fire `>=` KHÔNG `=`. fire-guard chống bắn-trùng + lịch-sử fire có **cap**. 🔴 **cadence-triggered, LEAD tự thực-thi, KHÔNG hook**. ⚠️ Stop-hook auto-commit `agent-memory/` mỗi turn ⇒ nếu để counter trong `memory-budget.json` phải **content-based `last_ticked_session:"S119"`**, cấm blind-increment | (a) `/session-start` 2 lần cùng HEAD ⇒ **+1** (không +2); (b) sửa counter LÙI ⇒ **fail-loud**; (c) **bỏ 1 phiên đúng ngưỡng** ⇒ phiên kế in **OVERDUE** (chứng `>=`); (d) 2 lớp cross-check |
| (4) | **Positive-control SỐNG** = `permission-matrix/SKILL.md` (§1.5). 🔴 **CẤM vá trước.** Chuỗi: fire → reviewer chứng-kiến → vá → hết-fire | (1) detector MỚI chạy **TRƯỚC** vá ⇒ **PHẢI in** `permission-matrix/SKILL.md`; (2) reviewer chứng-kiến output; (3) vá; (4) chạy lại ⇒ dòng **BIẾN MẤT**, TOTAL giảm đúng số đã vá |
| (5) | **Kết-nạp 3 việc** — SE all-inherit ⇒ (a) **rút gọn** = frontmatter `inherit` (không pin full-id). `hmw.js:22` VALID_ROLES **12→14** (⚠️ `:104` STOP-HARD nếu vai ∉ list). **GỘP 1 EDIT với (2)+Sàn-1** | (a) VALID_ROLES = **14**; (b) spawn vai mới qua hmw ⇒ **KHÔNG** throw `:104`; (c) grep `12-agent\|12 sub` ⇒ **0 hit sót** (5 chỗ) |
## 2.5 owner-sign — 0 hành-động adopt
SE **đã stamp** H21+MTv3 (`RC-…11-07-2026-20-42-01`) + H22 (`RC-…12-07-2026-11-43-45`) **TRƯỚC** owner-sign hub (`RC-pqhuy1987-14-07-2026-10-05-50`, 07-14) ⇒ ledger SE **đã current**. Hub ghi nhận SE = **dự-án đầu tiên fleet adopt trọn H22**. ⇒ chỉ **báo nấc** ở adap-report.
---
# ③ CHECKLIST + WAVE
## 3.1 Đồ-thị phụ-thuộc
```
[W0] PRE-FLIGHT em-main SOLO ──PHẢI TRƯỚC TẤT CẢ──┐
├─ W0.1 .gitattributes ──PHẢI TRƯỚC── W0.2 re-smudge (checkout materialize theo attr mới)
├─ W0.2 re-smudge=0 ──PHẢI TRƯỚC── ④c EOL-assert cắm push (ngược = CHẶN MỌI PUSH phiên này)
├─ W0.3 §5.0 fix ──PHẢI TRƯỚC── commit thường ĐẦU TIÊN (n>0 vĩnh viễn nếu ngược)
├─ W0.4 README:52 ──PHẢI TRƯỚC── Sàn-1 (cớ "tailored-out" sẽ biện-minh skip)
└─ W0.5 baseline orphan ──PHẢI TRƯỚC── Sàn-3 (bão dương-giả)
[D-anh] 4 owner-decision ──PHẢI TRƯỚC── W2/W3 (số + policy)
[D7] Sàn-3 canonical @tiep.md ──PHẢI TRƯỚC── session-start 0.7 (chỉ TRỎ, B1)
[D6] 2 agent MỚI ──ĐỒNG-THỜI── hmw.js VALID_ROLES 12→14 ⇒ GỘP 1 owner (H24§5)
[D8] mọi edit code/cmd XONG ──PHẢI TRƯỚC── harness-11-engine.md (canonical tả cái ĐÃ làm)
[D9] chạy THẬT xong ──PHẢI TRƯỚC── stamp mark (H18: cấm stamp run-id chưa chạy) + adap-report
```
## 3.2 🔴 Bảng xung-đột file — quyết-định wave
| File | # chạm | Hạng-mục | Xử-lý |
|---|---|---|---|
| **`session-end.md`** | **7** | push-guard §5.2 · EOL-assert (cùng khối push) · Sàn-2 sentinel set+clear · Sàn-5 hậu-kiểm · ④b wire validator · H24 counter-display · H24 spawn-note | 🔴 **SERIAL, 1 owner = em-main, 1 EDIT PASS.** Fan-out = race chắc-chắn |
| **`session-start.md`** | **4** | Sàn-3 `:51` · H24 counter-display · H24 2 vai `:92` · H23 note `:96` | 🔴 SERIAL em-main, **SAU** `tiep.md` |
| **`hmw.js`** | **3** | Sàn-1 gate · VALID_ROLES 12→14 · H23 note-đầu-cây | 🔴 **GỘP 1 EDIT** |
| **`governance-detectors.ps1`** | 2 | 2 detector H24 | 🟢 **1 agent owner**, disjoint |
| **`harness-11-engine.md`** | ~5 | PHẦN N ext · §K/§O H24 · H23 · EOL floor | 🔴 SERIAL em-main **CUỐI** (D8) |
| **`tiep.md`** | 2 | Sàn-3 canonical · Sàn-2 sentinel-read | 🔴 em-main **TRƯỚC** session-start |
| `memory-budget.json` | 2 | nhịp H24 · counter | 🟡 số = **anh**. ⚠️ hook auto-commit path này ⇒ content-based key |
| `.gitattributes` · validator.ps1 · 2 agent MỚI · `wal-recovery-test.ps1` | 1 mỗi | — | 🟢 disjoint |
| 188 file worktree | 1 | re-smudge | 🟢 **0 commit** ⇒ 0 race git; race ở tầng **worktree-dirty** |
## 3.3 WAVE
| Wave | Song-song? | Task | Vai | File |
|---|---|---|---|---|
| **W0** PRE-FLIGHT | 🔴 **SOLO, KHÔNG fan-out** | W0.1→W0.5 (§2.0) | 👤 em-main | `.gitattributes` · 188 worktree · `session-end.md:111-115` · `README.md:52` · 7 orphan |
| **W1** disjoint build | ✅ **3 lane song-song** | ① `governance-detectors.ps1` +2 detector (neo-phạm-vi + carry-age) · ② `scripts/agent-frontmatter-eol-check.ps1` (byte-reader + synthetic control) · ③ `scripts/wal-recovery-test.ps1` (4 ca) | 🟨 impl-be ×1 · 🟪 test-spec ×2 | 3 file **disjoint hoàn-toàn** |
| **W2** gộp-1-owner | ⚠️ **2 lane** (khoá cứng D6) | ① `hmw.js` **1 EDIT**: Sàn-1 gate + VALID_ROLES→14 + H23 note · ② 2 agent MỚI `lead-view-auditor` + `lead-omission-auditor` | 🟨 impl-be (gộp ①②) | `hmw.js` + 2 `.md` mới |
| **W3** SERIAL command | 🔴 **SERIAL em-main, thứ-tự cứng** | `tiep.md` §0 → `session-start.md` (0.7 trỏ + counter + 2 vai + H23 note) → `session-end.md` **1 PASS 7 hạng-mục** → `fable-clone.md` GAP#6 → `agents/README.md` (checklist + note) | 👤 em-main | 5 file, **1 file 1 lần** |
| **W4** positive-control | 🔴 **SERIAL, sau W1①** | fire detector ⇒ **PHẢI in** `permission-matrix/SKILL.md` → 🟥 reviewer **chứng-kiến** → **RỒI MỚI** vá skill (54/216/bỏ Bg_*/+#82) → chạy lại ⇒ hết-fire | 🟥 reviewer + 👤 em-main | `permission-matrix/SKILL.md` |
| **W5** canonical | 🔴 SERIAL **CUỐI** (D8) | `harness-11-engine.md` PHẦN N ext + §K/§O · `rules.md` nếu cần | 👤 em-main | engine |
| **W6** đóng | 🔴 SERIAL | push-guard **CÙNG LƯỢT** với push → adap-report ×N → adap-request ×N → send-email | 👤 em-main | broadcasts/ |
## 3.4 🔴 QUYỀN ANH — 4 owner-decision (em KHÔNG tự quyết)
| # | Quyết-định | Đề-xuất em | Trạng-thái |
|---|---|---|---|
| **O1** | **H23 mức-độ adopt** — PA-1 (tailor tối-thiểu, 4 .md, H8 nguyên-vẹn) / PA-2 (PA-1 + **neo full-id** cho `tier:'opus'` ⇒ chặn alias-drift Opus-đời-sau) / PA-3 (n-a ⇒ GAP#6 ở lại) | **PA-1** (lane C nghiêng). PA-2 chỉ khi anh muốn neo phiên-bản = **policy mới = quyền anh** | ⚪ chờ |
| **O2** | **Số nhịp H24** — rà-nhẹ mỗi ? phiên · rà-sâu mỗi ? phiên · jump-K khi 1 class lặp ? lần. *(Nguồn hub: 6/15/3 — **hub bảo ĐỪNG CHÉP**, đặt số của mình)* | **6 / 15 / 3** (khởi-điểm = số hub, điều-chỉnh sau chu-kỳ-2). 🔴 `role_boundary_note`: số = **quyền anh** | ⚪ chờ (anh đã "OK đồng ý" adopt H24; **số vẫn cần ký**) |
| **O3** | **Quy-ước khoá carry** (GAP-2) — carry SE hiện là **văn-xuôi KHÔNG khoá** ⇒ detector tuổi-carry **không chạy được**. Cần format khoá bền | `[carry:<slug>]` gắn cuối mỗi mục NEXT (vd `[carry:binh-le-decision]`) — bền, grep được, không phá mega-line | ⚪ chờ |
| **O4** | **57 wal: đã lọt** | 🔴 **KHÔNG DỌN** — xem §3.5 | ✅ anh đã đồng ý (#3 "OK đồng ý") — ghi lại làm audit-trail |
## 3.5 57 wal: — KHÔNG DỌN (3 lý-do xếp theo sức nặng)
1. **Vi-phạm floor.** `harness-11-engine.md:408` (N.4) + `session-end.md:113`: *"KHÔNG BAO GIỜ rewrite commit đã-push"* = 🔴 FUNCTION-FLOOR, hard-safety **có chủ-đích**. Dọn = **tự phá điều-khoản mình vừa adopt**.
2. **Blast-radius phá chuỗi bằng-chứng của CHÍNH H22.** Range từ wal: cũ nhất (`ec81c5c`) = **78 commit, 21 commit THẬT đổi SHA**. Citation đo được: `12071c5` → cited **12 file** · `67be443` → **10 file** — **chính là 2 commit chứng-minh hook-FIRE** ở `engine:407` (N.3) + **adopt-report ĐÃ GỬI AI_INFRA**. Rewrite = **tự vô-hiệu-hoá bằng-chứng VERIFIED-RUNTIME của H22** + phá `§6.3` "SERVER-VERIFIABLE chain" + bắn cờ C1 hàng loạt + adap-report thành **không đối-chứng được**. **Đây là cái giá đắt nhất.**
3. **Hại thực-tế = 0.** Commit nội-dung hợp-lệ, không corrupt, chỉ ồn `git log`. Cộng: force-push remote dùng chung + Gitea runner (CI #388/#389 tham-chiếu) + repo trong **Dropbox** (rewrite + cloud-sync ⇒ rủi-ro `index.lock`, đã ghi N.7(e)).
**Khung đúng:** *57 = tổn-thất chìm, **cách-ly bằng chính-sách**. Giá-trị push-guard ở SE = **cầm máu ~10/phiên**, KHÔNG phải dọn quá-khứ.* Muốn "sạch mắt" ⇒ cosmetic 0-rewrite: alias `git log --invert-grep --grep='^wal:'`, hoặc note `rules.md §5.2` (wal: pre-S119 = noise đã-đóng-băng).
## 3.6 adap-request — 4 ứng-viên (anh-directed: report để hub tổng-hợp + broadcast sister)
| # | Nội-dung | Nấc |
|---|---|---|
| **R1** | 🔴 **H8 ⟂ pin-simple ⟂ H23 = 3 phát-biểu KHÔNG tương-thích** trên cùng 1 trục. H23 §1 tả **form riêng hub** như **sàn đã chốt**, mâu-thuẫn pin-simple (*"form mỗi đội tự quyết"*, *"cả hai đều đạt sàn"*); H8 (*"BẮT BUỘC mọi sister"*) **chưa từng retract tường-minh**. **Bằng-chứng: hub tự PIN 17/17 `claude-opus-4-8` trong khi broadcast all-inherit cho sister.** Sister đọc H23 nghĩa-đen ⇒ **tự tháo H8**. → Đề-nghị hub **reconcile + re-broadcast** | evidenced, đo được |
| **R2** | 🔴 **KHUNG push-guard giả-định SAI**: *"squash phủ được mọi wal: chưa-đẩy"* — sai với **mọi repo có hook per-turn + closeout >1 commit**. Hub tự soi 9-chưa-đẩy + **1** lọt; **SE = 57 (57×)**. Đề-xuất (α) KHUNG nói rõ squash phải phủ **toàn range chưa-đẩy**, không chỉ đuôi | evidenced 57 vs 1 |
| **R3** | 🔸 **Đề-xuất căn-cơ (vượt khung ⇒ PHẢI request)**: hook commit vào **side-ref** (`refs/wal/snapshot` qua `commit-tree`+`update-ref`) thay nhánh chính ⇒ nhánh **không bao giờ có wal:** ⇒ n≡0 trivially, durability giữ (ref trong `.git`, Dropbox sync). **Lệch N.2 floor** (*"git add 3 path + git commit"*) ⇒ **KHÔNG tự làm**. 🔸 **CHƯA VERIFY thực-nghiệm** — mới là lập-luận plumbing | proposal, khai chưa-verify |
| **R4** | 🔴 **EOL broadcast: nhân-quả sai + mô-hình thiếu.** (a) *squash lật EOL* — **sai với SE** (§5.0 = `reset --soft` = worktree-neutral; 188 = `dotnet ef`/VS). (b) Mô-hình "CRLF **VÀ** `': '`" **THIẾU** — lane B **đọc mã-nguồn** (js-yaml 4.1.1 trong `claude.exe`): `readLineBreak` CRLF-safe ⇒ `': '` N/A cho block-scalar; **NHƯNG regex delimiter LF-only `^---[ \t]*\n` ×2 song song bản vá `\r?\n` ×2 ⇒ CRLF ĐƠN-ĐỘC có thể đủ giết**. (c) acceptance `count==0` **toàn-repo** = **dương-giả factory** ⇒ phải scope. **Hub tự khai chưa đọc mã-nguồn — SE đọc được và bổ-sung** | evidenced tầng mã-nguồn |
## 3.7 n-a hợp-lệ (khai ở adap-report)
| Mục | Nấc |
|---|---|
| EOL ③(c) quote description | **n-a THẬT** — 12/12 block-scalar, js-yaml 4.1.1 chứng tầng mã-nguồn |
| H23 (2)(3) alias-vs-full-id | **rút gọn** theo §4 project-fit (SE = một-model-cho-mọi-sub) — **nhưng chỉ đúng Class A**; Class B (2) SỐNG ⇒ GAP#6 |
| H23 §2(5) kỷ-luật động-từ | **n-a ĐÃ THOẢ** — grep 0 mis-nấc |
| H23 §2(4) bộ-soát trợ-kiểm | **n-a: chưa dựng** (§4 cho phép "n-a: chưa dựng bộ-soát", giữ phòng-thủ) |
| Sàn-1 nửa-(ii) truyền cờ nội-bộ | **≈n-a** — không có lời-gọi engine→engine trong `hmw.js` |
| push-guard (b) precheck ref | **n-a** — `origin/main` EXISTS (giữ else vô-hại) |
| push-guard (c) remote-branch | **ĐÃ ĐẠT SẴN** — §5.0 dùng đúng `origin/main..HEAD` |
| owner-sign | **0 adopt** — SE stamp trước hub-sign |
## 3.8 Rủi-ro + cách chặn
| Rủi-ro | Chặn |
|---|---|
| 🔴 `git checkout` mù trên file dirty ⇒ **hủy việc** (= `E-029` hub) | W0.2 **phân-loại trước**; chạy khi worktree sạch; `git status` gate |
| 🔴 push-guard `-eq 0` chép nguyên ⇒ **DEADLOCK push** (§5.0 không squash kẹp-sâu) | **W0.3 PHẢI trước** — sửa §5.0 = tiền-đề |
| 🔴 `grep -c` exit-1-khi-0 ⇒ ca sạch bị chặn | `n=$(…); [ "$n" -eq 0 ]`. **Sửa luôn `WAL.md:15` `verify:`** |
| 🔴 Vá `permission-matrix` sớm ⇒ **giết positive-control** | W4 **sau** W1①; reviewer chứng-kiến fire trước |
| 🔴 Sàn-3 wire thẳng ⇒ **bão dương-giả** (8/27 orphan) | W0.5 baseline trước |
| 🔴 Detector độ-tươi parse ngây-thơ ⇒ **tự giết** (`2026-08-01` tương-lai) | **neo-phạm-vi BẮT BUỘC**; test-vector `STATUS.md:6` ⇒ `2026-07-14` |
| 🔴 `rebase -i` bị chặn harness | `GIT_SEQUENCE_EDITOR` + **fixup** (KHÔNG drop) |
| 🟡 gotcha #53 return-garble (~21 lần) | RETURN-FORMAT VERDICT-header + schema-nhỏ; garble ⇒ recover-from-disk |
| 🟡 gotcha #68 IDE diagnostic giữa background-agent = snapshot dở | Chỉ tin build SẠCH chạy SAU agent |
| 🟡 **CI trigger** — AS-6 (từ #495): `.claude/agent-memory/**` + `runs/**` **KHÔNG** trigger; **`scripts/*.ps1` + `.json` + `.gitattributes` THÌ CÓ** | W1/W2 sẽ trigger CI ⇒ cicd-monitor verify; **KHÔNG** dùng `paths-ignore` để né (che drift) |
| 🟡 Restart CLI — command `.md` no hot-reload (`fable-clone.md:8`) | Khai nấc **"executed → restart-then-verify"**; 2 agent MỚI = **ADD** ⇒ S107 hot-reload OK **nhưng ENV-DEPENDENT** ⇒ restart = default |
## 3.9 Acceptance TỔNG (gate đóng spec)
```
[ ] W0.2 git ls-files --eol .claude/agents .claude/commands .claude/skills | grep -c 'i/lf.*w/crlf' → 0
[ ] W0.3 phiên ≥2 commit thường xen wal: → n=0 (KHÔNG deadlock)
[ ] Sàn1 phóng 3-task thiếu args.run → throw
[ ] Sàn2 cắt session-end → phiên kế thấy `closing:` ; no-op → grep -c '^closing:' = 0
[ ] Sàn3 "WAL trống + run-folder mở" → CẢ /tiep VÀ 0.7 hỏi-lại ; grep -c "chain rỗng" session-start.md = 0
[ ] Sàn4 4 verdict ghi FILE (không gạch-đầu-dòng) ; inject-lỗi → FLAG
[ ] Sàn5 chênh cờ-vs-nội-dung = 0 hoặc in danh-sách
[ ] push đếm=0 CÙNG transcript-turn với git push ; sau push wal: trên origin/main KHÔNG tăng (giữ 57)
[ ] H23 Grep tool `tier:'opus'` trong fable-clone.md ≥1 ; 3 note-đầu-cây ≤5 dòng trên spawn đầu
[ ] H24 ls .claude/agents/*.md = 14 ; VALID_ROLES = 14 ; detector in 2026-07-14 (không 2026-08-01)
[ ] H24 TOTAL FLAGS ≥ 46 VÀ có dòng permission-matrix/SKILL.md ← fire TRƯỚC vá
[ ] H24 /session-start 2× cùng HEAD → counter +1 ; counter lùi → fail-loud ; bỏ phiên → OVERDUE
[ ] EOL validator FAIL trên copy-CRLF cây-tạm ; PASS trên 12 agent thật ; khai control = synthetic
[ ] cicd CI PASS sau push (scripts/*.ps1 + .gitattributes CÓ trigger)
```
---
## Nấc trung-thực (giữ nguyên khi adap-report)
- **Provenance:** `/fable-clone investigator-codebase` 5-lane ensemble `wf_1f6bd5e2-478` (Opus, 5/5 return, **0-garble**) + **lead soi hub trực-tiếp** (`lead-evidence-hub-inspect.md`). Lead **refute + synthesize**; **4 cú lật bác cả tiền-đề của chính lead** (§1.2).
- **Nấc SE sau adopt:** `executed → restart-then-verify` (command `.md` no hot-reload).
- **KHÔNG overclaim:** Sàn-1 chỉ phủ `hmw.js`; **raw Workflow/Agent tool = kẽ CÒN-LẠI KHÔNG gate được** (F2 — chính run này đi đường đó). Validator **PHÁT-HIỆN** không **NGĂN-CHẶN**. Toàn tầng H24 = **quy-ước lead-executes**, **KHÔNG hook, KHÔNG enforce** — cấm viết "cơ-giới-hoá".
- **Control yếu hơn hub:** SE **không có file-đã-chết** ⇒ synthetic control (khai thật).
- **H24 dogfood n=1 tại hub (mốc-0), chưa chu-kỳ-2** ⇒ **cấm bán "đã chứng-minh hiệu-quả"**. Flag TĂNG khi thêm detector-class = **mở-rộng-thiết-bị**, KHÔNG phải governance mục-ruỗng (caveat (d)).
- **CHƯA VERIFY:** R3 side-ref (lập-luận plumbing, chưa thực-nghiệm) · hub `spawn_model_audit` (`ls scripts/|grep -i spawn|model` = rỗng dù commit `9bb5701` nhắc "LIVE 29-dispatch") · `fable-clone.md` từng có `tier:'opus'` trước S110 hay chưa (hiện-trạng vắng = **VERIFIED**).
- **E-030 hub defer EXECUTE CRLF sang s95** ⇒ **SE đi TRƯỚC hub** ở khối EOL; không có mẫu chạy sẵn để chép.

View File

@ -0,0 +1,101 @@
# Lane A — wal-defect+push-guard
> RETURN-only tu /fable-clone ensemble wf_1f6bd5e2-478 (vai investigator-codebase, model opus).
> Lead ghi (B3 single-writer) — sub KHONG tu ghi. agentId=ac0786c3493eb2fa9
---
VERDICT: SE ĐÃ CÓ vật-liệu cho cả 5 sàn nhưng **0/5 sàn đạt** — và push-guard **KHÔNG THỂ adopt verbatim**: `n=0` là ĐÍCH BẤT-KHẢ-ĐẠT vì `session-end.md:113` CỐ-Ý từ-chối squash wal: bị-kẹp; 57 wal: đã lọt remote **toàn bộ là loại bị-kẹp** (đo: 0/57 nằm ở đuôi) → chứng minh kênh rò chính của SE là **thuật-toán §5.0 chỉ-đếm-đuôi**, KHÔNG phải kẽ turn-seam mà broadcast mô tả; sửa §5.0 là **tiền-đề** của push-guard, không phải phụ-kiện.
---
## Bảng 5 sàn + push-guard
| Sàn | SE hiện-trạng (file:line) | GAP | Cách đối ứng | Acceptance ĐO ĐƯỢC |
|---|---|---|---|---|
| **1** đăng-ký-dương @launch | `hmw.js:19` khai `args.run` "🔴 BẮT BUỘC khi ≥3 task HOẶC >5 phút" — nhưng `hmw.js:9` + `workflows/README.md:32` tự khai **"script no-fs KHÔNG tự ép — enforcement = em-main scaffold @P1"**. Gate DUY-NHẤT đang chạy = `hmw.js:83-85` `checkpointApproved` (anti-accidental-fire, **KHÔNG** phải marker-gate) | **Nửa (i) = 0** (không cổng-vào nào chặn thiếu-marker). **Nửa (ii) ≈ N/A** (không có lời-gọi nội-bộ engine→engine). Sàn = **convention thuần** | Thêm vào `hmw.js` (sau block `checkpointApproved:85`) 1 tripwire **input-only** (no-fs, khả thi): `if (A.taskList.length >= 3 && !(A.run && A.run.dir && A.run.name)) throw` — mirror y hệt pattern `checkpointApproved`. RỒI **cùng commit** truyền cờ ở 3 wrapper: `fable-clone.md:15` · `ultra-on.md:18/33` · `/hmw` — thiếu bước này = **vỡ đường đang chạy** (đúng cảnh báo broadcast §4) | Phóng 3-task **không** `args.run` → throw. Đo: **3/3 wrapper** phóng ≥3-task đều mang `args.run`; `git grep -c "args.run" .claude/commands/` ≥ 3 |
| **2** closeout-sentinel | `session-end.md:143-145` §6.4 reset WAL = bước CUỐI. `pause.md` toàn file: **0 sentinel**. Không có dấu 'đang-đóng' ở bước đầu | **Toàn sàn = 0.** Đóng-phiên chết giữa §L.b(f) → WAL đã bị… (thực ra chưa reset) → nhưng **không dấu nào** phân biệt "chưa chạy session-end" vs "session-end chết giữa" | Ghi `closing: S<nn> @<ts>` vào WAL **ở `session-end` BƯỚC 0** (trước Phase 1 flush); xoá ở `§6.4` — §6.4 đã là **đường LUÔN-CHẠY** sẵn (bước cuối vô-điều-kiện) → xoá-dấu-không-tồn-tại = net-zero, khớp yêu cầu. Self-heal: `0.7` gặp `closing:` + ground-truth sạch → dọn 1 lần, đi tiếp | Cắt session-end giữa chừng → phiên kế `0.7` **thấy** `closing:`. Chạy 1 phiên no-op → `grep -c '^closing:' .claude/WAL.md` = **0** |
| **3** ground-truth khi sổ trống | `session-start.md:51` (a): *"chain rỗng/toàn `[x]` → báo 'WAL sạch' rồi tiếp Phase 1 (no-wait)"* · `tiep.md:15`: *"chain rỗng/toàn `[x]` → DỪNG SẠCH"* | **Lỗi SỐNG, ×2 chỗ:** suy thẳng trống⇒sạch. **VI-PHẠM "định-nghĩa MỘT chỗ"** — logic (a) bị **copy song-bản**`session-start.md:54` tự tuyên "bước này CHỈ LÀ CON-TRỎ" (B1 con-trỏ-canonical bị thủng đúng nhánh này) | Định-nghĩa 3-bậc **MỘT chỗ = `tiep.md`** (thêm §0 "Đối-chứng thực-địa"); `session-start.md:51` **xoá logic, chỉ trỏ**. Xem 3-bậc SE-tailored ↓ | 2/2 điểm-vào (`/tiep` + `0.7`) đều gọi CÙNG 1 định-nghĩa. Dựng "WAL trống + 1 run-folder mở" → **cả 2 hỏi-lại**, không tuyên sạch. `grep -c "chain rỗng" .claude/commands/session-start.md` = **0** |
| **4** test-suite 3 lớp | **`ls scripts/ \| grep -iE 'wal\|recover\|tiep'` = NONE.** S111 fault-inject 2-ca (`broadcasts/outbox/ai_infra/2026-07-12-…-wal-adopt-report.md:31`) nhắm **hook-persist** (thiếu-1-path vẫn commit · 0-delta im lặng), **KHÁC trục** với recovery. `harness-11-engine.md:411` (N.7a) tự khai *"pilot CHƯA chạy đủ"* | **0/3 lớp.** Chưa có cả lớp-1 (dừng-sạch). Bị **chặn bởi Sàn 3** — chưa có detector thì không có gì để test | `scripts/wal-recovery-test.ps1` (mẫu `-RepoRoot` cây-tạm đã proven S95 fault-injection) — 4 ca: dừng-sạch(kỳ vọng im) · đứt-giữa-run(bắt) · đóng-phiên-bị-cắt(bắt) · **dấu-treo-nhưng-thực-sạch(self-heal)** | `4 verdict` ghi ra file, **không** gạch-đầu-dòng. Anti-Goodhart: inject-lỗi phải **FLAG**, không chỉ happy-path PASS |
| **5** hậu-kiểm cờ-vs-nội-dung | Gần nhất = `session-start.md:97` §2.1.1 harvest-curator **folder-scan orphan** (`run.md` có, `*-synthesis.md` vắng) + `session-end.md:51` §L.b(f) close-gate. `workflows/README.md:20` = orphan-authority | **Lệch trục:** hiện soi *run-folder ↔ synthesis*, **KHÔNG** soi *cờ `args.run` ↔ mục `wf:` trong WAL*. Và `:98` khai **"Light session → có thể skip"** | Gấp vào §L.b(f) 1 dòng: mọi `runs/<id>/` mtime trong phiên ↔ có dòng `wf: … run=<id>` trong WAL/session-log? Lệch → **NÊU** (informational) | Chênh-lệch = **0**, hoặc in được danh-sách lệch. Chi-phí ~0 (gấp vào gate sẵn có) |
---
## 🔴 push-guard — GAP nghiêm-trọng nhất (mâu-thuẫn cấu-trúc, không phải thiếu-sót)
**Vị trí hiện tại:** `session-end.md:111-115` §5.0 squash → `:117-120` §5.1 commit-chốt → `:122-124` §5.2 push. **§5.0 cách §5.2 hai bước, KHÔNG sát push, KHÔNG cùng lượt.**
**Nhưng kẽ THẬT của SE lớn hơn kẽ broadcast mô tả:**
- `session-end.md:112` — K = số subject **LIÊN-TỤC** `wal:` từ HEAD xuống, **DỪNG ngay khi gặp subject KHÁC**.
- `session-end.md:113`*"wal: kẹp sâu hơn (sandwiched DƯỚI commit thường chưa-push) → **GIỮ NGUYÊN**, chấp-nhận noise"*.
**§5.0 cấu-trúc KHÔNG THỂ đưa n về 0 trong bất-kỳ phiên nào tạo >1 commit.** Đo sống:
```
3fde8af [CLAUDE] Docs: S118 closeout ← §5.0 @S118 đã fold 2 wal: ở đuôi vào đây (reflog HEAD~2) ✓
c808b9a [CLAUDE] Auth: gate ReportsController
1491d29 wal: flush 20260714T1549 ← BỊ KẸP → §5.0 từ-chối → LỌT
b7f7b56 wal: flush 20260714T1531 ← BỊ KẸP → LỌT
c2135ba [CLAUDE] Auth: PRO role giu quyen
```
**57 wal: trên origin/main = 0 ở đuôi, 57 bị-kẹp** (14 khối liên-tục: 3×1, 6×2, 1×4, 2×7, 1×8, 1×16). Squash CÓ chạy và chạy ĐÚNG — chỉ là **phạm-vi cố-ý hẹp**. Tốc-độ rò ~**10/phiên** (37 @07-12 · 10 @07-13 · 10 @07-14 — bắt đầu đúng ngày hook lên S111, trước đó 0).
**Đo live lượt này (thay đổi so với số lead đo):** `origin/main..HEAD` = **n=4** (lead đo 3 lúc 08:43 → hook fire thêm `aab817b` @09:29). K=4=n → **lúc này** chưa kẹp → guard sẽ PASS. **Nhưng** ngay khi S119 tạo commit thường đầu tiên (spec-file/wave), wal: dưới nó thành bị-kẹp → §5.0 từ-chối → **n>0 vĩnh-viễn → push-guard chặn cứng, không lối thoát.**
**Ba điểm kỹ-thuật (a)(b)(c) — đối chiếu SE:**
- **(a) exit-code trap — SE ĐANG PHƠI-NHIỄM.** Demo chạy sống: `git log --format='%s' origin/main..HEAD | grep -c '^zzz:'`**in `0`, exit `1`**. `.claude/WAL.md:15` `verify:` hiện dùng **đúng** idiom `| grep -c '^wal:'` → nếu lead chain `&& git push` thì **ca SẠCH bị chặn**. → Bắt buộc `n=$(…); [ "$n" -eq 0 ]`.
- **(b) first-push precheck** — `git rev-parse --verify --quiet origin/main` ✅ EXISTS → **N/A cho SE** (repo đã thiết-lập), nhưng giữ nhánh else = vô-hại.
- **(c) remote-branch tên thật** = **`origin/main`** (`git remote`=origin; `@{upstream}`=origin/main; `§5.2` push `origin main`). §5.0 **đã dùng đúng** `origin/main..HEAD` ✅ — điểm (c) SE đã đạt sẵn.
**Cách đối ứng (2 phần, KHÔNG tách được):**
1. **Nâng §5.0 từ "chỉ-đuôi" → "toàn-bộ-chưa-đẩy".** Hợp-pháp 100%: wal: bị-kẹp **chưa-push** → fold chúng **KHÔNG** vi-phạm N.4 "không rewrite đã-đẩy". ⚠️ `git rebase -i` **bị chặn trong harness này** (Bash tool: "Interactive flags not supported") → dùng `GIT_SEQUENCE_EDITOR` trỏ script (SE đã quen PS1: `wal-flush.ps1`/`governance-detectors.ps1`) rewrite `pick <sha> wal:``fixup` (**fixup, KHÔNG drop** — drop = mất nội-dung WAL/agent-memory/runs). **Biên phải xử:** wal: nằm ở **đáy range** (không có commit thường bên dưới để fixup vào) → giữ nhánh `reset --soft HEAD~K` sẵn có; ca n=4=K hôm nay rơi đúng biên này.
2. **Đặt guard SÁT push, CÙNG LƯỢT** — chuyển phép đếm vào chính khối `§5.2`, chained ngay trước `git push origin main`. Đặt ở §5.0 = **KHÔNG đủ** (hook fire ở turn-boundary NẰM SAU §5.0/§5.1).
**Acceptance đo được:** (i) chạy §5.0-mới trên phiên có ≥2 commit thường xen wal: → `n=0`; (ii) `git log --format='%s' origin/main..HEAD | grep -c '^wal:'` **ngay trước** push = 0 **trong cùng transcript-turn** với `git push`; (iii) sau push, `git log --format='%s' origin/main -20 | grep -c '^wal:'` **không tăng** so với 57.
> ⚠️ **Đây là ứng-viên `/adap-request` chính-đáng.** KHUNG push-guard giả-định "squash phủ được mọi wal: chưa-đẩy" — giả-định đó **sai với mọi repo có hook per-turn + closeout >1 commit**. Hub tự soi thấy 9-chưa-đẩy + **1** đã lọt; SE = **57** (57×). Đề-xuất ngược 2 hướng: (α) KHUNG nói rõ squash phải phủ **toàn range chưa-đẩy**, không chỉ đuôi; (β) căn-cơ hơn — **hook commit vào side-ref** (`refs/wal/snapshot` qua `commit-tree`+`update-ref`) thay vì nhánh chính → nhánh không bao giờ có wal: → n≡0 trivially, durability giữ nguyên (ref nằm trong `.git`, Dropbox sync). (β) **lệch N.2 floor** ("git add 3 path + git commit") → phải qua adap-request, KHÔNG tự làm. 🔸 CHƯA VERIFY (β) bằng thực-nghiệm — mới là lập-luận plumbing.
---
## 🧹 57 wal: đã lọt remote — **KHÔNG dọn. Chấp nhận sunk-cost.**
**Có thể không?** Kỹ-thuật thì có (`filter-repo` + force-push). **Có nên không? KHÔNG — 3 lý do xếp theo sức nặng:**
1. **Vi-phạm floor.** `harness-11-engine.md:408` (N.4) + `session-end.md:113`: *"KHÔNG BAO GIỜ rewrite commit đã-push"* = 🔴 FUNCTION-FLOOR, đánh-đổi hard-safety **có chủ-đích**. Dọn = tự phá chính điều khoản mình vừa adopt.
2. **Blast-radius phá chuỗi bằng-chứng của chính H22.** Range từ wal: cũ nhất (`ec81c5c`) = **78 commit, trong đó 21 commit THẬT đổi SHA**. Đo citation trong repo:
- `12071c5` → cited **12 file** · `67be443`**10 file****chính là 2 commit chứng-minh hook-FIRE**`harness-11-engine.md:407` (N.3) + adopt-report gửi AI_INFRA
- `88368fd` → 8 · `d436af2` → 7 · `81b59f0` → 7 · `c2135ba` → 6 · `c808b9a` → 6 · `e88e75d` → 4
→ Rewrite = **tự vô-hiệu-hoá bằng-chứng VERIFIED-RUNTIME của H22**, phá `§6.3` "SERVER-VERIFIABLE chain N commit sha", bắn cờ C1 broken-pointer hàng loạt, và làm adap-report đã gửi hub thành **không đối-chứng được**. Đây là cái giá đắt nhất.
3. **Hại thực-tế của 57 = 0.** Chúng là commit **nội-dung hợp-lệ** (WAL.md/agent-memory/runs state), không corrupt gì, chỉ làm `git log` ồn. Cộng: force-push vào remote dùng chung + Gitea runner (CI #388/#389 tham chiếu commit) + repo nằm trong Dropbox (rewrite + cloud-sync = rủi-ro `index.lock`, đã ghi ở N.7(e)).
**Khung đúng để báo anh:** *57 = tổn-thất chìm, **cách-ly bằng chính-sách**, không dọn. Giá-trị của push-guard ở SE = **cầm máu ~10/phiên**, KHÔNG phải dọn quá-khứ.* Nếu muốn "sạch mắt" → cosmetic-only, 0-rewrite: `git log --invert-grep --grep='^wal:'` làm alias xem-log, hoặc note 1 dòng trong `rules.md §5.2` giải-thích wal: pre-S119 = noise đã-đóng-băng.
---
## 3 phát-hiện ngoài đề-bài (đều đo được, đều chạm quyết-định)
1. **Lớp-1 của broadcast KHÔNG lý-thuyết ở SE — S118 là ca THẬT.** `ls .claude/workflows/runs/`**không có folder S118 nào** (có 2026-07-14-S117-*, nhảy thẳng sang 2026-07-15-S119). Mà HANDOFF:5 ghi S118 = *"em-main-led + **7 spawn** + 3 commit + 2 deploy"*. → Một run 7-agent, trọn ngày, **0 run-folder, 0 dòng `wf:`, 0 marker**. Nếu S118 chết giữa chừng → sổ trống → phiên sau tưởng sạch. **Đây là bằng-chứng nội-bộ SE cho đúng kẽ hub mô tả.**
2. **`workflows/README.md:52` là claim STALE đang che Sàn 1.** Nguyên văn: *"Anti-bypass detector: **SE TAILORED-OUT** — SE chạy workflow qua Anthropic Workflow tool (KHÔNG có CLI-launcher để lách) → **bypass-surface ~N/A**"*. **Bị bác bởi 2 dữ-kiện:** (i) memory `feedback_harness10_run_trace.md:20`*"**RECURRED S72**: chạy REVIEW qua **RAW Workflow tool** (KHÔNG qua hmw.js wrapper) → KHÔNG inject writeGuard → reviewer tự ghi MEMORY +2850B over-cap → em-main git-status BẮT @session-end + revert"* → kết luận nguyên văn: *"dùng RAW Workflow tool = **MẤT governance của project-wrapper**"*; (ii) S118 raw-Agent 7-spawn ở trên. → **Đồ-thị lời-gọi thật của SE = 3 đường tới engine:** `hmw.js` (đường DUY-NHẤT SE sở-hữu & gate được) · **raw Workflow tool** · **raw Agent/Task tool**. Hai đường sau thuộc harness Anthropic → **SE KHÔNG gate được** = kẽ CÒN-LẠI, đúng như broadcast §5 tự khai. 🔴 Phải sửa `README.md:52` **trước** khi adopt Sàn 1, nếu không cái cớ "tailored-out" sẽ (sai) biện-minh cho việc skip luôn Sàn 1.
3. **Sàn 3 wire thẳng = bão báo-động-giả ngay lượt đầu** (đúng cái `Sàn 2` cảnh báo *"báo-động-giả lặp còn hại hơn kẽ gốc"*). Chạy folder-scan theo authority `README.md:20`**8/27 run-folder = orphan**, 7 là **tồn-đọng cũ** (S112 ×4, S113, S114, 2026-07-13-pe-negative-quote), 1 là S119 đang bay hợp-lệ. Spot-check 3/7: chỉ có `run.md` + `spec-*.md`, **0 `*-synthesis.md`** (⚠️ CHƯA VERIFY harvest có thật xảy ra vào `agent-memory/` hay không — hai cách đọc, cùng 1 kết luận). → **Phải baseline TRƯỚC khi wire:** hoặc dọn/đóng 7 folder, hoặc giới-hạn scan theo mtime > lần closeout cuối. **Acceptance:** `0.7` trên phiên sạch trả về đúng `{run đang bay của phiên hiện tại}`, tồn-đọng = **0**.
---
## 3-bậc ground-truth SE-tailored (Sàn 3 — vá điểm-mù hook)
Điểm-mù đúng như broadcast: hook `wal-flush.ps1:7` auto-commit **3 path** {`WAL.md` · `agent-memory/` · `workflows/runs/`} → *"dirty file"**"commit chưa-đẩy"* **MÙ đúng 3 vùng đó**. Nhưng SE có **lối thoát mà broadcast không kê** — hook chỉ tạo subject `wal:` (`wal-flush.ps1:16`), nên **soi theo PATH bên trong wal:-commit là tín-hiệu sống**:
- **MẠNH** (một cái là đủ để **hỏi-lại**, không tuyên sạch):
1. `runs/<id>/``run.md``*-synthesis.md` vắng/0-byte — **git-independent, miễn-nhiễm hook** ← trụ chính, đã có sẵn ở `session-start.md:97` nhưng **nằm SAU điểm quyết-định `0.7`****skippable** (`:98`) → chỉ cần **hoist lên `0.7`**, chi phí ~0
2. `origin/main..HEAD` có commit **KHÔNG** phải `wal:` → hook không sinh loại này → **không mù**
3. `closing:` sentinel còn treo (Sàn 2)
4. 🆕 **wal:-commit chưa-đẩy có đụng `.claude/workflows/runs/`****thu-hồi được một phần điểm-mù hook**. Đo sống lượt này: `aab817b` touch `.claude/WAL.md` + `runs/2026-07-15-S119-…/run.md` → dù WAL.md có bị xoá trắng, **commit của chính hook vẫn tố-giác** rằng một run đã được dựng. Lệnh: `git log --name-only --format='%s' origin/main..HEAD | grep -q 'workflows/runs/'`
- **TRUNG-BÌNH:** >N file bẩn ngoài 3 path persist (N tự chỉnh — SE có 188 file i/lf+w/crlf, ngưỡng phải **loại nhiễu EOL** trước, nếu không sẽ luôn kêu → lane B)
- **YẾU:** bẩn thô sau loại-trừ
**Ghi MỘT chỗ = `tiep.md` §0; `session-start.md:51` xoá logic → trỏ.** (`:54` đã tự tuyên là con-trỏ — nay làm cho đúng lời.)

View File

@ -0,0 +1,208 @@
# Lane B — eol-crlf
> RETURN-only tu /fable-clone ensemble wf_1f6bd5e2-478 (vai investigator-codebase, model opus).
> Lead ghi (B3 single-writer) — sub KHONG tu ghi. agentId=a764864a453971129
---
VERDICT: SE **KHÔNG SKIP** (autocrlf=true@system + file-frontmatter agents = có bề-mặt), NHƯNG lăng-kính B lật 2 tiền-đề của broadcast: (a) tôi ĐÃ ĐỌC ĐƯỢC parser mà broadcast tự khai chưa đọc — **js-yaml 4.1.1** nhúng trong `claude.exe`, `readLineBreak` xử-lý CRLF native → nửa `': '` **THẬT-SỰ N/A** cho SE (12/12 block-scalar), nhưng tôi cũng tìm thấy **regex delimiter LF-only `^---[ \t]*\n` ×2 tồn tại song song bản đã vá `\r?\n` ×2****CRLF ĐƠN-ĐỘC có thể đủ giết, KHÔNG cần `': '`** → SE **KHÔNG được tuyên miễn-nhiễm**; (b) §5.0 squash của SE = `git reset --soft` = **worktree-neutral** → 188 file **KHÔNG phải squash-fallout** mà là **`dotnet ef`/VS sinh CRLF** (131/188 = Migrations) → **acceptance `count==0` toàn-repo của hub là FALSE-POSITIVE FACTORY cho SE, phải scope**.
---
## 1) PROJECT-FIT — kết-luận từng nửa
| Nửa | Verdict SE | Bằng-chứng |
|---|---|---|
| "dùng agent dạng file-frontmatter?" | **CÓ** → không SKIP | `.claude/agents/` 12 agent + `.claude/commands/` 30 + `.claude/skills/*/SKILL.md` — cả 3 class đều frontmatter `---` |
| "autocrlf mọi tầng = false?" | **KHÔNG** → không SKIP | `git config --show-origin --get-all core.autocrlf``file:C:/Program Files/Git/etc/gitconfig true` |
| **nửa `': '` chưa-quote** | **N/A THẬT — đã chứng ở tầng mã-nguồn** | 12/12 dùng `description: |` (verify từng file). Block scalar YAML = nội-dung KHÔNG bị quét chỉ-thị `:`. Parser = **js-yaml 4.1.1** (chuỗi license trong `claude.exe`) — thư-viện trưởng-thành, block-scalar đúng spec. |
| **nửa CRLF** | **🔴 KHÔNG miễn — và broadcast UNDER-STATE rủi-ro** | Xem §2 |
### §2 — Phát-hiện lật mô-hình broadcast (đây là giá-trị chính của lane B)
Broadcast dòng 29 tự khai: *"KHÔNG khẳng-định đã đọc mã-nguồn của bộ-đọc"*. Tôi đọc được:
**(a) Tầng chặt = js-yaml 4.1.1 → CRLF-safe, ĐÃ CHỨNG.** Trích `readLineBreak` minified nguyên-văn từ `C:\Users\pqhuy\AppData\Roaming\Claude\claude-code\2.1.209\claude.exe`:
```js
function qM(e){var t;t=e.input.charCodeAt(e.position),
t===10?e.position++
:t===13?(e.position++,e.input.charCodeAt(e.position)===10&&e.position++)
:ar(e,"a line break is expected"),e.line+=1,...}
```
`13`=CR → nuốt, rồi nuốt tiếp `10`=LF → CRLF = **một** line-break. Broadcast đoán đúng, nay có chứng-cứ mã-nguồn.
**(b) NHƯNG tầng LF-only CÓ THẬT, và nó ở tầng TÁCH DELIMITER — TRƯỚC cả js-yaml.** Đếm literal trong cùng binary:
| regex | số | CR-tolerant? |
|---|---|---|
| `^---\s*\n` | 4 | ✅ (`\s` khớp `\r`) |
| `^---[ \t]*\r?\n` | 2 | ✅ (đã vá tường-minh) |
| **`^---[ \t]*\n`** | **2** | **🔴 KHÔNG — `[ \t]` KHÔNG khớp `\r`** |
→ Có **≥2 đường đọc frontmatter chưa-vá**. Trên file CRLF, dòng 1 = `---\r\n`; `^---[ \t]*\n` **không match** → frontmatter **không được nhận-diện** → agent rớt registry **mà js-yaml chưa từng được gọi****block-scalar KHÔNG cứu**.
Chứng phụ (telemetry-name trong binary): `tengu_frontmatter_shadow_mismatch`, `tengu_frontmatter_shadow_unknown_key`, `agentFrontmatter`, `Failed to parse YAML frontmatter` → xác-nhận kiến-trúc **≥2 parser**.
> **CHƯA VERIFY:** đường nào trong 2 đường LF-only đọc đúng `.claude/agents/`. String-table lưu theo index, không lấy được code-context. → **Phải giả-định xấu nhất.** Kết-luận: SE khai **"miễn nửa `': '` (đã chứng mã-nguồn) — KHÔNG miễn nửa CRLF"**.
**(c) Vector lật của SE KHÁC hub.** `session-end.md:112` — §5.0 dùng `git reset --soft HEAD~K`; `--soft` **không đụng worktree** → squash SE **không** lật EOL. 188 file = **công-cụ sinh CRLF**: 131/188 nằm `Migrations/` (`dotnet ef` sinh CRLF trên Windows) + 145 `.cs` / 4 `.csproj` / 1 `.slnx` (Visual Studio). `.claude/agents/*.md` LF vì **Write-tool của Claude Code phát LF**.
**Rủi-ro thật của SE = ai đó sửa agent-file bằng công-cụ phát CRLF (PowerShell `Set-Content`/`Out-File`)** — SE đã từng cắn đúng họ lỗi này (gotcha #30 → memory: *"#30-via-Edit (.ps1 pure-ASCII)"*). Và **`.gitattributes` KHÔNG chặn được cái này** (attr chỉ áp lúc checkout/add, không áp lúc tool ghi tùy-ý) → **validator + LOAD-VERIFY mới là lớp bảo-vệ thật cho agent-file, không phải `.gitattributes`.**
---
## 3) Bảng khối
| Khối | SE hiện-trạng (đo 2026-07-15) | GAP | Đối ứng cụ-thể | Acceptance ĐO ĐƯỢC |
|---|---|---|---|---|
| **① SELF-CHECK** | Đã chạy: autocrlf=`true`@system · flip=**188** · frontmatter-class (`agents`+`commands`+`skills`) `w/crlf`=**0** · `i/crlf`=**0** · `i/mixed`=**0** | Không có nơi lưu/lặp | Nhét vào `session-start.md` BƯỚC 0.7 (cạnh WAL-check) | `git ls-files --eol -- .claude/agents .claude/commands .claude/skills \| grep -c 'w/crlf'`**0** |
| **② SYMPTOM** | 12 tên roster ↔ 12 `VALID_ROLES` `hmw.js` ↔ 12 file — **khớp, chưa ai chết** | Không có bước đối-chiếu tự-động | Nối vào 0.7 | 3 con-số = 12/12/12 |
| **③(a) .gitattributes** | Chỉ 2 rule (`broadcasts/**`, `*.sh`); `.claude/agents/` **attr/ TRỐNG** | Không phủ CLASS | §4 dưới | `git check-attr text eol -- .claude/agents/reviewer.md``text: auto`, `eol: lf` |
| **③(b) re-smudge 188** | 188 CRLF worktree; **chỉ 1 file tracked dirty = `.claude/WAL.md`, mà nó `i/lf w/lf` → KHÔNG nằm trong 188****toàn-bộ 188 SẠCH** | Chưa làm | §5 dưới | Sau: flip=0 **VÀ** `git status --porcelain` vẫn còn ` M .claude/WAL.md` (chứng không bị checkout mù nuốt) |
| **③(c) quote `: `** | 12/12 block-scalar | **N/A — đã chứng mã-nguồn (§2a)** | **SKIP**, ghi lý-do vào adap-report | `grep -c '^description: |$' .claude/agents/*.md` → 12 |
| **③(d) RESTART+VERIFY** | BƯỚC 0.6 = **model-probe**, KHÔNG phải registry-probe | Thiếu registry-probe | Thêm 0.6b | 12 tên spawn-được |
| **④(a) validator BYTES** | **KHÔNG CÓ.** `governance-detectors.ps1` là Select-String text-mode → **PASS-giả đúng như broadcast cảnh-báo** | Thiếu | `scripts/eol-frontmatter-validator.ps1`: `[IO.File]::ReadAllBytes()`, FAIL nếu byte `0x0D` xuất-hiện trước delimiter `---` thứ 2 | §6 (positive-control) |
| **④(b) wire đóng-phiên** | — | Thiếu | Gọi trong `session-end.md` §5.2 | Đọc §5.2 thấy lệnh |
| **④(c) EOL-assert SÁT push** | `session-end.md:123` `git push origin main`**trần, không guard**. §5.0/§5.1/§5.2 = **3 section rời** → assert đặt ở 5.0 sẽ bị nhánh chạy-lại-squash đi vòng | Thiếu + **hub's `count==0` toàn-repo KHÔNG DÙNG ĐƯỢC cho SE** | §7 | §7 |
| **④(d) LOAD-VERIFY onboard** | S107 `office-document` có spawn-test **cùng phiên** = tiền-lệ ĐÚNG, nhưng **ad-hoc, chưa thành luật** | Chưa codify | Thêm dòng vào `agents/README.md`: agent MỚI/SỬA → spawn-probe TRƯỚC khi commit | Session-log ghi `spawn-probe: <name> OK` |
---
## 4) `.gitattributes` đề-xuất (FULL)
> An-toàn bất-thường cho SE: **`i/crlf=0` + `i/mixed=0`** → index ĐÃ 100% LF → file này **KHÔNG đổi một blob nào**, chỉ sửa materialize. Không có file nào cố-ý CRLF (0 `.bat`/`.cmd`; 24 `.ps1` **đang w/lf và CHẠY THẬT** — `wal-flush.ps1` đẻ 57 wal-commit → **PowerShell KHÔNG cần CRLF, đã chứng bằng chính repo SE**).
```gitattributes
# .gitattributes — SOLUTION_ERP
# S119: vá theo CLASS (broadcast 2026-07-15 ③a). Nen-tang do 2026-07-15:
# core.autocrlf=true @ SYSTEM (C:/Program Files/Git/etc/gitconfig) — ngoai repo
# i/crlf=0, i/mixed=0 -> index DA 100% LF -> file nay KHONG doi blob nao,
# chi sua tang materialize (checkout/smudge).
# 188 file i/lf+w/crlf = tool sinh CRLF (131 = dotnet ef Migrations, VS .cs/.csproj),
# KHONG phai squash-fallout (§5.0 dung reset --soft = worktree-neutral).
# ---- CLASS default: moi file text = LF ca index lan worktree ----
* text=auto eol=lf
# ---- Binary THAT — dang co trong repo (do: git ls-files --eol | grep i/-text = 19) ----
*.docx binary
*.xlsx binary
*.png binary
# ---- Binary phong-ho (chua tracked; PDF-export form-engine / favicon / font FE) ----
*.pdf binary
*.ico binary
*.jpg binary
*.jpeg binary
*.gif binary
*.zip binary
*.exe binary
*.dll binary
*.woff binary
*.woff2 binary
*.ttf binary
# ---- Text tuong-minh (chong misdetect) ----
*.svg text eol=lf
*.sql text eol=lf
*.ps1 text eol=lf # SE: 24/24 dang LF va CHAY THAT (wal-flush.ps1 Stop-hook). KHONG can CRLF.
*.sh text eol=lf # giu tu S111
# ---- Byte-exact channel: Harness 3 email body-hash (content_sha256 tren body LF) ----
broadcasts/** text eol=lf
# ---- Registry frontmatter: CHINH class ma ca ban va nay ton-tai de bao-ve (S119) ----
.claude/agents/** text eol=lf
.claude/commands/** text eol=lf
.claude/skills/** text eol=lf
```
Không có fixture byte-cố-ý nào cần `-text` (đã quét: `eval/golden-set-*.jsonl` + `tests/**/Common/*Fixture.cs` đều là text thường).
⚠️ Churn kỳ-vọng, **lành-tính**: VS/`dotnet ef` sẽ tiếp-tục đẻ `.cs`/`.slnx` CRLF ở worktree → chúng lại hiện `i/lf w/crlf`. Index vẫn LF → repo vẫn đúng. **Đây chính là lý-do §7.**
---
## 5) Quy-trình re-smudge 188 file — AN-TOÀN
**Tiền-đề đã đo:** file tracked dirty **duy-nhất** = `.claude/WAL.md`, và nó `i/lf w/lf`**giao của {dirty} ∩ {188} = ∅** → nhánh "rewrite byte tại chỗ" của broadcast ③(b) **N/A cho SE**; đi thẳng nhánh sạch. **Nhưng vẫn phải chạy guard B2** (tiền-đề có thể đổi trước khi anh chạy).
```bash
cd "D:/Dropbox/CONG_VIEC/SOLUTION/SOLUTION_ERP"
S="$TMP/eol"; mkdir -p "$S"
# B0 — .gitattributes PHAI LEN TRUOC (bat buoc, khong doi thu tu).
# Chua co attr ma checkout => autocrlf=true materialize lai thanh CRLF = phan tac dung.
git add .gitattributes && git commit -m "[CLAUDE] Infra: .gitattributes class-level eol=lf (S119)"
git check-attr text eol -- .claude/agents/reviewer.md # PHAI thay: text: auto / eol: lf
# B1 — chup danh sach flip (nguon chan-ly = git ls-files --eol, KHONG dung grep dem byte CR)
git ls-files --eol | grep 'i/lf.*w/crlf' | sed 's/.*\t//' > "$S/flip.txt"
wc -l < "$S/flip.txt" # ky-vong 188
# B2 — GUARD: giao {dirty tracked} ∩ {flip} PHAI RONG. Khac 0 => DUNG, xu tay tung file.
git status --porcelain | grep -E '^( M|M |MM|A |AM)' | cut -c4- | sed 's/^"//;s/"$//' > "$S/dirty.txt"
comm -12 <(sort -u "$S/flip.txt") <(sort -u "$S/dirty.txt") > "$S/danger.txt"
test ! -s "$S/danger.txt" || { echo "STOP: file dirty nam trong flip-set:"; cat "$S/danger.txt"; }
# B3 — chi khi B2 rong: xoa roi checkout LAI DUNG 188 path (KHONG BAO GIO `git checkout -- .`)
# Dropbox dang sync thu-muc nay -> mass-rewrite se noi song sync; chay luc ranh.
xargs -a "$S/flip.txt" -d '\n' rm -f --
xargs -a "$S/flip.txt" -d '\n' git checkout --
# B4 — ACCEPTANCE (3 dieu-kien, phai dung CA BA)
git ls-files --eol | grep -c 'i/lf.*w/crlf' # => 0
git status --porcelain | grep -c '^ M \.claude/WAL\.md' # => 1 (viec chua-commit CON NGUYEN)
git diff --stat # => trong (index von LF, khong blob nao doi)
```
**3 bẫy TIPS đã né trong quy-trình trên:** (i) không dùng `grep` msys đếm byte CR — chân-lý = `git ls-files --eol`; (ii) không tin `git diff` (nó **sẽ trống** dù byte worktree đổi, vì index vốn LF) → tin `--eol`; (iii) metric = `i/lf` **KÈM** `w/crlf`, không dùng `w/crlf` trần (SE có 0 `i/crlf` nên trần cũng ra 188, nhưng giữ đúng metric để khỏi dương-giả về sau).
---
## 6) ④(a) Validator + **giải bài positive-control** (SE không có file-đã-chết)
Broadcast bảo hiệu-chỉnh bằng byte file-đã-chết, "control thật hơn synthetic". **SE không có xác** — nhưng **không cần đợi tai-nạn: SE TỰ CHẾ control THẬT được**, và nó **mạnh hơn** cách hub:
```powershell
# Positive-control INDUCED (that, khong synthetic): dung CHINH reader, CHINH byte, CHINH registry.
$src = ".claude/agents/reviewer.md"
$b = [IO.File]::ReadAllBytes($src)
$t = ([Text.Encoding]::UTF8.GetString($b) -replace "`r`n","`n") -replace "`n","`r`n" # ep CRLF toan file
$t = $t -replace '^name: reviewer', 'name: eolprobe-tmp'
[IO.File]::WriteAllBytes(".claude/agents/eolprobe-tmp.md", [Text.Encoding]::UTF8.GetBytes($t))
# -> RESTART -> spawn-probe `eolprobe-tmp`.
# KHONG spawn duoc = duong doc agent la mot trong 2 regex LF-only (§2b) -> SE DINH THAT, uu-tien CAO
# Spawn DUOC = duong doc la nhanh \s* / \r?\n -> SE mien nua CRLF, ha uu-tien
# Ket thuc: xoa file probe (KHONG commit).
```
Khai thật: control này **mạnh hơn** hub's post-mortem control ở 3 điểm — **tái-lặp được**, **không cần thảm-hoạ**, **falsifiable** (đúng tinh-thần ④d "chịu để bị chứng-minh sai"). Yếu hơn 1 điểm: nó chứng **điều-kiện gây chết**, không chứng "đã từng chết ở SE". Chấp-nhận được, và nó **trả lời luôn câu CHƯA VERIFY ở §2b** — đây là **thí-nghiệm quyết-định duy-nhất**, đề-nghị lead chạy TRƯỚC khi quyết mức đầu-tư cho toàn gói.
Validator (`scripts/eol-frontmatter-validator.ps1`) hiệu-chỉnh bằng chính byte file probe này; đọc `[IO.File]::ReadAllBytes()`**tuyệt-đối không** `Get-Content`/`splitlines` (nuốt CR → PASS-giả). Có sẵn khuôn fault-injection: `governance-detectors.ps1:32-33` đã có `param([string]$RepoRoot=...)` → copy pattern, inject cây tạm để chứng detector **có răng** (memory: feedback_faultinjection_proves_teeth).
---
## 7) ④(c) EOL-assert sát push — **PHẢI TAILOR, KHÔNG BÊ NGUYÊN**
🔴 **Hub's `git ls-files --eol | grep -c 'i/lf.*w/crlf'` == 0 là FALSE-POSITIVE FACTORY ở SE.** Lý-do đo được: `dotnet ef migrations add` + VS **sẽ luôn** đẻ `.cs`/`.csproj`/`.slnx` CRLF ở worktree; `git add` chuẩn-hoá index về LF nhưng **không** viết lại worktree → `i/lf w/crlf` **mọc lại ngay** sau mỗi phiên có migration (131/188 hiện-tại chính là dấu-vết này). Assert toàn-repo sẽ **chặn push hợp-lệ** → bị disable trong 2 phiên → **Goodhart, tệ hơn không có**.
**Đối ứng — 2 tầng, tách vai:**
**(a) BLOCKING, scope đúng class chết-im-lặng** — nhét **TRONG `session-end.md` §5.2, CÙNG khối với `git push`** (không phải §5.0 — nhánh chạy-lại-squash sẽ đi vòng, đúng cảnh-báo broadcast):
```bash
# §5.2 Push remote — EOL-assert DINH LIEN push (S119 ④c, scoped)
N=$(git ls-files --eol -- .claude/agents .claude/commands .claude/skills | grep -c 'w/crlf')
test "$N" = "0" || { echo "BLOCK: $N frontmatter-file CRLF -> agent co the chet im-lang"; exit 1; }
git push origin main
```
Ổn-định được vì class này **chỉ do Write-tool (LF) sinh** — hiện **0/…** đã sạch, không có generator CRLF nào đụng vào.
**(b) INFORM-only, toàn-repo** — thêm **C6** vào `scripts/governance-detectors.ps1` (script `exit 0` cố-định ở `:455`**đúng vai INFORM, không thể làm gate**): in số flip toàn-repo + breakdown theo thư-mục, `resolve:` = re-smudge §5. Bắt drift mà không chặn ai.
**Acceptance §7:** (i) đọc §5.2 thấy assert **cùng khối** `git push`; (ii) fault-inject 1 file CRLF vào `.claude/agents/` cây tạm → assert **FAIL** (chứng có răng); (iii) chạy `dotnet ef migrations add` bịa → assert **VẪN PASS** (chứng không dương-giả) ← đây là test **anti-Goodhart** quan-trọng nhất.
---
## 8) Ưu-tiên đề-nghị lead
1. **Chạy §6 probe TRƯỚC** — nó quyết SE dính CRLF thật hay không; mọi thứ khác phụ-thuộc kết-quả này.
2. §4 `.gitattributes`**rẻ, zero blob churn**, làm ngay bất-kể (1) ra sao.
3. §7(a) assert scoped — rẻ, ổn-định, chặn đúng chỗ.
4. §5 re-smudge 188 — **giá-trị thấp nhất** (index vốn đúng; 131/188 sẽ mọc lại). Làm để `--eol` sạch một lần, không phải để sửa lỗi thật.
5. §6 validator + ④(d) codify spawn-probe — lớp bảo-vệ **thật** cho agent-file (`.gitattributes` **không** cứu được tool-write CRLF).
**Khai thật tổng:** claim mạnh nhất của lane này (js-yaml 4.1.1 + `readLineBreak` CRLF-safe) là **source-verified**; claim "có đường LF-only" là **string-verified** (đếm literal regex trong binary) nhưng **đường nào đọc agents thì CHƯA VERIFY** — chỉ §6 probe giải được.

View File

@ -0,0 +1,70 @@
# Lane C — h23-vs-h8
> RETURN-only tu /fable-clone ensemble wf_1f6bd5e2-478 (vai investigator-codebase, model opus).
> Lead ghi (B3 single-writer) — sub KHONG tu ghi. agentId=a3af2ab52fd357759
---
VERDICT: H23 và H8 **KHÔNG mâu-thuẫn** — H23(1) chấp-nhận form "ghi-chú-đầu-cây" nên thoả được mà GIỮ H8 100% nguyên-vẹn; nhưng kiểm-kê bắt **1 GAP THẬT có runtime-hại**: `.claude/commands/fable-clone.md` hứa "ensemble tier-2" mà KHÔNG hề có `tier:'opus'` → khi Fable UP, lệnh-B im-lặng chạy N×Fable, trái chính §K.D floor-2 của SE (runbook:431 đã ghi 🔴 BẮT BUỘC, command-file thì không) — nên với SE, H23 KHÔNG phải "phòng-xa runtime-0" như hub khai.
## 1. Kiểm-kê spawn-site (đã đọc, file:line thật)
**2 CLASS ngữ-nghĩa NGƯỢC nhau** — đây là mấu-chốt cả phân-tích:
- **Class A** = roster mặc-định. `inherit` = **CHỦ-ĐÍCH** (H8, anh-chốt S66). lead đổi → sub đổi = ĐÚNG, không phải "âm-thầm sai".
- **Class B** = `/fable-clone` ensemble. `inherit` = **SAI** khi lead=Fable (clone phải tier-2 theo định-nghĩa).
| # | Spawn-site | Model tường-minh? | Class |
|---|---|---|---|
| 1 | `.claude/workflows/hmw.js:162-167` (`agent(prompt,{agentType,schema,label,model:resolveModel(…)})`) | ✅ **TỐT NHẤT** — param CÓ trong code, `undefined` by-design; **ghi-chú-đầu-cây thật**`:32-42` phủ cả `resolveModel:43-51` | A+B |
| 2 | `.claude/agents/README.md:75-127` decision-tree ~12 nhánh | ⚠️ 0/12 nhánh; note `:3` = đầu **FILE** không đầu **CÂY** (cách 72 dòng, khác heading) | A |
| 3 | `.claude/commands/session-start.md:96,97` (tooling-auditor + harvest-curator) | ❌ không. BƯỚC 0.6 `:37-45` = probe **lead**, không phải note-spawn | A |
| 4 | `.claude/commands/session-end.md:49,52` (harvest-curator (d)/(f) + tooling-auditor (g)) | ❌ không | A |
| 5 | `.claude/commands/sleep-recovery-memory-l2.md:60` (harvest-curator) | ❌ không | A |
| 6 | **`.claude/commands/fable-clone.md:15,34,38-40`** | 🔴 **KHÔNG — và KHÔNG có `tier:'opus'`.** `:15` hứa "ENSEMBLE tier-2-mạnh-nhất"; `:38-40` "Floor model-tier v3" chỉ nói ghế **lead**. Cơ-chế đạt tier-2 **VẮNG HẲN** | **B — GAP** |
| 7 | `.claude/commands/fable-real.md:36` | ✅ nêu rõ H8 all-inherit + đường elevate; single-Fable = intent | B |
| 8 | `docs/governance/fable-real-runbook.md:130-132, 287-291, 416-422` (3 ví-dụ args) | ✅ `"tier":"opus"` **mỗi item** + `:431` 🔴 BẮT BUỘC + `:299` | B |
| 9 | `docs/governance/harness-11-engine.md:343` (K.E bảng lệnh-B) | ⚠️ "ensemble tier-2" mà không nói cơ-chế; `K.D:336` có "worker-draft pin tier-2 Opus" | B |
**GAP #6 — chi-tiết đo được.** `runbook:431` nguyên-văn: *"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)"*. Mandate đó sống ở runbook + §K, **KHÔNG** ở command-file — tức thứ anh gõ. Đã cắn THẬT 1 lần: reviewer S108 FAIL, MAJOR #3 *"clone-example thiếu `tier:'opus'` trái K.B/floor-2 khi Fable UP"* (`agent-memory/reviewer/archive/2026-07.md:13`) → fix landed ở **runbook**. `fable-clone.md` H21-redesign S110 (`debe82f`, mtime Jul 11 — SAU S108 Jul 10) không mang mandate sang. *(CHƯA VERIFY: file này từng có `tier:'opus'` trước S110 hay chưa — `git log -S"tier"` ra 2 commit nhưng giải-thích được bằng "tier-2"/"model-tier"/"frontier-class"; **hiện-trạng vắng = VERIFIED**.)*
## 2. Trả lời 6 câu
**(1) SE có phải ca "MỘT model duy-nhất" của §4?** **KHÔNG sạch.** SE = một-model-**tại-một-thời-điểm** nhưng **ĐỘNG** (per-session, owner-choice {Fable|Opus}, probe `session-start.md:37-45`). Khác-biệt quyết-định: hệ "một model" của §4 là **TĨNH** → alias-vs-phiên-bản vô-nghĩa vì không có tầng-2 để lệch. SE thì Class-B **có tier-2 thật** (`/fable-clone` pin Opus ⟂ lead Fable — §K.D:336 ghi "phân-tầng THẬT bén" từ S108). ⇒ §4 "(2)(3) rút gọn" **chỉ đúng Class A**; Class B thì (2) SỐNG.
**(2) Xem bảng §1.** Class A 1 site tốt (hmw.js), 4 site thiếu-nhưng-vô-hại. Class B 1 site thủng.
**(3) Ghi-chú-đầu-cây map ra sao?** SE **đã có 1 bản mẫu đúng chuẩn**: `hmw.js:32-42` — khối comment H8 đặt ngay trên `resolveModel`, phủ mọi lane, KHÔNG lặp inline. Đó chính là form §2(1) khuyên. Thiếu là **nhân-bản form đó** sang `agents/README.md:75` (đầu decision-tree) + `session-start/end`. Rẻ, 3 chỗ, không đụng frontmatter.
**(4) `inherit` nằm đâu trong mô-hình §2(2)?** **Không phải full-id, không phải alias — là INDIRECTION (con-trỏ).** Nó không khoá gì cả, uỷ-quyền 100% cho lead. ⇒ thẩm-quyền phiên-bản THẬT của SE = **`~/.claude/settings.json` `model: claude-fable-5[1m]`** (`agent-memory/tooling-auditor/MEMORY.md:19`, tự cảnh-báo *"đừng conflate 2 file settings"*) — **NGOÀI repo**, machine-wide, dùng chung AI_INFRA+VIETREPORT, **không git-tracked**. Project `.claude/settings.json` = 239B hooks.Stop only, **0 key `model`** (đã verify). ⇒ **SE thoả H23 mà VẪN giữ H8: CÓ** (xem PA-1).
🔴 **Nhưng 1 side-effect thật của H8 phải nói thẳng:** H8/S66 **xoá 7 pin full-id `claude-opus-4-8`** (`hmw.js:36` xác nhận *"KHÔNG còn demote-pin"*). Grep `.claude/**` = **0 full-id sống** (chỉ comment lịch-sử). Mà `tier:'opus'`/`tier:'fable'` (`resolveModel:44`) = **alias trần khoá HỌ, không khoá phiên-bản** — đúng y §2(2). ⇒ escape-hatch Class-B giờ **không còn neo phiên-bản nào trong repo**; Opus đời sau ra → `tier:'opus'` trôi, không ai bắt. Đây **không phải mâu-thuẫn** (H8 xoá pin-DEMOTE, đúng ý-đồ "chất-lượng trên chi-phí") mà là **hệ-quả kèm** — và là điểm DUY-NHẤT H8 phải trả giá dưới lăng-kính H23.
**(5) §6 phép thử-phá áp cho SE.** Hub bảo bỏ param mà không đổi ⇒ phòng-xa. **SE KHÔNG có pin tầng-2** ⇒ bỏ param **CÓ đổi** (inherit→lead). Theo chính lời hub: *"Nếu nó **đổi** → hệ bạn CHƯA pin đủ, và sàn này vừa cứu bạn một lỗi thật."* ⇒ **H23 với SE ≠ phòng-xa.** Chính-xác: **Class A runtime-value = 0** (inherit = intent, đổi theo lead là đúng); **Class B runtime-value = THẬT** (GAP #6 = lỗi sống, chờ Fable UP là kích). Nói "H23 vô-giá-trị vì SE all-inherit" = **kết-luận sai** do gộp 2 class.
**(6) §2(5) kỷ-luật động-từ.** ✅ **ĐÃ THOẢ — không cần làm gì.** SE gương-mẫu, grep 0 mis-nấc quanh model/tier: `engine:348` "KHÔNG code-enforced" · `engine:353` "mechanized = 0" · `engine:355` "scope-guard… = convention" · `fable-real.md:22` "KHÔNG claim code-enforced" · `README:173`+`database-agent.md:13,55`+`session-end.md:52` G-015 "TRACKED ≠ read-only-enforced".
**Bonus §2(3) kết-nạp 3-việc:** SE **có đủ 3 chỗ** (frontmatter / `hmw.js:22-30` VALID_ROLES / spawn-sites) và **đã chạy đúng** (office-document S107 9→10; 2 monitor S110 10→12 — `fable-clone.md:21`). Thiếu: **chưa viết thành checklist** → dựa trí-nhớ. Gap = quy-trình, không phải artifact.
## 3. 🔴 QUYỀN ANH — 3 phương-án
> **Khuyến-nghị lane này: đọc kỹ tiền-đề trước khi chọn.** Tiền-đề brief "H23 ⟂ H8 xung-đột" — lane này **BÁC**: không xung-đột. Nên 3 PA dưới là **mức-độ-adopt**, KHÔNG phải "có lật H8 không". **Không PA nào đụng H8.** Nếu anh muốn PA lật H8 thì phải là đề-bài khác.
| | **PA-1 — Tailor tối-thiểu** *(lane này nghiêng)* | **PA-2 — PA-1 + neo full-id** | **PA-3 — n-a toàn-bộ** |
|---|---|---|---|
| **Làm** | (a) Vá GAP #6: thêm `tier:'opus'` 🔴-BẮT-BUỘC-khi-Fable-UP vào `fable-clone.md` (trỏ `runbook:431`, KHÔNG lặp nội-dung). (b) Nhân form `hmw.js:32-42` → note-đầu-cây 3 chỗ: `README.md:75`, `session-start.md:96`, `session-end.md:49`. (c) Checklist kết-nạp-sub 3-việc vào `agents/README.md`. (d) §2(5) = n-a đã-thoả. | PA-1 **+** neo full-id cho `tier:'opus'` (hằng-số `hmw.js` HOẶC `memory-budget.json`) → alias có thẩm-quyền phiên-bản trong repo. | Ghi 1 dòng "n-a: all-inherit = một-model, §4 miễn (2)(3)" rồi đóng. |
| **Kéo theo** | Sửa **4 file .md, 0 frontmatter, 0 config, 0 số**. H8 nguyên-vẹn. Vá 1 lỗi-sống. **KHÔNG** dựng bộ-soát (§4 cho phép "n-a: chưa dựng"). | **Con-số/policy mới ⇒ quyền anh** (memory-fidelity: em KHÔNG tự đặt). Chặn alias-drift Opus-đời-sau. Chi-phí: +1 chỗ phải bảo-trì khi model đổi. | **GAP #6 Ở LẠI** → Fable UP là N×Fable, trái K.D floor-2 của chính SE. Phải khai "biết mà không sửa" ở adap-report — sẽ đụng nấc trung-thực §C5. |
| **Rủi-ro** | (b)/(c) là note thuần → gần 0. (a) đụng command-file → **restart CLI** (no hot-reload, `fable-clone.md:8`) | như PA-1 + risk pin lệch settings user-global | Cao — reviewer sẽ bắt lại như S108 |
**Lý-do nghiêng PA-1:** vá đúng chỗ thủng, không đẻ policy mới, không đòi anh quyết con-số. Nâng lên PA-2 **chỉ khi** anh muốn `tier:'opus'` có neo phiên-bản — đó là **quyết-định của anh**, không phải suy-luận của em.
## 4. Acceptance ĐO ĐƯỢC
1. `grep -n "tier:'opus'\|\"tier\": \"opus\"" .claude/commands/fable-clone.md`**≥1 hit** (nay = **0**). ⚠️ Dùng **Grep tool**, không Bash-grep: pattern `\|`+quote cho **false-negative** — lane này dính, `tier:'opus'` toàn-repo ra rỗng dù runbook:431 có thật.
2. 3 note-đầu-cây tồn-tại **≤5 dòng trên** dòng spawn đầu-tiên: `README.md:~75` · `session-start.md:~96` · `session-end.md:~49`. Nội-dung phải nêu: "mọi spawn dưới = `model: inherit` (H8 S66) = top-tier lead per-session; giá-trị SỐNG → BƯỚC 0.6 probe".
3. Checklist kết-nạp-sub 3-việc (frontmatter `inherit` + `hmw.js` VALID_ROLES + spawn-site) hiện-diện `agents/README.md`; đối-chứng: roster 12 = VALID_ROLES 12 (`hmw.js:22-30`) = danh-sách 12 (`fable-clone.md:19` = `fable-real.md:20` = `engine:345`).
4. §2(5): re-grep enforce-verb quanh model/tier → **giữ 0 mis-nấc** (nay 0).
5. adap-report khai đúng nấc: **executed-file, VERIFIED-pending-restart** (command `.md` no hot-reload) + khai thẳng "**Class A runtime-delta = 0 · Class B = vá lỗi-sống**" — KHÔNG bán H23 thành "phòng-xa thuần" (sai với SE), cũng KHÔNG thổi thành "cứu hệ" (sai với Class A).
## 5. Phụ — 2 stale nhỏ bắt được dọc đường (ngoài scope, không chặn)
`runbook` trỏ `hmw.js:36,38`/`:37-44`/`:32` → thật `resolveModel` = **`:43-51`**, khối H8 = **`:32-42`**. `runbook:186` "§K:334"→thật **355** · `:188` "§K.D:332"→**336** · `:437/:438` "§K.C:329/330"→**331-334**. Class C2/B3 derived-stale (`scripts/governance-detectors.ps1`). Đáng nói vì **chính H23(1) "đọc-được-tại-chỗ"**: line-ref sai làm người soi lần fallback khó hơn — đúng bệnh H23 muốn chữa.

View File

@ -0,0 +1,172 @@
# Lane D — h24-lead-self-audit
> RETURN-only tu /fable-clone ensemble wf_1f6bd5e2-478 (vai investigator-codebase, model opus).
> Lead ghi (B3 single-writer) — sub KHONG tu ghi. agentId=ac5b004b86fa8cd0b
---
VERDICT: SE ĐỦ 3 NỀN → adopt được; nhưng bẫy mega-line KHÔNG chỉ "có" mà là ca NẶNG NHẤT có thể — `docs/STATUS.md:6` (63,104 ký-tự/1 dòng vật-lý) chứa 37 date-token trong đó parse ngây-thơ trả `2026-08-01` (TƯƠNG-LAI → detector KHÔNG BAO GIỜ kêu = tự-giết positive-control, đúng y cảnh-báo hub) hoặc `1987-03-07` (bóng-ma từ chữ-số trong username `pqhuy1987`) — và SE có 1 positive-control SỐNG, THẬT, mà máy hiện-tại chứng-minh-được là MÙ (`permission-matrix/SKILL.md`, 42 flag baseline, 0 flag trên file này).
---
# 1. Ba NỀN (H24 §4) — verify từng nền bằng file:line
| Nền | SE có? | Bằng-chứng file:line | Ghi-chú |
|---|---|---|---|
| (1) Bộ rà-drift-governance dạng MÁY | ✅ CÓ | `scripts/governance-detectors.ps1` (23,838B) — C2/B3 `:15,:143,:202` · C1 `:17` · C3 `:19` · C4 `:20,:89-107` · C5 `:24`. Chạy THẬT @2026-07-15 → **TOTAL FLAGS: 42**, `exit 0` always (`:tail`) | Điểm cắm: `Write-Flag` `:43-53` · `Write-Section` `:55` · `Get-GovernanceMd` `:118-127` · summary tail |
| (2) Changelog có chuỗi-carry / khối work-state | ✅ CÓ | `docs/HANDOFF.md:5`**21× `NEXT anh` + 22× `NEXT em`** · `docs/STATUS.md` In-Progress · tiering-rule `HANDOFF.md:3` + `STATUS.md:4` | ⚠️ carry là **văn-xuôi KHÔNG khoá** — xem GAP-2 |
| (3) Lead có nghi-thức mở/đóng phiên | ✅ CÓ | `session-start.md`: BƯỚC 0 `:10` · 0.5 `:19` · 0.5b `:27` · 0.6 `:37` · 0.7 `:47` · Phase1 `:56` · Phase2 `:71` · Phase3 `:183`. `session-end.md`: Phase1 `:19` · 1.5 §L `:39` · §L.a `:43` · §L.b 8-step `:45` · Phase5 `:109` · 5.0 squash `:111` | Móc treo SẴN: `§2.1.1 Monitor RE-REPORT` `:92` (sibling 2 monitor) · `§2.1.3 DÒ+BÁO governance-detectors` `:109` (display detector) |
**ĐỦ 3 NỀN → adopt được** (không phải SKIP=n/a).
---
# 2. Bảng 5 sàn §2
| Điểm | SE có nền? file:line | GAP | Đối ứng cụ-thể | Acceptance ĐO ĐƯỢC |
|---|---|---|---|---|
| **(1) 2 vai read-only** | ✅ sibling sẵn: `tooling-auditor.md:1-11` + `harvest-curator.md:1-11` (cả 2 `model: inherit` · `memory: project` · `maxTurns: 18` · `tools:` 4-RAG-read) — cả 2 soi PHẦN-KHÁC-LEAD | Chưa vai nào soi **chính LEAD**. **+ VA-CHẠM TỪ-VỰNG:** `governance-detectors.ps1:15` ĐÃ sở-hữu `derived-staleness` → đặt tên "vai-STALE" = trùng khoá. `GAP` cũng đã quá-tải (`session-end.md:48` "build-gap vs floor-rot" · `memory-selfimprove-audit.ps1` "CRITERIA+GAP") | Tạo `.claude/agents/lead-view-auditor.md` (H3) + `.claude/agents/lead-omission-auditor.md` (H4), cookie-cutter frontmatter của 2 monitor sẵn. Treo vào `session-start.md §2.1.1:92` (2→4 monitor) + `session-end.md §L.b`. **KHÔNG gộp** vào H1/H2 | (a) `ls .claude/agents/*.md` = **14**; (b) mỗi FLAG in ra khớp `^[A-Z0-9-]+ \| <class> \|` với class ∈ enum config; (c) **phép-thử-xoá-carry** (§2 :56): xoá thử 1 dòng carry đã-hứa khỏi `HANDOFF.md:5` → H4 PHẢI kêu `carry-dropped`, máy im (đúng) |
| **(2) 2 detector máy** | ✅ `governance-detectors.ps1` — nhưng **KHÔNG đọc config** (grep `memory-budget\|ConvertFrom-Json` = **0 hit**) | **GAP-1 (mega-line — NẶNG):** xem §3. **GAP-2 (carry KHÔNG khoá):** carry SE là văn-xuôi `(1)/(2)/(3)`, KHÔNG có khoá bền → detector tuổi-carry **không chạy được** khi chưa có quy-ước khoá. **GAP-3:** C2/B3 chỉ track **4 token** (`:154-157` mig/test/gotcha/table; regex `:209-212`) → `menu`/`policy` MÙ | (a) Wire `ConvertFrom-Json` đọc `memory-budget.json` vào script; (b) detector độ-tươi = **parse NEO-PHẠM-VI** (§3); (c) detector tuổi-carry: **định-nghĩa "dòng-carry" = đoạn LOGIC `NEXT anh|NEXT em` bên trong mega-line, KHÔNG phải dòng vật-lý** + cần quy-ước khoá (anh quyết format) | (a) đổi số trong config → output detector đổi theo, **0 số hardcode** trong `.ps1`; (b) chạy trên `STATUS.md:6` → in `2026-07-14` (KHÔNG `2026-08-01`, KHÔNG `1987-03-07`, KHÔNG `2026-20-42`); (c) `TOTAL FLAGS` ≥ 42+4 và **CÓ** dòng `permission-matrix/SKILL.md:16` |
| **(3) Scheduler nhịp** | ❌ **KHÔNG có bộ-đếm phiên**. grep `session[_-]?count\|counter\|tick` trong `session-start.md`/`session-end.md`/`memory-budget.json` = **0 hit**. Chỉ có: `session-start.md:165 §2.4 Audit cadence` = **THEO NGÀY** (mùng 1, thủ-công, cron ghost-wire gỡ S100) + `session-end.md:135 §6.3 cadence #4` = **theo SỰ-KIỆN** (nếu adopt infra) | Bộ-đếm phiên = **NET-NEW toàn-bộ** | State-file `.claude/governance/.session-counter.json` (mẫu sẵn: `.archive-strikes.json` / `.mfe-state.json` — xem `memory-budget.json:archive_gate._note` + `mfe.state_file`). Tick @`session-start` BƯỚC 0.7-bis; display 2 đầu (`§2.1.3:109` + `§L.b(c)`). Idempotent-key = **commit-sha HEAD @tick** (resume cùng sha → KHÔNG tick 2). **LEAD tự thực-thi, KHÔNG hook** | (a) chạy `/session-start` 2 lần cùng 1 HEAD → counter **+1** (không +2); (b) sửa tay counter LÙI → **fail-loud** (in `[!] counter went backwards`); (c) **bỏ 1 phiên đúng ngưỡng** → phiên kế in `OVERDUE` (chứng-minh `>=` chứ không `=`); (d) 2 lớp cross-check: fail-loud @end + cảnh-báo-mềm @tiêu-đề changelog |
| **(4) Positive-control SỐNG** | ✅ **CÓ — và MÁY HIỆN-TẠI CHỨNG-MINH-ĐƯỢC LÀ MÙ** | — | Xem §4 (3 control sống) | Chuỗi **fire → cổng chứng-kiến → vá → hết-fire**: (1) chạy detector MỚI **TRƯỚC** khi vá → PHẢI in `permission-matrix/SKILL.md:16`; (2) reviewer chứng-kiến output; (3) vá skill; (4) chạy lại → dòng đó BIẾN MẤT, `TOTAL FLAGS` giảm đúng số đã vá |
| **(5) Kết-nạp = 3 việc** | ✅ SE = **12/12 `model: inherit`** (Harness-8, anh-chốt S66). `hmw.js:50` `return undefined // role có frontmatter: tất cả inherit — KHÔNG override` · `hmw.js:22 VALID_ROLES` = 12 | VALID_ROLES 12 ≠ 14 → `hmw.js:104` **STOP-HARD** `vai ∉ VALID_ROLES — DỪNG HẲN` | Xem §6 (rút gọn) | (a) `hmw.js` VALID_ROLES = **14**; (b) spawn thử vai mới qua hmw → **KHÔNG** throw `:104`; (c) grep `12-agent\|12 sub` → 0 hit sót (5 chỗ, xem §6) |
---
# 3. 🔴 Mega-line `STATUS.md:6` — CÓ phá detector độ-tươi. Đã ĐO, không suy.
**Số đo thật** (`docs/STATUS.md:6` = **63,104 ký-tự / 1 dòng vật-lý**; `docs/HANDOFF.md:5` = **46,735**):
| Cách parse | Kết-quả trên `STATUS.md:6` | Hậu-quả |
|---|---|---|
| ISO-regex bất-kỳ-đâu trên dòng | **37 token**, 3/37 KHÔNG parse được | — |
| lexical `max` | **`2026-20-42`** | Không phải ngày → crash / vô-nghĩa |
| date `max` | **`2026-08-01`** (= hạn audit tháng tới, `CLAUDE.md` "Lần kế: 2026-08-01") | 🔴 **TƯƠNG-LAI → detector KHÔNG BAO GIỜ kêu → TỰ GIẾT positive-control** — đúng y `broadcast:62` |
| date `min` | **`1987-03-07`** | 🔴 Luôn kêu → nhiễu thuần |
| **NEO-PHẠM-VI** `\*\*Last updated:\*\*\s*(\d{4}-\d{2}-\d{2})` | **`2026-07-14`** ✅ | ĐÚNG |
**SE có 2 máy-đẻ-ngày-ma mà hub KHÔNG có** (giải-mã từ `ACTIVE-MARKS.md:15-20`, format `RC-<user>-DD-MM-YYYY-HH-MM-SS`):
1. **RC-stamp hoà năm + đồng-hồ:** `RC-pqhuy1987-11-07-2026-20-42-01` → ISO-regex bắt `2026-20-42` (năm `2026` + giờ `20` + phút `42`). Tương-tự `2026-11-43`, `2026-17-46`.
2. **Chữ-số trong USERNAME hoà DD-MM:** `pqhuy1987`+`-12-07``1987-12-07`. Tương-tự `1987-11-07`, `1987-03-07`.
**Kết-luận:** mega-line **KHÔNG chỉ** phá detector độ-tươi — nó phá **CẢ HAI** detector, vì detector tuổi-carry cũng đếm "dòng-carry" mà 21 dòng-carry của SE nằm gọn trong `HANDOFF.md:5` = **1 dòng vật-lý**. Cả hai phải parse theo **đoạn LOGIC**, không theo dòng vật-lý.
**Đối ứng bắt buộc:** (a) neo-phạm-vi (ngày phải **liền sau** token neo); (b) `TryParseExact` + **loại ngày TƯƠNG-LAI** (chặn `2026-08-01`); (c) tài-liệu KHÔNG neo → **BỎ QUA** (không bịa độ-phủ).
**Bối-cảnh liên-quan (đã có ghi nhận):** `memory-budget.json:token_governor.tier1_hotfeed_tokens.lead_note`*"STATUS/HANDOFF mega-lines STILL cannot be fully Read until re-tiered (mega-line not line-paginatable)"*. Mega-line đã là nợ-kỹ-thuật đã-biết; H24 làm nó thành **nợ CHẶN**.
### Tập neo (độ-phủ TRUNG-THỰC — chỉ 6 tài-liệu đo được, còn lại BỎ QUA)
| file:line | Neo | Ngày | vs mốc-phải 2026-07-12 |
|---|---|---|---|
| `docs/STATUS.md:6` | `**Last updated:**` | 2026-07-14 | ✅ không kêu (đúng) |
| `docs/HANDOFF.md:5` | `**Last updated:**` | 2026-07-14 | ✅ không kêu (đúng) |
| `docs/rag-setup-plan.md:4` | `**Last updated:**` | 2026-05-12 | 🔴 KÊU |
| `.claude/skills/permission-matrix/SKILL.md:16` | `**Status (post Session 6 — …):**` | 2026-04-30 | 🔴 KÊU ← **positive-control** |
| `.claude/skills/form-engine/SKILL.md:15` | `**Status (post Session 6 — …):**` | 2026-04-30 | 🔴 KÊU |
| `docs/governance/README.md:4-5` | `**Adopted:**` / `**Status:**` | 2026-05-26 / cửa-sổ hết 2026-06-23 | 🔴 KÊU |
| `.claude/skills/contract-workflow/SKILL.md:20` | `**Status:**` **KHÔNG NGÀY** | — | ⚪ **BỎ QUA** (đúng sàn) |
**Chống Goodhart:** dạng neo `Status (post Session N — DATE)` phủ **2** tài-liệu (permission-matrix + form-engine), không phải chỉ mình control → độ-phủ THẬT, không may-đo-theo-bài-thi.
**Mốc-phải (đề-xuất):** `.claude/governance/ACTIVE-MARKS.md` RC-stamp mới nhất = **2026-07-12** (đã decode DD-MM→ISO). Lý-do chọn: (a) là sổ dấu-mốc governance anh-ký của CHÍNH SE; (b) `broadcasts/inbox/` (max 2026-07-15) **đã bị C4 loại**`governance-detectors.ps1:96` → dùng làm mốc sẽ mâu-thuẫn chính script. ⚠️ Parse RC-stamp phải đảo **DD-MM-YYYY**, KHÔNG ISO.
---
# 4. Positive-control SỐNG — SE có 3 cái, cái #1 là VÀNG
**#1 `permission-matrix/SKILL.md` — control HOÀN-HẢO, và máy hiện-tại CHỨNG-MINH-ĐƯỢC là MÙ:**
| file:line | Sai | Thật |
|---|---|---|
| `:3` (description vai/skill) | `~60 menu key` · `~240 policy` | **54** · **216** |
| `:81` | `register 48 policy` | 🔴 **TỰ MÂU-THUẪN với `:3` (~240)** |
| `:16` | `Status (post Session 6 — 2026-04-30)` | 2.5 tháng cũ |
| `:20, :23, :37, :56-58` | liệt-kê `Bg_List/Bg_Create/Bg_Pending` + "Budgets KHÔNG inherit" | module Budget **XÓA S61 (Mig 50)** |
**Vì sao máy hiện-tại MÙ (đã đo, không đoán):** C2/B3 chỉ resolve **4** canonical token — `governance-detectors.ps1:154-157` (`mig`/`test`/`gotcha`/`table`) + regex `:209-212`. **`menu``policy` KHÔNG phải canonical row** → 42 flag hôm nay, **0 flag** rơi vào `permission-matrix/SKILL.md`. Đây là điểm-mù có-thật, không phải giả-định.
→ Control này bao **3 class cùng lúc**: `header-date-stale` (:16) · `role-desc-count-stale` (:3) · `view-count-stale` (:81 tự-mâu-thuẫn). H1 tooling-auditor đã bắt tay phiên này → **đã có nhân-chứng độc-lập**.
**#2 `docs/governance/README.md:5`** — `**Status:** ✅ Active trial week 1-4 (2026-05-26 → 2026-06-23)`. Cửa-sổ trial **hết hạn 22 ngày trước**, vẫn ghi "Active trial" → class `status-annotation-unflipped` (dấu-hiệu #3 của lớp STALE). Control cho **class KHÁC** class của #1 → 2 control ĐỘC-LẬP.
**#3 `docs/rag-setup-plan.md:4`** — `**Last updated:** 2026-05-12 (Session 21 turn 1+)` — 2 tháng, thuần `header-date-stale`.
⚠️ **Thứ-tự BẮT BUỘC:** build detector → chạy → in ra 3 dòng này **TRƯỚC cổng review** → reviewer chứng-kiến → **RỒI MỚI** vá skill. Vá trước = mất chứng-nhân, quay về "xanh từ commit đầu" (`broadcast:81`).
---
# 5. Tên 2 vai + enum ĐÓNG + config key
## Tên vai (né va-chạm từ-vựng — memory `feedback_harness9` "vocab-collision-check on adopt")
| Vai | Nơi đặt | Vì sao KHÔNG dùng tên hiển-nhiên |
|---|---|---|
| **`lead-view-auditor`** (H3) | `.claude/agents/lead-view-auditor.md` | ❌ "vai-STALE" trùng `derived-staleness` đã sở-hữu bởi C2/B3 (`governance-detectors.ps1:15`). H3 = **mắt-người soi view LEAD phát-ra**; C2/B3 = **máy đếm count-token**. Hai thứ khác nhau → phải khác tên |
| **`lead-omission-auditor`** (H4) | `.claude/agents/lead-omission-auditor.md` | ❌ "GAP" đã quá-tải: `session-end.md:48` "build-gap vs floor-rot" · `memory-selfimprove-audit.ps1` "spec-audit CRITERIA+GAP" |
Đặt tên theo đúng quy-ước sibling sẵn có (`tooling-auditor`, `harvest-curator` = `<danh-từ>-<vai>`). Ghi vào `docs/governance/vocab-alias-map.md`**khái-niệm MỚI, KHÔNG phải alias** (lesson S93: alias-map KHÔNG seed detector).
## Enum ĐÓNG — 11 class (sống trong config single-source)
**Lớp view (H3) — 5:** `view-count-stale` · `header-date-stale` · `status-annotation-unflipped` · `role-desc-count-stale` · `asymmetric-residue`
**Lớp omission (H4) — 6:** `workstate-item-dropped` · **`carry-dropped`** · **`carry-overage`** · `owner-req-generic` · `pending-decision-submerged` · `memory-underfill`
> 🔴 **Tách `carry-dropped` khỏi `carry-overage` là CÓ CHỦ-ĐÍCH** (hub gộp 1 bullet): caveat **(b)** nói máy **MÙ** với việc đã-rớt nhưng **THẤY** việc quá-già. Tách ra thì caveat (b) trở thành **đo được** — `carry-dropped` phải luôn 100% do mắt-người H4, `carry-overage` do máy. Nếu máy từng phát `carry-dropped` = bug.
## Config key (đặt trong `.claude/agent-memory/memory-budget.json` — single-source đã có, cùng nhà với `archive_gate`/`mfe`/`crystallized_backfill`/`harness_floor`/`token_governor`)
```
lead_self_audit: {
flag_classes: [ …11 class… ], // enum ĐÓNG
carry_age_threshold_lines: <M>,
header_freshness: { anchor_patterns[], milestone_source, skip_if_no_anchor: true, reject_future_dates: true },
cadence: { light_every_sessions, deep_every_sessions, jump_after_repeat, fire_history_cap },
counter: { state_file: ".claude/governance/.session-counter.json", idempotent_key: "head_sha" }
}
```
Tài-liệu/persona **TRỎ key**, KHÔNG chép số (B1 derived-trỏ-canonical).
## Số nhịp — 🔴 **SỐ = QUYỀN ANH. Đây CHỈ là đề-xuất, em không tự chốt.**
Hub ví-dụ 6/15/3 — **KHÔNG CHÉP**. Đặt số của SE theo nhịp THẬT của SE:
| Key | Đề-xuất | Căn-cứ (đo được) |
|---|---|---|
| `light_every_sessions` | **8** | SE chạy ~2.4 phiên/ngày (S107=2026-07-10 theo `memory-budget.json:measured._note` → S118=2026-07-14 = 11 phiên/4 ngày) → 8 ≈ **3 ngày** |
| `deep_every_sessions` | **20** | ≈ 8 ngày — nằm GIỮA rà-nhẹ và audit-tháng sẵn có (`session-start.md:165`, kế 2026-08-01 ≈ 60-75 phiên) → không đụng, không nhiễu |
| `jump_after_repeat` | **3** | 1 class lặp 3 lần = tín-hiệu, chưa phải nhiễu |
| `fire_history_cap` | **10** | cap lịch-sử fire |
| `carry_age_threshold_lines` | **5** | HANDOFF giữ "2-3 session gần nhất" (`HANDOFF.md:3`); sống qua **5 dòng-carry liên-tiếp** ≈ 2 ngày ở nhịp SE = kẹt thật, không phải đang-làm |
---
# 6. (5)(a) Rút gọn cho SE (all-inherit) + 2 caveat
**SE = 12/12 `model: inherit`** (anh-chốt S66) → `broadcast:107` "chỉ dùng một model duy-nhất → (5) rút-gọn". 3 việc thành:
| H23 | SE rút gọn thành | Chỗ sửa (file:line) |
|---|---|---|
| **(a) pin model đầy-đủ** | Ghi **`model: inherit` tường-minh** trong frontmatter 2 vai mới (khớp 12/12 hiện có — `inherit` LÀ pin đầy-đủ của SE, là chính-sách, không phải bỏ sót) | 2 file `.md` mới |
| **(b) allowlist** | `hmw.js:22 VALID_ROLES` **12→14****BẮT BUỘC**, nếu quên thì `hmw.js:104` STOP-HARD `vai ∉ VALID_ROLES — DỪNG HẲN`. **+4 chỗ đếm roster:** `.claude/agents/README.md` · `CLAUDE.md` ("12 sub") · `session-start.md:73` ("12-agent topology — 10 product/quality + 2 monitor") · `memory-budget.json:measured` (12 entry→14) | 5 chỗ |
| **(c) ghi model tại spawn** | `hmw.js:50` trả `undefined` cho role-có-frontmatter → "tường-minh tại spawn" cho SE = **spawn-record ghi model runtime ĐÃ RESOLVE**, ⚠️ **KHÔNG hardcode**`hmw.js:35` lesson S108: *"comment stale làm 2/4 worker đọc sai runtime"* | spawn-record 4-field |
⚠️ 2 vai mới có `memory: project`**là vai-có-bộ-nhớ** → H23 áp đủ, không miễn.
**Caveat (b) — GIỮ NGUYÊN, và với SE còn NẶNG HƠN:** detector tuổi-carry MÙ với việc ĐÃ RỚT → `lead-omission-auditor` mắt-người là catch-layer **DUY NHẤT**. Với SE nặng gấp đôi vì carry là **văn-xuôi KHÔNG khoá** (GAP-2) — item rớt **không để lại dấu-vết nào cả**, kể cả khoá mồ-côi.
**Caveat (d) — GIỮ NGUYÊN, có số neo:** baseline SE hôm nay = **42 flag** (đo thật @2026-07-15). Thêm 2 detector-class → 42 sẽ tăng. **So detector-mới với CHÍNH NÓ chu-kỳ sau**, TUYỆT ĐỐI không so "42 → N" rồi kết-luận governance mục-ruỗng = mở-rộng-thiết-bị.
**Nấc trung-thực:** hub mới n=1 (mốc-0), chưa có chu-kỳ-2 → **KHÔNG bán quá**. SE adopt = cũng mốc-0 của SE; delta thật chỉ có từ run-2.
---
# 7. Ba GAP chặn, xếp theo độ ưu-tiên
1. **GAP-1 mega-line (CHẶN CẢ 2 DETECTOR).** `STATUS.md:6` + `HANDOFF.md:5`. Bắt buộc parse **neo-phạm-vi** + **đoạn-LOGIC** (không dòng vật-lý) + loại ngày tương-lai. Nếu bỏ qua → detector độ-tươi đọc `2026-08-01` = xanh vĩnh-viễn = **tự giết positive-control**, đúng y `broadcast:62`. *(Lối thoát triệt-để: re-tier mega-line — đã là nợ đã-biết ở `memory-budget.json:token_governor…lead_note`; nhưng đó là việc RIÊNG, không nên chặn H24.)*
2. **GAP-2 carry KHÔNG khoá (CHẶN detector tuổi-carry).** 21 carry-line văn-xuôi `(1)/(2)/(3)`, không khoá bền → không đo được "khoá sống qua ≥M dòng". Cần quy-ước khoá = **đổi format HANDOFF = quyền anh**. ⚠️ Hub đã dính "carry-token trùng khoá → máy đếm 1 việc thành 2" (`broadcast:28`) → khoá phải check trùng ngay từ đầu.
3. **GAP-3 detector chưa đọc config.** grep `memory-budget|ConvertFrom-Json` trong `governance-detectors.ps1` = **0 hit** → wire `ConvertFrom-Json` là net-new, cần cho "số đọc từ config single-source". ⚠️ Script là **pure-ASCII** (`:9` gotcha #30, `:76` builder `U`) — sửa qua **Edit + code-point**, không gõ chữ Việt.
**CHƯA VERIFY:** con-số thật `menu=54` / `policy=216` em lấy từ ground-truth lead cấp (đề-bài dặn không đo lại), không tự đếm từ code.

View File

@ -0,0 +1,160 @@
# Lane E — cross-cut+wave
> RETURN-only tu /fable-clone ensemble wf_1f6bd5e2-478 (vai investigator-codebase, model opus).
> Lead ghi (B3 single-writer) — sub KHONG tu ghi. agentId=a82e63dd4c6c618fa
---
VERDICT: Thứ-tự BẮT BUỘC = re-smudge EOL **NGAY BÂY GIỜ** (worktree đang sạch = cửa-sổ an-toàn DUY-NHẤT của phiên; sau khi session-end ghi STATUS/HANDOFF/agent-memory thì 6 file trong 188 đó bẩn → `git checkout` mù = hủy việc); re-smudge = **0 commit / 0 CI** (đo: index 1267/1267 `i/lf`, **0 `i/crlf`**) nên KHÔNG race commit với ai — nhưng `.claude/commands/session-end.md` bị **7 hạng-mục** cùng chạm → PHẢI 1-owner-1-pass em-main serial, và **B4-push-guard `-eq 0` chép nguyên mẫu sẽ DEADLOCK push** vì §5.0 SE cố-ý KHÔNG squash `wal:` kẹp-sâu.
---
## (a) ĐỒ-THỊ PHỤ-THUỘC
```
[D0] re-smudge 188 ──PHẢI TRƯỚC──> mọi write của phiên (STATUS/HANDOFF/agent-memory nằm TRONG 188)
└─ [D1] .gitattributes ③a ──PHẢI TRƯỚC──> [D0] (checkout materialize theo attr mới)
└─ [D2] [D0]=0 ──PHẢI TRƯỚC──> ④c EOL-assert cắm vào khối push (nếu ngược: CHẶN MỌI PUSH phiên này)
[D3] anh chốt H23-vs-H8 ──PHẢI TRƯỚC──> hmw.js edit + agents/*.md (2 vai H24)
[D4] anh chốt nhịp H24 ──PHẢI TRƯỚC──> memory-budget.json + scheduler
[D5] scope-set + anchor "Last updated" ──PHẢI TRƯỚC──> H24 detector-độ-tươi (nay: 0 coverage trên đích)
[D6] T3.4 agents/*.md (2 vai) ──ĐỒNG-THỜI──> hmw.js VALID_ROLES 12→14 → GỘP 1 owner (H24§(5) 3-việc-cùng-lúc)
[D7] Sàn-3 định-nghĩa canonical @tiep.md ──PHẢI TRƯỚC──> session-start BƯỚC 0.7 (chỉ được TRỎ, B1)
[D8] mọi edit code/cmd xong ──PHẢI TRƯỚC──> harness-11-engine.md (canonical tả cái ĐÃ làm, không cái ĐỊNH làm)
[D9] chạy THẬT xong ──PHẢI TRƯỚC──> stamp mark (H18: KHÔNG stamp run-id chưa chạy) + adap-report
[D10] push-guard: KHÔNG cần trước-các-việc-khác — chỉ cần DÍNH LIỀN lệnh push (n=3 treo vô hại tới lúc push)
```
**Race THẬT duy-nhất = worktree, KHÔNG phải git.** `git ls-files --eol` đo: **1267 `i/lf` · 25 `i/none` · 19 `i/-text` · 0 `i/crlf` · 0 `i/mixed`** → thêm `* text=auto eol=lf` **KHÔNG đổi 1 byte index**`git add --renormalize .` = **diff rỗng** → re-smudge **không sinh commit**. Nên KHÔNG có race-commit. Nhưng ③b dùng `rm + git checkout --` trên 188 file, trong đó **6 file là đích ghi của chính session-end**: `docs/STATUS.md`, `docs/HANDOFF.md`, `docs/CLAUDE.md`, `.claude/agent-memory/{implementer-backend,reviewer}/MEMORY.md`, `.claude/agent-memory/.mfe-state.json` (+12 file `.claude/workflows/runs/**`). `git status` **hiện tại = chỉ 7 broadcast untracked** → cửa-sổ sạch.
---
## (b) BẢNG XUNG-ĐỘT FILE
| File | # hạng-mục chạm | Hạng-mục | Xử-lý |
|---|---|---|---|
| **`.claude/commands/session-end.md`** | **7** | B4-push-guard §5.2 · ④c EOL-assert (cùng khối push) · Sàn-2 sentinel-set(bước đầu)+clear(§6.4:143) · Sàn-5 hậu-kiểm cờ-vs-nội-dung · ④b wire validator · H24 counter-display · H24 spawn-site 2 vai (§L.b) | 🔴 **SERIAL, 1 owner = em-main, 1 EDIT PASS.** Fan-out = race chắc chắn |
| **`.claude/commands/session-start.md`** | **4** | Sàn-3 sửa BƯỚC 0.7(a):51 · H24 counter-display · H24 spawn-site 2 vai · H23 model-at-spawn | 🔴 SERIAL em-main. **SAU** `tiep.md` (D7) |
| **`.claude/workflows/hmw.js`** | **3** | Sàn-1 gate `walRegistered` (cạnh `checkpointApproved` :83-85) · VALID_ROLES :22-30 **12→14** · H23 note-đầu-cây (:32-42) | 🔴 **GỘP 1 EDIT** — tách = 3 lần đụng |
| **`scripts/governance-detectors.ps1`** | 2 (+1?) | H24 detector độ-tươi-tiêu-đề · H24 detector tuổi-carry · (C6 EOL-count? tùy chọn) | 🟢 **1 agent owner** (T3.1). Không ai khác chạm |
| **`docs/governance/harness-11-engine.md`** | ~5 | PHẦN N ext (Sàn 1-5) · §K/§O H24 · H23 · EOL floor · vocab | 🔴 SERIAL em-main **CUỐI** (D8) |
| **`.claude/commands/tiep.md`** | 2 | Sàn-3 ground-truth canonical · Sàn-2 sentinel-read | 🔴 em-main, **TRƯỚC** session-start |
| **`.claude/agent-memory/memory-budget.json`** | 2 | nhịp H24 · session-counter | 🟡 số = anh (D4). ⚠️ **Stop-hook auto-commit path này mỗi turn** (`wal-flush.ps1:7`) → counter phải **content-based `last_ticked_session:"S119"`**, KHÔNG blind-increment (idempotent khi resume) |
| **`.gitattributes`** | 1 | ③a | 🟢 1 owner |
| `scripts/<eol-validator>.ps1` (MỚI) | 1 | ④a | 🟢 file MỚI, disjoint |
| `.claude/agents/lead-stale.md` + `lead-gap.md` (MỚI) | 1 | H24(1) | 🟢 disjoint — **nhưng khoá cứng với hmw.js VALID_ROLES (D6)** |
| `tests/` recovery 3-lớp | 1 | Sàn-4 | 🟢 disjoint |
| `.claude/governance/ACTIVE-MARKS.md` | 1 | stamp | 🟡 anh (D9) |
| **188 file worktree** | 1 | ③b re-smudge | 🟢 **0 commit** → không đụng ai ở tầng git; đụng ở tầng **worktree-dirty** |
---
## (c) ĐỀ-XUẤT WAVE
### **W0 — PRE-FLIGHT EOL (em-main SOLO, ~5', KHÔNG fan-out, KHÔNG push)** 🔴 **PHẢI ĐẦU TIÊN**
| task | vai | file chạm | độc-lập |
|---|---|---|---|
| T0.1 `.gitattributes` ③a: `* text=auto eol=lf` + khai binary CLASS (19 `i/-text`) + `-text` fixture-byte nếu có | em-main | `.gitattributes` | — |
| T0.2 re-smudge 188 (worktree SẠCH → nhánh `rm+checkout --` hợp lệ) | em-main | 188 worktree | sau T0.1 |
| T0.3 verify: `git ls-files --eol \| grep -c 'i/lf.*w/crlf'`**0**; `git status` vẫn **chỉ 7 untracked** | em-main | — | sau T0.2 |
| T0.4 `dotnet test` sanity (509) | em-main | — | sau T0.2 |
> Lý-do W0 đứng đầu: **cửa-sổ worktree-sạch đóng lại ngay khi bất kỳ wave nào ghi STATUS/HANDOFF/agent-memory.** Sau đó ③b buộc chuyển nhánh "rewrite byte tại chỗ", đắt + dễ sai. **Không commit ở W0** (commit `.gitattributes` local OK; push để W5).
### **W1 — INVEST (fan-out — ĐANG CHẠY, chính lane này)** · 5 lane RETURN-only · **0 file chạm** ✓
### **W2 — SPEC + OWNER-GATE (em-main SOLO)**
spec-file 3-mục → `runs/2026-07-15-S119-adap-6-broadcast/spec-*.md`. **Chặn ở đây chờ anh chốt 5 điểm mục (d).** File chạm: run-folder only.
### **W3 — EXECUTE fan-out (4 task, file-disjoint 4/4)** ✓ kiểm chéo: **0 giao**
| task | vai | file chạm | độc-lập với |
|---|---|---|---|
| T3.1 H24 ×2 detector | 🟨 implementer-backend | `scripts/governance-detectors.ps1` | T3.2/3/4 |
| T3.2 ④a validator đọc **BYTES** (`git cat-file -p` / `[IO.File]::ReadAllBytes`, **KHÔNG** `Get-Content`/`splitlines` — text-mode nuốt CR = PASS-giả) | 🟨 implementer-backend#2 | `scripts/eol-agent-validator.ps1` (MỚI) | tất cả |
| T3.3 Sàn-4 recovery-test **3 lớp** (dừng-sạch · đứt-giữa-run · **đóng-phiên-bị-cắt** + biến-thể self-heal) | 🟪 test-specialist | `tests/**` | tất cả |
| T3.4 *(chỉ khi anh duyệt)* 2 agent-file H24 | 🟦 investigator/implementer | `.claude/agents/lead-{stale,gap}.md` (MỚI) | tất cả |
> 🔴 **hmw.js KHÔNG vào W3** — nó bị T3.4 khoá (VALID_ROLES +2) + Sàn-1 + H23 = 3 hạng-mục → đẩy sang W4 em-main 1-edit.
### **W4 — SERIAL em-main (single-writer B3 — file dồn ≥3 hạng-mục)**
`T4.1 hmw.js``T4.2 tiep.md``T4.3 session-start.md``T4.4 session-end.md` (**1 pass gộp 7**) → `T4.5 memory-budget.json``T4.6 harness-11-engine.md` (cuối, D8).
### **W5 — VERIFY + PUSH (CÙNG 1 LƯỢT — bắt buộc)**
`ls-files --eol`=0 → **RESTART + spawn-probe registry** (④d: static-check KHÔNG falsifiable) → `dotnet test` → detector fire positive-control → **[khối 1 lượt]** `n=$(git log --format='%s' origin/main..HEAD | grep -c '^wal:')` + `eol=$(git ls-files --eol | grep -c 'i/lf.*w/crlf')` → cả 2 = 0 → `git push` → spawn 🟩 cicd-monitor (**1 CI run**).
### **W6 — CLOSE** adap-report · stamp mark (D9) · adap-request · send-email.
---
## (d) QUYỀN ANH (không được tự quyết)
1. 🔴 **H23(3)/H24(5) "pin model đầy-đủ ở tệp định-nghĩa" ⟂ H8 all-inherit (lệnh anh S66 "chất lượng trên chi phí")** — đo: **12/12 `model: inherit`**, `hmw.js:50` `return undefined // H8 all-inherit — KHÔNG override`. H23 §4 project-fit cho lối thoát: *"Hệ chỉ dùng MỘT model duy-nhất → (2)(3) rút gọn"* — SE all-inherit ≈ ca đó → đề-xuất **giữ H8, adopt (1)(5) [tường-minh + kỷ-luật động-từ], khai (2)(3) = rút-gọn**. **Nhưng H8 là lệnh anh → anh chốt.**
2. 🔴 **Nhịp H24** (rà-nhẹ N / rà-sâu M / jump-K / ngưỡng tuổi-carry M) — `role_boundary_note` + mark `RC-pqhuy1987-21-06-2026-01-58-01`: **con-số = quyền chủ-dự-án, AI KHÔNG tự-chỉnh**. Broadcast cũng cấm chép 6/15/3 của hub.
3. 🔴 **Roster 12→14** (2 vai H24) — chi-phí: all-inherit → 2 vai mới ăn top-tier mỗi phiên × 2 đầu-phiên. H24 cấm gộp vào tooling-auditor/harvest-curator. Anh chốt **thêm 2 / gộp / SKIP=n-a**.
4. 🔴 **57 `wal:` đã lọt origin/main** — H22 cấm rewrite đã-đẩy → **không gỡ được**. Anh chốt: **đơn/accept vĩnh-viễn** (đề-xuất: accept + ghi 1 dòng honest vào adap-report; hub tự khai 1 ca tương-tự).
5. 🔴 **Stamp mark mới?** EOL-floor + H23 + H24 = đổi CANONICAL §-rule → P6 scope-check = mark-candidate. (3 mark H-21/MTv3/H-22 **đã ký** `RC-pqhuy1987-14-07-2026-10-05-50` → chỉ đóng-dấu ledger, KHÔNG xin lại.) **P4 report-before-stamp.**
6. 🟡 **Scope-set H24 detector độ-tươi** (docs nào là "view phải theo source") — quyết-định phạm-vi, nên anh chốt cùng W2.
---
## (e) n/a HỢP-LỆ (có lý-lẽ)
| Mục | Nấc | Lý-lẽ đo được |
|---|---|---|
| EOL ③c "bọc nháy mô-tả chứa `: `" | **n-a** | **12/12 agent dùng `description: \|` block-scalar** → bộ-đọc không parse `: ` trong value. Trigger của broadcast = N/A. (Vẫn nên ④d LOAD-VERIFY — rẻ) |
| EOL ④a "positive-control = byte file-đã-chết" | **n-a → synthetic, khai nấc thấp** | agent **0 CR byte** cả blob lẫn worktree (13/13) → **KHÔNG có chứng-nhân sống để snapshot**. Broadcast: *"control thật hơn synthetic"* → SE chỉ đạt nấc synthetic-fixture, **PHẢI khai**, không được viết "verified như hub" |
| EOL ③d "RESTART rồi VERIFY" | **VẪN LÀM** | rẻ, và là bảo-đảm falsifiable duy-nhất |
| B4 điểm (b) "first-push: đếm `wal:` trên toàn `HEAD`" | **n-a — và là BẪY** | SE không first-push (`origin/main` = `3fde8af`). Nếu nhánh đó chạy → đếm **57+ → CHẶN VĨNH VIỄN**. Giữ nhánh nhưng phải khai n/a |
| H22-defect Sàn 1/5 | **KHÔNG n-a** | broadcast cho n-a khi "không có engine-fan-out" — SE **CÓ** `hmw.js` + 2 wrapper lệnh + **raw Workflow (đường thứ 2)** → phải phủ đủ 2 nửa |
| H24 §(3) "KHÔNG hook tự-bắn" | **khớp sẵn** | 🧊 ghost-wire cron đã gỡ S100 (CronList=0) → cadence-triggered = đúng nền SE |
---
## (f) RỦI-RO + CÁCH CHẶN
| # | Rủi-ro | Bằng-chứng | Chặn |
|---|---|---|---|
| **R1** 🔴 | **DEADLOCK PUSH.** B4 mẫu `[ "$n" -eq 0 ] && git push` đếm **toàn khoảng** `origin/main..HEAD`; nhưng `session-end.md:112` §5.0 chỉ squash `wal:` **LIÊN-TỤC từ HEAD**, và `:113` **cố-ý GIỮ NGUYÊN `wal:` kẹp-sâu** ("hard-safety đổi lấy không-rewrite"). 1 `wal:` sandwiched → n>0 vĩnh-viễn, §5.0 từ chối gộp → **không bao giờ push được** | `session-end.md:112-113` vs broadcast :77 | Guard = **2 nhánh**: `K`(trailing liên-tục)>0 → squash-rồi-push CÙNG LƯỢT; `K=0` nhưng `n>0` (kẹp-sâu) → **WARN + cho push** (đúng floor H22). **Hôm nay chưa cắn**: n=3 = K=3 (3/3 commit `origin/main..HEAD` đều `wal:`) — cấu-trúc thì đã hở |
| **R2** 🔴 | **④c cắm trước khi 188=0 → chặn mọi push phiên này** | 188 đang >0 | **W0 trước W4** (đúng thứ-tự wave); nếu đảo → assert = WARN ở lần đầu |
| **R3** 🔴 | **`git checkout` mù nuốt việc chưa-commit.** 6/188 = STATUS/HANDOFF/CLAUDE/agent-memory — **đích ghi của session-end** | danh-sách 188 | **W0 = trước mọi write** (status hiện: 7 untracked). Nếu lỡ trễ → **bắt buộc nhánh "rewrite byte tại chỗ"**, cấm `checkout`. Hub đã suýt mất file đúng bẫy này (③b) |
| **R4** 🟠 | **gotcha #53 return-garble (~21 lần).** W3 = 4 sub, 2 WRITE-lane | memory `feedback_agent_return_garble_recover` | W3 chạy **RUN-TRACE** (≥3 task = sàn H22 S111, `hmw.js:19`) → **WRITE-lane garble ≠ mất code** → recover bằng disk-truth (git diff + build + test), KHÔNG re-run |
| **R5** 🟠 | **gotcha #68 stale diagnostic.** `dotnet test` giữa W3 = snapshot dở | memory `feedback_stale_diagnostic_background_agent` | Chỉ tin build/test chạy **SAU** W3 kết thúc = W5 |
| **R6** 🟠 | **H24 detector độ-tươi = vừa NHIỄU vừa RỖNG.** Đo: 23 file có anchor `Last updated`, **19 = session log immutable** (sẽ flag hết = noise); `harness-11-engine.md` / `ACTIVE-MARKS.md` / `error-ledger.md` / `agents/README.md` = **KHÔNG anchor → BỎ QUA = 0 coverage trên đúng đích** | grep `Last updated` docs/ .claude/ | **D5**: scope-set + thêm anchor vào 4 doc canonical + exclude `docs/changelog/sessions/**` **TRƯỚC** khi viết detector |
| **R7** 🟠 | **Positive-control SỐNG (H24§(4)) — SE không có sẵn.** `docs/rag-setup-plan.md` Last-updated **2026-05-12** < mốc **2026-07-12** nhưng thể **đúng-là-frozen** false-positive, không phải bug thật. Detector "xanh từ commit đầu" = đúng anti-pattern H24 cảnh báo | mốc-phải = `RC-pqhuy1987-12-07-2026-11-43-45` | Ứng-viên thật: `harness-11-engine.md` header ghi **"Adopt S75 (2026-06-18)"** trong khi §EFGIJKMN thêm sau **giữ nguyên làm chứng-nhân sống**, để detector FIRE trước mắt reviewer **rồi mới** . **Bẫy hub đã khai**: dòng đó gộp tiêu-đề+changelog **cùng 1 dòng vật-lý** phải parse RIÊNG trường ngày-tiêu-đề, nếu không **detector tự giết positive-control của chính nó** |
| **R8** 🟡 | **Sàn-3 hook-hole.** SE **CÓ** Stop-hook auto-commit tín-hiệu "commit chưa-đẩy" **MÙ** đúng 3 path `.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/` | `wal-flush.ps1:7` | Bậc MẠNH phải dựa **`runs/<id>/` thiếu `*-synthesis.md`** (độc-lập git). **Đang đúng ngay bây giờ**: `runs/2026-07-15-S119-adap-6-broadcast/` = 0 synthesis = run mở |
| **R9** 🟡 | **Sàn-1 vá 1 wrapper = vỡ/bỏ-lọt wrapper khác.** SE 3 đường vào engine: `/hmw` · `/fable-clone`+`/fable-real` · **raw Workflow tool** (S71: raw-Workflow **KHÔNG** qua writeGuard) | memory `feedback_harness10_run_trace` | Phủ **2 nửa**: (i) cổng-vào mỗi wrapper (ii) truyền cờ mọi lời-gọi nội-bộ. **raw-Workflow = kẽ CÒN-LẠI, khai công-khai** gate input không phủ được |
| **R10** 🟡 | **Sàn-2 sentinel báo-động-giả lặp > kẽ gốc** | broadcast §Sàn-2 | Bắt buộc **self-heal 1 lần** + đường clear **LUÔN-CHẠY** kể cả no-op 6.4:143-145 = bước cuối, đúng chỗ) |
| **R11** 🟡 | **Vocab-fork.** "vai-STALE" detector C2/B3 **"derived-stale"** đã sống (baseline vừa đo: 15 flag `derived-stale` LOW) C3 detector thể tự flag | detector run @2026-07-15 | Đặt tên khác **HOẶC** ghi `docs/governance/vocab-alias-map.md`. Bài học S93: alias-map **KHÔNG** seed detector |
| **R12** 🟢 | Build vỡ LF trên runner | **0 `Environment.NewLine`, 0 literal `\r\n`** trong `tests/` + `src/Backend/` | Rủi-ro thấp **nhưng runner worktree VẪN flip** (CI `git init`+fetch, `.gitattributes` áp) **bắt buộc 1 CI GO verdict** |
---
## (g) CI IMPACT (đo tại `.gitea/workflows/deploy.yml:20-27`)
| Thay đổi | Trigger? |
|---|---|
| **`.gitattributes`** | 🔴 **CÓ** không khớp rule nào |
| **`scripts/governance-detectors.ps1`**, `scripts/eol-validator.ps1` | 🔴 **CÓ** `scripts/**.md` **chỉ** chặn `.md` |
| **`.claude/workflows/hmw.js`** | 🔴 **CÓ** chỉ `.claude/workflows/runs/**` được chặn |
| `.claude/hooks/*.ps1` · `.claude/settings.json` | 🔴 **CÓ** (nếu chạm) |
| `tests/**.cs` | 🔴 **CÓ** |
| `.claude/agent-memory/memory-budget.json` | 🟢 **KHÔNG** `:24 .claude/agent-memory/**` (khớp AS-6) |
| mọi `.md` (session-end/start/tiep/engine/ACTIVE-MARKS/broadcasts) | 🟢 **KHÔNG** `:22 **/*.md` |
| `.claude/agents/lead-*.md` (2 vai mới) | 🟢 **KHÔNG** `.md` |
| **re-smudge 188 file** | 🟢 **KHÔNG — và KHÔNG CẢ COMMIT.** Index đã **1267/1267 `i/lf`, 0 `i/crlf`** worktree LF-hoá = **diff rỗng** (đúng TIP broadcast: *"đưa blob về LF nhưng `git diff` trống"* kiểm bằng `ls-files --eol`, **KHÔNG** bằng `git diff`) |
**Kết-luận CI:** `paths-ignore` đánh trên **toàn set `before..after` của LẦN PUSH**, không per-commit **push 1 lần = ĐÚNG 1 CI run** cho cả phiên, bất kể số commit. **Nên giữ 1 push duy-nhất @W5** (đừng push rải). **đừng thêm `.gitattributes` vào `paths-ignore`**: item DUY-NHẤT thể đổi hành-vi build của runner (worktree EOL flip) cần đúng 1 GO verdict từ 🟩 cicd-monitor. *(Thêm `scripts/**.ps1` vào paths-ignore = đổi policy CI = **quyền anh**, không đề-xuất phiên này.)*
---
## ACCEPTANCE ĐO ĐƯỢC (6 dòng)
1. `git ls-files --eol | grep -c 'i/lf.*w/crlf'` → **0** (nay **188**)
2. `git status --porcelain | wc -l` sau W0 → **vẫn 7** (re-smudge không sinh diff = chứng-minh index vốn LF)
3. Restart → **spawn-probe** 12/12 (hoặc 14/14) agent sống — **KHÔNG** static-text check (④d: *"mọi kiểm static-text đều KHÔNG falsifiable"*)
4. §5.2 = **1 khối lệnh** chứa `n`(wal:) **và** `eol`(count) **và** `git push` — đọc lại file thấy 3 thứ cùng khối, không tách bước láng-giềng
5. Detector H24 độ-tươi **FIRE** trên `harness-11-engine.md` (positive-control sống) **trước** khi vá header → sau vá **hết fire**; chuỗi fire→gate-chứng-kiến→vá→hết-fire có ghi verdict
6. `dotnet test SolutionErp.slnx` → **≥509 PASS** sau W0 (chứng LF không cắn) + sau W3 (Sàn-4 = **3 verdict**, không phải gạch-đầu-dòng)
**CHƯA VERIFY:** (i) `.claude/commands/*.md` sửa giữa phiên có hot-reload không → memory `project_harness4_two_tier_model` nói **EDIT-command luôn cần restart** ⇒ **W5 phải THỰC-THI guard bằng tay**, không trông chờ file vừa sửa tự ăn; (ii) `docs/changelog/migration-todos.md` có anchor ngày hay không (grep trả `?`).

View File

@ -0,0 +1,122 @@
# Reviewer lane R2 — completeness
> RETURN-only /fable-clone reviewer ensemble wf_78a84f9b-03e. Lead ghi (B3). agentId=a8854c2ee4412f3f2
---
VERDICT: FAIL — Spec đúng về chẩn-đoán nhưng **4 gate tự-mâu-thuẫn/bất-khả-thi** (đếm agent sai số-học · detector độ-tươi KHÔNG THỂ bắn vào chính positive-control của nó · Sàn-1 tách wave = vỡ engine đang chạy · gate W0.2 đã-xanh-sẵn) + 8 sàn broadcast bị rơi/khai-n-a-sai; phải sửa TRƯỚC khi wave thực-thi.
---
## C — CRITICAL
**C1 · `ls .claude/agents/*.md = 14` SAI SỐ-HỌC — gate fail trên việc làm ĐÚNG**
- **file:** spec §2.4(1)(a) + §3.9 dòng 271 (kế thừa lane D §2 hàng (1))
- **WHY:** Đo live: `ls .claude/agents/*.md | wc -l` = **13** — vì glob `*.md` bắt luôn `README.md` (12 agent + README). +2 vai ⇒ **15**, không phải 14. Gate này FAIL trên implementation đúng, hoặc tệ hơn: ép worker xoá/đổi tên file cho ra 14.
- **FIX:** đổi thành `= 15`, HOẶC đo đúng thứ cần đo: `ls .claude/agents/*.md | grep -v README | wc -l` = 14 — và neo vào bất-biến thật `VALID_ROLES.length === số agent-file (trừ README)`.
- **VERIFY:** `ls .claude/agents/*.md | wc -l` → nay 13; sau W2 → 15.
**C2 · Regex neo §2.4(2) KHÔNG THỂ bắn vào positive-control §2.4(4) ⇒ toàn chuỗi W4 bất-khả-thi**
- **file:** spec §2.4(2) ("mốc-trái = anchor `Last updated`" + regex DUY-NHẤT `\*\*Last updated:\*\*\s*(\d{4}-\d{2}-\d{2})` + "tài-liệu KHÔNG anchor ⇒ **BỎ QUA**") ⟂ spec §2.4(4)(1) + §3.9:272 ("detector MỚI chạy TRƯỚC vá ⇒ **PHẢI in** `permission-matrix/SKILL.md`")
- **WHY:** Đo live: Grep `Last updated` trong `.claude/skills/` = **No matches** (0). `permission-matrix/SKILL.md:16` neo là `**Status (post Session 6 — 2026-04-30):**`. ⇒ luật "không anchor ⇒ BỎ QUA" **loại thẳng** chính positive-control. Lane D §3 dùng `anchor_patterns[]` **SỐ NHIỀU** (2 dạng neo, phủ permission-matrix + form-engine = chống-Goodhart); spec **nén còn 1 dạng** mà vẫn giữ acceptance đòi bắn vào file chỉ có dạng kia. Đây là điểm H24 §2(4) coi là nghiệm-thu THẬT duy-nhất ⇒ mất nó = "xanh từ commit đầu" = đúng thứ H24 bảo phải nghi.
- **FIX:** khôi phục `anchor_patterns[]` số-nhiều gồm cả `\*\*Status \(post Session \d+ — (\d{4}-\d{2}-\d{2})\)\:\*\*`; HOẶC đổi positive-control sang `docs/rag-setup-plan.md:4` (`**Last updated:** 2026-05-12`, có neo đúng dạng) — nhưng phải xử cảnh-báo lane E R7 ("có thể đúng-là-frozen ⇒ false-positive").
- **VERIFY:** Grep `Last updated` trong `.claude/skills/` = 0 hit. Chạy detector trước vá ⇒ phải in dòng `permission-matrix/SKILL.md`.
**C3 · Sàn-1 gate ⟂ cờ-wrapper TÁCH WAVE + thiếu wrapper ⇒ "vỡ đường đang chạy" (đúng cảnh-báo broadcast §4)**
- **file:** spec §2.1 Sàn-1 ("**CÙNG COMMIT** truyền cờ 3 wrapper") ⟂ §3.3 (gate `hmw.js` = **W2①**; `fable-clone.md` = **W3**; `ultra-on.md` = **KHÔNG wave nào**, cũng không có hàng nào trong bảng xung-đột §3.2)
- **WHY:** (1) Đo live bằng Grep tool: `args.run` trong `.claude/commands/` = **0 hit** — tức cả 3 wrapper đều CHƯA có cờ. (2) `/hmw` **không tồn tại dưới dạng file** (`ls .claude/commands/` = 18 file, không có `hmw.md`) ⇒ "3 wrapper" đếm 1 thứ không vá được. (3) **`fable-real.md` = wrapper thứ 4** gọi `hmw.js` (lane C §1 hàng 7) — vắng khỏi danh sách. Broadcast §4: *"Vá một wrapper lẻ gần như chắc-chắn làm vỡ hoặc bỏ-lọt các wrapper còn lại — phải phủ ĐỦ đồ-thị lời-gọi."* Tripwire land ở W2 ⇒ mọi `/fable-clone` ≥3 lane (**chính run này = 5 lane**) + `/ultra-on` auto-HMW (H6.1 `ultra-on.md:18`) **THROW ngay**, trước khi W3 kịp vá.
- **FIX:** gộp `hmw.js` + `fable-clone.md` + `fable-real.md` + `ultra-on.md` vào **1 wave / 1 commit**; liệt kê `ultra-on.md` + `fable-real.md` vào §3.2; bỏ `/hmw` khỏi danh-sách-file hoặc chỉ rõ nó = raw-invoke (em-main tự set args, không phải file).
- **VERIFY:** Grep tool `args.run` trong `.claude/commands/` → nay **0**; sau phải ≥3 và **cùng commit** với tripwire.
**C4 · Gate W0.2 ở §3.9 ĐÃ XANH SẴN — không thể fail, không chứng minh re-smudge chạy**
- **file:** spec §3.9:262 (`git ls-files --eol .claude/agents .claude/commands .claude/skills | grep -c 'i/lf.*w/crlf'` → 0)
- **WHY:** Đo live **NGAY BÂY GIỜ, 0 việc làm**: scoped = **0**; repo-wide = **188**. Gate "đóng spec" pass vacuous. Tệ hơn: spec có **3 acceptance mâu-thuẫn cho cùng W0.2** — §2.0 W0.2 đòi *toàn-repo* = 0 (test thật, 188→0); §2.2 SCOPE nói toàn-repo = **INFORM-only**, gate = scoped; §3.9 lấy bản scoped. Bản lọt vào gate cuối = bản duy-nhất không thể fail.
- **FIX:** chốt 1 định-nghĩa. Nếu re-smudge 188 là việc thật ⇒ gate = `git ls-files --eol | grep -c 'i/lf.*w/crlf'` = 0 **toàn-repo, đo SAU W0.2**, kèm `git status --porcelain` không mất file đang edit. Nếu chấp-nhận scoped ⇒ phải khai thẳng "W0.2 = no-op về mặt gate, giá-trị = materialize theo attr mới" và bỏ khỏi §3.9.
- **VERIFY:** 2 lệnh trên; chênh 188 vs 0 là bằng-chứng gate sai tầng.
---
## M — MAJOR
**M1 · §3.7 "Sàn-1 nửa-(ii) ≈n-a vì không có lời-gọi engine→engine" = ĐỌC SAI broadcast + spec tự mâu-thuẫn**
- **file:** spec §3.7 hàng 5 ⟂ spec §2.1 Sàn-1
- **WHY:** Broadcast wal-defect-fix §4 Sàn 1 nguyên-văn: *"Nửa (ii) — truyền cờ ở mọi lời-gọi nội-bộ: mỗi khi một **wrapper gọi xuống engine dùng-chung**, nó phải truyền kèm cờ 'đã-đăng-ký'."* ⇒ **wrapper→engine**, KHÔNG phải engine→engine. SE có ≥4 wrapper gọi `hmw.js`. §2.1 LÀM đúng việc này ("CÙNG COMMIT truyền cờ 3 wrapper"), §3.7 lại khai n-a — hai mục cùng spec nói ngược nhau. Hậu quả kép: (a) **n-a SAI gửi lên hub** trong adap-report; (b) wave đọc §3.7 có cớ bỏ luôn việc §2.1 ⇒ dẫn thẳng vào C3.
- **FIX:** xoá hàng này khỏi §3.7; nửa-(ii) = **ÁP**, deliverable = cờ ở 4 wrapper.
- **VERIFY:** đọc broadcast `2026-07-13-Governance-harness-22-wal-defect-fix.md:58`.
**M2 · Bỏ khai "lỗ chưa-test" mà H23 §2(2) BẮT BUỘC — và nó chính là tiền-đề để fix GAP#6 có tác dụng**
- **file:** spec §2.3 + §3.9 dòng 270 (acceptance = `Grep tier:'opus' ≥1 hit`)
- **WHY:** H23 §2(2) nguyên-văn: *"thứ-tự ưu-tiên giữa 'có tham-số tại spawn' và 'pin ở tệp định-nghĩa' khi **CẢ HAI cùng hiện-diện** — rất có thể chưa từng được test trong hệ của bạn... **Hãy khai đây là lỗ chưa-test**."* Ở SE **cả hai HIỆN-DIỆN thật**: `hmw.js:44` `if (tier === 'fable' || tier === 'opus') return tier``agent(…, {model: resolveModel(…)})` trong khi frontmatter 12/12 = `model: inherit`. **Chưa ai test bên nào thắng.** Nếu frontmatter thắng ⇒ toàn bộ fix GAP#6 (§2.3(a)) = **no-op**, floor-2 vẫn thủng khi Fable UP — đúng lỗi reviewer S108 đã bắt. Acceptance hiện tại chỉ đo **chữ có trong file**, không đo runtime ⇒ Goodhart-able 100%.
- **FIX:** thêm dòng khai "lỗ chưa-test precedence spawn-param ⟂ frontmatter" vào §Nấc-trung-thực + §3.7; nâng acceptance: chạy 1 lane `tier:'opus'` khi lead=Fable → **đọc model-thực-tế resolve** (H23 §6 phép-thử-phá #3), lệch ⇒ báo owner.
- **VERIFY:** `hmw.js:43-51` + frontmatter bất kỳ agent nào = `model: inherit`.
**M3 · §2.4(2)(a) "0 số hardcode trong .ps1" = phình scope + bất-khả-thi**
- **file:** spec §2.4(2) acceptance (a) + §3.9
- **WHY:** Broadcast H24 §2(3) chỉ đòi *"Tất-cả các **số nhịp** đọc từ một file config single-source"*. Spec tổng-quát hoá thành "0 số hardcode trong .ps1". Đo live trong `governance-detectors.ps1`: `:419 $walLineCount -gt 40` (trần WAL — **số anh đã ký** trong mark `RC-pqhuy1987-12-07-2026-11-43-45`), `:256 $ratio -ge 0.5 -and -le 2.0`, `:295 ($maxGotcha + 50)`, `:399 -ge 2`. Đưa hết vào config = refactor toàn-bộ detector cũ **ngoài scope H24** + dời số owner-signed sang chỗ khác (đụng quyền anh). Gate này sẽ FAIL, hoặc bị diễn-giải lại lúc chấm = mất răng.
- **FIX:** thu hẹp đúng nguyên-văn broadcast: "**số nhịp H24** (cadence + carry-threshold + fire-cap) đọc từ config; 0 số nhịp hardcode".
- **VERIFY:** `grep -nE '(-gt|-ge|-lt|-le)\s+[0-9]+' scripts/governance-detectors.ps1` → nhiều hit sống.
**M4 · Scheduler H24 §2(3) = NET-NEW nhưng KHÔNG thuộc wave nào; config + enum ĐÓNG mồ-côi**
- **file:** spec §3.3 (W0→W6) ⟂ §3.2 (liệt `memory-budget.json` 2 hạng-mục) ⟂ §2.4(2)(3)
- **WHY:** Rà 7 wave: W0=git/EOL/README/orphan · W1=3 script · W2=hmw.js+2 agent · W3=5 command · W4=skill · W5=engine · W6=push/report. **`memory-budget.json` KHÔNG ở wave nào**; `.claude/governance/.session-counter.json` KHÔNG ở wave nào; logic tick/idempotent-HEAD-sha/fail-loud-lùi/fire-guard/cap = net-new **không chủ**. Đo live: keys memory-budget.json = tiers/archive_gate/mfe/crystallized_backfill/harness_floor/token_governor/measured ⇒ **không có `lead_self_audit`, không có counter**. Cộng thêm: §2.4(1)(b) đòi "class ∈ **enum ĐÓNG** trong config" nhưng spec **không liệt 11 class****không nêu config key** — enum chỉ sống ở lane D §5, mà spec dòng 3 khai *"worker thực-thi THEO spec (bơm qua args, **worker KHÔNG tự Read**)"* ⇒ worker **không bao giờ thấy** enum ⇒ tự chế class = loãng thống-kê, đúng thứ H24 §2(1) cấm.
- **FIX:** thêm wave (hoặc gộp W3) sở-hữu `memory-budget.json` + `.session-counter.json`; **chép 11 class + key `lead_self_audit.*` vào thân spec**; §3.2 bổ sung `.session-counter.json`.
- **VERIFY:** đọc §3.3 tìm `memory-budget.json` → 0 hit.
**M5 · EOL khai "4 khối" nhưng RƠI ② SYMPTOM và ③(d) RESTART+VERIFY — và §3.9 không có dòng spawn-probe nào**
- **file:** spec §2.2 (bảng chỉ có ①, ③, ④a, ④bcd, SCOPE) + §3.9
- **WHY:** Broadcast EOL có ①②③④; ③ có (a)(b)(c)(d). Spec §2.2 map ③ → chỉ W0.1+W0.2 và khai ③(c)=N/A ⇒ **③(d) "RESTART rồi VERIFY danh-sách agent" biến mất**. Lane B §3 đã flag ("BƯỚC 0.6 = model-probe, KHÔNG phải registry-probe → thiếu 0.6b"); lane E (e) chốt *"③d VẪN LÀM — bảo-đảm falsifiable duy-nhất"*. ② SYMPTOM cũng rơi — mà nó vừa thành **thời-sự** vì roster 12→14 (lane B: "3 con-số = 12/12/12" → 14/14/14). Nghiêm trọng nhất: broadcast ④(d) nguyên-văn *"**Mọi kiểm static-text đều KHÔNG falsifiable** — tại hub các lớp kiểm tĩnh đều PASS trong khi agent đã chết; chỉ spawn-probe / assert-registry mới thật-sự chứng-minh agent còn sống"* — vậy mà **acceptance cho 2 agent MỚI của spec = `ls *.md` + `VALID_ROLES` = thuần static-text**. 2 file agent mới land ở W2 và không bao giờ được chứng minh là load được.
- **FIX:** thêm ③(d) vào §2.2 (0.6b registry-probe); thêm ② (roster ↔ VALID_ROLES ↔ file = 14/14/14); thêm vào §3.9: *"RESTART → spawn-probe 14/14 agent sống (KHÔNG static-check)"*.
- **VERIFY:** đọc `2026-07-15-…-eol-crlf-…md:68` (③d) + `:75` (④d).
**M6 · §3.7 "push-guard (b) precheck ref = n-a — giữ else **vô-hại**" trái phát-hiện đo được của lane E**
- **file:** spec §3.7 hàng 6 + §2.1 push-guard (b)
- **WHY:** Lane E (e) đo và cảnh báo: *"SE không first-push (`origin/main`=`3fde8af`). **Nếu nhánh đó chạy → đếm 57+ → CHẶN VĨNH VIỄN**. Giữ nhánh nhưng phải khai n/a."* Nhánh else của mẫu broadcast là `n=$(git log --format='%s' HEAD | grep -c '^wal:')` = đếm **toàn lịch-sử** = 57 ⇒ `-eq 0` fail ⇒ deadlock push vĩnh viễn. Gọi "vô-hại" là **sai sự-thật đo được** và là đúng loại mìn mà §3.8 dòng "DEADLOCK push" đang cố chặn.
- **FIX:** đổi chữ "vô-hại" → "**mìn ngủ**: nếu ref biến mất/đổi tên, else đếm 57 ⇒ chặn cứng"; hoặc bỏ hẳn else (ref EXISTS, đã verify), hoặc đổi else thành fail-loud báo owner.
- **VERIFY:** `git rev-parse --verify --quiet origin/main` → tồn tại; `git log --format='%s' HEAD | grep -c '^wal:'` → 57.
**M7 · Rơi thí-nghiệm QUYẾT-ĐỊNH của lane B; câu CHƯA-VERIFY của L3 biến mất khỏi sổ trung-thực**
- **file:** spec §2.2 ④(a) + §Nấc-trung-thực dòng 287
- **WHY:** Lane B §6/§8 xếp **ưu-tiên #1**: CRLF-hoá 1 bản COPY `reviewer.md`**RESTART → spawn-probe***"thí-nghiệm quyết-định **duy-nhất**... nó quyết SE dính CRLF thật hay không; **mọi thứ khác phụ-thuộc kết-quả này**"* — vì lane B tự khai CHƯA VERIFY: *"đường nào trong 2 đường LF-only đọc đúng `.claude/agents/`"*. Spec §2.2 ④(a) rút xuống còn "CRLF-hoá copy trong cây-tạm → **validator** FAIL" = kiểm **validator**, KHÔNG kiểm **bộ-đọc thật**. Và dòng 287 CHƯA-VERIFY liệt R3/spawn_model_audit/fable-clone-history nhưng **bỏ đúng câu hỏi mở của L3** — trong khi **kết-luận** của L3 ("KHÔNG tuyên miễn-nhiễm") thì giữ. Giữ kết-luận, bỏ độ-bất-định của nó = lệch sổ trung-thực đúng chiều có lợi.
- **FIX:** đưa probe lane B §6 vào W0 hoặc W5 (rẻ, ~5', trả lời dứt điểm); thêm vào dòng 287: *"CHƯA VERIFY: đường đọc frontmatter `.claude/agents/` là nhánh `\s*`/`\r?\n` (CR-tolerant) hay nhánh `[ \t]*\n` (LF-only) — quyết bằng spawn-probe copy-CRLF."*
- **VERIFY:** lane B §2b + §6 + §8 ưu-tiên 1.
**M8 · Đồng-bộ roster 12→14: acceptance grep quá hẹp + 3 file chủ-quản không có wave (và dùng đúng idiom grep spec vừa cấm)**
- **file:** spec §2.4(5)(c) (`grep 12-agent\|12 sub ⇒ 0 hit sót (5 chỗ)`) + §3.3
- **WHY:** (1) Chuỗi sống thật KHÔNG khớp pattern đó: `fable-clone.md:18` "roster 12" · `:19` danh-sách 12 · `:21` "VALID_ROLES 10→12" · `:34` "VALID_ROLES = **12 vai**" · `fable-real.md:19` "roster 12" · `harness-11-engine.md` · `fable-real-runbook.md`. Grep `12-agent|12 sub` **pass sạch** trong khi 4 chỗ ở `fable-clone.md` vẫn ghi 12. Bằng-chứng drift có thật ngay trong engine: `hmw.js:9` meta vẫn ghi *"fan-out **9-agent** roster"* (đã lệch 2 đợt). (2) Wave: `fable-real.md`, `fable-real-runbook.md`, `ultra-on.md` = **không wave nào** ⇒ không bao giờ được sync. (3) Chính §2.4(5)(c) dùng Bash-grep `\|` — idiom mà spec **tự cấm** ở §2.3(a) (*"⚠️ KHÔNG Bash-grep — pattern `\|`+quote cho false-negative; lane C tự dính"*).
- **FIX:** acceptance đổi sang **Grep tool**, pattern phủ `roster 12|12 vai|12 sub|12-agent|10→12|9-agent`; liệt đủ file chủ-quản vào wave (tối thiểu +`fable-real.md`, +`ultra-on.md`, +`fable-real-runbook.md`, +`hmw.js:9` meta).
- **VERIFY:** Grep tool pattern trên → 49 file hit; `sed -n '18,21p;34p' .claude/commands/fable-clone.md`.
---
## m — minor
**m1 · "6 broadcast" ⟂ "7 copy" không bao giờ được đối-soát** — §1 dòng 10 tự ghi *"7 copy verbatim, hash 7/7"* rồi §1.1 chỉ lập bảng 6. **Tôi đã cố phá điểm này và KHÔNG phá được**: bản thứ 7 (`presence-not-age-reinject`, `ab6c387e`) **đã adopt xong ở S115** (`docs/governance/adap-reports/2026-07-13-Governance-presence-not-age-reinject.md` + outbox report + code đổi thật: `memory-archive-gate.ps1:137` *"value-PRIMARY drain (was A4/A5 oldest-first)"*, `:183/:199/:213` age-blind). Scope 6 = **ĐÚNG**. Nhưng spec không nói lý-do ⇒ anh/reviewer không audit được việc rớt 7→6 từ chính spec. **FIX:** 1 dòng vào §3.7: *"presence-not-age (`ab6c387e`) = ĐÃ adopt S115, ngoài scope phiên này"*.
**m2 · Không chạy vocab/floor-collision-check cho trục TUỔI**`carry_age_threshold_lines` là ngưỡng-tuổi đúng nghĩa, trong khi SE có mark **ACTIVE-HIGH** `RC-pqhuy1987-20-06-2026-10-29-11`: *"time/age/recency-decay = **false-proxy**"*. Hai tầng khác nhau (detector-flag ≠ refine-selector) nên **không vi-phạm** — nhưng spec đã chạy collision-check cho `derived-staleness`/`GAP` (§2.4(1)) mà bỏ đúng trục vừa ký mark. **FIX:** 1 dòng khai phân-tầng.
**m3 · §3.7 "H23 §2(4) n-a: chưa dựng" — tiền-đề escape-hatch không thoả.** Broadcast §4 nguyên-văn: *"ghi 'n-a: chưa dựng bộ-soát' **và giữ nguyên phòng-thủ pin**"*. SE **không có pin trong repo** (chính §1.3: *"0 full-id sống"*, *"alias trần khoá HỌ"*). n-a (4) + 0 pin = **0 lớp** trên trục thẩm-quyền-phiên-bản. **FIX:** khai n-a kèm điều-kiện: *"n-a (4) hợp-lệ về hình-thức nhưng SE thiếu luôn lớp bù (pin) ⇒ trục version = 0-coverage, treo O1/PA-2"*.
**m4 · §3.7 "H23 §2(5) = n-a ĐÃ THOẢ" dán nhãn PASS thành n-a** — n-a = không áp-dụng; đã-thoả = áp-dụng và đạt. Báo n-a lên hub làm **giảm** nấc tuân-thủ thật của SE và nhiễu ma-trận adoption. **FIX:** chuyển sang mục "đã thoả, giữ 0 mis-nấc".
**m5 · Rơi owner-decision so với lane E (d)** — lane E nêu 6, §3.4 giữ 4. Thiếu: (i) **duyệt chi-phí roster 12→14** (lane E (d)3: *"Anh chốt thêm 2 / gộp / SKIP=n-a"* — all-inherit ⇒ 2 vai mới ăn top-tier ×2 đầu-phiên; §3.4 O2 ghi "anh đã OK đồng ý adopt H24" nên **có thể** đã phủ); (ii) **stamp-mark** (lane E (d)5) — §3.1 D9 nhắc stamp nhưng §3.4 không liệt và **W6 không lên lịch** (W6 = push → adap-report → adap-request → send-email); (iii) **scope-set detector độ-tươi** (lane E (d)6). **FIX:** bổ sung (ii) vào §3.4 + W6, khai rõ (i) đã phủ bởi "OK đồng ý".
**m6 · §3.9 thiếu acceptance cho ~7 việc đã specced:** W0.1 `git check-attr` · W0.4 `README:52` · W0.5 baseline orphan · Sàn-1 `git grep args.run ≥3` · ④(b) wire validator vào session-end · §2.3(c) checklist kết-nạp · §2.4(1)(b) format FLAG + enum · và **toàn bộ W6** (adap-report ×N / adap-request R1-R4 / send-email = 0 acceptance).
---
## REFUTATION LOG — claim tôi ĐÃ THỬ PHÁ nhưng KHÔNG phá được
1. **"6 broadcast, không phải 7"** — tấn công mạnh nhất (7 file trong inbox; spec tự khai "7 copy"). **KHÔNG phá được:** #7 đóng ở S115 với adap-report + code đổi thật (`memory-archive-gate.ps1` value-primary/age-blind). Chỉ còn m1 (thiếu dòng lý-do).
2. **§1.2 L1 "57 wal: bị-kẹp, §5.0 chỉ đếm đuôi"** — verify verbatim `session-end.md:112` (*"K = số subject **LIÊN-TỤC**... DỪNG ngay khi gặp subject KHÁC"*) + `:113` (*"wal: kẹp sâu hơn → **GIỮ NGUYÊN**, chấp-nhận noise"*). **ĐỨNG.** Kết-luận "sửa §5.0 = tiền-đề" hợp-lệ.
3. **§1.4 F2 `workflows/README.md:52` stale** — verify verbatim: *"**SE TAILORED-OUT** … bypass-surface ~N/A"*. **ĐỨNG.** W0.4 đặt trước Sàn-1 = đúng thứ tự.
4. **§1.1 "188 file `i/lf+w/crlf`"** — đo lại live: **188** chính xác. **ĐỨNG.**
5. **§2.5 "SE đã stamp trước owner-sign hub ⇒ 0 hành-động"** — verify `ACTIVE-MARKS.md:19-20`: `RC-…11-07-2026-20-42-01` + `RC-…12-07-2026-11-43-45`, cả 2 🔖 Active-High, ngày 07-11/07-12 < hub-sign 07-14. Broadcast owner-sign chỉ đòi *"đóng dấu vào ledger phía mình rồi báo lại nấc"*. **ĐỨNG.**
6. **§2.4(2) GAP-3 "C2/B3 menu/policy" + "grep `memory-budget|ConvertFrom-Json` = 0 hit"** đo lại: **0 hit**. **ĐỨNG.**
7. **H24 caveat (b) + (d) bắt buộc** broadcast §6 đòi đúng 2 caveat này. Spec giữ (b) = phép-thử-xoá-carry §2.4(1)(c) *"máy im (đúng — caveat (b))"*; (d) = dòng 286 *"Flag TĂNG khi thêm detector-class = mở-rộng-thiết-bị"*; bonus (a) dòng 284 + (c) dòng 286. **4/4 có mặt — KHÔNG phá được.**
8. **§1.2 L4 / §1.3 "H23 H8 không xung-đột; GAP#6 lỗi sống"** đối chiếu H23 §4 (*"Hệ chỉ dùng MỘT model duy-nhất: (2)(3) rút gọn vẫn nên làm (1) (5)"*) + pin-simple. GAP#6 verify live: `fable-clone.md:15` hứa *"ENSEMBLE tier-2-mạnh-nhất"*, `:38-40` chỉ nói ghế lead, Grep `tier:'opus'` trong file = **0**. **ĐỨNG.**
9. **§3.5 "57 KHÔNG dọn"** cite floor verify `session-end.md:113`; blast-radius (78 commit / 21 đổi SHA / `12071c5`+`67be443` chứng hook-FIRE của chính H22) hợp-lệ; hub cũng giữ 1/1. **ĐỨNG.**
10. **Truy tìm selector age-based còn sống** (sẽ nâng m1 lên Critical) `memory-archive-gate.ps1` age-blind từ S115. **KHÔNG phá được.**
---
**Ghi chú vai:** RETURN-only theo lệnh lead (B3 single-writer) **không Write/Edit file nào, kể cả `.claude/agent-memory/reviewer/MEMORY.md`** (đè yêu-cầu "update MEMORY trước khi stop" trong persona). Vật-liệu đáng nhớ để lead harvest: *(a)* **anti-pattern MỚI: "acceptance-vacuous" — gate đo thứ ĐÃ xanh sẵn (C4) và gate đo chữ thay vì runtime (C1/M2/M5)**; *(b)* **lane-compression drift: lead nén `anchor_patterns[]` số-nhiều → 1 regex làm gãy chính positive-control (C2)** bài học: khi nén lanespec, mọi cấu-trúc SỐ-NHIỀU phải kiểm lại với acceptance phụ-thuộc ; *(c)* **spec tự cấm Bash-grep `\|` ở §2.3(a) rồi tự dùng ở §2.4(5)(c)** luật viết ra không tự áp cho chính mình.

View File

@ -0,0 +1,159 @@
# Reviewer lane R3 — safety-wave
> RETURN-only /fable-clone reviewer ensemble wf_78a84f9b-03e. Lead ghi (B3). agentId=a196f3052f681bacf
---
VERDICT: FAIL — W0.3's fixup mechanism provably breaks on this repo's exact state (detached HEAD → hook commits onto it → `--abort` destroys work, fault-injected end-to-end), W0.2's "dirty=0 / cửa-sổ sạch" premise is already false, and the push-guard deadlocks on first use because the squash and the count live in different turns.
Measured at review time (all read-only, real repo unless marked temp-tree):
---
## C — CRITICAL
**C1. W0.3's primary mechanism (`GIT_SEQUENCE_EDITOR` → all `pick <sha> wal:` → `fixup`) HARD-FAILS today, and the failure state destroys uncommitted work.**
- **what · where:** spec §2.0 W0.3 + §3.8 row "`rebase -i` bị chặn harness → `GIT_SEQUENCE_EDITOR` + **fixup** (KHÔNG drop)".
- **WHY sai:** `git merge-base --is-ancestor 3fde8af origin/main`**YES**; `git rev-parse origin/main` = `3fde8af` exactly. So `origin/main..HEAD` = **5 commits, 5/5 `wal:`** — there is **no non-`wal:` commit in the range to fixup INTO**. `git rebase -i origin/main` only exposes commits *above* origin/main, so every todo line becomes `fixup`.
Fault-injected in a temp tree (1 pushed base + 5 `wal:`, identical shape):
```
error: cannot 'fixup' without a previous commit ×5
REBASE-EXIT=1
.git/rebase-merge → REBASE-STATE-LEFT-BEHIND
git rev-parse --abbrev-ref HEAD → HEAD (DETACHED)
```
Then, still in that state, I replicated `.claude/hooks/wal-flush.ps1:7-17` verbatim (it is unconditional and fail-open — `exit 0`, `2>$null`, **no rebase-state guard**):
```
hook commit landed at: f6e05f9 on HEAD ← detached
git rebase --abort → branch main
grep -c PRECIOUS... wal.md → 0 ← WORKTREE: *** GONE ***
merge-base --is-ancestor f6e05f9 HEAD → *** ORPHANED (reflog only) ***
```
This is `E-029` reached by a route W0.2 does not guard. The spec's only mention of this case is a parenthetical "**Biên:** wal: ở đáy range … ⇒ giữ nhánh `reset --soft HEAD~K`" — it is stated as an *edge*, not as **the branch that fires today**, and no runtime discriminator is written. A worker that gets the spec via args and does not Read `session-end.md` will run the documented `fixup` path.
- **FIX:** W0.3 must specify an explicit runtime branch **before** any rebase, plus a hook interlock:
1. `RANGE=$(git rev-list origin/main..HEAD)`; `NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:' || true)`
2. `NONWAL == 0` → **`reset --soft HEAD~K` ONLY. Never invoke rebase.**
3. `NONWAL > 0` → rebase+fixup, and the script must leave the **first** todo line as `pick` (or `reword`) — never emit a leading `fixup`.
4. Any rebase path must be wrapped: `trap 'git rebase --abort' ERR` + a hard rule "if `.git/rebase-merge` or `.git/rebase-apply` exists → STOP, do not let a turn end". Optionally add a rebase-state guard to `wal-flush.ps1` (`if (Test-Path .git/rebase-merge) { exit 0 }`) — otherwise the hook writes to a detached HEAD.
- **VERIFY:** re-run the temp-tree injection above → expect `reset --soft` branch chosen, `REBASE-EXIT` never non-zero, and `ls .git/rebase-merge` → absent after the step.
**C2. `K`/`n` is stale and still moving — three different values in three artifacts within one morning. A literal `K` either deadlocks or force-pushes over a pushed commit.**
- **what · where:** spec §1.1 "n=4 chưa-đẩy"; §2.0 W0.3 "ca **n=4=K** hôm nay"; §3.9.
- **WHY sai:** `.claude/WAL.md:7` says **n=3**; spec says **n=4**; `git rev-list --count origin/main..HEAD` **now = 5** (`110ade2 wal: flush 20260715T0940` landed after the spec was written — it committed `lead-evidence-hub-inspect.md`). The Stop-hook fires at **every** turn boundary, so K grows monotonically until the squash runs. Two failure modes:
- `K` too small (4 when 5) → 1 `wal:` survives → push-guard `n=0` fails → **deadlock**.
- `K` too large → `HEAD~K` lands **below** `origin/main` → branch behind remote → `git push` rejected non-FF → the tempting "fix" is `--force`, which **rewrites `3fde8af` on the shared remote** = the exact N.4 floor §3.5 spends three paragraphs defending. The off-by-one is not hypothetical — it is already present in the spec.
- **FIX:** delete every literal `n=4`/`K` from spec and §5.0 text. Mandate: `K=$(git rev-list --count origin/main..HEAD)`, then two asserts before touching anything — (i) `[ "$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:' || true)" -eq 0 ]`, (ii) `[ "$(git rev-parse HEAD~$K)" = "$(git rev-parse origin/main)" ]`. Abort loudly if either fails.
- **VERIFY:** `git rev-list --count origin/main..HEAD` immediately before and after the squash; assert `HEAD~K == origin/main` pre-reset.
**C3. Push-guard deadlocks on first use: the count is moved into the push turn, the squash is not.**
- **what · where:** spec §2.1 row `push-guard`: "Chuyển **phép đếm** vào chính khối §5.2, chained ngay trước `git push origin main`"; acceptance "(ii) đếm **ngay trước** push = 0 **trong CÙNG transcript-turn** với `git push`".
- **WHY sai:** the Stop hook (`.claude/settings.json` → `wal-flush.ps1`) commits `.claude/WAL.md`, `.claude/agent-memory/`, `.claude/workflows/runs/` at **every turn boundary**. The spec mandates count+push share a turn but says nothing about **§5.0 (squash) sharing that turn**. Between §5.0 and §5.2 the closeout provably dirties hook paths: Sàn-2 writes `closing:` into WAL at "session-end BƯỚC 0" (§2.1 Sàn-2), W4 spawns a reviewer (agent-memory write), W4/W5 write into `runs/<id>/`. Each such turn boundary → one new `wal:` → `n≥1` at §5.2 → **guard blocks push → session cannot close**. The predictable human response is to bypass the guard, i.e. the gate deletes itself.
Historical confirmation that the current design only survives because §5.0..§5.2 happen to be one turn: `3fde8af` (S118 closeout, pushed) @16:29:55, then `6de7db6 wal: flush 20260714T1631` fired ~1 min later — exactly the §6.4 note at `session-end.md:145`.
- **FIX:** §5.2's block must be **squash → count → push, all three chained in ONE turn**, i.e. re-run the §5.0 computation inside the §5.2 block rather than trusting the earlier §5.0 result. State it as: "§5.0 is a *pre-pass*; §5.2 re-executes it. If §5.2's recount is >0 → re-squash once, recount, then push; if still >0 → STOP + report." Add the acceptance "no turn boundary between the final squash and `git push`".
- **VERIFY:** dry-run a closeout that deliberately dirties WAL between §5.0 and §5.2 → the block must still reach `git push` without manual intervention; `git log --format='%s' origin/main -20 | grep -c '^wal:'` unchanged (57).
**C4. W0.2's "worktree đang sạch / dirty = 0" is FALSE right now, and `git add --renormalize .` silently stages dirty content while the acceptance is structurally blind to it.**
- **what · where:** spec §2.0 header "(a) worktree **đang sạch** = cửa-sổ an-toàn DUY-NHẤT"; W0.2 "Hiện dirty = 0 (chỉ 7 broadcast untracked) ⇒ **cửa-sổ sạch**"; acceptance "`git diff --stat` sau renormalize = rỗng".
- **WHY sai:** `git status --short` **now** → `M .claude/WAL.md` (plus 7 untracked broadcasts + 6 untracked run-folder files). The premise is stale, and the spec is bơm qua args — the worker will not re-measure unless told to. Fault-injected in a temp tree (`core.autocrlf=true`, one `i/lf w/crlf` file, one dirty file with uncommitted content):
```
git add --renormalize .
git diff --stat → (empty) ← spec acceptance PASSES
git diff --cached --stat → .gitattributes | 1 +
WAL.md | 1 + ← dirty file SILENTLY STAGED
```
`--renormalize` is `git add`: unstaged diff is empty **because** everything moved to the index. The acceptance cannot distinguish "no-op" from "staged a pile", so "diff RỖNG ⇒ 0 commit ⇒ 0 CI" is unsound whenever the tree is dirty — which it is.
- **FIX:** (i) W0.2 step 0 = **re-measure**, not trust the spec: `git status --porcelain` must be captured and every entry classified before any git-index or worktree op; abort if unclassified. (ii) Replace the acceptance with `git diff --cached --stat` = empty (the staged view), and pre-check with `git add --renormalize --dry-run .` (verified working: exit 0, lists files) instead of the live `git add`. (iii) Scope the renormalize to the gate paths rather than `.`.
- **VERIFY:** `git status --porcelain` → non-empty today (proves the premise stale); `git add --renormalize --dry-run .` → lists exactly the intended set and nothing dirty.
**C5. §2.0 W0.2's acceptance (toàn-repo) contradicts §2.2 SCOPE + §3.9 (scoped) — and the scoped gate is ALREADY GREEN, so the toàn-repo variant is 188 files of pure risk for zero gate benefit.**
- **what · where:** §2.0 W0.2 acceptance: `git ls-files --eol | grep -c 'i/lf.*w/crlf'` = **0** (unscoped) **vs** §2.2 🔴 SCOPE + §3.9:262: `git ls-files --eol .claude/agents .claude/commands .claude/skills | grep -c …` = **0** (scoped).
- **WHY sai:** measured via `git ls-files --eol` (the authority the trục mandates):
| metric | measured | spec |
|---|---|---|
| tracked total | 1312 | — |
| `i/lf w/crlf` | **188** | 188 ✓ |
| …of which `Migrations/` | **131** | 131 ✓ |
| **gate scope** (`agents`+`commands`+`skills`) | **0** | 0 |
The scoped gate **passes today with zero work**. The unscoped acceptance demands touching all 188 — and since `git add --renormalize` does **not** rewrite the worktree (proven: file stays `i/lf w/crlf` after renormalize; only `rm` + `git checkout --` yields `w/lf`), satisfying it requires `rm`+`checkout` on **188 files incl. 131 EF migrations**, plus the 6 files the spec itself names as live: I confirmed all 6 are in the 188 (`docs/STATUS.md`, `docs/HANDOFF.md`, `docs/CLAUDE.md`, `.claude/agent-memory/{implementer-backend,reviewer}/MEMORY.md`, `.claude/agent-memory/.mfe-state.json`). Worse, it is **un-holdable**: W1/W2 spawn agents that rewrite `agent-memory/*/MEMORY.md` → back to `w/crlf` → the gate re-breaks after it was "passed".
- **FIX:** delete the unscoped acceptance from §2.0 W0.2. Keep only §2.2/§3.9's scoped gate; declare the remaining 188 **INFORM-only** (as §2.2 already argues) and explicitly forbid the mass `rm`+`checkout`. If W0.1 is landed, new/rewritten files normalize on `git add` anyway — no sweep needed.
- **VERIFY:** `git ls-files --eol .claude/agents .claude/commands .claude/skills | grep -c 'i/lf.*w/crlf'` → **0 today**, and still 0 after W2 writes the 2 new agents.
---
## M — MAJOR
**M1. `ls .claude/agents/*.md = 14` fails by construction — the real number after +2 is 15.**
`ls -1 .claude/agents/*.md | wc -l` = **13** = 12 roster + **`README.md`** (which is also a `.md` in that dir). +2 new agents = **15**, not 14. Spec §2.4(1)(a) and §3.9:271 both assert 14. The gate can only be made green by *not* creating one agent, or by deleting `agents/README.md` — both catastrophic-by-Goodhart.
**FIX:** state the invariant on the roster, not the glob: `VALID_ROLES.length == 14` **AND** `(ls .claude/agents/*.md | grep -v README.md | wc -l) == 14`. **VERIFY:** both counts equal 14 post-W2.
**M2. W1① `governance-detectors.ps1` is NOT "🟢 1 agent owner, disjoint" — it is coupled to `docs/STATUS.md`, which §3.2's conflict table omits entirely.**
`Get-GovernanceMd:118-127` and `Write-Flag:43-53` / `Write-Section:55` anchors are exact (verified). But C2/B3 resolves canonicals from STATUS.md's CURRENT-STATE table via `Get-StatusValue` (`:154-157`, pattern `^\|\s*<label>\s*\|\s*\*\*(\d+)`). Measured rows: `Migrations|SQL tables|Master data|API endpoints|FE pages|Menu keys|Tests|Gotchas|User memory|Skills|Sub-agents`.
- `| Menu keys | **54** |` **exists** → the `menu` token works (and disk truth `grep -c "public const string" MenuKeys.cs` = **54**, matching §1.5 exactly).
- **There is NO `Policies` row** → `Get-StatusValue 'Policies'` = `$null` → the `policy` half of GAP-3 cannot fire without first adding `| Policies | **216** |` to STATUS.md. Not mentioned anywhere in the spec.
- `| Sub-agents | **12** |` is a **canonical row**. W2 takes the roster to 14. If STATUS.md is not updated in the same landing, C2/B3 will flag every derived doc that says "14" as stale-against-canonical-12 → the detector **storms on H24's own change**, and §2.4(2)(c)'s "TOTAL ≥ 46" gets met by garbage.
**FIX:** add `docs/STATUS.md` to §3.2 as a **SERIAL em-main** file; land `Policies` row + `Sub-agents 12→14` in the same commit as W2; make W1①'s task explicitly depend on it. **VERIFY:** `sed -n '10,24p' docs/STATUS.md | cut -c1-40` shows both rows; detector output has no `Sub-agents` stale flags.
**M3. §3.9's `TOTAL FLAGS ≥ 46 VÀ có dòng permission-matrix/SKILL.md` is unsatisfiable as a CLOSE gate — W4's entire purpose is to make that line disappear.**
Measured baseline by running the script: **`TOTAL FLAGS: 42`** (§1.5's "42 flag baseline" ✓ confirmed; `grep -c memory-budget` = 0 and `grep -c ConvertFrom-Json` = 0 ✓ confirmed). §2.4(4) requires "(4) chạy lại ⇒ dòng **BIẾN MẤT**, TOTAL giảm đúng số đã vá". So at close time the §3.9 line is FALSE by design. A worker running the final checklist sees FAIL and is incentivised to revert the patch to go green.
**FIX:** split into two time-anchored gates — pre-W4: "TOTAL ≥ 46 **AND** line present, evidence = detector stdout captured to `runs/<id>/w4-precontrol.txt`, reviewer-witnessed"; post-W4: "line **absent** AND `TOTAL == 46k` where k = flags patched". The pre-gate must reference the saved artifact, never a re-run.
**M4. Sàn-3 ① drops the dual-accept clause → 5 guaranteed false positives; and the spec cites a blank line as its authority.**
`README.md:20` = **a blank line** (the code fence closes at :19). The real orphan definition is **`README.md:83` (L2)**, which reads: "orphan = folder có `run.md` mà KHÔNG có `<stage>-synthesis.md` … **run cũ S71 dual-accept `harvest/<stage>-synthesis.md`**" — mirrored at `session-start.md:97` and `README.md:123` (C8 "close-gate ACCEPT BOTH"). Spec §2.1 Sàn-3 ① states only "có `run.md` mà `*-synthesis.md` vắng/0-byte" — **no dual-accept**. Measured: a naive flat scan flags **13** folders; with dual-accept it flags **8** (the 5 `h10`/`h910` folders each have `harvest/<stage>-synthesis.md`, verified by `ls`). So the spec's headline "8/27 orphan, 7 tồn-đọng" is **correct** — but only under a rule the spec omits. Since Sàn-3's canonical text gets **re-authored** into `tiep.md` §0 (W3) and the worker does not Read `README.md`, the clause is lost → h10 ×3 + h910 ×2 storm — which W0.5's "close 7 folders" does **not** cover, because those 5 were never in the 7.
**FIX:** carry the dual-accept clause verbatim into Sàn-3 ①'s canonical text; fix the citation to `README.md:83`. **VERIFY:** run the new scan → exactly `{2026-07-15-S119-adap-6-broadcast}` (+ nothing else) after W0.5.
*(Side note, not spec error: `2026-07-14-S117-pe-approve-minmax-range` and `-pe-luyke-finalize` have **no `run.md` at all** → invisible to a `run.md`-anchored scan. C2 fragile-point, worth an INFORM bậc.)*
**M5. Sàn-1's tripwire breaks documented live paths and its wrapper list is wrong.**
`hmw.js` anchors verified exact: `checkpointApproved` :83-85 ✓, `VALID_ROLES` :22 (12 entries) ✓, STOP-HARD :104 ✓, `resolveModel` :43-51 ✓, H8 comment :32-42 ✓. But the proposed `if (A.taskList.length >= 3 && !(A.run?.dir && A.run?.name)) throw`:
- (a) **kills the documented legacy alias.** `hmw.js:116`: `const wave = (A.run && A.run.dir) ? A.run : ((A.wave && A.wave.dir) ? A.wave : null)` — `args.wave` is a supported entry point (`:19`, `:115`). A ≥3-task call using `wave:` throws even though RUN-TRACE is fully satisfied.
- (b) **contract mismatch:** the tripwire demands `.dir` **and** `.name`; hmw.js's own gate requires only `.dir`. A call with `run:{dir}` works today, throws after.
- (c) **wrapper list wrong.** Measured: `git grep -c "args\.run" -- .claude/commands/` → **exit 1, 0 hits**. `.claude/commands/` contains **no `hmw.md`** — the spec's third wrapper "`/hmw`" does not exist as a file. And **`fable-real.md` is absent from the list** although it launches ensembles ≥3 lanes (`fable-real.md:19` "Vai BẮT BUỘC ∈ roster 12"). First `/fable-real` ≥3-lane run after this lands → **throw** = "vỡ đường đang chạy", precisely what the spec's own §2.1 warns about.
**FIX:** tripwire condition → `const w = (A.run&&A.run.dir)?A.run:((A.wave&&A.wave.dir)?A.wave:null); if (A.taskList.length >= 3 && !w) throw` (mirror :116 exactly, drop the `.name` requirement or add `.name` to :116's contract in the same edit). Enumerate wrappers by measurement, not memory: `fable-clone.md`, `fable-real.md`, `ultra-on.md` (+ wherever `/hmw` is actually defined — locate it first). **VERIFY:** `git grep -c "args\.run" -- .claude/commands/` ≥ 3 **and** a ≥3-task `wave:`-style call still succeeds.
**M6. §2.4(5)(c)'s sweep grep is the wrong pattern and "5 chỗ" undercounts by ~3×.**
Grep tool (not Bash — per the trục's false-negative warning) for `12-agent|12 sub` → **~14 hits in 6 active files**: `session-start.md` :2/:66/:73/:74/:202 · `session-end.md` :2/:83 · `agents/README.md` :1/:3/:31/:35 · `workflows/README.md:36` · `ultra-on.md:24` · `fable-real.md:36`. The pattern **misses** the other live phrasing `roster 12`/`12 vai`/`10→12`: `fable-clone.md` :3/:18/:21/:34 · `fable-real.md` :3/:19 · `fable-real-runbook.md` :74/:94/:148/:191/:314/:444/:450/:501/:503/:509/:520 · `harness-11-engine.md` :332/:345 · `ACTIVE-MARKS.md:19`. It also misses an **already-stale** one: `hmw.js:9` meta.description says "fan-out **9-agent** roster". So the acceptance can return 0-hit while the drift is live = false-PASS. Note `ultra-on.md:24` literally heads a VALID_ROLES list — leave it at 12 and a lead reading it concludes `lead-view-auditor` is not a valid role → never spawns it → **H24 dead on arrival**.
**FIX:** sweep pattern `(12|9)[- ](agent|sub)|roster 12|12 vai|VALID_ROLES[^0-9]*12`; replace "5 chỗ" with the measured list; fix `hmw.js:9` in the same edit.
---
## m — minor
- **m1.** Spec cites "`.claude/WAL.md:15` `verify:`" twice (§2.1 push-guard (a), §3.8). The `grep -c '^wal:'` idiom is at **`:16`**; `:15` is `next:`. The idiom claim itself is **correct** (`grep -c` exits 1 on 0 matches). WAL is auto-rewritten, so pin by content, not line.
- **m2.** Spec's `1267 i/lf` → measured **1268**. `110ade2` added one file after the spec was written. Harmless in itself; it is the same staleness class as C2/C4 and a cheap tell.
- **m3.** Spec asserts `git rebase -i` "**BỊ CHẶN** trong harness". Empirically it **ran** in my Bash tool with `GIT_SEQUENCE_EDITOR` set (see C1 transcript). The premise is wrong; the chosen workaround is still fine, so this is cosmetic — but "blocked" shouldn't be sold as measured.
- **m4.** §2.4(1)(b) mandates FLAG format `^[A-Z0-9-]+ \| <class> \|`. The existing convention (`governance-detectors.ps1:24` doc + `:51` `Write-Flag`) is `[DETECTOR] {SEV,-4} | {file:line} | {desc} | resolve: {…}` — a `[DETECTOR] ` literal prefix. Two flag grammars in one governance surface = the vocab-fork class C3 already flags. Reuse the existing shape.
- **m5.** W0.5 alternative B ("scope scan `mtime > closeout cuối`") is **not durable**: the repo is `D:\Dropbox\…`; a Dropbox re-sync rewrites mtime → all 27 folders look new → total storm. Also "closeout cuối" is undefined as a measurable anchor. Use `git log -1 --format=%cI -- <folder>` (git-native, sync-proof); the reference point would be `3fde8af` @ `2026-07-14T16:29:55+07:00`.
- **m6.** W0.5 alternative A ("Đóng — thêm `*-synthesis.md`") invites fabrication: for 12-day-old runs (S112/S113/S114) the transcript is gone, so any "synthesis" written now is invented — poisoning the audit trail to green a gate. `README.md:100` already has the honest form: "**Đánh-dấu aborted** … verdict = `⚠️ ABORTED — <lý-do>`, ghi rõ phần nào hoàn-thành (recover qua git/disk/prod truth, **KHÔNG tin agent return-message**)". Say that explicitly, or the Goodhart path is the default.
---
## Trục-mandated answers
**Mọi chỗ spec có thể huỷ uncommitted work:**
1. **C1** — rebase-fixup → detached HEAD → hook commits onto it → `git rebase --abort` discards worktree + orphans the commit. **Proven**, highest severity.
2. **C2** — `reset --soft HEAD~K` with K too large → branch behind `origin/main` → non-FF push → `--force` temptation → rewrites `3fde8af` on the shared remote (Gitea runner + CI #388/#389 cite it).
3. **C5** — the unscoped `rm` + `git checkout --` sweep over **188** files, on a **stale "dirty = 0"** premise (C4). At-risk-and-live: `agent-memory/{implementer-backend,reviewer}/MEMORY.md`, `agent-memory/.mfe-state.json`, `docs/{STATUS,HANDOFF,CLAUDE}.md` — all 6 confirmed in the 188. *(Correction to a plausible worry: `.claude/WAL.md` is `i/lf w/lf` — **not** in the 188, so the checkout sweep does not reach it. The `renormalize .` staging in C4 does.)*
4. **Hook × index.lock** — `git rebase` or a mass `checkout` while `wal-flush.ps1` runs `git add`/`git commit` (fail-open, `2>$null`) on a **Dropbox-synced** `.git` → hook silently no-ops → the H22 durability guarantee is off exactly during the riskiest step. §3.8/N.7(e) name `index.lock` but only for the "dọn 57" scenario, not for W0.
**Rollback:** the spec has **no rollback/abort path for W0** — §3.8 lists risks and preventions only. **FIX:** W0 step 0 = `git tag w0-safepoint HEAD` + record `git rev-parse HEAD` + `git status --porcelain > runs/<id>/w0-pre.txt`; documented undo = `git rebase --abort` (if rebase state) → `git reset --mixed w0-safepoint` (unstage renormalize) → `git checkout w0-safepoint -- .gitattributes`; and a stated reflog escape (`git reflog | head`). Without this, C1's failure mode has no written exit.
**W1 disjointness:** file-level yes (`governance-detectors.ps1` / `scripts/agent-frontmatter-eol-check.ps1` / `scripts/wal-recovery-test.ps1` — all exist-or-new, no overlap). Semantically **no** — see M2 (STATUS.md coupling). Plus: the 3 lanes run as agents → each writes `agent-memory/*/MEMORY.md` → the Stop hook auto-commits that path each turn → wal: accumulation during W1 feeds C2/C3. And W1② ("PASS trên **12** agent thật") vs W2 (creates agents 1314): the acceptance's hardcoded 12 **excludes from validation the two files most likely to carry the defect** — brand-new agent `.md` written on Windows. Use a glob, not a count.
**W2 vs W1 on `hmw.js`:** no collision — W1 does not touch `hmw.js`; W2 owns it in "1 EDIT" per §3.2. That part holds.
**Push "cùng lượt":** your reading is right — guard+push in one tool-call means the hook has not fired between them. The gap is that the **squash** is not in that lượt (C3). §3.3 W6 says "push-guard **CÙNG LƯỢT** với push" and §2.1 acceptance (ii) says count+push same transcript-turn; **neither binds §5.0**. That is the deadlock.
---
## REFUTATION LOG — claims I attacked and could NOT break
1. **"188 file `i/lf w/crlf`, 131 = `Migrations/`"** — attacked with `git ls-files --eol` (authority, per your CR-count warning): **188 ✓, 131 ✓**. Also `i/none` **25** ✓, `i/-text` **19** ✓, `i/crlf` **0** ✓. Only `i/lf` differs (1268 vs 1267) — one commit of drift, not an error.
2. **"`git add --renormalize .` = diff RỖNG cho 188"** — I expected index churn. Temp-tree test: the `i/lf w/crlf` file produced **zero** cached diff (clean filter → identical blob). **The core claim holds.** Only the *dirty-file side effect* and the *acceptance metric* are broken (C4).
3. **W0.1 premise "`* text=auto eol=lf` beats `core.autocrlf=true`@system"** — `core.autocrlf` confirmed `true` at `C:/Program Files/Git/etc/gitconfig`; `check-attr` on `reviewer.md` today = `text: unspecified, eol: unspecified` (matches spec). Temp-tree: after `* text=auto eol=lf` + `rm` + `checkout` → `attr/text=auto eol=lf`, `w/lf`, `od -c` shows `\n`. **Holds.**
4. **W0.1's binary-class safety** — tried to find a file the `* text=auto` rule would corrupt. The 19 `i/-text` = 8+5 `.docx` / 6 `.png` / 1 `.xlsx` — all already auto-detected binary and all covered by the proposed list. The 25 `i/none` = 23 `.gitkeep` (empty) + 2 `.svg` (no EOL) — unaffected. `.bat`/`.cmd`: **0 tracked**. All 20+ `.ps1`: already `w/lf` → rule is a no-op. **W0.1 is safe; the ⚠️ it raises is genuinely N/A.**
5. **"8/27 orphan, 7 tồn-đọng (S112 ×4, S113, S114, pe-negative-quote) + 1 bay"** — my naive scan said 13, so I went hunting for an error. `ls */harvest/` proved all 5 `h10`/`h910` carry `harvest/<stage>-synthesis.md`, and `README.md:83` grants dual-accept. **The spec's number is right.** The defect is the *omitted clause + wrong citation* (M4), not the count.
6. **§1.5 positive-control numbers** — `grep -c "public const string" MenuKeys.cs` = **54** ✓ (skill says "~60"). Baseline `TOTAL FLAGS: 42` ✓ by running the script. `grep memory-budget|ConvertFrom-Json` in the .ps1 = **0/0** ✓. **All verified.**
7. **"Detector can't see `.claude/skills/`" — my hypothesis, REFUTED.** `Get-GovernanceMd:119` scans `docs` + `.claude` recursively with `-Filter *.md`; `SKILL.md` matches; the 6-path exclusion list (`governance-detectors.ps1`, `harness-11-engine.md`, `vocab-alias-map.md`, `broadcasts/inbox`, `broadcasts/outbox`, `.claude/workflows/runs`) does **not** include skills. The positive control **can** fire. Spec correct.
8. **"`Menu keys` has no canonical row" — my hypothesis, REFUTED.** `| Menu keys | **54** |` exists in STATUS.md's CURRENT-STATE table. Only `Policies` is missing (M2).
9. **AS-6 CI claims**`.gitea/workflows/*.yml:20-27` `paths-ignore` = `docs/**`, `**/*.md`, `.claude/skills/**`, `.claude/agent-memory/**`, `.claude/workflows/runs/**`, `.gitignore`, `scripts/**.md`. So `.gitattributes` **triggers** ✓, `scripts/*.ps1` **triggers** ✓, `.json` **triggers** ✓, `agent-memory/**` + `runs/**` **do not** ✓. **Spec §3.8 correct** (it merely omits that `hmw.js` also triggers, which is harmless).
10. **All `hmw.js` line anchors** (:22 / :83-85 / :104 / :43-51 / :32-42) and **all `governance-detectors.ps1` anchors** (:43-53 / :55 / :118-127 / :154-157) — **exact**. `session-start.md:51` ("chain rỗng" → "WAL sạch") ✓, `:54` ("CHỈ LÀ CON-TRỎ") ✓, `:97` (orphan scan) ✓, `:98` (skippable) ✓, `session-end.md:112-113` (§5.0 counts LIÊN-TỤC from HEAD, ":113 GIỮ NGUYÊN, chấp-nhận noise") ✓, `:145` (§6.4 note) ✓, `fable-clone.md:15` ("ENSEMBLE tier-2") ✓ with **0** `tier:'opus'` (GAP #6 real) ✓, `fable-clone.md:19` roster-12 = VALID_ROLES-12 ✓. **§1.2 L1's leak-channel diagnosis is independently confirmed** by the S118 shape: `e88e75d → b56659b(wal) → c2135ba → b7f7b56(wal) → 1491d29(wal) → c808b9a → 3fde8af` — sandwiched wal: rode to origin because §5.0 only counts trailing. The spec's headline analysis is sound; it is the **execution mechanics** that fail.
11. **`WAL.md:16` `grep -c` idiom "dính exit-1-khi-0"** — confirmed real (only the line number is off by one, m1).