# N3 — LANE B / 6 · GĐ-2 "Lưới ghi đĩa và sổ mục lục vật chứng"

> **Vai:** reviewer (adversarial, read-only, propose-only) · **Phiên:** S180 · **Run:** `2026-08-07-S180-adap-upgrade-pack-phased`
> **Mô hình tự khai:** claude-opus-5 (`/fable-clone reviewer`), effort max.
> **Đầu vào ghim đích danh (đọc thật, không nghe kể):**
> - `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-thu-chinh.md:151-170` (§GĐ-2 bước làm + kiểm-xong-chưa) · `:79-80` (TC-04/TC-05) · `:287` (luật "không áp dụng phải ghi lý do")
> - `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-phu-luc-spec-pitfall.md:141-177` (§GĐ-2 sàn (i)-(v) + 4 bẫy + 6 ô nghiệm thu)
> - `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-khuon-fit-map-report-checklist.md:228-379` (Phần C, A0-1→A16)
> - `.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-invest-fitmap-S180.md:68-83` (N1 §GĐ-2) · `:179` (TC-05) · `:224` (ô fit-map) · `:240` (W2)
> - `.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-review-n2-S180.md:48-52` (F-06) · `:82` (không-mẫu-số)
>
> **Guard AS-17:** file này **append TỪNG KHOẢN trong lúc làm**, không dump-cuối. Mỗi mục đóng lại là một mục đã đo xong.
> **Luật tự áp:** `KHÔNG ĐO ĐƯỢC` hợp lệ; bịa thì không. Mọi 0-hit phải kèm **control-dương**. Mọi tỉ lệ phải kèm **mẫu số + định nghĩa "đếm CÁI GÌ"**.

---

## §0 — Cách bóc khoản (khai trước để người sau đếm lại được)

Hub GĐ-2 nằm ở **hai tệp, hai độ phân giải khác nhau**, và chúng **không phải là một**:

- **Thư chính `:154-162`** cho **8 bước làm** (đánh số 1→8 trong chính tệp gốc).
- **Phụ lục `:143-161`** cho **5 khoản sàn** (i)…(v), **4 bẫy**, và **6 ô nghiệm thu** (`:172-177`).

Hai bộ này **giao nhau nhưng không trùng**. Ví dụ: sàn (v) "Khai luôn điểm mù" **không có bước tương ứng** trong 8 bước của thư chính — đó chính là lý do một bản đồ chỉ đếm theo 8 bước sẽ **đánh rơi (v)** mà vẫn trông đủ. (Đây là gốc kỹ thuật của F-06 mà N2 bắt.)

**Quyết định của lane B:** bóc theo **hợp của cả hai bộ**, đánh số `B-01`…`B-13`, mỗi khoản ghi rõ neo gốc. Mẫu số dùng suốt báo cáo này = **13 khoản**. Ai muốn đếm theo mẫu số khác (8 bước, hoặc 6 ô nghiệm thu) thì §7 có bảng quy đổi.

---

## §1 — Bóc từng khoản (13 khoản, không gộp)

> Ký hiệu: **ĐÃ-CÓ** = SE có vật thật, chạy được · **THIẾU** = không tồn tại · **NGƯỢC** = SE có thứ chỏi hub · **NỬA** = có một phần, khai rõ phần nào.

### B-01 — Liệt kê TỪNG CỬA sinh ý kiến phản biện, mỗi cửa chốt một đích ghi tệp nguyên văn
*(neo: thư chính `:155` bước 1 · phụ lục `:147` sàn (i) · nghiệm thu ô 1 `:172` "liệt kê **từng cửa**, đừng ghi 'tất cả các cửa'")*

**SE đã có — NỬA.** Cửa của SE (liệt từng cửa, không ghi gộp):

| # | Cửa | Có sinh ý kiến phản biện? | Đích ghi tệp nguyên văn | Bằng chứng |
|---|---|---|---|---|
| 1 | `/session-start` (bookend @open) | CÓ — cặp `lead-stale-auditor` + `lead-gap-auditor` + `ring2-audit` | `runs/<id>/sub-<role>-*.md` | `.claude/commands/session-start.md:269` |
| 2 | `/session-end` (closeout) | CÓ — cùng cặp + `harvest-curator` + `tooling-auditor` | `runs/<id>/sub-<role>-*.md` | `session-end.md:119` · `session-end.md:164` (khối instruments) |
| 3 | `/tiep` (nối mạch) | CÓ — Sàn-3 probe + `mind-check` | **KHÔNG có đích tệp bắt buộc** — kết quả in ra hội thoại | `tiep.md:154` (gọi probe) · `:169` (mind-check) |
| 4 | `/pause` | CÓ — đèn nợ + liệt việc đã-review | WAL + `run.md`, **không phải tệp nguyên văn per-cửa** | `pause.md:113` |
| 5 | HMW fan-out (mode B) | CÓ — mỗi sub trả verdict | `runs/<id>/sub-<role>-<i>.md` + `<stage>-synthesis.md` | `.claude/workflows/hmw.js:9` · `runs/README.md:11` (C1 PHẲNG) |
| 6 | HMW mode A (return-delta-only, **default S93+**) | CÓ | **KHÔNG có run-folder — by-design** | `_ledger.md` header (Mode-A ephemeral, S98) |
| 7 | `/adap-apply` · `/adap-report` · `/check-email` | CÓ (phản biện adap) | `docs/governance/adap-reports/` cho report; `/check-email`, `/adap-apply` **CHƯA ĐO** | N1 `sub-invest-fitmap-S180.md:106` cũng khai chưa đo |

**Kết luận B-01:** 5/7 cửa có đích ghi đĩa; **cửa 3 và cửa 4 KHÔNG có** — đây đúng cái bệnh hub kể ở phụ lục `:147` (*"một cờ cảnh báo phát ở cửa trước, tới cửa sau muốn truy lại thì không còn gì để đọc"*). Cửa 6 là **miễn hợp lệ có khai** (by-design, có ghi lý do trong `_ledger.md` header) — đúng chuẩn `không áp dụng` của hub.
**THIẾU:** bảng 7 dòng như trên **chưa tồn tại ở bất kỳ đâu trong repo** — tôi vừa dựng nó lần đầu ngay trong file này. Nghiệm thu ô 1 của hub đòi đúng bảng này.

---

### B-02 — Khuôn tối thiểu của tệp nguyên văn (tiêu đề cố định · nhãn lượt chạy + mô hình tự khai · đầu vào ghim đích danh · kết luận · thân cấm nén)
*(neo: thư chính `:156` bước 2 · phụ lục `:147`)*

**SE — NỬA, và đây là chỗ mỏng nhất của lane ghi.**
- **Có:** `runs/README.md:35` (C2) quy định scaffold `run.md` ở OPEN, có taskList snapshot (`:45`).
- **Có:** AS-20 guard đòi **END-line** `END <slug> — VERDICT=<…>` cho mọi `sub-*.md` (`docs/governance/error-ledger.md:38`).
- 🔴 **NGƯỢC / hở nghiêm trọng:** END-line đó **CHƯA ĐƯỢC WIRE**. `session-end.md:128` khai thẳng: *"Vế 'luật END-line' của H2-P5 **CỐ Ý KHÔNG wire** ở đây — đó là slot **(44)** chờ anh (chưa từng được hỏi)"*. Tức error-ledger cột "guard" mô tả một guard **chưa có đường thi hành** ⇒ người đọc error-ledger tưởng có máy canh. Đây đúng khoản **A16** của hub (*"để người đọc tưởng có máy canh mới là khai sai"*) và đúng lớp **ghost-wire** của chính SE (H18).
- **THIẾU:** 3/5 trường khuôn — *nhãn mô hình tự khai*, *đầu vào ghim đích danh*, *thân cấm nén* — không có quy định thành văn nào ở `runs/README.md`. (File lane B này tự áp đủ 5 trường ở header, nhưng đó là tôi tự áp, **không phải luật repo**.)

