# ring1-audit @close S158 — KIỂM vòng-1 (H1 `tooling-auditor` + H2 `harvest-curator`)

> Vai KIỂM độc-lập, read-only, propose-only. no-self-exempt: tao KHÔNG phải H1/H2.
> Ghi-đĩa-trong-lúc-làm (anti-`#53`). File này APPEND dần; TOTAL-line ở cuối.

## (i) PIN + fail-safe — ĐẠT

| Input | Đường-dẫn | Byte | mtime | Verdict |
|---|---|---|---|---|
| H1 | `runs/2026-07-28-S158-bookend-close/sub-tooling-auditor-close-S158.md` | 5.772 | 2026-07-28 20:18 | ✔ tươi, ruột CÓ CHỮ THẬT |
| H2 | `runs/2026-07-28-S158-bookend-close/sub-harvest-curator-close-S158.md` | 5.319 | 2026-07-28 20:22 | ✔ tươi, ruột CÓ CHỮ THẬT |
| Sổ chạy | `run.md` | 2.569 | 2026-07-28 20:08 | ✔ |

Tuần-tự C4b: file này ghi lúc ≥20:25 > mtime H1 (20:18) và H2 (20:22) ⇒ **chấm bản ĐÃ XONG**, không chấm bản đang bay.

---

## (ii) Verdict per-claim

### H1 — mặt ② vai sub-agent (claim mạnh nhất: roster 23=23=23=23)

| # | Claim H1 | Verdict | Bằng-chứng tao TỰ dựng |
|---|---|---|---|
| H1-7 | đĩa `.claude/agents/*.md` −README = 23 | **ĐẠT** | `git ls-files` (nguồn KHÁC `ls`) = 23 · `find` = 23 |
| H1-8 | `hmw.js VALID_ROLES` = 23 | **ĐẠT** | block `hmw.js:22..43` (line-anchored), strip `//` ⇒ 23 |
| H1-9 | `agent-memory/*/` = 23 dir | **ĐẠT** | `find -type d -maxdepth 1` = 23 |
| H1-10 | STATUS row `\| Sub-agents \| **23** \|` | **ĐẠT** | `docs/STATUS.md:458` — pipe-row TỒN-TẠI đúng form H1 trích (không phải câu văn) |
| H1-11 | `diff` tên 3 chiều **identical** | **ĐẠT — mạnh hơn H1 khai** | 3 file tên sau `LC_ALL=C sort` **md5 TRÙNG KHÍT** `b068dbee8005c146a633d17c4a24df97` ⇒ không chỉ identical, mà byte-identical |
| H1-12 | 23/23 có mặt trong README ⇒ 0 vai mồ-côi | **ĐẠT** (caveat) | loop 23 role grep README = 0 missing. ⚠️ caveat tao tự khai: đây là **substring-presence**, chỉ chứng "có nhắc", KHÔNG chứng "có ô mô-tả riêng" |

🔴 **2 lỗi CỦA CHÍNH TAO tự bắt trong lúc dựng số này** (ghi để không ai dùng số rác của tao):
1. Parse `\[(.*?)\]` non-greedy ra **18** ⇒ suýt tố H1 khai khống 23. Nguyên-nhân: `hmw.js:39` chứa `owner-decision [2] TÁCH` — dấu `]` **trong comment** cắt sớm. Đây **đúng cái bẫy H1 khai đã né** ⇒ H1 né THẬT, tao mới là con sập.
2. `comm` in 22 tên ở **CẢ HAI** phía exclusive ⇒ trông như lệch toàn-tập. Nguyên-nhân: python `sorted()` (codepoint) ⟂ shell `sort` (locale) — **comm cần cùng collation**. Ép `LC_ALL=C` ⇒ identical.
⇒ Bài: **số của con-KIỂM cũng phải bị kiểm.** 2/2 lần vênh đầu tiên đều là lỗi tao, không phải lỗi H1.

### H2 — F4 orphan-arithmetic (claim H2 tự dán nhãn "KHỚP ĐỘC-LẬP")

