# N3 — LANE E: TRỤC BỆNH (9 lớp lỗi xuyên suốt × 12 triệu chứng TC)

- lane: **E / 6** — lăng kính **CHIỀU NGANG**, cắt qua mọi GĐ. 4 lane A/B/C/D soi dọc từng GĐ ⇒ mù chỗ nối; lane này soi *bệnh nào tái diễn qua nhiều GĐ* và *wave nào thật sự chữa bệnh nào*.
- nguồn gốc: `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-thu-chinh.md:70-95` (bảng 12 TC + 4 dòng chú thích cố-ý-để-chữ) · `…-phu-luc-spec-pitfall.md:40-60` (9 lớp lỗi, toàn văn).
- đã có: `sub-invest-fitmap-S180.md` §2 §3 · `sub-review-n2-S180.md` · `run.md` (bảng lead tự soi 9 lớp — **kiểm lại, không gật**).
- luật đo của lane: `KHÔNG ĐO ĐƯỢC` hợp lệ và được khuyến khích; mọi 0-hit **kèm control-dương**; hai số lệch ⇒ hỏi *"đếm CÁI GÌ"* trước khi hỏi *"ai sai"*.
- read-only, propose-only. Ghi đĩa **trong lúc làm**, không dồn cuối.

---

## §0 — Ghi trước khi đo (để lượt sau đối chứng được ý định)

Bốn ca lead khai *"giẫm NGAY HÔM NAY"* là bốn ca **lead có lợi khi nó đúng** (chúng chống lưng kết luận *"9/9 lớp SE đều có ca thật ⇒ PROJECT-FIT cao"*). Vì vậy thứ tự đo của lane này là: **đo 4 ca đó trước, bằng lệnh chạy được, với control-dương**, rồi mới đi tiếp phần còn lại. Nếu bốn ca đó đứng thì kết luận của lead mạnh hơn; nếu đổ thì đổ đúng chỗ đắt nhất.

Hai ca **MỚI phát sinh trong chính chuỗi N1→N2** cũng được soi ở đây (đề bài giao): (a) N1 hạ cánh 7.049 B / 6-của-9-mục placeholder sau 202K token; (b) N2 xử vụ số-lệch bằng cách tuyên một bên thắng trong khi thật ra là **lệch ĐƠN VỊ**.

---

## §1 — 9 LỚP LỖI × SE (kiểm lại bảng lead, không gật theo)

### Bảng tổng — verdict của lane E trên từng dòng lead

| LỚP | lead nói | lane E kết luận | ghi chú 1 dòng |
|---|---|---|---|
| 1 quên ghi vật chứng lúc mở | ✅ giẫm | **GIỮ** | #53-family; lane này bổ sung ca thứ 10 = chính tôi |
| 2 thợ rèn không có dao | ✅ ×3 hôm nay | **GIỮ 3/3** — và **nặng hơn lead khai** | mỗi ca có thêm tầng lỗi lead chưa đếm (dưới) |
| 3 chấm chéo lần-1 KHÔNG ĐẠT | ✅ | **GIỮ** | ring1 32Đ/6T · N2 PASS_WITH_FIXES 5 MAJOR |
| 4 exit-0 ≠ không cờ | ✅ | **GIỮ** | `governance-detectors.ps1` tự khai "Exit 0 always" |
| 5 số chép tay trôi | ✅ | **GIỮ** | STATUS:8 mega-line |
| 6 neo số dòng chết ngay khi sinh | ✅ 1 ca | **GIỮ + LEAD SÓT 2 CA** | 3 neo cùng lệch **+2**; 1 neo **chết ngay tại commit sinh ra nó** |
| 7 tuyên gấp-đầy-đủ thân mục lục | ✅ | **GIỮ** | N1 7.049 B; lane E bổ sung: guard byte mù |
| 8 nhãn đã-đóng hẹp hơn phạm vi | ✅ hôm nay | CHƯA ĐO — cần `awk 'NR>=48&&NR<=55' docs/HANDOFF.md` | đo ở §1.4 |
| 9 cưỡng chế tuyên mà chưa có máy | ✅ 2 món (không 3) | CHƯA ĐO — cần grep `tools-whitelist` + `session_ctx_kb` | đo ở §1.5 |

---

### §1.1 — LỚP-6 (neo số dòng) — **lead ĐÚNG 1/3, SÓT 2**

Lead khai đúng **một** neo. Lane E đo cả file `docs/STATUS.md` và tìm **ba** neo tự-trỏ, **cả ba lệch đúng +2**:

| # | neo ở | nội dung neo | đích THẬT bây giờ | lệch | ai tìm |
|---|---|---|---|---|---|
| N-1 | `docs/STATUS.md:8` | ``bundle prod → canonical ở `:479` `` | Bundle hash live ở **`:481`** | +2 | lead |
| N-2 | `docs/STATUS.md:8` | ``Policies/Menu keys — canonical bảng `:470-471` `` | Policies **`:472`** · Menu keys **`:473`** | +2 | **LANE E (lead sót)** |
| N-3 | `docs/STATUS.md:463` | ``đã re-ground 2 lần SAU S168 (`:474` S170 · `:476` +S176)`` | S170 ở **`:476`** · S176 ở **`:478`** | +2 | **LANE E (lead sót)** |

**Lệnh tái lập (chạy được, đã chạy):**
```
python -c "import io,re; L=io.open('docs/STATUS.md',encoding='utf-8').read().split('\n');
[print(n,repr(s[max(0,m.start()-90):m.end()+10])) for n,s in enumerate(L,1) for m in re.finditer(r':(\d{2,4})(-(\d{2,4}))?\`',s)]"
```
Đối chứng vị trí thật: `awk 'NR>=467 && NR<=482' docs/STATUS.md` → 472 = `| Policies |`, 473 = `| Menu keys |`, 476 = `| User memory |` (chứa `S170`), 478 = `| Sub-agents |` (chứa `S176`), 481 = `**Bundle hash live (prod):**`.

