# sub-lead-gap-S151 — H24 bookend @open S151 (hình B, light-scope)

> Vai: `lead-gap-auditor` — soi CÁI BỊ THIẾU. INFORM-only, propose-only.
> Class ∈ enum ĐÓNG `memory-budget.json → lead_self_audit.flag_classes` (6 `gap-*`).

## Trạng thái: DONE

- [x] Đọc `run.md` + `machine-baseline.md`
- [x] Đọc diary MEMORY.md (baseline S124/S137/S140/S143/S146/S148/S150)
- [x] Đọc enum class ĐÓNG (`memory-budget.json:156-168`)
- [x] Dựng tập KỲ-VỌNG từ commitment-sources (HANDOFF:6/:24/:25 · WAL · `.session-counter.json` history[] · session-log S149-S150 · NEXT-em S150 · `session-start §2.1.1/§2.1.6/§0.7` · `session-end §L.b(j)(ii)`)
- [x] So + disk-touch từng ứng viên (≥1 lệnh chạm đĩa/FLAG — luật S121)
- [x] Kết luận: **3 FLAG + 4 INFORM + 3 honest-zero**

---

## FLAG-1 — `gap-carry-aged` — SEV HIGH

**Thước tuổi-carry vừa bị VÔ-HIỆU-HOÁ IM LẶNG: 3-FIRE → 0-FIRE mà KHÔNG carry nào đóng.**

**Hứa ở (nguồn cam-kết):** `scripts/governance-detectors.ps1:800-801` — *"A `[carry:<slug>]` key that survives >= M CONSECUTIVE most-recent carry-lines is …"* ; M = `memory-budget.json → h24_cadence.light_every` = 6.

**Hiện:** `machine-baseline.md:18` — *"H24-2 carry-age: 20 carry-line, **tất cả streak=1** < M=6 → **0 flag**"*.

**Đối chứng lịch-sử (ĐỌC detector, KHÔNG tự tính — 3 lần đo trước đều là output MÁY, chép trong diary tao):**

| phiên | detector H24-2 in ra | FIRE |
|---|---|---|
| S143 | `uat-s134-luyke` **7** · `uat-s133-budget-freeze` **9** · `hook-vs-budget-cap` **13** | 3 |
| S148 | y HỆT **7 / 9 / 13** | 3 |
| S150 | y HỆT **7 / 9 / 13** | 3 |
| **S151** | **tất cả = 1** | **0** |

**Disk-touch — 3 carry đó CÓ ĐÓNG KHÔNG?** `grep` trên `docs/HANDOFF.md`:

```
uat-s134-luyke           line6=1  NEXTanh(:24)=1   => CÒN MỞ
uat-s133-budget-freeze   line6=1  NEXTanh(:24)=1   => CÒN MỞ
hook-vs-budget-cap       line6=1  NEXTanh(:24)=1   => CÒN MỞ
```

⇒ **0/3 đóng.** Số tụt 3→0 **không** vì việc xong.

**CƠ-CHẾ (đọc thẳng từ source, `governance-detectors.ps1:876-905`):**

1. `:877` `$marks = [regex]::Matches($raw, 'NEXT\s+(?:anh|em)')` — HANDOFF bị **cắt segment tại MỌI chuỗi `NEXT anh` / `NEXT em`**, kể cả khi nó nằm **giữa câu văn xuôi**.
2. `:899-903` streak = đếm **liên-tiếp từ `$carryLines[0]`**, gặp segment đầu tiên KHÔNG chứa khoá là **`break`**.

**Vật chứng cắt:** `docs/HANDOFF.md:24` chứa **2 lần** chuỗi `NEXT anh` — lần 2 nằm trong văn xuôi mục (20): ``… Kèm: `NEXT anh #11` vẫn liệt "map N↔L" như câu hỏi MỞ …``

Đo bằng `sed -n '24p' | awk -F'NEXT anh'` trên đúng dòng 24:

| | slug |
|---|---|
| **TRƯỚC** splitter = `carryLines[0]` | `hook-vs-budget-cap` `pull-warn-threshold` `session-model-adopt` `tools-whitelist-no-teeth` `uat-s133-budget-freeze` `uat-s134-luyke` |
| **SAU** splitter = `carryLines[1]` | `eval-thamquyen` `g011-token-fork` `jump-dai-frozen` `tham-sau-6-ca` `underfill-mau-so` `veto-window-s149` |

**Giao 2 tập = ∅** ⇒ mọi khoá trong `carryLines[0]` `break` ngay vòng 2 ⇒ **streak ≡ 1 cho TẤT CẢ**.

**Vì sao S148/S150 CHƯA vỡ mà S151 vỡ:** mục (20) (mang chuỗi `NEXT anh #11`) sinh @S148 — nhưng khi đó khúc SAU splitter **không có slug nào** ⇒ segment 0-khoá ⇒ `:887` `if ($ks.Count -gt 0)` loại nó khỏi `$carryLines` ⇒ chuỗi vẫn nối xuống khối `:27` (13 slug) ⇒ 7/9/13 đúng. **@S150 lead thêm 6 slot (21)-(26) vào CUỐI dòng 24** — tức **SAU** splitter — làm khúc đó có 6 khoá mới ⇒ **thành `carryLines[1]` hợp-lệ** ⇒ cắt đứt mọi chuỗi.

**Phép thử "nếu thiếu thật thì ai bắt được":**
- **MÁY: KHÔNG.** Detector in `[ok] carry '<k>' streak=1 < M=6` (`:914`) — **giọng TRẤN AN**; không nhánh nào so streak với lịch-sử, không nhánh nào cảnh-báo "tập đo vừa đổi hình". Đúng ca H24 §2(1) *"máy im là ĐÚNG"*.
- **`lead-stale-auditor`: KHÔNG** — nó soi cái CÓ-nhưng-LỆCH; số `1` **khớp** đầu-vào hiện tại, không lệch nguồn nào.
- **H1/H2: KHÔNG** (phiên này còn bị skip — FLAG-3).
- ⇒ **0 lớp bắt.** Bắt được chỉ vì tao giữ 3 số đo cũ CỦA MÁY trong diary rồi so chéo.

🔴 Đúng class user-memory `feedback_goodhart_leave_measurement_set`: *"vá bằng đổi HÌNH-DẠNG thứ đang bị đo = rời tập-đo; flag-count giảm trông y hệt thành công"*. Hành-vi gây ra nó (**thêm slot carry cho owner**) là hành-vi **ĐÚNG** — đó là chỗ nguy: sẽ tái diễn mỗi lần ai viết cụm `NEXT anh`/`NEXT em` trong văn xuôi rồi thêm slug phía sau.

**resolve:** detector H24-2 chỉ cắt segment tại `NEXT anh/em` **đứng đầu dòng logic** (vd neo `\*\*.{0,4}NEXT\s+(anh|em)`), HOẶC lấy chính khối canonical `Carry MỞ re-stamp` làm nguồn tuổi — rồi **fault-inject 2 chiều** (chèn 1 cụm `NEXT anh` văn xuôi + 1 slug mới ⇒ streak PHẢI giữ nguyên) và in lại được 7/9/13 (hoặc 8/10/14 sau khi tính S151).

---

## FLAG-2 — `gap-decision-sunk` — SEV MED-HIGH

**Đề-xuất-fix "chờ anh gật" của sự-cố tick S151 sống DUY-NHẤT trong `history[]` của `.session-counter.json` — 0 đường về owner. REPEAT CẤU-TRÚC lần 2 của chính container này.**

**Hứa ở:** `.claude/governance/.session-counter.json:135` (entry S151, lead vừa ghi hôm nay) — nguyên văn: *"**DE-XUAT FIX (cho anh gat @S151)**: h24-signal-write.ps1 doi sang surgical-write cung khuon tick script HOAC tick script chap nhan ca 2 shape; **khong fix thi MOI tick sau MOI bookend deu fail-loud**."* + `machine-baseline.md:22` (artifact run-folder).

**Hiện: VẮNG.** `grep -oic` 3 token × 6 bề-mặt bền:

| surface | `format-fork` | `shape.drift` | `exit 7` |
|---|---|---|---|
| `docs/HANDOFF.md` | 0 | 0 | 0 |
| `docs/STATUS.md` | 0 | 0 | 0 |
| `.claude/WAL.md` | 0 | 0 | 0 |
| `.claude/governance/ACTIVE-MARKS.md` | 0 | 0 | 0 |
| `docs/changelog/migration-todos.md` | 0 | 0 | 0 |
| `docs/governance/error-ledger.md` | 0 | 0 | 0 |

`grep -rilE "format-fork|shape drift|exit 7" docs/changelog/sessions/ .claude/sessions/` ⇒ **0 file**.
(2 hit `h24-signal-write` ở HANDOFF/STATUS là ngữ-cảnh KHÁC — liệt-kê 4 máy PS1 land @S150; đã kiểm bằng `grep -o '.\{80\}h24-signal-write.\{120\}'`.)

**REPEAT của FLAG @S137 — CÙNG CONTAINER:** S137 tao bắt `gap-decision-sunk` repeat-2 vì candidate-fix `dangling-head` sống **8-10 phiên CHỈ trong history[] của đúng file này**. Vá lần đó = **kéo tay** thành `[carry:dangling-head]`, **KHÔNG dựng nghi-thức**. Kiểm lại hôm nay: `grep -rniE "session-counter\.json|history\[\]"` trên `session-end.md`/`session-start.md`/`tiep.md`/`pause.md` ⇒ mọi hit đều là **TICK / add-đích-danh / đóng-băng-bề-mặt-đo**; **KHÔNG bước nào ĐỌC `history[]`** để đẩy khoản chờ-owner lên NEXT-anh ⇒ container vẫn nuốt như cũ.

