# C4/C4b — Design-doc 3 vai-KIỂM (TÁCH · owner-decision [2] · chờ anh duyệt trước khi tạo file)

> Trạng thái: **PROPOSAL** — chưa tạo file nào. Anh duyệt / sửa 3 mục "Open" cuối rồi mới implement.
> Phiên: S145 (/tiep resume S144).

## 0. Neo (không chép — trỏ nguồn)

- **Broadcast** `harness-dong-du-vong` khoản ① (`:51`): *mỗi vòng-ĐO có ≥1 vai-KIỂM độc-lập* — đọc OUTPUT con-đo (KHÔNG re-chạy đo), spot-check tay + chủ động falsify ≥2 claim; vòng báo CLEAN phải có phép **thách-CLEAN** (re-check 1 lens sạch).
- **§4** broadcast: *hình-thức (số vai/tên/gộp-tách) — mỗi dự-án tự quyết*. → **owner-decision [2] = TÁCH** (mỗi vòng 1 con riêng, KHÔNG gộp).
- **C4:** propose-only · **no-self-exempt** (cấm tự-kiểm vòng mình đo — m-3 S139) · re-check ≥1 số **CÓ-THỂ-SAI**.
- **C4b:** tuần-tự trong-vòng — audit vòng X ở invocation **SAU** con-đo vòng X (bằng-chứng: 2 run-id khác + mtime(audit) > mtime(đo)).

## 1. Hiện trạng (C14:23) — chỉ vòng-3 (trio) có KIỂM

| Vòng-ĐO | Con-ĐO đang có | Vai-KIỂM hiện tại |
|---|---|---|
| trio (memory-triad) | `harness-eval` + `harness-refine` | ✅ `harness-audit` |
| **tooling / harvest** | `tooling-auditor` (H1) + `harvest-curator` (H2) | ❌ 0 |
| **soi-lead (H24)** | `lead-view-auditor` + `lead-omission-auditor` | ❌ 0 |
| **nén-ngủ (sleep)** | skill `/sleep-recovery-memory-l2` | ❌ 0 |

⇒ **3 vai-KIỂM mới** (TÁCH), roster **17 → 20**. (Chỉ đóng 3 vòng C14 nêu; KHÔNG tự suy "khung 5-vòng" đủ hay chưa — ngoài scope [2].)

## 2. Thiết-kế 3 vai

Mỗi con = **cặp mắt độc-lập** đọc OUTPUT con-đo, KHÔNG re-chạy đo. Mirror `harness-audit.md` (frontmatter `model: opus · effort: max · tools` read-only+rag · `memory: project · maxTurns ~18`).

| # | Tên (đề-xuất) | Vòng | Đọc OUTPUT của | Số **CÓ-THỂ-SAI** tự re-check (≥1) | thách-CLEAN | no-self-exempt |
|---|---|---|---|---|---|---|
| A | `tooling-harvest-audit` | tooling/harvest | H1 (4-mặt freshness) + H2 (5-trục harvest) return/propose | tự đếm `.claude/agents/*.md` đối-chứng roster-count H1 báo · HOẶC "N run harvested / M sub spawned" tự đếm run-folder vs agent-memory | H1 PASS / H2 GATE-PASS-0 → mở 1 skill "fresh" xem thật fresh · 1 sub "harvested" xem có delta APPEND thật | ≠ H1, ≠ H2 |
| B | `h24-audit` | soi-lead (H24) | `lead-view-auditor` + `lead-omission-auditor` FLAG-list + class-assign | tự đếm flag-count · HOẶC mở 1 FLAG cụ-thể (vd `view-stale`) đối-chứng source · HOẶC 1 dòng `class_repeat` tally trong `.session-counter.json` | 2 vai báo ÍT/0 FLAG → tự soi 1 surface tìm FLAG bị sót (CLEAN nguy nhất = "lead ổn" khi không ổn) | ≠ lead-view, ≠ lead-omission |
| C | `sleep-audit` | nén-ngủ | output `/sleep-recovery-memory-l2` (gist mới + Fidelity-gate verdict) | tự đo byte trước/sau đối-chứng claim giảm-byte · HOẶC đếm gist-file sinh ra | Fidelity 5P/0F → mở 1 `.gist.md` đối-chứng archive gốc (gist trung-thực hay mất chi-tiết load-bearing) | độc-lập với ai chạy sleep |