| # | Claim H2 | Verdict | Bằng-chứng tao TỰ dựng |
|---|---|---|---|
| H2-16 | **62 folder có `run.md`** | **ĐẠT** | `find -maxdepth 2 -name run.md \| wc -l` = **62** (tổng dir = 65 ⇒ 3 dir không phải run) |
| H2-17 | orphan-candidate = **4** | **ĐẠT** | chạy **verbatim** loop canonical `tiep.md:44-56` (DUAL-ACCEPT) ⇒ đúng **4**, đúng 4 tên H2 kể |
| H2-18 | S155 = 22 file · S157 = 9 file · 0 synthesis cả hai | **ĐẠT** | `ls \| wc -l` 22 / 9 ✔ · loop canonical liệt cả hai ✔ |
| H2-19 | S156 CÓ `review-synthesis.md` 9.166 B | **ĐẠT** | đối-chứng cùng kỳ đứng vững ⇒ luận-điểm "thói-quen, không phải migration" có chân |
| H2-20 | **3 orphan thật** (4 − 1 in-flight) | **ĐẠT tại PIN của con-đo** | xem ô 🔴 dưới |
| H2-21 | "= **KHỚP ĐỘC-LẬP** máy `run-chua-gom 3`" | 🔴 **TRƯỢT (LOW-MED, kỹ-thuật — số ĐÚNG, chữ "độc-lập" over-claim)** | xem ô 🔴 dưới |

🔴 **Ca bề-mặt-đo DỊCH DƯỚI CHÂN (đúng class ring1 vẫn gặp: "sai, hay đã-được-xử?")**
Tao chạy lại `scripts/nhip-no-probe.ps1` lúc ~20:30 ⇒ in **`run-chua-gom 4`**, KHÔNG phải 3.
**KHÔNG chấm H2 TRƯỢT vì số này.** Đo mốc bằng `stat`:
- `S158-day-wake-probe-first/run.md` = **20:04**
- `S158-bookend-close/run.md` = **20:08** ← folder do LEAD tạo, chính chỗ đang ghi file này
- dòng probe canonical ghi ở `run.md:20` = `run-chua-gom **3**` (ghi lúc 20:08)
⇒ tại mốc probe chạy, tập orphan = {S155, S157, S158-day-wake} = **3**. Số 3 của H2 **hợp-lệ tại thời-điểm nó đo**; số 4 của tao hợp-lệ tại thời-điểm tao đo. **Cả hai đúng, bề-mặt dời.**

🔴 **Nhưng phần TRƯỢT thật nằm ở CHỮ, không ở SỐ (H2-21):**
H2 viết *"3 orphan thật = **KHỚP ĐỘC-LẬP** máy"*. Hai vế **trùng TẬP** thật, nhưng **không cùng cơ-chế**:
- H2 ra 3 bằng **phán-đoán**: 4 candidate − 1 in-flight (F3) được **miễn**.
- Máy ra 3 bằng **chưa-thấy**: `bookend-close/` lúc đó chưa vào tập quét. `nhip-no-probe.ps1` là loop câm — **KHÔNG có khái-niệm "in-flight"**, không miễn-trừ gì hết.
⇒ máy **không hề xác-nhận** phép miễn-trừ của H2; nó chỉ tình-cờ ra cùng số vì thiếu đúng phần-tử H2 định miễn. Gọi đó là "khớp độc-lập" = **mượn uy-tín của máy cho một phán-đoán máy không phát-biểu**.
⇒ **Hệ-quả THẬT, không lý-thuyết:** ai đọc lại kỳ sau chạy probe sẽ thấy **4**, đối chiếu "3 khớp máy" ⇒ tưởng **REGRESSION** rồi đi truy 1 orphan không tồn tại. **Đúng class `H2-11 baseline-phantom` tao đã bắt @S153** — H2 tái-phạm cùng lớp: *ghim con-số bay-theo-thời-gian mà không ghim MỐC*.
**Vá rẻ (đề-xuất, lead ghi):** đổi 1 câu ⇒ *"`run-chua-gom 3` đo @20:08 TRƯỚC khi `bookend-close/` tồn tại; chạy lại sau mốc này ra 4 là ĐÚNG, không phải regression."*

