# sub-test-specialist-1 — T4 FAULT-INJECT trọn PHẦN B #1-#17 + #21 (máy `mind-check`)

> GHI TRONG LÚC LÀM, từng phép một (chống #53). END-line ở cuối khi xong.
> Task: T4 spec `spec-ctx-adopt-26-07-2026.md` + `sub-fable-invest-S153.md` PHẦN B (24 phép; T4 chạy #1-#17 + #21).
> Vết ủy quyền: OWNER-DELEGATED qua lệnh pipeline 26-07 — KHÔNG ghi "owner chốt" ở bất kỳ đâu.

## ⚠️ Lệch tên file (khai ngay, mirror lane backend-1)

TASK-block chỉ định `sub-test-specialist-1.md` + END-line `<!-- END sub-test-specialist-1 · TOTAL=<n> phép -->`;
footer RUN-TRACE chung nói `-0`. Theo chỉ-thị task-specific (nêu 2 lần + END-line khớp) ⇒ ghi `-1`. KHÔNG có `-0`.
*(Bối cảnh S133: 2 invocation cùng role/cùng index ĐÃ từng ghi đè nhau — dùng `-1` cũng tránh trùng slot.)*

## Ranh scope đã giữ

- **0 file repo thật bị sửa.** Mọi mutation nằm trong scratchpad `…/scratchpad/t4/**` (seam `--root`).
- Phép #5 (đột-biến `_TS_KEY_RE`) sửa **BẢN COPY** `t4/mut/scripts/session_ctx.py`, KHÔNG chạm `scripts/session_ctx.py` của repo.
- Phép #17 · #21 · #13c chỉ **ĐỌC** repo thật (`git diff` read-only, grep) — 0 commit.
- KHÔNG đụng production code (`src/Backend`, `fe-*`), KHÔNG đụng `tests/**` (task này không phải test C#).

## Fixture provenance (điều kiện thư §6)

| Thứ | Giá trị đo |
|---|---|
| Mẫu SẠCH | **render từ `.claude/templates/session-mind-template.md` THẬT** (8.845B) — thay `{{N}}`→6 · `{{TS}}`→`2026-07-26T14:07:30+07:00` · `{{HEAD}}`→`d503f57` (lấy từ `git log -1 --format='%cI|%h'` repo thật) |
| Mẫu sạch sau chèn 1 refresh | 9.548B (`MIND-1` chèn ngay dưới dòng marker điểm-chèn + `MIND-0` của template giữ nguyên) |
| Builder | `…/scratchpad/t4_fixtures.py` (27 cây + 3 draft + 1 bản mutant) |
| session id cây tạm | **N = 6** — cố ý khớp literal PHẦN B (`_mind-s6.md` ở #15, `--session 6` ở #16) |
| Cây cũ | `mtree-ok-1340` / `mtree-nokey-1340` / `t-*` (lane trước) **KHÔNG xoá, KHÔNG tái dùng** — mẫu sạch của lane đó hand-roll từ SPEC marker, không phải từ template THẬT ⇒ T4 dựng bộ mới |

---

## BẢNG PHÉP (đang append từng phép)

> Lệnh gốc mọi dòng (chạy từ repo root, `$T` = `…/scratchpad/t4`):
> `python scripts/session_ctx.py mind-check --session 6 --root $T/<fixture> [--closed] [--draft <f>]`

### #1 [happy] mẫu SẠCH render từ template THẬT — **PASS**

| Trường | Giá trị |
|---|---|
| fixture | `t4/01-clean` — template THẬT (8.845B) + `MIND-1` refresh chèn dưới marker điểm-chèn ⇒ 9.548B; p=1 (`_pause-1.md`); `_context-s-6.md` 2.995B; budget `{mind_ctx_kb:32, session_ctx_kb:64}` |
| kỳ-vọng | exit 0, 0 trượt, 0 cờ |
| THỰC-ĐO | **exit 0** · `verdict: dat=10 TRUOT=0 co=0 bo-qua-co-khai=0` · phép-6 `\|block\|=2 ; p (DEM DIA)=1 [_pause-*.md=1 + pause-*.md=0 dual-accept]` · phép-7 `9548B vs mind_ctx_kb x1024 = 32768B (doc LIVE, 0 hardcode)` · phụ-8 `2995B vs 65536B` · phụ-9 `2 block: 5 muc A-E du + moi y muc D co nhan` |
| loại | happy — **và là bằng chứng mẫu sạch không phải mẫu-dễ-xanh tự chế** (thư §6) |

### #2 [fault-inject] rào-1: `> anh:` DƯỚI RULES-END — **PASS (trượt thật)**

| Trường | Giá trị |
|---|---|
| fixture | `t4/02-rao1` = 01-clean + chèn `> anh: lam tiep di, dung hoi lai` vào mục A của block `MIND-1` (dòng 72, DƯỚI RULES-END dòng 62) |
| kỳ-vọng | TRƯỢT exit 1 + in đúng file:line |
| THỰC-ĐO | **exit 1** · `(1) rao-1 loi-anh-verbatim : TRUOT` · detail `- _mind-s-6.md:72  > anh: lam tiep di, dung hoi lai` — số dòng khớp đếm độc lập (python enumerate = dòng 72) |
| loại | fault-inject |

### #3 [anti-Goodhart] enclosure use⟂mention — **PASS**

| Trường | Giá trị |
|---|---|
| fixture | `t4/01-clean` — chuỗi `> anh:` CÓ THẬT trong mẫu sạch, tại **dòng 28** = TRÊN `MIND-RULES-END` (dòng 62). Đây là dòng của **template THẬT** (`session-mind-template.md:28`, phần giải thích rào-1), không phải do tôi thêm |
| kỳ-vọng | KHÔNG trượt (khối luật được phép chứa chuỗi cấm để giải thích) |
| THỰC-ĐO | `(1) rao-1 : dat` + `0 hit '> anh:' duoi RULES-END` — **trong khi cùng chuỗi ở dòng 72 thì trượt (#2)** ⇒ discriminator là **vị trí so marker**, không phải khớp-mẫu-trần. Đối chứng 2 chiều trên CÙNG 1 chuỗi |
| loại | anti-Goodhart (citation-trap class) |

### #4 [fault-inject + anti-Goodhart] rào-2 4 biến-thể + đối-chứng heading — **PASS 4/4 + contrast**

| fixture | dòng inject (dòng 72, dưới RULES-END) | kỳ-vọng | THỰC-ĐO |
|---|---|---|---|
| `04a-ts-plain` | `ts: 2026-07-26T15:00:00+07:00` | TRƯỢT | **exit 1** · `(2) rao-2 : TRUOT` · `_mind-s-6.md:72  key-line 'ts:' (canonical regex session_ctx.py:_TS_KEY_RE)` |
| `04b-ts-space` | `··TS·:·2026-07-26T15:00:00` (thụt 2 space + space TRƯỚC dấu hai chấm + HOA) | TRƯỢT | **exit 1** · `(2) TRUOT` |
| `04c-ts-case` | `Ts: 2026-07-26T15:00:00` | TRƯỢT | **exit 1** · `(2) TRUOT` |
| `04d-ts-tab` | `\tts:\t2026-07-26T15:00:00` (thụt TAB) | TRƯỢT | **exit 1** · `(2) TRUOT` |
| đối-chứng `01-clean` | heading `## MIND-1 — 2026-07-26T14:07:30+07:00 @ d503f57 (window 2)` (dòng 69) — ts NẰM TRONG heading | KHÔNG trượt | `(2) rao-2 : dat` + `0 key-line 'ts:' (heading-embedded ts is NOT a key line -- by design)` |

⇒ 4/4 trượt thật, ts-trong-heading không đỏ oan. Loại: fault-inject + anti-Goodhart.

### #5 [đột-biến] single-truth `_TS_KEY_RE` — **PASS (ĐỎ thật, hành-vi đổi THEO)**

Đột-biến trên **BẢN COPY** `t4/mut/scripts/session_ctx.py:59` (repo thật KHÔNG bị sửa):
`_TS_KEY_RE = re.compile(r'^[ \t]*ts[ \t]*:', re.I | re.M)` → `re.compile(r'^ts:', re.I | re.M)` (bỏ nhánh khoảng-trắng/thụt-đầu-dòng).

| fixture | máy THẬT (`scripts/session_ctx.py`) | máy ĐỘT-BIẾN (`t4/mut/…`) | đổi? |
|---|---|---|---|
| `04a-ts-plain` (`ts:` sát lề) | TRƯỢT · exit 1 | TRUOT · exit 1 | không (đúng — mutant vẫn khớp dạng này) |
| `04b-ts-space` (thụt + space trước `:`) | TRƯỢT · exit 1 | **dat · exit 0** | ✅ **ĐỔI** |
| `04c-ts-case` (`Ts:`) | TRƯỢT · exit 1 | TRUOT · exit 1 | không (`re.I` giữ ở cả 2 bản) |
| `04d-ts-tab` (thụt TAB) | TRƯỢT · exit 1 | **dat · exit 0** | ✅ **ĐỔI** |
| `01-clean` | dat · exit 0 | dat · exit 0 | không (đúng — không đỏ oan) |

⇒ **2/4 ca flip đúng hướng đột-biến** ⇒ `mind-check` **tiêu thụ chính hằng canonical**, không cài regex bản-2 nội bộ (nếu có bản-2 thì đột-biến hằng sẽ KHÔNG đổi được hành vi).

**Đếm định-nghĩa regex ts trong `scripts/` repo THẬT = ĐÚNG 1:**
- `grep -rniE "re\.compile\(.*\bts\b" scripts/ --include=*.py --include=*.ps1` → **1 hit**: `scripts/session_ctx.py:59`
- `grep -rn "_TS_KEY_RE" scripts/` → 1 định-nghĩa (:59) + 2 điểm tiêu-thụ (:391 finditer, :393 chuỗi thông báo)
- `.ps1` trong `scripts/`: **0 hit** regex bắt dòng `ts:` ⇒ chưa có máy nào cài bản-2.

Loại: đột-biến (mutation-must-be-RED).

### #6 [fault-inject 2-chiều] rào-3 secret + ngoại-lệ nhãn che — **PASS 2/2**

| fixture | dòng 72 | kỳ-vọng | THỰC-ĐO |
|---|---|---|---|
| `06a-secret` | `- token sk-test123abcdef con trong log` | TRƯỢT | **exit 1** · `(3) rao-3 secret Category-5 : TRUOT` · `_mind-s-6.md:72  [sk-]  (snippet KHONG in -- chong ro-ri log)` — **in pattern-name + file:line, KHÔNG in snippet** (gate không tự rò ra log) |
| `06b-masked` | `- khoa voyage [đã che a1b2c3d4] da xu ly` | ĐẠT | **exit 0** · `(3) : dat` · `0 hit / 4 pattern; ngoai-le nhan che 8-hex duoc mien` — dòng CÓ pattern `voyage` nhưng có nhãn che ⇒ miễn |

⇒ 2 chiều đều đúng: pattern trần thì đỏ, nhãn che 8-hex thì xanh. Loại: fault-inject 2-chiều.

### #7 [anti-Goodhart] 2 lưới ĐỘC LẬP cùng kêu — **PASS (kèm 1 phát hiện seam)**

fixture `07-2net` = 06a-secret + **bản copy `scripts/session_ctx.py` đặt TRONG cây tạm** (để `ROOT = Path(__file__).parent.parent` trỏ vào cây tạm).

| lưới | lệnh | THỰC-ĐO |
|---|---|---|
| Lưới-1 `mind-check` | `python scripts/session_ctx.py mind-check --session 6 --root $T/07-2net` | `(3) rao-3 : TRUOT` · `verdict: dat=9 TRUOT=1 co=0` · **exit 1** |
| Lưới-2 `secrets-sweep` | `python $T/07-2net/scripts/session_ctx.py secrets-sweep --session 6` | `[secrets-sweep] session-6: 1 HIT -- CHAN commit` + `…/_mind-s-6.md:72  [sk-]` · **exit 1** |
| đối-chứng dương lưới-2 | cùng lệnh trên cây `01-clean` | `0 hit (4 pattern, pattern-bounded -- KHONG phai chung-minh sach)` · **exit 0** ⇒ lưới-2 không phải "luôn đỏ" |

⇒ 2 net cùng kêu trên CÙNG 1 dòng; `mind-check` KHÔNG thay `secrets-sweep` (sweep `rglob` trọn session-dir nên vốn đã phủ `_mind`).

🔴 **PHÁT HIỆN (spec-drift, KHÔNG phải bug máy):** `secrets-sweep` **KHÔNG có `--root`** — chỉ `mind-check` có seam đó.
`python scripts/session_ctx.py secrets-sweep --session 6 --root <cây>` → `error: unrecognized arguments: --root` · **exit 2** (argparse usage).
Nguyên nhân: `secrets-sweep` hard-dùng `DEFAULT_SESSIONS_ROOT` (`session_ctx.py:717`) trong khi `mind-check` nhận `--root` (`:705-706`).
⇒ Lệnh literal của PHẦN B #7 (và của TASK-block: *"chạy CẢ secrets-sweep (--root)"*) **không chạy được như viết**; T4 lách bằng bản-copy-trong-cây (ROOT tự trỏ cây tạm) và đo được ĐÚNG tính chất phép #7 muốn. Đề nghị em main 1 trong 2: (a) thêm `--root` cho `secrets-sweep` (đối xứng seam, ~2 dòng, lane implementer) — nhớ vẫn là `--session` bắt buộc; hoặc (b) sửa literal trong PHẦN B #7 sang khuôn bản-copy. **T4 KHÔNG tự sửa** (production/máy = lane khác).

### #8 [fault-inject + F-1] con-trỏ 3-trạng-thái — ma trận 4 ca × 2 mode — **PASS 8/8**

| ca | fixture (con-trỏ trong mục E) | open-mode | closed-mode (`--closed`) |
|---|---|---|---|
| a — path tồn tại | `01-clean` → `_pause-1.md` (có thật) | `dat` · **exit 0** | `dat` · **exit 0** |
| b — cha CÓ, file chưa sinh | `08b-ptr-pending` → `_pause-77.md` | `co` · **exit 0** | `TRUOT` · **exit 1** |
| c — cha KHÔNG có | `08c-ptr-broken` → `.claude/no-such-dir/x.md` | `TRUOT` · **exit 1** | `TRUOT` · **exit 1** |
| d — TÊN-TỆP-SAI trong dir THẬT | `08d-ptr-typo` → `_paus-1.md` (thiếu `e`) | `co` · **exit 0** | `TRUOT` · **exit 1** |

8/8 khớp bảng PHẦN B. Ca (c) đúng "TRƯỢT mọi mode"; ca (d) đọc thành *đang-chờ* ở cửa mở rồi mới siết ở cửa đóng — **máy TỰ IN dòng khai** kẽ này (`KHAI (nguyen van thu SS4): TEN-TEP-SAI ... day la KE, khong phai tinh nang`) ⇒ kẽ được khai tại chỗ, không giấu thành tính năng. Loại: fault-inject + F-1.

### #9 [anti-Goodhart] F-1 anti-xoá-con-trỏ — **PASS (vế literal) + 🔴 1 GAP ĐO ĐƯỢC (report em main)**

**Vế literal (đọc message ca đang-chờ @open, `08b-open`) — ĐẠT:**
`co .claude/sessions/session-6/_pause-77.md -- cha CO, file chua sinh => CHO file sinh o cua DONG; CAM xoa con-tro de lam xanh`
⇒ đủ 2 vế: (i) nói ĐÚNG "chờ file sinh ở cửa đóng", (ii) cấm thẳng việc xoá con-trỏ. 0 câu nào gợi ý xoá/sửa con-trỏ cho xanh.

**Vế trong ngoặc ("đường-rẻ-nhất-để-xanh phải là đường đúng") — ĐO THÊM, và nó KHÔNG đạt.** Dựng fixture MỚI `09-noptr` = `01-clean` với con-trỏ backtick BỊ XOÁ (mục E vẫn còn nội dung, chỉ mất token path):

| hành-vi của người bị chấm | closed-mode | exit |
|---|---|---|
| GIỮ con-trỏ thật, chờ file sinh (`08b`) | `(4) TRUOT` | **1** |
| **XOÁ con-trỏ** cho hết đỏ (`09-noptr`) | `(4) co` — `muc E co noi-dung ma 0 con-tro backtick-path` | **0** |

⇒ **Ở closed-mode, xoá con-trỏ RẺ HƠN giữ con-trỏ trung thực** (exit 1 → exit 0). Luật bằng CHỮ cấm, nhưng GRADIENT thưởng đúng hành-vi bị cấm — dạng Goodhart "rời tập-đo" (đổi hình-dạng thứ đang bị đo). Ở open-mode 2 ngả bằng nhau (`co`/`co`) nên chỉ cửa ĐÓNG mới hở.
**REPORT em main (KHÔNG tự sửa — máy `session_ctx.py` = lane implementer):** đề nghị 1 nhánh trong `_check_pointer` — ca "mục E có nội dung mà 0 con-trỏ backtick" khi `closed=True` nên là `TRUOT` (hoặc chí ít ngang mức với pending) để 2 ngả cùng đỏ; hiện lưới còn lại chỉ là ctx-audit @close + mắt người.

### #10 [fault-inject + anti-đóng-cứng] số-hiệu — **PASS 3/3**

| fixture | dãy đọc được (trên→dưới) | kỳ-vọng | THỰC-ĐO |
|---|---|---|---|
| `10a-num-dup` | `2, 2, 0` | TRƯỢT | **exit 1** · `(5) TRUOT so-hieu TRUNG: 2` |
| `10b-num-toplow` | `1, 5` | TRƯỢT | **exit 1** · `(5) TRUOT block top MIND-1 < so duoi MIND-5 (moi-nhat-o-TREN bi vi pham)` |
| `10c-num-gap` | `5, 1, 0` (dãy HỞ) | ĐẠT | **exit 0** · `(5) dat` · `duy-nhat + top >= moi so duoi (khong neo cong-thuc dem)` |

⇒ chỉ đòi duy-nhất + mới-hơn; dãy hở `0,1,5` KHÔNG bị đỏ oan ⇒ nhà đổi công-thức cấp số vẫn kiểm được (đúng hub §3, không đóng cứng).

### #11 [fault-inject + mồi-ngầm-đĩa] bất-biến |block| ∈ {p, p+1} — **PASS 4/4 + mồi-ngầm PASS**

| fixture | p (đếm đĩa) | \|block\| | kỳ-vọng | THỰC-ĐO |
|---|---|---|---|---|
| `11a-p2-b3` | 2 | 3 | đạt | **exit 0** · `(6) dat` |
| `11b-p2-b2` | 2 | 2 | đạt | **exit 0** · `(6) dat` |
| `11c-p2-b4` | 2 | 4 | TRƯỢT | **exit 1** · `(6) TRUOT` |
| `11d-p2-b1` | 2 | 1 | TRƯỢT | **exit 1** · `(6) TRUOT` |

**Mồi-ngầm-đĩa (`11e-fakedecl` = RUỘT `_mind` GIỐNG HỆT 11a + `_end` giả `markers: _pause=9`):** so bằng `diff` với `11a-closed` (dùng bản *closed* để khỏi lẫn biến-số mode — `_end` tự bật closed) → **chỉ 3 khác biệt:** (i) 2 dòng đường-dẫn root/target (khác cây, hiển nhiên), (ii) level phép-6 `dat`→`co`, (iii) 2 dòng cross-check. Dòng ĐO bất-biến `|block| = 3 ; p (DEM DIA) = 2  [_pause-*.md=2 + pause-*.md=0 dual-accept]` **BYTE-IDENTICAL**, `exit 0` cả hai.
⇒ dòng tự-khai `_pause=9` **KHÔNG dịch được nguồn đếm 1 ly**, chỉ sinh `co-INFO lech tu-khai: _end _pause=9 vs DIA 2 (DIA THANG)`. Đúng thứ bẫy khai-THIẾU mà hub đo được. Loại: fault-inject + mồi-ngầm.

### #12 [đột-biến ×2] trần / nén / đọc-LIVE / fail-loud — **PASS 5/5**

| fixture | size | THỰC-ĐO |
|---|---|---|
| `12a-33kb-3blk` | 34.323B, 3 block | **exit 0** · `(7) co` · `=> VUOT` + `huong-dan: nen block CU NHAT (tru block-0 va block top); verbatim con o git` — **CỜ chứ không TRƯỢT** (nợ hiển thị, đúng spec) |
| `12b-33kb-2blk` | 34.334B, 2 block | **exit 0** · `(7) co` · `TU-CHOI nen: chi 2 block (<3) => giuong co vuot tran, KHONG nen` |
| `12c` cap=32 | 9.548B | **exit 0** · `(7) dat` · `vs mind_ctx_kb x1024 = 32768B` |
| `12c` **cap=1** (CÙNG ruột) | 9.548B | **exit 0** · `(7) co` · `vs mind_ctx_kb x1024 = 1024B (doc LIVE, 0 hardcode) => VUOT` |
| `12c` **XOÁ khoá** | — | **exit 3** · `CONFIG/STATE ERROR: missing key(s) mind_ctx_kb in <cây>/memory-budget.json -- CAM default (khuon H24-2 fail-loud)` |

⇒ cặp cap=32/cap=1 trên **CÙNG một tệp** = chứng đọc khoá LIVE (không hardcode 32); xoá khoá thì fail-loud + **NÊU ĐÚNG TÊN khoá thiếu** (không phải "config error" vô danh bắt người đi tìm).

### #13 [fault-inject + đóng-nợ H18] phép-phụ-8 `_context` — **PASS 3/3**

| ca | THỰC-ĐO |
|---|---|
| `13a-ctx65kb` (66.555B) | `[phu-8] co` · `_context-s-6.md = 66555B vs session_ctx_kb x1024 = 65536B => VUOT` · **exit 0** (cờ không gate — đúng thiết kế) |
| `13b-ctx10kb` (10.235B) | `[phu-8] dat` · `10235B vs 65536B` — **im**, 0 cờ |
| 13c grep repo THẬT | `_session_ctx_kb_honest_caveat` = **0 hit** · `_session_ctx_kb_reader` = **1 hit** (`memory-budget.json:8`, trỏ đúng reader `mind-check phép-phụ-8`) · `mind_ctx_kb=32` + `tiep_reload.mode=rut-gon` đọc được qua json.load |

⇒ T7 đã land; ghost-wire H18 class-2 (defined-but-unread, sống S146→S153) **ĐÓNG** — và đóng bằng reader THẬT, làm đúng cả 3 điều caveat cũ tự dặn.

### #14 [fault-inject] draft-mode dịch-trái — **PASS 3/3** (⚠️ 1 fixture phải DỰNG LẠI — xem bẫy dưới)

| draft | THỰC-ĐO |
|---|---|
| `draft-ok.md` (MIND-2, đĩa có 2 block) | **exit 0** · `(5) dat` · `draft MIND-2 vs count-on-disk 2` |
| `draft-badnum.md` (MIND-7) | **exit 1** · `(5) TRUOT` · `draft MIND-7 vs count-on-disk 2 => LECH (so-hieu = DEM block TRUOC chen)` |
| `draft-ts.md` (`ts:` đầu dòng trong mục A) | **exit 1** · `(2) rao-2 TRUOT` · `draft-ts.md:5  key-line 'ts:'` |

Cả 3 lượt: phép 6/7 = `bo-qua-co-khai` (`draft-mode: cham sau khi chen`) ⇒ draft-mode KHÔNG đòi `mind_ctx_kb` (khoá lượt này không đọc) nhưng VẪN đọc `session_ctx_kb` cho phụ-8 — đúng spec.

⚠️ **BẪY VACUOUS-PASS tôi tự bắt (ghi lại vì nó suýt lọt):** bản `draft-ts.md` do builder lane trước sinh bị **MALFORMED** — `inject_A` neo chuỗi `## MIND-1` NHƯNG `renum(REFRESH, 2)` đã đổi heading thành `## MIND-2` TRƯỚC đó ⇒ `str.find` trả `-1` ⇒ dòng `ts:` bị chèn **GIỮA heading**: `## MIND-2 — 20ts: 2026-07-26T15:00:00`. Không ở đầu dòng ⇒ máy (ĐÚNG thiết kế, cùng lẽ với đối-chứng heading ở #4) không bắt ⇒ **lượt chạy đầu ra exit 0**. Đó là **lỗi FIXTURE, KHÔNG phải lỗi máy**. Dựng lại đúng (ts ở ĐẦU DÒNG trong mục A = dòng 5) → exit 1 như kỳ vọng. **Bài học chép ra ngoài:** fixture-hỏng cho-xanh trông y hệt máy-đúng cho-xanh; phép fault-inject chỉ có răng khi đã soi RUỘT fixture, không chỉ đọc exit code. (Chỉ `draft-ts` bị — các fixture #2/#4/#6/#7 dùng `inject_A` trên `CLEAN` vốn CÓ `## MIND-1` nên neo đúng, và chúng đã TRƯỢT thật ở lane trước = bằng chứng ngược.)

### #15 [fault-inject — kẽ tên-sai] xanh-im — **PASS 2/2**

| mode | THỰC-ĐO |
|---|---|
| open | **exit 0** `bo-qua-co-khai` — in đủ: `thieu: <...>/_mind-s-6.md` · **`glob '*mind*' trong thu-muc: _mind-s6.md`** · `=> co ung vien TEN SAI o tren; canonical dung phai la _mind-s-6.md` · `open-mode => bo-qua CO KHAI (chua doc memory-budget.json: khong co gi de do)` |
| closed | **exit 1** `(0) TRUOT` + `closed-mode (co '_end') => TRUOT: phien da dong ma khong co lop MEM` |

⇒ pipe grep chuỗi tên sai `_mind-s6.md` → **hit**. Lỗi chính tả KHÔNG đi qua cửa dưới vỏ "chưa có gì để kiểm"; và cửa đóng thì siết thành TRƯỢT.

### #16 [happy — đo BINDING] wall-clock `Measure-Command` ×3 — **PASS** (kèm 1 lệch-ước phải điền lại)

| lane | 3 lượt (ms) | tb |
|---|---|---|
| A — literal PHẦN B (`--session 6`, repo THẬT) | 83 / 52.8 / 52.3 | **62.7 ms** |
| B — full-check fixture `01-clean` (9.548B) | 60.3 / 52.4 / 53.5 | **55.4 ms** |
| C — draft-mode (`--draft draft-ok.md`) | 60.6 / 53.1 / 70.2 | **61.3 ms** |
| D — full-check 34.323B / 3 block | 77.6 / 56 / 57.9 | **63.8 ms** |

- Ngưỡng `tb ≤ ~0.5s`: **ĐẠT dư ~8×**. Tổng pause-thêm THẬT = C (draft) + B (full) ≈ **117ms ≈ 0.12s**, 0 spawn.
- 🔴 **Lệch ước >2× — theo hướng RẺ HƠN:** ước T1 = 140-300ms/lượt → đo 55-64ms/lượt (**2.2-5.4× cao hơn thực**); dòng "+~0.3-0.6s máy" trong `pause.md §2.6-bis` cũng cao hơn thực ~3-5×. Lý do đo được: mind-check thuần đọc tệp, **0 subprocess git** (machine-block 140ms có gọi git). Theo luật phép #16 ⇒ **T9 điền số THẬT** vào `pause.md §2.6-bis`. `pause.md` = LEAD-SOLO (T6a) ⇒ **tôi KHÔNG sửa**, chỉ giao số.
- ⚠️ **KHAI về lane A (chống tự-đo-nhánh-rẻ):** repo THẬT `session-6` **CHƯA có** `_mind-s-6.md` (chỉ `_context-s-6.md`) ⇒ lệnh literal đi nhánh *canonical vắng* = early-exit, **không** đọc `memory-budget.json`, **không** parse block. Nếu chỉ báo lane A thì đang đo nhánh RẺ NHẤT rồi gọi nó là "chi phí pause". Vì vậy đo thêm B/C/D = nhánh full + draft có thật; chênh không đáng kể (55-64ms) nên kết luận không đổi.

### #17 [đột-biến + khai] immutability — **PASS (mức MÔ-TẢ + git read-only)** + KHAI 1 vế thay-thế

| vế | THỰC-ĐO |
|---|---|
| (a) máy **KHÔNG** canh bất-biến per-run | `17-oldblock` = `01-clean` sửa **1 byte** trong block CŨ (`(window 1)`→`(window 9)`) → mind-check **exit 0** · `verdict: dat=10 TRUOT=0 co=0` ⇒ đúng như T1 tự khai: cần git-history, ngoài tầm $0 |
| (b) git THẤY đúng dòng | `git diff --no-index --unified=0 01-clean … 17-oldblock …` → hunk **`@@ -87 +87 @@`** với `-## MIND-0 — … (window 1)` / `+## MIND-0 — … (window 9)` |
| (c) repo THẬT read-only | `git diff --stat -- .claude/sessions/` = **0 dòng thay đổi** · **0 commit** |

⚠️ **KHAI thay-thế-phép (không tả thành đã-làm-đủ):** literal #17 đòi "`_mind` **đã commit** rồi sửa 1 byte → `git diff` hiện" — **không chạy được nguyên văn lượt này** vì (i) repo THẬT chưa có `_mind-s-6.md` (T9 dogfood mới sinh) và (ii) lệnh cấm commit. Thay bằng `--no-index` trên 2 bản sao (**cùng cơ chế diff dòng, 0 commit**) + xác nhận thư-mục ĐANG được track (`git ls-files .claude/sessions/session-6/` → `_context-s-6.md`) ⇒ khi `_mind` sinh ra nó vào git đúng đường đó. Vế "git diff trên chính `_mind` đã commit" = **DEFER T9**. Lưới thật = luật (block bất biến) + git history + ctx-audit @close so-git khi nghi.

### #21 [happy — verify claim đề bài] Sàn-3 ⑤ không cần tín-hiệu mới — **PASS 2/2** (vế runtime DEFER T9)

| vế | THỰC-ĐO |
|---|---|
| hook path-4 | `.claude/hooks/wal-flush.ps1:13` → `$paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/")` — **hit**; `:14` comment tự khai path-4 = *thư-mục phiên-LOGIC* ⇒ `_mind-s-<N>.md` nằm **TRONG** path 4 sẵn có, **0 path mới** |
| tín-hiệu ⑤ trong `tiep.md` §0 | **hit 5 chỗ** — `:27` (path-4 buộc đẻ kèm ⑤ CÙNG một lần sửa) · `:37` bảng tín-hiệu ⑤ với lệnh dò ĐÚNG literal `git log --name-only --format='%s' origin/main..HEAD \| grep -q '.claude/sessions/'` · `:78` block ORPHAN-L · `:129` luật bất-biến "mỗi path mới ⇒ mỗi tín-hiệu MẠNH mới" |
| củng cố **không cần commit mới** | `git log --name-only -25` đã chứa `.claude/sessions/session-6/_context-s-6.md` + `session-5/{_end,_context-s-5.md,_pause-1.md,_snapshot-1.md,_tiep-1.md}` ⇒ đường-dẫn này THẬT đã đi qua hook → commit trong lịch sử |

⇒ claim đề bài **ĐÚNG về cấu-trúc**: `_mind` được ⑤ phủ sẵn, KHÔNG kích hoạt luật "path mới = tín-hiệu mới". Vế runtime literal (commit `_mind` MỚI rồi grep `origin/main..HEAD`) = **DEFER T9** (cấm commit + `_mind` chưa sinh).

> **Ghi bên lề (KHÔNG phải vi phạm của lane này):** `scripts/__pycache__/session_ctx.cpython-311.pyc` (mtime **14:19**, trước lượt T4) tồn tại và `.gitignore` **0 hit** `__pycache__` ⇒ sẽ hiện untracked trong git-status audit của em main. Không do T4 sinh (mọi lệnh của T4 chạy `python <file>` dạng script, mtime .pyc không đổi sau các lượt chạy).

> **Ghi bên lề 2 — `git status` KHÔNG sạch, và đây là vì sao (khai để em main không nghi lane T4):** `git status --porcelain` cho ` M scripts/session_ctx.py` + `?? scripts/__pycache__/`. Tệp máy là **của lane T1** (chưa commit): `git diff --stat` = **+528/-1 dòng** = đúng khối `mind-check`, mtime **14:21:21** = **TRƯỚC** lượt T4 này. Bằng chứng T4 không chạm: `grep -n "_TS_KEY_RE = re.compile"` repo → `:59` **bản canonical nguyên vẹn** (`r'^[ \t]*ts[ \t]*:'`), và `grep -c "MUTANT"` repo → **0 hit** ⇒ đột-biến phép #5 CHỈ sống ở `scratchpad/t4/mut/`. `.claude/sessions/` + `tests/` = **sạch tuyệt đối**.

---

## TỔNG KẾT 18 PHÉP

**18 PASS / 0 FAIL.** #1-#7 (lane trước) + #8-#17 + #21 (lượt này). Không phép nào bỏ trống; 2 vế literal không chạy được đã KHAI + DEFER đúng chỗ (#17 git-diff-trên-tệp-đã-commit · #21 vế runtime) — **DEFER ≠ PASS**, và cũng không tính là FAIL vì bị chặn bởi điều kiện ngoài máy (tệp chưa sinh + lệnh cấm commit).

**3 thứ giao ra ngoài (không tự sửa — ngoài ranh test-specialist):**
1. 🔴 **GAP #9 (máy — lane implementer):** ở **closed-mode**, XOÁ con-trỏ → `co`/exit 0 còn GIỮ con-trỏ trung thực đang-chờ → `TRUOT`/exit 1 ⇒ đường-rẻ-nhất-để-xanh là đường SAI. Chữ luật cấm nhưng gradient thưởng. Đề nghị: ca "mục E có nội dung mà 0 con-trỏ backtick" khi `closed` nên `TRUOT`.
2. 🔴 **Lệch ước #16 (`pause.md §2.6-bis` — LEAD-SOLO T6a):** ước 140-300ms/lượt & "+~0.3-0.6s máy" cao hơn thực **2.2-5.4×**. Số THẬT: draft **61.3ms** + full **55.4ms** ≈ **117ms**, file 34KB vẫn **63.8ms**. Điền ở T9.
3. ⚠️ **Nhắc lại phát hiện #7 lane trước:** `secrets-sweep` **không có** `--root` ⇒ lệnh literal PHẦN B #7 không chạy được như viết (đã lách bằng bản-copy-trong-cây). Chọn (a) thêm seam cho đối xứng, hoặc (b) sửa literal.

**1 bài học nội bộ (đã chép vào MEMORY):** fixture-hỏng cho-xanh trông y hệt máy-đúng cho-xanh (#14 `draft-ts` — `inject_A` neo `## MIND-1` sau khi `renum` đã đổi thành `## MIND-2` ⇒ `find` = -1 ⇒ chèn giữa heading). Phép fault-inject chỉ có răng khi soi RUỘT fixture, không chỉ đọc exit code.

<!-- END sub-test-specialist-1 · TOTAL=18 phép -->
