# sub-ring1-audit — @open S169 (phiên-LOGIC L10 window-1) — 2026-08-01

> Vai: **ring1-audit** — KIỂM ĐỘC-LẬP vòng tooling/harvest. Read-only · propose-only · no-self-exempt (tao ≠ H1, ≠ H2).
> Nhiệm-vụ: verify per-claim output H1 + H2, **KHÔNG re-chạy việc đo**; falsify ≥2; tự tái-dựng ≥1 số CÓ-THỂ-SAI; thách-CLEAN bắt buộc.
> **Ghi từng mục, flush ngay** (4/4 vai wave này dính #53).

---

## §0. PIN + FAIL-SAFE — input TỒN-TẠI, tuần-tự C4b THOẢ

| Kiểm | Đo | Kết |
|---|---|---|
| run-folder | `.claude/workflows/runs/2026-08-01-S169-bookend-open/` | ✅ tồn tại |
| H1 output | `sub-tooling-auditor-open-S169.md` — **23.236 B**, mtime **Aug 1 21:29** | ✅ khớp pin byte-chính-xác |
| H2 output | `sub-harvest-curator-open-S169.md` — **26.137 B**, mtime **Aug 1 21:34** | ✅ tồn tại (pin không khai byte) |
| H1 có `END` | `END tooling-auditor-open-S169 — VERDICT=PASS_WITH_FLAGS — 10 finding` (`:216`) | ✅ |
| H2 có `END` | `END harvest-curator-open-S169 — VERDICT=GATE-FAIL — 8 finding` (`:260`) | ✅ |
| **Tuần-tự C4b** | mtime tao (ghi lúc ~21:4x) **>** mtime H1 (21:29) **và** H2 (21:34) | ✅ chấm bản ĐÃ-XONG, không chấm bản dở |

⇒ **KHÔNG NO-OP.** Có measure thật ⇒ chấm thật.

🔴 **Khai trước (bài E1/S150 + S162 + S168):** vòng-KIỂM chạy SAU vòng-ĐO ⇒ mọi số đếm-đĩa có thể **ĐÃ DỜI**. Gặp vênh tao hỏi *"H1/H2 sai, hay đã-được-xử/đo-tại-pin-khác?"* TRƯỚC khi chấm TRƯỢT.

🔴 **KHÔNG lặp 7 claim lead đã tự verify** (harvest MEMORY 18.781 B · ctx-verifier frontmatter · tiep.md 1 hit · 23/23 dir · auto-memory 59 vs STATUS 31 · investigator-codebase:81 · README:242). Tao soi phần **chưa ai chạm**.

---

## §1. 🔴 THÁCH-CLEAN A — `permission-matrix` H1 gọi "KHÔNG stale" ⇒ **THỦNG** (finding R-1, riêng của tao)

H1 `:104` khai: *"`permission-matrix/SKILL.md` — `:17` + `:94` **cố ý KHÔNG chép số** (B1) … ✅ **KHÔNG stale** (menu 113 / policy 452 không cần neo vì file không neo số)."*
Và `:102` gói cả 2 skill thành: *"**CẢ 2 skill được chỉ đích danh đều KHÔNG stale**"*.

### 1a. Phần H1 nói ĐÚNG — tao xác nhận, và xác nhận MẠNH HƠN H1

Tao KHÔNG đọc 2 dòng H1 trỏ; tao quét **MỌI số ≥2 chữ-số trong toàn file** (`grep -nE "[0-9]{2,}"`, 178 dòng / 9.409 B):

- Neo dòng H1 đưa **CHÍNH XÁC**: `:17` = *"🔴 **Số menu-key · số policy = canonical ở `docs/STATUS.md`** … **KHÔNG chép số vào file này** (B1)"* · `:94` = *"số = `|MenuKeys.All| × |Actions|` DERIVED; canonical → `docs/STATUS.md` row `Policies` — KHÔNG hardcode ở đây"*. (Không tái phát lỗi neo-lệch-số-dòng S153.)
- **Control-âm:** `grep -nE "\b(113|452|54 menu|~240|216|48 policy|~60)\b"` trên skill ⇒ **0 hit**. **Control-dương** (chứng grep CÓ RĂNG, bài S162): cùng pattern trên `docs/STATUS.md` ⇒ **8 hit**. ⇒ số-0 kia là **vắng-mặt THẬT**, không phải thước chết.
- Tiền-án S119 (`54 menu vs "~60"` · `216 policy` vs `:3 "~240"` ⟂ `:81 "48"` · `Bg_*` chết từ S61) ⇒ **đã đóng thật**: `Bg_*` nay là bia-mộ 🧊 có nhãn XOÁ ở `:26` + `:79`.
- Số cứng còn lại tao đối-chứng mã: `:56` "× 7 type = 28 leaf" ✅ (4 action × 7 ContractType) · `:58` "× 2 type = 6 leaf" ✅.

⇒ **Trên trục H1 ĐO (neo số canonical), claim của H1 ĐẠT.**

### 1b. 🔴 Nhưng file STALE trên trục H1 KHÔNG đo — lệch **49 key SỐNG**

`MenuKeys.cs:72-84` (mã hiện tại):
```csharp
public static readonly int[] KhkkGroupNumbers = [2, 3, 4, 5, 6, 7, 8];          // 7 nhóm
public static readonly string[] KhkkLeafActions =
    ["WfView", "List", "Create", "Pending", "Approved", "Deleted"];             // 6 action
// 49 key theo thứ tự: group n → 6 leaf của n → group n+1 → …
public static readonly string[] KhkkGroupMenuKeys = …                            // 7 × 7 = 49
```
và `MenuKeys.cs:244` ⇒ `.. KhkkGroupMenuKeys` **NẰM TRONG `All`** (tức 49 key này **sinh policy thật**). Thêm `:123` — *"🔴 8 key này VÀO `All` ⇒ sinh **32 policy** `AwV2_KhkkN{1..8}.{R,C,U,D}`"*.

Skill mô-tả cây key SỐNG (`:60-61`):
```
KeHoachKyKet (root — const VÀO `All` @S161 W1 ⇒ sinh 4 policy …; Mig 69 KHKK)
  └── Khkk_G1 "Kế hoạch ký kết HĐ (NCC-TP)"   (DbInitializer.cs:1780-1787)
```
⇒ **chỉ NHÓM 1.** Và `:28` khai *"**6 leaf** `Khkk_*` grant TỪNG DÒNG riêng (seeder `DbInitializer.cs:2107` grant root + 6 leaf explicit)"*.

**Đo:** `grep -nE "Khkk_G[2-8]|49 key|nhóm duyệt|AwV2_Khkk"` trên skill ⇒ **0 hit**. **Control-dương:** `grep -c "Khkk_G1"` ⇒ **1 hit** ⇒ grep có răng, 0-hit là vắng-mặt THẬT.

**Lai-lịch (chứng đây KHÔNG phải time-drift của tao):**
| Vật | Thời điểm |
|---|---|
| K4a land 8 nhóm × 6 leaf | `88e7ecf` **2026-08-01 10:10:11** — *"K4a+K4b SP-002 sidebar 8 nhom x 6 leaf … (0-mig)"* |
| skill last-touch | `bd68f71` **2026-07-31 21:47** (mtime đĩa `Jul 31 09:42`) |
| H1 quét | **2026-08-01 21:29** |
⇒ K4a land **TRƯỚC** H1 quét ~11 giờ. Không phải "đã-được-xử sau lượt đo"; là **stale có thật tại thời điểm H1 tuyên sạch**.

### 1c. 2 con-trỏ CHẾT trong chính 2 dòng trên (class `con-trỏ-chết`, tao tự dính @S168)

| Neo trong skill | Trỏ tới hôm nay |
|---|---|
| `DbInitializer.cs:1780-1787` (`:61`, cho `Khkk_G1`) | 🔴 **seed user Solutions** (`tra.bui@solutions.com.vn`, `phuong.nguyen@…`) — 0 liên-quan KHKK |
| `DbInitializer.cs:2107` (`:28`, "grant root + 6 leaf") | 🔴 **leaf PE-workflow** (`peWfOrder`, `PeWorkflowTypeLeaf`) — 0 liên-quan KHKK |

### 1d. Vì sao đây là lỗi ĐÁNG, không phải bới lông

Chính file này tự chẩn bệnh ở `:79`: *"cây trên từng liệt nó như ĐANG SỐNG tới S164 (**cùng bệnh header `:26` đã vá @S122 — vá header quên vá CÂY = dư-lượng bất-đối-xứng**)"*.
⇒ Đây là **tái-phát ĐỜI 2 của đúng lớp file tự khai**: lần này header/B1 sạch (H1 soi đúng chỗ đó), **CÂY lại stale**. Người tra "KHKK nhóm 3 báo access denied" mở đúng skill này, thấy cây chỉ có `Khkk_G1`, sẽ kết luận key không tồn tại — trong khi `Khkk_G3_*` **có trong `All`** và có policy.

### 1e. Phán

| Claim H1 | Verdict |
|---|---|
| A16 · `permission-matrix` `:17`/`:94` không neo số canonical (B1 tôn trọng) | **ĐẠT** (control 2 chiều) |
| A17 · neo dòng `:17` + `:94` chính xác | **ĐẠT** |
| A18 · *"`permission-matrix` **KHÔNG stale**"* (tuyên trần, không giới-hạn trục) | 🔴 **TRƯỢT** — lệch 49 key sống + 2 con-trỏ chết |
| A19 · *"CẢ 2 skill được chỉ đích danh đều KHÔNG stale"* (dẫn xuất) | 🔴 **TRƯỢT** (kéo theo A18) |

🔴 **Class: 1 THƯỚC HẸP → 1 KẾT-LUẬN RỘNG.** H1 đo *"có neo số canonical không?"* rồi tuyên *"không stale"* — 2 vị-từ khác nhau. Đúng lớp **"2 thước 1 báo cáo"** tao bắt @S162 (H1 dùng nợ-tích-luỹ cho `ef-core-migration`, "đợt này" cho `contract-workflow`), nay đổi hình: **1 thước, 2 độ-rộng kết-luận**.

📌 **Nợ S162 của tao đã đóng ở lượt khác:** `contract-workflow` (tao bắt mù-KHKK @S162) — không nằm trong lượt này.

---

## §2. TRỤC-2 — H2 BÁC detector C11 ("14 → thật 9"). **Người ĐÚNG hơn máy ở 4/5 claim, nhưng con số 14 KHÔNG PHẢI của C11**

### 2a. Tái-dựng số "9" — tao đếm lại độc lập ⇒ **KHỚP TUYỆT ĐỐI**

Tao chạy trên **cả 23 vai** (không chỉ 10 vai H2 liệt), thước theo **NỘI-DUNG**:
```bash
for d in .claude/agent-memory/*/; do echo "$(basename $d) $(grep -c 'S168' $d/MEMORY.md)"; done
```
| Vai có ≥1 hit `S168` | hit |
|---|---|
| `reviewer` | 5 |
| `cicd-monitor` | 2 |
| `ctx-curator` · `ctx-verifier` · `ring1-audit` | 1 mỗi vai |

⇒ **5/23 có · 18/23 KHÔNG.** Thu hẹp về đúng 10 vai đẻ artifact ở `runs/2026-08-01-S168-bookend-close/`: `harvest-curator` 0 · `lead-gap-auditor` 0 · `lead-stale-auditor` 0 · `tooling-auditor` 0 · `ring2-audit` 0 · `harness-refine` 0 · `harness-eval` 0 · `harness-audit` 0 · `ctx-audit` 0 · **`ring1-audit` 1** ⇒ **9/10 chưa seed.**
✅ **Số 9 của H2 tái-dựng ĐƯỢC, khớp từng vai.** (Và F-1 coverage 1/10 cũng khớp.)

### 2b. 3 claim cấu-trúc về mã C11 — đọc `scripts/governance-detectors.ps1`, **cả 3 ĐÚNG**

| H2 nói | Mã thật | Phán |
|---|---|---|
| `:1821` `$c11Flags` = **TỔNG (a)+(b)** | `$c11Flags++` ở **`:1788`** (nhánh a FLAG-khuôn) **và** **`:1813`** (nhánh b diary-delta) | ✅ **ĐẠT** |
| `:1794` chỉ khớp `^sub-<role>[-.]` ⇒ sót `*-return.md` | verbatim `'^sub-' + [regex]::Escape($role) + '[-.]'` ⇒ `harness-audit-return.md` **không khớp** | ✅ **ĐẠT** |
| sót `lead-*` (2 vai H24 vô hình ở nhánh b) | dir vai = `lead-gap-auditor`; file = `sub-lead-gap-close-S168.md` ⇒ `^sub-lead-gap-auditor[-.]` **không khớp** | ✅ **ĐẠT** |
| "vá NỬA VỜI: sửa bộ lọc FILE mà quên sửa regex ROLE" | `:1771` filter = `'^(sub-.+|.+-return)\.md$'` (CÓ nạp `-return`), comment `:1768-69` khai rõ ý-định @S159 | ✅ **ĐẠT — và mạnh hơn H2 khai**: chính comment trong mã tự chứng **ý-định ⟂ hiệu-lực** |

*(Bổ sung tao đo, H2 không nêu: nhánh (a) lọc bằng `$roleNameRx = '(?i)(lead-stale|lead-gap|ring2-audit)'` `:1762` ⇒ `lead-gap` **CÓ** bị nhánh (a) soi. Nên câu H2 "2 vai H24 vô hình" chỉ đúng **ở nhánh (b)** — H2 đã viết đúng giới-hạn đó. Không trừ điểm.)*

### 2c. 🔴 NHƯNG: con số **14 KHÔNG PHẢI output của C11** — H2 dừng sớm đúng 1 nấc

H2 trích `:1821` để lập luận. Chính dòng đó bác luôn tiền-đề của H2:
```powershell
Write-Host ("  C11 FLAG-khuon + diary-delta flags = {0} [INFORM-only, LOW, NOT folded into TOTAL baseline]{1}" …)
```
⇒ **Script tự khai ĐỦ CẢ 2 NHÁNH trong nhãn.** Không có chỗ nào script in ra chuỗi "14 flag diary-0-delta".

Vậy 14 ở đâu ra? Tao truy nguồn:
- `run.md:22` của chính run-folder này: `| detectors | **TOTAL 48** + INFORM **14** (S168 là 50+10 ⇒ −2 TOTAL, +4 INFORM) |`
- `Write-InformFlag` (`:74-82`) tăng **MỘT biến toàn cục duy nhất** `$script:InformCount++` (`:81`).
- Call-site `Write-InformFlag` = **18 chỗ**; chỉ **2 chỗ** thuộc C11 (`:1785` nhánh a · `:1810` nhánh b). 16 chỗ còn lại thuộc net khác.
- Dòng tổng-kết `:1961` liệt đích danh:
  > `INFORM-ONLY (new nets C6 cite-2-tier + H24-4 pending-flip + H24-5 counter-ancestor-classify + C9 hmw-width-drift + C11 h24-flag-form + C12 raw-engine-bypass): {0}`

⇒ **"INFORM 14" = tổng gộp của SÁU net** (C6 · H24-4 · H24-5 · C9 · C11 · C12), **không phải C11**, càng không phải nhánh `diary-0-delta`.

**Hệ quả cho lập luận của H2:** F-4 tuyên *"số thật vai chưa seed = **9**, không phải **14**"* ⇒ đặt cạnh nhau **2 đại-lượng khác VŨ-TRỤ, khác ĐƠN-VỊ, khác VỊ-TỪ**:

| | "9" | "14" |
|---|---|---|
| vũ-trụ | 10 vai đẻ artifact ở 1 folder | mọi flag INFORM trên **mọi** run-folder mtime ≥ `2026-07-24` (`:1722`) |
| đơn-vị | **VAI** | **FLAG** |
| vị-từ | `grep -c "S168"` trong diary | 6 net khác nhau, phần lớn 0 liên-quan diary |

🔴 **Và chiều của sai-số còn chưa xác lập:** nếu hỏi đúng câu C11 hỏi (vai chạy mà chưa seed, phủ cả roster) thì số của tao ở §2a là **18/23** — **LỚN hơn 14**. Nên đọc "detector over-count 56%" là **có thể ngược dấu**. Chỉ số 9 mới an-toàn, và chỉ trong phạm-vi 10 vai của folder S168-close.

🔴 **Class: đúng lớp H2 vừa bị bỏng @S168** (`git grep -c` = **DÒNG** 22 vs `-o|wc -l` = **LẦN** 24 ⇒ H2 tự nhận tội oan). S168 bỏng vì **lẫn đơn-vị trong cùng 1 thước**; S169 bỏng vì **lẫn đơn-vị GIỮA 2 thước**. Đời 2, đổi hình. Ghi nhận: C.2b của H2 **có tự dặn** "corruption baseline phải kèm ĐƠN-VỊ" và đã thi hành nghiêm ở C.4 (đếm-FILE ⟂ đếm-LẦN) — nhưng **không mang kỷ-luật đó sang D.2**, nơi nó cần y hệt.

⚖️ **Quy lỗi cho đúng cửa:** nhãn sai *"14 flag diary-0-delta"* **KHÔNG do detector** — script gắn nhãn trung-thực ở cả `:1821` lẫn `:1961`. Nhãn sai sinh ở **lớp BÁO-CÁO**. F-4 của H2 gói cả hai vào một dòng đọc như "máy hỏng" ⇒ đề-xuất vá sẽ nhắm sai chỗ (sửa regex là **đúng** và vẫn nên làm; sửa "over-count" là **không có bệnh đó**).

### 2d. Phán trục-2

| # | Claim H2 | Verdict |
|---|---|---|
| B-1 | `$c11Flags` = tổng (a)+(b) | **ĐẠT** |
| B-2 | regex `^sub-<role>[-.]` sót `*-return.md` | **ĐẠT** |
| B-3 | sót `lead-gap`/`lead-stale` ở nhánh (b) | **ĐẠT** |
| B-4 | "vá nửa vời" (file-filter vá, role-regex quên) | **ĐẠT** |
| B-5 | số thật vai chưa seed (10 vai S168-close) = **9** | **ĐẠT** — tái-dựng khớp từng vai |
| B-6 | `:1808` so mtime ⇒ **âm-tính-giả** do hook `wal-flush` tự-commit | ⚪ **KHÔNG CHẤM** — mã có so mtime (đúng), nhưng cơ-chế gây âm-tính-giả **chỉ nêu, chưa đo** (cần 1 ca `git log` mới hơn artifact mà diary không có delta nội-dung). Claim hợp lý, **chưa có bằng-chứng** |
| B-7 | tiền-đề *"Detector C11 `diary-0-delta` = **14**"* | 🔴 **TRƯỢT** — 14 = tổng INFORM của **6 net** (`:1961`), không phải C11 |
| B-8 | F-4 *"số thật = 9, **không phải 14**"* | 🔴 **TRƯỢT** — so xuyên vũ-trụ/đơn-vị/vị-từ; chiều sai-số chưa xác lập (cùng câu hỏi, phủ roster ⇒ **18**) |

📣 **ĐÍNH-CHÍNH CHO LEAD (lead đã bê con số 14 theo khung H2 lên báo-cáo owner):** câu đúng phải là —
> *"`run.md:22` INFORM **14** = tổng INFORM của **6 net** (C6 · H24-4 · H24-5 · C9 · C11 · C12), **không phải** 14 flag `diary-0-delta`. C11 in số riêng ở dòng `:1821`. Số vai thật-sự chưa seed @S168-close = **9/10** (phủ cả roster = **18/23**). C11 CÓ 2 lỗ regex thật (sót `*-return.md` + `lead-*`), nhưng **KHÔNG** có bệnh 'over-count 56%'."*

---

## §3. TRỤC-3 — 2 claim ĐẢO-DẤU của H2 (lật slot (48) + lật khung carry). **Đủ mạnh để lật, nhưng 1 bằng-chứng HỎNG**

*(Lead đã verify 3 số: 18.781 B · frontmatter `ctx-verifier` · `tiep.md` 1 hit. Tao chấm **SUY LUẬN**, không đo lại.)*

### 3a. Slot (48) "harvest self-compact DUE" — H2 bác 3 tiền-đề

Tao tái-dựng quỹ-đạo byte bằng **engine khác** H2 (`git cat-file -s` trên blob, không `wc -c`):

| commit | ngày | byte |
|---|---|---|
| `1b85713` | 07-25 20:13 | 21.464 |
| `c2d01f0` | 07-26 01:58 | 17.655 |
| `11db5ef` | 07-26 16:10 | **19.456** ← số slot (48) đang dùng |
| `f8cef20` | 07-29 10:31 | 21.277 |
| `e5123ff` | 07-30 15:13 | **23.493** |
| `43ca5c2` | 07-31 09:55 | **18.781** ← HEAD = đĩa |

⇒ **6/6 mốc khớp H2 tới từng byte.** `23.493 − 18.781 = −4.712` ✅ đúng y con số H2 đưa. `19.456` đúng là giá-trị @`11db5ef` (S153) ⇒ slot (48) **stale 6 phiên** ✅. "Chưa trả lần nào" ⇒ **SAI** ✅ (có 1 lần trả −4.712 B).
Trần máy: `memory-budget.json:56-57` `autoinject_cap_bytes: 25600` / `soft_cap_bytes: 30720` ⇒ `18.781/25.600 = 73,4%` ✅ **không DUE theo máy.**

### 3b. 🔴 Nhưng bằng-chứng "17,1 KB không nằm trong budget" là **ÂM-TÍNH-GIẢ do dấu phân-cách**

H2 đo: `grep -rl self_target` ⇒ *"**KHÔNG hit** trong `memory-budget.json`"*. Tao xác nhận `grep -c "self_target"` (gạch-DƯỚI) trên file đó = **0** — đúng như H2 thấy.
Nhưng đổi dấu phân-cách:
```bash
grep -n "self-target\|17\.1K" .claude/agent-memory/memory-budget.json
:191  "_note": "… harvest 18.1KB over self-target 17.1K [self-compact next session] …"
:198  "harvest-curator": { "l1_hot": 18082, …, "rollout": "has-archive (S107: L1 over self-target 17.1K -> self-compact planned next session)" }
```
⇒ **Chuỗi 17,1 K CÓ trong `memory-budget.json`, 2 chỗ** — viết `self-target` (gạch NGANG). H2 grep `self_target` (gạch DƯỚI) ⇒ 0 hit ⇒ kết luận "không có trong budget".

🔴 **Đúng lớp `absence_looks_like_clean` — và là ĐỜI 2 NGAY TRONG CÙNG ARTIFACT.** Ở C.4 H2 bắt được chính mình (`grep -P` chết vì locale ⇒ 4 số 0-GIẢ) và tự dặn phải có control. Ở D.3 H2 **không áp control đó** ⇒ dính em-ruột của cùng cái bẫy (0-hit vì thước lệch, không vì vắng).

**Kết-luận của H2 thì VẪN ĐÚNG:** cả 2 hit đều nằm trong **trường mô-tả** (`_note` + `rollout` string), **không phải khoá enforced**. Khoá máy thật vẫn là `autoinject_cap_bytes`. Nên "17,1 K không phải khoá máy" ✅.

🔴 **Cái H2 mất vì grep hỏng — chính là LỜI GIẢI cho câu 'sao cãi tới lần thứ 3':** con số 17,1 K **sống trong `memory-budget.json`**. Mỗi phiên có ai mở budget ra là gặp lại, nên nó **tái-sinh**. Đề-xuất của H2 ("muốn thành ràng buộc thì ghi thành khoá") **thiếu nửa sau**: phải **gỡ hoặc đóng-dấu 🧊 hai mention `:191`/`:198`**, nếu không lần 4 là **tất yếu** — đúng lớp `dryrun_finds_promised_but_unlanded` mà chính H2 trích ở D.1.

📎 Phụ: slot (48) neo `budget:192`; row harvest-curator thật ở **`:198`** (lệch 6) ⇒ **neo cũng stale**, củng cố thêm cho H2.
📎 Phụ 2: `:198` ghi `l1_hot: 18082` (thật 18.781) — snapshot cũ; chính `_note:191` dặn *"full re-sync bằng script @drift-audit **2026-08-01**"* = **HÔM NAY** ⇒ nối thẳng vào F-1 của H1.

### 3c. Carry `ctx-verifier-no-self-append` — H2 nói "carry hỏi SAI CÂU suốt 4 phiên"

| Mắt-xích lập-luận H2 | Phán |
|---|---|
| frontmatter `ctx-verifier` không có Write/Edit ⇒ vai **bị CẤM ghi theo hợp-đồng** | ⚠️ **ĐẠT-YẾU.** Frontmatter đúng (lead verify). Nhưng "CẤM" là **KHAI-BÁO không có RĂNG** — `[carry:tools-whitelist-no-teeth]` S143: `Bash` còn = kênh-ghi mở. Đúng hơn: vai **được thiết-kế** không tự ghi, không phải **bị chặn** |
| ⇒ "chưa lần nào tự APPEND" = **tuân-thủ**, không phải triệu-chứng | ✅ **ĐẠT** — và H2 đứng đúng chỗ để nói (chính nó cũng propose-only; **tao cũng vậy**) |
| ⇒ carry **không bao giờ đóng được** vì điều-kiện đóng mâu-thuẫn spec vai | ✅ **ĐẠT** — tên carry mã-hoá một điều-kiện đóng bất-khả. Đây là lý-do chính-đáng để **đổi tên**, không phải để xoá |
| vá gốc hứa @S162 (`tiep.md §3-ter`) **CHƯA LAND** | ✅ **ĐẠT — tao mở `tiep.md` kiểm §3-ter có tồn tại không** (nếu không tồn tại thì "0 hit ở §3-ter" là **rỗng-nghĩa**). **§3-ter CÓ THẬT, `tiep.md:183`**, rất dày: spawn `ctx-verifier` → 4-khoản + BẢN NẠP-LẠI ≤15 dòng → *"verdict 1-dòng của vai ghi vào **biên-nhận**"* + lead phải nhắc lại trong báo-cáo. 🔴 **Toàn bộ đường ra là `_tiep-<i>.md` + miệng lead — 0 đường vào `agent-memory/`.** Lời hứa quả thật chưa có đường thi-hành |
| đổi tên → `[carry:tiep-3ter-seed-unwired]`, đóng khi §3-ter có bước lead-APPEND + 1 lượt `/tiep` chứng minh seed cùng phiên | ✅ **ĐẠT** — điều-kiện đóng **soi được**, thay điều-kiện bất-khả. **Đủ mạnh để lật mục đã sống 4 kỳ** |
| `_tiep-4.md` **211 B = "khuôn RỖNG"** ⇒ marker có thể land rỗng | 🔴 **TRƯỢT (nhẹ, sai LÝ-DO không sai kết-luận).** `tiep.md §2.6:170` quy-định biên-nhận **"đúng 5 trường ~200B"** (`ts`·`head-sha`·`window-ordinal`·`jsonl-hint`·`account-label`) — **211 B là KÍCH-THƯỚC THIẾT-KẾ**, và `_pause-*`/`_snapshot-*` bằng 211 B vì **dùng chung khuôn** (§2.6 "y khuôn `_pause-<i>.md`"), không phải vì cùng rỗng. Điều đọc được từ 211 B là: **dòng verdict mà §3-ter bắt buộc KHÔNG được cộng thêm** ⇒ vi-phạm §3-ter. Kết luận "có lỗ" đúng; chứng-lý "khuôn rỗng" sai |

⚖️ **Tổng trục-3:** H2 **đủ sức lật cả 2 mục**. Nhưng cả 2 lần, chỗ yếu đều là **BẰNG-CHỨNG**, không phải kết-luận — 1 grep lệch dấu (3b) + 1 suy-diễn từ kích-thước file (3c). Với claim ĐẢO-DẤU dùng để **hạ một mục đã sống 4 kỳ**, đó là biên an-toàn mỏng hơn mức nên có.

---

## §4. TRỤC-4 — H1: *"0/10 finding do S168 gây ra, cả 10 là stale TÍCH-TỤ"* ⇒ 🔴 **SAI. F-5 sinh ra Ở CHÍNH S168, 52 phút trước lượt đo.**

Claim thuận tai + **miễn tội cho phiên gần nhất** ⇒ tao kiểm bằng `git log`, không bằng đọc.

**Bị-cáo = F-5** (H1 xếp *"TÁI-PHÁT lớp cũ … Index README tụt sau SKILL.md 2 mig + 1 bảng"*):

| Vật | Commit gần nhất chạm | Thời điểm |
|---|---|---|
| `.claude/skills/ef-core-migration/SKILL.md` | **`ff7f655`** — *"S168 closeout … **skill ef-core +row Mig 70/71**"* | **2026-08-01 20:37:47** |
| `.claude/skills/README.md` | `bd68f71` = `wal: pause` (07-31 21:47) · nội-dung thật `e88e75d` **S118, 2026-07-14** | **KHÔNG bị S168 chạm** |

`git show ff7f655 -- .claude/skills/ef-core-migration/SKILL.md` ⇒ **+3 dòng, đúng 2 row**:
```
+| **70** | **`AddContractCatalogEntries`** | … **96→97 bảng** … |
+| **71** | **`AddKhkkApprovalGroupCatalogAndFinalizeRuntime`** | … (97 giữ) … |
```
`.claude/skills/README.md:20` hôm nay (verbatim):
> `✅ Updated S164 (rows Mig 68 … + **Mig 69 `AddContractSigningPlans` 7-bảng KHKK 89→96** added; Total re-ground 96; số → docs/STATUS.md)`

🔴 **Suy ra chặt:** TRƯỚC `ff7f655`, row cuối của SKILL.md **đúng là Mig 69** và tổng **đúng là 96** ⇒ README:20 khi đó **KHỚP**. Chính `ff7f655` đẩy SKILL.md lên Mig 71/97 **mà không đụng index** ⇒ **F-5 KHÔNG phải "stale tích-tụ"; nó ra đời lúc 20:37:47 ngày 2026-08-01, tức 52 phút trước khi H1 quét (21:29).**

**Bị-cáo phụ = F-7** (`STATUS:474` user-memory 31 vs 59): `ff7f655` **thêm** `.claude/auto-memory/feedback_dryrun_finds_promised_but_unlanded.md` (+23) **và** `auto-memory/MEMORY.md` (+1 dòng) ⇒ S168 tự tay đẩy số thật **58 → 59** mà không re-ground row. Phần lớn khoảng lệch 28 đúng là tích-tụ từ S84 (H1 đúng ở phần khối-lượng), nhưng **"0 đóng góp từ S168" vẫn sai** — S168 góp **+1** và đã mở đúng lane đó ra sửa.

### Vì sao chuyện này QUAN-TRỌNG, không phải bắt bẻ chữ

H1 dùng hình-dạng diff để kết: *"Đây chính là chữ-ký của **monthly-audit quá hạn**"* ⇒ định-tuyến toàn bộ 10 finding về **1 phương thuốc: chạy monthly audit**. Nhưng F-5 là chữ-ký của một bệnh KHÁC hẳn: **vá THÂN quên vá INDEX trong cùng một commit**. Monthly-audit không ngừa được nó; thứ ngừa được là *"sửa `SKILL.md` ⇒ grep ngay `skills/README.md`"*.
⇒ Chẩn sai lớp ⇒ **kê sai thuốc**, và lớp này **tái-phát lần ~4** đúng như H1 tự ghi.
🔴 Đồng-lớp với `dryrun_finds_promised_but_unlanded` (S168) và với chính `[carry:...]` §3b: **vá một nửa, nửa kia im lặng.**

📌 Nói công-bằng cho H1: **8/10 finding còn lại đúng là tích-tụ** (`investigator-codebase:81` từ Phase-10-era, `STATUS:474` gốc S84, ledger từ 06-02). Sai nằm ở **lượng-từ tuyệt-đối "0/10"**, không ở toàn bộ bức tranh.

| # | Claim H1 | Verdict |
|---|---|---|
| D-1 | `:178` *"**0/10** finding là do S168 sinh ra"* | 🔴 **TRƯỢT** — F-5 sinh tại `ff7f655`; F-7 bị S168 đẩy +1 |
| D-2 | Nội-dung F-5 (README:20 tụt sau SKILL.md 2 mig + 1 bảng) | ✅ **ĐẠT** — nội-dung chính xác; chỉ **quy-nguyên** sai |
| D-3 | Bảng diff `:174` row ④ *"**0 drift MỚI do S168 gây ra**"* | 🔴 **TRƯỢT** — cùng phản-chứng |

---

## §5. TRỤC-5 — TỰ TÁI-DỰNG SỐ CÓ-THỂ-SAI (nghĩa-vụ (iv))

Đã thoả **3 lần độc-lập**, không lấy lệ — mỗi số đều **CÓ-THỂ-SAI** và đều là số **load-bearing** của H1/H2:

| # | Số tái-dựng | Lệnh của TAO | H1/H2 báo | Kết |
|---|---|---|---|---|
| R-1 | **roster 23** | `ls .claude/agents/*.md \| wc -l` = **24**, trừ `README.md` ⇒ **23** | H1 "23" | ✅ **KHỚP** |
| R-2 | **9/10 vai chưa seed S168** (số load-bearing của toàn bộ F-4) | vòng lặp `grep -c "S168"` trên **cả 23** diary ⇒ 5 vai có / 18 vai không; thu về 10 vai của folder S168-close ⇒ **9 không / 1 có** | H2 "9" | ✅ **KHỚP từng vai** |
| R-3 | **quỹ-đạo byte `harvest-curator/MEMORY.md`** (6 mốc) | `git cat-file -s` trên blob từng commit — **engine khác** H2 | H2 6 mốc | ✅ **KHỚP 6/6 tới byte**; `−4.712` đúng |

⚠️ **Khai giới-hạn (anti-#2):** R-2 dùng thước **nội-dung** `grep -c "S168"`. Thước này **bỏ sót** ca vai có seed S168 nhưng không viết chuỗi "S168" (vd viết "phiên trước"). ⇒ R-2 là **cận-dưới của độ phủ**, tức "9 vai chưa seed" có thể **hơi cao**. Tao vẫn dùng vì H2 dùng đúng thước đó ⇒ so sánh **cùng thước** là hợp lệ.

---

## §6. NGOÀI PIN nhưng phải nêu — H2 **TỰ MÂU-THUẪN** về stray `.claude/`

| Nơi | H2 nói |
|---|---|
| **C.3 (trong bảng 5-trục)** | *"✅ Điểm sáng: **0 stray `.claude/` lạc chỗ** — `git status --porcelain` chỉ có 4 mục … `find . -name ".claude" …` **không cần chạy vì status sạch**. Không tái phát ca S54"* |
| **G (phụ-lục, "không tính finding")** | *"Harness lượt này tạo sẵn thư-mục memory sandbox RỖNG **bên trong run-folder** … 🔴 đúng hình-dạng ca **S54 cwd-relative** … 🧊 **git mù thư-mục rỗng** ⇒ `git status` sẽ **KHÔNG** cho thấy"* |

**Tao đo:** `find` trong run-folder ⇒ `.claude/agent-memory/{harvest-curator, lead-gap-auditor, lead-stale-auditor, tooling-auditor}` = **4 dir, 0 file** ✅ (khớp G).

🔴 **Mâu-thuẫn nội-tại:** C.3 tuyên "0 stray" **bằng chính cái thước mà G chứng-minh là MÙ**, và **từ chối chạy** lệnh `find` duy nhất bắt được nó (*"không cần chạy vì status sạch"*) — rồi G chạy `find` và tìm thấy. Đây đúng chữ **`absence_looks_like_clean`**: thước mù ⇒ đọc thành sạch.
🔴 **Hệ quả xếp-hạng:** vật ĐƯỢC tìm thấy bị đặt ở phụ-lục dán nhãn *"không tính finding"* ⇒ **không vào bảng 8 finding**, trong khi ô ✅ dựa trên thước mù thì **nằm trong bảng 5-trục**. Cùng một sự-thật, hai xếp-hạng ngược nhau.

⚖️ **Công-bằng:** H2 **KHÔNG giấu** — G khai rất rõ, kèm cảnh-báo đúng và bằng-chứng `0 file` (chứng H2 không ghi bậy vào đó). Trục PLACEMENT vốn đã **FAIL** vì lý-do khác nên verdict-trục không đổi. Sai ở **ô ✅ con** + **cách xếp hạng**.

| # | Claim H2 | Verdict |
|---|---|---|
| E-1 | C.3 *"0 stray `.claude/` lạc chỗ"* (+ lý-do "không cần chạy `find`") | 🔴 **TRƯỢT** — stray CÓ THẬT; kết-luận rút từ thước chính H2 khai là mù |
| E-2 | G: 4 dir rỗng / 0 file / `git` mù dir rỗng | ✅ **ĐẠT** — tao `find` xác nhận 4 dir, 0 file |

📌 **Đây là tái-phát lớp tao bắt @S159** (cwd-relative mis-land). Lần này **0 B mất** (dir rỗng) ⇒ RỦI-RO chứ chưa THIỆT-HẠI. Đề-xuất lead: xoá 4 dir rỗng ở closeout + soi bằng `find`, đừng bằng `git status`.

---

## §7. FALSIFY-LOG — 6 phép thử phủ-định (3 HELD / 3 BROKE)

| # | Phép thử PHỦ-ĐỊNH cụ-thể | Kết |
|---|---|---|
| 1 | *Phá H1 "permission-matrix không neo số":* quét **mọi** số ≥2 chữ-số toàn file + control-âm (`113\|452\|54 menu\|~240\|216` ⇒ 0 hit) + **control-dương** cùng pattern trên `STATUS.md` ⇒ 8 hit | **HELD** — không phá được. (Nhưng claim RỘNG "không stale" thì phá được → §1) |
| 2 | *Phá H2 "14 = C11":* truy `Write-InformFlag` → **1 biến toàn cục** `$InformCount`, **18 call-site**, chỉ **2** thuộc C11; dòng `:1961` liệt **6 net** | 🔴 **BROKE** — 14 không phải số của C11 |
| 3 | *Phá H2 "9 vai chưa seed":* đếm lại độc lập trên **cả 23** vai (rộng hơn tập H2 dùng), thước nội-dung | **HELD** — ra đúng 9/10 |
| 4 | *Phá H1 "0/10 do S168":* `git log` + `git show --stat` trên **2 file của F-5** thay vì đọc nội-dung | 🔴 **BROKE** — F-5 sinh tại `ff7f655` (S168), trước lượt đo 52 phút |
| 5 | *Phá H2 "17,1 K không có trong `memory-budget.json`":* **đổi dấu phân-cách** `_` → `-` | 🔴 **BROKE** — 2 hit (`:191`, `:198`). Kết-luận H2 vẫn đúng, **bằng-chứng sai** |
| 6 | *Phá H2 "vá gốc §3-ter chưa land":* mở `tiep.md` xem **§3-ter có tồn tại không** (nếu không ⇒ claim rỗng-nghĩa) | **HELD** — §3-ter có thật (`:183`), dày, nhưng đường ra chỉ tới biên-nhận + miệng lead, **0 đường vào `agent-memory/`** |

---

## §8. TỔNG VERDICT — 27 claim chấm được (18 ĐẠT / 9 TRƯỢT / 1 không-chấm)

| Nhóm | ĐẠT | TRƯỢT | Không chấm |
|---|---|---|---|
| §1 thách-CLEAN `permission-matrix` (H1) | A16 · A17 | **A18 · A19** | — |
| §2 detector C11 (H2) | B-1…B-5 | **B-7 · B-8** | B-6 |
| §3 slot (48) + carry (H2) | C-1·C-2·C-3·C-5·C-6·C-7·C-8·C-9 | **C-4 · C-10** | — |
| §4 quy-nguyên S168 (H1) | D-2 | **D-1 · D-3** | — |
| §5 tái-dựng | R-1·R-2·R-3 *(khớp, không tính vào claim H1/H2)* | — | — |
| §6 stray `.claude/` (H2) | E-2 | **E-1** | — |
| **Cộng** | **18** | **9** | **1** |

### 3 điều nặng nhất (xếp theo hệ-quả, không theo số)

1. 🔴 **§4 — H1 "0/10 do S168" SAI.** F-5 ra đời **trong chính commit closeout S168** (`ff7f655`, 20:37), 52 phút trước lượt đo. Chẩn "monthly-audit quá hạn" ⇒ **kê sai thuốc** cho lớp *"vá THÂN quên vá INDEX"* — lớp này đã tái-phát ~4 lần.
2. 🔴 **§1 — thách-CLEAN THỦNG.** `permission-matrix` H1 tuyên "KHÔNG stale": đúng trên trục *neo-số*, **sai** trên trục *cây key sống* — thiếu **49 key** `Khkk_G2..G8` (đã VÀO `MenuKeys.All`, land `88e7ecf` 10:10 cùng ngày) + **2 con-trỏ `DbInitializer` chết**. File tự khai bệnh này ở `:79` ⇒ **tái-phát đời 2**.
3. 🔴 **§2c — con số "14" không phải của C11.** = tổng INFORM **6 net**. H2 đúng 5/5 claim cấu-trúc và đúng số 9, nhưng dừng sớm 1 nấc ⇒ khung "máy over-count 56%" **không có thật**; **lead đã bê khung này lên báo-cáo owner** ⇒ cần đính-chính (§2c).

### Ghi nhận CÔNG-BẰNG (không kể một chiều)

- **H2 là artifact mạnh hơn** ở lượt này: tự bắt bẫy đo **trong lúc làm** (F-8 `grep -P` locale ⇒ 0-GIẢ), tự nhận tội ở C.2b, đóng khung `use ⟂ mention`, và **chủ động khai tin tốt ngược chiều** (B.4: S168 đóng 2 orphan, ròng −1). Hai vết TRƯỢT của nó đều là **bằng-chứng**, không phải kết-luận.
- **H1** giữ B1 rất kỷ-luật, phân-loại `use ⟂ mention` đúng ở 4 site cố-ý-không-vá (chống Goodhart), và **tự khai phạm-vi tập-đo** — nhờ đúng cái khai đó mà tao khoanh được lỗ §1.
- **Mẫu-hình CHUNG của cả 2 vai wave này:** thân bài cẩn-thận, **câu KẾT rộng hơn thước đã dùng** (H1: "KHÔNG stale" / "0/10"; H2: "0 stray" / "9 không phải 14"). Đề-xuất 1 dòng cho cả 2 persona: **câu kết phải mang theo tên thước** — *"không stale **về neo-số**"*, *"0 stray **theo `git status`**"*.

### Đề-xuất cho lead (propose-only — tao KHÔNG ghi gì ngoài file này)

1. **Đính-chính số 14** trước owner theo đúng chữ ở §2c (lead đã phát-ngôn theo khung H2).
2. **Thêm finding R-1 vào sổ**: `permission-matrix/SKILL.md` cây key thiếu `Khkk_G2..G8` (49 key) + 2 neo `DbInitializer` chết — **MED-HIGH**, vì đây là skill người ta mở khi debug *access denied*.
3. **Sửa quy-nguyên F-5**: ghi rõ "sinh tại `ff7f655` S168", và **grep `skills/README.md` mỗi khi chạm `SKILL.md`** (chặn tái-phát lần 5). Không xếp F-5 vào rổ monthly-audit.
4. **Slot (48)**: đóng là dương-giả **kèm** gỡ/đóng-dấu 🧊 hai mention `self-target 17.1K` ở `memory-budget.json:191`/`:198`, nếu không sẽ cãi lại lần 4.
5. **C11**: vá regex `:1794` (nạp `*-return.md` + map `lead-gap`→`lead-gap-auditor`) — **có bệnh thật**; **đừng** vá "over-count".
6. **Xoá 4 dir rỗng** `runs/2026-08-01-S169-bookend-open/.claude/…` ở closeout; soi bằng `find`, không bằng `git status`.

### 🔒 Khai G-015 + phạm-vi + đứt-mạch

- **Propose-only.** Tao KHÔNG sửa file nào ngoài artifact này. `Bash` vẫn là kênh-ghi mở ⇒ **KHÔNG tuyên "read-only enforced"**; containment thật = lead single-writer + `git diff` commit-gate.
- **Không lấn:** 0 chạm trio-memory (`harness-audit`) · 0 chạm LEAD-surface (H24) · 0 chạm code-diff (`reviewer`) · **0 TỰ harvest** (tao KIỂM H2, không THAY H2).
- **Chưa soi (khai thẳng):** H1 F-1/F-8/F-9/F-10 (docs-layer) và H2 A/B (orphan-scan 80/77/3, thiệt-hại byte) tao **không tái-dựng** — nằm ngoài 5 trục lead giao, không đủ lượt.
- **Đứt-mạch #53:** tao bị cắt 1 lần giữa §2→§3; artifact cứu nguyên từ đĩa (14.162 B tại điểm cắt), **§0-§2 khớp liền mạch với §3-§8**, không có phần nào viết-lại-lệch. **Mất 0 B.** Trong artifact H1/H2 tao **không thấy** dấu đứt-mạch (đánh số mục liên-tục, số liệu trước/sau nhất-quán).

END ring1-audit-open-S169 — VERDICT=18Đ/9T
