Files
solution-erp/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md
2026-08-07 15:59:03 +07:00

244 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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``]` đó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).
---