---

### B-03 — Đích ghi nằm trong vùng có quét bí mật, không rơi vùng miễn quét
*(neo: thư chính `:157` bước 3 · phụ lục `:147` câu cuối)*

**SE — NỬA, và có một lỗ ĐO ĐƯỢC.**
- **Có:** `scripts/session_ctx.py::secrets_sweep` dùng `rglob` phủ trọn session-dir (`:173`, `:180`) — S153 đã kéo `_mind` vào lưới. ✅ cho `.claude/sessions/`.
- 🔴 **Lỗ:** `scripts/governance-detectors.ps1:128` liệt `'\.claude\workflows\runs\'` trong **ExcludeDirFragment**, và `:1168` tự khai nguyên văn: *"live under .claude/workflows/runs/ which is already an ExcludeDirFragment"*. Nghĩa là **run-folder — nơi chứa toàn bộ vật chứng đắt tiền — nằm trong vùng detector CỐ Ý bỏ qua** cho phần lớn phép quét. C11 phải **tự mở lại** `$runsRoot` (`:1724`) mới soi được. Đây chính xác là cảnh báo cuối sàn (i) của hub: *"đừng đổ vào vùng miễn quét"*.
- **CHƯA ĐO:** `secrets_sweep` có phủ `.claude/workflows/runs/` không — cần `grep -n "runs\|rglob\|scan_root" scripts/session_ctx.py` quanh `:150-200`.

---

### B-04 — Sổ mục lục **hai tầng**: tầng-A gói-theo-loại · tầng-B mục-lục-SỐNG
*(neo: thư chính `:158` bước 4 · phụ lục `:159` sàn (iv))*

🔴 **Đây là khoản NẶNG NHẤT của lane B, và trạng thái thật KHÁC với những gì tên tệp gợi ý.**

**Tầng-A (gói theo loại: mẫu đường dẫn · chức năng · ai ghi · ai đọc · bộ tệp chuẩn) — ĐÃ-CÓ, khá tốt.**
`.claude/workflows/runs/README.md` (18.173 B) — có `C1` cấu trúc PHẲNG (`:11`), `C2` scaffold OPEN (`:35`), `C3` git-tracked verify 2 nấc (`:56`), `C4` per-turn primary (`:74`), `C5` 3-layer anti-miss (`:79`), `C7` caveat trung thực (`:104`), `C8` migration (`:112`), containment model (`:128`).

**Tầng-B (mục-lục SỐNG) — 🔴 KHÔNG TỒN TẠI. `_ledger.md` đã CHẾT, và chết CÓ KHAI.**

Đo (lệnh + kết quả, dán được):
```
ls .claude/workflows/runs/ | wc -l            → 90   (ENTRY: 88 thư mục + 2 tệp)
find .claude/workflows/runs -maxdepth 1 -mindepth 1 -type d | wc -l → 88  (FOLDER thật)
wc -c .claude/workflows/runs/_ledger.md       → 9683
```
🔴 **Bẫy đơn-vị bắt được ngay tại đây (ca thứ 3 của phiên):** N1 viết *"**90 folder**"* (`sub-invest-fitmap-S180.md:73`). Số 90 là **số ENTRY của `ls`**, không phải số **FOLDER**. Folder thật = **88**. Chênh 2 = đúng 2 tệp `README.md` + `_ledger.md`. N1 không sai phép đo, sai **nhãn đơn vị**. → Hỏi "đếm CÁI GÌ" trước khi hỏi "ai sai": ở đây cả hai số đều đúng với đơn vị của nó.

**Trạng thái `_ledger.md`:** header dòng 3 khai nguyên văn **🧊 RETIRED (H18-B, S100 2026-07-02)** — *"KHÔNG ghi beat mới"*. 15 row lịch sử, **toàn bộ đề ngày 2026-06-18**. Run mới nhất trên đĩa = `2026-08-07-S180-…`. ⇒ **Khoảng chết = 06-18 → 08-07 ≈ 50 ngày, 88−15 = 73 run-folder không có dòng nào trong sổ.**

🔸 **Phải khai công bằng:** đây **KHÔNG phải "sổ chết vì quên"**. Nó là **nghỉ hưu CÓ KHAI, có lý do đo được, có người kế nhiệm được chỉ định**: header ghi rõ catch-rate `0/15 row lifetime` + `coverage workflow gần đây 0/8`, và chỉ định *"Orphan-authority = **H2 FOLDER-SCAN**"*, kèm cả **caveat-3 parity trung thực** (*"run-folder-orphan chưa từng xảy ra ở CẢ 2 cơ chế — căn cứ retire = coverage-cấu-trúc, KHÔNG phải catch-rate hơn"*) và **đường đảo ngược** (gỡ dòng này + restore 6 mandate-consumer). Theo thang nhãn GĐ-3 của hub thì đây là **"suy giảm hợp lệ"**, không phải "tự ý bỏ".
**NHƯNG** — với GĐ-2(iv) thì hệ quả vẫn y hệt: **SE hiện KHÔNG có tầng-B mục-lục-sống nào cho `runs/`.** Cái thay thế (`nhip-no-probe` run-chua-gom) là một **BỘ ĐẾM**, không phải **MỤC LỤC**: nó in ra một con số, không liệt kê được run nào, không có ai-ghi/ai-đọc/bộ-tệp-chuẩn per-run, và **không thể dùng làm nguồn thứ hai** cho điểm-danh-2-nguồn (B-08) — vì nó đọc thẳng đĩa, tức nó **chính là nguồn thứ nhất**.

**Trần dung lượng ở tệp cấu hình chung, tài liệu chỉ trỏ khoá — ĐÃ-CÓ và đúng chuẩn hub, nhưng ĐÚNG MỘT TẦNG KHÁC.**
`memory-budget.json` giữ `archive_gate.autoinject_cap_bytes` + `tiers.l2_index.cap_bytes`; `nhip-no-probe.ps1:112-150` **đọc khoá, thiếu khoá thì in `CONFIG-THIEU(...)` chứ KHÔNG tự chế mặc định**. Đây là mẫu đúng y chữ hub. **Nhưng nó áp cho `agent-memory/`, KHÔNG áp cho `runs/`** — `runs/_ledger.md` và `runs/README.md` **không có trần nào**, không khoá config nào, và không máy nào đo kích thước chúng.

---

### B-05 — Vai điểm danh vật chứng, **cấm sửa** và **cấm phán nội dung**
*(neo: thư chính `:159` bước 5 · phụ lục `:153` · nghiệm thu ô 2 `:173` · TC-05 thư chính `:80`)*

