# H1 tooling-auditor — S144 session-start RE-REPORT

- **Phiên:** S144 (2026-07-22) · **HEAD:** `d5656ab` (wal flush) · baseline so sánh = S143
- **Vai:** tooling-freshness 4 mặt · INFORM-only · propose-only (lead = single-writer)
- **Giao-thức #53:** ghi đĩa NGAY khi tìm ra từng phát-hiện. File này = nguồn thật; return chỉ là tóm-tắt.
- **Model self-report:** Opus 4.8 (`claude-opus-4-8`)

---

## Đo thô (ground-truth từ đĩa)

| Lớp | Số | Nguồn |
|---|---|---|
| skill project | 6 | `ls .claude/skills/` (trừ README.md) |
| skill standalone | 23 | `ls ~/.claude/skills/` |
| command-file | 18 | `ls .claude/commands/*.md` |
| agent persona | **17** | `ls .claude/agents/*.md` = 18 file − README.md |
| plugin registered | 18 | `~/.claude/settings.json` enabledPlugins |
| plugin enabled | 15 | 18 − 3 false |
| plugin disabled | 3 | pr-review-toolkit · code-modernization · hookify |
| marketplace | 37 | `~/.claude/plugins/marketplaces/claude-plugins-official/plugins` |

Git working tree: chỉ `M .claude/governance/.session-counter.json` + `?? .claude/scheduled_tasks.lock` (untracked lock).

---

## ③ PLUGIN — PASS (0 delta)

- 18 registered / 15 enabled / 3 disabled — **IDENTICAL S143**, 0 install/enable/disable mới.
- Marketplace **37** — bằng số S143 đã đo (S143 bắt delta 35→37; nay đứng yên) ⇒ 0 skill/plugin MỚI cần phân-bổ.
- `settings.json:11` `"model": "claude-opus-4-8[1m]"` — lead pin GIỮ NGUYÊN so S143.
- `effortLevel: xhigh` (:39) không đổi.
- Nấc báo: installed 18 → enabled 15 → assigned (theo skill-matrix agents/README) → used. KHÔNG conflate.

**⇒ new-alloc: 0 action.** Không có plugin/skill mới rơi vào giỏ chưa-phân-bổ.

---

## 🔴 F-1 (MED) — `/sleep-recovery-memory-l2` bỏ sót trio: cùng lớp "ghost-enum" S143

**File:** `.claude/commands/sleep-recovery-memory-l2.md` — 3 site sai, 1 site đúng-đừng-đụng.

Roster 14→17 (+trio `harness-eval`/`harness-refine`/`harness-audit`, land S142) nhưng command này chưa theo.

| Site | Text hiện tại | Thực tế đĩa |
|---|---|---|
| `:37` | regex loại-trừ `^(tooling-auditor\|harvest-curator\|lead-view-auditor\|lead-omission-auditor)$` | chạy THẬT hôm nay → **13 tên**, gồm cả 3 trio |
| `:40` | "Hiện-hành = …" liệt-kê đúng **10 tên** | mâu-thuẫn `:37` (13) — 2 dòng cạnh nhau đá nhau |
| `:42` | "**4 monitor** INFORM-only KHÔNG vào `all`" | 7 vai INFORM-only (4 + trio) |
| `:58` | "`all` → **9 sub** có-ký-ức SE" | sai từ TRƯỚC trio: `:43` (vá S122) tự khai con số 9 là stale, sửa `:40`→10 nhưng **quên `:58`** ⇒ nay lệch kép |

**Bằng chứng trio cùng lớp monitor** — `.claude/agents/harness-eval.md:4`: *"Read-only INFORM-only … Propose-only, single-writer = lead. KHÔNG store_memory, KHÔNG Write/Edit"* → đúng tiêu-chí loại-trừ như 4 vai kia.

**Vì sao MED không HIGH (hiệu-ứng hiện chỉ tiềm-ẩn):** trio CHƯA có `archive/` — chỉ `MEMORY.md` ~1.5KB mỗi vai (`ls` xác nhận; `memory-budget.json:159-161` `l2_verbatim: 0`, rollout "no archive"). Phase 0.2 guard-rỗng sẽ skip ⇒ chạy `all` hôm nay **chưa hỏng**. Nhưng khi trio có archive đầu tiên, `all` sẽ nuốt chúng **không ai quyết**.