### H1 — mặt ① skill (FLAG-1) · ③ plugin · ④ docs · (a) ghost-wire

| # | Claim H1 | Verdict | Bằng-chứng tao TỰ dựng |
|---|---|---|---|
| H1-1 | bảng history dừng ở **Mig 67** (`SKILL.md:89`) | **ĐẠT** | `:89` = row `\| **67** \| AddPeApprovedBudgetSnapshot` — đúng row cuối |
| H1-2 | đĩa có **68** migration, mới nhất `20260727033522_AddPeAllowApproverDelete.cs` | **ĐẠT** | `ls *.cs \| grep -v Designer` = 69 **−1** `ApplicationDbContextModelSnapshot.cs` = **68** ✔ tên mới nhất khớp |
| H1-3 | grep `68\|AllowApproverDelete` trong SKILL.md = **0 hit** | **ĐẠT** | `grep -c AllowApproverDelete` = 0 |
| H1-4 | frontmatter **`:4`** tự khai hợp-đồng "row cuối = mới nhất" | 🔴 **TRƯỢT (LOW, cite-drift)** | `:4` thật = `when-to-use:`. Chuỗi hợp-đồng nằm ở **`:3`** (description) + **`:19`** (heading `## Migration history … mới nhất = row cuối bảng`). **Lập-luận ĐÚNG, neo SAI dòng** — đúng class tao bắt @S153 (H1-14 `:122`→`:121`) |
| H1-5 | STATUS `CURRENT STATE` đã ghi 68 | **ĐẠT** | `docs/STATUS.md:6` = `Mig 68` |
| H1-6 | skill last-touch `c2d01f0` (S152) < Mig 68 land (S155) | **ĐẠT** | `git log -1 .claude/skills/ef-core-migration/` = `c2d01f0 2026-07-26` < mig `20260727` |
| H1-13 | plugin **18 registered / 15 enabled / 3 disabled** (`pr-review-toolkit`·`code-modernization`·`hookify`) | **ĐẠT** | `json.load(~/.claude/settings.json)` (parse KHÁC grep) ⇒ 18/15/3, đúng 3 tên |
| H1-14 | `model: claude-opus-5[1m]`, `effortLevel: xhigh` | **ĐẠT** | cùng phép json.load |
| H1-17 | FLAG-3 `WAL.md:21` còn `[ ]`; adap-report **6.360 B** | **ĐẠT** | `:21` nguyên-văn `[ ] Kéo **1 thư fan-out** … @bookend` · `stat` = **6360 B** đúng byte |
| H1-18 | chiều xuôi: `commands/day.md` KHÔNG tồn tại · `commands/*.md` = **19** | **ĐẠT** | `ls` = 19 · `day.md` → No such file |
| H1-19 | chiều xuôi: **7 file** `.claude/`, **toàn record/spec, 0 file cơ-chế** | **ĐẠT về CHẤT — số đã DỜI** | tao đếm nay = **10 file**. +3 là file *đẻ ra sau khi H1 đo* (`sub-lead-stale-close`, `sub-harvest-curator-close`, **và chính file tao đang ghi**). 🔴 Mệnh-đề load-bearing *"0 file cơ-chế"* **HELD**: 10/10 đều là WAL/context/run.md/spec/sub-*, 0 command, 0 script |
| H1-21 | chiều ngược: `git status --short` 4 file cơ-chế = **rỗng**; mtime 3 file `.claude/` = **2026-07-26** | **ĐẠT** | git status rỗng thật · `pause.md` 07-26 15:25 · `tiep.md` 07-26 15:24 · `memory-budget.json` 07-26 15:44 · `session_ctx.py` 07-26 14:51 — **tất cả TRƯỚC phiên này** |
| H1-15 · H1-16 · H1-20 · H1-22 · H1-23 · H1-24 | F-6 `README:225` CLOSED · FLAG-2 `docs/governance` stale · `_context-s-7:171-172` trong PAUSE-4 · C12 4 dòng `run=` · detector `:1888-1899` cấp-FILE · lỗ use⟂mention `:1895/:1908` | **KHÔNG CHẤM (6)** | ngoài ngân-sách lượt. 🔴 Khai thẳng: **KHÔNG đọc thành ĐẠT.** Riêng C12 tao ghi nhận H1 **tự tố lỗ trong chính bản vá của mình** — hành-vi đúng chiều, nhưng chưa kiểm |

