# sub-ring1-audit — KIỂM vòng-1 @OPEN S154 (phiên-logic L7)

> Vai KIỂM độc-lập trên số của H1 `tooling-auditor` + H2 `harvest-curator`. Read-only + propose-only.
> Ghi-đĩa-TRONG-lúc-làm (chống #53) — file LUÔN hợp-lệ giữa chừng, mỗi verdict 1 mục đếm được.
> Bắt đầu 2026-07-26. Repo `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP`.

## §0 PIN + fail-safe (nghĩa-vụ (i)) — input TỒN-TẠI, ĐÓNG, tuần-tự C4b

| kiểm | kỳ-vọng (lead pin) | tao ĐO ĐỘC-LẬP | phán |
|---|---|---|---|
| H1 tồn-tại | `sub-tooling-auditor-open-S154.md` | có, `wc -c` = **13605** | ✅ KHỚP |
| H1 END | `TOTAL=3 FINDING` @:143 | `wc -l`=143, dòng 143 = `<!-- END sub-tooling-auditor-S154 · TOTAL=3 FINDING -->` | ✅ KHỚP |
| H2 tồn-tại | `sub-harvest-curator-open-S154.md` | có, `wc -c` = **24858** | ✅ KHỚP |
| H2 END | `TOTAL=6 FINDING` @:289 | `wc -l`=**290** (≠289) — nhưng `od -c` đuôi = `-->\n\n` ⇒ END nằm dòng **289**, dòng 290 = dòng TRỐNG cuối. **Không phải dấu-hiệu file đang bị ghi** | ✅ KHỚP (đã giải-thích chênh) |
| tuần-tự C4b | mtime(ring1) > mtime(H1),(H2) | H1 18:06:39 · H2 18:08:40 · ring1 (file này) sinh sau 18:08 | ✅ ĐÚNG THỨ-TỰ |

⇒ **pin ĐẦY-ĐỦ, KHÔNG NO-OP.** Cả 2 vai-đo có chạy phiên này, artifact tươi (mtime 2026-07-26 18:0x, cùng phiên).

🔴 **Cảnh-báo đã cân-nhắc và BÁC:** chênh `wc -l` 290 vs pin 289 KHÔNG phải file-còn-đang-ghi — byte-count khớp tuyệt-đối (24858) và đuôi file có END marker đóng. Chênh thuần do đếm dòng-trống cuối.

(findings ghi dần bên dưới)

---

## §1 DATUM (a) — F-3 của H1: **DƯƠNG-GIẢ. Lead BÁC ĐÚNG.** (kiểm bằng lệnh của chính tao)

🔴 Đây là phép thử về chính tao — tao KHÔNG nhận qua relay, tự chạy lại từ đầu.

**H1 claim (F-3, `sub-tooling-auditor-open-S154.md:114`):** *"`grep -c "→ log" docs/STATUS.md` = **29** … nhưng **khối S153 `:466-471` KHÔNG có dòng nào**; `grep -rn "2026-07-26-1600-S153"` = 7 hit, live-anchor **DUY NHẤT** là `.claude/sessions/session-6/_end:2`"*

**Tao đo lại — 3 phép độc-lập, cả 3 phá claim:**

| # | lệnh của TAO | kết-quả | hệ-quả |
|---|---|---|---|
| a-1 | `grep -n $'\xe2\x86\x92 log' docs/STATUS.md \| cut -d: -f1` → in **toàn bộ 29 số dòng** | `6 8 10 43 54 67 93 101 120 145 177 201 222 249 282 316 331 337 349 371 379 408 426 436 **471** 480 484 488 508` | **471 CÓ trong danh sách 29 hit của chính H1.** Khối S153 = `:466-471`, nên `:471` NẰM TRONG khối ⇒ claim "KHÔNG có dòng nào" **SAI** |
| a-2 | `sed -n '471p' docs/STATUS.md` | `- State: … → log [`2026-07-26-1600-S153-ctx-adopt-3vai-rename.md`](changelog/sessions/2026-07-26-1600-S153-ctx-adopt-3vai-rename.md)` | con-trỏ **CÓ THẬT**, dạng **markdown-link** |
| a-3 | `sed -n '6p' docs/STATUS.md` (khối CURRENT S153) | đuôi dòng = ``→ log `changelog/sessions/2026-07-26-1600-S153-ctx-adopt-3vai-rename.md` `` | con-trỏ **THỨ HAI**, dạng backtick |
| a-4 | `ls -la` + `wc -c` file đích | **9367B**, mtime 2026-07-26 15:45 | file đích **TỒN-TẠI**, byte khớp đúng số lead đưa (9.367B) |

**🔬 Tao truy luôn CƠ-CHẾ sai của H1 (kiểm quy-NGUỒN, không chỉ con-SỐ — bài E1/S150 #4):**
```
grep -c $'\xe2\x86\x92 log `'  docs/STATUS.md  = 25   <- dạng backtick
grep -c $'\xe2\x86\x92 log \[' docs/STATUS.md  =  4   <- dạng markdown-link  (25+4 = 29 ✔)
4 dòng dạng markdown-link = :471 :480 :488 :508
```
⇒ `:471` là **1 trong 4 dòng DUY NHẤT dùng khuôn markdown-link** trong toàn STATUS. H1 đếm tổng đúng (29) nhưng khi soi khối S153 đã tìm theo **khuôn backtick** — trúng đúng 1 trong 4 ngoại-lệ khuôn. **Đây là mù-khuôn (form-blindness), không phải mù-số.**

**Phá thêm mệnh-đề phụ "live-anchor DUY NHẤT":**
```
grep -rn "2026-07-26-1600-S153" .claude docs  →  11 hit / 8 file   (H1 khai 7)
   docs/STATUS.md              2   <- :6 + :471  ← CẢ HAI đều live-prescriptive
   docs/HANDOFF.md             1   <- :5         ← live
   .claude/sessions/session-6/_end 1 <- :2       ← H1 gọi là "duy nhất"
   (7 hit còn lại = run-folder frozen S153/S154)
```
⇒ live-anchor **≥3** (STATUS:6, STATUS:471, HANDOFF:5), không phải 1. Và tổng **11 ≠ 7**.
⇒ Nội-tại H1 cũng đã tự mâu-thuẫn: nó khai *"7 hit … 4 hit còn lại"* ⇒ **1+4 = 5 ≠ 7**, hụt 2 ngay trong câu của nó.

### ⇒ VERDICT §1: **H1 F-3 = TRƯỢT (dương-giả).** Lead bác **ĐÚNG**.
Hệ-quả hành-động: **KHÔNG vá gì cả.** Nếu lead nghe theo H1 mà "thêm 1 mảnh `→ log` vào `:471`" thì sẽ tạo **con-trỏ TRÙNG** trên chính dòng đã có — vá một lỗi không tồn tại. Con-trỏ hiện đủ **2 tầng** (header `:6` + Recently-Done `:471`) + HANDOFF, **vượt** khuôn 28 khối anh em (đa số chỉ 1 tầng).

---

## §2 H1 — verdict per-claim (nghĩa-vụ (ii))

### §2.A ② VAI-TRÒ / roster — tao TỰ ĐẾM LẠI 4 bề mặt (số CÓ-THỂ-SAI)

🔴 Áp luật tự-đặt @S150 sau khi bẫy glob README cắn chính tao: **mọi lệnh đếm `.claude/agents/*.md` phải loại README**.

| H1-# | claim H1 | lệnh TAO chạy (khác nguồn/khác engine) | tao đo | phán |
|---|---|---|---|---|
| H1-1 | đĩa agents = **23** | `ls … \| grep -v README \| wc -l` **+** `git ls-files … \| grep -v README` **+** `find … ! -name README.md` | **23 / 23 / 23** (3 nguồn) | ✅ **ĐẠT** |
| H1-2 | `hmw.js` VALID_ROLES = **23** | **đổi engine awk→python**: neo `startswith('const VALID_ROLES = [')` → dòng đóng `]`; strip `//`; regex `'([a-z0-9-]+)'` | mảng = dòng **22→43**, count **23** | ✅ **ĐẠT** |
| H1-3 | `STATUS:456` = **23** | `sed -n '456p'` | `\| Sub-agents \| **23** \| +S153 bộ-ba vòng Ctx…` | ✅ **ĐẠT** |
| H1-4 | `agent-memory/*/` = **23** | `ls -d .claude/agent-memory/*/ \| wc -l` | **23** | ✅ **ĐẠT** |
| H1-5 | tên trùng khít 1:1 (2 phép `diff` rỗng) | **so TẬP thay so SỐ** (bài E1/S150 #3): `diff roles↔disk`, `diff mem↔disk` | **cả 2 diff RỖNG** sau khi khử CRLF (xem falsify F-2) | ✅ **ĐẠT** |
| H1-6 | `agents/README.md:3` = B1-pointer, **0 số** | đọc `:1-6` + `grep -nE '\b(1[0-9]\|2[0-9])\b'` | `:3` đúng là *"Số vai canonical → docs/STATUS.md §Sub-agents. KHÔNG chép số vào file này"*; các số bắt được (`12`,`14`,`8`) đều nằm trong **văn-tự-sự lịch-sử** ("bản trước S122 cứng-hoá 12-agent… roster đã 14"), **0 count-claim hiện-hành** | ✅ **ĐẠT** |
| H1-7 | `STATUS:6` header cũng khai `Sub-agents 23` | `sed -n '6p'` | có: `**Sub-agents 23** · counter **27**` | ✅ **ĐẠT** |

**⭐ INFORM-R1 (KHÔNG phải lỗi H1 — nhắc lead @close):** `STATUS:6` khai `counter **27**` trong khi `.session-counter.json` đã tick **28** ngay trong phiên này (lead tick S154, classify `squash-benign`). ⇒ `STATUS:6` là **ảnh chụp lúc đóng S153**, **đúng-tại-thời-điểm**, KHÔNG phải drift. Nó **chỉ thành stale nếu closeout S154 quên bump**. Xếp **INFORM**, không chấm TRƯỢT ai.

### §2.B ②-bis DƯ-LƯỢNG TÊN CŨ — tao đếm ra **17**, H1 khai **13**. Truy trước khi phạt (bài E1/S150 #1).

🔴 Vênh 4 hit. Câu hỏi bắt buộc TRƯỚC khi chấm: *"H1 sai, hay số đã DỜI sau khi H1 đo?"* — tao decompose từng file:

| file | hit | H1 có đếm? | lý-do |
|---|---|---|---|
| `sessions/2026-07-26-1600-S153-….md` | 3 | ✅ (khai `:14,:52,:54`) | frozen |
| `agents/ctx-curator.md` · `ctx-verifier.md` | 1+1 | ✅ (lineage-note) | |
| `agent-memory/ctx-{audit,curator,verifier}/MEMORY.md` | 1+1+1 | ✅ (diary seed) | |
| `runs/S153-close/` run.md + 3 sub | 1+1+1+1 | ✅ (frozen ×4) | |
| `docs/STATUS.md` | 1 | ✅ (`:456`) | frozen |
| **⇒ cộng đúng phần H1 khai** | **13** | | **khớp TUYỆT-ĐỐI phân-loại 2+3+8 của H1** |
| 🔺 `sub-tooling-auditor-open-S154.md` (**file của CHÍNH H1**) | **3** | ❌ | **self-citation**: H1 phải VIẾT RA 3 tên cũ trong bảng phân-loại của nó ⇒ tự sinh hit khi đang đo |
| 🔺 `sub-lead-gap-open-S154.md` | **1** | ❌ | mtime **18:06:52** > mtime H1 **18:06:39** ⇒ **chưa tồn-tại** lúc H1 đo |
| **TỔNG tao đo NAY** | **17** | | 13 + 3 + 1 = 17 ✔ **decompose khít, 0 dư** |

⇒ **H1 ĐÚNG TẠI PIN CỦA NÓ.** 4 hit chênh = **citation-trap** (H1 tự-trích tên cũ để phân-loại — lớp `feedback_citation_trap_selfreference`) + **time-drift** (file em nó land sau). Cả 4 đều là **mention/frozen**, 0 cái mô-tả hành-vi sống.
**H1-8 ②-bis: ✅ ĐẠT.** Mệnh-đề load-bearing *"0 site MÔ-TẢ-HÀNH-VI-SỐNG bằng tên cũ"* **HELD** dưới lens của tao (tao đọc cả 4 hit mới: 3 trong bảng phân-loại H1 + 1 trong bối-cảnh lead-gap = trích-dẫn, không phải chỉ-thị).

### §2.C ① SKILL + ③ PLUGIN — tái-dựng bằng nguồn/engine KHÁC

| H1-# | claim | lệnh TAO | đo | phán |
|---|---|---|---|---|
| H1-9 | skill project = **6** | `ls -d .claude/skills/*/ \| wc -l` | **6** | ✅ ĐẠT |
| H1-10 | `git status .claude/skills/` rỗng | chạy lại | **rỗng** | ✅ ĐẠT |
| H1-11 | `~/.claude/skills/` = **23** | `ls -1 \| wc -l` | **23** | ✅ ĐẠT |
| H1-12 | `.claude/commands/*.md` = **19** | `ls -1 \| wc -l` | **19** | ✅ ĐẠT |
| H1-13 | plugin **18 reg / 15 en / 3 dis** | 🔴 **đổi parse: `json.load` thay `sed+grep -c`** (bài E1/S150 #3) | **18 / 15 / 3**, disabled = `pr-review-toolkit@` · `code-modernization@` · `hookify@` — **trùng khít 3 tên** | ✅ ĐẠT |
| H1-14 | marketplace = **37** | `ls -1 …/plugins \| wc -l` | **37** | ✅ ĐẠT |
| H1-15 | lead model `claude-opus-5[1m]`, effort `xhigh` | `json.load` đọc key | `model=claude-opus-5[1m]` · `effortLevel=xhigh` | ✅ ĐẠT |
| H1-16 | `hmw.js:153 WIDTH_CAP=20` = `memory-budget.json cap:20` | grep + `json.load` đệ-quy tìm key `cap` | `hmw.js:153 const WIDTH_CAP = 20` · `/hmw_width/cap = 20` | ✅ ĐẠT (0 drift mirror) |

> 🔴 Ghi-chú F-6 lịch-sử (S153 tao từng bắt H1 **under-count** khi dump 18 key): lần này tao dump **toàn bộ** `enabledPlugins` bằng `json.load` và đếm theo giá-trị `is True` / `is False` — 15+3 = 18 = `len(ep)`, **không còn key nào lọt ngoài 2 nhóm**. Số 18/15/3 lần này **có răng**.

### §2.D 🔴 THÁCH-CLEAN #1 (BẮT BUỘC) — mở skill H1 gọi "FRESH": `ef-core-migration`

H1 khai: *"Nợ S151 (Mig 67) VẪN ĐÓNG — verified tươi … bảng skill = row cuối 67 ⟂ canonical STATUS Mig 67 ⇒ khớp"*. CLEAN không được tin trần — tao mở bằng **lens sạch (đĩa `src/`, thứ H1 KHÔNG chạm)**:

| lens | đo | kết |
|---|---|---|
| row 67 có ở `:89`? | `sed -n '89p'` → `\| **67** \| **AddPeApprovedBudgetSnapshot** \| 🎯 S133 …` | ✅ |
| 67 có THẬT là row CUỐI? | `awk 'NR>89 && /^\\\| *[0-9]/'` → **0 dòng** | ✅ không có row 68 ẩn |
| bảng liên-tục không lỗ? | grep row 60→67 ra đủ 60,61,62,63,64,65,66,67 | ✅ 0 lỗ |
| canonical STATUS | `grep -oE 'Mig [0-9]+'` → `Mig 67` | ✅ |
| 🔬 **Mig 67 có TỒN-TẠI trên đĩa `src/` không?** | `find src -iname '*ApprovedBudgetSnapshot*'` → `Persistence/Migrations/20260717032812_AddPeApprovedBudgetSnapshot.cs` (+`.Designer.cs`) | ✅ **CÓ THẬT** |
| 🔬 số-học khép kín | `ls Migrations/*.cs \| wc -l` = **135** = 67 migration + 67 Designer + 1 `ApplicationDbContextModelSnapshot` | ✅ **135 = 67+67+1 khít** |
| mtime skill | 2026-07-26 01:41, 34.147B (H1 khai 34.147B) | ✅ byte-exact |

⇒ **THÁCH-CLEAN #1: CLEAN CHỊU ĐƯỢC.** Skill `ef-core-migration` **fresh THẬT**, không phải stale-báo-fresh. **H1-17 ✅ ĐẠT.**
*(Đối-chiếu lịch-sử: S151 tao TRƯỢT-1 vì bảng dừng ở 66; S153 chịu; nay chịu tiếp — và lần này tao siết thêm bằng đĩa `src/`, thứ 2 lượt trước chưa dùng.)*

### §2.E F-1 · F-2 của H1

| H1-# | claim | tao đo | phán |
|---|---|---|---|
| H1-18 | F-1 `docs/governance/README.md` chưa chạm từ `72bbfa5` **2026-06-02** | `git log -1 --date=short` → `72bbfa5 2026-06-02`; `git status` rỗng | ✅ **ĐẠT** |
| H1-19 | F-1 `:5` khai `Active trial week 1-4 (…→ 2026-06-23)` | `sed -n '5p'` → đúng verbatim; hôm nay 2026-07-26 ⇒ quá hạn **33 ngày** (tao tự tính lại: 06-23→07-26 = 33) | ✅ **ĐẠT** |
| H1-20 | F-1 `:35` khai `phase-9-uat … (current)` | `sed -n '35p'` → `- \`phase-9-uat\` — UAT + production hardening (current)` | ✅ **ĐẠT** |
| H1-21 | **F-3** khối S153 thiếu `→ log` | **§1** — 3 phép phá | ❌ **TRƯỢT (dương-giả)** |
| H1-22 | F-2 **8/10** thư inbox mới nhất = 0-row | vòng `for` của tao (xem falsify F-3) | **8/10** — 2 file 07-22 có row `:58/:59`, 8 file kia 0 | ✅ **ĐẠT** |
| H1-23 | F-2 `_index.md` **112 dòng** | `wc -l` | **112** | ✅ **ĐẠT** |
| H1-24 | S153 **không đụng skill nào**, commit chạm skill gần nhất `c2d01f0` | `git log -1 --date=short -- .claude/skills/` + `git show --stat 11db5ef -- .claude/skills/` | `c2d01f0 2026-07-26`; S153-closeout chạm **0 dòng** skill | ✅ **ĐẠT** |
| H1-25 | DIFF F-5 ĐÓNG: `memory-budget.json` có `_roster_note_S153` **và** giữ `_why_20_not_16` | `grep -c` 2 khoá | **2/2 có mặt** ⇒ đúng "thêm khoá, KHÔNG sửa record đã ratify" | ✅ **ĐẠT** |
| H1-26 | §Ground: HEAD `871ac0a`, `git status` = **3 mục** | nay HEAD `2af3808`, status 2 mục | 🔴 **ĐẠT-TẠI-PIN** — Stop-hook `wal-flush` auto-commit mỗi turn (`48f3fef` 18:01 · `035daec` 18:02 · `256f724` 18:07 · `2af3808` 18:09). Lúc H1 đo (~17:57-18:00) HEAD **đúng** là `871ac0a` và run-folder **chưa** tracked. **KHÔNG phạt** (bài E1/S150 #1) | ✅ **ĐẠT** |
| H1-27 | DIFF F-1: `agents/README.md:225-226` vá đúng nấc + 3 citation tươi | **không tái-dựng lượt này** (hết ngân-sách lượt) | ⬜ **KHÔNG-CHẤM** |
| H1-28 | DIFF F-3: `HANDOFF.md:8` neo con-trỏ live ctx-draft | **không tái-dựng lượt này** | ⬜ **KHÔNG-CHẤM** |

---

## §3 H2 — verdict per-claim (5 trục + 6 finding)

| H2-# | claim H2 | lệnh TAO (khác engine/nguồn) | tao đo | phán |
|---|---|---|---|---|
| H2-1 | universe **60** run-dir | `find … -mindepth 1 -maxdepth 1 -type d \| wc -l` | **60** | ✅ ĐẠT |
| H2-2 | **3 dir** không có `run.md` (tên cụ-thể) | vòng `for` test `! -f run.md && ! -f sub-md/run.md` | **3, TRÙNG KHÍT TÊN**: `S117-pe-approve-minmax-range` · `S117-pe-luyke-finalize` · `S144-bootstrap` | ✅ ĐẠT (so TẬP) |
| H2-3 | FLAG-1: 2 file **25.283 + 22.248 = 47.531B** | `wc -c` | **25283 + 22248 = 47531** | ✅ ĐẠT byte-exact |
| H2-4 | FLAG-1: END `TOTAL=53` / `TOTAL=27` | `grep -n "END sub-ring1-close"` + `tail` | ring1-close `:166` `TOTAL=53 verdict-item` · ring2-close `TOTAL=27 verdict-item (6 FLAG + 21 phép phụ)` | ✅ ĐẠT |
| H2-5 | **DATUM (b)** dedup an-toàn: `TOTAL=53`/`TOTAL=27` = **0 hit** trong `agent-memory/` | 🔴 **3 phép KHÁC lệnh lead**: (1) `os.walk` python đọc mọi `.md` → 0/0 · (2) `grep -rn "53 verdict-item\|27 verdict-item"` → **0** · (3) đọc chéo sổ ring1/ring2: entry S153 tự khai nguồn = file **@open** | **0 hit cả 3 phép** | ✅ **ĐẠT** |
| H2-6 | coverage **21 file-lượt / 3 run-folder** (9+6+6) | vòng `for` đếm `sub-*`+`*-return` | **9 + 6 + 6 = 21** | ✅ ĐẠT |
| H2-7 | **19/21** đã harvest (90,5%) | 21 − 2 (§FLAG-1) = 19 | khớp | ✅ ĐẠT |
| H2-8 | C.1 **16 sổ** có entry S153; **7 vai** 0-hit là đúng-vì-không-chạy | vòng `for grep -c S153` trên 23 sổ | **16/23**; 7 vai 0-hit = `cicd-monitor` `database-agent` `frontend-designer` `investigator-api` `office-document` `reviewer` `ring4-audit` — **TRÙNG KHÍT 7/7 TÊN** | ✅ **ĐẠT (so TẬP, không so SỐ)** |
| H2-9 | Placement stray `.claude` depth>1 = **0** | `find . -mindepth 2 -name .claude -type d` | **0** | ✅ ĐẠT |
| H2-10 | empty-dir dưới `.claude` = **0** | `find .claude -type d -empty` | **0** | ✅ ĐẠT |
| H2-11 | **23/23** sổ đúng nhà | `ls */MEMORY.md \| wc -l` + vòng `for` tìm dir thiếu | **23**, **0 dir thiếu** `MEMORY.md` | ✅ ĐẠT |
| H2-12 | Corruption **16 hit / 10 file** | 🔴 **đổi engine perl→python byte-mode** (`b.count(b'\xef\xbf\xbd')`), duyệt `os.walk` | **16 / 10**, và **per-file khớp TỪNG SỐ**: 1,1,3,1,1,1,1,1,5,1 — cộng = 16 | ✅ **ĐẠT (mạnh: khớp cả VECTOR, không chỉ tổng)** |
| H2-13 | Fidelity byte-exact | `wc -c` 3 mẫu | `sub-harvest-curator-S153.md` **17328** ✔ · `sub-ring1-S153.md` **22992** ✔ · `ctx-audit.md` **16206** ✔ | ✅ ĐẠT |
| H2-14 | FLAG-3: sổ khai `14.347B` ≠ đĩa `16.206B` | `wc -c` | đĩa = **16206** ⇒ chênh **1.859B** đúng như H2 tính | ✅ ĐẠT |
| H2-15 | INFORM-1 SELF **19.456B** > target 17.510B; **0/23** vượt cap 25.600 | `wc -c` + vòng `for` so cap | **19456**; **0 sổ** > 25600 | ✅ ĐẠT |
| H2-16 | INFORM-2: `_mind-s-6` **12.482** · `_end` **1.570** · `_context-s-6` **3.474** · `_context-s-7` **2.938** | `wc -c` | **12482 · 1570 · 3474 · 2938** | ✅ ĐẠT 4/4 byte-exact |
| H2-17 | INFORM-3: WAL `run=` 0 · `wf:` 0 · session-log S154 0 | `grep -c` ×2 + `grep -rl` | **0 · 0 · 0** | ✅ ĐẠT |
| H2-18 | E.1 dự-báo baseline S153 (**16/10**) HELD | chính phép §H2-12 của tao | **16/10 khớp** ⇒ mệnh-đề dự-báo của H2 **chịu được 1 chu-kỳ** | ✅ ĐẠT |
| H2-19 | G.3 census **644 file** dưới `.claude` | `find .claude -type f \| wc -l` | **646** nay (+2 vs pin, trong đó **≥1 = chính file này của tao**) | ✅ **ĐẠT-TẠI-PIN** (time-drift, không phạt) |
| H2-20 | §F containment `git status` = **1 mục** | nay **2 mục** (thêm file của tao, chưa commit) | ✅ **ĐẠT-TẠI-PIN** — cùng lớp H1-26 | ✅ ĐẠT |
| **H2-21** | m#23: 3 đường mới **"đã commit (`035daec` 18:02)"** | `git log --diff-filter=A` từng đường | 🔴 cả 3 đường được THÊM ở **`48f3fef` 18:01:00**, KHÔNG phải `035daec` 18:02:51 | ❌ **TRƯỢT-rìa (LOW)** — *kết-luận không đổi* (vẫn TRACKED + not-ignored, m#23 vẫn đúng); **sai đúng 1 SHA + 1 phút**. Nêu vì H2 dạy "vắng ở porcelain có 2 nghĩa" mà lại dán nhầm bằng-chứng SHA |
| H2-22 | iconv **628/628** UTF-8 OK, 0 BAD | **không chạy iconv lượt này** | ⬜ **KHÔNG-CHẤM** |
| H2-23 | 0-byte = **10 file** đều `.gitkeep` | **không tái-dựng** | ⬜ **KHÔNG-CHẤM** |
| H2-24 | A.2 orphan-scan **0/60** (mọi dir có synthesis >0B) | **không tái-dựng trọn 60** (đắt) | ⬜ **KHÔNG-CHẤM** |

### §3-bis 🔴 THÁCH-CLEAN #2 (BẮT BUỘC) — mở sổ H2 gọi "ĐÃ HARVEST": có **delta APPEND THẬT** không?

H2 báo Completeness **PASS** / Coverage 19/21. Rủi ro kinh-điển: **coverage đếm-TÊN mà chưa APPEND** (đúng anti-pattern #3 persona tao). Tao mở bằng **git-delta**, thứ không giả được:

```
git show --stat 11db5ef -- <4 sổ>
 .claude/agent-memory/harness-eval/MEMORY.md        | 6 ++++++
 .claude/agent-memory/implementer-backend/MEMORY.md | 4 ++++
 .claude/agent-memory/lead-stale-auditor/MEMORY.md  | 4 ++++
 3 files changed, 14 insertions(+)          <- APPEND THUẦN, 0 xoá
 .claude/agent-memory/test-specialist/MEMORY.md     | 11 +++++----- (11 thêm / 10 xoá)
```
- **3 sổ = APPEND THUẦN** (+14 dòng, **0 deletion**) ⇒ không phải sửa-tại-chỗ, đúng nghĩa harvest.
- Sổ thứ 4 (`test-specialist`) +11/−10 = **append + compact cùng lượt**, không phải "0 delta".
- **Truy nội-dung về đĩa** (không dừng ở byte đổi): entry `test-specialist:3` khai *"T4 fault-inject `mind-check` **18/18 PASS 0 FAIL**, run `2026-07-26-S153-ctx-adopt`"* → run-folder đó **tồn-tại**, chứa **9 file**, và chuỗi `18/18` **có thật** trong `ctx-adopt-synthesis.md` ⇒ entry **truy được về nguồn**, không phải tự-khai.

⇒ **THÁCH-CLEAN #2: CLEAN CHỊU.** "Đã harvest" của H2 = **APPEND thật + nội-dung truy được**, không phải coverage-đếm-tên. **H2-25 ✅ ĐẠT.**

---

## §4 FALSIFY-LOG (nghĩa-vụ (iii)) — 6 phép · 3 HELD / 3 BROKE (**cả 3 BROKE đều vào CHÍNH TAO**)

| # | phép thử **phủ-định** | kết |
|---|---|---|
| **F-1** | *"F-3 của H1 đúng — khối S153 thật sự thiếu con-trỏ"* → tao thử **xác-nhận** bằng cách in trọn 29 số dòng `→ log` | **BROKE (claim H1 vỡ)** — `471` nằm ngay trong danh-sách 29 hit của chính H1. Truy tiếp ra cơ-chế: `:471` là 1 trong **4 dòng duy nhất** dùng khuôn markdown-link (25 backtick + 4 link = 29) ⇒ H1 **mù-KHUÔN, không mù-số** |
| **F-2** | *"H1 nói tên vai trùng 1:1 — thử PHÁ bằng `diff` 2 tập"* | **BROKE — VÀO CHÍNH TAO.** `diff` in **23/23 dòng khác nhau** ⇒ suýt tố H1 sai roster. Truy ra: `io.open(...,'w')` của **script python TAO viết** đẻ **CRLF**, `file` xác nhận *"with CRLF line terminators"*; `tr -d '\r'` xong → **diff RỖNG cả 2 phép**. ⇒ H1 **HELD**; lỗi là **artifact của thước tao** |
| **F-3** | *"H1 nói 8/10 thư inbox 0-row — thử phá, tao đoán thật ra 10/10"* | **BROKE — VÀO CHÍNH TAO (lần 2).** Vòng `for` của tao grep **kèm đuôi `.md`** → ra **10/10 = 0 row**. Nhưng `_index.md` ghi tên **KHÔNG có `.md`** (`:58`/`:59` verbatim) ⇒ grep của tao **luôn ra 0**, một số-rác. Bỏ `.md` → đúng **8/10**. ⇒ H1 **HELD** |
| **F-4** | *"skill ef-core khai Mig 67 nhưng đĩa chỉ có 66"* — tao đếm file migration được **66** ⇒ tưởng bắt được dương-thật | **BROKE — VÀO CHÍNH TAO (lần 3).** Bộ lọc của tao `! -name '*Snapshot*'` (định loại `ApplicationDbContextModelSnapshot.cs`) **ăn luôn** migration hợp-lệ `20260717032812_AddPeApprovedBudgetSnapshot.cs` — tên nó **chứa chữ "Snapshot"**. Số-học khép kín chứng minh: `ls Migrations/*.cs` = **135** = 67+67+1. ⇒ Mig 67 **CÓ THẬT**, skill **fresh THẬT**, H1 **HELD** |
| **F-5** | *"vênh 17 vs 13 hit tên-cũ ⇒ H1 under-count"* | **HELD (H1 đúng tại pin)** — decompose từng file ra **13 + 3 (self-citation của chính H1) + 1 (`sub-lead-gap` land 18:06:52 > H1 18:06:39)** = 17, **khít 0 dư**. Không phải sai, là **citation-trap + time-drift** |
| **F-6** | *"H2 báo 'đã harvest' nhưng có thể chỉ đếm tên, chưa APPEND"* | **HELD (H2 đúng)** — git-delta cho **+14 dòng APPEND THUẦN 0 xoá** trên 3 sổ, và nội-dung `18/18` truy được về `ctx-adopt-synthesis.md` |

> 🔴 **Bài lớn nhất lượt này: 3/6 phép phá lại vỡ vào THƯỚC CỦA TAO, không vào vai bị chấm.** Cả 3 đều cùng một lớp — **thước tự-đẻ số-rác rồi số-rác trông y hệt phát-hiện**: CRLF (F-2) · grep sai khuôn tên (F-3) · lọc `-name` ăn nhầm (F-4). Nếu tao dừng ở lượt đo đầu, tao đã nộp **3 cáo-buộc OAN** (roster lệch 23/23 · F-2 sai tập-đo · skill stale Mig 66). Nối thẳng bài S153 (`grep -c … || echo 0` in "0" **và** exit 1). **Luật tự áp:** *số 0 và số "khác kỳ vọng" đều phải bị nghi là LỖI THƯỚC trước khi bị coi là phát-hiện.*

---

## §5 TỰ TÁI-DỰNG SỐ LOAD-BEARING (nghĩa-vụ (iv)) — 17 số, **15 khớp / 2 lệch-đã-giải-thích**

**Khớp (15):** roster `23` ×4 bề mặt (3 nguồn khác nhau: `ls`/`git ls-files`/`find`) · VALID_ROLES `23` (python≠awk) · plugin `18/15/3` (`json.load`≠`sed+grep`) · marketplace `37` · skill `6` · command `19` · standalone `23` · run-dir `60` · orphan-byte `25283+22248=47531` · corruption **vector** `[1,1,3,1,1,1,1,1,5,1]=16/10` (python≠perl) · coverage `9+6+6=21` · diary-S153 `16/23` + **7 tên vai 0-hit khớp tập** · `12482/1570/3474/2938` · `19456` · Mig `135 = 67+67+1`.

**Lệch (2) — cả 2 là TIME-DRIFT, KHÔNG phải sai:** census `646` (pin H2 `644`, +2 gồm chính file này) · `git status` `2 mục` (pin H1 `3`, pin H2 `1` — Stop-hook `wal-flush` commit 4 lần trong 8 phút: `48f3fef`→`035daec`→`256f724`→`2af3808`).

🔴 **Phát-hiện phương-pháp cho lead:** H1 và H2 khai `git status` **3 mục** vs **1 mục** — nhìn qua tưởng 1 trong 2 sai. Thật ra **cả hai đều đúng**, vì hook auto-commit chạy **giữa** 2 lượt đo. ⇒ Ở repo này, mọi số `git status`/`HEAD`/census **bắt buộc kèm giờ-đo** mới có nghĩa; so 2 vai với nhau mà không so giờ = **đẻ mâu-thuẫn giả**.

---

## §6 TỔNG — 53 claim · ĐẠT 46 / TRƯỢT 2 / KHÔNG-CHẤM 5

| khối | claim | ĐẠT | TRƯỢT | KC |
|---|---|---|---|---|
| **H1** `tooling-auditor` | 28 | **25** | **1** (H1-21 F-3) | 2 |
| **H2** `harvest-curator` | 25 | **21** | **1** (H2-21 SHA m#23) | 3 |
| **cộng** | **53** | **46** | **2** | **5** |

🔴 **KHÔNG gộp verdict-tổng che TRƯỢT lẻ** (anti-pattern #5): dưới đây từng dòng TRƯỢT đứng riêng.

### 2 TRƯỢT — cả 2 KHÔNG chạm số load-bearing

1. **H1-21 · F-3 · MED-hệ-quả · DƯƠNG-GIẢ ⇒ ĐỀ-XUẤT VÁ PHẢI HUỶ.**
   Claim *"khối S153 thiếu con-trỏ `→ log`"* **sai**: `STATUS:471` có (markdown-link) + `STATUS:6` có (backtick) + file đích **9.367B tồn-tại**. Live-anchor **≥3**, không phải 1; tổng hit **11**, không phải 7 (và H1 tự cộng hụt: `1+4=5≠7`).
   🔴 **Hành-động cho lead: ĐỪNG vá.** Vá theo H1 = thêm con-trỏ **thứ 3 trùng lặp** vào đúng dòng đã có. **Lead bác F-3 là ĐÚNG.**
   *Giá-trị còn lại của F-3:* 0. Nhưng **cơ-chế** thì đáng giữ — khuôn `→ log` tồn-tại **2 dạng** (25 backtick / 4 markdown-link); mọi detector tương-lai soi khuôn này phải bắt **cả hai**, nếu không sẽ tái-sinh đúng dương-giả này.

2. **H2-21 · m#23 SHA · LOW · sai bằng-chứng, ĐÚNG kết-luận.**
   H2 dán *"đã commit (`035daec` 18:02)"*; `git log --diff-filter=A` cho thấy cả 3 đường vào ở **`48f3fef` 18:01:00**. Kết-luận (TRACKED + not-ignored) **không đổi**. Đáng nêu vì H2 dựng nguyên m#23 để dạy *"vắng ở porcelain có 2 nghĩa trái ngược"* — bài đúng mà **neo SHA lệch** thì phiên sau truy `035daec` sẽ thấy diff không chứa 3 đường đó và nghi oan.

### 5 KHÔNG-CHẤM (khai thẳng, không giả-vờ đã kiểm)
`H1-27` README:225-226 · `H1-28` HANDOFF:8 · `H2-22` iconv 628/628 · `H2-23` 0-byte 10 `.gitkeep` · `H2-24` orphan-scan trọn 60 dir. Lý-do: hết ngân-sách lượt, **không phải** đã kiểm và thấy ổn.

### 2 THÁCH-CLEAN — **cả 2 CHỊU** (không ca nào thủng)
- **#1 skill `ef-core-migration` H1 gọi "fresh"** → fresh **THẬT**: row 67 là row cuối, bảng 60→67 không lỗ, **Mig 67 có mặt trên đĩa `src/`**, số-học `135 = 67+67+1` khép kín.
- **#2 sổ H2 gọi "đã harvest"** → APPEND **THẬT**: +14 dòng thuần 0 xoá trên 3 sổ, nội-dung `18/18` truy được về `ctx-adopt-synthesis.md`.
> Khác S153 (ô 🟢 thủng ở **mệnh-đề dự-báo**): lượt này mệnh-đề dự-báo baseline `16/10` của H2 **được kiểm và HELD** (§H2-18). Ô 🟢 lượt này **kín cả phần dự-báo**.

### 3 INFORM cho lead (không phải lỗi ai)
- **INFORM-R1** — `STATUS:6` khai `counter 27`, đĩa đã **28** (lead tick S154 trong phiên, `squash-benign`). Là **ảnh chụp lúc đóng S153**, đúng-tại-thời-điểm. ⇒ **nhớ bump @closeout S154**, nếu quên thì mới thành stale thật.
- **INFORM-R2** — Mọi số `git status`/HEAD/census ở repo này **vô nghĩa nếu không kèm giờ-đo** (hook `wal-flush` commit 4 lần / 8 phút). Đề: bookend sau, H1/H2 dán `HH:MM` cạnh mỗi số dạng này.
- **INFORM-R3** — F-2 (inbound `_index`) **CÒN MỞ đúng như H1 báo**, và tao đo thêm: lane inbound có **44 row**, row mới nhất **2026-07-22**; 8 thư từ 07-18→07-25 chưa có row. Xác nhận H1, không phải finding mới.

## §7 G-015 self-honesty

Vai này **propose-only**, KHÔNG khai "read-only enforced": `Bash` vẫn là kênh-ghi mở (`[carry:tools-whitelist-no-teeth]`). Lượt này tao ghi **đúng 1 file của chính tao** (`sub-ring1-open-S154.md`), 0 file khác. Backstop thật = lead single-writer + `git status` sau lượt.
**no-self-exempt:** tao KHÔNG phải H1/H2. Riêng ca `ring1-close-S153` mồ-côi (H2 FLAG-1) là **sổ của chính tao** — tao **chỉ xác-nhận số**, **KHÔNG tự APPEND** (đó là memory-op của lead).

<!-- END sub-ring1-S154 · TOTAL=53 CLAIM · ĐẠT=46 TRƯỢT=2 KHÔNG-CHẤM=5 -->
