# sub-tooling-auditor — S150 closeout bookend (H1 4-mặt freshness)

> Vai: `tooling-auditor` (H1) · read-only + propose-only · em-main = single-writer.
> Phạm-vi: `aaf95ef..HEAD` = `a9efa34` (22 commit, 2026-07-24→07-25) · nhãn S149+S150.
> Nấc: @session-end §L.b(g). **Ghi-đĩa-trong-lúc-làm** (anti-#53) — mục append dần, verdict cuối ở return message.

---

## 0. Ground-truth đo đĩa (đo TRƯỚC, không tin doc)

| Đo | Lệnh | Kết quả |
|---|---|---|
| Roster đĩa | `ls .claude/agents/*.md \| wc -l` = 21 → trừ `README.md` | **20 persona** |
| Commit range | `git log --oneline aaf95ef..HEAD \| wc -l` | **22** (21 `wal:` + 1 `[CLAUDE] Docs: S148`) |
| Diff surface | `git diff --stat aaf95ef..HEAD -- .claude/ docs/ scripts/ CLAUDE.md` | **106 file, +6008/−151** |
| Rename (git nhận diện R) | diff-stat | 5/5 `{old => new}` ĐÚNG 5 vai |
| Script MỚI | diff-stat | `closeout-sentinel.ps1` (247) · `h24-signal-write.ps1` (280) · `session-counter-tick.ps1` (250) · `session-scaffold.ps1` (158) |

---

## 1. MẶT ② VAI-TRÒ (roster) — làm trước vì là trục chính của phiên

### 1.1 Đếm 4-nguồn — KHỚP

| Nguồn | Giá-trị | Ref |
|---|---|---|
| Đĩa | 20 persona | `.claude/agents/` (21 file − README) |
| `docs/STATUS.md` §Sub-agents | **20** | `docs/STATUS.md:452` |
| `hmw.js` VALID_ROLES | 20 phần-tử (đếm TAY từng tên, không đếm dòng) | `.claude/workflows/hmw.js:22-42` |
| `.claude/agents/README.md` | **0 số** (B1 derived-trỏ-canonical, cố-ý) | `README.md:3` + `:5` |

VALID_ROLES đế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** ✓ (áp bài-học S143: ĐẾM PHẦN-TỬ, không so hình-dạng chuỗi).

### 1.2 Residual tên CŨ — sweep toàn repo

`grep -r 'lead-view-auditor|lead-omission-auditor|h24-audit|tooling-harvest-audit|sleep-audit'` = **296 hit / 92 file**.
Phân loại theo luật S143 (**prescriptive = FLAG · frozen-in-time = GIỮ, sửa = giả-mạo**):

**✅ SẠCH (0 hit) — đúng những bề-mặt hiện-hành quan-trọng nhất:**
- `.claude/agents/*.md` (cả 20) — 0 hit
- `.claude/agents/README.md` — 0 hit
- `.claude/workflows/hmw.js` — 0 hit
- `.claude/commands/*.md` (18) — 0 hit
- `CLAUDE.md` + `docs/CLAUDE.md` — 0 hit

**✅ GIỮ (frozen-in-time hợp-lệ):** `.claude/workflows/runs/**` (run-folder lịch-sử) · `docs/changelog/sessions/**` ·
`docs/governance/adap-reports/**` · `docs/governance/adap-requests/**` · `broadcasts/outbox/**` ·
`docs/governance/error-ledger.md` (5 — entry cũ) · `.claude/agent-memory/**/archive/*.md`.

**✅ GIỮ (comment giải-thích LỊCH-SỬ trong script, code hoạt-động đã dùng tên MỚI) — đã verify tách code/comment:**
- `scripts/closeout-sentinel.ps1:67-68` — comment K5 giải-thích **vì sao** S148 `932d607` chạm thư-mục tên CŨ ⇒ nếu lấy
  lead-audit-pair làm positive-control thì S148 sẽ PASS sai. Code thật: `:99` `$Roles = @('harvest-curator','tooling-auditor')`,
  `:73` nhắc dùng `-Roles lead-stale-auditor,lead-gap-auditor` = **tên MỚI**. Xoá tên cũ ở comment = mất luôn lý-do thiết-kế.
- `scripts/governance-detectors.ps1:1691` — comment LAND-DATE ghi nhận file `sub-h24-audit-*.md` của S148 khớp **KHÔNG**
  pattern nào. Regex sống `:1737` `'(?i)(lead-stale|lead-gap|ring2-audit)'` = **tên MỚI** ✓.

**🟡 XÉT RIÊNG (record/provenance nằm trong file state SỐNG):**
- `.claude/governance/.session-counter.json:24` `class_repeat._note` — "…per lead-view-auditor honest-note" (quy nguồn seed S124)
- `.claude/governance/.session-counter.json:35` `_view_star_repair_S149` — "phat hien boi h24-audit (vai KIEM) @S149"
- `.claude/governance/.session-counter.json:37` `_backfill_S148` — "lead-omission-auditor bat @S148"
- `.claude/governance/ACTIVE-MARKS.md:44` — chú-thích S122 dẫn `/fable-real lead-view-auditor …` làm ví-dụ
→ Tất cả là **quy-nguồn sự-kiện quá-khứ** (ai bắt, lúc nào), không phải chỉ-dẫn hành-vi tương-lai.
  ACTIVE-MARKS còn có luật riêng P4/P8 "bản đã ký KHÔNG sửa". **Kết: GIỮ, không flag.**

### 1.3 Tên MỚI đã CÓ MẶT ở bề-mặt hiện-hành (kiểm chiều ngược — "vắng-mặt trông giống ổn")

- `session-end.md:46-50` liệt đủ 5 vai tên MỚI · `:123` (ii-bis) ring2 · `:135` (g-bis) ring1 · `:177-180` bảng 4-vòng
- `session-start.md:146` + `session-end.md:254` topology: "10 product/quality + monitor (H1 · H2 · 2×H24 · 3×trio-memory
  · 3×round-KIỂM `ring1`/`ring2`/`ring4` S145)" ⇒ 10+2+2+3+3 = **20** khớp đĩa ✓ (không chép số tổng, đúng B1)