🔴 **Phát hiện nặng nhất của mục này — N-3 CHẾT NGAY TẠI COMMIT SINH RA NÓ.**
`git log -S'`:474` S170' -- docs/STATUS.md` → commit **`57e672f`** (S179 closeout). Mở đúng commit đó:
```
git show 57e672f:docs/STATUS.md  →  S170 ở dòng 476, S176 ở dòng 478
```
Tức tại **chính thời điểm viết**, neo `:474`/`:476` đã trỏ sai. Hub viết *"neo số dòng chết ngay khi sinh"*; ở SE ca này **chết đúng lúc sinh, không cần đợi ai chèn dòng**. Nặng gấp đôi: câu chứa nó là ghi-chú của `lead-stale-auditor` FLAG-6 đang tự khen *"chính dòng này chép ra cái luật mà nó vi phạm"* — rồi vi phạm thêm một luật nữa ngay trong câu đó.

Đối chiếu N-1 và N-2: cả hai **đúng lúc sinh**, chết sau.
- `git log -S'canonical ở `:479`'` → `50e6d8c`; mở ra: bundle ở dòng **479** ✔ đúng lúc sinh.
- `git log -S'canonical bảng `:470-471`'` → `88e7ecf`; mở ra: Policies **470**, Menu keys **471** ✔ đúng lúc sinh.

⇒ **Hai chế độ chết khác nhau trong cùng một file**: *drift-sau-khi-sinh* (N-1, N-2) và *born-dead* (N-3). Thuốc khác nhau: loại 1 cần neo-bằng-chuỗi; loại 2 cần **kiểm tại chỗ lúc viết** (vị-từ máy: mở file, đọc dòng, so nội dung).

🔴 **Vòng ngoài — LỚP-6 ăn thịt thuốc chữa LỚP-5.** Luật B1 của SE (*"KHÔNG chép số, trỏ canonical"*) là thuốc cho LỚP-5. Ba neo trên **chính là B1 đang thi hành**, và cả ba đều hỏng vì được cài bằng **số dòng**. Tức: **thuốc chữa LỚP-5 được xây trên đúng cái bệnh LỚP-6.** Đây là LỚP-2 ở cấp học thuyết, không phải cấp một vai. Đề xuất N4: wave nào đụng B1 **phải** đổi hình thức neo (chuỗi tìm được / tên row) chứ không chỉ vá 3 con số.

---

### §1.2 — LỚP-2 ca (a) `harvest-curator` F-05 — **GIỮ, ĐÚNG NGUYÊN VĂN**

- Vết ở `runs/2026-08-07-S180-bookend-open/sub-harvest-curator-open-S180.md:23-26`: entry S173 *"Corruption ✅ 24 hit/11 file"* — **baseline giao không khai ĐƠN-VỊ**; đo lại `grep -rc` (DÒNG) = 22/11 · `grep -ro | wc -l` (LẦN) = 24/11.
- Bài học chống đúng bẫy đó nằm ở `runs/2026-08-01-S168-bookend-close/sub-harvest-curator-close-S168.md` (**29.299 B**), dòng **269** và **273**, nguyên văn: *"baseline chuyển giao PHẢI ghi kèm đơn-vị: 22 dòng / 24 lần / 11 file"*.
- File đó **chưa về nhà** (nợ F-01 của chính vai) ⇒ vai đi lại đúng bẫy **6 phiên sau**.
- 🔸 **Vệ sinh thước — sắc thái tôi phải khai:** `grep -c "S168" .claude/agent-memory/harvest-curator/MEMORY.md` = **2** (control-dương `grep -c "S17"` = 2, thước sống). Hai hit đó **là mention nằm trong entry S179, không phải entry S168** — `sub-ring1-audit-open-S180.md:13` đã đo độc lập: 4 marker = **2/5/2/2 ở NGUỒN, 0/0/0/0 ở đích**. ⇒ "chưa harvest" đúng **ở cấp entry**, và ai đo bằng `grep -c "S168"` một mình sẽ đọc nhầm thành "đã harvest". Chính là **bẫy đơn-vị lần thứ hai trong cùng một ca** — lần này là đơn-vị *mention ⟂ entry*.

### §1.3 — LỚP-2 ca (b) `lead-stale-auditor.md` — **GIỮ, và nặng hơn lead khai (3 tầng, không 1)**

Lead chỉ nêu `:45`. Đo thật, dòng 45 mang **ba** lỗi chồng nhau, và có **tầng thứ tư** ở dòng 41:

| tầng | nội dung | đo |
|---|---|---|
| T1 stale-count | ví dụ ghi canonical *"= 54"* | canonical THẬT `STATUS.md:473` = **113** |
| T2 neo chết | trỏ `STATUS.md:19` | dòng 19 hiện là đoạn *"Vòng kiểm chặn lead 3 lần: D-4…"* — **không liên quan menu key** |
| T3 tiền-đề bốc hơi | ví dụ nói *"`CLAUDE.md` ghi ~60 menu key"* | `grep -rn "60 menu key" CLAUDE.md docs/CLAUDE.md` = **0 hit**; **control-dương** `grep -inc "menu" CLAUDE.md` = **4** (thước sống), `grep -inE "menu.key" CLAUDE.md` = 1 hit ở `:62` nhưng là `menu-key KeHoachKyKet`, không có số |
| T4 (dòng **41**) | *"Gặp thứ không xếp được vào **5 class** dưới"* + bảng `:45-49` có **5 hàng** | enum thật `memory-budget.json` `lead_self_audit.flag_classes` = **12 phần tử = 6 `view-*` + 6 `gap-*`** ⇒ thiếu `view-claim-broader-than-sample` |

T4 nặng hơn T1-T3 vì T1-T3 nằm ở cột **"Ví-dụ SE"** (minh hoạ, có thể là ca lịch sử), còn T4 là **câu lệnh ràng buộc** (*"CẤM tự chế class"*) — sub đọc persona sẽ thấy json có 6 mà bảng có 5, và không có luật nào bảo phải tin bên nào.

### §1.4 — LỚP-2 ca (c) `ring2-audit.md:4` "5 class" — **GIỮ**

