# adap-report — H24 lead-self-audit + H17 cadence

## 1. id-broadcast
`2026-07-14-Governance-harness-24-lead-self-audit-h17-cadence`

## 2. nấc G-011
**executed** — hạ-tầng land đủ + **spawn-probe runtime-verified**. 🔴 **NHƯNG 2 vai CHƯA CHẠY LẦN NÀO và counter CHƯA TICK** ⇒ **0 bằng-chứng vai bắt được gì** (xem §5(a)).

| Phần | Nấc |
|---|---|
| **(1) 2 vai mới** `lead-view-auditor` + `lead-omission-auditor` | **executed + spawn-probe RUNTIME-VERIFIED 14/14** |
| **(2) detector** — `anchor_patterns[]` số-nhiều + GAP-3 policy | **executed + runtime-verified** (positive-control fire→vá→hết, §3) |
| **(3) scheduler** — `h24_cadence` + `.session-counter.json` | **executed** — file + shape land; 🔴 **counter CHƯA tick lần nào** (seed `counter=0` **UNTICKED trung-thực**) |
| **(4) positive-control** | **executed + runtime-verified** — chuỗi khép, số cộng khớp |
| **(5) 3 việc** (roster→VALID_ROLES, enum, nghi-thức) | **executed** |
| **2 vai CHẠY THẬT + bắt flag** | 🔴 **verified-pending — CHƯA có** |

## 3. evidence

**Commit (ĐÃ PUSH, range `4727d16..c39ba9d`):**
- `d07bbb9` — 2 detector H24 (`governance-detectors.ps1`)
- `00a1c67` — **1 commit nguyên-tử** 9 file: 2 vai mới · `h24_cadence`{6,15,3} · `lead_self_audit.flag_classes` enum · `.session-counter.json` · STATUS `Sub-agents` 12→14 + row `Policies` **216**
- `dfa3dae` — `session-start §2.1.8` counter-tick + `session-end §L.b(j)` + RE-STAMP
- `a09dcae` — **W4 positive-control** + evidence file
- `c39ba9d` — engine roster B1 + fix `$userMemDir`

**🔴 Spawn-probe 14/14 (runtime, sau RESTART):** 14/14 trả đúng `ALIVE|<role>`, **0 error, 0 garble**. 2 vai mới = **lean nhất roster** (26 284 / 26 469 tok, dưới cap mem-sub 60K).

**🔴 W4 positive-control — chuỗi khép, số cộng KHỚP** (capture TRƯỚC khi vá → `runs/2026-07-15-S119-adap-6-broadcast/W4-detector-fire-15-07-2026.md`):
```
permission-matrix : 5 FLAG → 0 FLAG
TOTAL             : 50     → 45      (tụt ĐÚNG 5)
Flag MỚI          : 0                (đo bằng `comm`, không đếm mắt)
```
**TOTAL 50 khớp CHÍNH XÁC dự-báo W2** (*"49→50, −1 cadence, +2 policy"*).

**Chuỗi nhân-quả 3 detector đổi trạng-thái đúng thiết-kế:**
| Detector | Trước W2 | Sau W2 |
|---|---|---|
| `h24_cadence` | `missing ⇒ measuring NOTHING` (fail-loud, **không** giả-định default) | `M = light_every = 6 (read from config)` |
| `spawn-model-audit` | `expected constant missing` | `[OK] claude-opus-4-8 = owner-ratified` |
| GAP-3 policy | `policy=MISSING` | `216` **+ BẮT NGAY** `permission-matrix:3 writes 240 but canonical=216` |

## 4. tailored-gì + skip-gì-vì-sao

**TAILORED:**

1. **Acceptance `ls .claude/agents/*.md = 14` BỊ BÁC — SAI SỐ-HỌC.** Glob thô bắt **luôn `README.md`** ⇒ ra **15**. Gate như vậy **FAIL trên implementation ĐÚNG**, hoặc ép worker **xoá `agents/README.md`** = **catastrophic-Goodhart**. ⇒ SE đổi sang bất-biến **trên ROSTER**: `VALID_ROLES.length == 14` **AND** `(ls *.md | grep -v README | wc -l) == 14`. Đo thật: **14/14/14** (roster đĩa · VALID_ROLES · README).