**SE — ĐÃ-CÓ ở trục "cấm sửa", THIẾU ở trục "chuyên điểm danh vật chứng".**
- **Cặp quan sát chạy VÔ-ĐIỀU-KIỆN @closeout:** `{harvest-curator, tooling-auditor}` — `scripts/closeout-sentinel.ps1` header (`:14-15`) khai default `-Roles`. INFORM-only.
- **Ràng "cấm sửa" được cưỡng chế THẬT bằng gì:** không phải bằng lời trong persona (propose-only sub **vẫn Bash-write được** — chính SE đã đo, `error-ledger` G-015). Backstop THẬT = **git-diff commit-gate** (AS-10). Đây là câu trả lời đúng và mạnh cho TC-05, và nó **mạnh hơn** cái hub mô tả (hub chỉ nói "ghi rõ nó cấm sửa" — SE có **cơ chế** chứ không chỉ có **chữ**).
- 🔴 **THIẾU:** cả 2 vai đó **điểm danh MEMORY/TOOLING, không điểm danh VẬT CHỨNG RUN-FOLDER**. Không vai nào có nhiệm vụ "so bộ tệp chuẩn của `runs/<id>/` rồi báo thiếu". `closeout-sentinel` M5 gần nhất — nhưng nó bắt *"audit đo rồi như chưa đo"* (thiếu delta role-dir), không bắt *"tệp trong run-folder cụt/rỗng"*.

---

### B-06 — 🔴 **Máy điểm danh 4 vị từ: VẮNG · RỖNG · CỤT · NÉN-QUÁ-TAY** + vị từ **bộ-tệp-nội-bộ-thư-mục**
*(neo: thư chính `:160` bước 6 · phụ lục `:149` sàn (ii) · bẫy 1 `:165` · nghiệm thu ô 3 `:174`)*

**Đây là trục nặng nhất mà lead giao. Trả lời thẳng: SE có 2/4 vị từ, và cả 2 đều ở SAI TẦNG.**

| Vị từ hub | SE có máy? | Máy nào · ở đâu · phủ cái gì |
|---|---|---|
| **VẮNG** | ✅ **CÓ**, nhưng phủ 2 tầng hẹp | (a) `scripts/nhip-no-probe.ps1:160-181` — vắng `*-synthesis.md` trong run-folder (DUAL-ACCEPT port `tiep.md:40-53`). (b) `scripts/memory-archive-gate.ps1` A7 — pointer trong `archive/_INDEX.md` phải resolve + file tồn tại. |
| **RỖNG** | ✅ **CÓ**, cùng 2 tầng đó | (a) `nhip-no-probe.ps1:168` `(Get-ByteLen …) -gt 0` — **chỉ áp cho `*-synthesis.md`**. (b) `memory-archive-gate.ps1` A7 `size>0`. |
| **CỤT** (thiếu đầu / thiếu thân) | ❌ **KHÔNG CÓ MÁY NÀO** | error-ledger `:40` AS-17 — cột guard ghi *"lead verify BYTE-CONTENT tăng thật GIỮA wave"*, cột kiểu ghi thẳng **`procedural`** (`:74`). Tức = **NGHI THỨC, người phải nhớ.** |
| **NÉN QUÁ TAY** (so số ký tự với nguồn cùng đơn vị) | ❌ **KHÔNG CÓ MÁY NÀO** | error-ledger `:39` AS-19 — tự khai nguyên văn: **"🔴 hiện là **nghi-thức, chưa cơ-khí-hoá**"**. SE **đã tự biết và đã tự ghi**; hub chỉ xác nhận từ ngoài. |
| **bộ-tệp-nội-bộ-thư-mục** (soi chính thư mục của lượt chạy hiện tại) | ❌ **KHÔNG CÓ** | Không có định nghĩa "bộ tệp chuẩn của một run-folder" ở bất kỳ đâu. `runs/README.md:11` C1 mô tả *hình dạng* (`run.md` + `sub-*.md` + `*-synthesis.md`) nhưng **không máy nào đọc mô tả đó để đối chiếu**. ⇒ SE đang giẫm **đúng Bẫy 1** của hub (`:165`). |

🔴 **Kết luận B-06 — câu trả lời cho trục "cơ khí hoá vs nghi thức":** N1 nói SE *"có AS-17/AS-19"* là **đúng về sự tồn tại của LUẬT** và **sai nếu đọc thành có MÁY**. Bằng chứng không phải suy đoán của tôi — nó là **lời tự khai của chính SE trong cột kiểu của error-ledger**: AS-17 = `procedural`, AS-19 = `chưa cơ-khí-hoá`. Hub GĐ-2 đòi **vị từ máy kiểm được**; ở 2 vị từ đắt nhất (CỤT, NÉN) SE có **0 máy**.

---

### B-07 — Ba nhịp chạy: đầu phiên · **ngay sau mỗi lượt chạy đắt** · cuối phiên
*(neo: thư chính `:161` bước 7 · phụ lục `:157` sàn (iii))*

**SE — 2/3 nhịp ĐÃ-CÓ, nhịp giữa THIẾU (và đó đúng là nhịp cứu được tiền).**

| Nhịp | SE có? | Bằng chứng |
|---|---|---|
| Đầu phiên | ✅ | `session-start.md:269` — bookend @open + `nhip-no-probe` + Sàn-3 |
| Cuối phiên | ✅ | `session-end.md:164` — khối instruments 5 máy: `measure-agent-memory` + `memory-archive-gate` + `crystallized-backfill` + `nhip-no-probe` + `mfe-eval` AUTO |
| **Ngay sau mỗi lượt chạy đắt** | ❌ **THIẾU** | Có `harvest` per-turn primary (`hmw.js:9` C4) nhưng **không có máy điểm danh BẮT BUỘC chạy ngay sau mỗi spawn đắt**. |

🔴 **Đây chính là nhịp mà nếu có thì ca N1 đã được bắt trong ngày.** Hub viết ở `:157`: *"theo sự kiện, ngay sau mỗi lượt chạy đắt — bắt lúc còn cứu được"*. N1 đốt 202K token rồi hạ cánh skeleton; không máy nào chạy giữa lúc đó và lúc lead tình cờ mở file ra đọc.

---

### B-08 — Điểm danh **HAI NGUỒN** (đĩa đọc thẳng ⟂ mục lục), **ghi ra chênh lệch** thay vì làm tròn
*(neo: thư chính `:162` bước 8 · phụ lục `:155` gạch đầu dòng 3 · nghiệm thu ô 6 `:177`)*

🔴 **SE — THIẾU HOÀN TOÀN, và thiếu vì lý do cấu trúc chứ không phải vì quên.**

Điểm danh 2 nguồn cần **hai nguồn độc lập**. SE hiện chỉ có **một**: đĩa. Nguồn thứ hai (mục lục) đã nghỉ hưu (B-04) ⇒ phép so **không có vế phải**. Không phải "chưa làm phép so", mà là **không tồn tại thứ để so**.

**Cần nói rõ vì sao hub coi khoản này nặng** (phụ lục `:155`): *"Chỉ đọc mục lục là sai về nguyên tắc, vì mục lục do chính người điều phối ghi — đọc nó là tự soi mình."* SE hiện ở **thái cực đối xứng**: chỉ đọc **đĩa**. Đĩa thì không nói dối, nhưng đĩa **không biết cái gì lẽ ra phải có mà không có** — nó chỉ biết cái đang có. Đó đúng là lý do `run-chua-gom` đếm được "thiếu synthesis" (vì hình dạng đó được hardcode trong script) nhưng **không đếm được "thiếu lane N3-lane-C"** — không nguồn nào khai lượt chạy này lẽ ra đẻ mấy tệp.