- `sleep-recovery-memory-l2.md:106-108` Phase 4.5 ring4-audit · `tiep.md:113` lead-stale-auditor
- `agents/README.md:5` + `:225`-vùng diagram-note liệt đủ 20 tên (không số) ✓

### 1.4 🔴 FLAG-1 (HIGH) — `sleep-recovery-memory-l2.md:37` + `:42`: danh-sách loại-trừ monitor SÓT 6 vai

**Bằng-chứng runtime** — chạy ĐÚNG lệnh trong doc `:37`:

```
ls -1d .claude/agent-memory/*/ | xargs -n1 basename | grep -vE '^(tooling-auditor|harvest-curator|lead-stale-auditor|lead-gap-auditor)$'
→ 15 dòng: cicd-monitor database-agent frontend-designer HARNESS-AUDIT HARNESS-EVAL HARNESS-REFINE
  implementer-backend implementer-frontend investigator-api investigator-codebase office-document reviewer
  RING1-AUDIT RING2-AUDIT test-specialist
```

Ngay dòng dưới (`:39`) doc tự khai **"Hiện-hành = <10 tên product/quality>"** ⇒ **lệnh ra 15, doc nói 10**: mâu-thuẫn
NỘI-BỘ trong cùng một file. Và `:42` khai chính-sách *"**4** monitor INFORM-only KHÔNG vào `all` mặc-định"* trong khi
roster nay có **10 monitor** (4 cũ + trio `harness-eval`/`harness-refine`/`harness-audit` S141 + ring ×3 S145).

**Hậu-quả THẬT (không phải lỗi chính-tả):** `/sleep-recovery-memory-l2 all` sẽ nén-ngủ ký-ức của 5 vai monitor
(`harness-eval` · `harness-refine` · `harness-audit` · `ring1-audit` · `ring2-audit`) **ngược chính-sách file này khai** —
và `ring4-audit` (chưa có thư-mục) sẽ tự rơi vào `all` ngay khi nó chạy lần đầu. Đây là **lệnh SỐNG copy-paste**, không
phải văn mô-tả ⇒ prescriptive ⇒ FLAG.