**Site KHÔNG được sửa (đừng vá nhầm):** `:45` "Ghi-chú S122 … đếm 16 thay vì 14" = ghi-chú CÓ NGÀY, record lịch-sử → **frozen-in-time, sửa = giả-mạo** (luật prescriptive⟂frozen S143). `:44` "đo S71: 4" cũng vậy.

**Đề-xuất (lead quyết):** thêm 3 tên vào regex `:37` + sửa `:40` (giữ 10) + `:42` "4 → 7 monitor" + `:58` bỏ số cứng, trỏ "quét đĩa". 🔴 Nhưng **"trio có thuộc diện loại-trừ không" = quyết-định owner**, không phải tao suy ra — tao chỉ chứng minh 4 site đang tự mâu-thuẫn.

### F-1 đắt ở chỗ này: đúng bản vá S143, sót đúng 1 file

`runs/2026-07-22-S143-closeout-audit/sub-reviewer-0.md:250` ra lệnh: *"Vá `agents/README.md:225` (thêm 3 trio + **'4 monitor'→7**)"*. Bản vá ĐÃ LÀM — `README.md:225` nay đọc *"Cả **7 monitor** đều INFORM-only"* ✅. Nhưng **cụm chữ y hệt** ở `sleep-recovery-memory-l2.md:42` không ai sờ tới.

⇒ Không phải drift mới sinh, mà là **same-class-miss của chính bản vá vừa rồi** — trùng khuôn S126 (sweep liệt-kê consumer thiếu một lớp) và khuôn S143 F-B (ghost-enum). Lớp `.claude/commands/` lại là chỗ sót, **lần thứ 3** (S57 · S99 · S126 đều bắt ở đây).

**Luật rút cho lần sau:** vá một CỤM CHỮ ⇒ grep chính cụm chữ đó toàn repo, đừng vá theo danh-sách-site do phiên trước liệt-kê.

---

## ① SKILL — PASS_WITH_FLAGS (1 drift thật, 1 dương-giả)

6 project + 23 standalone + 18 command = **0 thêm/bớt/đổi tên** vs S143. `git diff` thư-mục `.claude/skills/` từ S142 tới HEAD = **rỗng**. Map vai: skill-matrix `agents/README` đã vá 15→17 @S143 ✅.

### 🔴 F-2 (MED) — `ef-core-migration` tự nhận là nguồn "mới nhất" rồi để lỡ Mig 67

- `.claude/skills/ef-core-migration/SKILL.md:19` tự khai: *"Migration history (số hiện tại → `docs/STATUS.md` canonical; **mới nhất = row cuối bảng**)"* — tức file này **tự nhận quyền** trả lời "mig mới nhất là gì".
- Row cuối bảng = `:88` **Mig 66** `AddPeApprovedPriceRange`.
- Đĩa: **67** migration (`ls Persistence/Migrations/*.cs` trừ Designer/Snapshot), mới nhất `20260717032812_AddPeApprovedBudgetSnapshot` = **Mig 67**, land S133 (2026-07-17, 5 ngày trước).
- `grep "67\|ApprovedBudgetSnapshot"` trong SKILL.md → **0 hit**. Mig 67 vắng mặt hoàn toàn.
- Site khác đã ĐÚNG: `CLAUDE.md:62` có "12,13,15,49,50,52-61,**65-67**" + tả Mig 67 đầy đủ ⇒ **chỉ mình skill tụt lại**.
- Lây sang `.claude/skills/README.md:20`: nhãn *"✅ Updated S117 … Mig 66 … row added"* nay cũng cũ.

🔴 **Bài học đáng giữ:** B1 (derived-trỏ-canonical) áp ĐÚNG cho *con số* — nhưng file vẫn ôm nhiệm-vụ thứ hai ("mới nhất") mà không bảo-trì. **Trỏ-được-một-nửa nguy hơn không trỏ**: người đọc thấy có anti-drift banner rồi tin cả dòng.

**Đề-xuất:** thêm row Mig 67 vào bảng + cập nhãn `skills/README:20`.

### F-3 (LOW — tao xếp DƯƠNG-GIẢ, đừng vá số)

Detector flag `form-engine/SKILL.md:15` anchor `2026-04-30` (83 ngày). **Tao kiểm nội-dung, không kiểm tuổi** — và 2 claim của nó vẫn ĐÚNG hôm nay:

| Claim SKILL.md | Kiểm chứng |
|---|---|
| "Missing: loop `{{#loop}}` cho table lặp" | `src/Backend/SolutionErp.Infrastructure/Forms/DocxRenderer.cs:10` — *"Không support `{{#loop}}...{{/loop}}` (table lặp)"* ⇒ vẫn chưa làm ✅ |
| "Export PE phiếu PDF (Phase 9 carry over)" | `CLAUDE.md:62` cuối dòng — *"Export PDF pending"* ⇒ vẫn pending ✅ |

⇒ **Tuổi ≠ ôi**. Skill này cũ vì mảng nó tả **thật sự không đổi**, không phải vì bị bỏ quên. Vá ngày tháng cho detector im = đúng nghĩa Goodhart (rời tập-đo mà không sửa gì thật). Đề-xuất: **giữ nguyên**, hoặc chỉnh detector đo nội-dung thay vì đo tuổi.

`contract-workflow/SKILL.md` (last-touch 2026-05-08): các số trong đó là **Mig 16/18-20 lịch-sử phase 9** — record quá-khứ, không phải claim hiện-hành ⇒ frozen, **không vá**.

---

## ② ROSTER — PASS (17 = 17 = 17 = 17 = 17, khớp 5 nguồn)

| Nguồn | Số | Bằng chứng |
|---|---|---|
| đĩa `.claude/agents/*.md` | **17** | 18 file − `README.md` |
| `docs/STATUS.md:450` | **17** | row `\| Sub-agents \| **17** \|` |
| `hmw.js:22-39` VALID_ROLES | **17** | đếm phần tử: 10 product + 4 monitor + 3 trio |
| `agents/README.md:225` | **17** | liệt-kê TÊN, đếm ra 17 + "Cả 7 monitor" |
| `.claude/agent-memory/*/` | **17** | 1 dir/vai, đủ cả trio |

**Đợt vá S143 giữ được:** `README:27` "Roster THẬT" nay có đủ 🧪×3 trio ✅ · `README:225` VALID_ROLES đủ 17 + "7 monitor" ✅ · `README:3` + `:5` dùng con-trỏ B1 **không chép số** ✅ · `hmw.js:33` "11 class = 5 view-* + 6 gap-*" ✅ · `hmw.js:44` "17/17 frontmatter" ✅ · `session-start.md:97` + `session-end.md:152` liệt-kê NHÓM "10 product/quality + (H1 · H2 · 2×H24 · **3×trio-memory**)" ✅.

**Grep 2 chiều (theo yêu-cầu, chống bẫy S143):** theo SỐ (`roster 14|14/14|14 vai|4 monitor|10 product`) **và** theo TÊN (`lead-view-auditor` có mà `harness-eval` vắng ⇒ nghi-can). Phép theo-TÊN chính là cái lôi F-1 ra — phép theo-SỐ **không bắt được `:37`** vì regex đó thuần tên. Xác nhận lại bài S143: **grep-theo-SỐ một mình là không đủ.**

Còn lại toàn bộ hit "14" đều nằm ở **record lịch-sử** (session-log · adap-report outbox · run-folder S143 · `auto-memory/project_*` mô-tả mốc S124) ⇒ **frozen-in-time, KHÔNG vá**.

---

## ④ DOCS — PASS_WITH_FLAGS

### Số canonical vs đĩa — tao đo lại, KHÔNG chép mồi lead

| Hạng mục | STATUS ghi | Tao đo tươi | Kết |
|---|---|---|---|
| Migration | Mig 67 | `ls Persistence/Migrations/*.cs` trừ Designer/Snapshot = **67**, mới nhất `20260717032812_AddPeApprovedBudgetSnapshot` | ✅ |
| gotcha | 83 | `grep -c "^### [0-9]" docs/gotchas.md` = **83** | ✅ |
| Test | `:446` 528 PASS (45 Domain + 483 Infra, 0 fail/0 skip) | 45+483 = **528** cộng khớp; commit code cuối `6664a61` (2026-07-17) ghi 520→528, S141–S143 governance-only 0 code ⇒ nhất-quán | ✅ |
| Bảng | 89 | Mig 67 = snapshot-AddColumn **no new table** ⇒ 89 giữ, count-invariant | ✅ |
| Roster | 17 | khớp 5 nguồn (mặt ②) | ✅ |
| menu | 54 | 🔸 **tao KHÔNG kiểm được** — cần DB/seed runtime, ngoài tầm read-only của tao. Khai thẳng là **chưa verify**, không tick bừa |

