# L4 — SE-do-A: ĐO ĐĨA vòng tooling/harvest + vòng soi-lead (H24)

> Đo từ ĐĨA repo SOLUTION_ERP @2026-07-24. CẤM suy từ doc — doc khai gì chỉ dùng làm giả-thuyết, verdict = vật thật.
> 3 nấc PHÂN BIỆT: `có file` ≠ `có call-site` ≠ `đã chạy có artifact`.

## 0. Bảng tổng — 3 vòng × 4 cột

| Vòng | Vai ĐO có file? | Vai KIỂM có file? | Call-site (ĐO / KIỂM) | Đã chạy thật? (artifact) | VERDICT |
|---|---|---|---|---|---|
| **V1 tooling/harvest** | ✅ `tooling-auditor.md` 7.072B · `harvest-curator.md` 7.594B | ✅ `tooling-harvest-audit.md` 7.715B | ĐO: `session-start.md:170-176` §2.1.1 (**tuỳ-nghi**) + `session-end.md:77`(d)/`:79`(f)/`:129`(g) (**bắt buộc** per `:64`) · KIỂM: `session-end.md:130-132` (g-bis)(i) **AUTO** | ĐO: ✅ nhưng **NGƯNG từ 2026-07-22 14:24** · KIỂM: ❌ **0 artifact toàn lịch-sử git** | ĐO = **WIRED + DORMANT 3 closeout** · KIỂM = **WIRED, NEVER-FIRED (vacuous-hợp-lệ)** |
| **V2 soi-lead H24** | ✅ `lead-view-auditor.md` 7.643B · `lead-omission-auditor.md` 8.918B | ✅ `h24-audit.md` 8.415B | ĐO: `session-end.md:114`(j)(ii) **AUTO** + `:126`(vi) force-fire + `session-start.md:264` §2.1.8(e) **AUTO** · KIỂM: `session-end.md:118` (ii-bis) **AUTO** | ĐO: ✅ 6 lần (S124/S137/S140/S143/S146/S148) · KIỂM: ✅ **2 lần** (S146 + S149) | **WIRED + RAN** — nhưng **memory-layer GHOST** (diary rỗng) + **ledger under-report** |
| **V4 nén-ngủ** (bonus, câu-4) | skill `/sleep-recovery-memory-l2` (command, không phải agent) | ✅ `sleep-audit.md` 7.410B | KIỂM: `sleep-recovery-memory-l2.md:106-108` Phase 4.5 **AUTO** | ĐO: last run **2026-07-18** · KIỂM: ❌ 0 artifact, thư-mục **MISSING hẳn** | KIỂM = **WIRED, NEVER-FIRED (vacuous-hợp-lệ — 0 vòng để chấm)** |

---

## 1. Nấc 1 — CÓ FILE (`.claude/agents/`, `ls -la`)

Cả 7 vai liên-quan đều **có vật thật**:

```
 7072  Jul 15 22:23  tooling-auditor.md
 7594  Jul 15 22:23  harvest-curator.md
 7715  Jul 22 22:39  tooling-harvest-audit.md
 7643  Jul 15 22:23  lead-view-auditor.md
 8918  Jul 22 13:58  lead-omission-auditor.md
 8415  Jul 23 00:11  h24-audit.md
 7410  Jul 22 22:39  sleep-audit.md
```

Frontmatter 3 vai KIỂM = agent-def THẬT (không phải stub): `model: opus` · `effort: max` · `memory: project` · `maxTurns: 16` · `tools:[Read,Grep,Glob,Bash,4×rag]`, description khai đủ fail-safe NO-OP + no-self-exempt (m-3).

🔴 **DRIFT nhãn-phiên:** cả 3 file KIỂM được ADD trong **cùng 1 commit `8b6df0a` = "S146 closeout" (2026-07-23)**:
```
git log --diff-filter=A -- .claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md
→ 8b6df0a  [CLAUDE] Docs: S146 closeout — session-model 3 owner-decision + hook 4-path + H24 auto   (×3)
```
Trong khi 4 bề-mặt đồng loạt khai **"land S145"**: `hmw.js:39` · `agents/*.md` description ×3 · `STATUS.md:452` ("+S145 … 18th/19th/20th sub") · `session-end.md:144`. Hệ-quả: câu "📌 Baseline đo tại lúc land gate **@S146**" (`session-end.md:213`) đo **chính commit vừa tạo ra file** ⇒ "chưa chạy" là tất-yếu, không phải phát-hiện.