**Nguyên liệu SE có sẵn để dựng vế phải:** `run.md` **đã chứa taskList snapshot ghi TRƯỚC launch** (`runs/README.md:45`, H22). Đó là **bản kê "lẽ ra phải có"** — tức vế phải đã tồn tại về mặt dữ liệu, chỉ chưa ai đọc nó bằng máy. Ở chính run này, `run.md:22`/`:34`/`:60-61` liệt đủ N1…N5. ⇒ khoản B-08 với SE **rẻ hơn vẻ ngoài**: không phải dựng sổ mới, mà là **đọc `run.md` làm nguồn-2**.

---

### B-09 — 🔴 Khoản sàn in đậm **GĐ-2 (v) "Khai luôn điểm mù"** — khoản N2 F-06 báo vắng trọn khỏi bản N1
*(neo: phụ lục `:161` — in đậm ⇒ thuộc sàn bắt buộc theo thư chính `:281`)*

**Hub đòi chính xác cái gì** (đọc nguyên văn `:161`): *"Vật chứng của **chính vai điểm danh** sinh ra **sau khi nó chạy xong**, nên **nó không tự soi được**. Cần **một vai khác cùng phiên**, **cộng lượt soi ở đầu phiên sau**, mới phủ hết."*
Bóc ra 3 vế đo được:
- **(v-1)** thừa nhận thành văn rằng vai điểm danh có điểm mù về chính nó;
- **(v-2)** có **vai thứ hai cùng phiên** soi chéo;
- **(v-3)** có **lượt soi ở ĐẦU PHIÊN SAU** bắt phần lọt.

**SE có tương đương gì (N2 gợi sentinel + bookend — tôi xác nhận và ghi rõ hơn):**

| Vế | SE có? | Vật thật |
|---|---|---|
| (v-1) thừa nhận điểm mù thành văn | ⚠️ **NỬA** — có nhận thức, chưa thành khoản | `runs/README.md:104` **C7 "CAVEAT trung-thực (no-overclaim)"** · `_ledger.md` header *caveat-3 parity* · `error-ledger` AS-17(b) *"phép trích-xuất trả RỖNG phải phân biệt 'không có gì' ⟂ 'phép đo hỏng'"* (`:120`). Đây là **cùng họ** với điểm mù nhưng **không phải cùng mệnh đề**: SE nói *"đừng đọc rỗng thành sạch"*, hub nói *"vai điểm danh không tự soi được chính nó"*. |
| (v-2) vai thứ hai cùng phiên | ✅ **CÓ, mạnh** | `closeout-sentinel.ps1` chạy **cặp** `{harvest-curator, tooling-auditor}` vô-điều-kiện; bookend chạy **cặp** `lead-stale` + `lead-gap`; `ring2-audit` AUTO chạy **sau** cặp và **PIN đích danh run-folder tươi (cấm glob-latest)**. Chữ "PIN đích danh, cấm glob-latest" chính là cơ chế cho phép vai-sau soi vật-chứng-của-vai-trước. |
| (v-3) lượt soi đầu phiên sau | ✅ **CÓ, và đúng nguyên văn hub** | Bookend chạy ở **CẢ HAI đầu**: `session-start.md:269` và `session-end.md:119` (HÌNH B @S149). `closeout-sentinel` M5 = *"lưới lùi cho cửa chết sớm"*. |

🔴 **Phán quyết B-09 (độc lập, không gật theo ai):**
1. **N2 F-06 ĐÚNG** — khoản (v) vắng trọn khỏi cả cột "Hub đòi" lẫn cột "SE thiếu" của N1 (`sub-invest-fitmap-S180.md:70` liệt đúng 6 ý, không có (v)).
2. **N2 còn nói nhẹ hơn sự thật ở một chỗ**: N2 viết SE *"có họ hàng gần"*. Đo kỹ thì SE **có 2/3 vế ĐẦY ĐỦ và đúng nguyên văn** (v-2, v-3) — đây là khoản SE **gần như đã áp xong** mà bản đồ lại bỏ trắng. Mất khoản này không phải mất cảnh báo, mà là **mất điểm cho việc đã làm đúng** — đúng cái A13 của hub cảnh báo (`:352`).
3. **Còn thiếu thật, và thiếu nhỏ:** chỉ (v-1) — **một dòng thành văn** đặt ở `runs/README.md` C7 nói rõ *"vật chứng của vai điểm danh sinh sau khi nó chạy ⇒ nó không nằm trong phạm vi tự soi; phủ bằng vai-cặp cùng phiên + bookend @open phiên sau"*. Chi phí ≈ 1 đoạn văn; giá trị = đóng trọn một khoản sàn in đậm.
4. 🔴 **Điểm mù mà chính hub cũng chưa nói tới, tôi bổ sung:** ở SE, `ring2-audit` PIN run-folder tươi — nhưng **vật chứng của ring2 lại sinh sau ring2**. Vế (v-3) của hub (bookend phiên sau) chỉ phủ nếu **bookend phiên sau thật sự đọc run-folder phiên trước**. **CHƯA ĐO** — cần `grep -n "run-folder\|runs/\|phiên trước" .claude/agents/lead-gap-auditor.md .claude/agents/lead-stale-auditor.md`.

---

### B-10 — Mức nghiêm trọng **tỉ lệ với chi phí chạy lại**
*(neo: phụ lục `:154` · thư chính `:287` — "nhà không có lượt chạy đắt thì phần này là *không áp dụng*, nhưng phải ghi lý do")*

**SE — THIẾU, và KHÔNG được khai `không áp dụng`.**
SE **có** lượt chạy đắt và có bằng chứng số: `run.md:25` — N1 lượt-1 đốt **202K token / 27 tool-use / 545s**. ⇒ nhánh miễn của hub không áp dụng cho SE.
Máy hiện tại **đối xử mọi tệp như nhau**: `nhip-no-probe` đếm orphan không phân biệt run 3-phút với run 202K-token. Không có trường "chi phí" nào trong `run.md` scaffold bắt buộc (có ghi tay ở `:25` nhưng là **văn xuôi, không phải trường máy đọc**).
🔸 **Ràng buộc SE phải tôn trọng khi dựng:** doctrine *"đo BYTE, CẤM quy token"* (S158). ⇒ trường chi phí nên là **byte đĩa + số tool-use + giây**, hoặc token **có neo nguồn** (dán từ máy, không gõ tay) — chứ không phải một chỉ số tổng tự chế.

---

### B-11 — Bẫy 2 hub: **ghi vật chứng TRƯỚC khi bắn, không phải sau**
*(neo: phụ lục `:166`)*

**SE — ĐÃ-CÓ, và mạnh hơn hub.** `runs/README.md:35` C2 — scaffold `run.md` ở OPEN **TRƯỚC khi invoke Workflow**; `:45` taskList snapshot ghi TRƯỚC launch (H22); spec-pin trước spawn (H21). Hub tự khai mắc lỗi này *"nhiều lần trong cùng một ngày"*; SE đã cơ-khí-hoá bằng thứ tự bắt buộc trong command.
🔸 **Nhưng có mặt sau, và mặt sau đó đang chảy máu:** ghi `run.md` trước ≠ **sub-file** có ruột. Ca N1 hôm nay: `run.md` đầy đủ, `sub-*` rỗng ruột. ⇒ Bẫy 2 đã đóng ở tầng **thư mục**, còn hở ở tầng **tệp con**.

