# sub-tooling-4 — H1 tooling/docs freshness CHỐT @session-end S143 (2026-07-22)

> Ghi-đĩa TRONG-lúc-làm (chống #53). Propose-only. Lead = single-writer.
> HEAD `c4903dd`. Wave S143 = 5 commit `2757e41 3f4310f 36cefcc 39cc060 c4903dd` (base `b146e2b`).

## Ground-truth disk (đo lúc chạy)
- `.claude/agents/*.md` = **18 file** = **17 persona + README.md** ✓ (roster 17 khớp yêu-cầu "giữ 17 vai")
  - cicd-monitor · database-agent · frontend-designer · harness-audit · harness-eval · harness-refine · harvest-curator · implementer-backend · implementer-frontend · investigator-api · investigator-codebase · lead-omission-auditor · lead-view-auditor · office-document · reviewer · test-specialist · tooling-auditor
- `.claude/skills/` = 6 project skill + README.md (0 đổi; `git log -- .claude/skills/` last-touch = `a09dcae`, TRƯỚC wave S143)
- `~/.claude/skills/` = 23 standalone
- `.claude/commands/*.md` = 18

## VERDICT: DRIFT-FOUND (4) — ①PASS(+1 LOW carry) · ②PASS · ③DELTA-2 · ④DRIFT-2

| Mặt | Trạng-thái | Cần-update |
|---|---|---|
| ① skill | **PASS** | 0 đổi S143. 1 LOW carry monthly-lane (ef-core `:307` Mig-66→67) |
| ② sub-role | **PASS** | 0 — 17=17=17=17 khớp 4 nguồn, 4 site vá S143 verified-landed |
| ③ plugin/config | **DELTA-2** | F-C settings model pin flip chưa ghi sổ · F-D marketplace 35→37 |
| ④ docs | **DRIFT-2** | F-A dòng-nợ 3→4 vế (7 site) · F-B enum 10→11 (3 site, 1 FUNCTIONAL) |

## ① SKILL — PASS
- `.claude/skills/` **6 project** (contract-workflow · form-engine · permission-matrix · dependency-audit-erp · ef-core-migration · iis-deploy-runbook) + README.md. `git diff b146e2b..HEAD -- .claude/skills/` = **RỖNG** ⇒ 0 skill đụng trong wave S143.
- SKILL.md mtime: contract-workflow 24452B (05-08) · dependency-audit-erp 5551B (06-18) · ef-core-migration 32914B (07-14) · form-engine 5450B (04-30) · iis-deploy-runbook 14688B (06-25) · permission-matrix 7864B (07-15).
- `~/.claude/skills/` = **23 standalone** (algorithmic-art…xlsx) — IDENTICAL baseline S140, 0 mới.
- Map-vai: `agents/README.md:179-185` skill-matrix có **đủ 17 row** (vá S143 `2757e41` "skill-matrix 15→17" — verified: 3 row trio `:183-185` + 2 row H24 `:181-182` present) ✓
- 🔸 LOW (carry, monthly-lane): `.claude/skills/ef-core-migration/SKILL.md:307` còn "§16+ **Mig 27-66** detail pending" trong khi canonical = **Mig 67** (S133, 2026-07-17). Owner = audit đầu-tháng `CLAUDE.md:113` **2026-08-01**, KHÔNG phải drift-mới của S143.

## ② SUB-ROLE — PASS (17 khớp 4/4 nguồn)
| Nguồn | Số | Bằng-chứng |
|---|---|---|
| disk | 17 | `ls .claude/agents/*.md` = 18 file − README.md |
| `docs/STATUS.md:450` | **17** | cột giữa row `Sub-agents` (canonical B1) |
| `hmw.js:22-40` VALID_ROLES | 17 | 17 chuỗi role, +3 trio `:36` |
| `.claude/agent-memory/` | 17 folder | 18 entry − `memory-budget.json`; khớp `README:237` "17 folder" |
- 4 site vá S143 **VERIFIED-LANDED**: `README:27` (Roster THẬT nay liệt đủ 12 tên + trỏ canonical, KHÔNG số) · `README:225` (VALID_ROLES + "7 monitor") · `README:190` + `STATUS:450` (đã reword "NO Write/Edit" = **tuyên-bố ý-định**, containment thật = single-writer + git-diff) ✓
- Trio frontmatter đồng-nhất `model: opus` + `effort: max` + `memory: project` + `maxTurns: 18` + 8 tool read-only (3/3 file `:5-9`) — khớp mô-tả `STATUS:450`.
- Nấc trio: `STATUS:450` + `HANDOFF:5` + `:7(1)` đều khai **"CHƯA spawn lần nào / verified-pending-restart"** — **KHÔNG có site nào lỡ khai đã-chạy/verified-runtime** (grep `verified-runtime|đã chạy|spawn-probe` trên commands/ + agents/README + STATUS + HANDOFF: 0 hit gán cho trio) ✓
- 0 vai thừa/idle/scope-drift: 7 monitor đều có ranh khai tường-minh (H1⟂H2⟂H24×2⟂trio×3) `README:227` + `:129-133`.

## ③ PLUGIN/CONFIG — 18/15/3 PASS nhưng **2 DELTA config chưa ghi sổ**
- `~/.claude/settings.json` `enabledPlugins` = **18 registered / 15 enabled / 3 disabled** (`pr-review-toolkit` · `code-modernization` · `hookify`) — **IDENTICAL** baseline S125→S140, 0 đổi.
- Nấc báo đúng: installed 18 → enabled 15 → assigned (bảng `README:199` + skill-matrix) → used (per-session). KHÔNG conflate.
- `pull_warn_days` **KHÔNG ghost-wire** ✓: script `:187-192` ĐỌC key (`$cad.pull_warn_days`), key CỐ Ý vắng trong `memory-budget.json` ⇒ degrade INFORM đúng thiết kế; khớp `HANDOFF:7(2)` carry chờ anh đặt số.
- → xem **F-C** (model pin) + **F-D** (marketplace 35→37).

## ④ DOCS — DRIFT-2 (F-A + F-B), phần còn lại PASS
- `CLAUDE.md:105/:113/:136` "6 skill" + audit kế 2026-08-01 ✓ khớp disk.
- `STATUS.md:462` + `HANDOFF.md:5` (row S141–S143) mô-tả wave: roster 14→17 ✓ · vế-4 `pull-cach` ✓ · `flag_classes` 10→11 ✓ · trio chưa-spawn ✓ · 5 commit ✓ — **phản-ánh ĐÚNG + KỊP**.
- `agents/README.md:190/:225` G-015 wording ✓ (đã hạ "read-only enforced" xuống "ý-định").
- Drift còn lại = F-A (dòng-nợ) + F-B (enum) dưới.

## FINDING sống (cập-nhật dần)
### F-A [dòng-nợ 3-vế → 4-vế] — script đã 4 vế, doc prescriptive còn "3-vế"
Script `scripts/nhip-no-probe.ps1:201` in **4 đoạn**:
`NHIP-NO: kiem {0} | {1} | {2} | {3}` với vế-4 = `pull-cach N ngay` (`:162-198`), header `:22` khai đủ 4 vế.
Site PRESCRIPTIVE (mô-tả hành-vi SỐNG) còn "3-vế" — ứng-viên DRIFT:
- `.claude/commands/pause.md:44`
- `.claude/commands/session-end.md:57`, `:63` (khuôn do-record), `:101`
- `.claude/commands/session-start.md:213`
- `.claude/commands/tiep.md:112`
- `docs/governance/session-model-se-draft.md:34` (bảng "NHIP-NO probe 3-vế")
Site FROZEN-IN-TIME (KHÔNG drift — record lịch-sử): `runs/2026-07-17-*`, `spec-adap-*`, `adap-reports/*`, `docs/changelog/sessions/*`, `STATUS.md:482` (mục lịch-sử S135-S136), `HANDOFF.md:13` (Prev-block).
- error-ledger carve-out `:49` nói "dòng-nợ read-only vẫn IN ở MỌI điểm dừng" — KHÔNG khai số vế ⇒ **KHÔNG stale** ✓
- `docs/governance/harness-11-engine.md` — grep `nhip-no|dòng-nợ|vế` = **0 match** ⇒ KHÔNG stale ✓

### F-B [enum `flag_classes` 10→11] — doc-sync CHƯA xong, 1 site FUNCTIONAL 🔴 HIGH
Live: `memory-budget.json:129` = **11 class** = 5 `view-*` + **6** `gap-*` (`view-stale-count/status/header/role-desc` · `view-residual-asym` · `gap-carry-dropped/aged/owner-specifics/decision-sunk/underfill` · **`gap-incident-unrecorded`** mới).
`git show --stat 36cefcc` (commit MỞ enum) đụng `memory-budget.json` + `agents/README.md` + STATUS + HANDOFF — **KHÔNG đụng `.claude/agents/lead-omission-auditor.md`**.

🔴 **B-1 FUNCTIONAL (HIGH) — `.claude/agents/lead-omission-auditor.md`** = ĐÚNG cái vai phải DÙNG class mới, mà bản-sao-cục-bộ của enum vẫn 5:
- `:29` heading `## 5 class của mày — enum ĐÓNG`
- `:35-39` bảng **chỉ 5 row** — `gap-incident-unrecorded` **VẮNG MẶT hoàn toàn** (grep tên class trên toàn `.claude/agents/`: 0 hit)
- `:41` "broadcast liệt 5 dấu-hiệu, **enum có 5 class**"
⇒ **ghost-enum kiểu H18 "defined-but-unread"**: class có trong JSON nhưng consumer duy-nhất không thấy. Vai lại bị luật "CẤM tự chế class" ⇒ lần tới gặp ca incident-unrecorded nó sẽ **escalate lại đúng thứ vừa được duyệt**, hoặc ép vào class sai. Bản-sao-cục-bộ (có cột ngữ-nghĩa + cột nơi-soi) THẮNG con-trỏ `:31` trong thực-dụng — nên đây KHÔNG phải nit trình-bày.
- ⚠️ ăn thẳng vào chính vụ vừa xảy ra: `WAL:29` INFORM-3 ghi "sub xin anh MỞ ENUM… nó KHÔNG tự bịa" — cơ-chế escalate chạy đúng, nhưng vòng lặp chưa khép vì bước ghi-lại-vào-persona bị bỏ.

**B-2 (MED) `docs/STATUS.md:450`** — 2 chỗ trong CÙNG row canonical:
- "`lead-omission-auditor` = cái BỊ THIẾU (**5 class** `gap-*`)" → phải 6
- "flag_classes … (**10 class = 5+5**, vai CẤM tự chế)" → phải 11 = 5+6

**B-3 (MED) `.claude/workflows/hmw.js:33`** (comment cạnh VALID_ROLES) — "flag_classes (**10 class: 5 view-\* + 5 gap-\***)".

**Sạch ✓ (đã trỏ key, KHÔNG chép số — B1 đúng):** `session-start.md:117` · `:211` · `session-end.md:103` · `ultra-on.md:25` · `agents/README.md:227` · `docs/governance/harness-11-engine.md` (0 match) · `scripts/*.ps1` (0 match) · `lead-view-auditor.md:39/:41` ("5 class" vẫn **ĐÚNG** — nhánh `view-*` không đổi; **KHÔNG được "sửa" thành 11**, nó chỉ nói phần của nó).

### F-C [lead-model pin flip KHÔNG ghi sổ] — MED, mặt ③→④
- `~/.claude/settings.json:11` = **`"model": "claude-opus-4-8[1m]"`** (`:37` `effortLevel: xhigh` giữ). mtime = **2026-07-20 13:38:37**, size 1615B. Baseline mọi phiên trước (S125→S140 diary + `STATUS:345` + `STATUS:374`) = `claude-fable-5[1m]`.
- ⇒ pin **owner-choice**, KHÔNG outage: `.claude/WAL.md:9` phiên này `wf: fable-real gate … model=claude-fable-5` ⇒ Fable VẪN resolve được qua spawn-param. Đúng khuôn MTv3 "owner-chọn-hạng-hai ≠ outage → 0 caveat / 0 revert".
- 🔴 Nhưng **nghĩa-vụ ghi-sổ chưa làm** (`session-start.md:39` "đổi giữa phiên OK, **ghi 1 dòng session-record**" + `:47` "Flip-record gắn nhãn {owner-choice|outage}"):
  - `STATUS.md:462` row S141–S143 = **row DUY NHẤT không có dòng `Lead <model>`** — so `:468` (S140 "Lead Fable 5 (owner-choice flip mới, MTv3 0-caveat)") · `:489` · `:503` · `:515` · `:532` · `:543` · `:554` đều có.
  - `STATUS:450` canonical §Sub-agents còn câu hiện-hành *"Lead = frontier-class owner-choice per-session: **em main Fable 5 (1M) Max**"* — mâu-thuẫn settings hiện-tại.
  - `session-start.md:43` outage-path còn hardcode lỗi `"Model isn't available — claude-fable-5[1m]"` → fallback **`/model claude-opus-4-8[1m]`** = **bảo đổi sang đúng cái đang pin** ⇒ recipe hồi-phục thành no-op.
- Đề-xuất (quyền anh): (a) +1 dòng flip-record vào row S141–S143 `{owner-choice}` — nhãn nào là quyền anh, đừng đoán; (b) `STATUS:450` đổi câu hiện-hành thành trỏ-runtime-probe thay vì tên model cứng; (c) `session-start.md:43` viết outage-path **đối-xứng 2 chiều** (down model nào → sang model kia) thay vì cứng 1 hướng.

### F-D [marketplace 35 → 37] — LOW, lớp-đo bị bỏ sót
- `~/.claude/plugins/marketplaces/claude-plugins-official/plugins` = **37 dir** (baseline diary S125 = 35). 18 registered ⊂ 37 (`REGISTERED-NOT-IN-MK` = **rỗng** ⇒ 0 plugin mồ-côi).
- 19 available-not-registered: `agent-sdk-dev` `clangd-lsp` `code-simplifier` `cwc-makers` `example-plugin` `gopls-lsp` `jdtls-lsp` `kotlin-lsp` `lua-lsp` `math-olympiad` `mcp-tunnels` `php-lsp` `project-artifact` `pyright-lsp` `ralph-loop` `ruby-lsp` `rust-analyzer-lsp` `security-guidance` `swift-lsp`.
- KHÔNG quy được "2 cái nào mới": **toàn bộ 37 dir cùng mtime `2026-07-17 13:51:45`** = refresh/re-clone cả cây ⇒ mtime mất giá-trị phân-biệt.
- 🔴 Tự-soi: các phiên trước (gồm chính tôi @S140 "③PLUGIN PASS 18/15/3 IDENTICAL") chỉ đo **lớp registered/enabled**, KHÔNG đo **lớp marketplace-inventory** ⇒ +2 sống ≥5 ngày không ai thấy. Cùng họ với bài `commands/*.md` blind-spot (S57/S99/S126): sweep liệt consumer thiếu MỘT LỚP thì miss tái-sinh.

## 🔌 NEW-ALLOC audit (skill/plugin mới chưa phân-bổ)
- **Skill: 0 mới** (6 project + 23 standalone identical) ⇒ 0 alloc-action.
- **Plugin enabled: 0 mới** (18/15/3 identical) ⇒ 0 alloc-action trên lớp enabled.
- **Marketplace available (F-D) — 3 ứng-viên đáng cân-nhắc, 16 SKIP:**
  | Plugin | Đề-xuất | Lý-do |
  |---|---|---|
  | `security-guidance` | **CÂN-NHẮC** — gán `reviewer` (+ `cicd-monitor` lớp commit) | "injection, XSS, SSRF, hardcoded secrets" — trùng lane authz/secret mà S118 #82 (`feedback_permission_grant_two_layers`) vừa cho thấy em-main-solo hay sót; ⚠️ nó có **hook Stop + edit-time warning** ⇒ đụng `.claude/settings.json` hooks (đang chỉ có `wal-flush.ps1`) ⇒ **anh quyết**, KHÔNG tự bật |
  | `code-simplifier` | **SKIP (yếu)** | trùng lane `reviewer` + `implementer-*`; SE đã có luật rules.md, thêm agent = phình roster (floor H3 "gộp-vai KHÔNG phình") |
  | `project-artifact` | **SKIP** | status-page generator — SE đã có `STATUS.md`/`HANDOFF.md` + `session-report` plugin đang enabled |
  | 16 còn lại | **SKIP** | 9 LSP ngôn-ngữ ngoài stack (.NET/TS đã có `csharp-lsp`+`typescript-lsp` enabled) · `example-plugin`/`math-olympiad`/`cwc-makers`/`ralph-loop`/`mcp-tunnels`/`agent-sdk-dev` = ngoài lãnh-địa SE |
- 3 vai trio `harness-{eval,refine,audit}`: skill-matrix `README:183-185` đã gán ref-only đúng (đọc output `measure-agent-memory`/`mfe-eval`/`memory-archive-gate`/`crystallized-backfill`/`nhip-no-probe`) ⇒ **0 alloc-gap**.

## 📌 Method-note (cho lần sau)
1. **Đổi 1 giá-trị trong file-CONFIG ⇒ grep MỌI bản-sao-cục-bộ của enum đó trong PERSONA**, không chỉ doc-tóm-tắt. Enum đóng có 2 bản: JSON (authoritative) + bảng-trong-persona (thứ vai thật-sự đọc). Sync 1 nửa = mở enum trên giấy.
2. **Marketplace-inventory là lớp ĐO RIÊNG** với enabledPlugins — từ nay đếm cả 2 (`ls …/marketplaces/*/plugins | wc -l` + settings) mới được kết "③ PASS".
3. Prescriptive ⟂ frozen-in-time: chỉ vá nhóm prescriptive; sửa record lịch-sử = giả-mạo (lead đã xác nhận cách tách này đúng @S143).