### H2 — Corruption · Fidelity · Placement · evidence

| # | Claim H2 | Verdict | Bằng-chứng tao TỰ dựng |
|---|---|---|---|
| H2-22 | Corruption **16 hit / 10 file** | **ĐẠT — engine KHÁC vẫn trùng khít** | H2 dùng **perl** byte-mode; tao dùng **python `bytes.count(b'\xef\xbf\xbd')`**. Scope `.claude/` ⇒ **16 hit / 10 file** — TRÙNG TUYỆT ĐỐI |
| H2-24 | khớp baseline S153 (16/10) ⇒ **delta 0** | **ĐẠT** | so cùng scope `.claude` ⇒ apples-to-apples, không phải trùng may |
| H2-23 | *"trên **668** file `.md`"* | 🔴 **TRƯỢT (LOW, scope không khai)** | `.claude` = **676** file · `.claude`+`docs` = **1019** file ⇒ **17 hit / 11 file** (dôi `docs/gotchas.md`, mtime 07-17 = **cũ**, không phải hỏng mới). Câu "668 file .md" **không nói quét từ gốc nào** ⇒ người sau quét `.claude`+`docs` ra 17/11 sẽ tưởng **corruption MỚI**. Số H2 đúng; **nhãn scope thiếu** |
| H2-25 | SR-1 evidence `_tiep-4.md` **586 B**, có dòng `ctx-verifier:` | **ĐẠT** | `stat` = **586 B** đúng byte · dòng `ctx-verifier:` ở `:6` |
| H2-26 | SR-2 evidence `sub-invest-day-1.md` **25.440 B**, **183 dòng**, `## §5 PHẢN-BIỆN` `:165` | **ĐẠT — 4/4 byte-exact** | 25440 B ✔ · 183 dòng ✔ · `:165` = `## §5 PHẢN-BIỆN + giới hạn khai thẳng` ✔ |
| H2-27 | F1: `grep -c S158` = **0 hit ở CẢ HAI sổ** | **ĐẠT** | python `.count('S158')` ⇒ `ctx-verifier/MEMORY.md` = **0** · `investigator-codebase/MEMORY.md` = **0** ⇒ GAP-3 THẬT, không phải mtime-suy-đoán |
| H2-28 | F5 hai-cây-thước: `_mind` **30.305** raw / **30.041** LF-norm / chênh **264 = CR** · `_context` **0 CR** · headroom thật **2.463** | **ĐẠT — 6/6 số byte-exact** | `_mind-s-7.md` raw **30305**, CR **264**, norm **30041** · `_context-s-7.md` CR **0** · 32768−30305 = **2463** · lead "dư 2.727" = 32768−30041 = **2727** ✔ |
| H2-29 | Placement: `git status .claude/agent-memory/` **rỗng** | **ĐẠT** | git status rỗng thật ⇒ containment H-10 sạch |

---

## (iv) 🔴 THÁCH-CLEAN — 2 mặt, **1 CHỊU / 1 THỦNG**

### (a) Mở 1 sub H2 gọi là "harvested" → **CHỊU**
H2 khai `Fidelity STRONG` + tự dựng F5 **chống chính LEAD**. Tao đi tìm chỗ nó **tự nhẹ tay** — **không tìm ra**:
- 6/6 số F5 tái-lập byte-exact, kể cả số làm **lead sai** (headroom 2.463 chặt hơn 2.727 lead ghi).
- 4/4 số evidence (586 · 25440 · 183 · `:165`) đúng tuyệt đối.
- F1 **không dừng ở mtime** mà dùng `grep -c` nội-dung — tao xác nhận 0/0. Đây là **tự tố GAP-3 lần 7 vào chính lane harvest của nó**.
⇒ **KHÔNG có tự-nhẹ-tay.** H2 lượt-2 **không có dấu hiệu cắt/vội**: mọi số load-bearing đều có neo đĩa, `END · TOTAL=6 FINDING` đủ.