---

### B-12 — Bẫy 3 hub: **cuối ngày là vùng nguy hiểm** — vật chứng bền phải ghi **ngay khi kết luận về**
*(neo: phụ lục `:167`)*

**SE — ĐÃ-CÓ ở mức luật, THIẾU ở mức máy.**
- Luật có, và có **răng đã chứng minh**: AS-17 guard *"resume-in-session ép đổ ruột"* — S151 cứu **5/5 sạch, 0 byte mất** (`error-ledger:74`). WAL S180 khai *"#53: 6/6 vai nặng dính, recover 6/6 **mất 0 byte**"*.
- Nhưng đó là **người vá sau khi sự cố xảy ra**, không phải **máy chặn trước**. Không có vị từ nào chạy tự động lúc kết luận về.
- 🔸 **Đối chứng dương cho biết luật này CÓ tác dụng thật:** `feedback_agent_return_garble_recover` ghi trio return-only **3/3 CLEAN** cùng phiên 10-garble ⇒ khuôn-return-cứng sống sót tốt hơn. Tức SE đã **đo được** thứ giúp giảm mất mát; nó chỉ chưa được đóng thành vị từ.

---

### B-13 — Nghiệm thu ô 4 hub: **đối chứng dương — gài một tệp rỗng vào phạm vi thì máy PHẢI bắt**
*(neo: phụ lục `:175` · thư chính `:169`)*

🔴 **SE — TRƯỢT, và tôi đã chạy phép thử này chứ không suy đoán.** Kết quả ở §2 dưới.

---

## §2 — Phép thử tay: chạy máy SE lên đúng hiện vật của ca N1

**Thiết lập (sandbox, KHÔNG chạm repo thật):**
- Rút bản lượt-1 của N1 từ git: `git show c7248b5:.claude/workflows/runs/2026-08-07-S180-…/sub-invest-fitmap-S180.md` → **7.049 B** (khớp đúng con số lead đưa; bản hiện tại ở `d8c107c` = 48.433 B).
- Dựng `sandbox/.claude/workflows/runs/2026-08-07-SBX-skeleton/` gồm: `run.md` · `invest-synthesis.md` · **`sub-invest-fitmap-S180.md` = bản skeleton 7.049 B** · **`sub-empty-lane.md` = 0 byte** (đây chính là "tệp rỗng gài vào phạm vi" mà nghiệm thu ô 4 của hub đòi).

**Đo hiện vật skeleton (bản 7.049 B):**
```
grep -c "^#"       → 10      (1 tiêu đề + 9 heading mục)
grep -n "^##"      → 9 dòng
grep -c "ĐANG ĐO"  → 5       (+2 dòng "[CHỜ §…]" = 7 nhãn treo)
```
Sáu heading mang nhãn treo: `### GĐ-1..GĐ-6 [ĐANG ĐO]` · `## §2 [ĐANG ĐO]` · `## §3 [ĐANG ĐO]` · `## §4 [ĐANG ĐO]` · `## §5 [CHỜ §1-§4]` · `## §6 [CHỜ §1-§5]`.
✅ **Xác nhận con số "6/9" của lead — và khai mẫu số mà lead không khai: mẫu số = 9 dòng heading cấp `##`/`###` (không tính dòng tiêu đề `#`).** Nếu đếm theo **mục cấp 1 (§0…§6) thì là 5/7**; nếu đếm theo **ruột thật thì §0 + GĐ-0 xong, phần còn lại trống**. Ba cách đếm, ba con số, **cùng một sự thật** — nên bắt buộc phải khai đếm-cái-gì.

**Chạy máy SE (`scripts/nhip-no-probe.ps1 -RepoRoot <sandbox>`):**
```
NHIP-NO: kiem light 1/6 deep 14/15 ok | tran-bo-nho 0 over-cap l2idx 0 over | run-chua-gom 0 | pull-cach 16 ngay
exit=0
```
🔴 **`run-chua-gom 0` — SẠCH.** Máy nhìn thẳng vào một thư mục chứa (a) skeleton 6/9 mục rỗng và (b) một tệp **0 byte**, rồi báo **không có gì bất thường**.

**CONTROL-DƯƠNG (bắt buộc — chứng thước không hỏng):** giấu `invest-synthesis.md` đi rồi chạy lại:
```
… | run-chua-gom 1 | …     ← bắt được
… | run-chua-gom 0 | …     ← trả lại synthesis, sạch trở lại
```
✅ Thước **SỐNG**. Vậy `0` ở trên là **mù thật**, không phải hỏng máy. (Đây đúng phép "0-hit phải kèm control-dương".)

**Kết luận §2 — trả lời trực diện câu lead hỏi:** với ca N1, **KHÔNG máy nào của SE bắt được**, vì:
- `nhip-no-probe` chỉ soi **sự tồn tại + độ rỗng của `*-synthesis.md`** — `sub-*.md` **hoàn toàn ngoài tầm**;
- `memory-archive-gate` soi `agent-memory/`, **không soi `runs/`**;
- `closeout-sentinel` M5 soi **delta thư mục vai**, không soi ruột tệp;
- `governance-detectors` C11 có mở `runs/` nhưng chỉ kiểm **khuôn tag FLAG** (và chỉ cho tệp tên chứa `lead-stale|lead-gap|ring2-audit`) + **diary-delta cho vai INFORM-only** — `sub-invest-fitmap-*.md` **không khớp cả hai lối**;
- guard AS-17 *"verify byte tăng"* mù **theo đúng thiết kế của nó**: 7.049 > 0 và đang tăng ⇒ mọi vị từ dựa trên **kích thước** đều xanh.

🔴 **Chẩn đoán gốc (không phải "quên viết máy"):** vị từ đang đo **KÍCH THƯỚC**, còn thứ hỏng là **TỈ LỆ KHUNG/RUỘT**. Hai đại lượng này **không tương quan** — một tệp toàn heading tăng byte y hệt một tệp đầy nội dung. Đây cũng đúng chữ SE tự viết trong `feedback_agent_return_garble_recover`: *skeleton-nấc-2 … **byte>0 nên guard "verify byte tăng" mù, phải đọc RUỘT***. SE **đã biết** trước hôm nay; cái thiếu là **vị từ**.

---

## §3 — Vị từ ĐỀ XUẤT (propose-only — lead/anh quyết; tôi không sửa gì)

Bốn vị từ, xếp theo rẻ→đắt. Mỗi cái kèm **cách nó TRƯỢT nếu sai** (để không thành nhãn-đo-lường rỗng).