**Đòn-bẩy bất-đối-xứng (chống đọc nhầm thành "owner đang giữ"):** cùng bảng NEXT-anh có **26 slot**, trong đó **6 slot vừa đúc @S150 (#21-#26)** đúng cho loại khoản chờ-anh này. Khoản S151 mới hơn cả 6 cái đó, **tự khai "cho anh gật"**, mà **0 slot**. Thêm nữa `WAL.md` đang **RỖNG** (182B, `chain: (rỗng)`, mtime 12:18:29) ⇒ kể cả đường tạm cũng không có.

**Phép thử "ai bắt được nếu thiếu thật":** MÁY KHÔNG — `governance-detectors` không đọc `history[]`; `H24-5` chỉ kiểm reachability `last_ticked_head` và **đã in OK-reachable** (`machine-baseline.md:19`). `lead-stale-auditor` KHÔNG — không view nào lệch. Nếu S151 chết trước closeout (**tiền-lệ: S137 chết trước session-end**) thì chìm y hệt `dangling-head` 8-10 phiên; mà nó tự khai hậu-quả **tái phát MỖI tick sau MỖI bookend** — bookend nay là **hình B vô-điều-kiện 2 đầu/phiên**.

**resolve:** closeout S151 đúc 1 slot NEXT-anh (+`[carry:*]`) cho `format-fork tick⟂signal-write`; hoặc **rẻ hơn & đóng cả class**: thêm 1 bước ở `session-end §L.b(j)` — quét `history[]` từ closeout trước, khoản nào chứa "cho anh"/"chờ anh" mà 0 hit trên 5 bề-mặt owner ⇒ đúc slot.

---

## FLAG-3 — `gap-carry-dropped` — SEV MED

**Việc NEXT-em S150 giao đích-danh cho "phiên kế" rơi khỏi kế-hoạch S151, VÀ lớp máy duy-nhất bắt hộ nó cũng bị skip trong cùng phiên.**

**Hứa ở:** `docs/HANDOFF.md:25` (NEXT em, viết @S150 cho phiên kế) — nguyên văn: *"**sub-class #53 mới (`ngược-#53` · `skeleton-ruột-rỗng`) theo dõi thêm 1 phiên → xét error-ledger row (2-strike)**"*. Neo 2: `.claude/auto-memory/feedback_agent_return_garble_recover.md:20` — *"ghi-đĩa-trong-lúc-làm = **CẦN, KHÔNG ĐỦ** — lead phải **verify BYTE-CONTENT tăng thật** trong lúc wave chạy (không chỉ file tồn-tại)"*.

**Hiện: VẮNG.** `grep -oic` trên 2 artifact kế-hoạch của chính wave này:

```
ngược-#53           run.md=0   machine-baseline=0
skeleton-ruột-rỗng  run.md=0   machine-baseline=0
2-strike            run.md=0   machine-baseline=0
```

`grep -niE "ngược-#53|nguoc-#53|skeleton" docs/governance/error-ledger.md` ⇒ **0**.
`run.md:14` CÓ anti-#53 nhưng **chỉ vế CẦN**: *"Ghi-đĩa-TRONG-lúc-làm (anti-#53 — tally 45; ghi trước, return sau…)"* — **vế "KHÔNG ĐỦ" (lead verify byte-content) không có mặt**. Đúng nửa bài học bị rơi.

**Leg-2 — H1/H2 skip @open, tiền-đề bị chính máy của lead bác:**

- Cam-kết: `session-start.md:174` §2.1.1 — *"Đầu session: 2 monitor sub BÁO LẠI trạng-thái + diff vs session trước (**floor** Harness 1 H1.2 + H2.2)"*.
- Điều-kiện skip **ghi rõ** `:178`: *"**Light session / hỏi-đáp → có thể skip; bug/feature/multi-agent/wave session → nên chạy**"*. Phiên này = **wave multi-agent** (`run.md` taskList 4 mục, 3 sub spawn) ⇒ rơi vào vế **"nên chạy"**, KHÔNG phải vế được phép skip.
- Lý-do lead nêu (`machine-baseline.md:29`): *"delta-từ-close ≈ 0"*. 🔴 **Bị bác bởi chính dòng `:15` cùng file**: detector vừa bắt **MED MỚI** — `docs/changelog/sessions/2026-07-25-1200-…md:85` cite gotcha **#111** trong khi max = **83** — file đó **land SAU** lượt H1/H2 cuối (H1/H2 chạy trong wave @S150 close; commit docs `398d343` viết file này sau) ⇒ delta **≠ 0** trên đúng trục H1 (docs-freshness).
- H2 mất gì cụ-thể: `:177` H2 = *"scan `runs/*/` tìm folder có `run.md` mà `*-synthesis.md` VẮNG/0-byte = orphan run … Bắt **0-byte memory (gotcha #53)**"* — tức **đúng cái máy dò `skeleton-ruột-rỗng`** mà NEXT-em bảo theo dõi phiên này. Bỏ H2 = gỡ đúng cái lưới cho đúng cái việc vừa giao.
- Khai công-bằng phần máy CÓ phủ: `run-chua-gom 0` (nhip-no-probe) + `H25-role-notebook roster=20/diaries-ok=20/flagged=0` phủ **một phần** H2. **Không phủ**: Fidelity của append lead-on-behalf sau wave 7/7-garble @S150, và toàn bộ 4-mặt H1.

**Phép thử "ai bắt được nếu thiếu thật":** không ai. `run-chua-gom` đếm folder **chưa gom**, không đo **ruột file**; `H25-role-notebook` chỉ hỏi diary **tồn-tại** (`flagged=0`) — mà `skeleton-ruột-rỗng` theo định-nghĩa là **VẬT tồn-tại mà RUỘT rỗng** ⇒ cả 2 máy in xanh cho đúng ca cần bắt. Không vai nào khác đọc NEXT-em.

**resolve:** (a) 1 dòng closeout ghi strike-count `ngược-#53`/`skeleton-ruột-rỗng` phiên này (**kể cả 0** — 0 có nguồn vẫn là datum cho luật 2-strike); (b) hoặc chạy H2 @close pin run-folder này; (c) nếu vẫn giữ skip H1/H2 thì ghi lý-do theo đúng chữ `:178` (session-type), đừng dùng "delta ≈ 0" đã bị `:15` bác.

---

## INFORM-1 — quyết-định owner "Bootstrap tiếp, bỏ mạch" 0 vết bền (CỐ Ý KHÔNG nâng thành FLAG)

`machine-baseline.md:25` là **hit DUY NHẤT** toàn repo (`grep -rniE "bỏ mạch|bo mach|bootstrap tiếp"` trên HANDOFF/STATUS/WAL/ACTIVE-MARKS/`.session-counter.json`/`sessions/`/error-ledger/`docs/changelog/sessions/` = **0**), mà file đó đang **untracked** (`git status: ?? .claude/workflows/runs/2026-07-25-S151-…/`).

🔴 **KHÔNG flag** — khai rõ lý-do để lần sau không ai đọc ngược: đây **đúng nhánh canonical** của nghi-thức (`session-start.md:78` — *"…hoặc bảo em **bootstrap tiếp bỏ mạch**"*) và là **owner CHỦ-ĐỘNG gác**, tức anti-pattern #3 của chính vai tao (*vắng ≠ bỏ rơi*). Dư-lượng tự tiêu: `git log origin/main..HEAD` = **1 commit `7ce0798 wal: flush`**, squash+push ở closeout là hết.
Đề-nghị rẻ (không bắt buộc): 1 câu trong session-log S151 — vì đối-xứng nội-bộ đang lệch: sự-kiện tick cùng phiên được ghi **đầy đủ** vào `history[]` lúc 17:18, còn **lời của anh** thì không sổ nào giữ.

## INFORM-2 — `gap-underfill` BẤT-KHẢ-ĐO tại bookend @open **theo cấu-trúc**, không phải "chưa soi"

`session-start.md:224` §2.1.6: %-print + Headroom **"In ở Phase 3 REPORT"**; cặp H24 spawn ở **§2.1.8(e)** (`:265`, Phase 2) ⇒ cặp **luôn** chạy TRƯỚC con số. Trước đây light-audit theo nhịp nên còn ngẫu-nhiên; nay **hình B = vô-điều-kiện mỗi đầu phiên** ⇒ 1 trong 6 class của tao **chết-lúc-sinh ở mọi lượt @open**, vĩnh viễn.
Datum kèm: `/tiep` vẫn **0 bước %-print** (repeat lần 4 — S143/S148/S150). Đề-nghị: chuyển %-print lên trước §2.1.8, HOẶC khai thẳng trong spec rằng `gap-underfill` **chỉ đo được ở lượt @close** (đừng để nó im rồi bị đọc thành "sạch").
🔴 KHÔNG báo lại carry **#26** (`crystallized_backfill.target` 210000 > headroom 187.693 — `machine-baseline.md:10`): đã treo, owner-held.

## INFORM-3 — khối carry CANONICAL (`HANDOFF:6`, **24 slug**) nằm NGOÀI vùng đo của H24-2

`grep -noE 'NEXT (anh|em)' docs/HANDOFF.md | head` ⇒ mark đầu tiên ở **dòng 24**. Detector chỉ dựng segment **TỪ** mark đầu (`:878-882`) ⇒ toàn bộ dòng 1-23, trong đó có khối *"**Carry MỞ re-stamp @S150 (nghi-thức (iv) — đủ MỌI slug còn mở)**"* với **24 slug distinct** (đếm `grep -o … | wc -l`, KHÔNG `grep -c` — bẫy mega-line), **không bao giờ được đo**. Máy chỉ thấy 12 slug của dòng 24.
⇒ Nghi-thức re-stamp (iv) và thước tuổi đang **đo hai vật khác nhau**. Cùng gốc coverage-gap S140 INFORM-2 nhưng **đo được đích-danh lần đầu**; đây cũng là nửa còn lại của FLAG-1.

## INFORM-4 — carry-arithmetic SẠCH (0 slug biến mất im lặng)

Đối-chiếu `HANDOFF:6` (24 slug) ⟂ `HANDOFF:24` (12 slug) ⟂ toàn repo: `comm -23` ra 17 slug lạ, **tất cả** truy về run-folder cũ / segment "Prev" lịch-sử / bản đã ĐÓNG (`dangling-head` `snapshot-cmd` `pause-autosnap`) hoặc **fork tên trong artifact vai cũ** (`meld-forward`↔`meld-forward-unmeasured`, `pause-tu-chup`↔`pause-autosnap`, `tiep-doc-snapshot`↔`tiep-window-crash`) — **không** slug nào là cam-kết sống rơi khỏi khối hiện-hành ⇒ **khác S143** (ca tổng-không-đổi che mất 1 carry).
🔸 Con số "**#4→#26**" trong đề-bài: đo tươi dòng 24 = **26 mục**, struck-through = **6** (#1 #2 #3 #17 #18 #19) ⇒ **20 mở**, không phải 23. Số đếm lệch = `view-stale-count` ⇒ **turf `lead-stale-auditor`**; nêu để nhường, KHÔNG tính vào tally của tao.

---

## Honest-zero (có disk-touch, KHÔNG phải chưa soi)

- **`gap-incident-unrecorded` = 0.** Hai sự-cố đều CÓ sổ bền: (a) tick FAIL-LOUD exit 7 → `.session-counter.json:135` entry S151 đầy đủ root-cause; (b) `#53` tally **45** → `.claude/auto-memory/feedback_agent_return_garble_recover.md:18` (*"TỔNG = 45 qua S150"*, derive-from-body, cộng từng dòng) + sub-class mới ở `:20`. ⇒ **KHÔNG** ca "sự-cố đã xảy ra mà 0 hit mọi sổ". (Số cũ `×27`/`~×31` còn sống ở STATUS = **số cũ ⇒ `view-*` turf**, ranh S143 ghi rõ.)
- **`gap-owner-specifics` = 0.** 2 lượt owner S151: (a) "Bootstrap tiếp, bỏ mạch" — **chép nguyên văn**, không mất chữ (vấn-đề là ĐỘ BỀN → INFORM-1); (b) tick-fail + fix — `history[]` giữ **cả** root-cause (format-fork: BOM/CRLF/2-space vs LF/no-BOM/1-space) **lẫn** 2 nhánh fix **lẫn** hậu-quả nếu không fix. Không khoản nào bị viết chung-chung. (Vấn-đề của (b) là KHÔNG AI THẤY → `gap-decision-sunk` FLAG-2; tránh đếm 2 lần.)
- **`gap-underfill` = 0 bất-khả-đo** (lý-do INFORM-2, không phải chưa soi). Ứng-viên đã **cân-nhắc rồi BÁC**: *"`hotload_sources` kê `docs/HANDOFF.md` 115.553B ≈ 62K tok > trần Read 25K/lệnh ⇒ nạp thiếu by-construction"* — bác vì Read **phân trang được** (`offset/limit`; dòng dài nhất = 10.389 ký-tự, đọc lọt) ⇒ khó ≠ không nạp được, và tao **không có** bằng-chứng phiên này nạp thiếu. Không dựng FLAG trên giả-thuyết (bài S124).

---

## Số đo jump (SỐ ĐO, không phải đề-nghị — quyết kéo nhịp = em-main/owner)

Đơn-vị tally = **phiên-LOGIC**, max-1/class/phiên (`session-end §L.b(j)(ii):115`); khoá `_frozen_until_owner` đang CẮM ⇒ máy GIỮ counts không-fire.
Class tao fire @open S151: **`gap-carry-aged`** · **`gap-decision-sunk`** · **`gap-carry-dropped`**.
Cộng vào `class_repeat.counts` hiện tại (`.session-counter.json:40-51`): `gap-decision-sunk` 4→**5** · `gap-carry-dropped` 4→**5** · `gap-carry-aged` 1→**2**. `gap-owner-specifics` giữ **5**, `gap-incident-unrecorded` giữ **1** (tao không fire — reset hay giữ là việc của máy + khoá frozen).
⇒ jump=3: **2 class của tao vượt (5, 5)**, 1 class **armed 2/3**. Dải JUMP **không hẹp lại**.
🔴 Lưu-ý cho lượt @close: `gap-carry-aged` lần này là **FLAG chứ không phải INFORM** — khác mọi lần trước (S140/S143/S148/S150 đều INFORM vì owner-held). Lý do: cái fire không phải "carry già" mà là **thước đo bị vô-hiệu-hoá**.