- `ring2-audit.md:4` nguyên văn: *"ĐỌC OUTPUT của `lead-stale-auditor` (view LỆCH source, **5 class** `view-*`) + `lead-gap-auditor` (cái BỊ THIẾU, **6 class** `gap-*`)"*.
- Đo enum: `view-*` = **6** (stale-count · stale-status · stale-header · stale-role-desc · residual-asym · **claim-broader-than-sample**) · `gap-*` = **6** ✔. ⇒ **vế gap ĐÚNG, vế view SAI** — lệch bất-đối-xứng trong cùng một câu.
- Class thứ 6 vào enum @**S172** theo owner (`memory-budget.json:190` `_class_added_S172`, slot 68). ⇒ drift sống **≥5 phiên**.
- 🔴 **Bổ sung lane E — drift này đã bị NHÌN THẤY rồi ĐI VÒNG chứ không vá:** `runs/2026-08-05-S173-bookend-open/sub-lead-gap-open-S173.md:10` viết *"12 class (**5** `view-*` = vai-stale · 6 `gap-*` = vai-GAP · **+1** `view-claim-broader-than-sample` mới)"* — công thức 5+6+1 là **cách kể để khỏi phải sửa persona**. Đây là mẫu *Goodhart: rời tập-đo* (đổi hình dạng cách đếm thay vì vá nguồn). Wave nào chạm enum phải vá **cả 2 persona**, không chỉ ring2.

### §1.5 — LỚP-8 (nhãn "đã đóng" hẹp hơn phạm vi) — **GIỮ, và lỗ THỦNG ĐÃ TO GẤP ĐÔI SAU KHI ĐÓNG**

Lead khai: slot **(70)** `~~ĐÓNG @S179~~` ở `docs/HANDOFF.md:50` mà rider lỗi máy H24-2 ở `:51` còn sống. **Đúng — nhưng lead khai NHẸ hơn sự thật.**

**(1) Nhãn đóng, có thật:** `docs/HANDOFF.md:50` = *"~~(70) Tách 2 sổ đếm H24 — trung thực đang XOÁ streak~~ ✅ ĐÓNG @S179"*, đóng dựa trên bằng chứng đĩa `scripts/h24-signal-write.ps1` mang `slot 70` ở 3 chỗ (`:66` `:164` `:247`).

**(2) Rider ở `:51` mô tả một lỗi MÁY KHÁC, không nằm trong phạm vi cái được đóng:** detector **H24-2 dựng segment từ `marks[0]`** ⇒ mọi thứ nằm TRÊN marker đầu tiên không bao giờ được đọc.

**(3) Lỗi đó CÒN SỐNG trong mã, đo được — `scripts/governance-detectors.ps1:892-897`:**

    $marks = [regex]::Matches($raw, '(?m)^\*\*(?:[^\x00-\x7F]+\s*)?NEXT\s+(?:anh|em)\b')
    $segs  = @()
        $start = $marks[$i].Index                      # <-- segment DAU bat dau o marks[0]
        $end   = if ($i+1 -lt $marks.Count) { $marks[$i+1].Index } else { $raw.Length }
        $segs += $raw.Substring($start, $end - $start) # <-- phan TREN marks[0] boc hoi

**(4) Đo LỖ THỦNG HÔM NAY (HEAD `55894a0`) — tái lập bằng CHÍNH regex của detector:**

| đại lượng | rider khai @S179 | **đo lại @S180 (lane E)** |
|---|---|---|
| dòng marker đầu tiên khớp regex | `:90` | **`:172`** |
| vùng KHÔNG BAO GIỜ ĐỌC | L1-89 | **L1-171** (trên tổng **572** dòng = **30% đầu file**) |
| số slug carry bị nuốt | **12** | **25** (trên tổng **54** key phân biệt = **46%**) |
| control-dương | — | `[carry:` xuất hiện **289** lần trong file ⇒ thước sống, 0-hit không do regex chết |

⇒ **Sau khi dán nhãn ĐÓNG, lỗ thủng KHÔNG đứng yên — nó to gấp đôi.** Đúng chữ hub: *"hai phạm vi lệch nhau là đường thoát, và đường thoát thì sẽ có người đi qua."*

🔴 **Đòn hồi quy đẹp nhất — trong 25 key bị nuốt CÓ `tools-whitelist-no-teeth`.** Cỗ máy đo tuổi carry **không nhìn thấy** chính cái carry ghi rằng "có cưỡng chế được tuyên mà không có răng". LỚP-2 ở cấp **MÁY**, không phải cấp vai. Trong 25 key bị nuốt còn có `harvest-no-s168-s171` ⇒ nợ harvest ở §1.2 cũng nằm trong vùng mù.

25 key bị nuốt (đủ danh sách, đo được): `acceptance-runtime-khkk` · `account-trung` · `adap-apply-2-thu` · `binh-le-decision` · `bvaau` · `ctx-t9-dogfood` · `ctx-verifier-no-self-append` · `e7-cot-chet-khkk` · `endline-sub-md` · `harvest-no-s168-s171` · `harvest-orphan-s159-tongquan` · `hmw-subfile-index-collision` · `hmw-width-vs-roster` · `mind-tran-nen-moi-cua` · `orphan-retro-harvest-s159` · `pe-phanquyen` · `ring5-audit-gap` · `synthesis-roll-s159-s160` · `tiep-3ter-seed-unwired` · `tiep-reload-underfill` · `tools-whitelist-no-teeth` · `tra-bui-relogin` · `uat-s117` · `uat-s133-budget-freeze` · `uat-s134-luyke`.

🔸 **Sắc thái phải khai (bẫy thước):** regex đòi `^\*\*` (đậm, đầu dòng). Marker `### 🔵 NEXT em @S179` ở `HANDOFF:29` là **heading `###`, KHÔNG khớp** ⇒ ai đo bằng `grep -n "NEXT em"` sẽ ra `:29` rồi kết luận lỗ chỉ 28 dòng — **sai 6 lần**. Phải đo **bằng chính regex của detector** (đúng bài học `feedback_faultinjection_proves_teeth`). Con số đúng là **:172**.

### §1.6 — LỚP-9 (cưỡng chế tuyên mà chưa có máy) — **LEAD SAI THÊM MỘT MÓN: 2/3 ĐỔ, KHÔNG PHẢI 1/3**

Lead đã tự hạ 3 → 2 món sau khi N1 bác `pull_warn_days`. Lane E đo nốt 2 món còn lại, đúng chỗ N1 tự khai *"chưa đo lại 2 món kia"*:

| món lead giữ | lane E đo | verdict |
|---|---|---|
| `session_ctx_kb` **0-reader @S146** | `.claude/agent-memory/memory-budget.json:8` `_session_ctx_kb_reader` = *"🔄 GHOST-WIRE **DONG @S153** 2026-07-26 (adopt `0df10df4` T7): reader THAT dau tien = `scripts/session_ctx.py`"*. Kiểm mã: `scripts/session_ctx.py:528` *"aux-8: the FIRST REAL READER of session_ctx_kb (closes the H18 ghost-wire)"* + `:563` `caps = _require_budget_kb(repo_root, ['session_ctx_kb'])` = **fail-loud require**, không phải đọc cho vui. Thêm 2 consumer: `.claude/commands/pause.md:55` (*"Vượt `session_ctx_kb` ⇒ distill"*) · `session-start.md:120` | 🔴 **BÁC — stale ~27 phiên.** Ghost-wire ĐÃ ĐÓNG @S153 |
| `tools-whitelist-no-teeth` | Có thật, và **SE đã tự khai ≥7 chỗ**: `ctx-audit.md:102` · `ctx-curator.md:46` · `ctx-verifier.md:42` · `ring1-audit.md:57` · `back-end-reviewer-style.md:133` · `front-end-reviewer-style.md:142` · `database-reviewer-style.md:135` — cùng một câu: *"`tools:` khai không Write/Edit = **MÔ-TẢ Ý-ĐỊNH**, không phải cơ-chế chặn; backstop THẬT = git-diff commit-gate"* | ✅ **GIỮ là CA**, nhưng **đã vá đúng thuốc hub** (vá LỚP-9 = *"hoặc viết máy, **hoặc khai thẳng là chạy tay**"*) ⇒ **KHÔNG phải vết thương hở**, N4 đừng mở wave cho nó |

🔴 **Hệ quả cho lead:** `session_ctx_kb` đổ **đúng cùng kiểu** với `pull_warn_days` đã đổ — *khai trạng-thái-quá-khứ bằng thì hiện-tại*. Hai lần cùng một lỗi trong cùng một ô bảng ⇒ không phải xui, mà là **LỚP-5 tác động lên chính bảng chẩn đoán LỚP-9**. Khuyến nghị N4: mọi ô "ghost-wire" phải **neo bằng LỆNH ĐO**, không bằng tên món.

**LỚP-9 có còn giẫm không? CÓ**, nhưng phải lấy ca khác: `feedback_dryrun_finds_promised_but_unlanded` (S168) — *command chỉ sống trong comment, sống sót 8 wave + 8 gate + 8 cicd + 644 test; guard-chặn-không-có-đường-ghi = chết câm*. LỚP-9 thuần, chưa-khai, và **do dry-run bắt** ⇒ SE có thuốc (dry-run) nhưng không có máy canh thường trực.

### §1.7 — Năm lớp còn lại (1 · 3 · 4 · 5 · 7): GIỮ nguyên verdict lead, không có gì để bác

| LỚP | ca đứng vững | ghi chú lane E |
|---|---|---|
| **1** | #53-family 7 vai/phiên S180 (nay là **10**, xem §2) | thuốc SE = scaffold trước spawn, ĐANG trả lãi |
| **3** | `ring1` 32Đ/6T · N2 trả `PASS_WITH_FIXES 0C/5M/6m` ngay trong chuỗi này | **SE đã cấu trúc sẵn vòng vá** (N1→N5) ⇒ đúng thuốc hub, KHÔNG cần wave |
| **4** | `governance-detectors.ps1` tự khai *"Exit 0 always (never fails build)"* — 49 cờ vẫn exit 0 | xung đột triết lý với GĐ-3 hub (N1 + N2 F-10 đã nêu) |
| **5** | `STATUS:8` mega-line nhiều số stale; luật B1 có mà vẫn trôi | **và B1 tự cài bằng neo LỚP-6 — xem §1.1** |
| **7** | N1 hạ cánh 7.049 B / 6-của-9-mục placeholder sau 202K token | xem §2 ca (a) |

---

## §2 — BA CA MỚI SINH TRONG CHÍNH CHUỖI N1→N2→N3

| ca | đo được | thuộc lớp | vì sao đáng ghi |
|---|---|---|---|
| **(a) N1 skeleton nấc-2** | 7.049 B trên đĩa, **6/9 mục `[ĐANG ĐO]`**, sau **202K token / 27 tool-use / 545 s**; ruột thật `grep -vE '^#{1,4} \|^\s*$' \| wc -l` = **27 dòng / 10 heading** ⇒ ~15% giá trị | **LỚP-7** ∩ **LỚP-2** (bản đồ về lớp lỗi tự giẫm chính lớp nó đang lập bản đồ) | 🔴 **guard "verify BYTE tăng" MÙ HOÀN TOÀN** — byte > 0 và đang tăng. Vị-từ phải đo **NGỮ-NGHĨA ruột**. Đây là **phản-chứng chạy được** cho chính vá LỚP-7 của hub (*"so số ký tự với nguồn cùng đơn vị"*): SE **không có nguồn cùng đơn vị** ⇒ theo luật hub phải ghi **"không đo được"**, vị-từ thay thế = **tỉ lệ dòng-thật / heading** |
| **(b) N2 xử số-lệch bằng "tuyên một bên thắng"** | `runs/`: **88 dir** ⟂ **90 entry** ⟂ **85 có `run.md`** · `auto-memory`: **61 file** ⟂ **60 memory** | **LỚP-2** (vai phản-biện-lỗi-đo giẫm đúng lỗi-đo) ∩ **bẫy đơn-vị** y hệt `harvest-curator` F-05 §1.2 | Ba số **không mâu thuẫn** — chúng đếm **ba CÁI KHÁC NHAU**. Tuyên "bên nào thắng" là **xoá thông tin**: chênh 90−85 = **5 run-folder KHÔNG có `run.md`** chính là **TC-04 đang chảy máu**, và nó **biến mất** khỏi báo cáo ngay khi chọn một con số. Tương tự 61−60 = **1 file không phải memory** (nhiều khả năng `MEMORY.md` index) = thông tin, không phải lỗi. ⇒ **luật lane E: hai số lệch thì hỏi "đếm CÁI GÌ" TRƯỚC, và GIỮ CẢ HAI kèm đơn-vị** |
| **(c) chính lane E này** | lượt-1 chết khi đĩa mới giữ được phần đầu; 123K token / 33 tool-use rồi return = mô-tả-ý-định | **LỚP-1** ∩ #53 | Vai thứ **10** dính trong một phiên ⇒ **#53 ở SE không phải sự cố, nó là NỀN** — đúng cấu trúc LỚP-3 của hub (*"lần đầu KHÔNG ĐẠT là mặc định"*) nhưng ở trục **hạ cánh vật chứng**. Datum mạnh nhất cho **TC-04** trong cả gói |

