244 lines
24 KiB
Markdown
244 lines
24 KiB
Markdown
# 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).
|
||
|
||
---
|