# RING1-AUDIT — S192 bookend @open (phiên-LOGIC L16) — 2026-08-13

> **NHÃN NẤC:** `@open — chấm diff-report của H1/H2, KHÔNG phải bản chốt.` (lead giao đích danh; H1/H2 đã có artifact.)
> Vai: KIỂM độc-lập vòng-1 (H1 `tooling-auditor` + H2 `harvest-curator`) · read-only · propose-only · no-self-exempt (tao ≠ H1/H2).
> **Ghi TỪNG verdict NGAY khi phán xong, TRƯỚC khi đo cái tiếp** (chống #53 — phiên này 6/7 vai dính garble).

## §0 — PIN + fail-safe (nghĩa-vụ (i))

| pin | path | byte khai | byte ĐO | mtime | phán |
|---|---|---|---|---|---|
| H1 | `runs/2026-08-13-S192-bookend-open/sub-tooling-auditor-open-S192.md` | 19.848 | **19848** | 2026-08-13 02:50:56 | ✅ TỒN TẠI, byte khớp |
| H2 | `runs/2026-08-13-S192-bookend-open/sub-harvest-curator-open-S192.md` | 20.721 | **20721** | 2026-08-13 02:47:04 | ✅ TỒN TẠI, byte khớp |

- Fail-safe **KHÔNG kích hoạt**: cả 2 con-đo CÓ chạy phiên này (mtime 2026-08-13, cùng ngày, cùng run-folder).
- **Tuần-tự C4b:** artifact tao ghi SAU 02:50:56 ⇒ `mtime(tao) > mtime(H1) > mtime(H2)` — chấm bản đã xong, không chấm bản đang chạy.
- 🔸 Ghi nhận sớm: run-folder có `.claude/` con (mtime 02:46) — soi ở §thách-CLEAN/PLACEMENT.

---

## §1 — VERDICT PER-CLAIM (đang đổ ruột, mỗi dòng ghi ngay khi phán xong)

### TÁI-DỰNG SỐ LOAD-BEARING #1 — roster (nghĩa-vụ (iv))

```
ls -1 .claude/agents/*.md | wc -l                    -> 30   (bẫy glob +README)
ls -1 .claude/agents/*.md | grep -v README | wc -l   -> 29
git ls-files '.claude/agents/*.md' | grep -v README  -> 29   (nguồn KHÁC: index git, không phải FS)
find .claude/agent-memory -mindepth 1 -maxdepth 1 -d -> 29
```
**Roster ĐĨA = 29** — khớp H1. Bẫy `README.md` (S150 của chính tao) đã né.

### A-01 · H1 mặt ② "roster 29, hmw.js khớp set, comm 2 chiều RỖNG" — **ĐẠT**
Parser tự viết, **neo vào `const VALID_ROLES = [`** (KHÔNG neo comment — bài S191 của chính tao: neo `hmw.js:18` ra 23 + rác), strip `//` comment TỪNG DÒNG rồi mới bắt token `'...'`:
```
HMW tokens = 29 · unique = 29 · HMW\DISK = []  · DISK\HMW = []
```
So **TẬP** (không so SỐ) — rỗng 2 chiều thật. `hmw.js:22-60`.

### A-02 · H1 F-E (HIGH) "`README:264` thiếu ĐÚNG 3 vai: `ring5-audit`·`score-counter`·`score-count-auditor`" — **ĐẠT (chính xác từng tên)**
Đo độc lập trên line 264 (2.305 ký-tự — dòng dài, phải parse chứ không đọc mắt):
```
backtick token TỔNG = 43 · token trùng tên vai đĩa = 29 · UNIQUE = 26
DISK \ README264 = ['ring5-audit','score-count-auditor','score-counter']   ← ĐÚNG 3, đúng tên
README264 \ DISK = []                                                       ← 0 tên lạ, khớp H1
trùng lặp: reviewer ×3 · lead-stale-auditor ×2  ⇒ 29−26 = 3 dôi
```
🔸 **Đính chính nhỏ về CHỮ của H1 (không đổi phán):** H1 viết *"29 backtick token, 3 trùng lặp"* — thật ra **43** backtick token trên dòng, trong đó **29** là tên-vai. Số dẫn xuất (26 unique · 3 dôi · 3 thiếu) **đúng tuyệt đối**; chỉ nhãn "backtick token" bị dùng lỏng. Không hạ verdict.
🔴 **Phát hiện riêng của tao (H1 KHÔNG nêu):** cảnh báo chống đúng lớp lỗi này **nằm CÙNG FILE, cách 236 dòng phía trên** — `.claude/agents/README.md:28`: *"Bài S143 — **enumeration TÊN cũng lão-hoá**, và grep-theo-SỐ không bắt được"*. Site `:264` bỏ SỐ (đúng B1) nhưng giữ **enumeration TÊN** + tự dán nhãn **"ĐỦ roster"** ⇒ **B1 làm đúng một nửa: bỏ số nhưng để lại lời-hứa-đủ**. Đây là bài *bài-học-nằm-trong-context KHÔNG tự bật* (S122), đời N.

### A-03 · H1 tự ĐÍNH CHÍNH mặt ② "PASS 6/6 → phủ thật 6/7" — **ĐẠT (và đây là hành-vi ĐÚNG)**
Con-đo tự hạ coverage của chính mình khi tìm ra bề mặt thứ 7 sau lúc chốt §②. Đúng bài *meta-count self-coverage blind-spot* (S119). Nếu H1 im, verdict "PASS 6/6" sẽ đóng vai "đã phủ hết" — tao sẽ chấm TRƯỢT. Nó khai ⇒ ĐẠT.

---

### A-04 · H1 F-D chuỗi-quyền 3 mắt (`rules.md:559` · `STATUS:848` · `CLAUDE.md:128`) — **ĐẠT 3/3, neo ĐÚNG DÒNG**
| mắt | H1 khai | tao đo | phán |
|---|---|---|---|
| `rules.md:559` | luật trỏ STATUS = canonical | `:559` = *"**Cadence:** … (next-date → `docs/STATUS.md` canonical; …)"* | ✅ verbatim |
| `STATUS:848` | ô canonical đang thối `next 2026-08-01` | `:848` = *"… ✅ **2026-07-01 DONE (S96 `881783c`)** … next **2026-08-01**"* | ✅ verbatim |
| `CLAUDE.md:128` | giá-trị ĐÚNG (08-07/S179, next 09-01) nhưng derived | khớp từng chữ | ✅ |

🔴 **Tao TỰ kiểm cái bẫy tao từng bắt LEAD dính @S181 (ảnh-chụp bị sơn):** `STATUS:848` có phải **bản-ghi ĐÔNG-LẠNH** không? Truy heading bao quanh:
```
:834  ## 🎯 Next up
:844  ### 🔧 Maintenance backlog      ← :848 nằm đây
:851  ### 🚫 Phase 9 Ops (blocked)
```
⇒ **section SỐNG thật** (`Next up` = hướng-tới-trước), KHÔNG phải `## ✅ Recently Done (S…)`. **H1 phân loại ĐÚNG** — vá `:848` là hợp lệ, KHÔNG phải sơn ảnh-chụp. *(Đối chứng: 2 ô H1 BÁC — `STATUS:406` trong blurb `Prev S98` và `STATUS:497` trong `## ✅ Recently Done (S180–S181)` — đều đúng lớp đông-lạnh. H1 tách 2 lớp SẠCH.)*

### A-05 · H1 F-D(a) "cite `rules.md:546` = broken pointer" — **ĐẠT**
`:546` = `---` (dấu đóng frontmatter của **khối template skill**: `:544` `- "trigger english"` · `:545` `- "trigger tiếng Việt"` · `:548` `# Skill Name`). Không dính gì audit-cadence. Dòng thật = `:559`. Con trỏ trong `CLAUDE.md:128` **hỏng thật**.

### A-06 · H1 F-D(b) "`CLAUDE.md:128` nói *STATUS KHÔNG có row canonical* là SAI" — **ĐẠT**
`STATUS:848` tồn tại và **đang mang số**. H1 còn tự phân định fair: nó là **bullet** chứ không phải **row bảng** ⇒ giải thích được vì sao lượt trước grep bảng rồi đọc "vắng" thành "không có" (bẫy *phép trích RỖNG đọc thành sạch*). Chấm ĐẠT cả phán lẫn cách khai giới hạn.

### A-07 · H1 "**Kỳ audit tháng 08 ĐÃ CHẠY** 2026-08-07 (S179), verdict `PASS_WITH_FLAGS — 8`" — **ĐẠT (kết-luận ĐÚNG)**
Lead giao đích danh: *verdict đó có THẬT trên đĩa không?* — **CÓ**, và tao truy được ở **3 nguồn H1 KHÔNG hề cite**:
1. **git commit `57e672f7` (2026-08-07)**: `"[CLAUDE] Docs: S179 closeout — va doi STYLE 2 vong … + H24 9 FLAG + drift-audit thán[g]"` — dấu vết **bất-biến, không sửa được bằng cách viết lại doc**.
2. **Session log** `docs/changelog/sessions/2026-08-07-1200-S179-doi-style-va-2-vong.md:16`: *"Drift-audit tháng (quá hạn 6 ngày) | ✅ ĐÓNG — `PASS_WITH_FLAGS — 8`, vá 2, còn 6"* + `:63` *"**V1** tooling+harvest — `tooling-auditor` chạy (`PASS_WITH_FLAGS — 8`)"*.
3. **Nhật ký CHÍNH VAI** `.claude/agent-memory/tooling-auditor/MEMORY.md:7` — entry S179 có verdict + số chi-tiết thời-điểm-đó (roster **26**, plugin 18/15/3).

### 🔴 A-08 · H1 khai bằng-chứng = "**2 nguồn ĐỘC-LẬP** (`CLAUDE.md:128` + `HANDOFF:216/:254`)" — **TRƯỢT (evidence-independence)**
Kết-luận đúng, **nhưng chỗ dựa nó chọn không đứng được**:
- `CLAUDE.md:128` và `HANDOFF:216/:254` **cùng một tác-giả (lead), cùng một lượt closeout S179, cùng lớp doc derived**. Nếu kỳ audit **không** chạy mà lead cứ viết, **cả hai vẫn khai y hệt** ⇒ chúng **không phân biệt được giả-thuyết** = định nghĩa của *không độc-lập*.
- Chính H1 ở cùng finding gọi `CLAUDE.md:128` là **"derived"** — rồi lại dùng nó làm 1 trong "2 nguồn độc-lập". **Tự mâu thuẫn nội-tại.**
- Đây đúng luật tao đã ghi sổ @S180: ***"2 engine khớp nhau là bằng chứng RỖNG khi chúng CHUNG một thước."***
- ⇒ **Kết-luận H1 sống, nhưng sống vì TAO quét lại trên tập rộng hơn** (git + session-log + diary vai), không vì chỗ dựa H1 đưa. Y lớp S173.
🔸 **Phát hiện kèm (in lane, vì nó là lý do chuỗi bằng-chứng mỏng):** **KHÔNG có run-folder `*S179*`** — `ls .claude/workflows/runs/ | grep 179` = **0 hit**, dù cùng ngày 2026-08-07 có `S180-bookend-open`, `S180-adap-upgrade-pack-phased`, `S182-bookend-open`. ⇒ **kỳ audit-THÁNG-của-hồ-sơ không để lại artifact sơ-cấp trong `runs/`**; toàn bộ dấu vết là thứ-cấp. Đề-xuất lead: kỳ 2026-09-01 phải sinh run-folder.

---

### 🔴 A-09 · H1 F-B "cây `permission-matrix` vắng ĐÚNG 2 root (`Hrm`·`Off`)" — **TRƯỢT (thiếu 4, không phải 2) + TRƯỢT cách diễn đạt**

**Tao tái-dựng số 12 từ NGUỒN MÁY, không mượn ai** (lệnh: đếm tuple `parent = null` trong `SeedMenuTreeAsync`):
```
grep -c "^\s*(MenuKeys\.\w*,.*null,\s*[0-9]"  DbInitializer.cs   -> 12
```
12 root THẬT = `Dashboard`(2065) `Master`(2069) `Contracts`(2084) `KeHoachKyKet`(2088) **`HopDongCung`(2089)** `Forms`(2105) `Reports`(2106) `System`(2107) `PurchaseEvaluations`(2114) `Hrm`(2138) `Off`(2156) **`Personal`(2182)**.
⇒ **`:3` khai "12 root" = ĐÚNG SỐ** ✅ (H1 đúng ở vế này — và nay đã có phép đo ĐỘC-LẬP đứng sau, xem A-09b).

🔴 **NHƯNG H1 đếm sai vế thứ hai — LỖI PHẠM-TRÙ (2 nghĩa của chữ "root"):**
```
DbInitializer.cs:2112  (MenuKeys.Workflows,   "Quy trình HĐ",        MenuKeys.System, 95, ...)
DbInitializer.cs:2115  (MenuKeys.PeWorkflows, "Quy trình Duyệt NCC", MenuKeys.System, 95, ...)
```
`Workflows` + `PeWorkflows` **parent = `System`** ⇒ **KHÔNG PHẢI menu-root**. Chúng là **"inheritance root"** (gotcha #35: `Workflows → Wf_*`) — nghĩa **KHÁC**. H1 nhìn thấy chúng "lồng DƯỚI `System`" (đúng), gọi đó là *bẫy thụt-lề*, rồi **vẫn cộng chúng vào mẫu 12** để ra 10/12. Chính cái thụt-lề đó đang BÁO rằng chúng không phải root — H1 đọc ngược tín hiệu.

**Đối chiếu ĐÚNG (12 menu-root ⟂ cây `:44-77`):**
| trạng thái | root | ghi chú |
|---|---|---|
| cây VẼ ở mức top | Dashboard · Master · Contracts · Forms · PurchaseEvaluations · KeHoachKyKet · Reports · System = **8** | — |
| cây KHÔNG vẽ | `Hrm` · `Off` · `HopDongCung` · `Personal` = **4** | — |

- `Hrm` → `grep -c` **0** · `Off` → **1 hit DUY NHẤT nằm trong chữ "Off**ice**"** (`:25`). *(Thước `\bOff\b` của H1 **ĐÚNG** — nó đã né đúng bẫy `Office` từng cắt tao @S186. Ghi nhận.)*
- `Personal` → **0 hit toàn file**. **Vắng câm, không ai từng nêu** — H1 sót, S179 sót, S186 sót, tao @S182 cũng sót.
- `HopDongCung` → **1 hit**, `:80`: *"const CÓ trong `MenuKeys.cs:43` nhưng **NGOÀI `All`** ⇒ 0 policy · 0 menu-row … **ĐỪNG liệt nó vào cây key sống**"* ⇒ **vắng CÓ CHỦ ĐÍCH, có lý do viết ra**. Không tính là drift.
⇒ **Vắng đáng-vá thật = 3** (`Hrm`·`Off`·`Personal`), **vắng-có-lý-do = 1** (`HopDongCung`), **tổng không-vẽ = 4**. **KHÔNG phải 2.**

🔴 **H1 "sửa số bị thổi phồng" — nhưng sửa NHẦM CHIỀU:** H1 tuyên S179 *"thiếu 5 root"* và S186 *"cây 8 root vs `:3` khai 12"* **đều thổi phồng**, số đúng là **2**, kèm dặn *"ghi lại cho khỏi truyền số sai sang phiên sau"*. Đo lại: **S186 ĐÚNG** — cây đúng là vẽ **8** menu-root, và 12−8 = **4** thiếu. H1 **lấy một con số ĐÚNG thay bằng con số SAI, rồi dán nhãn "đính chính"** và ra lệnh cho phiên sau tin số sai. Đây là ca nguy nhất trong cả 2 artifact: **flag-count giảm (5→2) trông y hệt tiến-bộ**, đúng lớp *Goodhart: rời tập-đo*.

### A-09b · H1 biện minh "12 root ĐÚNG SỐ" bằng cách trích **verdict ring1 S182 của CHÍNH TAO** — **KHÔNG-CHẤM-ĐƯỢC (lỗi CẤU-TRÚC lưới kiểm, không phải lỗi H1)**
H1 viết: *"`:3` khai **12 root** — đo lại: ĐÚNG SỐ, giữ nguyên (**ring1 S182 đã chốt**; em xác nhận lần 2)."*
⇒ Nếu tao chấm claim đó bằng trí-nhớ của mình, **tao đang xác nhận chính tao** — vòng trích dẫn khép kín, `ring1` biến từ vai-KIỂM thành **nguồn** mà nó phải kiểm. Không con nào trong vòng phá được vòng này.
**Cách tao thoát:** bỏ hẳn trí-nhớ S182, đo lại từ **máy** (`DbInitializer` tuple parent-null) — số **12** đứng vững, nhưng nó đứng bằng **chân mới**, không bằng chân cũ.
🔴 **Đề-xuất cấu-trúc (lead quyết):** cấm con-đo lấy **verdict của vai-KIỂM vòng mình** làm bằng-chứng; muốn dùng thì phải **re-đo + khai nguồn máy**. Nếu không, lưới 2 tầng (đo → kiểm) tự sập thành 1 tầng mà **không ai thấy**, vì mọi dòng vẫn "có cite".

### 🔴 A-09c · H1 "SKILL **KHÔNG hề nhắc** 2 root group" — **TRƯỢT (cách diễn đạt bị chính file bác)**
`.claude/skills/permission-matrix/SKILL.md:25` (trong khối **"Nhóm menu (hình-dạng, KHÔNG phải con-số)"**):
> `- Office/HRM/… — xem `MenuKeys.cs` (mã là nguồn)`

File **CÓ nhắc** cả hai, **đích danh**, kèm **con-trỏ về mã làm nguồn** — đúng tinh-thần B1 (`:18` còn khắc *"Đếm THẬT = đọc mã, đừng tin doc"*). Cái vắng là **token khoá chính-xác** `Hrm`/`Off` và **nhánh trong cây**, KHÔNG phải "không hề nhắc".
⇒ Thước H1 đo **token khoá**, nhưng câu H1 phát biểu về **sự nhắc tới**. Cùng lớp lỗi với A-08: *đo cái hẹp, phát-biểu cái rộng*.
🔸 Hệ quả cho đề-xuất: H1 đề-nghị "thêm 2 nhánh `Hrm`+`Off` vào cây" — nhưng `:25` cho thấy tác-giả **cố ý** không liệt Office/HRM mà đẩy về mã, và tiêu-đề cây `:42` tự khai là **"seed"** (mẫu), không tự nhận đầy-đủ. Vá hay không = **quyền lead**, nhưng lý-do H1 đưa ("không hề nhắc") **không đứng được**.
🔸 **INFORM (ngoài trục tao, nêu không chấm):** `:80` khai `HopDongCung` **"0 menu-row"**, trong khi `DbInitializer.cs:2089` **CÓ tuple menu-row** `(MenuKeys.HopDongCung, "Hợp đồng cứng", null, 32, ...)`. Có thể vòng seed lọc theo `MenuKeys.All` (nên "0 row" vẫn đúng ở runtime) — tao **chưa đo runtime**, không chấm. Lead giao H1 kỳ sau.

### A-10 · H1 mặt ③ plugin `37 → 18 → 15 → assigned 4`, delta S191 = 0 — **ĐẠT (4/4 nấc khớp máy)**
```
ls ~/.claude/plugins/marketplaces/claude-plugins-official/plugins | wc -l   -> 37
enabledPlugins keys                                                        -> 18
value === true                                                             -> 15
value !== true                                                             -> 3  = pr-review-toolkit · code-modernization · hookify
.claude/settings.json keys                                                 -> ['autoMemoryDirectory','hooks']  (KHÔNG có enabledPlugins)
```
Khớp **từng con** + đúng 3 tên disabled + xác nhận project **không override** ⇒ ô `agents/README.md:229` ("18 registered / 15 enabled / 3 disabled") tươi thật.
🔸 **Tao TÁN THÀNH cách H1 báo nấc:** nó **từ chối khai nấc "used"** (*"KHÔNG ĐO ĐƯỢC ⇒ KHÔNG KHAI"*) thay vì suy từ "enabled" ra "đang dùng". Đúng kỷ-luật *đừng bán cái chưa đo*. Nấc `assigned 4/15` là **đếm ô phân-bổ trong sổ H3**, không phải đếm lần chạy — H1 khai đúng ranh.

---

### A-11 · H2 "coverage 10/12 = 83%, thủng `ring5-audit` 3.708 B + `harness-audit` 8.191 B" — **ĐẠT phần THỦNG (byte-exact) · TRƯỢT phần MẪU-SỐ**

**Tao dựng lại A-census từ đĩa** (`ls -la runs/2026-08-13-S191-bookend-close/`): 13 file = **11 artifact vai** + `bookend-close-synthesis.md` + `run.md` (2 cái sau không phải vai).
**Byte đối chứng 2 lỗ — khớp TUYỆT ĐỐI:** `sub-ring5-audit.md` = **3708** · `harness-audit-return.md` = **8191** · tổng = **11899** = đúng `11.899 B` H2 khai. ✅
**cicd-monitor** (nguồn-2): `runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-va-goc-92.md` = **12147 B**, mtime **2026-08-13 01:29:30** — trước file S191 đầu tiên (01:32) nhưng **trong phiên S191** ⇒ H2 đưa vào cột-A là **ĐÚNG LUẬT S181 F-03** (*cấm lấy run-folder làm cột-A duy nhất*).

🔴 **Nhưng H2 áp luật đó BẤT-ĐỐI-XỨNG** — và đây là chỗ mẫu-số vỡ:
> H2: *"**A = 12 vai** (11 + cicd-monitor). **ctx-verifier đã về sổ nên không tính nó.**"*

`ctx-verifier` **cũng** là vai chạy-ngoài-run-folder y hệt `cicd-monitor`. Loại nó khỏi **A** vì *"đã về sổ"* = **dùng cột B để định nghĩa cột A** — mà A\B chính là thứ đang đo. Áp luật nhất-quán:
| cách đếm | A | A∩B | coverage | số vai THỦNG |
|---|---|---|---|---|
| H2 (bất-đối-xứng) | 12 | 10 | 83% | **2** |
| `harness-eval` (chỉ run-folder — luật S181 F-03 **cấm**) | 11 | 9 | 82% | **2** |
| **nhất-quán theo chính luật H2** (mọi vai CHẠY trong cửa sổ) | **13** | **11** | **84,6%** | **2** |

⇒ **"Ai đúng?" — cả hai mẫu-số đều lệch, nhưng KHÔNG ai sai về việc cần làm.** `11` bỏ sót vai chạy ngoài folder (luật cấm); `12` là `13` bị trừ đi một con vì lý do không hợp-lệ. **Bất-biến qua cả 3 cách đếm: đúng 2 vai thủng — `ring5-audit` + `harness-audit` — và 11.899 B.** Con số hành-động **không đổi**; chỉ **tử-số/mẫu-số dùng để KHOE tỉ-lệ** là đổi.
🔸 Bài rút: **tỉ-lệ % là thứ dễ lệch nhất trong 3 con số** (thủng · byte · %); khi 2 vai-đo cãi nhau, **so tập-thủng trước, đừng so %**.

### A-12 · H2 tự tố thước `grep -rl "S191"` trúng **moved-marker** — **ĐẠT (tố ĐÚNG, và tự khai "đúng vì MAY" là trung thực)**
Tao chạy **CẢ HAI** thước trên toàn `.claude/agent-memory/`:
```
THƯỚC-1 any-hit  grep -rl "S191"                              -> 11 vai
THƯỚC-2 ENTRY    grep -rlE "^(#{1,4} |- \*\*(\[[^]]*\] )?)S191" -> 11 vai
⇒ TẬP TRÙNG KHÍT, không lệch 1 tên
```
Và cái H2 tố có thật, đúng dòng:
```
lead-gap-auditor/MEMORY.md:23   > 🗄️ moved @S191 → `archive/2026-08.md`: ## 🎯 Role baseline   ← con-trỏ
lead-gap-auditor/MEMORY.md:77   ## S191 (2026-08-13) @close L15 — 7 FLAG (3H/4M)                ← ENTRY thật
lead-stale-auditor/MEMORY.md:22 > 🗄️ moved @S191 → …                                            ← con-trỏ
lead-stale-auditor/MEMORY.md:74 ## S191 (2026-08-13) @close L15 — 10 FLAG (5H/1MH/3M/1L)        ← ENTRY thật
```
⇒ H2 nói đúng **cả hai vế**: (a) hit đầu của `-rl` ở 2 vai đó là **moved-marker**, không phải bản-ghi; (b) kết-quả v1 vẫn đúng **vì 2 vai đó TÌNH CỜ có entry thật**. Nếu chúng chỉ có marker, `-rl` đã báo khống 2 vai ⇒ 83% giả trong khi thật 8/12 = 67%.
🔴 **Chấm cao riêng hành-vi này:** H2 tự phá thước của chính mình **sau khi** đã có số đẹp, và **giữ nguyên số** thay vì đổi số cho khớp câu chuyện. Đây là mẫu đối lập trực tiếp với A-09 (H1 đổi số đúng thành số sai rồi gọi là "đính chính").

### A-13 · H2 "`STATUS:517` sai CẢ HAI CHIỀU — khai ~306 KB, thật **113.993 B**" — **ĐẠT (tao tự cộng lại, khớp từng byte)**
`stat` **8 slot**, tao cộng tay:
```
S191: 3708 (ring5) + 8191 (harness-audit)                            = 11.899
S188: 18195 (ring2) + 11282 (ring5) + 10664 (harness-audit) + 2834 (ctx-audit) = 42.975
S168: 29299 (harvest-curator) + 29820 (lead-gap-auditor)             = 59.119
                                                              TỔNG  = 113.993 B  ✅ khớp H2
```
`STATUS:517` nguyên văn: *"🔴 **Nợ harvest ~306 KB chưa gom:** `S168-bookend-close` **162.916 B (9/10 vai)** + `S171` **143.682 B (4 vai)** + `a2bbcb9`/`b5799fc` (mở từ S162)."* — 162.916 + 143.682 = **306.598** ⇒ nhãn "~306 KB" đúng là tổng 2 mục đó.
**DEDUP + ĐỐI CHỨNG NGƯỢC (tao tự chạy, có control):**
```
8 slot nợ      -> ENTRY = 0 / 0 / 0 / 0 / 0 / 0 / 0 / 0      (không slot nào đã về sổ)
S171 4 vai     -> ENTRY = 2 / 2 / 1 / 1                       (control DƯƠNG: thước BẮT được khi CÓ)
```
⇒ (a) **S171 đã đóng trọn thật** — 4/4 có ENTRY ⇒ để nó trong sổ nợ là **thổi phồng 143.682 B**; (b) 8 slot nợ **chưa vai nào về** ⇒ APPEND sẽ không đẻ record trùng. Cả hai vế H2 **đứng**.
🔸 **Khai giới hạn của chính phép cộng này (H2 KHÔNG nêu):** `STATUS:517` còn mục thứ **3** — `a2bbcb9`/`b5799fc` *(mở từ S162)* — **H2 không hề đụng tới**. Nó không có số byte nên không vào được tổng, nhưng "sai hệ-số 2,7×" là so **113.993** với **306.598** = tổng của **2/3 mục**. ⇒ Kết-luận *sai-hai-chiều* vững; **tỉ-số 2,7× thì chưa phủ hết mục thứ 3**. Lead nên bắt H2 định-lượng hoặc khai tử 2 hash đó khi vá `:517`.

### A-14 · H2 F-06 "`run-chua-gom 0` là ĐẠT-ảo do CẤU-TRÚC (probe đo CÓ-FILE, không đo VỀ-SỔ)" — **ĐẠT (đọc thẳng source, xác nhận)**
`scripts/nhip-no-probe.ps1:156-182` — vị-từ nguyên bản:
```powershell
if (-not (Test-Path $runMd)) { continue }        # không run.md -> bỏ qua
foreach ($f in Get-ChildItem ... '*-synthesis.md') { if (Get-ByteLen > 0) { $found = $true } }
... else harvest/*-synthesis.md ...
if (-not $found) { $orphan++ }
```
⇒ Vị-từ **DUY NHẤT** = *"có tồn tại `*-synthesis.md` khác rỗng"*. **KHÔNG có bất kỳ dòng nào chạm `agent-memory/`** ⇒ probe **không thể** biết delta đã về sổ hay chưa. **F-06 đúng nguyên văn: máy không hỏng — máy hỏi sai câu.**

🔸 **Giải thích chênh `0` (lead dán) vs `1` (harness-eval) — tao chạy lại và ra `1`:**
```
powershell scripts/nhip-no-probe.ps1  ->  ... | run-chua-gom 1 | ...
Folder không synthesis: S117-pe-approve-minmax-range · S117-pe-luyke-finalize · 2026-08-13-S192-bookend-open
2 folder S117 KHÔNG có run.md  -> probe `continue` bỏ qua  ⇒ orphan đếm được = 1 = CHÍNH FOLDER S192 ĐANG MỞ
```
⇒ **Cả hai đều đúng tại thời-điểm đo**: lead chạy probe lúc 02:35 **trước khi** `run.md` của S192 kịp tồn tại (máy chạy TRƯỚC vai) ⇒ 0; sau khi scaffold ghi `run.md` thì chính folder đang mở thành "orphan" ⇒ 1. **Không ai sai — chỉ số này phụ-thuộc thời-điểm.**
🔴 **Nhưng nó phơi ra khuyết-tật THỨ HAI của cùng một thước, ngược dấu với F-06:** bookend **đang mở** *không thể* có synthesis (synthesis sinh lúc close) ⇒ probe **luôn** tính run hiện-hành là orphan = **dương-giả có hệ-thống**. Vậy `run-chua-gom` vừa **âm-giả** (8 slot thủng thật mà báo 0 — F-06) vừa **dương-giả** (đếm chính mình). Đề-xuất: loại folder của phiên đang chạy + thêm vị-từ nội-dung `A∖B` như H2 nêu.
🔸 Vì vậy H2 khai *"scan độc lập 96 folder có `run.md` → 0 orphan thật"* — tao đo lại: **96** folder có `run.md` (khớp), orphan theo máy = **1**, và **cái duy nhất đó là folder S192 đang mở**. ⇒ Về **thực-chất** H2 đúng (**0 run bị bỏ rơi**), nhưng con số `0` chỉ đúng nếu **ngầm loại** run hiện-hành — H2 **không khai phép loại đó**. Ghi caveat, không hạ verdict.

### A-15 · H2 Fidelity "STRONG 10/10 truy được về đĩa, **0 bịa**" — **ĐẠT (substance)**
Đối chứng lại 3 ô: `tooling-auditor` sổ `PASS_WITH_FLAGS — 8 (2H/3M/2L/1I)` ⟂ gốc `sub-tooling-auditor.md:1` `TOOLING: PASS_WITH_FLAGS — 8 (2H·3M·2L·1I)` · `ring1-audit` sổ `33 ĐẠT / 2 TRƯỢT / 10 KC` ⟂ gốc `33 ĐẠT / 2 TRƯỢT / 10 KHÔNG-CHẤM-ĐƯỢC` · tràn bộ nhớ `29295 / 29268 / 27154` (kế tiếp `reviewer` **25469 < 25600** ⇒ đúng **3** over-cap). **Mọi con số truy được về gốc, 0 dấu hiệu bịa** ⇒ kết-luận không escalate `reviewer` là đúng.

### A-15b · H2 dán nhãn "**byte-exact**" cho các ô đó — **TRƯỢT (nhãn overclaim ≥2/4 dòng)**
`KC` ⟂ `KHÔNG-CHẤM-ĐƯỢC` là **viết tắt**; `2H/3M/2L/1I` ⟂ `2H·3M·2L·1I` là **đổi dấu phân cách**. Cả hai **KHỚP TỪNG CON SỐ** nhưng **KHÔNG byte-exact**. H2 tự in cả 2 dạng ra cạnh nhau rồi vẫn ghi "✅ byte-exact" ⇒ người đọc thấy được bằng chứng, nhưng **nhãn sai lớp**. Nhãn đúng: *"số khớp từng con, chuỗi không đồng dạng"*. 🔸 Lỗi nhẹ, nhưng **cùng họ với A-08 / A-09c / L-1**: *đo cái hẹp, dán nhãn rộng hơn*.

---

## §2 — THÁCH-CLEAN (bắt buộc — CLEAN là ca nguy nhất)

### C-1 · Mở 1 skill H1 gọi "fresh" — **CLEAN ĐỨNG VỮNG**
Chọn `dependency-audit-erp` (H1 khai *ĐỔI hôm nay, patch ĐÚNG, BÁC*) + mặt ② *frontmatter 29/29 sạch*:
```
stat  .claude/skills/dependency-audit-erp/SKILL.md -> 5598 B · 2026-08-13 01:46  (mtime TƯƠI thật)
:84 = | Node engine | **`>=20`** | CI **KHÔNG** pin (`.nvmrc` không ai đọc — gotcha #92) qua `.nvmrc` … |
frontmatter: model:opus 29/29 · effort:max 29/29 · memory:project 29/29 · vòng lặp per-file -> 0 vai MISS
```
⇒ **fresh THẬT, không phải mtime-tươi-ruột-cũ**: nội dung mang đúng cơ-chế mới (#92 — CI không pin). H1 BÁC hợp lệ.
🔸 **INFORM (tao thấy, H1 không):** câu `:84` còn **sót đuôi cũ** — *"CI KHÔNG pin (…) **qua `.nvmrc`**"*. Đọc chặt thì thành *"không pin **bằng đường .nvmrc**"*, **hẹp hơn** canonical `CLAUDE.md` (*"CI **KHÔNG pin Node**"* — nói chung, runner dùng bản nào có sẵn). Vá động-từ mà **để nguyên giới-từ** ⇒ đúng lớp *vá 1 trong N* mà chính H1 đặt tên ở cuối artifact. Đề-xuất bỏ cụm "qua `.nvmrc`".

### C-2 · Mở 1 vai H2 gọi "harvested" — **CLEAN ĐỨNG VỮNG (APPEND THẬT, không phải đếm tên)**
Chọn `tooling-auditor` (`MEMORY.md:72`, H2 đo block 3.143 B):
- Entry là **8 bullet có ruột**, không phải tiêu-đề rỗng: F-1 (`STATUS:470` mig 72⟂73), 🔑 F-2 (*"tiền-đề của LEAD sai… lead giao `.nvmrc` KHÔNG tồn tại; đo đĩa: **CÓ**"*), F-3 INFORM, 4 item BÁC, mặt ②, new-alloc `webapp-testing`.
- Verdict-header khớp gốc `sub-tooling-auditor.md:1`; **learned/surprise có mặt thật** (F-2 chính là *surprise*).
⇒ **Không phải coverage-đếm-tên.** Delta thật, truy được về artifact nguồn.
🔸 Củng cố F-05 của H2: entry này **thiếu nhãn `[LEAD SEED ON-BEHALF]`** dù `tooling-auditor` không có `Write` ⇒ bắt buộc là lead-seed. Nhãn thiếu = mất đường truy trách-nhiệm. **H2 đúng.**

### 🔴 C-3 · KC — H2 tuyên **ĐÓNG** lớp "stray `.claude` / thư-mục RỖNG git-mù", nhưng lớp đó **ĐÃ TÁI SINH 1 PHÚT SAU KHI H2 ĐO**
H2 (Trục 4 + 5c, đo 02:35–02:45): *"`find . -type d -name .claude` = **1** duy nhất `./.claude`"* · *"`find . -type d -empty` repo-wide = 3, **0 cái nào trong `.claude`**"* · *"✅ **Cờ F-03 @S191 ĐÓNG**"*.
**Tao đo lúc này:**
```
find . -type d -name ".claude"  ->  ./.claude
                                    ./.claude/workflows/runs/2026-08-13-S192-bookend-open/.claude     ← MỚI
find <đó> -type f  ->  (RỖNG)   |  -type d -> agent-memory/{lead-gap-auditor, lead-stale-auditor,
                                              ring1-audit, ring2-audit, tooling-auditor}  = 5 dir RỖNG
git status --porcelain <run-folder>  ->  KHÔNG hề liệt thư-mục này (git mù dir rỗng)
```
⇒ **KHÔNG chấm H2 TRƯỢT** — lúc nó đo (mtime stray = **02:46**, sau H2 02:45) thứ này **chưa tồn tại**. Nhưng **kết-luận "ĐÓNG" đã bị thực-tại bác trong cùng phiên**.
🔴 **Cơ-chế (structural, sẽ lặp mỗi bookend):** mỗi sub-agent spawn với **cwd = run-folder** ⇒ hạ-tầng agent-memory dựng **tương-đối theo cwd** ⇒ đẻ `<run-folder>/.claude/agent-memory/<vai>/`. Đúng lớp **S54 cwd-relative misland**. Vì **dir RỖNG ⇒ git mù** nên **backstop THẬT (lead soát `git status` + commit-gate) KHÔNG thấy** — đây là lỗ trong chính cái lưới mà persona tao khai là chỗ dựa cuối.
🔴 **Ảnh hưởng trực-tiếp tới TAO:** đường memory hệ-thống giao cho tao trỏ vào **chính stray đó**. Tao **CỐ Ý KHÔNG ghi** vào đấy — ghi = tự đẻ đúng vật mình đang tố, và trái contract *propose-only / lead single-writer*. **Lead quyết**: dọn 5 dir rỗng + trỏ memory về `.claude/agent-memory/<vai>/` thật, hoặc hợp-lệ-hoá bằng chữ.

---

## §3 — FALSIFY-LOG (thử PHÁ claim, không chỉ xác nhận)

| # | Phép thử phủ-định | Kết |
|---|---|---|
| P1 | Phá A-02: 3 tên "thiếu" có thể nằm trên `README:264` ở **dạng không-backtick** (parser tao chỉ bắt backtick) ⇒ `grep -o` thẳng chuỗi thô trên dòng 264 | **HELD** — `ring5-audit` 0 · `score-counter` 0 · `score-count-auditor` 0; **control dương** `ring1-audit` = 1 ⇒ thước sống, vắng là vắng thật |
| P2 | Phá A-11/A-13: 2 vai thủng có thể đã về sổ dưới **dạng chữ khác / trong `archive/`** ⇒ `grep -rin "S191"` TRỌN dir 2 vai (case-insensitive, mọi vị trí) | **HELD** — **0 hit** tuyệt đối. Không phải "sai khuôn heading", mà **không có gì cả** |
| P3 | Phá A-09 theo chiều ngược: nếu `Workflows`/`PeWorkflows` **là** root thì H1 đúng ⇒ đọc tuple seeder | **BROKE claim của H1** — `DbInitializer:2112/:2115` parent = `MenuKeys.System` ⇒ **không phải menu-root**; mẫu-số 12 của H1 chứa 2 con không thuộc tập |
| P4 | Phá C-1: "fresh" có thể là **mtime tươi / ruột cũ** ⇒ đọc thẳng `:84` + đối canonical `CLAUDE.md` | **HELD** (ruột mới thật) — kèm 1 vết sót giới-từ (INFORM) |
| P5 | Phá A-15/corruption: `0-byte 0` có thể do quét hụt ⇒ `find .claude/agent-memory -type f -size 0` | **HELD** — 0 file |
| P6 | Phá A-01b: 3 lens `view`/`omission`/`derived-staleness` có thật là phần-tử mảng? ⇒ tách single-quote (mã) ⟂ double-quote (comment) | **BROKE claim của H1** — 3 chữ đó nằm trong **comment, dấu nháy KÉP**; mảng thật **29**, `HMW\DISK` = ∅ |

---

## §4 — CLAIM CỦA LEAD (lead giao tao kiểm luôn)

**Lead tuyên:** *"2 bề mặt roster KHỚP (comm 0 thiếu)"* — rồi H1 tìm ra **bề mặt thứ 7 TRƯỢT**.

**Phán: lead KHÔNG sai phép đo trên 2 bề mặt đó — lead sai PHẠM-VI PHÁT BIỂU.** Ba lớp, tách bạch:
1. **Phép đo lõi: ĐÚNG.** Tao đo lại `disk ↔ hmw.js` bằng set: `HMW\DISK = ∅` **và** `DISK\HMW = ∅`. Hai bề mặt đó **khớp thật**.
2. **Nhưng `comm` MỘT CHIỀU không đủ mạnh cho câu đã nói.** Một chiều chỉ chứng *"không vai đĩa nào vắng trong `hmw.js`"*; nó **không** chứng chiều ngược (tên thừa/tên chết). Câu "KHỚP" hàm ý **song ánh** — cần **2 chiều**. Tao chạy 2 chiều nên câu mới đứng; **lead nói mạnh hơn thứ lead đo**.
3. 🔴 **Sai nặng nhất = phạm vi.** Roster có **≥7 bề mặt**; lead đo **2 bề mặt MÁY** (đĩa + `hmw.js` — 2 thứ hiếm khi lệch vì đổi roster là đụng cả hai) rồi để câu đó gánh nghĩa **"roster nhất-quán"**. Bề mặt **tay-nuôi** (`README:264`) — nơi drift **thực sự** sống — **không nằm trong phép đo**. Chọn đúng 2 mặt **dễ khớp nhất** rồi phát biểu về toàn cục.
   🔸 *H1 tránh được đúng bẫy này và đã ghi ra:* `:30` — *"**KHÔNG khai '6 bề-mặt độc-lập'** — (1)&(3) đồng-biến một phần… Độc-lập thật = đĩa + 4 nguồn tay-nuôi."*

**Kèm — số lead gắn vào phát biểu cũng sai bề mặt:** lead khai `VALID_ROLES` = **43**. Số thật = **29**. Tao đo được **43 = đúng số backtick token trên `README:264`** (xem A-02). ⇒ Nhiều khả năng lead **đếm trên bản MIRROR trong doc** rồi **dán nhãn tên hằng-số của MÁY**. Nếu vậy thì nghịch lý gấp đôi: **con số lead dùng để tuyên "khớp" lại lấy từ đúng bề mặt đang HỎNG.**
*(H1 khai **32** — cũng sai, nhưng khác đường: 29 phần-tử + 3 chữ trong comment, xem A-01b/P6. **Ba bên ba số: 43 · 32 · 29. Chỉ 29 đứng được.**)*

🔴 **Bài chung của vòng này — 1 lỗi lặp ở CẢ BA:** *đo một tập hẹp, phát biểu trên tập rộng* — lead (2 mặt máy → "roster khớp") · H1 (2 doc cùng tác-giả → "2 nguồn độc-lập"; token khoá → "không hề nhắc") · H2 (số khớp → "byte-exact"). **Không con nào bịa số; cả ba đều nới NHÃN rộng hơn PHÉP ĐO.** Đề-xuất 1 luật rẻ: **câu kết phải chứa đúng phạm vi đã đo** ("2/7 bề mặt", "khớp từng con số", "2 doc derived cùng tác-giả").

---

## §VERDICT — `RING1-AUDIT: 15 ĐẠT / 7 TRƯỢT / 3 KHÔNG-CHẤM-ĐƯỢC` (25 claim)

| # | claim | phán |
|---|---|---|
| A-01 | H1 mặt② roster 29 · set `hmw.js`↔đĩa rỗng 2 chiều | **ĐẠT** |
| A-01b | H1 "`VALID_ROLES` **32** phần-tử = 29 vai + 3 lens" | **TRƯỢT** — thật **29**; 3 lens nằm trong **comment nháy-kép** (P6) |
| A-02 | H1 F-E `README:264` thiếu đúng 3 vai, 0 tên lạ | **ĐẠT** — trùng khít từng tên |
| A-03 | H1 tự hạ mặt② "6/6 → 6/7" | **ĐẠT** (hành-vi đúng) |
| A-04 | H1 F-D chuỗi 3 mắt + `STATUS:848` là section SỐNG | **ĐẠT** — heading `Next up`→`Maintenance backlog` |
| A-05 | H1 "cite `rules.md:546` broken" | **ĐẠT** — `:546` = `---` template |
| A-06 | H1 "`CLAUDE.md` nói *STATUS không có row canonical* là sai" | **ĐẠT** |
| A-07 | H1 "kỳ audit tháng 08 ĐÃ CHẠY, `PASS_WITH_FLAGS — 8`" | **ĐẠT** — git `57e672f7` + session-log + diary vai |
| A-08 | H1 "bằng chứng = **2 nguồn ĐỘC-LẬP**" | **TRƯỢT** — 2 doc derived **cùng tác-giả/cùng lượt**; H1 bỏ qua 3 nguồn thật |
| A-09 | H1 F-B "cây vắng đúng **2** root" + "S179/S186 thổi phồng" | **TRƯỢT** — vắng **4**; **S186 vốn ĐÚNG**, H1 thay số đúng bằng số sai |
| A-09b | H1 chống lưng "12 root" bằng **verdict ring1 S182 của chính tao** | **KC** — vòng trích dẫn; tao đo lại từ seeder ⇒ **12 vẫn đứng** |
| A-09c | H1 "SKILL **KHÔNG hề nhắc** `Hrm`/`Off`" | **TRƯỢT** — `:25` *"Office/HRM/… — xem `MenuKeys.cs`"* |
| A-10 | H1 mặt③ 37/18/15/3 + assigned 4 + Δ0 | **ĐẠT** — 4/4 nấc khớp máy |
| A-11 | H2 hố thủng: `ring5-audit` 3708 + `harness-audit` 8191 = **11.899 B** | **ĐẠT** — byte-exact |
| A-11b | H2 mẫu-số "**12**" ⇒ 83% | **TRƯỢT** — loại `ctx-verifier` khỏi A bằng chính cột B; nhất-quán = **11/13** |
| A-12 | H2 tự tố `grep -rl` trúng moved-marker, "đúng vì MAY" | **ĐẠT** — 2 thước cùng ra 11; 4 dòng neo đúng |
| A-13 | H2 `STATUS:517` sai 2 chiều, nợ thật **113.993 B** | **ĐẠT** — tao cộng lại khớp; dedup 8/8 + control dương S171 |
| A-14 | H2 F-06 `run-chua-gom` = ĐẠT-ảo cấu-trúc | **ĐẠT** — source `:156-182` không chạm `agent-memory` |
| A-15 | H2 Fidelity 0 bịa, truy được về đĩa | **ĐẠT** |
| A-15b | H2 nhãn "**byte-exact**" | **TRƯỢT** — `KC`⟂`KHÔNG-CHẤM-ĐƯỢC`, `/`⟂`·` |
| C-1 | thách-CLEAN skill "fresh" | **ĐẠT** — ruột mới thật (+1 INFORM sót giới-từ) |
| C-2 | thách-CLEAN vai "harvested" | **ĐẠT** — APPEND có ruột, không đếm tên |
| C-3 | H2 "ĐÓNG cờ stray/dir-rỗng" | **KC** — đúng lúc đo (02:45), **tái sinh 02:46** trong chính run-folder |
| KC-2 | `SKILL:80` "HopDongCung 0 menu-row" ⟂ seeder có tuple `:2089` | **KC** — chưa đo runtime, ngoài trục |
| L-1 | LEAD "2 bề mặt roster KHỚP" | **TRƯỢT** — sai **phạm vi** (2/7 mặt, chọn 2 mặt máy đồng-biến); số **43** lấy từ bề mặt đang hỏng |

**3 việc gấp nhất cho lead:**
1. 🔴 **Đừng áp F-B của H1 nguyên trạng** — nó sẽ **ghi số SAI vào sổ** (thiếu 2) và **xoá số ĐÚNG của S186** (8 vẽ / 12 root). Số đúng: **12 root · cây vẽ 8 · vắng 4** = `Hrm`·`Off`·`Personal`(chưa ai từng nêu)·`HopDongCung`(vắng có lý do `:80`).
2. 🔴 **Stray `.claude/agent-memory/` trong run-folder S192** (5 dir rỗng, **git mù**) — dọn hoặc hợp-lệ-hoá; nó vô-hiệu-hoá backstop `git status`.
3. **Vá `STATUS:848` + `CLAUDE.md:128` + cite `:546`→`:559` CÙNG LƯỢT** (F-D đúng), và bắt H2 định-lượng nốt mục thứ 3 của `:517` (`a2bbcb9`/`b5799fc`) trước khi viết lại con số nợ.

== HẾT ==