2. **🔴 Acceptance NÂNG — static-check KHÔNG ĐỦ.** Đây là điểm SE tự siết chặt hơn broadcast: file `.md` đúng chuẩn + tên có trong `VALID_ROLES` = **2 điều-kiện CẦN, KHÔNG ĐỦ** (frontmatter block-scalar hỏng vẫn **liệt-kê được tên** mà chết lúc instantiate). ⇒ **RESTART + spawn-probe THẬT** = bằng-chứng falsifiable duy nhất ⇒ land thành `session-start` **BƯỚC 0.6b registry-probe** (0.6 cũ là **MODEL**-probe, khác hoàn-toàn).

3. **enum 11 class, KHÔNG phải 10.** v2 nén còn 10 rồi tuyên *"khớp H24 §2(1) 5+5"* — **SAI cả 2 chiều**: broadcast `:48-49` liệt *"một việc rớt khỏi khối work-state so với backlog"* = **dấu-hiệu RIÊNG**, mà v2 **bỏ hẳn** `gap-workstate-drop` để về 10 rồi tuyên khớp. Hậu-quả: mất **đúng class bắt ca F1 của chính SE** (S118 chạy 7-spawn mà **0 run-folder** = việc rớt khỏi sổ), và enum **ĐÓNG** ⇒ 2 vai **VĨNH VIỄN** không phát được class đó. ⇒ khôi-phục. Nấc đúng: **5 STALE (khớp broadcast) + 6 GAP = 5 broadcast + 1 mở-rộng lane-D** (`carry` tách-đôi `dropped`/`aged`, lý-do đo-được), **KHÔNG** phải "khớp 5+5".

4. **Counter content-addressed, KHÔNG blind-increment.** Stop-hook auto-commit **mọi turn-boundary** ⇒ `counter++` mù sẽ tick **nhiều lần trong một phiên thật** ⇒ nhịp thành **vô-nghĩa**. ⇒ tick neo vào **HEAD sha**: 2× `/session-start` **cùng HEAD** = **+1, không +2**.

5. **Path `.session-counter.json` chọn CÓ CHỦ-ĐÍCH ngoài 3 path hook** (`.claude/governance/`) — nếu đặt trong `agent-memory/` thì hook nuốt nó thành `wal:` commit. *(Đối-chiếu: `.mfe-state.json` **NẰM TRONG** tầm hook — counter không được sống ở đó.)*

6. **Vocab-guard chống va-chạm:** `view`/`omission` chọn CÓ CHỦ-ĐÍCH — `governance-detectors.ps1:15` **đã sở-hữu** "derived-staleness" (nên cấm class tên `*-stale-role`), và từ trần "GAP" **quá tải** ở chỗ khác (`session-end` *"build-gap vs floor-rot"* · `memory-selfimprove-audit` *"CRITERIA+GAP"*).

7. **6/15/3** — anh chốt (O2), *"tương tự Hub"*. **🔴 Honest-caveat mang theo (§5(c)).**

**SKIP / n-a:** không skip điểm nào.

## 5. honest-caveat

🔴 **(a) 2 vai CHƯA CHẠY LẦN NÀO ⇒ 0 bằng-chứng chúng bắt được gì.** Spawn-probe chứng **spawn được**, **KHÔNG** chứng **soi được**. Counter `counter=0` **UNTICKED** (seed trung-thực — *"seeding a fake first tick would make the very first cadence reading a lie, and H24 exists to catch exactly that kind of invented number"*). ⇒ **cấm đọc thành "H24 đang hoạt động".**
  🔸 **Trớ trêu đáng ghi:** `gap-workstate-drop` — class SE **phải giành lại** khỏi v2 — chính là class bắt **đúng lỗi lead phạm trong wave này** (W3 rớt 3 file khỏi kế-hoạch: WAL liệt 5, thật **8**). Vai sinh ra để bắt nó **đã land** và **chưa từng chạy**; lead tự bắt bằng tay.

🔴 **(b) Spawn-probe phủ đường Agent-tool registry — KHÔNG phủ `hmw.js VALID_ROLES → agentType`.** Roster đổi = đổi **2 BỀ-MẶT ĐỘC-LẬP**; probe này chỉ đi qua **1**. Đường workflow chỉ chứng được khi có run THẬT gọi 2 vai mới. **Chưa có.**
  🔸 `tool_uses=0` ở probe = **ĐÚNG THEO LỆNH** (cấm gọi tool), **KHÔNG** phải chữ-ký #53 (= `tool_uses=0` **CỘNG VỚI** bịa đã-làm-việc).

