# sub-tooling-auditor — @open S163 (phiên-LOGIC L9) — H1 tooling-freshness 4-mặt

> Vai: tooling-auditor (H1). INFORM-only, propose-only. Ghi-đĩa-trong-lúc-làm (chống #53).
> Ngày: 2026-07-30. Run-folder PIN: `.claude/workflows/runs/2026-07-30-S163-bookend-open/`
> So-sánh-với PIN: `.claude/workflows/runs/2026-07-30-S162-bookend-close/sub-tooling-auditor-close-S162.md`
> Canonical PIN: `docs/STATUS.md` (Mig 69 · 96 bảng · 590 test · roster 23 · menu 55 · policy 220)
> Nền đã đo sẵn (KHÔNG chạy lại): governance-detectors TOTAL 44 flag (+6 INFORM), 1 HIGH = STATUS gotcha 84 vs disk 85.

---

## M-0 — Đo mặt ② trước (roster) vì HANDOFF NEXT-em #5 nêu nghi vấn đích danh

**Đếm PHẦN-TỬ trên đĩa** (`ls .claude/agents/`, loại `README.md`):

23 file persona:
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

=> **ĐĨA = 23**. Khớp canonical `docs/STATUS.md` roster 23 (pending verify line).

(chi tiết đối-chiếu 5 bề-mặt: mục kế)

---

## ② ROSTER — 5 bề-mặt đo, 1 DRIFT THẬT (xác nhận HANDOFF NEXT-em #5)

| # | Bề-mặt | Cách đo | Kết quả |
|---|---|---|---|
| 1 | `.claude/agents/*.md` (đĩa) | `ls` loại README, ĐẾM PHẦN-TỬ | **23** ✅ |
| 2 | `.claude/agent-memory/*/` | `ls -d` | **23** ✅ (1 dir/vai, tên khớp 23/23) |
| 3 | `hmw.js` `VALID_ROLES` | `awk '/const VALID_ROLES/,/^\]/'` (anchor `^\]` — bài S153 bẫy `]` trong comment) | **23** ✅ |
| 4 | `docs/STATUS.md:476` row Sub-agents | đọc cột giữa | **23** ✅ |
| 5 | `docs/STATUS.md:6` CURRENT chip | đọc | **roster 23** ✅ |
| 6 | `.claude/agents/README.md:27` "Roster THẬT" (enumeration TÊN) | ĐẾM PHẦN-TỬ: 7 core + 16 tên | **23** ✅ |

### 🔴 F-1 (MED) — `.claude/agents/README.md:242` enumeration VALID_ROLES lệch 3 vai + số monitor sai

- **Đo:** dòng `:242` tự xưng *"VALID_ROLES (whitelist `hmw.js` — **ĐỦ roster**)"* rồi liệt kê **20 tên**.
  Đếm phần-tử: investigator-codebase · investigator-api · implementer-backend · implementer-frontend ·
  test-specialist · reviewer · cicd-monitor · frontend-designer · database-agent · office-document ·
  tooling-auditor · harvest-curator · lead-stale-auditor · lead-gap-auditor · harness-eval ·
  harness-refine · harness-audit · ring1-audit · ring2-audit · ring4-audit = **20**.
- **THIẾU bộ-ba `ctx-audit` · `ctx-curator` · `ctx-verifier`** — 3 vai NÀY CÓ THẬT trong `hmw.js` (đo ở trên, 23 phần-tử; block comment `+S153 ctx soft-memory 0df10df4`).
- **Vế-2 cùng dòng:** *"Cả **10** monitor đều INFORM-only, lane RETURN-only"*. Đếm monitor trên ĐĨA = tooling-auditor · harvest-curator · lead-stale · lead-gap · harness-eval/refine/audit · ring1/2/4 (**10**) **+ ctx-audit/ctx-curator/ctx-verifier (3)** = **13**. Cả 3 ctx-* đều `Read-only INFORM-only` ở frontmatter `description` (`ctx-audit.md:4` · `ctx-curator.md:4` · `ctx-verifier.md:4`) ⇒ **số đúng = 13**.
- **Nguồn drift:** S153 đổi `hmw.js` 20→23 (`STATUS:476` ghi rõ *"hmw VALID_ROLES 20→**23**"*) nhưng **BẢN SAO README của cùng hằng số KHÔNG đổi**. Sibling `:27` ("Roster THẬT") ĐÃ được vá cùng S153 ⇒ đây là **sửa-1-quên-1 giữa 2 enumeration TRONG CÙNG FILE**.
- **Mức nghiêm-trọng: MED, không HIGH** — `hmw.js` (thứ CÓ RĂNG) ĐÚNG; drift chỉ ở doc. Nhưng README chính là nơi `:244` dạy luật *"đổi roster = đổi 2 BỀ-MẶT ĐỘC-LẬP"* ⇒ tài-liệu-dạy-luật vi-phạm chính luật nó dạy.
- **Tái-phát class:** `:28` ghi **bài S143** đích danh về dòng này (khi đó là `:225`): *"enumeration TÊN cũng lão-hoá… ĐẾM PHẦN TỬ trong mọi enumeration rồi so canonical"*. Đúng dòng đó, đúng class đó, **lặp lại sau 20 phiên** (S143 → S163). Grep-theo-SỐ vẫn 0-hit vì list không chứa số → chỉ đếm-phần-tử mới bắt.
- **Đề-xuất (propose-only, em main quyết):** thêm 3 tên vào `:242` + đổi `10 monitor` → `13`. LƯU Ý B1: `:242` CỐ Ý không chép TỔNG số vai (trỏ STATUS) — giữ nguyên thiết-kế đó, chỉ vá enumeration + số monitor (số monitor là phân-nhóm, không phải tổng roster).
- **Sống sót qua:** bookend S159 @open + S162 @close (2 lượt H1) — cả 2 báo "roster khớp 5 bề-mặt" nhưng **tập-đo không có `README:242`**. Đây là bài phạm-vi-tập-đo (Anti-pattern #2 của chính vai này).

**② VERDICT: PASS_WITH_FLAGS — hằng-số có-răng (`hmw.js`) khớp đĩa 23/23; 1 bản-sao-doc lệch (F-1).**

---

## ④ DOCS (phần 1) — F-2 XÁC NHẬN + NÂNG MỨC: CLAUDE.md thiếu Mig 68/69 **và thiếu CẢ MỘT MODULE**

**Đo đĩa trước:** `ls Persistence/Migrations/*.cs` (loại Designer + ModelSnapshot) = **69** file ⇒ khớp canonical `STATUS:6` Mig **69** ✅.
Hai mig cuối: `20260727033522_AddPeAllowApproverDelete` (=Mig 68, S155) · `20260729122015_AddContractSigningPlans` (=Mig 69, S161).

### 🔴 F-2 (HIGH) — `CLAUDE.md` bỏ sót Mig 68 + 69; module **ContractSigningPlans** KHÔNG có row nào trong bảng Modules

- **`CLAUDE.md:62`** ("Lịch sử mig gần đây") — chuỗi mới nhất là *"+S133 Mig 67 `AddPeApprovedBudgetSnapshot`"*. `grep -n "Mig 68\|Mig 69" CLAUDE.md` ⇒ **0 hit toàn file**. Xác nhận nghi-vấn của lead.
- **`CLAUDE.md:69`** (row PurchaseEvaluation) — cột Migration = `12,13,15,49,50,52-61,65-67`. Mig 68 (`AddPeAllowApproverDelete`, 1 `AddColumn` + 1 `DropColumn` trên PE, `:13`/`:24`) là mig **của chính module PE** ⇒ dải đúng phải là **`65-68`**.
- 🔴 **NẶNG HƠN nghi-vấn ban đầu — ca chưa ai nêu:** Mig 69 tạo **7 `CreateTable`** (`grep -c CreateTable` = 7) cho **module MỚI hoàn toàn**: `src/Backend/SolutionErp.Domain/ContractSigningPlans/` (8 entity: `ContractSigningPlan` · `...Approval` · `...Attachment` · `...Changelog` · `...DossierItem` · `...LevelOpinion` · `...Line` · `...Phase`). Bảng "Modules" `CLAUDE.md:66-76` liệt 8 row (Contract · PE · ~~Budget~~ · Master · Identity · Forms · Notifications · Tests) — **KHÔNG có row ContractSigningPlans**. Đây không phải lệch con-số mà là **thiếu hẳn một thực-thể trên bản-đồ**.
- **Vì sao đáng HIGH:** `CLAUDE.md` = project-instruction **auto-inject vào MỌI phiên và MỌI sub-agent**. Một module 7 bảng vô-hình ở lớp context mặc-định ⇒ vai nào tra bản-đồ module sẽ kết luận sai (đây chính là bề mặt nuôi ca *"đọc doc thay vì đo đĩa"*).
- **Cùng LỚP với F-1** (đúng yêu-cầu "tìm tiếp ca cùng lớp"): cả hai đều là **enumeration lão-hoá** — dải mig `65-67`, danh-sách module, danh-sách VALID_ROLES đều là **liệt-kê**, và luật B1 *"KHÔNG copy số"* **không bảo vệ được liệt-kê** (liệt-kê không phải "số"). Ghi chú `:62` tự khai *"KHÔNG copy số ở đây để tránh drift"* rồi **ngay sau đó chép một chuỗi lịch-sử mig** — mà chuỗi đó mới là thứ lão-hoá.
- **Đề-xuất (propose-only):** (a) thêm row `ContractSigningPlans | Domain/ContractSigningPlans/ | 69 | ...` vào bảng Modules; (b) PE row `65-67` → `65-68`; (c) `:62` nối 2 mục Mig 68/69 **hoặc** — bền hơn — cắt đuôi lịch-sử mig ở `:62` và trỏ hẳn `docs/changelog/`, vì đoạn narrative này đã dài + tự-lão-hoá mỗi mig (KHÔNG phải Goodhart: nội-dung được CHUYỂN chỗ chứ không bị xoá — quyết định là của em main/anh).

---

## ① SKILL — inventory + phần NGỮ-NGHĨA (máy mù)

**Inventory (đếm đĩa):** project `.claude/skills/` = **6** (contract-workflow · dependency-audit-erp · ef-core-migration · form-engine · iis-deploy-runbook · permission-matrix) + README.md — khớp `CLAUDE.md` "6 skill" ✅ · user-global `~/.claude/skills/` = **23** (0 delta vs baseline) · `.claude/commands/*.md` = **19**.
**Diff vs S162: 0 THÊM / 0 XOÁ / 0 ĐỔI TÊN** ở cả 3 lớp.

### 🔴 F-3 (MED) — `ef-core-migration/SKILL.md:19` heading **phản-bác chính frontmatter của nó** (sửa-1-quên-1, cùng lớp F-1/F-2)

- S158 `33e7f68` vá **CẤU-TRÚC** (commit-body nguyên văn: *"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 `:3` nay nói ĐÚNG: *"Bảng history bên dưới là **KHO LỊCH SỬ, KHÔNG phải nguồn 'mới nhất'**"*.
- **NHƯNG** heading `:19` — cách đó 16 dòng, cùng file — vẫn ghi: `## Migration history (số hiện tại → docs/STATUS.md canonical; **mới nhất = row cuối bảng**)`. Row cuối = **Mig 67** (`:89`), thật = **Mig 69** ⇒ mệnh-đề `:19` **SAI**, và nó phủ định chính cái vừa được vá ở `:3`.
- 🔴 Đây là **lý do tại sao tao KHÔNG lặp lại verdict "stale" của lượt S159 một cách máy-móc**: bảng dừng ở 67 **là đúng thiết-kế** (kho lịch-sử). Cái hỏng không phải bảng — mà là **1 câu tự xưng bảng là nguồn-mới-nhất còn sót**. Vá đúng = xoá vế `; mới nhất = row cuối bảng` ở `:19`, **KHÔNG** phải đi thêm row (thêm row = hoàn tác đúng cái S158 vừa sửa-gốc).
- **Ăn theo:** `:91` *"Total: **89 bảng** `sys.tables`"* + *"Mig 51-66 đều AddColumn/index/data-only… **không đổi số bảng**"* — nay Mig 69 tạo **7 CreateTable** (89→**96**, khớp `STATUS:6`) ⇒ câu bất-biến này hết đúng. Đây là **số cứng trong thân bài**, không được frontmatter-fix che. Đề-xuất: bỏ số, trỏ `docs/STATUS.md` (B1) + nối mệnh-đề "…tới Mig 68; Mig 69 = +7 bảng".

### F-4 (LOW) — `contract-workflow/SKILL.md` CÓ biết GĐ2 KHKK, KHÔNG stale nội-dung
- `:449` `## 🆕 Nhánh KHKK — "Kế hoạch ký kết Hợp đồng" (GĐ2, Mig 69 @S161)` ⇒ skill **đã** theo kịp feature mới nhất. Detector báo `:24/:35/:332/:367` là lệch **số derived** (lớp khác), KHÔNG phải mù-feature. Tao **BÁC** cách đọc "contract-workflow stale về nội-dung".

### F-5 (LOW) — `permission-matrix/SKILL.md:18` cite số-dòng đã chết
- Khai: *"Đếm THẬT = đọc mã… `MenuKeys.All` ở `…/MenuKeys.cs:**147**`"*. Đo: `MenuKeys.All` khai báo tại **`:164`** (`public static readonly string[] All =`); `:147` nay là mảnh **comment** (`// (qua labelBackfill, KHÔNG đổi key) + 2 mục MỚI:`).
- Trớ trêu: dòng này dạy *"đọc mã, đừng tin doc"* mà con-trỏ tới mã lại sai. Vá theo tiền-lệ ratified S151/S153: **BỎ số dòng**, giữ tên symbol (`MenuKeys.All`) — grep được, không lão-hoá.
- ⚠️ `KeHoachKyKet` (`MenuKeys.cs:42`, vào `All` `:180`, sinh 4 policy theo comment `:39`) = **0 hit** trong skill — nhưng xem F-9, đây là 1 phần của lỗ họ-key lớn hơn đã flag từ S162.

### ✅ Skill → vai mapping — PASS 23/23, 0 mồ-côi
`agents/README.md:176` bảng `| Agent | Skills |`, đếm phần-tử = **23 row**, khớp roster đĩa 23 (kể cả bộ-ba ctx `:198-200`). **KHÔNG có vai nào thiếu row, không row nào trỏ vai đã chết.** ⇒ mặt ① không nợ new-alloc.

**① VERDICT: PASS_WITH_FLAGS** — inventory 0-delta; 2 skill có drift ngữ-nghĩa (F-3 ef-core · F-5 + F-9 permission-matrix); `contract-workflow`/`form-engine`/`dependency-audit-erp`/`iis-deploy-runbook` fresh.

---

## ③ PLUGIN — PASS (0-delta) · báo ĐÚNG 4 NẤC, không conflate

Nguồn: `~/.claude/settings.json` `enabledPlugins` (**user-global** — không phải `.claude/` của SE).

| Nấc | Số | Bằng chứng |
|---|---|---|
| **installed** (registered trong settings) | **18** | `settings.json:17-35`, đếm phần-tử |
| **enabled** (`: true`) | **15** | 18 − 3 |
| **disabled** (`: false`) | **3** | `pr-review-toolkit` `:20` · `code-modernization` `:22` · `hookify` `:26` |
| **marketplace available** | **37** | `ls ~/.claude/plugins/marketplaces/claude-plugins-official/plugins` |
| **assigned** (có vai/luật trong `agents/README.md`) | **9/15** | grep từng tên: feature-dev 2 · skill-creator 1 · frontend-design 11 · code-review 2 · claude-md-management 1 · commit-commands 2 · csharp-lsp 4 · typescript-lsp 1 · session-report 2 |
| **used** (chạy thật phiên này) | **0 đo được** | @open chưa có invocation nào — KHÔNG suy từ `enabled` |

**Diff vs S162: 0 THÊM / 0 ĐỔI / 0 XOÁ** (18/15/3 + 37 đứng yên từ S153 → nay).

**INFORM-P1 — 6 plugin `enabled` mà 0 vai nào được giao** (0 hit trong `agents/README.md`): `claude-code-setup` · `playground` · `mcp-server-dev` · `learning-output-style` · `plugin-dev` · `explanatory-output-style`.
→ Đọc đúng: đây **KHÔNG phải drift** — 4/6 là tiện-ích lead-level (setup/playground/2 output-style) vốn không thuộc vai nào. Chỉ nêu để anh biết bề mặt. **Đề-xuất = KHÔNG hành-động** (bật/tắt là quyền owner; tao propose-only).

---

## ④ DOCS phần 2 — STATUS · agents/README (ngoài :242) · governance

### 🔴 F-6 (HIGH) — `docs/STATUS.md` **canonical tự nó stale**: Gotchas khai 84, đĩa 85

- Đo 2 chiều (không tin 1 phép): `grep -cE '^### [0-9]+\.' docs/gotchas.md` = **85** VÀ max anchor = `### 85.` (`docs/gotchas.md:1379`) ⇒ 2 phép khớp nhau, không phải lệch đếm-vs-số-hiệu.
- Khai: `docs/STATUS.md:473` row `| Gotchas | **84** |` (nhãn "+S159 #84") **và** `STATUS:6` chip "gotcha **84**" ⇒ **2 site**.
- **Nội-dung #85** = *"Menu-key OR-gate FE ≠ policy per-action BE — gate rộng hơn endpoint ⇒ 403 rải khắp UI (**Session 162**)"* ⇒ gotcha này **sinh ở chính phiên trước**: `gotchas.md` được ghi @S162 nhưng **ô canonical trong STATUS không ticked cùng lượt**.
- Vì sao HIGH: STATUS là **nguồn canonical mà mọi doc khác được lệnh trỏ về** (luật B1). Canonical sai ⇒ mọi derived "đúng theo canonical" cũng sai theo, và detector chấm sạch.
- 🔴 **Tự-đính-chính:** `sub-tooling-auditor-close-S162.md` mục "Cái ĐÃ TƯƠI" tao ghi **"gotcha 84 ✅ đúng, max = 84"** — đúng **tại thời điểm đo**, nhưng #85 land **sau** phép đo đó trong cùng closeout ⇒ class **drift-born-sau-phép-đo** (lớp đã có trong Method từ S97/S98). Không phải đo sai; là **đo xong rồi vật đổi**. Bài: món lead còn đang ghi trong closeout thì phép đo @close có hạn dùng cực ngắn — phải re-đo @open kế (đang làm).
- Đề-xuất: `STATUS:473` 84→85 + nhãn `+S162 #85` · `STATUS:6` chip 84→85.

### F-7 (MED) — bundle hash trong `STATUS` còn **2 mặt mâu thuẫn** (CARRY S162-e, mới đóng 1 nửa)

- `STATUS:6` (đã vá @S162): admin `index-DXoYDy7R.js` / `index-BZ5F-g1w.css` · user `index-o8KDluD1.js` / `index-yNZDmVNz.css` — "sau Run #432, 4/4 rotate".
- `STATUS:479` (**chưa vá**): "Bundle hash live (prod): admin **`8-QYcMOg`** · user **`DptYR4wL`** (đo LIVE @S157, Run #419)".
- ⇒ Cùng file, 2 ô cùng nói "hash prod", lệch nhau. S162 đã flag đúng cái này (item e); closeout vá `:6` mà **bỏ `:479`** ⇒ partial-landing lần 2 trên cùng 1 finding. **KHÔNG đo lại prod** (ngoài lãnh-địa H1 — đó là `cicd-monitor`); tao chỉ khai **2 mặt trong doc không thể cùng đúng**.

### ✅ Cái ĐÃ ĐÓNG / ĐÃ TƯƠI — không vá, chống sửa oan

- `STATUS:6` **Mig 69 · 96 bảng · 590 test · roster 23 · menu 55 · policy 220** ✅ khớp đo của tao (69 file mig trên đĩa; roster 23 sáu bề-mặt; test 590 dùng số lead đo tươi) ⇒ **S162 item a/b/c ĐÓNG**.
- `STATUS:6` chip "MenuItems prod 142 GIỮ" ✅ — giữ nguyên phán quyết S162 (key `KeHoachKyKet` vào `MenuKeys.All` sinh **policy**, không sinh menu-row). **Không lật.**
- `docs/HANDOFF.md:5` "Last updated 2026-07-30 trưa (S161→S162)" ✅ ⇒ **S162 item f ĐÓNG**.
- `docs/governance/*.md` — last-touch `e5123ff` (S162 closeout). Sweep 4 token stale (`89 bảng` · `562 test` · `gotcha 84` · `Mig 68`) ⇒ **0 hit**. Control-dương: cùng lệnh ra hit ở `STATUS`/`CLAUDE.md` ⇒ lệnh CÓ răng, không phải 0-hit-vì-lệnh-hỏng. **PASS.**
- `.claude/agents/README.md` ngoài `:242`: `:5` B1-pointer đúng · `:27` "Roster THẬT" đếm phần-tử = **23** ✅ · `:176` skill matrix **23 row** ✅ ⇒ `:242` là drift DUY NHẤT của file.
- **INFORM-D1 (KHÔNG phải drift):** `STATUS:6` khai `counter 36` trong khi `.claude/governance/.session-counter.json` = **37** (`last_ticked_session: "S163"`). Lag ĐÚNG THIẾT-KẾ — tick xảy ra @session-start phiên NÀY, ô STATUS vá @closeout. Nêu để closeout nhớ, **không tính finding**.

---

## 🔀 DIFF vs S162 (`sub-tooling-auditor-close-S162.md` — PASS_WITH_FLAGS, 10 finding)

| Món S162 | Trạng thái @S163-open | Bằng chứng |
|---|---|---|
| ① F-1 ef-core 2 site khai "mới nhất = row cuối" | 🔴 **CÒN TREO 2/2** | `SKILL.md:19` (→ F-3) · `.claude/skills/README.md:20` (→ F-8) |
| ① F-2 permission-matrix (Budget tree sống + thiếu họ key) | 🔴 **CÒN TREO** | `:60-63` `Budgets/Bg_List/Bg_Create/Bg_Pending` vẫn 0 dấu 🧊; `grep -c "Khkk_\|Hdc_"` = **0** (→ F-9) |
| ④ a Mig 68→69 | ✅ ĐÓNG | `STATUS:6` Mig 69 |
| ④ b 89→96 bảng | ✅ ĐÓNG | `STATUS:6` 96 bảng |
| ④ c 562→590 test | ✅ ĐÓNG | `STATUS:6` 590 |
| ④ d counter 34→36 | ✅ ĐÓNG (nay lag 36 vs 37 = INFORM-D1) | counter file 37 |
| ④ e bundle 2 mặt mâu thuẫn | 🟡 **ĐÓNG 1/2** | `:6` vá · `:479` chưa (→ F-7) |
| ④ f HANDOFF stale 2 phiên | ✅ ĐÓNG | `HANDOFF:5` 2026-07-30, S161→S162 |
| ④ g `CLAUDE.md:62` thiếu mig | 🔴 **CÒN TREO + NÂNG MỨC** | → F-2 (thêm bằng chứng module vắng mặt) |
| ④ h `CLAUDE.md:68/:69` dải mig | 🔴 **CÒN TREO** | → F-2 |
| ③ plugin 0-delta | ✅ GIỮ | 18/15/3 + marketplace 37 |
| ② roster PASS | 🟡 **GIỮ số, +1 bề-mặt MỚI lộ drift** | 6 bề-mặt đều 23, trừ `README:242` (→ F-1) |

**THÊM MỚI @S163:** F-1 (`README:242`) · F-5 (permission-matrix line-cite chết) · F-6 (Gotchas 84→85) · vế `:91 "89 bảng"` trong F-3.
**XOÁ:** 0 — không skill/vai/plugin nào biến mất.
**Đánh giá nhịp:** closeout S162 đóng **4.5/10**. Phần treo lại tụ về **cùng 1 hình dạng — partial-landing**: vá site-A quên site-B **trong cùng file** (ef-core `:3` vs `:19` · STATUS `:6` vs `:479` · permission-matrix prose vs cây · README `:27` vs `:242`). **4/4 finding lớn phiên này đều cùng lớp đó.** Cách vá bền: sửa 1 mệnh-đề thì grep **chính mệnh-đề đó** (không phải con số) trên toàn file rồi mới đóng.

### F-8 (MED) — `.claude/skills/README.md:20` vẫn khai hợp-đồng CŨ

`| ef-core-migration | … migration history (**mới nhất → row cuối bảng skill**; số → docs/STATUS.md) |` — ngược frontmatter `SKILL.md:3` đã vá S158. Cùng cặp với F-3, vá 1 lượt cả 2.

### F-9 (MED) — `permission-matrix/SKILL.md` cây menu còn module đã CHẾT + thiếu 3 họ key sinh sau

- `:60-63` liệt `Budgets (root, NO inherit)` + `Bg_List` / `Bg_Create` / `Bg_Pending` như đang sống, trong khi `:26` cùng file đã có bia-mộ 🧊 (Mig 50, S61 XOÁ) và `MenuKeys.cs` chỉ còn comment bia-mộ.
- `grep -c "Khkk_\|Hdc_"` = **0** · `KeHoachKyKet` = **0 hit** — 3 họ key sinh sau S122 (KHKK GĐ2 · HĐ-cứng GĐ4 · `Ct_*_{WfView,Approved,Deleted}`) chưa vào skill.
- **Y NGUYÊN đề-xuất S162** (chưa thi hành): 🧊-hoá `:60-63` + thêm 3 họ key + trỏ gotcha #82/#84. ⚠️ **KHÔNG** nhét lại số menu/policy — `:3` đang theo B1 đúng; nhét số vào là đi lùi.

---

## 🔌 NEW-ALLOC AUDIT @open — 0 ACTION

- Skill mới chưa phân bổ: **0** (6 project + 23 user-global, 0-delta vs S162).
- Plugin mới chưa phân bổ: **0** (18/15/3 + marketplace 37, 0-delta).
- Vai mới cần cấp skill: **0** (skill-matrix phủ 23/23).
- Ứng viên treo (KHÔNG tự bật, quyền owner): `security-guidance` (marketplace) — mang hook Stop + edit-time warning đụng `settings.json hooks`; giữ nguyên trạng thái đề-xuất từ S143, **không leo thang**.

---

## VERDICT

**H1 @open S163 = PASS_WITH_FLAGS — 9 finding** (① 4: F-3/F-5/F-8/F-9 · ② 1: F-1 · ③ 0 · ④ 3: F-2/F-6/F-7) + 2 INFORM (P1 plugin-unassigned · D1 counter-lag) + **1 BÁC dương-giả** (F-4: `contract-workflow` KHÔNG stale nội-dung — `:449`/`:456`/`:457` đã có GĐ2 KHKK, GĐ4 HĐ-cứng, cây 4-folder S162).

- **Nặng nhất: F-6 (HIGH)** — canonical `STATUS` tự stale (Gotchas 84 vs đĩa 85, sinh @S162). Nặng vì mọi derived đều trỏ về nó.
- **Kế: F-2 (HIGH)** — `CLAUDE.md` vắng nguyên module `ContractSigningPlans` (7 bảng, Mig 69) trong bảng Modules; file này auto-inject mọi phiên + mọi sub-agent.
- **F-1 (MED)** xác nhận nghi-vấn HANDOFF NEXT-em #5: `agents/README.md:242` liệt **20/23** tên + "10 monitor" (thật **13**). `hmw.js` — thứ CÓ RĂNG — ĐÚNG 23 ⇒ drift chỉ ở doc, không hỏng runtime.
- 4 mặt: ① PASS_WITH_FLAGS · ② PASS_WITH_FLAGS · ③ **PASS** · ④ PASS_WITH_FLAGS.
- Tuân thủ: 0 file bị sửa ngoài sub-file này. G-015 — `Bash` vẫn mở ⇒ **không tự nhận "read-only enforced"**; containment thật = em main single-writer + git-diff commit-gate.

END tooling-auditor-open-S163 — VERDICT=PASS_WITH_FLAGS — TOTAL=9 finding — COVERAGE=4/4 mặt