🔴 **Trớ-trêu đáng ghi:** chính file này, `:43`, có ghi-chú vá S122: *"danh-sách này TỪNG STALE: nó cứng-hoá '9 sub' và
**rớt `office-document`**"* — và **tái-phát y hệt class đó** với 6 vai mới. Ghi-chú cảnh-báo KHÔNG tự chặn được tái-phát
(khớp bài `feedback_root_cause_over_symptom` S122: *bài-học nằm-trong-context KHÔNG tự bật*). Vá lần này nên vá
**bằng cách BỎ hardcode** (suy monitor-set từ nguồn, hoặc trỏ canonical) chứ không phải **thêm 6 tên** — thêm tên thì
đợt roster sau lại stale, đúng luật `agents/README.md:3` (*"vá bằng BỎ số, không ĐỔI số"*).

**Đề-xuất (em-main quyết):** (a) tối-thiểu — bổ-sung 6 tên vào regex `:37` + sửa "4 monitor" → liệt-kê-nhóm ở `:42`;
(b) tốt hơn — đổi thành "loại-trừ = mọi vai INFORM-only", lấy danh-sách từ một nguồn duy-nhất (vd `VALID_ROLES`
có nhãn, hoặc glob `.claude/agents/` + đọc dòng mô-tả), để lần thêm vai sau không sinh drift.

### 1.5 INFORM — `ring4-audit` chưa có thư-mục ký-ức

19 thư-mục `.claude/agent-memory/*/` vs 20 vai; thiếu duy-nhất `ring4-audit`. Nhất-quán với thiết-kế (ring4 chỉ chạy khi
`/sleep-recovery` chạy; NO-OP nếu vòng không đo) ⇒ **không flag**, chỉ ghi nhận: gate `session-end.md:216`
(`ls -la .../ring1-audit/ ring2-audit/ ring4-audit/`) sẽ trả lỗi cho vế ring4 cho tới lần nén-ngủ đầu-tiên.

### 1.6 Residual tên cũ ở `docs/STATUS.md` / `docs/HANDOFF.md` — phân loại

| Ref | Token | Loại | Kết |
|---|---|---|---|
| `STATUS.md:452` | cả 5 tên cũ | **bản-ghi RENAME** (`tooling-harvest-audit`→`ring1-audit` …) — phải có tên cũ mới đọc được | GIỮ ✓ |
| `STATUS.md:448` | `lead-view-auditor` | thuật lại ai bắt ô test-count stale S147→S148 | frozen, GIỮ |
| `STATUS.md:472` | `h24-audit` | thuật lại force-fire S148 "2 vai + `h24-audit` → 7 FLAG" | frozen, GIỮ |
| `STATUS.md:583` | `lead-view-auditor:45` | citation-trap 3-đời, trích **đường-dẫn file lúc đó** | frozen, GIỮ |
| `HANDOFF.md:8,10,17,20,21` | `lead-omission-auditor` | quy-nguồn FLAG @S146/@S148 (ai bắt) | frozen, GIỮ |
| `HANDOFF.md:14` | `h24-audit` | dòng "Last updated (kỳ trước)" S146 | frozen, GIỮ |
| `HANDOFF.md:81` | `lead-view-auditor` | khối `Prev S123` | frozen, GIỮ |

⚠️ **Lưu-ý cho em-main @closeout:** các khối S149/S150 **VIẾT MỚI** trong phiên này phải dùng **tên MỚI**; chỉ khối
kể-lại sự-kiện ≤S148 mới được giữ tên cũ. `STATUS.md:583` là ví-dụ đúng: nó trích **đường-dẫn** — nếu đổi thành
`lead-stale-auditor.md:45` thì trích-dẫn thành SAI với thời-điểm, nhưng file đó nay ĐÃ đổi tên ⇒ nếu ai lần theo sẽ
không thấy file. Cân nhắc thêm 4 chữ "(nay `lead-stale-auditor.md`)" — **cộng thêm**, không sửa bản gốc (khuôn
ACTIVE-MARKS P4/P8).