`docs/HANDOFF.md:5` stamp **2026-07-22 (S141–S143)**, phản-ánh đúng roster 14→17 · test 528 · 0 mig · bundle FROZEN + 14 carry + NEXT-anh đánh số ⇒ **kịp-thời** ✅.

### 🔴 F-4 (MED · CARRY-OPEN từ S143 F-C, KHÔNG phải phát-hiện mới) — nhãn lead-model

Sự thật đĩa: `~/.claude/settings.json:11` = `"model": "claude-opus-4-8[1m]"`.
Ô canonical `docs/STATUS.md:450` §Sub-agents vẫn viết: *"em main **Fable 5 (1M) Max**"*.

**Kết quả sweep prescriptive (4 site, tao đọc từng dòng — chỉ 1 site sai):**

| Site | Nội dung | Phán |
|---|---|---|
| `docs/STATUS.md:450` | "em main Fable 5 (1M) Max" = khẳng-định trạng-thái HIỆN-HÀNH | 🔴 **STALE** |
| `.claude/commands/session-start.md:43` | outage-recipe: lỗi `claude-fable-5[1m]` → fallback `/model claude-opus-4-8[1m]` | 🔴 **NO-OP** — bảo đổi sang đúng cái đang pin |
| `.claude/commands/session-start.md:41` | "Lead = frontier-class ANH CHỌN per-session **{Fable 5 \| Opus 4.8}**" | ✅ ĐÚNG — đây là **thực-đơn lựa-chọn**, không phải khẳng-định hiện-trạng |
| `.claude/agents/README.md:5` | "Lead runtime = per-session owner-choice (Fable ↔ Opus); flip-chain canonical → STATUS §Sub-agents" | ✅ ĐÚNG — con-trỏ B1, không chép nhãn |
| `docs/governance/fable-real-runbook.md:499` | `LEAD_MODEL` = `claude-fable-5[1m]` **HOẶC** `claude-opus-4-8[1m]` (probe per-session) | ✅ ĐÚNG — spec biến, liệt kê cả 2 trị |

🔴 **Đảo chiều đáng ghi:** thường drift chảy canonical → derived. Ở đây **NGƯỢC**: 3 site derived viết theo lối "owner-choice / con-trỏ" nên **sống sót cú flip mà không cần sửa gì** — đúng như B1 thiết kế. Chính **ô canonical** là chỗ tụt lại. Hệ quả: mọi con-trỏ trỏ về `STATUS §Sub-agents` giờ **resolve ra câu trả lời sai**, dù bản thân con-trỏ viết đúng.

⇒ Bài: B1 chống được drift-lan-toả, **không** chống được canonical-tự-ôi. Ô canonical cần chính nó có nguồn đối-chứng (ở đây = `settings.json`).

**Tao KHÔNG tự quyết** — nhãn flip {owner-choice | outage} là quyền anh (chính `session-start.md:43` quy định vậy). Tao chỉ nộp: 1 site sai + 1 hệ-quả no-op + 3 site đã miễn-nhiễm.

### F-5 (LOW — đo-sống ghi thành số-chết, KHÔNG nên đuổi theo)

`docs/STATUS.md:451` ghi RAG chunks **2441** (mốc S126). Tao gọi `list_projects` đo tươi: `solution_erp.chunk_count` = **2446** (+5).

Nhưng cùng dòng đó tự khai `last_indexed 05-29` (stale) + "store_memory stopgap" — và `last_indexed_at` trả về đúng `2026-05-29T23:26:13` ⇒ **không hề có re-index nào**. +5 chunk = 5 lần lead ghi memory từ S126 tới nay. Tức con số này **tăng đều theo hoạt động bình thường**: 2429 (S80) → 2441 (S126) → 2446 (nay).

⇒ **Lành, không phải drift.** Đây là **bộ-đếm SỐNG bị chép thành row TĨNH** — stale ngay khoảnh-khắc sau khi ghi, và sẽ stale lại sau mỗi lần vá. Cùng lớp với ca S140 tao từng bắt ("183KB un-gisted" ghi cứng trong 3 command-file). Đề-xuất đúng: **dán nhãn mẫu-có-ngày** ("2446 @2026-07-22") thay vì đuổi số. 🚧 Re-index = lãnh-địa AI_INFRA/cicd — **ngoài ranh tao**, không đề-xuất.