## 2. Nấc 2 — CÓ CALL-SITE (nghi-thức gọi thật)

### 2a. V1 tooling/harvest

| Chỗ | Dòng | Cơ-chế |
|---|---|---|
| `session-start.md:170` §2.1.1 "Monitor RE-REPORT" | :174 H1 · :175 H2 | **TUỲ-NGHI** — `:176` "Light session / hỏi-đáp → **có thể skip**; bug/feature/multi-agent/wave → nên chạy" ⇒ KHÔNG AUTO, KHÔNG consent, = khuyến-nghị |
| `session-end.md:64` §L.b header | :64 | "**(a)→(k) đủ HẾT, KHÔNG skip — thiếu = ledger thối**" ⇒ (d)(f)(g) là **BẮT BUỘC** |
| `session-end.md:77` (d) | flush agent-memory, H2 hỗ-trợ propose | bắt buộc |
| `session-end.md:79` (f) | harvest-integrity GATE 5-trục + close-gate C5 | bắt buộc |
| `session-end.md:129` (g) | tooling-freshness CHỐT 4-mặt + new-alloc audit | bắt buộc |
| `session-end.md:130` (g-bis) | vai KIỂM | **(i) AUTO — KHÔNG consent** `:131` · **(ii) fail-safe NO-OP** `:132` nếu H1/H2 không chạy · **(iii) tuần-tự C4b** mtime-chứng · **(vi) end-only CHỦ-ĐÍCH** |
| `session-end.md:172` bảng V1 | — | map ĐO→KIỂM→pin |

### 2b. V2 soi-lead H24

| Chỗ | Dòng | Cơ-chế |
|---|---|---|
| `session-end.md:114` (j)(ii) | OVERDUE → cặp H24 | 🔴 **AUTO, KHÔNG consent** (owner @S146 "3 → auto", THAY consent-gate era-S122) |
| `session-end.md:126` (j)(vi) | force-fire khi closeout gộp `P≥1` | **DP-3 consent-gate ĐÃ GỠ @S146** → chạy thẳng |
| `session-start.md:264` §2.1.8(e) | OVERDUE tại open | AUTO; `:265` khai rõ **KHÁC** sleep-check §2.1.2 (vẫn CONSENT) và trio §2.1.9 (vẫn CONSENT) |
| `session-end.md:118` (ii-bis) | `h24-audit` | **AUTO ngay sau cặp H24**, *wherever it fires* (`:143` coupling-rule) |

**Nhịp đọc từ đâu** (đúng như đề-bài giả-thiết): `.claude/agent-memory/memory-budget.json:135-141` → `h24_cadence` = `light_every: 6` · `deep_every: 15` · `jump_on_class_repeat: 3`; `_owner_ratified` = owner-decisions-15-07 Q2 + mark `e50a4bd0` 2026-07-17. State (KHÔNG chứa số nhịp) ở `.claude/governance/.session-counter.json`: `counter: 23` · `last_ticked_session: S149` · `last_audit.light_at_counter: 22` · `deep_at_counter: 17` ⇒ light 1/6, deep 6/15 = **chưa tới nhịp**; nhưng `class_repeat.counts` có **3 class ≥ 3** (gap-owner-specifics 4 · gap-decision-sunk 3 · gap-carry-dropped 3) ⇒ **JUMP đã ARM**, entry `S149` khai surface cho owner, không tự fire.

### 2c. 🔴 hmw.js **KHÔNG PHẢI** call-site

`.claude/workflows/hmw.js:22-45` `VALID_ROLES` chứa đủ 20 tên (`:39` tooling-harvest-audit, `:40` h24-audit + sleep-audit) — **nhưng đó là WHITELIST VALIDATE, không phải trigger**:
- `:137` "Vai ∉ VALID_ROLES (typo/rename-drift) = DỪNG HẲN + báo owner"
- `:145` `.filter(x => … !VALID_ROLES.includes(x.raw))` → `:149` STOP-HARD
- `:194-195` `const role = VALID_ROLES.includes(raw) ? raw : undefined`

⇒ Đọc "có tên trong hmw.js" thành "được gọi" chính là **cách ghost-wire lọt lưới**. Call-site thật của cả 3 vai KIỂM nằm **duy nhất** ở `.claude/commands/` (session-end.md · sleep-recovery-memory-l2.md).