---

## 2. MẶT ① SKILL + COMMANDS — PASS (1 drift đã tính ở FLAG-1)

| Lớp | Đo | Kết |
|---|---|---|
| Skill project | `git diff --stat aaf95ef..HEAD -- .claude/skills/` = **RỖNG** | 0 đổi ⇒ 0 drift-mới |
| Skill project (đếm) | `ls -1d .claude/skills/*/` | **6** (3 domain + 3 ops) — khớp `STATUS:451` "Skills \| 6" ✓ |
| Skill standalone | `ls -1 ~/.claude/skills/` | **23** — 0 đổi vs baseline |
| Command file | `ls -1 .claude/commands/*.md` | **19** (baseline diary ghi 18 ⇒ `snapshot.md` land TRƯỚC `aaf95ef`, **0 file `A` trong range** ⇒ không phải drift phiên này; chỉ cập-nhật baseline diary) |

**7 command ĐỔI trong range** (`git diff --name-status`, tất cả `M`, 0 `A`/`D`):
`fable-clone.md` · `fable-real.md` · `session-end.md` · `session-start.md` · `sleep-recovery-memory-l2.md` · `tiep.md` · `ultra-on.md`.

Sweep mâu-thuẫn-mới trên 7 file: **1 ca THẬT** = FLAG-1 (`sleep-recovery-memory-l2.md:37/:42`, ghi ở §1.4 — drift
*nội-dung roster* nằm *trong* file command ⇒ tính chéo ①×②). 6 file còn lại nhất-quán: 5 tên vai MỚI có mặt đủ,
topology `10 + H1 + H2 + 2×H24 + 3×trio + 3×ring` = 20 khớp đĩa, 0 tên cũ.

---

## 3. MẶT ③ PLUGIN — PASS (0 delta plugin) + 1 ĐỔI key model

Nguồn: `~/.claude/settings.json` (**user-global**, mtime **2026-07-25 08:36** = trong phiên này), đọc bằng JSON-parse
(không grep chuỗi).

| Nấc | S143 baseline | S150 đo | Kết |
|---|---|---|---|
| registered | 18 | **18** | 0 đổi |
| enabled | 15 | **15** | 0 đổi |
| disabled | 3 (`pr-review-toolkit` · `code-modernization` · `hookify`) | **3, ĐÚNG 3 tên đó** | 0 đổi |
| marketplace | 37 (S143 bắt 35→37) | **37** | 0 đổi ⇒ lớp-đo-riêng S143 nay ổn-định |
| `effortLevel` | `xhigh` | `xhigh` | 0 đổi |
| `model` (lead) | `claude-opus-4-8[1m]` | 🔄 **`claude-opus-5[1m]`** | **ĐỔI** → xem FLAG-2 |

🔴 Báo đúng nấc: 0 plugin nào đi từ *installed*→*enabled* hay *enabled*→*assigned* trong phiên. Không suy "enabled = đang dùng".

---

## 4. MẶT ④ DOCS + NEW-ALLOC

### 4.1 New-alloc 4 script MỚI — **0 mồ-côi** ✓

| Script | Call-site trong `.claude/commands/` | Kết |
|---|---|---|
| `scripts/session-scaffold.ps1` | `session-start.md` | ✓ wired |
| `scripts/session-counter-tick.ps1` | `session-start.md` | ✓ wired |
| `scripts/h24-signal-write.ps1` | `session-start.md` **+** `session-end.md` (2 call-site) | ✓ wired |
| `scripts/closeout-sentinel.ps1` | `session-end.md` (+2 adap-report tham-chiếu) | ✓ wired |

⇒ **4/4 có ≥1 call-site**, không cái nào mồ-côi. (Chưa đo *đã chạy thật* hay chưa — đó là nấc `executed`, ngoài phạm-vi
H1; tao chỉ chứng *wired*.)

### 4.2 23 adap-report — dedup-key NGUYÊN VẸN ✓