### F-6 (LOW · vệ-sinh) — `.claude/scheduled_tasks.lock` lọt lưới `.gitignore`

- `git status` untracked; `git log -- <file>` rỗng ⇒ **chưa từng tracked**.
- Nội dung = state runtime thuần: `{"sessionId":"365dd935-…","pid":66104,"procStart":…,"acquiredAt":…}` — vô nghĩa với repo, đổi mỗi lần chạy.
- `.gitignore` có `!.claude/**` (re-include) + các dòng loại-trừ đặt SAU cho `hmw-mode.on` `:87` / `fable-real-mode.on` `:92` / `wave-*` `:105` — **nhưng không có dòng nào cho `scheduled_tasks.lock`**; `:17-18` chỉ có `project.lock.json`.
- ⇒ Nó sẽ **bám `git status` vĩnh viễn** và có ngày lọt vào `git add -A`. Đúng khuôn đã được xử 3 lần trước (marker-file), chỉ thiếu dòng thứ 4.

**Đề-xuất:** thêm `.claude/scheduled_tasks.lock` sau `!.claude/**` (last-match-wins, y hệt 3 dòng kia).

---

## CHỐT

| Mặt | Verdict | Finding |
|---|---|---|
| ① skill | PASS_WITH_FLAGS | F-2 MED (ef-core lỡ Mig 67) · F-3 LOW **dương-giả, đề-xuất KHÔNG vá** |
| ② roster | **PASS** | 17=17=17=17=17, đợt vá S143 giữ vững |
| ③ plugin | **PASS** | 18/15/3 + marketplace 37, 0 delta · new-alloc 0 action |
| ④ docs | PASS_WITH_FLAGS | F-1 MED · F-4 MED (carry S143) · F-5 LOW lành · F-6 LOW |

**Cần lead quyết:** F-1 (4 site `sleep-recovery-memory-l2.md`) · F-2 (row Mig 67) · F-6 (1 dòng gitignore) = vá được ngay.
**Cần ANH quyết:** F-4 nhãn model-flip.
**Đề-xuất KHÔNG động:** F-3 (tuổi≠ôi) · F-5 (bộ-đếm sống).

---

## Phụ-lục — residual sweep (đối-chứng 2 công-cụ, chống mù `.gitignore`)

Sweep chính chạy bằng ripgrep (**tôn trọng `.gitignore`**). Tao chạy thêm `grep -r` thô (**không tôn trọng**) rồi lấy hiệu 2 tập "có `lead-view-auditor` mà vắng `harness-eval`" để soi chỗ ripgrep có thể mù. Kết quả: **0 file bị bỏ sót**, nhưng lòi ra 2 file tao chưa đọc — đã đọc nốt:

| File | Phán | Lý do |
|---|---|---|
| `.claude/governance/ACTIVE-MARKS.md:41` | ✅ **KHÔNG phải drift** | Ledger có luật riêng: *"BẢN KÝ GIỮ NGUYÊN, KHÔNG SỬA MỘT CHỮ (P4/P8)"*, delta ghi ở **chú-thích** dưới. "roster 12" trong thân mark = **frozen đúng thiết-kế**. Chú-thích `:41` đã tự khai *"12 là ảnh-chụp lúc ký, KHÔNG phải giới-hạn"* — luận-điểm gánh-lực này **phủ luôn trio** dù ngoặc đơn chỉ kể tới S121. Nit, không nêu thành finding (nhất-quán với lập-trường F-3/F-5: không thổi tuổi thành ôi). |
| `.claude/agents/lead-omission-auditor.md` | ✅ **S143 F-B ĐÃ VÁ** | `gap-incident-unrecorded` xuất-hiện **2×**; `:29` + `:42` nay đọc **"6 class"** (trước là 5). Ghost-enum S143 **đóng thật**, không phải đóng trên giấy. |

⇒ Chốt lại F-1: `sleep-recovery-memory-l2.md` là **file DUY NHẤT** còn ôm nhãn roster cũ ở dạng chỉ-dẫn-hiện-hành.

*Đo bởi tooling-auditor (Opus 4.8) · S144 · read-only, 0 file repo bị sửa — file này là run-trace, không phải file dự-án.*
