From 8479ce3f05fb2509d069e05e9a5470ae085a2790 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Fri, 7 Aug 2026 15:59:03 +0700 Subject: [PATCH] wal: flush 20260807T1559 --- .../sub-w1a-mayd-octen.md | 243 ++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 .claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md diff --git a/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md new file mode 100644 index 0000000..b40462e --- /dev/null +++ b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md @@ -0,0 +1,243 @@ +# 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-.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-.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-.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-` 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` ⇒ **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`** (§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--` | 🟢 trung thực về phạm vi | + +> 🔴 **Bất biến ngầm chưa ai viết ra:** `.claude/agents/.md` **BaseName** phải bằng `.claude/agent-memory//` **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). + +---