**V-1 — Tỉ lệ ruột/khung (rẻ nhất, bắt trúng ca N1).**
```
body=$(grep -vcE '^#{1,4} |^\s*$|^>|^\|' <file>)   # dòng ruột thật
head=$(grep -cE '^#{1,4} ' <file>)                  # dòng heading
FLAG nếu  head > 0  và  body / head < K
```
Ca N1 lượt-1: body ≈ 30 (§0 + GĐ-0), head = 10 ⇒ tỉ lệ ≈ 3. Bản hoàn chỉnh 48.433 B: tỉ lệ cao hơn hẳn. **K phải do owner đặt, và phải đo phân bố trên 88 run-folder hiện có trước khi chọn** — chọn K bằng cảm tính là tự đẻ dương-giả. *Trượt khi:* tệp toàn bảng markdown (`|`) — nên dòng bảng phải tính là ruột, tôi đã loại `^\|` khỏi tử số ⇒ **cần sửa: bảng PHẢI đếm là ruột**. Ghi rõ đây là chỗ vị từ này dễ sai nhất.

**V-2 — Đếm nhãn treo (bắt trực tiếp, gần như 0 dương-giả).**
```
grep -cE '\[(ĐANG ĐO|CHỜ|TODO|PENDING)[^]]*\]' <file>   →  > 0  ⇒ FLAG "artifact còn nhãn treo"
```
Ca N1 lượt-1 = **7 hit** ⇒ bắt ngay. Bản cuối = cần đo lại (nếu bản cuối vẫn còn nhãn treo hợp lệ thì vị từ này cho dương-giả — **CHƯA ĐO**, cần `grep -cE '\[(ĐANG ĐO|CHỜ)' sub-invest-fitmap-S180.md` trên bản 48.433 B).
*Ưu điểm lớn:* nó **thưởng cho hành vi đúng** — sub ghi nhãn treo thật thà vẫn bị bắt, nhưng bị bắt **có tên**, đúng tinh thần A14 của hub (*"nợ có tên sẽ được trả"*).

**V-3 — Bộ-tệp-nội-bộ-thư-mục = đọc `run.md` làm nguồn-2 (đóng luôn B-08 + Bẫy 1).**
Vị từ: mọi lane liệt trong taskList của `run.md` phải có tệp tương ứng trong cùng thư mục, **và tệp đó phải qua V-1/V-2**. Chênh lệch **in ra danh sách tên**, không in số tổng.
*Đây là khoản đắt nhất nhưng cũng là khoản duy nhất biến "đếm" thành "mục lục".* Nguyên liệu đã có sẵn (`runs/README.md:45` taskList snapshot).

**V-4 — Nén quá tay (AS-19): so số ký tự với nguồn CÙNG ĐƠN VỊ.**
Khi một block bị nén: `chars(sau) / chars(trước)` < ngưỡng **và** số mục (`grep -c '^- '` hoặc `^\|`) giảm ⇒ FLAG. Hub nói thẳng: không có nguồn cùng đơn vị thì **khai "không đo được"** — với SE nguồn cùng đơn vị **có sẵn ở git** (`git show HEAD~1:<file>`). *Trượt khi:* nén hợp lệ có khai (chuyển sang con trỏ) ⇒ cần cho phép miễn-trừ **hiện hình** (một dòng khai nơi-đi từng ý, đúng chữ AS-19).

---

## §4 — 🔴 Ca sống của chính vai đi soi (datum, không phải lời xin lỗi)

Lead đo file này ở lượt-1: **2.765 B · 3 heading · 19 dòng ruột · 0 placeholder**, sau **150K token / 37 tool-use**.
Đây là **datum thứ hai trong cùng một phiên** cho đúng lớp bệnh, và nó **khác N1 ở một chỗ có ý nghĩa cho việc chọn vị từ**:

| | N1 lượt-1 | N3-lane-B lượt-1 |
|---|---|---|
| byte | 7.049 | 2.765 |
| nhãn treo | **7** | **0** |
| tỉ lệ ruột/heading | ≈ 3 | ≈ 6,3 |
| bản chất | khung đầy đủ, **ruột rỗng** | khung nhỏ, **ruột thật nhưng mới bắt đầu** |

⇒ **V-2 (đếm nhãn treo) phân biệt đúng hai ca này; V-1 (tỉ lệ) thì không** — nó sẽ đánh cả hai, hoặc tha cả hai, tuỳ K. **Bài học cho người dựng máy: V-2 rẻ hơn VÀ chính xác hơn V-1 cho đúng lớp `skeleton-ruột-rỗng`; V-1 chỉ nên là lưới phụ.** Nếu không có ca thứ hai này thì không phát hiện được điều đó ⇒ ghi lại như bằng chứng, không phải như lời thú tội.
🔸 Khai thẳng mặt còn lại: cả hai ca đều cho thấy **tỉ lệ byte-đĩa / token-đốt** là tín hiệu giám sát được (N1: 7.049 B / 202K ≈ **15%** giá trị trên đĩa theo chính lead tính; tôi: 2.765 B / 150K). `investigator-codebase` archive S180 đã đề xuất nối tín hiệu này vào AS-17. **Tôi ủng hộ, có bảo lưu:** SE có doctrine *"đo BYTE, CẤM quy token"* ⇒ nếu wire thì token phải **dán nguyên văn từ máy**, không gõ tay (đúng luật A11 + đèn-nợ của hub).

---

## §5 — Ô fit-map GĐ-2: đúng giá trị nào, và mẫu số

N1 ghi ô GĐ-2 = **"áp dụng (nâng từ ~70%)"** (`sub-invest-fitmap-S180.md:224`) và TC-05 = **"ĐÃ CÓ 70%"** (`:179`).

🔴 **Cả hai đều vi phạm A11 (con số phải neo nguồn) và Bẫy-5 GĐ-3 (báo đủ tick mà không nói mẫu số).** N2 đã bắt (`sub-review-n2-S180.md:82`) và đếm lại ≈ **5,5-6/8 bước**. Tôi đếm độc lập theo **mẫu số riêng của lane B = 13 khoản**:

| Trạng thái | Khoản | Số |
|---|---|---|
| **ĐÃ-CÓ (trọn)** | B-05 (cấm-sửa, mạnh hơn hub) · B-11 (ghi trước khi bắn) | **2** |
| **NỬA** (có phần, thiếu phần — liệt từng cái) | B-01 (5/7 cửa) · B-02 (2/5 trường, END-line chưa wire) · B-03 (sweep có, `runs/` trong ExcludeDirFragment) · B-04 (tầng-A có, tầng-B chết) · B-06 (2/4 vị từ, sai tầng) · B-07 (2/3 nhịp) · B-09 (2/3 vế) · B-12 (luật có, máy không) | **8** |
| **THIẾU (trọn)** | B-08 (điểm danh 2 nguồn) · B-10 (mức nghiêm trọng theo chi phí) · B-13 (đối chứng dương — đã chạy, TRƯỢT) | **3** |
| **NGƯỢC** | **0** — GĐ-2 **không có xung đột triết lý nào** với SE. (Xung đột exit-0-advisory ⟂ cổng-chặn-mã-lỗi là của **GĐ-3**, không phải GĐ-2. N1 ghi "Xung đột: không" ở GĐ-2 — **tôi xác nhận N1 đúng ở điểm này**.) | **0** |

**Quy đổi sang các mẫu số khác — để ai đếm kiểu nào cũng lần được:**
- Theo **13 khoản lane B**: `2 trọn + 8 nửa + 3 thiếu` → nếu tính nửa = 0,5 thì **6/13 ≈ 46%**.
- Theo **8 bước thư chính** (`:154-162`): trùng cách N2 đếm ⇒ **≈ 5,5-6/8 ≈ 69-75%**.
- Theo **6 ô nghiệm thu phụ lục** (`:172-177`): ô1 nửa · ô2 đạt · ô3 **trượt** · ô4 **trượt (đã chạy, §2)** · ô5 nửa (sổ tồn tại nhưng đã retired; **không có trần khai**) · ô6 **trượt** → **1,5/6 = 25%**.