## 3. Nấc 3 — ĐÃ CHẠY THẬT (artifact)

### 3a. V1 ĐO — chạy thật, nhưng **ngưng 2026-07-22 14:24**

```
runs/2026-07-22-S143-closeout-audit/sub-tooling-4.md          13.896B  07-22 13:56
runs/2026-07-22-S143-closeout-audit/sub-harvest-3.md          13.200B  07-22 13:58
runs/2026-07-22-S144-bootstrap/sub-tooling-auditor-1.md       16.732B  07-22 14:24
runs/2026-07-22-S144-bootstrap/sub-harvest-curator-1.md       18.326B  07-22 14:24
```
`find runs -name "sub-*.md" -newermt 2026-07-21` → **KHÔNG có** sub-tooling/harvest nào sau 14:24 ngày 07-22.
agent-memory: `tooling-auditor/MEMORY.md` 18.534B · `harvest-curator/MEMORY.md` 17.175B — commit cuối chạm cả hai = `a1e2416` **"S143 closeout"**.

Closeout đã xảy ra SAU đó (`git log` grep closeout): `8b6df0a` S146 · `5f6c3be` S147 · `932d607` + `aaf95ef` S148 — **3 closeout, 0 dấu vết H1/H2**. Grep `tooling-auditor|harvest-curator|g-bis|H1|H2` trong 3 session-log S146/S147/S148 = **0 hit**. So sánh đối-chứng: closeout S140 `b146e2b` và S143 `a1e2416` **có** khai H1/H2 nguyên-văn trong commit-message ("H2 GATE-PASS-0 … H1 PWF/3-đều-xử" / "vá 4 drift H1 + harvest GATE-PASS-5") ⇒ khi chạy thì CÓ vết, nên vắng vết là tín-hiệu có nghĩa (không phải quy-ước im-lặng).

### 3b. V1 KIỂM — **0 artifact toàn lịch-sử**

- `.claude/agent-memory/tooling-harvest-audit/` **tồn tại nhưng RỖNG** (0 file; mtime 07-22 18:27) — `git ls-files` = rỗng (thư-mục trống không track được).
- `git log --all --diff-filter=A -- "*sub-tooling-harvest*"` → **rỗng** ⇒ chưa từng có file nào mang tên vai này trong repo.
- 0 hit trong `docs/changelog/sessions/` · 0 hit trong `.claude/WAL.md`.
- "spawn-PROBE @S145 cố-ý-0-ghi" chỉ là **TỰ KHAI 2 chỗ** (`runs/…S145…/spec-apply-hub-s145-v2.md:42` và `sub-implement-D-5vong.md:114`), **0 bằng-chứng độc-lập**.

**Verdict V1-KIỂM = WIRED, NEVER-FIRED — nhưng KHÔNG phải ghost-wire của chính nó.** Fail-safe `(ii)` `session-end.md:132` nói rõ: H1/H2 không chạy ⇒ pin missing ⇒ NO-OP. Vì vòng ĐO **dormant 3 closeout liên tiếp** nên vai KIỂM đúng luật khi im. 🔴 **Lỗ THẬT nằm ở vòng ĐO**: `§L.b:64` tự khai "đủ HẾT, KHÔNG skip — thiếu = ledger thối" mà (d)(f)(g) vắng mặt 3 closeout, **không một dòng vết skip** ở bất kỳ đâu (session-log/WAL/run.md).

### 3c. V2 ĐO — chạy thật 6 lần

`sub-lead-view.md`+`sub-lead-omission.md` (S124) · `sub-lead-{view,omission}-auditor-0.md` (S137) · S140 (counter history, force-fire debt) · `sub-lead-view-1.md`+`sub-lead-omission-2.md` (S143 deep) · `sub-lead-{view,omission}-S146.md` (S146) · **S148** (agent-memory mtime 07-24 18:11 / 18:20; `lead-view-auditor/MEMORY.md` 7.959B · `lead-omission-auditor/MEMORY.md` 16.987B).

### 3d. V2 KIỂM — chạy thật **2 lần** (khớp dữ-kiện đề-bài)

