# W1 — LANE a/2: KIỂM KÊ MÁY-ĐỌC-TÊN (G1-M2, đảo trước G1-M1)

- **Phiên:** S180 · **Vai:** investigator-codebase · **Ngày:** 2026-08-07
- **Chế độ:** READ-ONLY. Ngoài tệp này KHÔNG ghi/sửa tệp nào khác. **KHÔNG đổi tên. KHÔNG ký chuẩn.**
- **Ghi đĩa liên tục** (chống #53): mỗi đoạn máy xác minh xong append ngay.
- **Đầu vào:** `sub-n3-lane-a-gd01.md` §3.4 (11 đoạn máy · 9 nhóm / 21 họ) · `wave-plan-S180.md` W1 (`:40-53`) · thư gốc `broadcasts/inbox/ai_infra/2026-08-04-…-phu-luc-spec-pitfall.md` §GĐ-1.
- **Luật tự áp:** mọi 0-hit kèm control-dương · mọi tỉ lệ kèm mẫu số · `KHÔNG ĐO ĐƯỢC` hợp lệ, bịa thì không · **bác lane A thì nói thẳng**.

---

## §1 — XÁC MINH TỪNG ĐOẠN MÁY (mở mã, không tin danh sách)

### Bảng ký hiệu mức

- 🔴 **vỡ-câm** — đổi tên ⇒ máy vẫn chạy, vẫn in kết quả, nhưng **kết quả sai / mù** mà không ai biết. **Hạng nguy nhất.**
- 🟡 **vỡ-ồn** — đổi tên ⇒ throw / flag / dừng. Đau nhưng thấy được.
- 🟢 **tự thích nghi** — đọc cả tên cũ lẫn tên mới, hoặc đọc động từ nguồn sống.

---

### M-01 · `.claude/workflows/hmw.js:22-51` — `VALID_ROLES` (🟡 vỡ-ồn) — **XÁC NHẬN, sửa số dòng**

| Trường | Đo được |
|---|---|
| Đọc tên gì | **26 chuỗi cứng** tên vai kebab-case, mảng `const VALID_ROLES = [...]` |
| Số dòng thật | **`:22-51`** (lane A ghi `:22-55` — dòng `:51` là `]` đóng mảng; `:53+` đã sang khối `TIER2_EXPECTED_FULL_ID`). **Bác nhẹ số dòng, giữ nguyên nội dung.** |
| Máy chặn | `hmw.js:171-186` — `badRoles` filter + `throw new Error('… DỪNG HẲN (STOP-HARD) …')` |
| Vỡ thế nào | Đổi tên vai mà quên sửa mảng ⇒ **throw ngay tại chỗ**, fan-out chết, thông báo in đủ danh sách hợp lệ |
| Sắc thái quan trọng | `:180` — `x.raw != null && x.raw !== ''` ⇒ **role rỗng/null KHÔNG throw** (backward-compat H6.2 role-less). Nghĩa là STOP-HARD chỉ bắt **tên SAI**, không bắt **tên THIẾU** |
| Mức | 🟡 **vỡ-ồn** |

> 🔴 **Ràng buộc cho lane b:** đây là **máy chặn duy nhất trong cả kiểm kê** thật sự dừng-hẳn. Nhưng nó chặn theo **danh sách liệt kê**, không theo **hình dạng tên**. Chuẩn nào quy định "tên vai phải theo dạng X" sẽ **không được máy này thi hành** — nó chỉ thi hành "tên vai phải nằm trong 26 giá trị này".

---

### M-02 · `scripts/governance-detectors.ps1:1102` — bộ lọc tệp con H25 (🔴 **vỡ-câm**) — XÁC NHẬN

| Trường | Đo được |
|---|---|
| Đọc tên gì | `$_.Name -match '^(sub-.+\|.+-return)\.md$'` — quét **đệ quy** toàn `.claude\workflows\runs` |
| Vỡ thế nào | Tệp con đặt tên ngoài **hai họ** này ⇒ **biến mất khỏi tầm quét**, vai bị coi là chưa chạy, detector vẫn in bình thường |
| Bằng chứng đây là bệnh THẬT, không phải giả thuyết | Chú thích ngay trên đầu (`:1093-1099`) tự khai ca S159: bộ lọc cũ là glob `'sub-*.md'` ⇒ **3 lượt trả của bộ ba `harness-*-return.md` VÔ HÌNH**; đo trên bookend S159: *"9 spawns ran, the glob saw 6 — it dropped exactly the 3 most expensive lanes"* |
| Mức | 🔴 **vỡ-câm** — đã vỡ câm một lần thật, đã vá, **và bản vá vẫn là một danh sách hai họ** |

---

### M-03 · `scripts/governance-detectors.ps1:1104-1107` — suy vai từ tên tệp, 3 nấc tham lam (🔴 **vỡ-câm**) — XÁC NHẬN, sửa số dòng

```powershell
if     ($s.Name -match '^sub-(.+)-\d+\.md$') { $cand = $Matches[1] }
elseif ($s.Name -match '^sub-(.+)\.md$')     { $cand = $Matches[1] }
elseif ($s.Name -match '^(.+)-return\.md$')  { $cand = $Matches[1] }
```

| Trường | Đo được |
|---|---|
| Số dòng thật | **`:1104-1107`** (lane A ghi `:1105-1106` — thiếu nấc 3 `-return`). **Bác nhẹ.** |
| Đọc tên gì | Suy **tên vai** từ **tên tệp**, ba nấc, nấc sau nuốt nấc trước |
| Vỡ thế nào | Suy sai ⇒ rơi vào `$unmapped` ⇒ **LIỆT KÊ, KHÔNG cờ** (`:1109` — `if ($rosterSet.ContainsKey($cand)) {...} else { $unmapped[$cand] = $true }`). Vai thật đã chạy nhưng tên tệp lệch ⇒ vai bị coi là **chưa chạy**, và chỗ lệch chỉ được **liệt** chứ không **cờ** |
| Mức | 🔴 **vỡ-câm** — thiết kế CỐ Ý không-đoán-tên (S122 "đo NỘI DUNG không đo TÊN"), nhưng hệ quả là **lệch tên = im lặng theo thiết kế** |

> 🔴 Đây là chỗ **luật S122 và TC-11 kéo ngược nhau**: S122 cấm đoán tên (đúng), nên detector chọn im lặng khi tên lạ. Chuẩn lane b nếu đòi "tên lệch phải kêu" thì **phải sửa chính chỗ này**, và sửa nó là đi ngược một luật đã có. **Phải khai xung đột, đừng vá âm thầm.**

---

### M-04 · `scripts/governance-detectors.ps1:1762` — regex tên vai H24 (🔴 **vỡ-câm**) — **BÁC SỐ DÒNG của lane A**

| Trường | Đo được |
|---|---|
| Lane A ghi | `:1679` |
| Sự thật | **`:1679` là DÒNG CHÚ THÍCH**, nguyên văn: `#  (a) FLAG-khuon: every H24 auditor sub-file (name carries lead-stale\|lead-gap\|ring2-audit)`. **Mã sống nằm ở `:1762`**: `$roleNameRx = '(?i)(lead-stale\|lead-gap\|ring2-audit)'`, dùng ở `:1774` `if ($sm.Name -match $roleNameRx)` |
| Đọc tên gì | Tên tệp phải **chứa** một trong ba chuỗi vai |
| Vỡ thế nào | Đổi tên ba vai đó ⇒ luật FLAG-khuôn **ngừng áp**, biến `$c11Measured` không bao giờ bật ⇒ khối in ra **"đã đo, 0 cờ"** trong khi thật ra **chưa đo gì** |
| Mức | 🔴 **vỡ-câm** |

---

### M-05 · `scripts/governance-detectors.ps1:1771` — bộ lọc tệp con lần 2 (🔴 **vỡ-câm**) — **BỔ SUNG (lane A không liệt riêng)**

`:1771` lặp lại y nguyên `'^(sub-.+|.+-return)\.md$'` trong vòng C11. **Cùng regex, hai chỗ, không dùng chung hằng số** ⇒ vá một chỗ quên chỗ kia là kịch bản có thật (S159 đã phải vá **cả hai**, chú thích `:1769-1770` xác nhận: *"mirror of the C11(b) filter fix above"*). Mức 🔴 **vỡ-câm** + **nợ kỹ thuật: 1 luật / 2 bản sao**.

---

### M-06 · `scripts/governance-detectors.ps1:1716` — **BÁC HẲN: KHÔNG PHẢI ĐOẠN MÁY**

| Trường | Đo được |
|---|---|
| Lane A ghi | *"`:1716` đọc `sub-h24-audit-*.md`"*, xếp cùng hạng máy với `:1679` |
| Sự thật | `:1716` là **CHÚ THÍCH**, nguyên văn: `# this calendar day but wrote a COMBINED sub-h24-audit-*.md that matches NONE of the`. Nó **mô tả một điểm mù đã biết** (tệp S148 khớp KHÔNG mẫu nào ⇒ *"scanned-but-inert"*), chứ **không đọc** tên gì |
| Hệ quả cho lane b | Chuỗi `sub-h24-audit` **không phải** một tên mà máy phụ thuộc ⇒ **không cần đưa vào chuẩn như tên phải giữ**. Ngược lại nó là **bằng chứng có sẵn** rằng bộ lọc M-04 đã từng bỏ sót một tệp thật |
| Mức | — (loại khỏi kiểm kê máy) |

> 🔴 **Đây là 1 trong 2 mục tôi bác hẳn.** Giữ nó trong danh sách "máy đọc tên" sẽ khiến lane b đi bảo tồn một cái tên mà **không máy nào đọc**, đồng thời làm phồng mẫu số.

---

### M-07 · `scripts/governance-detectors.ps1:1050` (+`:1044`) — đường dẫn `docs/changelog/sessions/` (🔴 **vỡ-câm**) — XÁC NHẬN, bổ sung 1 dòng

| Trường | Đo được |
|---|---|
| Đọc tên gì | `:1044` `git log --diff-filter=A --name-only … '--' 'docs/changelog/sessions/'` (**đường dẫn cứng trong lệnh git**) · `:1050` chuỗi báo lỗi cùng đường dẫn |
| Vỡ thế nào | Dời chỗ nhật ký phiên ⇒ `$newSess.Count -eq 0` **luôn đúng** ⇒ cờ MED **bắn sai mỗi phiên** (dương-giả), chứ không phải im lặng |
| Sửa mức so lane A | Lane A xếp *"mất một chân"* (hàm ý im). Đo thật: nó **bắn cờ sai liên tục** ⇒ đúng ra là 🟡 **vỡ-ồn**… **NHƯNG** cờ này nằm trong khối `closeout-ritual` in ra 4 sổ, người đọc rất dễ đọc thành "phiên này quên viết session-log". ⇒ **giữ 🔴 vỡ-câm về NGHĨA**: máy ồn ào, nhưng **nội dung thông điệp sai lệch** — nó tố người dùng thay vì tố chính nó |
| Mức | 🔴 **vỡ-câm-về-nghĩa** (cờ nổ đúng chỗ, lời buộc tội sai đối tượng) |
| Bổ sung | `:1882` cùng bệnh: `Write-Host '  [skip] docs/changelog/sessions not found'` — nhánh **skip im lặng** ở một detector khác. Dời thư mục ⇒ detector đó **skip sạch**, in DarkGray, ai lướt qua đọc thành "không có gì bất thường" |

---

### M-08 · `scripts/governance-detectors.ps1:1624`+`:1639`+`:1648`+`:1649` — C10 logic-session (🔴 **vỡ-câm** một phần, 🟡 phần còn lại) — **XÁC NHẬN NỘI DUNG, BÁC SỐ DÒNG**

| Trường | Đo được |
|---|---|
| Lane A ghi | `:1605,1633` |
| Sự thật | `:1605` và `:1611-1612` là **chú thích**; `:1632-1633`/`:1642`/`:1652-1653`/`:1663` là **chuỗi thông điệp**. **Mã sống**: `:1624` `$sessRoot = Join-Path $RepoRoot '.claude\sessions'` · `:1639` `if ($d.Name -notmatch '^session-(\d+)$')` · `:1648` `$ctx = Join-Path $d.FullName ("_context-s-{0}.md" -f $n)` · `:1649` `-Filter 'pause-*.md'` · `:1660` `Test-Path (Join-Path $topDir '_end')` + `'closed.md'` |
| Đọc tên gì | **5 tên khác nhau trong một khối**: thư mục `.claude\sessions` · hình dạng `^session-\d+$` · tệp `_context-s-<N>.md` · họ cũ `pause-*.md` · dấu đóng `_end` **hoặc** `closed.md` |
| Vỡ thế nào — nhánh ỒN | Đổi hình dạng thư mục phiên ⇒ `:1639` **cờ INFORM ngay**, kèm câu *"tooling scans this pattern"*. 🟡 |
| Vỡ thế nào — nhánh CÂM | `:1622` `if (-not (Test-Path $sessRoot)) { … '[skip] .claude/sessions not found' }` ⇒ **đổi tên thư mục gốc = detector skip trọn khối**, `$c10Measured` giữ `$false`, **0 cờ**. 🔴 |
| Vỡ thế nào — nhánh CÂM 2 | `:1660` dấu đóng phiên chấp **hai** tên (`_end` ⟂ `closed.md`) — đổi sang tên thứ ba ⇒ phiên đã đóng bị đọc là **đang mở** ⇒ cờ *"BUOC 0.8 bị bỏ"* **không bao giờ bắn**. 🔴 |
| Mức | 🔴 **vỡ-câm** (2 nhánh) + 🟡 (1 nhánh) |
| 🟢 Điểm sáng | `:1648`+`:1649` **đọc được cả hai họ** (`_context-s-<N>.md` hub-form ⟂ `pause-*.md` cũ) ⇒ đây là **tiền lệ đúng sách G1-M3 thứ hai**, ngoài `session_ctx.py` mà lane A đã nêu |

---

### M-09 · `scripts/session_ctx.py` — 7 vùng đọc tên (🟢 phần lõi · 🔴 phần rìa) — XÁC NHẬN, mở rộng

| Dòng | Đọc tên gì | Vỡ thế nào | Mức |
|---|---|---|---|
| `:110` | `Path(session_dir).glob('_snapshot-*')` | Đổi tiền tố ⇒ `snaps` rỗng ⇒ `last_snapshot_mtime` trả `None` ⇒ mốc `--since` **tụt về nhánh dự phòng** mà không báo | 🔴 câm |
| `:116` | `.claude` / `"WAL.md"` cứng | Đổi tên WAL ⇒ `runid` = `None`, dòng tường thuật mất mã lượt chạy, không throw | 🔴 câm |
| `:133` | `sessions_root / f"session-{session_n}"` | Đổi hình dạng thư mục ⇒ đường dẫn không tồn tại | 🟡 |
| `:180` | `session_dir.rglob('*')` | **KHÔNG lọc theo tên** — điểm 🟢: quét trọn thư mục nên tên mới tự vào | 🟢 |
| `:349-358` | `_count_pause_on_disk`: `glob('_pause-*.md')` **+** `glob('pause-*.md')` | **Đọc CẢ HAI họ** (hub-form S148+ ⟂ legacy ≤S147). Chú thích `:351-353` khai vì sao không đếm trùng: *"The glob `pause-*` does NOT match `_pause-1.md` (leading underscore)"* | 🟢 **tiền lệ đúng sách G1-M3** |
| `:530` `:548` `:549` | `_context-s-%d.md` · `_mind-s-%d.md` · `_end` | Thiếu tệp ⇒ `SKIP`/`CO` có báo | 🟡 |
| `:594` | `session_dir.glob('*mind*')` — quét **rộng** rồi liệt ứng viên khi tệp chuẩn vắng | 🟢 **mẫu tốt thứ hai**: không thấy tên chuẩn thì **in ra những tên đang có**, thay vì im lặng |

> 🔴 **Điểm giòn nhất, chính chú thích tự khai** (`:53-56`): cơ chế dò `ts:` **không lọc theo tên tệp** ⇒ nếu `_mind-s-<N>.md` lỡ chứa một dòng `ts:` thì nó **bị đọc thành mốc thời gian của marker**. Nghĩa là **quy ước NỘI DUNG** đang gánh việc mà **quy ước TÊN** đáng lẽ phải gánh. Chuẩn lane b cần một mục riêng cho lớp này.

---

### M-10 · `scripts/session-scaffold.ps1` ⟂ `scripts/session_scaffold.py` — cặp sinh đôi (🟡) — **XÁC NHẬN CÓ FORK, BÁC HỆ QUẢ**

| Trường | Đo được |
|---|---|
| Fork có thật? | **CÓ** — `session-scaffold.ps1` (6785 B, 2026-07-24 23:53) ⟂ `session_scaffold.py` (6092 B, 2026-07-24 17:44). **Hai quy ước tên tệp cho MỘT khái niệm** (kebab ⟂ snake) |
| Lane A khai hệ quả | *"sửa một bản quên bản kia là **đẻ ra họ thứ ba**"* |
| Đo thật | **Hai bản HIỆN SINH RA TÊN GIỐNG HỆT NHAU**: `.ps1:116-117` → `session-$targetN` + `_context-s-$targetN.md`; `.py:105-106` → `f"session-{n}"` + `f"_context-s-{n}.md"`. `.py:13` còn tự khai **`path HARD-PIN … KHONG configurable`** |
| ⇒ | **Bác một phần:** đây **chưa phải** fork tên đầu ra, mới là **fork tên chính nó**. "Đang đẻ họ thứ ba" là **giả thuyết tương lai**, không phải trạng thái hiện có — nói vậy là **thổi phồng** |
| Nguy cơ thật, đo được | Hai bản **cùng hard-pin, không dùng chung nguồn**. Đổi hình dạng `session-<N>` phải sửa **cả hai**, cộng `governance-detectors.ps1:1639`, cộng `session_ctx.py:133` ⇒ **4 chỗ, 0 nguồn chung** |
| Mức | 🟡 **vỡ-ồn** (lệch nhau ⇒ COLLISION exit 4 ở `.ps1:137`, thấy được) |

---

### M-11 · `.claude/hooks/wal-flush.ps1` — hook tự bị neo bằng tên (🔴 **vỡ-câm**) — XÁC NHẬN, **nặng hơn lane A khai**

| Trường | Đo được |
|---|---|
| Neo ở đâu | `.claude/settings.json:9` — `"command": "powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1"` |
| Đổi tên tệp ⇒ | PowerShell không tìm thấy tệp ⇒ **việc (commit WAL) DỪNG HẲN**. Hook tự khai `Fail-open MOI nhanh: exit 0 ke ca loi` — nhưng `exit 0` đó **nằm TRONG tệp**; tệp không chạy thì không ai `exit 0` hộ. Mã thoát thật của nhánh này **KHÔNG ĐO ĐƯỢC** trong lượt read-only |
| 🔴 **Neo thứ hai — SỐ DÒNG bị neo** | `wal-flush.ps1:16-17` nguyên văn: *"`!! GIU $paths O DUNG DONG 13`: nhieu doc trich-dan "wal-flush.ps1:13" (tiep.md :23, spec, memory). Chen dong TREN day = **lao-hoa het cac trich-dan do**"* ⇒ tệp bị neo **cả bằng TÊN lẫn bằng SỐ DÒNG**, và số dòng chỉ được canh bằng **một dòng chú thích** |
| Nội dung dòng 13 | `$paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/")` — **4 đường dẫn cứng**. Đổi tên bất kỳ thư mục nào ⇒ `git add` trượt im lặng (`2>$null`), `$cand` không nhận path ⇒ **thư mục đó thôi được commit tự động, 0 báo** |
| Mức | 🔴 **vỡ-câm** ×2 (tên tệp · 4 đường dẫn nội dung) + 1 neo-số-dòng chỉ canh bằng chữ |

> 🔴 **Ràng buộc cho lane b:** chuẩn phải có mục riêng cho **"tên bị neo NGOÀI kho mã"** (`settings.json` là cấu hình runtime — không ai grep nó khi đổi tên script), và phải **cấm hẳn** lối *"giữ nguyên số dòng"* — quy ước không máy nào thi hành được.

---

## §1b — NĂM KỊCH BẢN LANE A KHAI CHƯA ĐO — nay đã đo từng dòng

### M-12 · `scripts/closeout-sentinel.ps1` (247 dòng) — 🔴 **vỡ-câm**, ca nặng

| Dòng | Đọc tên gì | Vỡ thế nào |
|---|---|---|
| `:118` | `$COUNTER = '.claude/governance/.session-counter.json'` | Đổi ⇒ tín hiệu phụ `WARN … not touched` (non-gating) — ồn nhẹ |
| `:119` | `$MEMROOT = '.claude/agent-memory'` | Đổi ⇒ vị-từ-1 (delta thư mục vai) **mất trọn nguồn** |
| `:160` | `$runsDir = … '.claude/workflows/runs'` | Đổi ⇒ nhánh `else`: `$auditSource = 'auto-detect: no session token in subject / runs/ missing'` |
| **`:163`** | **`$h24Marker = '(?i)h24|lead-(view|omission|stale|gap)|sub-lead'`** khớp **TÊN TỆP** trong thư mục lượt chạy | 🔴 Đổi tên vai/tệp H24 ⇒ `$auditRanResolved` giữ `$false`; theo D3 (`:45-47`) phiên bị **SKIP chứ không FLAG** — nguyên văn *"genuinely skipped the audit are SKIPped, not false-flagged"* |
| `:168` | `$c.Name -match '(?i)h24'` khớp **TÊN THƯ MỤC** lượt chạy | 🔴 cùng hậu quả |
| `:165` | `$_.Name -match $sessRe` — lọc thư mục lượt chạy theo **mã phiên trong tên** | 🔴 Thư mục lượt chạy không mang `S<n>` ⇒ **vô hình với sentinel** |

> 🔴 Đúng hình dạng *"vắng-mặt trông giống ổn"*: đổi tên ⇒ máy chuyển **SKIP**, và SKIP đọc **y hệt** "phiên này không cần kiểm". Cộng `:165`: **18/88 thư mục lượt chạy hiện KHÔNG mang `S<n>`** (§2 nhóm 3) ⇒ vị-từ này **đã đang mù một phần kho hôm nay**, không cần ai đổi tên gì.

### M-13 · `scripts/mfe-eval.ps1` (334 dòng) — 🔴 **vỡ-câm**

| Dòng | Đọc tên gì | Vỡ thế nào |
|---|---|---|
| `:44` | `.claude\agent-memory\memory-budget.json` | vắng ⇒ hỏng sớm (ồn) |
| `:52-54` | `.claude\governance\ACTIVE-MARKS.md` · `docs\governance\error-ledger.md` · `docs\gotchas.md` | 3 **tên sổ** cứng. Đổi ⇒ bộ phân tích đọc 0 dòng ⇒ **điểm vẫn tính, mẫu số về 0** |
| **`:243`** | `Get-ChildItem '.claude\agents\*.md' \| Where Name -ne 'README.md'` ⇒ `$role = $rf.BaseName` | Roster **suy từ tên tệp** |
| **`:264`** | `".claude\agent-memory\$role\MEMORY.md"` — **ghép tên vai vào đường dẫn** | 🔴 Tên thư mục nhật ký lệch tên tệp vai ⇒ `:265-267` in `N/A (no persistent diary -> ephemeral/unspawned)` rồi `continue`. **Vai bị LOẠI khỏi phép đo, và lời giải thích in ra là một lời nói dối có thiện chí** |
| `:302` | Tự khai `[SUB-WORKFLOW] N/A by design … hmw.js sub-<role>-<i>` | 🟢 trung thực về phạm vi |

> 🔴 **Bất biến ngầm chưa ai viết ra:** `.claude/agents/<role>.md` **BaseName** phải bằng `.claude/agent-memory/<role>/` **tên thư mục**. Hai chỗ, không nguồn chung, không máy kiểm. Lệch ⇒ im ở M-13; ở `governance-detectors.ps1:1109` thì rơi `$unmapped` (liệt, không cờ).

### M-14 · `scripts/memory-selfimprove-audit.ps1` (346 dòng) — 🔴 **vỡ-câm** + **BỆNH ĐÃ VÁ NƠI KHÁC CÒN SỐNG Ở ĐÂY**

| Dòng | Đọc tên gì | Vỡ thế nào |
|---|---|---|
| `:122-124` | `.claude\agents` · `.claude\agent-memory` · `.claude\workflows\hmw.js` | 3 neo cứng |
| `:189` | `Join-Path $agentsDir ("{0}.md" -f $role)` | ghép tên vai → tệp |
| `:211` | `'scripts\governance-detectors.ps1'` | **script neo tên script khác** |
| `:230-231` | `docs\rules.md` · `docs\governance\harness-11-engine.md` | 2 tên sổ cứng |
| `:252` `:257` `:258` | `MEMORY.md` · `archive\_INDEX.md` · `*.gist.md` | 3 tên artefact bộ nhớ |
| 🔴 **`:298`** | **`-Filter 'sub-*.md'`** | **CHÍNH XÁC bộ lọc mà `governance-detectors.ps1` ĐÃ VÁ @S159** (`:1093-1099` khai ca thật: glob này bỏ sót 3 lượt trả `*-return.md`, *"dropped exactly the 3 most expensive lanes"*). **Bản vá KHÔNG nhân sang đây.** Hệ quả: `:300-301` in `"latest run … has no sub-*.md (return-delta-only mode) - proxy N/A"` ⇒ **N/A đọc thành "không áp dụng", không đọc thành "máy mù"** |
| `:299` | `-Filter '*-synthesis.md'` | họ tên thứ hai, cùng lớp |

> 🔴 **PHÁT HIỆN NẶNG NHẤT §1b.** Một lỗi tên đã được chẩn đoán, **đặt tên** (`C11(b) filter`), vá và ghi chú kỹ ở tệp A — **tệp B cùng kho, cùng đọc cùng thư mục, vẫn dùng bản lỗi.** Đúng lớp *"được-chỉ-1-chỗ ⇒ grep cùng-lớp"*, tái diễn, đo được, chưa ai bắt.

### M-15 · `scripts/crystallized-backfill.ps1` (254 dòng) — 🟡 **vỡ-ồn** (có nhãn `MISSING`), số dẫn xuất sai câm

| Dòng | Đọc tên gì | Vỡ thế nào |
|---|---|---|
| `:54-55` | `.claude\agent-memory` + `memory-budget.json` | vắng ⇒ `Write-Error` + `exit 1` — 🟡 ồn thật |
| `:73-78` | `$defaultHotload` = **4 tên sổ cứng** (`docs/STATUS.md` · `docs/HANDOFF.md` · `.claude/governance/ACTIVE-MARKS.md` · `docs/changelog/migration-todos.md`) | dùng khi cấu hình vắng |
| `:106-114` | `Test-Path $full` → `state='ok'` / `state='MISSING'` | Đổi tên sổ ⇒ **in `MISSING` từng dòng** (🟡) **NHƯNG** `$totalBytes` không cộng ⇒ `$measuredHeadroom = $leadCap - $tokHigh` **to hơn thực tế** ⇒ kết luận "còn nhiều chỗ trống" **sai câm** |
| Mức | 🟡 ở lớp hiển thị · 🔴 ở lớp **con số dẫn xuất**. Ghi 🟡 **có caveat** vì nhãn `MISSING` **có in ra** |

### M-16 · `scripts/applied-eval-nokey.ps1` (362 dòng) — **BÁC HẲN: KHÔNG ĐỌC TÊN NÀO**

| Trường | Đo được |
|---|---|
| Phép đo | `grep -cE "Join-Path\|Get-ChildItem\|Test-Path\|-Filter\|Resolve-Path\|Get-Content\|Set-Content\|Out-File\|\[IO\.\|ConvertFrom-Json" scripts/applied-eval-nokey.ps1` = **0** |
| **Control-dương (cùng thước)** | Cùng mẫu trên `scripts/mfe-eval.ps1` = **14** ⇒ mẫu chạy được, 0 là 0 thật |
| 4 hit tên tệp duy nhất | `:103` `:104` `:105` `:361` — **chuỗi hướng-dẫn-chạy** in ra màn hình, tức nó nhắc **tên của chính nó** |
| ⇒ | **Bác hẳn.** Script **không có bất kỳ thao tác tệp nào**; là khối tự-kiểm + văn bản. Đưa vào kiểm kê máy-đọc-tên là **phồng mẫu số**. Dây duy nhất: **tên của chính nó** bị nhắc trong 4 chuỗi in + trong tài liệu |
| Mức | — (loại khỏi kiểm kê) |

---

## §1c — TỔNG KIỂM KÊ

| Kết luận | Số |
|---|---|
| Đoạn máy **xác minh có đọc tên** | **14** (M-01…M-05, M-07…M-15) |
| **BÁC HẲN** (không phải máy đọc tên) | **2** — M-06 `detectors:1716` (chú thích) · M-16 `applied-eval-nokey.ps1` (0 file-IO) |
| 🔴 **vỡ-câm** | **10** — M-02 · M-03 · M-04 · M-05 · M-07 · M-08 · M-09(rìa) · M-11 · M-12 · M-13 · M-14 → *(đếm theo ĐOẠN MÁY, M-09 tính 1 dù có cả nhánh 🟢)* = **11 đoạn có ít nhất 1 nhánh câm**; **10** đoạn câm-thuần |
| 🟡 **vỡ-ồn** | **3** — M-01 (STOP-HARD) · M-10 (COLLISION) · M-15 (MISSING) |
| 🟢 **tự thích nghi** | **0 đoạn máy trọn vẹn**; chỉ **3 NHÁNH** 🟢 nằm bên trong đoạn khác: `session_ctx.py:349-358` (đọc-2-họ) · `session_ctx.py:594` (in ứng viên khi vắng) · `detectors:1648-1649` (đọc-2-họ) |

🔴 **Con số phải nói ra: 0/14 đoạn máy tự thích nghi được với tên mới.** Ba nhánh 🟢 đều là **xử lý tay cho một cặp cụ thể** (`_pause` ⟂ `pause`), không phải cơ chế tổng quát. Chuẩn lane b **không được giả định** có bất kỳ máy nào sẽ tự nuốt tên mới.

**Sửa số so lane A:** lane A khai **11 đoạn**; đo lại ra **14 xác minh + 2 bác**. Chênh vì: lane A gộp 5 kịch bản chưa đo vào **một dòng số 10**, và tính 2 dòng chú thích (`:1679` `:1716`) thành 2 đoạn máy. Cộng thêm 1 đoạn lane A không liệt (`detectors:1771`, bản sao thứ hai của bộ lọc).

---

## §2 — BẢN ĐỒ 9 NHÓM TÊN × HỌ (đo lại, **mọi con số kèm MẪU SỐ**)

🔴 **Luật đơn-vị tự áp** (phiên này đã 6 ca bẫy): mỗi dòng ghi rõ đang đếm **thư mục** hay **tệp** hay **mục trong mảng**. Ba thứ khác nhau.

### N1 · Tên vai — **1 họ · SẠCH TUYỆT ĐỐI** ✅ (xác nhận lane A)

| Nguồn | Đơn vị | Số |
|---|---|---|
| `.claude/agents/*.md` bỏ `README.md` | **tệp** | **26** |
| `.claude/agent-memory/*/` | **thư mục** | **26** |
| `hmw.js:22-51` `VALID_ROLES` | **phần tử mảng** | **26** |

Đối chiếu **3 chiều bằng `comm`**: `only-in-agents` = ∅ · `only-in-memdir` = ∅ · `only-in-hmw` = ∅ · `agents-not-in-hmw` = ∅. Hình dạng: `grep -vE '^[a-z0-9]+(-[a-z0-9]+)*$'` = **0** ⇒ 26/26 kebab thuần. **Lane A ĐÚNG.**

### N2 · Tên lệnh — **1 họ · SẠCH** (mẫu số **19 tệp**)

19/19 kebab-case. `tiep.md` là **ngoại lệ NGÔN NGỮ** (tiếng Việt) chứ không phải ngoại lệ **hình dạng** ⇒ 1 họ hình dạng, không phải 2. Danh sách: `adap-{apply,report,request}` · `check-email` · `fable-{clone,real}` · `pause` · `send-email` · `session-{end,start}` · `sleep-recovery-memory-l2` · `snapshot` · `tiep` · `ultra-{on,off}` · `user-mark-{active,active-high,medium,disable}`.

### N3 · Thư mục lượt chạy — **2 họ** (mẫu số **88 thư mục**) ✅ xác nhận lane A y hệt

- khớp `^YYYY-MM-DD-S<n>` = **70/88 (79,5%)**
- không khớp = **18/88 (20,5%)**, tất cả họ `YYYY-MM-DD-<chủ-đề>`: `2026-06-18-h10-{implement,invest,review}` · `2026-06-18-h11-{audit,checklist-verify,doublecheck,implement,review}` · `2026-06-18-h910-{curate,finalize}` · `2026-06-18-harness-{audit-invest,fix-implement,fix-review}` · `2026-06-18-mig54-pe-review` · `2026-07-11-h21-mtv3-adopt` · `2026-07-12-h22-wal-adopt` · `2026-07-13-pe-negative-quote` · `2026-07-13-presence-not-age-adopt`

🔴 **Hệ quả chưa ai nói:** `closeout-sentinel.ps1:165` lọc thư mục lượt chạy bằng **mã phiên trong tên** ⇒ **18/88 thư mục này VÔ HÌNH với sentinel ngay hôm nay**, không cần ai đổi tên gì.

### N4 · Tệp con trong lượt chạy — **5 họ, không phải ≥3** (BÁC lane A) — mẫu số **719 tệp .md**

🔴 **Mẫu số phải khai 2 lần** (bẫy-6 đo-giữa-chừng): tính cả thư mục S180 đang ghi = **743**; **loại nó ra = 719**. Dưới đây dùng **719** (ổn định).

| Họ | Số | % / 719 |
|---|---|---|
| `sub-*.md` | **395** | 54,9% |
| `*-synthesis.md` | **90** | 12,5% |
| `run.md` | **84** | 11,7% |
| `*-return.md` | **38** | 5,3% |
| **ngoài cả 4** | **112** | **15,6%** |

Mẫu 12 tên ngoài-họ (không nén): `C14-disposition-per-khoan.md` · `C15-resume-model-override.md` · `C4-design-3-vai-kiem.md` · `C6-cua-loi-hua-may.md` · `W0-evidence-15-07-2026.md` · `W4-detector-fire-15-07-2026.md` · `_lienfile-notes-batchB.md` · `b3-b4-owner-gated-proposals.md` · `cicd-monitor--2026-05-q2.gist.draft.md` (+3 chị em `q3/q4/runs`).

**Bác lane A:** lane A khai *"≥3 họ · 706 tệp: 402 `sub-`, 219 ngoài 2 họ"*. Đo lại: **5 họ đếm được**, và con số "219 ngoài 2 họ" **gộp lẫn** `-return` + `-synthesis` (là 2 họ **máy CÓ đọc**) với 112 tệp **không họ nào**. Gộp như vậy làm mất đúng con số quan trọng nhất: **112 tệp (15,6%) máy KHÔNG nhìn thấy dưới bất kỳ mẫu nào**.

### N5 · Nhật ký phiên — **5 họ** ✅ xác nhận lane A trọn vẹn — mẫu số **159 tệp**

| Họ | Số | % |
|---|---|---|
| (a) `YYYY-MM-DD-HHMM-S<n>-` | **19** | 11,9% |
| (b) `YYYY-MM-DD-S<n>-` | **78** | **49,1%** ← đông nhất |
| (c) `YYYY-MM-DD-s<n>-` (chữ `s` **thường**) | **13** | 8,2% |
| (d) `YYYY-MM-DD-HHMM-<slug>` không số phiên | **45** | 28,3% |
| (e) `YYYY-MM-DD-<slug>` trần | **4** | 2,5% |

Tổng 19+78+13+45+4 = **159** ✓ khớp mẫu số.

🔴 **Ca sống bẫy-1, đo lại và XÁC NHẬN:** `CLAUDE.md:151` quy định `docs/changelog/sessions/YYYY-MM-DD-HHMM-{topic}.md`. Đĩa khớp `^\d{4}-\d{2}-\d{2}-\d{4}-` = **64/159 = 40,3%**. **Quy ước thành văn DUY NHẤT trong kho đang sai với 59,7% đĩa, và 0 máy chặn.** Họ đông nhất (b, 78 tệp = 49,1%) **không khớp cách đọc nào**.

### N6 · Tệp mốc phiên — **2 TẦNG, phải tách** (BÁC "2 họ" của lane A)

**Tầng 1 — thư mục phiên: 1 họ, SẠCH 12/12** (mẫu số **12 thư mục**). `^session-\d+$` khớp **12/12 = 100%**.

**Tầng 2 — tệp bên trong: 7 họ tiền-tố + 2 tệp lẻ** (mẫu số **90 tệp**):

| Tiền tố | Số |
|---|---|
| `_tiep-*` | 24 |
| `_pause-*` | 22 |
| `_snapshot-*` | 14 |
| `_context-s-*` | 11 |
| `_end` | 10 |
| `_mind-s-*` | 6 |
| `pause-*` (legacy) | **1** |
| lẻ: `closed.md` · `resume-S146-20260722T2334.md` | 2 |

**Bác lane A:** lane A khai nhóm này *"2 họ"* — đó là đếm **đúng một cặp fork** (`_pause` ⟂ `pause`). Đo thật: **7 họ tiền-tố đang sống** và **HAI cặp fork**, không phải một:
- cặp 1: `_pause-*` (22) ⟂ `pause-*` (1) — máy `session_ctx.py:357-358` **đọc cả hai** 🟢
- 🔴 **cặp 2 lane A BỎ SÓT:** `_end` (10) ⟂ `closed.md` (1) — dấu-đóng-phiên **hai tên**, `governance-detectors.ps1:1660` chấp cả hai bằng `-or`. Máy **tha thứ** ⇒ fork **sống mãi**. Đây là fork **chưa ai ghi vào bảng dịch**.

### N7 · Kịch bản — **BÁC "3 họ"; thật là 2 quy ước + 1 trục tiền-tố** — mẫu số **53 mục** trong `scripts/`

| Đo | Số |
|---|---|
| kebab-case | 46 |
| snake_case | **6** (= `__pycache__` + **5 tệp**) |
| tiền tố phiên/kế hoạch `^(s\d+-\|plan-)` | 16 |
| đuôi | `.ps1` 32 · `.sql` 14 · `.py` **5** · `.md` 1 · `__pycache__` 1 |

🔴 **Bác lane A (điểm này quan trọng cho lane b):** 5 tên snake_case là `parse_forms` · `parse_workflow` · `session_ctx` · `session_scaffold` · `stamp_verify` — **CHÍNH XÁC 5/5 là tệp `.py`**. Đây **KHÔNG phải trôi tên**, đây là **PEP-8, quy ước bắt buộc của ngôn ngữ**, và nó **kỷ luật 100%** (5/5, 0 ngoại lệ hai chiều: 0 tệp `.py` kebab, 0 tệp `.ps1` snake). Gọi nó là "họ thứ hai đang trôi" là **đếm nhầm kỷ luật thành hỗn loạn**.

⇒ Kịch bản thật sự có: **1 quy ước cho ngôn ngữ shell/SQL (kebab)** + **1 quy ước cho Python (snake)**, cả hai sạch; cộng **1 trục ĐỘC LẬP** là tiền tố `s<n>-`/`plan-` (16/53 = 30,2%) — trục này mới là chỗ chưa có luật. **Fork thật duy nhất** = cặp `session-scaffold.ps1` ⟂ `session_scaffold.py` (M-10), và nó **hợp lệ theo luật ngôn ngữ** nhưng **trùng khái niệm**.

### N8 · Tên sổ — **2 họ** ✅ xác nhận — mẫu số **15 mục** `docs/governance/`

- HOA-GẠCH = **5/15 (33,3%)**: `BROADCAST-OUT-SOLUTION-ERP-2026-05-29-INFRA-RETRO.md` · `BROADCAST-OUT-SOLUTION-ERP-2026-05-29.md` · `BROADCAST-OUT-SOLUTION-ERP-2026-06-01.md` · `RAG-AUDIT-RESPONSE-2026-05-29.md` · `README.md`
- kebab thường = **10/15 (66,7%)**

🔸 Nhưng **4/5 tên HOA là thư đã gửi mang ngày tháng** ⇒ chúng là **vật lịch sử**, không phải sổ đang bảo trì. `README.md` HOA là **quy ước phổ quát**. ⇒ Nếu tách "sổ đang sống" khỏi "vật lịch sử", nhóm này **gần như 1 họ**. Lane A đúng về **số họ**, nhưng cách đọc "2 họ đang trôi" hơi nặng tay.

### N9 · Nhãn lớp kiểm — **2 họ nấc-1 · 8 họ nấc-2** (BÁC "4 họ con") — mẫu số **12 lớp**

Nguồn sống: `.claude/agent-memory/memory-budget.json` → `lead_self_audit.flag_classes` = **12**.
- Nấc-1: `view-*` = **6** · `gap-*` = **6**
- Nấc-2 (đo bằng máy, 2 token đầu): `view-stale` 4 · `view-residual` 1 · `view-claim` 1 · `gap-carry` 2 · `gap-owner` 1 · `gap-decision` 1 · `gap-underfill` 1 · `gap-incident` 1 ⇒ **8 họ**, không phải 4.

🔴 **Bác lane A + chỉ ra lớp lỗi:** lane A đếm *"2 họ chính + 4 họ con"* bằng cách **bung `view-*` ra 3 nhánh nhưng để nguyên `gap-*` thành 1**. Đó là **đếm bất đối xứng trên hai nhánh anh em** — đúng phép thử chống-Goodhart *"áp luật cho nhánh anh em"*. Bung cân xứng ra **8**.

🔴 **Xác nhận số trôi:** `hmw.js:33` nguyên văn `(11 class: 5 view-* + 6 gap-*)`. Thật = **12 = 6 view + 6 gap**. **Sai cả tổng lẫn thành phần.** Control: `grep -n "class" hmw.js | grep -iE "[0-9]+ class"` = đúng **1 dòng** (`:33`) ⇒ chỉ 1 chỗ phải vá.

### §2-tổng

| # | Nhóm | Họ | Mẫu số | Sạch? |
|---|---|---|---|---|
| 1 | Tên vai | **1** | 26 tệp / 26 tm / 26 mảng | ✅ 100% |
| 2 | Tên lệnh | **1** | 19 tệp | ✅ 100% |
| 3 | Thư mục lượt chạy | **2** | 88 thư mục | ❌ 79,5% |
| 4 | Tệp con lượt chạy | **5** | 719 tệp | ❌ 84,4% trong 4 họ máy-đọc |
| 5 | Nhật ký phiên | **5** | 159 tệp | ❌ 40,3% theo `CLAUDE.md` |
| 6 | Mốc phiên — thư mục | **1** | 12 thư mục | ✅ 100% |
| 6b | Mốc phiên — tệp | **7** (2 cặp fork) | 90 tệp | ❌ |
| 7 | Kịch bản | **2 quy ước + 1 trục tiền-tố** | 53 mục | ✅ theo ngôn ngữ / ❌ trục tiền-tố 30,2% |
| 8 | Tên sổ | **2** | 15 mục | ⚠️ 4/5 lệch là vật lịch sử |
| 9 | Nhãn lớp kiểm | **2 nấc-1 / 8 nấc-2** | 12 lớp | ✅ nấc-1 / ❌ nấc-2 |

**Tổng: 9 nhóm · 28 họ ở nấc-1** (1+1+2+5+5+1+7+3+2+... đếm theo bảng: 1+1+2+5+5+1+7+3+2+2 = **29**, trừ 1 vì nhóm 6 tách 2 tầng đã tính riêng ⇒ **28**). Lane A khai **21 họ**; chênh vì lane A đếm nhóm 6 = 2 (thật 1 thư mục + 7 tệp) và nhóm 4 = 3 (thật 5).

---

## §3 — HAI CÂU QUYẾT ĐỊNH HÌNH DẠNG CHUẨN LANE B

### 3.1 — Giả thuyết *"sạch VÌ có máy STOP-HARD"*: **ĐỨNG Ở LÕI, NHƯNG PHÁT BIỂU SAI Ở VẾ "STOP-HARD"**

Kiểm **hai chiều** như lane yêu cầu.

**Chiều 1 — có nhóm nào CÓ máy mà VẪN lệch?** → **CÓ, hai ca, và cả hai đều dạy một điều khác nhau:**

| Nhóm | Máy | Máy làm gì | Kết quả |
|---|---|---|---|
| N4 tệp con lượt chạy | `detectors:1102/1104-1107` + `:1771` | **ĐỌC nhưng KHÔNG ÉP** — tên lạ rơi `$unmapped`, `:1109` **liệt, không cờ** | ❌ 112/719 ngoài mọi họ |
| N6b `_end` ⟂ `closed.md` | `detectors:1660` | **CHẤP CẢ HAI** bằng `-or` | ❌ fork sống vô hạn |

⇒ **Máy chỉ ĐỌC, hoặc máy THA THỨ, thì tên vẫn trôi.** Có máy là chưa đủ; máy phải **từ chối**.

**Chiều 2 — có nhóm nào SẠCH mà KHÔNG có máy STOP-HARD?** → **CÓ, hai ca — đây là chỗ giả thuyết của lane A gãy:**

| Nhóm | Sạch | Máy | Loại máy |
|---|---|---|---|
| N6 thư mục phiên | **12/12 = 100%** | `detectors:1639` `^session-(\d+)$` | **CHỈ INFORM, exit-0, không chặn gì** |
| N2 tên lệnh | **19/19 = 100%** | (không có script kiểm) | **vòng phản hồi NGƯỜI**: đổi tên = lệnh biến mất khỏi tay owner ngay lượt sau |
| N9 nấc-1 | **12/12 mang `view-`/`gap-`** | `detectors:1761` `$flagTagRx` ép **tiền tố** | flag, không throw |

⇒ **STOP-HARD KHÔNG phải điều kiện cần.** `detectors:1639` chỉ in một dòng INFORM và nhóm đó vẫn sạch tuyệt đối.

**PHÁT BIỂU LẠI, ĐO ĐƯỢC — và đây mới là luận cứ thiết kế cho lane b:**

> **Một nhóm tên sạch CHÍNH XÁC TỚI ĐỘ SÂU mà máy của nó KIỂM — không sâu hơn một nấc.**

Bốn ca hậu thuẫn, không ca nào chống:
- N1: máy ép **thành viên** (throw) ⇒ sạch ở **thành viên** (26/26/26).
- N6: máy ép **hình dạng** `^session-\d+$` (INFORM) ⇒ sạch ở **hình dạng** (12/12) — **nhưng tệp BÊN TRONG thư mục đó thì 7 họ**, vì máy không kiểm xuống tầng tệp.
- N9: máy ép **tiền tố** `view-|gap-` ⇒ sạch ở **tiền tố** (12/12) — **nhưng nấc-2 thì 8 họ**, vì máy không kiểm xuống nấc-2.
- N5: **0 máy** ⇒ **40,3%**, dù quy ước đã thành văn ở `CLAUDE.md:151` nhiều tháng.

**Hệ luận trực tiếp cho chuẩn lane b — ba câu, không thương lượng:**
1. **Chuẩn không kèm máy = tờ giấy.** `CLAUDE.md:151` là bằng chứng đắt nhất: quy ước viết rõ, sống nhiều tháng, khớp **64/159 = 40,3%**, **không ai biết**.
2. **Máy không cần STOP-HARD; máy cần TỪ CHỐI.** INFORM đủ (ca N6). Nhưng *đọc-rồi-liệt* (N4) và *chấp-cả-hai* (N6b) thì **không đủ**.
3. **Chuẩn viết tới nấc nào thì chỉ sạch tới nấc đó.** Muốn `_pause-<i>.md` đơn trị thì phải viết **và kiểm** tới tầng tệp, không dừng ở tầng thư mục.

### 3.2 — BẪY-4: số thật sau miễn trừ

**Đo trên tập `.md` của vùng bộ-máy** (`docs/` + `.claude/` + `broadcasts/`):

| | Số | % |
|---|---|---|
| **TỔNG `.md`** | **1.545** | 100% |
| `.claude/workflows/runs/**` | 745 | 48,2% |
| `docs/changelog/sessions/**` | 159 | 10,3% |
| `broadcasts/**` | 118 | 7,6% |
| `docs/governance/adap-reports/**` | 103 | 6,7% |
| `docs/_archive/**` | 6 | 0,4% |
| **TỔNG 5 vùng đóng băng** | **1.131** | **73,2%** |
| ⇒ **CÒN LẠI trong tập đo** | **414** | **26,8%** |
| *(chỉ 3 vùng lane A nêu)* | *1.022 miễn ⇒ còn 523* | *33,9%* |

🔴 **Và đây là con số quyết định — LỆCH nằm ở đâu:**

| Lệch đo được | Số | Trong vùng đóng băng? |
|---|---|---|
| Nhật ký phiên không khớp `CLAUDE.md` (159−64) | **95** | ✅ ĐÓNG BĂNG |
| Thư mục lượt chạy không khớp (88−70) | **18** | ✅ ĐÓNG BĂNG |
| Tệp con lượt chạy ngoài 4 họ | **112** | ✅ ĐÓNG BĂNG |
| Sổ governance HOA-GẠCH | 5 | ❌ sống |
| Kịch bản mang tiền tố phiên | 16 | ❌ sống |
| `pause-*` legacy | 1 | ❌ sống |
| `closed.md` | 1 | ❌ sống |
| **TỔNG** | **248** | **225 (90,7%) NẰM TRONG VÙNG MIỄN TRỪ** |

⇒ **LANE A ĐÚNG, VÀ ĐÚNG NẶNG HƠN LANE A TƯỞNG.** Một máy soi tên áp-về-phía-trước, quét `.md`, tôn trọng 5 vùng đóng băng: **73,2% kho biến mất khỏi mẫu số** và **90,7% chỗ lệch đã biết cũng biến mất cùng**. Nó sẽ in `0 hit` ngày đầu, và **số 0 đó không chứng minh gì**.

🟢 **NHƯNG có đường thoát, và nó nằm ở việc CHỌN TẬP ĐO — không phải ở việc nới miễn trừ.** Nếu máy soi quét **tên VẬT-BỘ-MÁY** thay vì quét `.md`:

| Tập | Đơn vị | Số | Miễn trừ |
|---|---|---|---|
| `.claude/agents/*.md` | tệp | 27 | 0 |
| `.claude/agent-memory/*/` | thư mục | 26 | 0 |
| `.claude/commands/*` | tệp | 19 | 0 |
| `scripts/*` | mục | 53 | 0 |
| `.claude/sessions/**` tệp | tệp | 90 | 0 |
| `docs/governance/*` (gốc) | mục | 15 | 0 |
| `.claude/hooks/*` | tệp | 1 | 0 |
| **TỔNG** | | **231** | **0** |

**231 tên, 0 miễn trừ, và 23 chỗ lệch thật vẫn nằm nguyên trong đó** (5 sổ HOA + 16 tiền-tố-phiên + `pause-*` + `closed.md`). ⇒ Máy soi **có răng ngay ngày đầu**, mẫu số **231** in ra được, và `0 hit` sẽ là `0 hit` **có nghĩa**.

---

## §4 — RÀNG BUỘC CHO LANE B (chuẩn phải thoả gì để KHÔNG rớt đoạn máy nào)

**R1 — Chuẩn phải liệt 14 đoạn máy này thành PHỤ LỤC BẮT BUỘC, và mỗi mục đổi tên phải trỏ ngược tới đoạn máy nào đọc nó.** Không có phụ lục thì TC-11 *"không được rớt bất kỳ đoạn máy nào"* là lời hứa không kiểm được.

**R2 — Cấm ký bất kỳ mục nào chạm 4 tên sau khi chưa mở đủ số chỗ:** `session-<N>` = **4 chỗ** (`detectors:1639` · `session_ctx.py:133` · `session-scaffold.ps1:116` · `session_scaffold.py:105`) · `sub-*` = **3 chỗ** (`detectors:1102` · `detectors:1771` · `memory-selfimprove-audit.ps1:298`) · tên vai = **3 chỗ** (`hmw.js:22-51` · `agents/*.md` · `agent-memory/*/`) · `.claude/agent-memory` = **5 chỗ**.

**R3 — Chuẩn PHẢI có mục cho "tên neo NGOÀI kho mã":** `.claude/settings.json:9` neo `wal-flush.ps1` bằng tên. Không ai grep JSON cấu hình khi đổi tên script.

**R4 — Chuẩn PHẢI cấm hẳn quy ước "giữ nguyên số dòng"** (`wal-flush.ps1:16-17` tự khai đang dùng). Không máy nào thi hành được nó.

**R5 — Chuẩn PHẢI viết tới ĐÚNG NẤC muốn sạch** (§3.1). Viết tới thư mục thì tệp bên trong vẫn trôi; viết tới tiền tố thì nấc-2 vẫn trôi.

**R6 — Máy soi phải TỪ CHỐI, không được LIỆT-RỒI-THÔI.** Ba lối làm câm hiện có, cấm tái dụng: `$unmapped` liệt-không-cờ (`detectors:1109`) · `-or` chấp-hai-tên (`detectors:1660`) · `[skip] … not found` (`detectors:1622` · `:1882` · `mfe-eval:265`).

**R7 — Máy soi phải quét tập 231 tên vật-bộ-máy, KHÔNG quét 1.545 `.md`** (§3.2). Và **luôn in mẫu số** cạnh mọi con số hit.

**R8 — Tập giá trị hợp lệ của nhật ký phiên phải chứa CẢ 5 HỌ ĐANG SỐNG** (19+78+13+45+4), nếu không bài kiểm sẽ **xanh hôm nay, đỏ vào ngày quy ước có hiệu lực** (bẫy-1). Đồng thời `CLAUDE.md:151` phải được sửa hoặc khai là **chỉ áp về sau** — hiện nó đang **sai với 59,7% đĩa**.

**R9 — Chuẩn phải MIỄN TRỪ TƯỜNG MINH quy ước theo ngôn ngữ** (`*.py` = snake). 5/5 tệp Python hiện đúng PEP-8; một chuẩn "mọi tên kebab" sẽ **cờ 5 tệp đang đúng** = dương-giả ngày đầu.

**R10 — Hai xung đột phải KHAI, KHÔNG được vá âm thầm:**
- `detectors:1104-1109` cố ý **không đoán tên** (luật S122 *"đo NỘI DUNG không đo TÊN"*). Chuẩn đòi "tên lệch phải kêu" là **đi ngược luật đang có**. ⇒ khai xung đột, để owner chọn.
- Siết máy sang lái-mã-thoát (`G1-B7`) đụng doctrine exit-0 — **VƯỢT-KHUNG**, đã treo ở P-question.

**R11 — Ba VÁ ĐI KÈM, đo được, không thuộc phần "ký chuẩn":**
1. 🔴 `memory-selfimprove-audit.ps1:298` `-Filter 'sub-*.md'` → mirror bản vá S159 (`^(sub-.+|.+-return)\.md$`). **Bệnh đã vá ở tệp A, còn sống ở tệp B.**
2. `hmw.js:33` `(11 class: 5 view-* + 6 gap-*)` → câu trỏ khoá `lead_self_audit.flag_classes` (thật **12 = 6+6**). Control trước-vá = **1 hit**.
3. Bất biến ngầm `agents/<role>.md`.BaseName ≡ `agent-memory/<role>/` — **2 chỗ, 0 nguồn chung, 0 máy kiểm**; lệch ⇒ im lặng ở `mfe-eval:264` và `$unmapped` ở `detectors:1109`.

---

## §5 — KHAI THẲNG NHỮNG CHỖ CHƯA ĐO

1. **Mã thoát thật khi `wal-flush.ps1` bị đổi tên** — không chạy được hook trong lượt read-only. Cần: đổi tên trên **cây tạm**, chạy hook, đọc `$LASTEXITCODE`.
2. **`.claude/settings.json`** — tôi chỉ grep khối `hooks`; **chưa đọc toàn tệp**, có thể còn neo tên khác. Cần: `cat .claude/settings.json`.
3. **Tôi chỉ quét `scripts/` + `.claude/hooks/` + `hmw.js`.** Chưa quét `.claude/commands/*.md` (19 tệp) và `.claude/agents/*.md` (26 tệp) xem chúng neo tên gì — persona/lệnh **có thể neo đường dẫn** và chúng là "máy" theo nghĩa vận hành. Cần: `grep -nE "sub-|_context|session-|runs/|agent-memory" .claude/commands/*.md .claude/agents/*.md`.
4. **Con số 248 "lệch"** là **cận dưới** — nó chỉ đếm lệch **theo mẫu tôi kiểm**; tên lệch theo trục tôi chưa nghĩ ra thì không có trong đó.
5. **N4 mẫu số 719 loại thư mục S180** — nhưng các thư mục lượt chạy khác vẫn có thể đang được ghi bởi lane khác cùng phiên. Con số là **ảnh chụp lúc 2026-08-07**, không phải hằng số.

---

**END sub-w1a-mayd-octen — VERDICT: 14 đoạn máy xác minh (11 vỡ-câm · 3 vỡ-ồn · 0 tự-thích-nghi) · 2 BÁC HẲN · 9 nhóm tên / 28 họ · giả-thuyết "sạch VÌ STOP-HARD" ĐỔ Ở VẾ STOP-HARD, ĐỨNG Ở VẾ CÓ-MÁY-TỪ-CHỐI · bẫy-4 XÁC NHẬN NẶNG (73,2% kho + 90,7% lệch bị miễn trừ) với 1 đường thoát đo được (tập 231 tên, 0 miễn trừ) · 11 ràng buộc cho lane b.**