- `ls -1 docs/governance/adap-reports/*.md | wc -l` = **100** tổng
- Trong range: `git diff --name-status` → **23 `A`** (khớp đúng con-số "23/23 land") + **1 `M`**
  (`2026-06-18-Governance-harness-10-flat-refine-checklist-v2.md`, +2 dòng)
- **Dedup-key = tên file** `YYYY-MM-DD-<Topic>-<slug>.md`. Kiểm va-chạm 2 lệnh: `basename | sort | uniq -d` = **rỗng** ·
  `sed 's/\.md$//' | uniq -c | awk '$1>1'` = **rỗng** ⇒ **0 trùng khoá trên cả 100 file** ✓
- ℹ️ **KHÔNG có file index riêng** trong `adap-reports/` (`ls | grep -i 'index\|README'` = 0 hit). Index cấp trên =
  `docs/governance/README.md`. Không flag (chưa từng có index ở tầng này); chỉ ghi nhận để em-main biết "đếm đủ" hiện
  dựa vào `ls`, không dựa vào sổ.

### 4.3 🔴 FLAG-2 (HIGH) — canonical flip-chain model **KHÔNG có một chữ "Opus 5"**, trong khi 5 bề-mặt sống đã flip

`docs/STATUS.md` §Sub-agents (`:452`) **tự khai là canonical**, nguyên văn:

> 🔴 **[§Sub-agents = CANONICAL single-owner flip-chain — S106 gộp per anh-confirm; derived `agents/README:3` ·
> `session-start:37` · `session-end:113` trỏ về đây, KHÔNG tự enumerate mỗi flip → chống churn 4-file/flip]**

Chuỗi flip trong ô đó **dừng ở** `✅ S107 Fable (2026-07-10 … flip-8)`, và dòng lead vẫn đọc *"em main Fable 5 (1M) Max"*.

**Chứng vắng-mặt bằng 2 lệnh KHÁC NHAU** (bài `feedback_absence_looks_like_clean`: phép trích rỗng đọc thành sạch):
1. `grep -c "Opus 5" docs/STATUS.md` → **0**
2. `grep -ioc 'opus[ -]*5' docs/STATUS.md` (case-insensitive, bắt cả `Opus 5`/`opus-5`/`opus5`) → **0**
   *(cùng lệnh trên `docs/HANDOFF.md` → **0**)*

**Chứng hiện-diện ở phía ĐỐI LẬP (5 bề-mặt sống đã mang giá-trị mới):**
- `~/.claude/settings.json` → `"model": "claude-opus-5[1m]"` (mtime 2026-07-25 08:36)
- `.claude/commands/session-start.md:41` → *"VALUE-update @S149 … **Default = Opus 5 MAX ở MỌI vị trí, KỂ CẢ ghế lead**"*
- `.claude/workflows/hmw.js:62` → `const TIER2_EXPECTED_FULL_ID = 'claude-opus-5'`
- `scripts/spawn-model-audit.ps1:100` → `$OWNER_RATIFIED_TIER2_FULL_ID = 'claude-opus-5'` (+`:101` bucket LEGACY)
- `docs/governance/adap-reports/2026-07-25-Governance-model-default-opus-5-max.md` (mới land, 66 dòng)

🔴 **Vì sao HIGH chứ không phải "một dòng stale":** thiết-kế chống-churn nói *derived KHÔNG tự chép, chỉ trỏ canonical*.
`agents/README.md:5` và `session-start.md:48` đều trỏ đúng về đây. Nên khi canonical trống, **không còn chỗ nào trong repo
giữ lịch-sử flip lead** — người đọc lần theo con-trỏ sẽ ra một ô nói lead = **Fable 5**, sai với `settings.json` đang chạy.
Con-trỏ vẫn *nguyên vẹn hình-thức* (không gãy link) nên detector broken-pointer C1 **không bắt được** ca này.