```
runs/2026-07-22-S145-apply-hub-answers/sub-h24-audit-S146.md    6.169B  07-23 00:08
runs/2026-07-24-S148-h24-force-fire/sub-h24-audit-S149.md      25.724B  07-24 18:59
```
`.claude/agent-memory/h24-audit/` tồn tại (mtime 07-23 00:04 = đúng lúc S146) **RỖNG 0 file** = GAP-3 lần 4 (vai tự ghi nhận ở `sub-h24-audit-S149.md` §9d-bis: *"vai này đã chạy thật @S146 mà không ai seed diary ⇒ lần chạy S149 tao vào MÙ HOÀN TOÀN"*).

### 3e. V4 nén-ngủ — vòng ĐO chưa chạy kể từ khi vai KIỂM ra đời

`.gist.md` mới nhất toàn repo = **2026-07-18** (5 file: cicd-monitor/tooling-auditor/harvest-curator/reviewer/investigator-codebase kỳ `2026-07`). Vai `sleep-audit.md` land `8b6df0a` = **2026-07-23** ⇒ **0 lượt nén nào xảy ra sau khi vai tồn tại** ⇒ NO-OP đúng fail-safe. `.claude/agent-memory/sleep-audit/` **MISSING hẳn** (chưa từng được tạo).

---

## 4. Surprises (ngoài câu hỏi chính)

1. **`run.md` S148 under-report:** `Stages` ghi `- [ ] W3 h24-audit (vai KIỂM, SAU cặp)` trong khi artifact `sub-h24-audit-S149.md` 25.724B đã nằm trên đĩa lúc 18:59. Đây đúng class **wired-but-declared-unwired** mà `tiep.md:113` gọi là "lật-ngược của ghost-wire" — ghost-wire soi được **2 CHIỀU**.
2. **2 con-đo H24 @S148 KHÔNG ghi run-folder:** `runs/2026-07-24-S148-h24-force-fire/` chỉ có `run.md` + artifact của vai KIỂM; 0 file `sub-lead-view-*`/`sub-lead-omission-*`. Output 2 vai nằm ở agent-memory. Chính `h24-audit` khai §0 và §8.5: *"vòng S148 bỏ khuôn này và mất 2/9 FLAG vĩnh viễn"*.
3. **Baseline đóng-băng `session-end.md:213` đã lệch 1 vế:** khai "@S146: `h24-audit/` + `sleep-audit/` **MISSING**". Đĩa NAY: `h24-audit/` **TỒN TẠI** (rỗng, tạo 07-23 00:04) · `sleep-audit/` vẫn MISSING. Baseline "mốc 1 lần KHÔNG lặp mỗi phiên" nhưng không ai re-stamp khi thư-mục xuất hiện.
4. **`h24_cadence` JUMP đã ARM mà chưa fire:** 3/11 class ≥ ngưỡng 3 (gap-owner-specifics 4 · gap-decision-sunk 3 · gap-carry-dropped 3) — `.session-counter.json` entry `S149` ghi "SURFACE cho owner, không tự fire". Nghĩa là vòng V2 đang có **nợ nhịp do JUMP**, độc-lập với counter chưa tới hạn.
5. **`class_repeat` từng đứng yên 2 phiên vì audit chạy mà không ai ghi số** (`_backfill_S148`): H24 chạy thật @S146 nhưng 0 entry history ⇒ S147+S148 đều đọc số tiền-S146 ⇒ kết-luận "không jump" SAI. Cùng một class bệnh với GAP-3: **chạy rồi mà sổ không biết**.

## 5. KHÔNG CHẮC

- **Không chắc** H1/H2 thực sự KHÔNG chạy @S145–S148, hay có chạy mà không để lại vết. Đo bằng **vắng-mặt 4 nguồn** (0 `sub-*.md` · 0 commit chạm MEMORY · 0 hit session-log · 0 hit WAL) + 1 đối-chứng dương (S140/S143 có vết trong commit-message). Vắng-mặt ≠ chứng-minh — chỉ em main hoặc transcript 3 phiên đó xác nhận được.
- **Không chắc** "spawn-PROBE @S145 cố-ý-0-ghi" của `tooling-harvest-audit` có xảy ra thật: chỉ 2 dòng tự-khai trong chính wave S145, 0 artifact độc-lập.
- **Không chắc** vòng tooling/harvest dừng do **cố-ý defer** (3 phiên đó nặng product/governance) hay **bỏ sót** — 0 vết quyết định trên đĩa để phân biệt.
- **Không chắc** đường `hmw.js → agentType` đã từng spawn 3 vai KIỂM lần nào chưa (STATUS.md:452 tự khai residual "chưa exercise" cho 2 vai H24; không đo được từ đĩa).