### (b) Mở 1 skill H1 "cho qua" → 🔴 **THỦNG — H1 mặt ① UNDER-COUNT**
H1 chỉ flag `ef-core-migration`, 5 skill kia cho qua. Tao mở **`contract-workflow`** (last-touch **2026-05-08**, cũ nhất nhì, 24.452 B):

> `.claude/skills/contract-workflow/SKILL.md:371` — *"PE Service wire xong, **Contract V2 chưa (defer Session 18+)**."*

**SAI trên ĐĨA** (không chỉ sai vs CLAUDE.md — tao verify bằng code thật):
- `src/Backend/SolutionErp.Domain/Contracts/ContractLevelOpinion.cs` **TỒN TẠI**
- `…/Persistence/Migrations/20260522052240_AddContractLevelOpinions.cs` **TỒN TẠI** (2026-05-22)
- `ApproveV2Async` có trong `src/Backend/SolutionErp.Application/Contracts/ContractFeatures.cs`
⇒ Contract V2 **ĐÃ WIRE**; skill khai **CHƯA**. Skill đứng im từ **05-08**, migration land **05-22** ⇒ **stale ~2,3 tháng**.
🔴 **Nặng hơn FLAG-1 về chất:** FLAG-1 là **thiếu 1 row** (gap). Cái này là **phát-biểu SAI chủ-động** — ai debug duyệt HĐ đọc câu đó sẽ đi nhầm đường, đúng chỗ skill sinh ra để chỉ đường.
⇒ **Mặt ① của H1 phải là ≥2 finding, không phải 1.** Đề-xuất: nâng mặt ① thành FLAG-1a (ef-core row 68) + **FLAG-1b (contract-workflow:371 Contract V2)**.

### 🔴 Meta-finding: FLAG-1 là **lần thứ 3 cùng một class**
`SKILL.md:89` có sẵn dấu vết: *"(row bổ sung **@S151** — **ring1 TRƯỢT-1** bắt bảng dừng ở **66** trong khi canonical **67**)"*.
⇒ S151 ring1 bắt 66-vs-67 → vá **bằng cách thêm 1 row** → S158 H1 bắt lại **67-vs-68**.
**Thêm row là vá TRIỆU-CHỨNG.** Bảng chép số mà canonical ở `STATUS.md` ⇒ **cấu-trúc đảm-bảo tái-stale mỗi lần có migration**. Đề-xuất (chỉ NÊU — no-self-exempt, tao không sửa): hoặc bảng chỉ giữ **tính-chất/bài-học** và trỏ STATUS cho số, hoặc thêm detector so row-cuối vs `ls Migrations/`. Vá kiểu cũ = hẹn gặp lại ở S16x.

---

## (iii) FALSIFY-LOG — 8 phép (4 HELD / 4 BROKE, **3 BROKE vào CHÍNH TAO**)

