# sub-tooling-auditor @close S162 (H1 — 4-mặt tooling/docs freshness)

> WIP file — ghi-đĩa-trong-lúc-làm (chống #53). Mỗi mặt append NGAY khi soi xong.
> Propose-only. Lead = single-writer. Số máy đọc từ `run.md` (đóng băng 10:45), CẤM đo lại.

## Trạng thái tiến độ
- [x] ① skill
- [x] ② roster sub-agent
- [x] ③ plugin
- [x] ④ docs freshness
- [x] new-alloc audit
- [x] VERDICT

---

## ① SKILL — DRIFT-FOUND (2 flag: 1 MED + 1 MED)

**Inventory (đĩa):** 6 skill project (`.claude/skills/`: contract-workflow · dependency-audit-erp · ef-core-migration · form-engine · iis-deploy-runbook · permission-matrix) + **23** standalone `~/.claude/skills/` + 19 command-file `.claude/commands/*.md`.
**Diff vs S159 (@open L8):** skill-dir 6 = 0-delta · standalone 23 = 0-delta · **command 19** (S153 baseline 18 → +1, chưa đối chiếu tên; không phải delta của phiên này — `git log` skills 0-diff từ `33e7f68` 07-28).
Last-touch mỗi skill (`git log -1`): contract-workflow `33e7f68` 07-28 · ef-core-migration `33e7f68` 07-28 · permission-matrix `a09dcae` 07-15 · iis-deploy `d085436` 06-25 · dependency-audit `e70c046` 06-18 · form-engine `2abbc1d` 04-30.

### F-1 (MED) `ef-core-migration` — bản vá cấu-trúc S158 ĐÚNG nhưng LANDED 1/3 SITE; 2 site còn khai hợp-đồng cũ
- `33e7f68` (commit body, verbatim): *"ef-core-migration SKILL: va CAU TRUC (frontmatter thoi khai bang la nguon 'moi nhat') thay vi them row — ring1: **day la lan 3 cung class**"*.
- Frontmatter ĐÃ vá: `.claude/skills/ef-core-migration/SKILL.md:3` — *"Bảng history bên dưới là KHO LỊCH SỬ, KHÔNG phải nguồn 'mới nhất'"*. ✅
- 🔴 **Nhưng 2 site cùng file/cùng lớp VẪN khai ngược:**
  - `.claude/skills/ef-core-migration/SKILL.md:19` heading — *"## Migration history (số hiện tại → docs/STATUS.md canonical; **mới nhất = row cuối bảng**)"*
  - `.claude/skills/README.md:20` — *"migration history (**mới nhất → row cuối bảng skill**; số → docs/STATUS.md)"* + nhãn *"✅ Updated S117 … Mig 66 row added"*
- Hệ quả ĐO ĐƯỢC: row cuối bảng = **67** (`SKILL.md:89`, thêm @S151); đĩa = **69** (`ls Migrations/*.cs` trừ Designer/Snapshot = 69, mới nhất `20260729122015_AddContractSigningPlans`). Thiếu Mig 68 `AddPeAllowApproverDelete` (S155) + **Mig 69 `AddContractSigningPlans` (S161)**. Ai đọc theo :19 hoặc README:20 sẽ tin "mới nhất = 67" — **lệch 2**.
- 🔴 Tự-đính-chính S159: @open tao kết *"dừng row 67 là ĐÚNG thiết kế"* — **đúng NỬA**: đúng theo frontmatter, nhưng tao KHÔNG soi :19/README:20 nên bỏ lọt 2 site giữ hợp-đồng cũ. Đây đúng class "vá 1 chỗ ⇒ phải grep CÙNG LỚP" mà chính commit tự gọi tên "lần 3".
- Đề-xuất (owner/lead quyết): sửa :19 + README:20 cho khớp frontmatter (bỏ "mới nhất = row cuối"), **KHÔNG cần thêm row 68/69** — thêm row là quay lại đúng cái class vừa bỏ.

### F-2 (MED) `permission-matrix` — tree menu tự-mâu-thuẫn với chính bia-mộ cùng file + thiếu 3 họ key sinh sau
- Tự-mâu-thuẫn: `:26` có bia-mộ *"🧊 ~~Budgets root + Bg_*~~ — XOÁ S61 (Mig 50) … vá @S122 W4"*, **nhưng cây menu `:57-63` vẫn liệt LIVE, 0 dấu 🧊**:
  `Budgets (root, NO inherit — grant tay)` / `├── Bg_List` / `├── Bg_Create` / `└── Bg_Pending`; và `:76` còn ghi *"+ Pe/Wf/**Bg** seeders riêng"*.
  Đối-chứng đĩa: `MenuKeys.cs:78` chỉ còn **comment bia-mộ** `// [S61 Mig 50] Module Ngân sách cũ (Budgets + Bg_List/Bg_Create/Bg_Pending)` — 0 key sống. ⇒ Bản vá S122 chạm PROSE, sót CÂY (cùng file, cách 30 dòng).
- Thiếu họ key sinh sau S122 (đo `DbInitializer.cs`):
  - `Ct_<Code>_{WfView,Approved,Deleted}` — `DbInitializer.cs:1872` (`"Ct_" + code + "_WfView"`, **nối chuỗi inline, KHÔNG qua factory `MenuKeys.ContractType*`** ⇒ grep theo factory sẽ ra 0-hit, bẫy) + `:2171`. Skill `:56` còn khai `Ct_<Code>_<Group|List|Create|Pending> × 7 type = 28 leaf`.
  - `Khkk_*` 6 leaf — `DbInitializer.cs:1782-1787` · `Hdc_*` 6 leaf — `:1981-1986`. Cả 2 họ **0 hit** trong skill.
  - `Pe_<Code>_{Approved,Deleted,WfView}` — `MenuKeys.cs:153/154/158`; skill `:58` còn `Pe_<Code>_<List|Create|Pending> × 2 type = 6 leaf`.
- Thiếu 2 gotcha ĐANG SỐNG thuộc đúng lãnh-địa skill: **#82** (menu-flag grant ≠ quyền API — display-layer ⟂ authz-layer, S118) và **#84** (`RevokeTemporarilyHiddenModulesAsync` lật 447/494 row ⇒ luật *"KHÔNG SQL tay cho menu nữa — code-first seeder"*, S159). Mục bẫy `:164` chỉ có chiều ngược (*"403 ở API nhưng FE không hide button"*).
- 🔴 **Đối-chứng ĐỢT NÀY (S162 có chạm permission-gate):** file MỚI `fe-admin/src/hooks/usePipelineStages.ts:5` tự ghi `// 🔴 PERMISSION 2 TẦNG (bài S118 / gotcha #82)` + `:24/:69` dùng `usePermission`. ⇒ **CODE mang bài học mà SKILL thì không** — skill = nơi người sau tra đầu tiên, nên đây là stale có hậu-quả, không phải mỹ-phẩm.
- ⚠️ Cẩn trọng chống-Goodhart: skill `:3` ĐÃ theo B1 đúng (không chép số menu/policy) — **KHÔNG đề xuất nhét số vào lại**. Chỉ đề: 🧊 hoá khối `:57-63` + thêm 3 họ key + trỏ #82/#84.

### 4 skill còn lại — PASS (không stale vì đợt này)
`contract-workflow` (đợt S162 = FE-only, 0 chạm state-machine; `33e7f68` đã đính chính :371) · `form-engine` · `dependency-audit-erp` · `iis-deploy-runbook`: đợt `bfc7b79` không chạm lãnh-địa (0 file BE/mig/deploy). **`ef-core-migration` KHÔNG stale vì "0 mig phiên này"** — S162 thật sự 0 mig (`git show --stat bfc7b79` = 17 file, 0 `Migrations/`); stale của nó là nợ S155+S161 (F-1), không phải nợ S162.

---

## ② VAI-TRÒ SUB-AGENT — PASS (roster khớp 5 bề-mặt, 0 delta, 0 scope-drift)

**Số canonical (B1, đọc từ `docs/STATUS.md` §Sub-agents):** `docs/STATUS.md:469` row `| Sub-agents | **23** |`. **KHÔNG tự chế số.**

| # | Bề mặt | Đo được | Khớp |
|---|---|---|---|
| 1 | Đĩa `.claude/agents/*.md` | 24 file − `README.md` = **23** persona | ✅ |
| 2 | `docs/STATUS.md:469` (canonical §Sub-agents) | **23** | ✅ |
| 3 | `docs/STATUS.md:6` dòng CURRENT | `roster 23` | ✅ |
| 4 | `hmw.js` `VALID_ROLES` (đếm PHẦN-TỬ, anchor `^\]` — bẫy `]` trong comment S153) | **23** tên, tập-TÊN IDENTICAL với đĩa | ✅ |
| 5 | `.claude/agent-memory/*/` (dir, `memory-budget.json` là file không tính) | **23** dir, tên khớp 1:1 | ✅ |

- Đối chiếu tập-TÊN (không chỉ đếm số): đĩa ∆ VALID_ROLES = **∅ hai chiều**. 23 = 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.
- Diff vs S159 @open: **0** (không thêm/bớt/đổi tên vai).
- `git log` `.claude/agents/` từ `33e7f68`: 0 commit ⇒ 0 persona sửa.
- Scope-drift: 4 vai spawn phiên này (`ctx-verifier` @tiep · `frontend-designer` · `reviewer` · `cicd-monitor`) đều chạy trong lane persona — `ctx-verifier` @`/tiep` đúng carve-out, designer/reviewer/cicd đúng trục product/quality. **0 vai idle-bất-thường** (bookend-close W1-W4 đang dùng 10 vai còn lại).
- `run.md:8` cho `measure-agent-memory: 23 agent` ⇒ bề-mặt thứ-5 độc-lập cũng nói 23. Nhất quán.


---

## ③ PLUGIN — PASS (0-delta; báo đúng 4 nấc, KHÔNG conflate)

Nguồn authority = **user-global** `~/.claude/settings.json` (project `.claude/settings.json` chỉ có `hooks.Stop` wal-flush + `autoMemoryDirectory`, KHÔNG override plugin/model — đừng lẫn 2 file).

| Nấc | Số | Bằng chứng |
|---|---|---|
| **installed/registered** | **18** | `~/.claude/settings.json` khối `enabledPlugins` (18 khoá) |
| **enabled** (`true`) | **15** | 18 − 3 |
| **disabled** (`false`) | **3** | `pr-review-toolkit` · `code-modernization` · `hookify` |
| **marketplace inventory** | **37** | `ls ~/.claude/plugins/marketplaces/claude-plugins-official/plugins` — **lớp đo RIÊNG**, không suy từ registered (bài F-D S143) |
| **assigned** | có bảng map | `.claude/agents/README.md:216-224` (skill/plugin → vai) |
| **used** phiên này | **KHÔNG ĐO ĐƯỢC** | không có telemetry invocation trong repo ⇒ khai thẳng, KHÔNG suy "enabled = đang dùng" |

- **Diff vs S153/S159: 0** trên cả 4 lớp (18/15/3 + marketplace 37). 0 plugin mới, 0 plugin đổi trạng thái.
- `model` = **`claude-opus-5[1m]`** + `effortLevel: xhigh` — KHỚP ô canonical `docs/STATUS.md:469` (*"Lead = DEFAULT Opus 5 MAX"*) ⇒ **KHÔNG tái phát F-C S143** (model-pin flip không ghi sổ). 0 flag.
- Nợ cũ còn mở, KHÔNG mới: `agents/README:214` **chép số** "18 plugin registered (15 enabled / 3 disabled) + ~23 standalone" — số vẫn **KHỚP đĩa hôm nay** ⇒ theo luật chống-vu-oan (F-6 S151) đây **KHÔNG phải stale**, chỉ là rủi ro B1-copy. Không đề vá trong phiên này.

---

## ④ DOCS FRESHNESS — DRIFT-FOUND (dòng CURRENT stale 2 phiên; 5 số lệch + 1 bundle 2-mặt mâu-thuẫn)

### Xác nhận nghi-vấn của lead: ĐÚNG, nhưng KHÔNG phải mọi số trong dòng đó đều lệch

`docs/STATUS.md:6` mở đầu **"🔥 CURRENT (S159→S160, 2026-07-29 …)"** trong khi đĩa đã qua **2 phiên**: S161 (5 wave KHKK, 6 commit `a8027c0`→`3119cb9`) + S162 (`bfc7b79`). `grep -c 'S162' docs/STATUS.md` = **0**; `grep -c 'S161'` = **2** (chỉ 2 row bảng).

**Bảng số lệch — ĐO vs KHAI** (chỉ liệt cái LỆCH THẬT; cái đúng để ở bảng dưới, chống thổi phồng):

| # | Site | Doc khai | Đĩa/đo thật | Nguồn đo |
|---|---|---|---|---|
| a | `STATUS:6` + `STATUS:458` | Mig **68** | **69** | `ls Migrations/*.cs` trừ Designer/Snapshot = 69; mới nhất `20260729122015_AddContractSigningPlans`, commit `a8027c0` (W1 KHKK) |
| b | `STATUS:6` + `STATUS:459` | **89** SQL tables | **96** | 89 (re-ground S97 live) **+ 7** = `grep -c "CreateTable(" 20260729122015_AddContractSigningPlans.cs` = **7** bảng mới (`ContractSigningPlans`, `…Approvals`, `…Attachments`, +4). ⚠️ **96 là số DERIVED** — tao KHÔNG đo được `sys.tables` prod từ cwd; cần cicd/sqlcmd xác nhận LIVE trước khi đóng dấu |
| c | `STATUS:6` + `STATUS:465` | **562 PASS** (45D+517I) | **590** | commit `3119cb9` subject *"(suite 590/0)"* + `runs/2026-07-30-S162-cay-4-folder-gd/sub-cicd-monitor-2.md:84` *"gate 590/0/0"* + `:151` *"gate 590 = 45+545"* ⇒ phân rã mới = **45 Domain + 545 Infra** (row :465 đang ghi 517 Infra) |
| d | `STATUS:6` | counter **34** | **36** | `run.md:16` (số máy đóng băng) `counter=36 · last_ticked_session=S162` |
| e | `STATUS:6` **và** `STATUS:471` | **2 mặt bundle MÂU THUẪN NHAU, cả 2 đều chết** | 4/4 hash mới | `:6` admin `D0sXA0fe`/`DWDbm5As` · user `Y6dW_5CM`/`6YIAufJR` (S159) — `:471` admin **`8-QYcMOg`** · user **`DptYR4wL`** *"đo LIVE @S157 Run #419"*. Thật sau Run #432: admin js **`index-DXoYDy7R`** css **`index-BZ5F-g1w`** · user js **`index-o8KDluD1`** css **`index-yNZDmVNz`** (`sub-cicd-monitor-2.md:88-93`; control-âm `:103-105` chứng bundle cũ đã bị ghi đè) |
| f | `docs/HANDOFF.md:5` + `:7` | *"Last updated 2026-07-29 chiều (S159→S160)"*; baseline *"menu 142 · bundle `D0sXA0fe`… · test **562** giữ · **0 mig**"* | stale 2 phiên | 3/4 vế nay sai: bundle (rotate ×2 đợt), test (590), "0 mig" (S161 có **Mig 69**). Vế **menu 142 vẫn ĐÚNG** |
| g | `CLAUDE.md:62` | *"Lịch sử mig gần đây: **+S133 Mig 67**"* | thiếu 68 + 69 | B1-pointer cùng dòng (*"Số migration · bảng hiện tại → docs/STATUS.md canonical"*) vẫn ĐÚNG ⇒ chỉ LOW |
| h | `CLAUDE.md:68` / `:69` | Contract `1-11` · PE `12,13,15,49,50,52-61,65-67` | thiếu 68 (PE) + 69 (Contract/KHKK) | Mig 68 `AddPeAllowApproverDelete` = PE; Mig 69 `ContractSigningPlans` = nhánh Contract/KHKK, hiện **không có module-row nào nhận** |

### Cái ĐÃ TƯƠI — KHÔNG vá, tránh sửa oan (biết chỗ không sửa, S143)
- `STATUS:6` **gotcha 84** ✅ đúng (`grep -cE '^### [0-9]+\.' docs/gotchas.md` = **84**, max = 84).
- `STATUS:6` **roster 23** ✅ + `STATUS:469` **23** ✅ (khớp 5 bề mặt, xem ②).
- 🔴 `STATUS:6` **MenuItems prod 142** ✅ **KHÔNG stale** — lead nêu "menu 142" trong danh mục nghi-lệch, nhưng `STATUS:464` nói rõ *"+1 S161 `KeHoachKyKet` vào `All` … **menu-row prod KHÔNG đổi, 142 giữ**"* (key mới vào `MenuKeys.All` sinh **policy**, không sinh menu-row). Đừng vá.
- `STATUS:463` Policies **220** ✅ và `STATUS:464` Menu keys **55** ✅ — **2 row NÀY đã cập nhật @S161**. ⇒ Hình dạng drift = **PARTIAL-LANDING**: bảng CURRENT STATE tươi 2 row, còn dòng narrative + 3 row số nền (Mig/tables/tests) + 2 mặt bundle thì không. Cùng class "vá 1 chỗ, sót cùng-lớp".
- `.claude/agents/README.md` — `:3` B1-pointer đúng (**0 số roster** trong file) ⇒ PASS mặt roster-doc.
- `docs/governance/*` — last-touch `33e7f68` (07-28); sweep 4 token stale (`562` · `Mig 68` · `89 bảng` · `counter 34`) trên `docs/*.md` + `docs/governance/*.md` + `.claude/commands/*.md` + `.claude/agents/*.md` + 6 SKILL.md ⇒ **blast radius chỉ 3 file**: STATUS · HANDOFF · `ef-core-migration/SKILL.md`.
- 🔴 `ef-core-migration/SKILL.md` hit `"89 bảng"` = **FROZEN-IN-TIME, KHÔNG phải drift**: các chuỗi *"No new table (89 giữ)"* nằm TRONG mô tả từng migration cũ (`:86` Mig 64 · `:87` Mig 65 · `:88` Mig 66 · `:89` Mig 67) = bản ghi lịch sử đúng tại thời điểm đó. **Sửa = giả mạo hồ sơ** (luật prescriptive ⟂ frozen, S143).

---

## 🔌 NEW-ALLOC AUDIT — 0 ACTION

- Plugin mới chưa phân bổ: **0** (18/15/3 + marketplace 37 = 0-delta từ S153; không có gì mới để gán).
- Skill mới chưa phân bổ: **0** (6 project + 23 standalone = 0-delta; `git log .claude/skills/` không có commit nào sau `33e7f68`).
- Vai mới cần cấp skill: **0** (roster 23 đứng yên; skill-matrix `agents/README:216-224` vẫn phủ đủ).
- Ứng viên cũ còn treo (KHÔNG tự bật): `security-guidance` (marketplace) — hợp vai `reviewer`, nhưng nó mang **hook Stop + edit-time warning** đụng `settings.json hooks` ⇒ **quyền owner**, giữ nguyên đề xuất S143, không leo thang.

---

## VERDICT

**TOOLING: PASS_WITH_FLAGS** — ② roster + ③ plugin PASS sạch (0-delta, khớp 5/4 bề mặt); ① skill 2 MED; ④ docs DRIFT-FOUND 8 site (dòng CURRENT stale 2 phiên).

Xếp hạng để lead vá ở Phase 2: **HIGH** ④a-④e (STATUS:6 + :458/:459/:465 + 2 mặt bundle) · **MED** ④f HANDOFF · ①F-1 ef-core 2 site hợp-đồng-cũ · ①F-2 permission-matrix (cây Bg_* + 3 họ key + #82/#84) · **LOW** ④g/④h CLAUDE.md.

END TOTAL = 10 finding (① 2 · ② 0 · ③ 0 · ④ 8) · new-alloc 0 action.