Đây là **tái-phát class S143 F-C** (`model-pin-flip-unlogged`) ở nấc rộng hơn: lần trước là 1 row thiếu dòng
`Lead <model>`; lần này cả fleet-default đổi mà canonical 0 hit. **Nhãn flip = quyền owner** ⇒ tao KHÔNG tự đặt chữ;
đề-xuất: em-main thêm mắt-xích `S149/S150 → Opus 5 MAX (broadcast 59ce1d0f, hub-owner + anh ratify)` vào cuối chuỗi
flip `STATUS:452` + sửa cụm *"em main Fable 5 (1M) Max"* thành giá-trị hiện-hành.

### 4.4 FLAG-3 (MED) — `scripts/spawn-model-audit.ps1:9` tự mô-tả SAI hằng-số nó đang so

`.DESCRIPTION` dòng 9 nguyên văn:

```
    PA-2a  .claude/workflows/hmw.js declares  TIER2_EXPECTED_FULL_ID = 'claude-opus-4-8'.
```

Thực-tế `hmw.js:62` khai `'claude-opus-5'`. Chính script này đã cập-nhật **hằng-số sống** (`:100`) nhưng **bỏ quên phần
tự-mô-tả** ⇒ đọc `Get-Help` ra giá-trị cũ. Cùng lớp "script đi trước doc" (S143 F-A) nhưng gói gọn **trong CÙNG một file**.
Đề-xuất: `:9` → `'claude-opus-5'` (và nếu muốn giữ vết: *"legacy `claude-opus-4-8` → bucket `$TIER2_LEGACY_FULL_ID:101`"*).

### 4.5 FLAG-4 (LOW) — `scripts/spawn-model-audit.ps1:156` trích-dẫn CHẾT (số dòng + câu trích đều không còn)

Nguyên văn `:156`: *"hmw.js:36 already contains the literal `'claude-opus-4-8'` inside a COMMENT (**"KHONG con demote-pin ..."**)"*.

- `hmw.js:36` **nay** = dòng `VALID_ROLES` của trio `harness-eval/refine/audit` (hmw.js dài thêm +41 dòng trong range)
- `grep -n "demote-pin" .claude/workflows/hmw.js` → **0 hit** ⇒ câu được trích **không còn tồn-tại**

🟢 **Kết-luận LOGIC vẫn ĐÚNG** (nên chỉ LOW): literal `claude-opus-4-8` vẫn nằm trong comment tại `:53`, `:58`, `:60`,
nên lập-luận *"grep thô sẽ PASS rỗng-tuếch, phải neo cấu-trúc bằng `$RX_CONST`"* vẫn đứng vững — chỉ **bằng-chứng dẫn
kèm** đã mục. Đề-xuất: đổi `:156` thành *"hmw.js còn literal đó trong comment (`:53`/`:58`/`:60`)"* — bỏ số-dòng-cứng,
dùng mô-tả bền (bài S125: trích số-dòng vào file đang sống thì tự lão-hoá).

---

## 5. CHỐT 4-MẶT

| Mặt | Verdict | Ghi |
|---|---|---|
| ① skill + commands | **PASS** | skill 6/23 0-đổi (git-diff rỗng); 7 command `M`; drift duy-nhất = FLAG-1 (site ①, nội-dung ②) |
| ② vai-trò roster | **PASS_WITH_FLAGS** | 20=20=20 (đĩa · `STATUS:452` · `hmw.js` VALID_ROLES đếm phần-tử) · README 0-số đúng B1 · 20/20 `model: opus`+`effort: max` · rename 5/5 sạch ở MỌI bề-mặt hiện-hành · FLAG-1 |
| ③ plugin | **PASS** | 18/15/3 + marketplace 37 IDENTICAL; chỉ key `model` đổi → FLAG-2 |
| ④ docs + new-alloc | **PASS_WITH_FLAGS** | 4/4 script wired 0-mồ-côi · 23 `A` + 1 `M` adap-report, dedup-key 0 trùng/100 file · FLAG-2/3/4 |

**Verdict tổng: PASS_WITH_FLAGS — 4 FLAG (HIGH ×2 · MED ×1 · LOW ×1) + 2 INFORM.**
Tất cả propose-only; em-main VERIFY rồi tự sửa. Tao KHÔNG sửa file nào ngoài sub-file này.