🔴 **Ba mẫu số, ba con số: 46% · 72% · 25%.** Chênh gần **ba lần**. Đây là lý do hub cấm in số trần. Con số "~70%" của N1 **không sai** — nó là con số của **mẫu số 8-bước**, tức mẫu số **dễ nhất trong ba**. Mẫu số **khó nhất và cũng là mẫu số hub dùng để cấp nấc** là **6 ô nghiệm thu**, và ở đó SE mới **25%**.

**Ô fit-map đúng (1 trong 3 giá trị hub cho phép): `đã áp một phần` không phải giá trị hợp lệ ⇒ chọn `chưa làm` + mốc.** Cụ thể: **GĐ-2 = `chưa làm`**, kèm mốc W2 và kèm khai *"tầng-A + vai-cấm-sửa + ghi-trước-khi-bắn đã có sẵn, sẽ tái dùng"*. Lý do phải chọn `chưa làm` chứ không `đã áp`: **4/6 ô nghiệm thu trượt**, trong đó ô-4 tôi **đã chạy phép thử và máy trượt thật** (§2) — theo A14 của hub, đánh dấu xong mà không có bằng chứng chạy được là lớp lỗi đắt nhất.

---

## §6 — CHƯA ĐO (bàn giao được, kèm lệnh cụ thể)

1. `secrets_sweep` có phủ `.claude/workflows/runs/` không → `grep -n "rglob\|scan_root\|runs" scripts/session_ctx.py` quanh `:150-200`.
2. Bookend @open phiên sau có thật sự đọc run-folder phiên TRƯỚC không (vế v-3 của B-09) → `grep -n "run-folder\|runs/\|phiên trước\|previous" .claude/agents/lead-gap-auditor.md .claude/agents/lead-stale-auditor.md`.
3. Bản N1 hoàn chỉnh (48.433 B) còn nhãn treo nào không (chỉnh ngưỡng V-2) → `grep -cE '\[(ĐANG ĐO|CHỜ)' .claude/workflows/runs/2026-08-07-S180-…/sub-invest-fitmap-S180.md`.
4. Phân bố tỉ lệ ruột/heading trên 88 run-folder để chọn K cho V-1 → vòng lặp `grep -vcE` / `grep -cE` trên `runs/*/sub-*.md`.
5. `governance-detectors.ps1` chạy trên repo thật đã xong (nền, exit=0) — **chưa đọc output**; cần soi xem có FLAG nào chạm `runs/` ngoài C11 không → đọc `det-real.txt`, `grep -i "runs\|C11"`.

**→ 5/5 mục trên ĐÃ ĐÓNG ở §7 dưới.** Không còn nợ trong lane B.

---

## §7 — Đóng 5 mục `CHƯA ĐO` (đo xong, dán lệnh + kết quả)

### 7.1 — [đóng mục 1] `secrets_sweep` **KHÔNG** phủ `runs/` ⇒ B-03 nặng hơn tôi viết ở §1

```
grep -n "def secrets_sweep\|rglob\|secrets_sweep(" scripts/session_ctx.py
  :173  def secrets_sweep(session_dir):
  :180      for p in sorted(session_dir.rglob('*')):
  :787      hits = secrets_sweep(session_dir)
```
Hàm nhận **`session_dir`** và `rglob` **bên trong đó** ⇒ phạm vi = `.claude/sessions/<n>/`. **`.claude/workflows/runs/` nằm ngoài.**

🔴 **Sửa đánh giá B-03 từ NỬA xuống THIẾU-CÓ-TÊN.** Vật chứng đắt tiền của SE bị **hai vùng miễn cùng lúc**:
1. **ngoài** phạm vi quét bí mật (`secrets_sweep` chỉ soi `sessions/`);
2. **trong** danh sách loại trừ của detector — output thật của lượt chạy hôm nay in nguyên văn ở cuối: `- excluded: .claude/workflows/runs`.

Hub viết ở bước 3 (`:157`): *"Kiểm tra đích ghi **nằm trong vùng có quét bí mật**, không rơi vào vùng miễn quét."* ⇒ **SE trượt đúng khoản này**, và trượt ở nơi đắt nhất. N1 khai *"đích ghi nằm trong vùng có quét bí mật ✓"* (`:79`) — câu đó **đúng cho `sessions/`** và **N1 có ghi kèm "cho sessions/"**, nên đây **không phải N1 sai**; nhưng ô kết luận GĐ-2 lại không kéo hệ quả cho `runs/`.

---

### 7.2 — [đóng mục 3 + 4] V-2 tinh chỉnh: phân biệt **DÙNG ⟂ NHẮC ĐẾN**, 0 dương-giả trên 3 file

Vị từ thô `grep -cE '\[(ĐANG ĐO|CHỜ)'` **cho dương-giả trên chính bản hoàn chỉnh**:
```
sub-invest-fitmap-S180.md (48.433 B, bản XONG)  → 1 hit
  :5  > **Trạng thái file:** … Mục nào chưa xong sẽ có nhãn `[ĐANG ĐO]`.
```
Hit đó là **câu định nghĩa nhãn**, không phải nhãn đang treo. Đây đúng lớp **citation-trap self-reference** SE đã ghi vào sổ (`feedback_citation_trap_selfreference`: *doc định-nghĩa anti-pattern TẤT-YẾU chứa mẫu đó ⇒ detector khớp-mẫu bắt chính nó*), và **cách vá đã có sẵn trong chính bài học đó**: discriminator = **enclosure, use ⟂ mention**.

**Vị từ V-2 chốt lại — neo vào HEADING (chỗ duy nhất nhãn treo có nghĩa "mục này chưa xong"):**
```bash
grep -cE '^#{1,6} .*\[(ĐANG ĐO|CHỜ|TODO|PENDING)' <file>      # >0 ⇒ FLAG
```
**Bảng đối chứng 3 file (2 âm-thật + 1 dương-thật):**

| File | thô | **V-2 heading-scoped** | Đúng? |
|---|---|---|---|
| N1 lượt-1 (7.049 B, skeleton) | 7 | **6** | ✅ dương-thật — và **6 khớp đúng con số "6/9" của lead** |
| N1 bản xong (48.433 B) | 1 ❌ | **0** | ✅ âm-thật (thô cho dương-giả) |
| chính file lane B này | 2 ❌ | **0** | ✅ âm-thật (thô cho dương-giả) |

⇒ **V-2 heading-scoped: 3/3 đúng, 0 dương-giả, 1 lệnh, không cần trạng thái, không cần config.** Đây là ứng viên rẻ nhất và sạch nhất trong 4 vị từ ở §3. Nó **tự nó** bắt được ca N1.
🔸 Khai giới hạn thật thà: nó chỉ bắt sub **thật thà tự dán nhãn treo**. Sub để heading trống trơn (không nhãn) thì V-2 mù — chỗ đó phải là **V-1 tỉ lệ ruột/heading** hoặc **V-3 bộ-tệp-nội-bộ** đỡ. Ba vị từ **bổ sung nhau, không thay nhau**.
🔸 Mục 4 (đo phân bố K cho V-1 trên 88 folder) **không còn nằm trên đường tới hạn**: V-2 đã đủ cho ca N1 mà **không cần ngưỡng nào**. Giữ mục 4 làm việc tuỳ chọn của V-1, không phải điều kiện chặn.