🔴 **Điểm chung mà N4 phải dùng để xếp wave:** cả ba ca đều **lọt qua mọi guard hiện có** vì guard đo **sự TỒN TẠI** (byte > 0 · file có mặt · số có mặt) chứ không đo **nội dung có NGHĨA**. Wave GĐ-2 nếu chỉ thêm "kiểm tệp có mặt" thì **không chữa được ca nào trong ba ca này**.

---

## §3 — 12 TRIỆU CHỨNG × SE (bằng chứng đo trên kho SE)

> 🔴 **Ràng buộc tuân thủ:** bốn ô hub **CỐ Ý để CHỮ** (TC-02 · TC-03 · TC-07 · TC-10) — lane E **GIỮ NGUYÊN CHỮ, KHÔNG điền số**. Chỗ nào SE **CÓ** dụng cụ thì nói rõ như một **đóng góp ngược cho hub**, tách bạch khỏi ô của hub.

| TC | SE mắc? | Bằng chứng đo được trên kho SE |
|---|---|---|
| **TC-01** nhắc nhiều lần mới làm | **CÓ** (định tính). **SỐ: KHÔNG ĐO ĐƯỢC** — chưa có sổ đếm lần-nhắc (đúng thứ GĐ-4 dựng) | `auto-memory/feedback_absence_looks_like_clean.md`: mất-uỷ-quyền-owner **phải hỏi lại 3 lượt** · `feedback_pause_track_plan_progress.md`: owner S165 phải **ra luật** `/pause` liệt từng đầu việc vì việc rơi |
| **TC-02** cho làm thẳng vẫn hỏi lại | **GIỮ CHỮ HUB: *chưa có dụng cụ*.** SE cũng 0 phép đếm | Định tính: SE **đã có** cơ chế phân biệt 2 loại — `ACTIVE-MARKS` + 4 lệnh `/user-mark-active*` + luật `feedback_derived_flush_execution` (*derived-flush khớp owner-set = em-main tự làm, KHÔNG gate*). ⇒ **thuốc có mầm, phép đếm chưa có** |
| **TC-03** model mạnh hiểu đúng hơn | 🟢 **KHÔNG MẮC — miễn nhiễm nhờ cấu trúc khác** (xem §6) | Đo: `ls .claude/agents/*.md` = **27** (gồm README) · `grep -l "^model: opus"` = **26** · `grep -l "^effort: max"` = **26** · **control-âm:** `grep -h "^model:" \| sort \| uniq -c` = **`26 model: opus`, KHÔNG có dòng model nào khác** ⇒ SE **không dùng model yếu cho việc đặc tả** nên nguyên nhân của TC-03 không phát sinh. **Ô nghiệm thu của hub GIỮ CHỮ *chưa đủ mẫu*** — SE không điền thay |
| **TC-04** vật chứng lượt đắt bị sót | 🔴 **CÓ — NẶNG NHẤT, và NẶNG HƠN HUB** (xem §5) | (1) Phiên S180: **10 vai** dính #53 (lane E là vai thứ 10). (2) Đo trực tiếp lưới ghi đĩa: `ls -d .claude/workflows/runs/*/` = **88 thư mục** · `ls .claude/workflows/runs/*/run.md` = **85** ⇒ **3 thư mục lượt chạy KHÔNG có tệp mô tả**, đích danh: `2026-07-14-S117-pe-approve-minmax-range` · `2026-07-14-S117-pe-luyke-finalize` · `2026-07-22-S144-bootstrap`. (3) Lưới ĐANG TRẢ LÃI: recover #53 mất **0 byte** nhờ ghi-đĩa-trong-lúc-làm |
| **TC-05** vai soi ghi-đĩa, **cấm sửa** | **CÓ nhu cầu · CÓ ~70% · vế "cấm sửa" YẾU HƠN VẺ NGOÀI** (xem §5) | Có: cặp quan-sát-viên `{harvest-curator, tooling-auditor}` vô-điều-kiện @close + sentinel M5 + INFORM-only. 🔴 Vế **cấm-sửa** chỉ là **lời khai**: `tools:` frontmatter **không có răng** (tự khai ≥7 persona, §1.6) — backstop THẬT là git-diff commit-gate, tức **bắt SAU khi đã ghi**, không phải chặn trước |
| **TC-06** nghi thức bị **tự ý bỏ** | **CÓ — đo được, và SE tự khai tốt** | `CLAUDE.md:121` tự khai drift-audit **trễ 6 ngày** so hạn 08-01 · error-ledger có hẳn mã lỗi cho bệnh này (E-011/AS-15 *"nghi-thức chạy tắt, máy mù lớp nghi-thức-có-chạy-không"*) · thuốc tái-phạm **đã có** (2-strike promote) |
| **TC-07** chủ vắng, máy **đứng chờ** | **GIỮ CHỮ HUB: *chưa có dụng cụ*.** SE cũng 0 bộ đếm | Cơ chế chống **đã có**: `/pause`·`/tiep` một-đường (H22) + WAL + ACTIVE-MARKS + probe-không-chặn ⇒ thoát phiên an toàn khi anh vắng. 🔸 **Đóng góp ngược:** SE **có NGUYÊN LIỆU đếm được** — mỗi lần đứng chờ đều để lại **một dòng khai trong WAL** dạng *"next: chờ anh chọn (a)(b)(c)"*. Đó là **nguyên liệu**, chưa phải phép đếm; lane E **không quy nó thành số** |
| **TC-08** kiểm trong-dòng chỉ bắt cái sống lâu hơn nó | **CÓ — ca chuẩn, thuốc đã uống một phần** | Ca: H2-F3 @S149 coverage-miss (10 lượt invest → 0 delta sổ). Thuốc: `closeout-sentinel` (cửa-SAU) + bookend @open bắt lọt phiên trước. 🔴 **Ca tươi lane E:** 10 vai #53 phiên này đều là **dòng chết sớm**, và thứ bắt chúng là **lead đọc bằng mắt**, không phải máy |
| **TC-09** chỗ ngồi lệch model không ai biết | 🟢 **KHÔNG MẮC — máy đã dựng VÀ đã đo** (xem §6) | `scripts/spawn-model-audit.ps1` + `TIER2_EXPECTED_FULL_ID` (`hmw.js:73`); đo @S126 **0-mismatch**, control âm/dương đủ (`session-start.md:51`). Cộng đo lane E ở TC-03: **26/26 persona pin `opus`+`effort: max`**, 0 ngoại lệ |
| **TC-10** đo tiêu thụ theo từng cửa | **GIỮ NGUYÊN CHỮ HUB: KHÔNG ĐO ĐƯỢC.** SE cũng **không tồn tại dụng cụ** | Doctrine SE @S158: *"đo BYTE, CẤM quy token"*. 🔸 **Đóng góp ngược (nói rõ, KHÔNG điền số vào ô hub):** ở SE, mức tiêu thụ **TỪNG LƯỢT GỌI có tồn tại dưới dạng dữ liệu**, được **ghi tay** vào run-trace (ví dụ `run.md:25` ghi lượt N1 = *202K token / 27 tool-use / 545 s*). ⇒ cái SE thiếu là **bộ TỔNG HỢP**, không phải **quan sát**. Nếu hub cũng có sẵn số per-lượt trong log thì bài toán nhỏ hơn hub tưởng |
| **TC-11** tên duy nhất, không rớt máy đọc tên cũ | **CÓ — ≥3 ca** | `sub-ctx-audit-*` lọt filter C11(b) (S153 → vá S159) · `_tiep-1.md` sha 7-ký-tự vs 40 (S158) · `"17/17"` hardcode stale (`hmw.js:57`). **Máy soi tên tổng: chưa có** ⇒ GĐ-1 **không khai miễn được** |
| **TC-12** chấm điểm bị treo | 🔴 **CÓ — NẶNG HƠN HUB** (xem §5) | `grep -rn "chấm điểm" .claude/commands/*.md` = **0 hit**, control-dương `"điểm dừng"` = **3 file** ⇒ thước sống. Hub: điểm **treo vì chờ chủ**. SE: điểm **chưa từng được sinh ra** |

