# sub-tooling-auditor — S151 @session-start (RE-REPORT trả nợ skip)

**Vai:** tooling-auditor (H1) · INFORM-only · propose-only · em-main = single-writer.
**Bối cảnh:** lead skip vai này @S151 trên tiền-đề "delta≈0"; `sub-lead-gap-S151.md` FLAG-3 bắt → re-spawn trả nợ.
**Baseline so-sánh:** last-report = **S150 @end** (closeout commit `398d343`, 2026-07-25 sáng).
**HEAD lúc audit:** `7049dbf` (wal: flush 20260725T1739) · working tree: chỉ `M .claude/governance/.session-counter.json`.
**Ghi-đĩa-TRONG-lúc-làm:** append từng mặt ngay khi xong (anti-#53).

---

## ③ PLUGIN — PASS (0-delta) [đo xong 1st]

Nguồn: `C:\Users\pqhuy\.claude\settings.json` (user-global — authority ③; project `.claude/settings.json` chỉ có `autoMemoryDirectory` + `hooks.Stop` wal-flush, KHÔNG override plugin/model).

| Đo | Giá trị | vs S150 |
|---|---|---|
| registered `enabledPlugins` | **18** | = |
| enabled | **15** | = |
| disabled | **3** (`pr-review-toolkit` · `code-modernization` · `hookify`, đều `@claude-plugins-official`) | = |
| marketplace `~/.claude/plugins/marketplaces/claude-plugins-official/plugins` | **37** | = (S143 bắt 35→37; nay ổn định 37) |
| `effortLevel` | `xhigh` | = |

Nấc báo đúng: installed(37 marketplace) → registered/enabled(15) → assigned(0 mới) → used(n/a). KHÔNG conflate.

🔴 **NGOẠI LỆ 1 KEY — xem F-1 mặt ④:** `settings.json` `model` = **`claude-opus-5[1m]`** (S143 ghi nhận `claude-opus-4-8[1m]`). Đây là **flip lead-model THỨ HAI chưa ghi sổ** — chi tiết + bằng chứng ở mặt ④ (đây là drift DOC, không phải drift plugin).

---

## ② VAI-TRÒ SUB-AGENT — PASS ở 4-nguồn ĐẾM, **DRIFT ở 4 site PROSE** [đo xong 2nd]

### (a) 4-nguồn ĐẾM PHẦN TỬ — khớp tuyệt đối 20=20=20=20 ✅
| Nguồn | Cách đo | Kết quả |
|---|---|---|
| Đĩa registry | `ls .claude/agents/*.md` = 21 − README | **20** |
| `hmw.js` VALID_ROLES `:22-41` | đếm phần-tử (KHÔNG grep số) | **20** |
| `STATUS.md:452` cột giữa (canonical B1) | `**20**` | **20** |
| `.claude/agent-memory/` | 21 entry − `memory-budget.json` | **20**, và **20/20 đều CÓ `MEMORY.md`** |

Frontmatter tier: **20/20 `model: opus`@:5 + `effort: max`@:6** (đo từng file, 0 ngoại-lệ). `git diff 398d343..HEAD -- .claude/agents/` = **RỖNG** ⇒ 0 thay-đổi vai kể từ closeout S150. Rename 5 vai @S149 sạch bề-mặt hiện-hành (đã chốt S150).

### (b) 🔴 F-2 [HIGH — MỚI, máy chưa thấy phần này] `agents/README.md:249` — stale-count KÈM **lời-biện-hộ TỰ-NIÊM-PHONG**
Dòng khai `**17 folder**` + liệt 17 tên. Máy đã bắt con-số. **Cái máy CHƯA thấy** là mệnh-đề ngay sau nó:

> *"3 vai round-KIỂM S145 `ring1-audit`/`ring2-audit`/`ring4-audit` = vai #18/#19/#20 — folder tạo khi CHẠY lần đầu; `ring1-audit/` đã có dir RỖNG từ spawn-probe S145 (git KHÔNG track empty-dir) ⇒ **committed-state = 17 folder-có-MEMORY.md, khớp**. `ls` thô có thể ra 18 dir gồm dir rỗng."*

**Bị bác bỏ bằng đĩa — cả 3 vai ĐÃ có MEMORY.md THẬT và ĐÃ COMMIT:**
```
ring1-audit/MEMORY.md  4.481B      ring2-audit/MEMORY.md  9.840B      ring4-audit/MEMORY.md  1.047B
git ls-files → cả 3 đường dẫn ĐỀU tracked (không phải dir rỗng, không phải untracked)
```
⇒ "17 folder-có-MEMORY.md" sai ở **chính cái nấc nó tự chọn để tự-bào-chữa** (committed-state). Số đúng = **20**.

🔴 **Vì sao nguy hơn drift-số thường:** đây là **stale TỰ-NIÊM-PHONG** — người soi sau đọc :249 sẽ thấy một lập-luận mạch-lạc **giải-thích tại sao 17 mới đúng** và **18 là ảo-giác của `ls` thô** ⇒ tự tay gỡ cờ, không sửa. Drift-số trần thì lần soi nào cũng bắt lại được; drift **có lời-biện-hộ** thì miễn-dịch với mọi lượt soi cho tới khi ai đó chịu `stat` từng file. Vá phải **XÓA lập-luận**, không chỉ đổi 17→20.

### (c) 🔴 F-3 [MED — MỚI] `STATUS.md:452` **false-citation** `README:227` → dòng **TRỐNG**
STATUS:452 neo nấc-trung-thực của 3 vai ring vào *"registry Agent-tool KHÔNG hot-reload (`README:227`)"*.
- `awk NR==227 .claude/agents/README.md` → **dòng trống** (giữa `:226` bullet `commit-commands` và `:228` `---`).
- Câu thật nằm ở **`README:240`**: *"🔴 Registry = ảnh-chụp lúc khởi phiên, KHÔNG hot-reload ⇒ vai mới cần RESTART + spawn-probe THẬT"*. Lệch **13 dòng**.
- Cùng LỚP với ca tôi bắt @S125 (`fable-real-runbook:227`/`:563` cite `agents/*.md:5`). Neo-dòng vào file SỐNG (README bị chèn/xoá liên-tục) mà không neo bằng chuỗi ⇒ mọi cite dạng `file:line` xuyên-file đều lão-hoá âm-thầm.

### (d) F-4 [MED — MỚI] `.claude/workflows/hmw.js:46` + `:65` — **"17/17" trong CHÍNH file có VALID_ROLES đúng 20**
```
:46  ... SE nay pin ALIAS `opus` (KHÔNG full-id) ở 17/17 frontmatter.
:65  // MỌI sub-agent (17/17) → frontmatter `model: opus` + `effort: max` = worker-tier gán-cứng
```
Đĩa = **20/20**. Cả 2 câu là **PRESCRIPTIVE** (khai chính-sách đang hiệu-lực), KHÔNG dated, KHÔNG frozen ⇒ drift phải vá. `:65` nặng hơn: nó là **câu định-nghĩa chính-sách worker-tier-pin**, mở đầu bằng "MỌI sub-agent" rồi đóng ngoặc một con số thiếu 3 ⇒ đọc ra "3 vai nằm NGOÀI pin" (thực tế cả 3 ring ĐỀU pinned).

🔴 **Hai lớp trớ-trêu đáng ghi:**
1. `:65` cách đúng **3 dòng** dưới là `:68` — *"KHÔNG hardcode model hiện-hành ở comment — **lesson S108: comment stale làm 2/4 worker đọc sai runtime**"*. File tự mang bài-học chống-comment-stale và tự vi-phạm một thể-hiện anh-em của nó.
2. Wave S145 (17→20) **CÓ đụng hmw.js** — `VALID_ROLES:39-40` được thêm `ring1/ring2/ring4` đầy đủ. Sửa **danh-sách** mà bỏ **con-số prose cùng file**. Đây là **ẢNH-PHẢN-CHIẾU của bài S143** (`README:28`): S143 = grep-theo-SỐ sót site liệt-TÊN → luật mới "đếm phần-tử". S151 = đếm-phần-tử đúng nhưng **sót site mang SỐ**. ⇒ Acceptance đủ răng phải là **CẢ HAI CHIỀU**: đếm phần-tử mọi enum **VÀ** grep mọi con-số roster trong cùng file/cùng lớp.
3. Tự-soi: báo-cáo S150 của CHÍNH tôi kết *"ROSTER PASS 20=20=20 (VALID_ROLES đếm-phần-tử)"* — đúng phương-pháp mới, và **vẫn sót 2 dòng prose trong đúng file tôi vừa đếm**. Lỗi của tôi, không phải của máy.

### (e) Không phải drift — CỐ Ý giữ (biết chỗ KHÔNG sửa, luật S143)
- `agents/README:5` + `:27` (*"Roster THẬT"*): đếm phần-tử = **20/20 ĐÚNG**, và cả 2 tuân B1 (liệt NHÓM/TÊN, KHÔNG chép tổng-số). Đây là 2 site S143 từng thủng — nay lành.
- `agents/README:225` VALID_ROLES enum: đếm = **20 ĐÚNG** + trỏ canonical, KHÔNG chép số. ✅
- `spawn-model-audit.ps1:41` "hub form pins FULL-ID 17/17" = số của **repo HUB**, SE đọc gián-tiếp ⇒ **ngoài lãnh-địa tôi**, KHÔNG flag.
- `ACTIVE-MARKS.md:19` "∈ roster 12" = **bản ĐÃ KÝ**, anh chốt S122 giữ nguyên + chú-thích. Allowlist tường-minh, KHÔNG phải sót.
- Mọi "roster 10/11/12/14/17" trong `docs/governance/adap-reports/*` + `changelog/sessions/*` = **frozen-in-time**, sửa = giả-mạo hồ-sơ.

### (f) F-5 [LOW — MỚI] `spawn-model-audit.ps1:35-36` — vế bao-phủ tụt hậu 2 đợt
> *"...after S124 re-pinned all 14 agents THEN-EXISTING (ALIAS pin; **roster is 17 as of S141** — this measurement was taken when N was 14 and **was NOT re-run for the 3 new ones**)"*

Có gắn mốc "as of S141" ⇒ vế *"roster is 17"* đọc được như snapshot. Nhưng mệnh-đề **"3 new ones"** là **lỗ-hổng-bao-phủ SỐNG** (phép đo H23 phủ 14/N vai): N nay = **20** ⇒ chưa-phủ = **6**, không phải 3. Đề-xuất: giữ nguyên phần dated, đổi đúng vế bao-phủ (hoặc bỏ số, trỏ canonical).

---

## ① SKILL — PASS [đo xong 3rd]

| Lớp | Đếm đĩa | vs S150 |
|---|---|---|
| project `.claude/skills/` | **6** (contract-workflow · dependency-audit-erp · ef-core-migration · form-engine · iis-deploy-runbook · permission-matrix) | = |
| standalone `~/.claude/skills/` | **23** | = |
| command-file `.claude/commands/*.md` | **19** | = |

- `git diff --stat 398d343..HEAD -- .claude/skills/ .claude/commands/` = **RỖNG** ⇒ 0 thêm/đổi/mất kể từ closeout S150.
- 6/6 skill CÓ `SKILL.md`, `name:` frontmatter **khớp tên thư-mục** 6/6 (0 rename-drift).
- Map vai: skill-matrix trong `agents/README` còn nguyên (agents/ diff rỗng) ⇒ 0 skill mồ-côi mới.
- `skills/README.md:20` (row ef-core) đã là **B1-pointer đúng chuẩn** — *"(mới nhất → row cuối bảng skill; **số → `docs/STATUS.md`**)"* ⇒ KHÔNG phải drift.

🔸 **KHAI THẬT giới-hạn phép đo:** detector báo LOW *"skills cluster stale numbers (contract-workflow + ef-core-migration)"*. Tôi **KHÔNG mở thân 2 file `SKILL.md`** đó trong lượt này (lead cắt phạm-vi mở-rộng) ⇒ LOW đó **CHƯA được tôi xác-minh độc-lập**, không tính vào finding của tôi và cũng **không được đọc là đã-clear**.

**NEW-ALLOC:** 0 skill mới · 0 plugin mới ⇒ **0 hành-động phân-bổ**. Marketplace 37 = y hệt S143/S150, không ứng-viên mới.

---

## ④ DOCS-FRESHNESS — PASS_WITH_FLAGS [đo xong 4th]

### 🔴 F-6 [MED — MỚI, và nó BÁC một finding của MÁY] detector C1 `#111` = **DƯƠNG-GIẢ**, cơ-chế toạc ra
`machine-baseline.md:15` báo MED MỚI: *"`…S149-S150-closeout-bookend-first-run.md:85` broken-gotcha-ref cite **#111** nhưng max gotcha = **83**"*.

**Đĩa nói ngược — 3 bằng-chứng độc-lập:**
1. `grep -n "#111" <file>` → **ZERO hit** trong TOÀN file. Không tồn tại literal `#111` nào.
2. `grep -on "111" <file>` → đúng **1 lần duy nhất**, tại `:85`, nằm trong chuỗi **`gotchas 111.616B`** = **kích-thước byte** của `docs/gotchas.md` (111.616 B) trong dòng in %-hot-feed của `crystallized-backfill`.
3. Ref `#N` THẬT duy nhất trên `:85` là **`#26`** (≤83 ⇒ hợp-lệ).

**Cơ-chế FP — chính detector tự khai** (`scripts/governance-detectors.ps1:354`):

    # Match "gotcha #N", "gotcha N", and bare "#N" tokens.

Nhánh **"gotcha N" (KHÔNG dấu #)** nuốt `gotchas 111.616B` → tách N=111 → 111 > 83 → FLAG. Regex sinh ra để bắt ca người viết quên `#`, nhưng nó không phân-biệt **ref** với **số đo đứng cạnh chữ "gotchas"**.

🔴 **Vì sao phải nói toạc, không im:** `sub-lead-gap-S151.md:125` dùng **đúng finding này** làm bằng-chứng đầu-bảng để bác tiền-đề "delta≈0" của lead. **Kết-luận của vai đó vẫn ĐÚNG** (delta≠0 — tôi vừa tìm 7 finding thật), nhưng **cây-chống chính của nó là dương-giả** ⇒ không đính-chính thì lần sau một FP y hệt lại được nâng thành "chứng-cứ MED MỚI". Đề-xuất: siết nhánh no-`#` của C1 (đòi ranh-từ + loại token có `.`/`B` liền sau) HOẶC allowlist dòng hot-feed. **Owner quyết — tôi KHÔNG sửa script.**
*(Ghi thêm: đúng lớp FP-census tôi đo @S123 — lane tôi 17/19 dương-giả. Detector-FP là bệnh nền, không phải tai-nạn lẻ.)*

### 🔴 F-7 [MED — MỚI] RAG baseline: **BA con số khác nhau**, và "vá bằng B1-pointer" sẽ nhập-khẩu số SAI
| Nơi | Con số | Trạng-thái |
|---|---|---|
| `.claude/commands/session-start.md:294` | *"baseline **~3076** chunks"* | **hardcode + stale −629** (vi-phạm B1: lẽ ra trỏ canonical) |
| `docs/STATUS.md:453` (canonical) | **2441** | *"re-verify S126"* — **lệch −6 so với sống** |
| **LIVE** `list_projects` (tôi tự gọi lượt này) | **2447** | `proj_solution_erp`, `last_indexed_at` **2026-05-29T23:26:13** |

Máy bắt vế `:294 vs live`. **Cái máy chưa nối:** hướng vá hiển-nhiên ("bỏ hardcode, trỏ `STATUS:453`") sẽ **rước một canonical cũng sai** sang chỗ mới ⇒ phải **refresh `STATUS:453` 2441→2447 TRƯỚC**, rồi mới đổi `:294` thành pointer. Làm ngược thứ-tự = drift đổi chỗ chứ không mất.
🔸 `last_indexed 2026-05-29` = **~2 tháng** chưa re-index (STATUS:453 đã ghi caveat này ⇒ nhất-quán, không phải drift mới). Re-index = việc AI_INFRA, **ngoài lãnh-địa tôi**.

### F-8 [LOW — MỚI] `agents/README:302` — số cũ nhưng **CÓ dán nhãn ngày**
`**State (S38 — 2026-05-28):** 40 mig · 84 tables · ~223 endpoints · 53 FE pages · 130 test PASS · 53 gotchas · 27 memory · 6 skills · **7 sub-agents***
Đĩa nay: 67 mig · 89 bảng · 532 test · 83 gotcha · 31 user-memory · 20 sub-agent.
🔴 **Nhưng nó dated "(S38 — 2026-05-28)"** ⇒ theo đúng luật tôi tự chốt @S143 (**frozen-in-time thì sửa số = giả-mạo hồ-sơ**), **KHÔNG được đổi số**. Vấn đề thật chỉ là **nhãn**: chữ "State" nằm dưới heading *"🎯 Project tunings"* nên người đọc lướt tưởng là cấu-hình hiện-hành. ⇒ Đề-xuất **sửa NHÃN, giữ SỐ**: thêm "(ảnh-chụp lịch-sử, KHÔNG hiện-hành — số sống → `docs/STATUS.md`)". Đây là ca **biết chỗ KHÔNG sửa**.

### F-1 [CARRY từ S150 — 1 vế ĐÃ ĐÓNG, 1 vế CÒN HỞ]
- ✅ **ĐÓNG:** `session-start.md:41-44` đã VALUE-update @S149 — default = **Opus 5 MAX ở MỌI vị trí kể cả ghế lead**; outage-path đổi thành *"giữ `/model claude-opus-4-8[1m]` + BÁO HUB NGAY"*. ⇒ **Finding F-C của tôi @S143** (*"recipe outage bảo đổi sang đúng cái đang pin = no-op"*) nay **HẾT HIỆU-LỰC** — recipe đã trỏ đúng bậc lùi. `settings.json model` = `claude-opus-5[1m]` khớp.
- 🟥 **CÒN HỞ:** `STATUS:452` (ô **canonical** §Sub-agents) vẫn khai *"Lead = frontier-class **owner-choice per-session**"* + *"em main **Fable 5** (1M) Max"*, flip-chain dừng ở **flip-8 S107 Fable**, **0 hit Opus-5**. Mà `session-start.md:41` nói thẳng lối owner-choice **"THÔI DÙNG"** ⇒ **canonical mâu-thuẫn với prescriptive sibling**. Khớp y nguyên carry S150 (NEXT-anh **#14** re-stamp). **Nhãn flip = quyền owner, tôi không tự đoán.**

---

## 📊 DIFF vs LAST-SESSION (S150 close `398d343` → HEAD `7049dbf`)

| Mặt | Delta | Bằng-chứng |
|---|---|---|
| ① skill | **0** | `git diff 398d343..HEAD -- .claude/skills/ .claude/commands/` RỖNG |
| ② vai-trò | **0 file** | `git diff … -- .claude/agents/` RỖNG; 20=20=20=20 |
| ③ plugin | **0** | 18/15/3 + marketplace 37 identical |
| ④ docs | **≠0** | closeout `398d343` land session-log MỚI + drift tồn-đọng ở trên |

🔴 **Tiền-đề "delta≈0" của lead — sai ở ĐƠN-VỊ ĐO:** delta **file-level** đúng là ~0 (3/4 mặt git-diff rỗng). Nhưng H1 không đo file-delta, H1 đo **khoảng-cách doc-vs-thực-tế** — thứ **TĂNG LÊN ngay cả khi đĩa đứng yên**, vì thế-giới đi tiếp (roster 17→20 từ S145 · RAG 3076→2447 · gotcha →83). 7 finding lượt này **0 cái nào** sinh từ commit trong cửa-sổ S150→S151; tất cả là **nợ tồn** mà "delta≈0" vô-tình gia-hạn thêm 1 phiên. **Skip H1 theo delta-commit = đo nhầm đại-lượng.**

---

## ✅ VERDICT — `PASS_WITH_FLAGS` · **8 finding** (7 MỚI + 1 carry)
①PASS · ②PASS-đếm / DRIFT-prose · ③PASS · ④PASS_WITH_FLAGS

| # | Nấc | Nơi | Ruột |
|---|---|---|---|
| F-2 | **HIGH** | `.claude/agents/README.md:249` | "17 folder" + **lời-biện-hộ tự-niêm-phong** bị đĩa bác (3 ring MEMORY.md có thật, đã commit) → đúng **20** |
| F-3 | MED | `docs/STATUS.md:452` | false-citation `README:227` = **dòng TRỐNG**; câu thật ở `README:240` |
| F-4 | MED | `.claude/workflows/hmw.js:46` + `:65` | "17/17" prescriptive, đĩa **20/20**; `:65` là câu định-nghĩa chính-sách worker-tier-pin |
| F-6 | MED | `scripts/governance-detectors.ps1:354` | C1 `#111` = **dương-giả** (`gotchas 111.616B`); vai H24 đã dùng làm chứng-cứ |
| F-7 | MED | `session-start.md:294` + `STATUS:453` | 3076 / 2441 / **live 2447** — vá sai thứ-tự sẽ nhập-khẩu số sai |
| F-5 | LOW | `scripts/spawn-model-audit.ps1:35-36` | vế bao-phủ "3 new ones" chưa-phủ → thực **6** |
| F-8 | LOW | `agents/README:302` | dated ⇒ **sửa NHÃN, KHÔNG sửa SỐ** |
| F-1 | CARRY | `STATUS:452` | canonical còn "owner-choice / Fable 5", 0-hit Opus-5 (NEXT-anh #14 — quyền owner) |

**Tự-soi:** F-4 là **lỗi của tôi**. Báo-cáo S150 của chính tôi kết *"ROSTER PASS 20=20=20 (VALID_ROLES đếm-phần-tử)"* mà sót 2 dòng prose **trong đúng file tôi vừa đếm**. Bài S143 dạy "đừng grep-theo-SỐ, hãy đếm-phần-tử"; S151 cho thấy **vế ngược cũng thủng** ⇒ acceptance phải **HAI CHIỀU**: đếm phần-tử mọi enum **VÀ** grep mọi con-số roster trong cùng file/cùng lớp.

**Ràng buộc giữ đúng:** INFORM-only · propose-only · 0 file ngoài sub-file này bị chạm · 0 `store_memory` · mọi claim có path:line / byte / lệnh tái-chạy được.

**STATUS: DONE** (4/4 mặt đo xong · ghi-đĩa-trong-lúc-làm · anti-#53).