| # | Phép PHỦ-ĐỊNH cụ-thể | Kết |
|---|---|---|
| **F-1** | *"VALID_ROLES không đủ 23, H1 khai khống"* — parse `\[(.*?)\]` non-greedy ⇒ ra **18** | **BROKE → vào TAO.** `hmw.js:39` có `owner-decision [2] TÁCH` cắt regex sớm. **Đúng cái bẫy H1 khai đã né** ⇒ H1 né THẬT. Line-anchor `^]` ⇒ 23 |
| **F-2** | *"3 bề-mặt roster chỉ trùng SỐ chứ lệch TÊN"* — `comm` 2 chiều | **BROKE → vào TAO** (lần 2): comm in 22 tên ở **cả hai** phía = collation python-codepoint ⟂ shell-locale. Ép `LC_ALL=C` ⇒ **md5 3 file TRÙNG** ⇒ H1 **HELD, mạnh hơn nó khai** |
| **F-3** | *"orphan-candidate không phải 4"* — tự loop `run.md` + thiếu `*-synthesis.md` ⇒ ra **9** | **BROKE → vào TAO** (lần 3): tao bỏ nhánh **DUAL-ACCEPT dạng-2** (`harvest/*-synthesis.md`, C8 legacy `tiep.md:50-53`). 5 folder `2026-06-18-*` có synthesis **lồng trong `harvest/`**. Chạy loop canonical verbatim ⇒ **4** ⇒ H2 **HELD** |
| **F-4** | *"16/10 là artifact của perl; engine khác sẽ ra số khác"* — python bytes | **HELD.** python ⇒ **16/10** trùng khít trên scope `.claude` |
| **F-5** | *"`run-chua-gom 3` không tái-lập được"* — chạy lại probe thật | **BROKE (vào H2, LOW-MED).** Probe nay in **4**. Số 3 hợp-lệ **tại mốc 20:08**, nhưng nhãn *"KHỚP ĐỘC-LẬP"* over-claim: máy **không có** khái-niệm in-flight, nó ra 3 vì **chưa thấy** folder chứ không vì **miễn-trừ** nó |
| **F-6** | *"H2 tự nhẹ tay ở đâu đó"* — soi F5 (flag chống lead) + evidence bytes | **HELD (H2 sạch).** 6/6 + 4/4 số byte-exact, kể cả số bất-lợi cho lead. Không tìm ra chỗ nhẹ tay |
| **F-7** | *"H1 neo `:4` không có chuỗi nó trích"* — mở `:4` | **BROKE (vào H1, LOW).** `:4` = `when-to-use:`; chuỗi thật ở `:3` + `:19`. Nội-dung đúng, **neo sai dòng** |
| **F-8** | *"5 skill H1 cho qua đều fresh thật"* — mở `contract-workflow` | 🔴 **BROKE (vào H1, MED).** `:371` khai *"Contract V2 chưa"* trong khi entity+migration+`ApproveV2Async` đều có trên đĩa ⇒ **mặt ① under-count** |

---

## (iv-b) Số TỰ TÁI-DỰNG — 17 số / **15 khớp · 2 lệch-có-lý-do**

`68` migration · `62` folder run.md · `4` orphan-candidate · `16/10` corruption · `23`×4 roster (+md5) · `18/15/3` plugin · `19` commands · `586` B · `25440` B · `183` dòng · `30305`/`264`/`30041`/`0 CR`/`2463` B · `6360` B · `0/0` hit S158.
**2 lệch:** `run-chua-gom` 3→**4** (bề-mặt dời, lead tạo folder sau khi H2 đo) · `.md` scanned 668→**676/1019** (scope không khai). **Cả 2 KHÔNG phải H2 sai số** — là **nhãn-mốc/nhãn-scope thiếu**.

---

## TỔNG

**38 claim — ĐẠT 29 · TRƯỢT 3 · KHÔNG-CHẤM 6.**
- **3 TRƯỢT đều là lỗi RÌA (nhãn/neo), 0 lỗi ở số load-bearing:** H1-4 cite `:4`→`:3/:19` (LOW) · H2-21 "KHỚP ĐỘC-LẬP" (LOW-MED) · H2-23 scope 668 không khai (LOW).
- **1 finding MỚI ngoài claim-set (MED):** `contract-workflow/SKILL.md:371` stale ⇒ H1 mặt ① under-count.
- **1 meta-finding:** FLAG-1 = lần **thứ 3** cùng class (ring1 S151 → H1 S158); vá-bằng-thêm-row là vá triệu-chứng.
- **#53 lượt-2 của cả H1 và H2: KHÔNG thấy dấu hiệu cắt/vội.** Cả hai có `END · TOTAL=` đủ, mọi số load-bearing neo được xuống đĩa. Bản thân tao cũng `#53` giữa chừng — **ghi-đĩa-trong-lúc-làm cứu trọn**, 0 mất.

🔴 **no-self-exempt:** tao KHÔNG phải H1/H2. Read-only, propose-only — mọi đề-xuất trên đây là **NÊU**, lead single-writer quyết và ghi.

`END · TOTAL=38 CLAIM`