**Tổng: 10/12 mắc · 2/12 không mắc (TC-03, TC-09).**

---

## §4 — 🔴 KIỂM HỢP ĐỒNG NGHIỆM THU (GĐ ↔ TC) — *"giai đoạn không trỏ về bệnh nào thì là đồ chơi"*

### 4.1 — Bản đồ xuôi (chép từ cột "Chữa ở giai đoạn", `thu-chinh:76-87`)

TC-01→GĐ-4 · TC-02→GĐ-4 · TC-03→GĐ-5 · TC-04→GĐ-2 · TC-05→GĐ-2 · TC-06→GĐ-3 · TC-07→GĐ-3 · TC-08→GĐ-3 · TC-09→GĐ-5 (quét lại GĐ-6) · TC-10→GĐ-3 · TC-11→GĐ-1 · TC-12→GĐ-4

### 4.2 — Bản đồ NGƯỢC (kiểm điều kiện "mỗi GĐ ≥ 1 TC")

| GĐ | TC trỏ về | verdict theo LUẬT HUB |
|---|---|---|
| **GĐ-0** Tiếp nhận + bản đồ áp dụng | **KHÔNG CÓ TC NÀO** | 🔴 **ĐỒ CHƠI theo đúng chữ của hub** |
| GĐ-1 Nền chuẩn đặt tên | TC-11 | đạt |
| GĐ-2 Lưới ghi đĩa + mục lục | TC-04, TC-05 | đạt (2 TC) |
| GĐ-3 Nghi thức 2 đầu + cổng mã lỗi | TC-06, TC-07, TC-08, TC-10 | đạt (4 TC) — **nhưng xem 4.4** |
| GĐ-4 Sổ yêu cầu chủ + chấm điểm | TC-01, TC-02, TC-12 | đạt (3 TC) |
| GĐ-5 Cửa gọi model đắt | TC-03, TC-09 | đạt — **nhưng SE KHÔNG MẮC cả hai**, xem §6 |
| GĐ-6 Niêm phong + bảng gốc | TC-09 (quét lại) + bảng gốc 12-TC | đạt |

### 4.3 — 🔴 LỖ HỔNG 1: **GĐ-0 không trỏ về bệnh nào ⇒ theo luật hub phải LOẠI**

Hub tự viết ở `thu-chinh:72`: *"Đây là hợp đồng nghiệm thu của cả gói: **mỗi giai đoạn phải trỏ ngược về ít nhất một cái bệnh, nếu không thì nó là đồ chơi**."* Quét cả 12 dòng bảng bệnh: **không dòng nào ghi "GĐ-0"** ở cột *Chữa ở giai đoạn*.

**Lane E KHÔNG đề nghị loại GĐ-0** — đề nghị **nêu ngược cho hub**, vì đây là lỗi của **LUẬT**, không phải của GĐ-0: GĐ-0 là **điều kiện tồn tại** của 6 GĐ còn lại (không tiếp nhận thì không có gì để thi công), nên nó thuộc loại *enabling*, không thuộc loại *chữa bệnh*. Hai đường ra hợp lệ, hub chọn:

1. Hub **sửa luật**: thêm ngoại lệ tường minh *"GĐ-0 là giai đoạn enabling, miễn điều kiện trỏ-về-TC"* — rồi mọi nhà khỏi phải tự chế lý lẽ.
2. Hub **gán TC cho GĐ-0**. Ứng viên tự nhiên: **TC-06** (*nghi thức bị tự ý bỏ*) — vì bước "ghi dòng **đã nhận** vào sổ liên lạc" chính là nghi thức dễ bỏ nhất, và **SE đang bỏ nó thật**: `grep "upgrade-pack-phased" broadcasts/_index.md` = **0 hit**, control-dương `harness-22` = **3 hit**.