---

### 7.3 — [đóng mục 2] Vế (v-3) của B-09 **yếu hơn tôi viết** — hạ từ ✅ xuống ⚠️ NỬA

```
grep -c "run-folder\|runs/" .claude/agents/lead-gap-auditor.md    → 1
grep -c "run-folder\|runs/" .claude/agents/lead-stale-auditor.md  → 0
control-dương (từ khoá chắc chắn có, cùng 2 file):
grep -c "FLAG"  → lead-gap 3 · lead-stale 4     ⇒ lệnh chạy đúng, 0 ở trên là 0 THẬT
```
Và hit duy nhất của `lead-gap-auditor` **không phải** chỉ thị đọc run-folder phiên trước — nó là dòng mô tả class `gap-incident-unrecorded` (`:39`).

🔴 **Hệ quả:** cặp bookend **có chạy ở đầu phiên sau** (đúng nhịp), nhưng **spec của cả 2 vai không hề bảo chúng soi vật chứng run-folder của phiên trước**. Cái phủ vế (v-3) trên thực tế là **`closeout-sentinel` M5** (delta thư mục vai) + **`nhip-no-probe` run-chua-gom** — cả hai đều **không đọc ruột tệp**. ⇒ điểm mù của hub (`:161`) **vẫn mở ở SE**: vật chứng do vai điểm danh sinh ra **chưa có ai soi ruột**, kể cả ở phiên sau.
Sửa bảng B-09: **(v-1) NỬA · (v-2) ✅ CÓ · (v-3) ⚠️ NỬA** (có nhịp, thiếu chỉ thị) ⇒ khoản (v) tổng = **1/3 trọn + 2 nửa**, không phải 2/3 như tôi viết ở §1. **Tự đính chính, giữ cả câu cũ để so.**

---

### 7.4 — [đóng mục 5] Detector thật sự chạm `runs/` bao nhiêu, và chạm để làm gì

Chạy thật `scripts/governance-detectors.ps1` trên repo (read-only, exit=0):
```
TOTAL FLAGS: 49
INFORM-ONLY (…C11 h24-flag-form…): 21 - counted SEPARATELY, NOT in TOTAL
  - excluded: .claude/workflows/runs          ← in ra ở khối tự khai cuối
self-match check: … leaked excluded files in scan = 0   [OK] 0 self-match (C4 satisfied)
NOTE: DETECT-only lowering net. Exit 0 always (never fails build). FLAGs are advisory.
```
Lọc các dòng chạm `runs/`:
```
grep DETECTOR det-real.txt | grep workflows/runs | wc -l   → 21
… | sed 's/|.*//' | sort | uniq -c                        → 21× "[DETECTOR] LOW"
```
**Cả 21 dòng đều là C11 FLAG-khuôn, severity LOW, INFORM-only, và toàn bộ trỏ vào run-folder S151.** Không một dòng nào nói về **ruột tệp cụt / rỗng / nén**.

🔴 **Ba kết luận đo được, không suy đoán:**
1. `runs/` là **vùng loại trừ có tuyên bố** của detector; C11 là **cửa hậu duy nhất** mở lại nó, và cửa hậu đó chỉ soi **khuôn tag FLAG** + **diary-delta**.
2. 21 flag chạm `runs/` được đếm **TÁCH khỏi TOTAL 49** ⇒ ngay cả khi C11 có bắt gì trong run-folder, con số đó **không vào tổng**. Với GĐ-2 điều này quan trọng: **mức nghiêm trọng của vật chứng đắt (B-10) hiện đang bị đặt ở nấc THẤP NHẤT** (`LOW` + `INFORM-only` + ngoài TOTAL) — **ngược đúng chiều** hub yêu cầu ở phụ lục `:154` (*"Lượt chạy đắt thiếu tệp là **nghiêm trọng nhất**"*).
3. Câu cuối `Exit 0 always … FLAGs are advisory` là hạt nhân xung đột **GĐ-3**, **không phải GĐ-2** — tôi **không** kéo nó vào lane B. Ghi ở đây chỉ để người đọc sau không nhầm hai lane. *(OD-2: GĐ-3 làm sau GĐ-2, không gộp.)*

---

## §8 — Chốt lane B

**Mẫu số dùng suốt: 13 khoản (B-01…B-13).** Sau khi §7 sửa 2 khoản (B-03 xuống THIẾU, B-09 xuống nửa):

- **ĐÃ-CÓ trọn: 2** — B-05 (vai cấm-sửa, backstop git-diff **mạnh hơn hub**) · B-11 (ghi vật chứng trước khi bắn).
- **NỬA: 7** — B-01 (5/7 cửa) · B-02 (2/5 trường, END-line ghost-wire) · B-04 (tầng-A có, tầng-B chết-có-khai) · B-06 (2/4 vị từ, sai tầng) · B-07 (2/3 nhịp) · B-09 (1 trọn + 2 nửa) · B-12 (luật có răng, máy không có).
- **THIẾU trọn: 4** — B-03 (`runs/` ngoài quét bí mật **và** trong excluded) · B-08 (điểm danh 2 nguồn — không có vế phải) · B-10 (mức nghiêm trọng theo chi phí — hiện **đang ngược chiều**) · B-13 (đối chứng dương: **đã chạy, TRƯỢT**).
- **NGƯỢC: 0.** GĐ-2 **không có xung đột triết lý** với SE — N1 ghi "Xung đột: không" ở GĐ-2 là **đúng**, tôi xác nhận độc lập. *(Xung đột exit-0 ⟂ cổng-chặn thuộc GĐ-3.)*

**Ô fit-map GĐ-2 = `chưa làm`** (1 trong 3 giá trị hợp lệ), kèm mốc **W2** và kèm lý do: **4/6 ô nghiệm thu của hub trượt**, trong đó ô-4 **tôi đã chạy phép thử và máy trượt thật** (§2). Không được ghi `đã áp` — theo A14 đó là *"nợ vô hình"*, lớp lỗi hub tự nhận đắt nhất năm.

**Mẫu số cho mọi tỉ lệ (bắt buộc khai, vì ba mẫu số lệch gần 3 lần):**
`13 khoản lane B → 5,5/13 ≈ 42%` · `8 bước thư chính → ≈5,5-6/8 ≈ 69-75%` · `6 ô nghiệm thu (mẫu số hub dùng cấp nấc) → 1,5/6 = 25%`.
Con số **"~70%"** của N1 **không sai** — nó là con số của **mẫu số dễ nhất trong ba**, và nó **thiếu nhãn mẫu số** nên người đọc mặc định hiểu là "gần xong". Ở mẫu số hub thật sự dùng, SE ở **25%**.

<!-- END sub-n3-lane-b-gd2 — VERDICT=GĐ-2 `chưa làm` · 13 khoản: 2 đã-có · 7 nửa · 4 thiếu · 0 ngược · máy bắt ca N1 = 0/5, control-dương xác nhận thước sống · vị từ đề xuất V-2 heading-scoped 3/3 đúng -->