**Kỷ-luật chung mọi con:**
- **Propose-only** (trả TEXT, lead single-writer B3). 🔴 Backstop THẬT = **git-diff commit-gate**, KHÔNG phải thiếu-tool (`tools:` whitelist KHÔNG chặn write runtime — đo S143 `[carry:tools-whitelist-no-teeth]`).
- **PIN đích-danh** input (mirror harness-audit (i)): pin missing/rỗng ⇒ TỪ-CHỐI chấm, CẤM ĐẠT-ảo.
- Verdict per-claim ĐẠT/TRƯỢT + falsify-log HELD/BROKE + tự tái-dựng ≥1 số, KHÔNG tin lời-khai.

## 3. Cadence + consent (KHÔNG thêm đồng-hồ mới) — ✅ OWNER-CHỐT S145

- **Fire-after-measure, coupled:** mỗi KIỂM fire ở invocation **SAU** con-đo vòng mình vừa chạy phiên này (thoả C4b). 🔴 **KHÔNG thêm cadence-key** vào `memory-budget.json` — giống trio §2.1.9(h) ("trộn 2 đồng-hồ = hỏng cả hai"). Trigger = "vòng X vừa đo xong phiên này", không phải counter riêng.
- **AUTO sau đo (owner-chốt S145 — KHÔNG consent-gate):** vòng X đo xong ⇒ KIỂM tự chạy ngay, KHÔNG in dòng đề-xuất, KHÔNG chờ gật. Khác trio/H24 (2 cái đó consent-gated). 🔴 **Fail-safe bắt buộc:** nếu con-đo KHÔNG chạy phiên này (vd `/tiep` skip session-start) ⇒ pin input missing ⇒ KIỂM **NO-OP im-lặng** (không có gì để chấm), CẤM ĐẠT-ảo. Auto ≠ chạy-mù: không có measure thì không có audit.

## 4. Files khi implement (sau khi anh duyệt)

- 🆕 `.claude/agents/tooling-harvest-audit.md` · `h24-audit.md` · `sleep-audit.md` (mirror `harness-audit.md`)
- ✏️ `.claude/agents/README.md` — roster matrix + audit-map (17→20)
- ✏️ `docs/STATUS.md §Sub-agents` — count canonical (KHÔNG chép số ra chỗ khác, B1)
- ✏️ `.claude/commands/session-start.md` + `session-end.md` — thêm proposal-line + consent + WAL skip-trace (mirror §2.1.9 trio)
- ✅ fault-inject 2-chiều (no-self-exempt guard FLAG khi pin trùng vòng mình · thách-CLEAN có răng) + reviewer-gate trước commit
- 🔸 governance-detectors: cân-nhắc 1 detector INFORM "vòng-ĐO nào chưa có KIỂM chạy phiên gần nhất" (optional, defer)

## 5. ✅ OWNER-CHỐT S145 (3 quyết-định, AskUserQuestion)

1. **Tên 3 vai** → GIỮ đề-xuất: `tooling-harvest-audit` · `h24-audit` · `sleep-audit`.
2. **Consent-model** → **AUTO sau đo** (KHÔNG consent-gate) — xem §3 (kèm fail-safe NO-OP khi thiếu measure).
3. **Nhịp adopt** → **INCREMENTAL từng vòng** (§6 broadcast) — làm 1 vai → chạy thử 1 phiên → báo nấc → vai kế.

### Thứ-tự incremental (em chọn, anh veto được)
- **Vai #1 = `tooling-harvest-audit`** (làm TRƯỚC): vòng tooling/harvest chạy **mỗi phiên** (session-start + session-end) ⇒ auto-fire test được **nhanh nhất**.
- Vai #2 = `h24-audit` (vòng H24 chạy theo nhịp ~6 phiên) · Vai #3 = `sleep-audit` (sleep hiếm chạy).

### Wiring vai #1 (auto)
- Fire tại **session-end** SAU khi H1 (tooling-auditor) + H2 (harvest-curator) chốt (đó là chỗ GATE thật: H2 5-trục + H1 freshness). Đọc output 2 con → verdict + tự tái-dựng ≥1 số + thách-CLEAN. (session-start report nhẹ hơn — cân-nhắc phủ sau, defer.)
- Fail-safe: H1/H2 không chạy phiên đó ⇒ NO-OP im-lặng.