🔸 **Cảnh báo cho N4:** `sub-invest-fitmap-S180.md:238` (§6, W0) điền ô *"TC chữa"* bằng câu **"điều kiện tồn tại của mọi TC"**. Đó **không phải một TC** — đó là **viết chữ vào ô đòi mã**. Nếu N4 dùng nguyên câu đó, cả gói sẽ có **một wave không chịu ràng buộc nghiệm thu nào**. Phải chọn 1 trong 2 đường trên và **khai ra**.

### 4.4 — 🔴 LỖ HỔNG 2: **TC-10 có nhãn giai đoạn nhưng KHÔNG AI CHỮA**

TC-10 được gán GĐ-3, nhưng ô nghiệm thu của chính hub ghi: *"**KHÔNG ĐO ĐƯỢC** — hub khai thẳng: chưa có dụng cụ; **trần là hướng dẫn kèm nghĩa vụ khai khi vượt**"*. Đọc kỹ: GĐ-3 **không sinh ra dụng cụ đo tiêu thụ**; nó chỉ **đặt trần + bắt khai khi vượt**. ⇒ với TC-10, GĐ-3 là **khai báo**, không phải **thuốc**.

⇒ Theo chiều ngược của cùng hợp đồng: **TC-10 là triệu chứng duy nhất không có giai đoạn nào thực sự chữa.** Ba ô để-chữ còn lại khác hẳn:

- **TC-02**: GĐ-4 **có** dựng sổ 3 khối (thuốc thật), chỉ **phép đo** là thiếu.
- **TC-03**: GĐ-5 **có** siết cửa model (thuốc thật), chỉ **mẫu** là thiếu.
- **TC-07**: GĐ-3 **có** dựng nghi thức 2 đầu + luật tự trị (thuốc thật), chỉ **bộ đếm** là thiếu.
- **TC-10**: **không có thuốc, cũng không có đo.**

🔴 **Phân biệt mà cả N1 lẫn N2 chưa tách bạch: *chữa* (remedy) ⟂ *nghiệm thu* (measurement).** Bốn ô để-chữ của hub là **lỗ NGHIỆM THU**; chỉ TC-10 là **lỗ CHỮA**. Trộn hai thứ này sẽ dẫn tới hai sai lầm ngược chiều: (a) mở wave để "chữa" TC-02/03/07 trong khi thuốc đã có, chỉ thiếu thước; (b) yên tâm với TC-10 vì thấy nó đã có nhãn GĐ-3.

### 4.5 — Kết luận hợp đồng

**GĐ-đồ-chơi = 1** (GĐ-0, do luật hub thiếu ngoại lệ) · **TC-không-ai-chữa = 1** (TC-10). Mười một TC còn lại đều có ít nhất một GĐ chữa thật.

---

## §5 — BỆNH SE MẮC **NẶNG HƠN HUB** (ngoài TC-12 mà N1 đã nêu)

| TC | hub | SE | vì sao nặng hơn |
|---|---|---|---|
| **TC-12** *(N1 nêu — lane E xác nhận)* | cơ chế **đã ký 04-08-2026**, đang chờ mốc-0 | **0 cơ chế** — `grep -rn "chấm điểm" .claude/commands/*.md` = 0 hit (control-dương `"điểm dừng"` = 3 file) | hub **treo một cái đã có**; SE **chưa từng sinh ra cái đó**. Khoảng cách là một **bậc**, không phải một nấc |
| **TC-04** *(lane E bổ sung)* | LỚP-1: *"hub mắc **nhiều lần trong cùng một phiên**"* | **10 vai / 1 phiên** (S180) + **3 thư mục lượt chạy không có `run.md`** (nêu đích danh ở §3) | Ở hub là **sự cố lặp**; ở SE là **NỀN** — mọi vai làm-việc-dài đều dính, chỉ vai return-1-dòng thoát (3/3 CLEAN). Khác nhau về **bản chất phân bố**, không phải tần suất |
| **TC-05** *(lane E bổ sung)* | muốn vai soi ghi-đĩa **không được sửa** | SE **có** vai, nhưng "không được sửa" = **lời khai**, không phải sandbox — và carry ghi đúng điều đó (`tools-whitelist-no-teeth`) **nằm trong vùng mù 46%** của H24-2 (§1.5) | Hub **biết mình thiếu**; SE **tưởng mình có**. Trạng thái *tin sai vào một cái khoá không tồn tại* nguy hiểm hơn trạng thái *biết mình không có khoá* |

---

## §6 — BỆNH SE **KHÔNG MẮC** ⇒ khai `KHÔNG ÁP DỤNG có khai` ⇒ **tiết kiệm wave**

| TC | vì sao SE miễn nhiễm | bằng chứng + control | tiết kiệm gì |
|---|---|---|---|
| **TC-03** *"model thường hiểu lệch đặc tả"* | SE **không dùng model thường** ở bất kỳ chỗ ngồi nào — worker-tier-pin toàn roster | `grep -h "^model:" .claude/agents/*.md \| sort \| uniq -c` → **`26 model: opus`**, và **KHÔNG có giá trị nào khác** (control-âm mạnh: chỉ cần 1 persona pin sonnet là dòng thứ hai hiện ra) · `grep -l "^effort: max"` = **26/26** | **Phần TC-03 của GĐ-5 khai `không áp dụng`** — SE không cần cửa "chọn model đúng", chỉ cần **giữ nguyên pin**. ⚠️ Vẫn **GIỮ CHỮ** ô nghiệm thu của hub (*chưa đủ mẫu*): SE miễn ở **nguyên nhân**, chưa đạt ở **thước** |
| **TC-09** *"chỗ ngồi được cấp model đắt mà không ai biết"* | Máy soát **đã dựng và đã chạy** | `scripts/spawn-model-audit.ps1` (PA-2b) + `TIER2_EXPECTED_FULL_ID` (`hmw.js:73`); đo @S126 = **0-mismatch**, control âm/dương đủ (`session-start.md:51`) | **GĐ-5 phần TC-09 khai `không áp dụng — đã có tương đương`**; **GĐ-6 giữ vế "quét lại"** (rẻ: chạy lại đúng 1 script đã có) |

