# sub-tooling-auditor — @close S172 (L10 window-4)

> H1 tooling/docs-freshness 4-mặt. Read-only · propose-only. Lead = single-writer.
> Đổ ruột liên tục (chống #53) — mỗi đo xong ghi ngay, KHÔNG giữ trong đầu tới cuối.

---

## ⓪ Ground-truth mở đầu

- cwd: `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP`, branch `main`
- HEAD lúc spawn (theo lead-brief): `37f18e9 wal: pause` ; commit sản-phẩm phiên = `998ea55`
- Run-folder PIN: `.claude/workflows/runs/2026-08-05-S172-bookend-close/` — TỒN TẠI, có sẵn `run.md` (2165B, 08-05 08:58)

### Tập-đo khai trước (anti-pattern #2 — mọi count phải khai PHẠM-VI)

| Bề mặt | Lệnh đo | Phạm vi |
|---|---|---|
| ② roster | `ls .claude/agents/*.md` | repo-self, KHÔNG gồm `~/.claude/agents` |
| ① skill | `ls .claude/skills/` + `ls -d ~/.claude/skills/*/` | project + user-global |
| ③ plugin | `~/.claude/settings.json` `enabledPlugins` | **user-global** (KHÔNG phải `.claude/settings.json` repo) |
| ④ docs | 5 canonical + governance | repo-self |

---

## ② ROSTER — đo TRƯỚC (số canonical B1)

**Đĩa:** `ls .claude/agents/*.md | wc -l` = **24** → trừ `README.md` = **23 persona**.
🔴 Bẫy đã né: glob `*.md` bắt cả `README.md` ⇒ báo 24 là SAI (anti-pattern #1 của chính vai này).

Danh sách 23 (alphabet):
cicd-monitor · ctx-audit · ctx-curator · ctx-verifier · database-agent · frontend-designer ·
harness-audit · harness-eval · harness-refine · harvest-curator · implementer-backend ·
implementer-frontend · investigator-api · investigator-codebase · lead-gap-auditor ·
lead-stale-auditor · office-document · reviewer · ring1-audit · ring2-audit · ring4-audit ·
test-specialist · tooling-auditor

**Đối chiếu `docs/STATUS.md:6`:** chuỗi `roster 23` — KHỚP đĩa.

_(các bề mặt còn lại đo bên dưới — đang tiếp tục)_

**5 bề mặt roster — đo xong:**

| # | Bề mặt | Lệnh / neo | Kết quả |
|---|---|---|---|
| 1 | Đĩa `.claude/agents/*.md` | `ls \| wc -l`=24 − README | **23** |
| 2 | `hmw.js` `VALID_ROLES` | `awk '/^const VALID_ROLES = \[/,/^\]/'` + strip `//` + đếm phần-tử | **23** |
| 3 | `docs/STATUS.md:6` | chuỗi `roster 23` | **23** |
| 4 | `.claude/agent-memory/*/` | `ls -d */ \| wc -l` (memory-budget.json = FILE không tính) | **23** |
| 5 | `.claude/agents/README.md` | B1-pointer — **CỐ Ý KHÔNG có số**, trỏ STATUS §Sub-agents | n/a đúng thiết-kế |

**Diff tập-TÊN (không chỉ tập-SỐ):** `diff <VALID_ROLES sorted> <disk sorted>` → **IDENTICAL**, 0 dòng lệch.
⇒ ② **PASS 0-delta**. Không có vai thừa/thiếu/rename-drift.

Bẫy parse đã né (bài S153): dùng anchor `^\]` + neo `^const VALID_ROLES = \[`, KHÔNG lấy `]` đầu-tiên
(comment `hmw.js` có `]` giữa dòng ⇒ regex naive cắt sớm, ra 18 thay 23).

---

## ① SKILL

**Project `.claude/skills/`** = 6 + README (KHỚP `CLAUDE.md` "6 skill"):
contract-workflow · dependency-audit-erp · ef-core-migration · form-engine · iis-deploy-runbook · permission-matrix
**User-global `~/.claude/skills/`** = **23** dir (`ls -d ~/.claude/skills/*/ | wc -l`). mtime mới nhất = 2026-04-22 ⇒ **0 skill MỚI** kể từ đó ⇒ new-alloc lớp skill = 0 việc.

### ⭐ ef-core-migration — KHÔNG stale (bác nghi-vấn "dừng ở 67")

Đo **theo PHẦN-TỬ** cột-1 bảng migration (`sed -n '80,96p' | cut -c1-45`), KHÔNG grep-theo-số:
rows liên-tục `58 … 67 · 68 · 69 · 70 · **71**` — **row cuối = Mig 71 `AddKhkkApprovalGroupCatalogAndFinalizeRuntime`** = ĐÚNG canonical `STATUS:6` (Mig **71**).
🔴 Ghi-chú phương-pháp: grep thô `^| *6[5-9]` **KHÔNG match** vì cột-1 là `| **67** |` (có `**`) — lần đo đầu chỉ ra 2 dòng *văn-xuôi* rồi suýt kết-luận "bảng dừng ở 67". Đây đúng bẫy anti-pattern #1 của chính vai này; đã đo lại bằng cắt-cột. `SKILL.md:96` Total = **97 bảng** — khớp canonical.

### 🔴 F-1 (MED, MỚI) — `skills/README.md:20` derived-summary tụt sau canonical

Text: `✅ Updated S164 (rows Mig 68 … + Mig 69 … added; **Total re-ground 96**; số → docs/STATUS.md)`
- Enumeration dừng ở **69**, nhưng `ef-core-migration/SKILL.md` đã có row **70** + **71**.
- **"Total re-ground 96"** = SỐ CỨNG nay SAI: canonical `STATUS:6` + `SKILL.md:96` đều **97 bảng** (Mig 70 `AddContractCatalogEntries` +1 bảng 96→97).
- Nghịch-lý: cùng dòng ĐÃ có con-trỏ B1 `số → docs/STATUS.md` mà vẫn chép số cạnh nó.
- **Đề-xuất (propose-only):** vá bằng **BỎ số** (`Total re-ground 96` → bỏ hẳn, giữ con-trỏ) + enumeration đổi thành "row cuối → xem bảng" — đúng doctrine `agents/README.md:2` *"vá bằng BỎ số, không bằng ĐỔI số"*. Lý do: sửa 96→97 thì Mig kế lại stale.

---

## ③ PLUGIN — 4 nấc KHÔNG conflate

Nguồn authority = **`~/.claude/settings.json`** (user-global; project `.claude/settings.json` KHÔNG override plugin).

| Nấc | Số | Bằng chứng |
|---|---|---|
| **installed** (marketplace) | **37** | `ls ~/.claude/plugins/marketplaces/claude-plugins-official/plugins \| wc -l` |
| **registered** (có mặt trong `enabledPlugins`) | **18** | đếm key trong block `enabledPlugins` |
| **enabled** (`true`) | **15** | — |
| **disabled** (`false`) | **3** | `pr-review-toolkit` · `code-modernization` · `hookify` |

**Delta vs baseline (S153/S162): 18/15/3 + marketplace 37 → 0-DELTA.** Không có plugin mới cần phân-bổ.
🔴 KHÔNG suy "enabled = đang dùng": *enabled* 15 chỉ nói nạp được; nấc *used* phải đo dấu-vết lượt-gọi — phiên này KHÔNG đo được nấc `used` từ cwd ⇒ **khai thẳng là không đo**, không suy.
Lead model `settings.json:11` = `claude-opus-5[1m]` — khớp `agents/README:5` "lead DEFAULT Opus 5 MAX". 0-drift.

---

## ④ DOCS — drift

### A. XÁC NHẬN 4 drift lead ĐÃ BIẾT (đo lại, kèm số chính xác để closeout không vá sót)

**A-1 `docs/STATUS.md:6` §CURRENT tụt 1 phiên-logic — XÁC NHẬN.** Còn `S161→S168 … L9`, chưa có `998ea55`.
🔴 **Giá-trị thêm — liệt-kê SỐ CỤ THỂ đã chết bên trong dòng đó** (vá dòng CURRENT mà quên mấy số này = vá dở):

| Số trong `STATUS:6` | Đĩa THẬT | Nguồn đo |
|---|---|---|
| `counter **42**` | **46** | `.session-counter.json` → `"counter": 46` |
| `light=deep=40` | light_at=**44** · deep_at=**40** | `"light_at_counter":44` `"deep_at_counter":40` |
| `light 2/6 deep 2/15` | light **2/6** (46−44) · deep **6/15** (46−40) | derive từ 3 số trên + `h24_cadence{light_every:6,deep_every:15}` |

⚠️ Bẫy: `light 2/6` **vẫn đúng do trùng-hợp** (42−40 = 46−44 = 2) ⇒ ai chỉ liếc vế light sẽ tưởng ô còn tươi. Vế `deep` mới lộ (2→6).
✅ **Cadence KHÔNG quá hạn:** light 2/6, deep 6/15 — chưa tới ngưỡng. Không có nợ nhịp phát sinh.

**A-2 `docs/HANDOFF.md:5` `Last updated: 2026-08-01` — XÁC NHẬN** (hôm nay 08-05, lệch 4 ngày).

**A-3 `docs/HANDOFF.md:11` slot (65) `ĐÃ QUÁ HẠN 2 ngày` — XÁC NHẬN SAI, thật = 4 ngày.** Hạn `2026-08-01`, nay `2026-08-05`. Câu tự khai viết @S170 (08-03). Class `số đếm tương-đối tự thối` — chính dòng này ĐÃ tự cảnh-báo class đó ở vế sau (*"bản cũ ghi HẠN HÔM NAY = neo tương-đối tự-phá"*) mà bản vá lại **đẻ ra neo tương-đối MỚI**.
→ **Đề-xuất:** bỏ hẳn cụm đếm-ngày, ghi neo TUYỆT ĐỐI: `hạn 2026-08-01 — CHƯA LÀM`. Sửa "2"→"4" là tái-phạm cùng class (mai lại thành 5).

**A-4 `.claude/WAL.md:21` dir rỗng 7→8 — XÁC NHẬN ĐÃ VÁ.** `:21` ghi **8** dir + liệt nguồn (7 dưới `runs/2026-08-01-S169-bookend-open/` + `fe-user/.claude` cwd-relative class-S54) + carve-out 4 dir build/IDE. `:9` ghi tick 45→**46** khớp `.session-counter.json` = 46. 0 lệch.

### B. ĐO 2-CHIỀU — kiểm cả thứ TRÔNG như drift mà KHÔNG phải (chống vu-oan)

**B-1 `memory-budget.json → hmw_width._why_20_not_16` ghi "roster nay 20" trong khi roster = 23 → KHÔNG FLAG.**
Khối này là **lý-do đã ratify 2026-07-24**, và `_roster_note_S153` nói rõ *"ADDITIVE @S153 — KHÔNG sửa chữ nào của `_why_20_not_16`"*. Đây là **bản ghi đông-lạnh**; sửa số = giả-mạo hồ-sơ ratify (đúng luật S143/S159). Roster hiện hành đã được ghi ĐÚNG ở `_roster_note_S153` ("roster nay = 23").

**B-2 Mirror `hmw_width.cap` — 0 DRIFT.** `memory-budget.json → hmw_width.cap` = **20** ⟺ `hmw.js:153 const WIDTH_CAP = 20`. Cite `hmw.js:153` trong note = **đúng dòng** (re-đo). Detector C9 IM là ĐÚNG, không phải mù.
INFORM (không phải flag mới): roster **23** > cap **20** ⇒ full-roster-sweep LOUD-skip 3 lane CUỐI. Số cap = **quyền owner (O-7)**, câu **(40)** đang treo ở HANDOFF — trạng-thái này khớp `STATUS:476`, không đổi phiên này.

**B-3 `agents/README:225` (F-6 MED tôi mở @S153) — ĐÃ ĐÓNG.** Tiêu-đề nay ghi rõ 3 site đang `enabled:true` và tách nấc *enabled* ⟂ *used*; `:226` ghi cả 3 lượt số đi qua. Vị-từ đã đúng tầng. **CLOSED-verified.**

**B-4 `agents/README:27` enumeration "Roster THẬT" — ĐẾM PHẦN-TỬ = 23** (7 core + 16 tên liệt-kê), KHỚP canonical. Site này từng lọt lưới @S143 vì liệt-kê TÊN không chứa số; lần này đếm phần-tử, PASS.

**B-5 `.claude/agents/` worker-tier-pin — 23/23 KHỚP.** Vòng từng file: mọi persona có `model: opus` + `effort: max`. Tally độc-lập `grep -l "^model: opus" | wc -l` = **23**, `grep -l "^effort: max" | wc -l` = **23**. 0 vai lệch tier.

**B-6 `docs/CLAUDE.md:124` "(71 test)" — KHÔNG FLAG.** Nằm trong bảng roadmap phase, row *"Phase 8 … Tests Phase 1-2 (71 test)"* = bản-ghi LỊCH-SỬ phase-8 giao được bao nhiêu, KHÔNG phải claim suite hiện tại (644). Sửa = phá hồ-sơ phase.

**B-7 4 thư `2026-08-04-Governance-upgrade-pack-phased-*` — `supersedes` sạch.** Chúng supersede bộ `2026-08-03-…-dot-3-*`; đo `ls broadcasts/inbox/ai_infra/ | grep 2026-08-0` → **CHỈ có 4 file 08-04, KHÔNG có file 08-03** ⇒ không tồn tại bản bị-thay nằm chờ ⇒ 0 rủi ro áp nhầm bản cũ.

---

## ⑤ CLASS-SWEEP `neo tương-đối tự thối` (theo yêu cầu lead — vá 1 class thì grep cả class)

Tập-đo khai trước: **3 file** `docs/HANDOFF.md` + `docs/STATUS.md` + `.claude/WAL.md`. Mồi ≥2 biến-thể:
`quá hạn` · `N ngày (trước|nữa|qua)` · `hôm nay` · `hôm qua` · `ngày mai` · `đã/còn N ngày` · `Nd quá hạn` · `tuần (trước|này|sau)` · `vừa rồi` · `sắp tới`.

**`docs/STATUS.md` = 0 hit** (sạch class này).

### 🔴 LIVE-ROT — 4 site NGOÀI slot (65), đều đang trỏ SAI (đề-xuất vá cùng lô)

| # | Site | Chữ hiện tại | Sự thật 2026-08-05 | Mức |
|---|---|---|---|---|
| **C-1** | `HANDOFF:70` | Monthly drift-audit **2026-08-01 (2 ngày nữa)** | **QUÁ HẠN 4 ngày** | **MED-HIGH** |
| **C-2** | `HANDOFF:62` | `#7 **DUE hôm nay**` (cùng việc monthly) | quá hạn 4 ngày | MED |
| **C-3** | `HANDOFF:402` | `/sleep-recovery-memory-l2 all` (**8d quá hạn**) | số "8d" đóng băng từ lượt viết, nay lớn hơn | LOW |
| **C-4** | `WAL:20` | slot 65 **quá hạn 4 ngày** + drift-audit **quá 4 ngày** | hôm nay ĐÚNG, nhưng sai từ 0h mai | LOW (WAL tái-sinh mỗi phiên) |

🔴 **C-1 nặng nhất vì SAI DẤU, không chỉ sai số:** "2 ngày **nữa**" đặt hạn ở **TƯƠNG LAI** trong khi nó đã **QUÁ KHỨ 4 ngày**. Người đọc lướt sẽ xếp việc này vào "chưa tới hạn" ⇒ neo tương-đối không chỉ thối, nó **lật chiều**. Đây là ca tệ hơn slot (65) (slot 65 ít nhất còn nói "quá hạn").

### ⚪ FROZEN — 2 site CẤM ĐỤNG (nếu vá = giả-mạo hồ-sơ)

- `HANDOFF:242` — *"tái phạm bài-học của chính **hôm qua**"*: nằm trong **thuật-lại phiên đã đóng**, "hôm qua" là mốc TRONG câu chuyện đó.
- `HANDOFF:479` — *"monthly **2026-07-01 (hôm nay)**"*: bản-ghi lịch-sử, đã có **ngày tuyệt-đối kèm bên**.
→ Cùng regex bắt được, nhưng **khác bản-chất**. Bộ lọc: neo tương-đối trong **việc CÒN SỐNG** = vá · trong **thuật-lại/bản-ghi** = giữ.

### 🔴 Phái sinh: MONTHLY DRIFT-AUDIT ĐANG NỢ 4 NGÀY

`CLAUDE.md:121` — *"Audit định kỳ: đầu mỗi tháng — combined **skill + doc drift audit**, em-main chạy thủ-công session đầu-tháng. Lần kế: **2026-08-01**"*. Nay **08-05** ⇒ **quá 4 ngày**. Đây đúng là kỳ-rà lớp ①+④ của chính vai này. `CLAUDE.md` dùng **ngày tuyệt-đối = đúng hình-thức**, không phải drift chữ — nhưng **việc thì đang nợ**. Bản audit @close này KHÔNG thay được monthly (khác phạm-vi: monthly quét `rules.md §6.4+§9.4` toàn-repo).

---

## 🔌 NEW-ALLOC AUDIT — kết luận

| Lớp | Đo | Kết luận |
|---|---|---|
| **plugin** | registered 18 / enabled 15 / disabled 3 / marketplace 37 | **0-DELTA** vs baseline ⇒ **0 việc phân-bổ** |
| **skill user-global** | 23 dir, mtime mới nhất **2026-04-22** | **0 skill MỚI** kể từ 04-22 ⇒ **0 việc phân-bổ** |
| **skill project** | 6 + README, khớp `CLAUDE.md` | 0 skill mới |
| **phủ vai** | `agents/README §Skill assignment` + `§External skill/plugin mapping` | mọi skill/plugin đang có ĐÃ có dòng map vai |

➡️ **NEW-ALLOC = 0 ACTION.** Không có skill/plugin nào MỚI mà chưa gán cho lead/sub.
⚠️ Kèm 1 INFORM: 4 thư `upgrade-pack-phased` kéo về phiên này mang `status: DRAFT` + `reviewer_gate: PENDING` ⇒ **CHƯA được áp**; nếu sau khi ratify chúng đẻ ra artifact/vai mới thì new-alloc kỳ sau mới có việc. Phiên này: 0.

---

## 🔧 F-1 chi tiết + CHUỖI VÁ (lead single-writer cần chuỗi chính xác)

**File:** `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP\.claude\skills\README.md` — **dòng 20**, ô cuối (cột "Ghi chú").

**Đang ghi (nguyên văn ô cuối):**
`✅ Updated S164 (rows Mig 68 `AddPeAllowApproverDelete` + **Mig 69 `AddContractSigningPlans` 7-bảng KHKK 89→96** added; Total re-ground 96; số → `docs/STATUS.md`)`

**Canonical đối chiếu:**
- `.claude/skills/ef-core-migration/SKILL.md` bảng migration — row cuối = **71**, có đủ **70** + **71** (đo bằng cắt-cột, không grep-số).
- `SKILL.md:96` **Total: 97 bảng** · `docs/STATUS.md:6` **97 bảng**.

**2 lỗi:** ① enumeration dừng ở 69 (thiếu 70/71) · ② **`Total re-ground 96` = số cứng nay SAI** (canonical 97) — và nó nằm **ngay cạnh** con-trỏ B1 `số → docs/STATUS.md` trong cùng ô.

**Chuỗi vá đề-xuất — thay ô cuối bằng:**
`✅ Updated S168 (bảng migration trong SKILL.md kéo tới row cuối hiện hành; số bảng + số Mig → `docs/STATUS.md`)`

🔴 **Lý do KHÔNG sửa `96`→`97`:** đúng doctrine `agents/README.md:2` — *"vá bằng **BỎ số**, không bằng **ĐỔI số**"*. Đổi 96→97 thì Mig kế lại stale, và ô này đã tự mâu-thuẫn (chép số cạnh câu trỏ-canonical). Cũng vì vậy KHÔNG viết "rows … 70 + 71 added": liệt tên/số row sẽ thối y hệt ở Mig 72 — thay bằng "row cuối hiện hành".

---

## 📊 TOTAL — verdict @close S172

**`TOOLING: DRIFT — 7 điểm`** (1 MỚI-MED · 5 MỚI-class-sweep · 3 đã-biết-xác-nhận · 4 CLOSED/PASS-verified — bảng dưới là bản chuẩn, con số dòng verdict = **điểm CẦN LEAD ĐỘNG TAY**)

| Mặt | Trạng thái | Điểm cần động tay |
|---|---|---|
| **① skill** | ⚠️ **DRIFT ×1** | **F-1** `skills/README.md:20` (MED, **MỚI**) — có chuỗi vá ở trên. ef-core SKILL.md row-71 = **PASS**, KHÔNG stale |
| **② roster** | ✅ **PASS 0-delta** | 0 — **23** khớp **5 bề mặt** (đĩa · VALID_ROLES · `STATUS:6` · `STATUS:476` · agent-memory 23 dir) + diff tập-TÊN IDENTICAL + tier 23/23 `opus`+`max` |
| **③ plugin** | ✅ **PASS 0-delta** | 0 — 37 installed / 18 registered / 15 enabled / 3 disabled; 4 nấc KHÔNG conflate; nấc *used* khai thẳng **không đo được** |
| **④ docs** | ⚠️ **DRIFT ×6** | **A-1** STATUS:6 (+3 số chết bên trong) · **A-2** HANDOFF:5 · **A-3** HANDOFF:11 · **C-1** HANDOFF:70 (**SAI DẤU**) · **C-2** HANDOFF:62 · **C-3** HANDOFF:402 |

**Phân loại 7 điểm cần động tay:**
- 🆕 **MỚI phiên này (4):** F-1 · C-1 · C-2 · C-3
- ☑️ **Đã-biết — xác nhận + lượng-hoá (3):** A-1 (kèm 3 số chết) · A-2 · A-3 (lead đã đồng ý áp neo tuyệt-đối)
- 🔹 **LOW không tính điểm (1):** C-4 `WAL:20` — WAL tái-sinh mỗi phiên, tự khỏi
- ✅ **CLOSED-verified (2 nợ cũ ĐÓNG):** A-4 WAL dir-rỗng 7→**8** đã vá · **B-3** `agents/README:225` F-6-MED-@S153 đã vá đúng tầng *enabled*⟂*used*
- ⚪ **Chống-vu-oan — kiểm rồi CỐ Ý KHÔNG flag (3):** B-1 `_why_20_not_16` đông-lạnh · B-6 `docs/CLAUDE:124` "71 test" lịch-sử · 2 site FROZEN `HANDOFF:242`/`:479`
- 🔵 **INFORM (3):** monthly drift-audit **nợ 4 ngày** (`CLAUDE.md:121`) · roster 23 > `hmw_width.cap` 20 ⇒ LOUD-skip 3 lane, câu **(40)** treo = quyền owner · 4 thư upgrade-pack `DRAFT/PENDING` chưa được áp
- 🔌 **NEW-ALLOC: 0 ACTION** (plugin 0-delta · skill 0 mới từ 2026-04-22 · phủ vai đủ)

**Bằng chứng:** mọi claim ở trên có path:line / lệnh đo / con số. 0 tick-checkbox-no-evidence.
**Propose-only:** vai này KHÔNG sửa file nào ngoài chính artifact này. Lead VERIFY → APPEND (B3).

**END TOTAL = 7**