🔴 **(c) 6/15/3 — hub nói rõ *"số của các em = config của các em; ĐỪNG chép 3 số này"*.** SE chọn **cùng 6/15/3** là **điểm khởi-đầu anh CỐ Ý chọn**, **KHÔNG phải chép vô-thức**. **Chỉnh lại sau chu-kỳ-2** — **n=1 ở hub là mocc-0, chưa ai được bán câu "đã chứng minh hiệu-quả"** (H24 caveat (c)).

🔴 **(d) PHÁT-HIỆN NGƯỢC — vai H24 bị CHÍNH detector bắt, và đó là DƯƠNG-GIẢ CẤU-TRÚC:**
```
[DETECTOR] LOW | .claude/agents/lead-view-auditor.md:45 | title-stale: anchor 2026-04-30 vs 2026-07-15 (76d)
```
`:45` chứa `**Status (post Session 6 — 2026-04-30):**` làm **VÍ-DỤ minh-hoạ** cho class `view-stale-header` trong bảng flag-class **của chính nó**. Detector đọc ngày trong **ví-dụ** rồi tưởng là anchor thật.
🔴 **Cùng CƠ-CHẾ với lỗi làm acceptance sweep của SE bất-khả-thi** (`:47` chứa *"agents/README ghi 12 sub khi roster = 14"* làm ví-dụ ⇒ pattern bắt). **2 detector ĐỘC-LẬP, cùng 1 file, cùng 1 lý-do:**
> **Ví-dụ về stale trông y hệt stale.** File **định-nghĩa** anti-pattern **tất-yếu** chứa mẫu anti-pattern ⇒ mọi detector khớp-mẫu sẽ bắt nó. **KHÔNG** phải lỗi của vai, **KHÔNG** phải lỗi của detector — **hệ-quả cấu-trúc của dò-bằng-khớp-mẫu**.
**SE KHÔNG "sửa" bằng cách làm nhạt ví-dụ** — ví-dụ mất tính cụ-thể thì bảng flag-class mất giá-trị dạy-nghề (vai đọc *"con-số lệch thực-tế"* không có mẫu thật sẽ **tự chế class** — đúng thứ enum-ĐÓNG sinh ra để chặn). ⇒ **giữ ví-dụ, khai vào đây.**
**→ đề-xuất KHUNG (không tự làm — đổi hành-vi detector = quyền owner):** detector cần **cơ-chế miễn-trừ tường-minh** cho khối ví-dụ (fenced-block hoặc allowlist path), thay vì bắt lead nhớ né.

🔴 **(e) Detector KHÔNG có nguồn chuẩn = đo NOTHING, và nó KHÔNG tự nói cho biết.** Trước W2, nửa `policy` của GAP-3 **không thể fire** vì `docs/STATUS.md` **không có row `Policies`** ⇒ detector **im lặng**, và sự im-lặng đó **trông y hệt "sạch"**. Thêm canonical ⇒ **2 flag hiện ra NGAY**, lộ stale ẩn **76 ngày**. ⇒ bài học chung: **thiếu canonical thì cổng xanh là vô-nghĩa.**

🔴 **(f) Giới-hạn detector đếm-số (tìm được lúc vá W4):** `permission-matrix/SKILL.md:20` liệt `Budgets root + 3 Bg_*` **như menu ĐANG SỐNG** — module Budget **XOÁ từ S61 (Mig 50)**, mã chỉ còn **comment bia-mộ**. Detector so **con-số** (*"60 ≠ 54"*) nhưng **không thấy** *"4 trong 60 cái đó đã bị xoá 60 phiên trước"*. ⇒ **stale THỰC-THỂ nặng hơn stale CON-SỐ, và lưới đếm-số mù với nó.**

🔴 **(g) Bẫy mega-line TÁI HIỆN trong chính đợt adopt:** `STATUS.md:25` — `grep -c` = **1** vs `grep -o | wc -l` = **2** ⇒ vá 1 chỗ tưởng xong. Stale thật tìm được: row canonical `| Sub-agents | 14 |` nhưng **narrative CÙNG DÒNG** ghi *"cả 12 sub"* = **mâu-thuẫn nội-tại NGAY TRONG nguồn chuẩn** (W2 sửa row, sót narrative). Đã vá bằng **bỏ số**, không đổi số.

---
*Ghi @S122 (2026-07-15) · lead Opus 4.8 · chain ĐÃ PUSH `4727d16..c39ba9d`, tree clean, K=0*