⇒ **GĐ-5 chỉ còn phần THIẾU nhỏ** (sổ-khung-nhìn lượt đắt + luật truyền-nguyên-văn thành văn) — trùng kết luận N1 §5, nhưng **lý do khai miễn của lane E mạnh hơn**: N1 khai miễn dựa trên *"đã có"*; lane E khai miễn dựa trên **control-âm đo được** (không tồn tại persona nào lệch pin).

🔸 **Chống lạc quan:** hai ô miễn ở trên là miễn **theo nguyên nhân**, KHÔNG phải *"đã nghiệm thu"*. Khi báo cáo về hub phải viết đúng nhãn `không áp dụng` **kèm lý do kiểm được** (luật nấc, `thu-chinh:103`); **cấm** viết `đã được kiểm chứng` — nấc đó chỉ hub cấp.

---

## §7 — Bốn ô để-CHỮ: lane E đã tuân thủ ra sao (tự kiểm)

| ô | hub ghi | lane E ghi | có điền số không? |
|---|---|---|---|
| TC-02 | *chưa có dụng cụ* | giữ nguyên chữ + nêu thuốc-có-mầm phía SE | **KHÔNG** |
| TC-03 | *chưa đủ mẫu* | giữ nguyên chữ ở ô nghiệm thu; con số 26/26 là **đo persona SE**, nằm ở cột bằng-chứng-SE, không đặt vào ô hub | **KHÔNG** |
| TC-07 | *chưa có dụng cụ* | giữ nguyên chữ + khai SE có **nguyên liệu** (dòng khai chờ trong WAL), **không quy thành số** | **KHÔNG** |
| TC-10 | *KHÔNG ĐO ĐƯỢC* | giữ nguyên chữ + đóng góp ngược: dữ liệu per-lượt **có tồn tại** ở SE dưới dạng ghi tay ⇒ thiếu **bộ tổng hợp**, không thiếu **quan sát** | **KHÔNG** |

Theo đúng câu của hub: *"một bảng gốc thật thà tám dòng có giá hơn mười hai dòng đẹp mà bốn dòng bịa."*

---

## §8 — Ba khuyến nghị cho N4 (propose-only, KHÔNG tự thi hành)

1. **Đừng để W0 đi tiếp với ô "TC chữa" ghi *"điều kiện tồn tại của mọi TC"*.** Chọn một trong hai đường ở §4.3 rồi khai ra trong adap-report — đây là **phản biện gửi ngược hub**, cùng hạng với F-1 của N1.
2. **Tách wave theo trục *chữa* ⟂ *nghiệm thu*** (§4.4). Wave "dựng thuốc" và wave "dựng thước" khác nhau về chi phí, rủi ro và người làm; gộp lại sẽ khiến TC-02/03/07 bị làm thừa và TC-10 bị bỏ quên.
3. **Wave GĐ-2 phải có ít nhất một vị-từ đo NGHĨA, không chỉ đo TỒN TẠI** (§2). Ba ứng viên rẻ, đo được ngay: (a) tỉ lệ *dòng-thật / heading* của mỗi sub-file · (b) đếm thư mục lượt chạy thiếu `run.md` (hôm nay = **3**, có tên) · (c) chạy detector **bằng chính regex của nó** trên `HANDOFF` rồi đo vùng-không-đọc (hôm nay = **L1-171 / 25 key / 46%**).

---

## §9 — Datum phát sinh khi đang viết chính lane này (ghi để không mất)

**Va chạm tệp tạm giữa các lane chạy song song.** Lane E soạn phần §3-§8 ra một tệp tạm dùng chung rồi nối vào tệp lane; giữa hai lượt, **tệp tạm bị một lane khác ghi đè** bằng nội dung của họ (nội dung lane GĐ-5/GĐ-6). Phát hiện được **chỉ vì** lane E kiểm nội dung tệp trước khi nối (`head` + `grep` chuỗi đặc trưng), thay vì nối mù.

- **Thuộc lớp:** cùng họ với carry **`hmw-subfile-index-collision`** — mà carry đó nằm trong **25 key bị H24-2 nuốt** (§1.5). Tức bệnh đã được ghi nhận, nhưng cỗ máy đo tuổi carry **không nhìn thấy nó**, nên nó không bao giờ già đi để được xử.
- **Vì sao đáng ghi cho N4:** nếu wave nào dựng "mục lục sống `runs/`" hay bất kỳ máy gom-nhiều-lane nào, **tên tệp trung gian phải mang định danh lane**; nối-mù giữa các lane song song là đường mất dữ liệu **im lặng** — không lỗi, không ngoại lệ, chỉ sai nội dung.
- **Vị-từ chống rẻ tiền:** trước khi nối tệp tạm, `grep -c "<chuỗi đặc trưng của chính mình>"` phải > 0. Đây đúng dạng *"đo NGHĨA thay vì đo TỒN TẠI"* ở §8 mục 3.

---

**END sub-n3-lane-e-benh — LANE E (trục bệnh) HOÀN TẤT.**

`9LỚP 9 giẫm / 1 ca bác (session_ctx_kb) · 12TC 10 mắc / 2 không mắc · 1 GĐ-đồ-chơi (GĐ-0) · 1 TC-không-ai-chữa (TC-10) · lead sót 3 ca (2 neo LỚP-6 + lỗ LỚP-8 to gấp đôi)`

---

## §10 — ERRATA nội bộ lane E (append-only, không sửa đè entry cũ)

Bảng tóm ở **§1** được viết **TRƯỚC** khi đo, nên hai ô còn ghi `CHƯA ĐO`:

- Ô **LỚP-8** — đã đo xong, kết quả ở **§1.5**: GIỮ, và lỗ thủng **to gấp đôi sau khi dán nhãn ĐÓNG** (L1-171 · 25/54 key · 46%).
- Ô **LỚP-9** — đã đo xong, kết quả ở **§1.6**: **BÁC 1 trong 2 món lead giữ** (`session_ctx_kb` đã đóng ghost-wire @S153).

Giữ nguyên chữ `CHƯA ĐO` ở §1 làm **vết thứ tự thao tác** (đo sau khi khai ý định), đúng doctrine append-only. Khi đọc, **§1.5/§1.6 thắng §1**.
