RING1: 26Đ/4T/6KC trên 36 claim

# sub-ring1-audit-open-S189 — KIỂM vòng-ĐO tooling/harvest @open (L15)

> Vai: `ring1-audit` (C4 TÁCH · AUTO sau đo). Read-only + propose-only — single-writer = lead (B3 VERIFY→APPEND).
> 🔴 Nhãn nấc: **@open — chấm diff-report của H1/H2, KHÔNG phải bản chốt.**
> no-self-exempt: tao KHÔNG phải H1 (`tooling-auditor`) cũng KHÔNG phải H2 (`harvest-curator`).
> G-015: `Bash` còn = kênh-ghi-mở ⇒ KHÔNG tuyên "read-only enforced". Backstop THẬT = lead soát git + commit-gate.
> Kỷ-luật ghi (ARTIFACT-FIRST, phiên này #53 trúng 4/5 vai đợt đầu): APPEND TỪNG CLAIM ngay khi chốt.

---

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

| Input | Đường dẫn | Byte | mtime | Verdict dòng-1 |
|---|---|---|---|---|
| H1 `tooling-auditor` | `runs/2026-08-10-S189-bookstart-open/sub-tooling-auditor-open-S189.md` | **21.170** | 2026-08-11 **00:02:03** | `TOOLING: PASS_WITH_FLAGS — 7 flag` |
| H2 `harvest-curator` | `runs/2026-08-10-S189-bookstart-open/sub-harvest-curator-open-S189.md` | **21.166** | 2026-08-11 **00:02:49** | `HARVEST: GATE-FAIL-5` |

- ✅ **PIN ĐẠT** — cả 2 tồn tại, byte khớp brief từng con số, mtime = phiên này.
- ✅ **Tuần-tự C4b ĐẠT** — lượt tao bắt đầu 00:05, artifact tao ghi SAU 00:05 ⇒ `mtime(tao) > mtime(H1)=00:02:03` và `> mtime(H2)=00:02:49`. Không chạy song song.
- ⇒ **KHÔNG NO-OP.** Có measure ⇒ có cái để chấm.

---

## 1. VERDICT PER-CLAIM (nghĩa-vụ (ii))

### 1A. H1 `tooling-auditor` — mặt ① skill + số nền

| # | Claim H1 | Tao đo lại (lệnh KHÁC) | Verdict |
|---|---|---|---|
| A-01 | 6 project skill · 23 standalone · **20** command | `ls -1d .claude/skills/*/`=6 · `ls -1d ~/.claude/skills/*/`=23 · `ls -1 .claude/commands/*.md`=20 | ✅ **ĐẠT** |
| A-02 | scripts `.ps1` 36 → **37** | `ls -1 scripts/*.ps1 \| wc -l` = **37** | ✅ **ĐẠT** (số hiện tại; "36" là baseline phiên trước, ngoài tầm đo lại) |
| A-10 | `ef-core SKILL:102` *"last schema-changing **Mig 70**"* CÒN ĐÚNG | `grep -c CreateTable`: Mig **69=7** · **70=1** · **71=0** · **72=0** | ✅ **ĐẠT + control dương** — thước BẮT được `CreateTable` (69/70 ra số dương) ⇒ hai số 0 là **vắng mặt THẬT**. H1 chỉ dẫn S179 cho Mig 71; tao đo lại tận đĩa. |

### 1B. 🔴 Load-bearing #3 — công-thức Migration (H1 F-5): **CÔNG THỨC HỎNG THẬT, H1 KHÔNG dựng rơm**

Chạy **4 engine**, trong đó 2 engine do tao tự dựng (không phải lệnh của H1):

| Engine | Phép | Kết |
|---|---|---|
| **A — LITERAL đúng chữ `STATUS:471`** | `ls *.cs \| grep -v Designer \| grep -v Snapshot \| wc -l` | **71** ❌ |
| **B — số học của H1** | 145 total − 72 `*.Designer.cs` − 1 `ApplicationDbContextModelSnapshot` | **72** ✅ |
| **C — RING1 độc lập: parse TIỀN-TỐ, không lọc theo TÊN** | `grep -E '^[0-9]{14}_'` rồi loại `\.Designer\.cs$` | **72** ✅ |
| **D — RING1 độc lập: BẤT-BIẾN CẶP (mạnh nhất)** | strip `.Designer.cs`/`.cs` → `uniq -c` phân bố | **72 nhóm, MỖI nhóm ĐÚNG 2 file** ✅ |

- **File bị công-thức NUỐT, gọi đích danh:** `20260717032812_AddPeApprovedBudgetSnapshot.cs` — migration THẬT, dính chữ `Snapshot` trong tên của chính nó.
- 🔑 **Engine D là bằng chứng loại khác, không phải phép đếm thứ ba:** phân bố `uniq -c` ra **"72 nhóm × đúng 2"** ⇒ 0 Designer mồ côi, 0 migration thiếu Designer. Con số 72 rơi ra từ một **bất-biến cấu trúc** (3-file rule), không từ một bộ lọc tên nào cả — nên nó **miễn nhiễm** với đúng lớp bẫy đang bàn.
- ⇒ **A-08 (F-5 công thức hỏng) = ✅ ĐẠT.** **A-09 (số 72) = ✅ ĐẠT, đứng trên 3 engine độc lập.**
- 🔸 **Tao có động cơ nghi H1 dựng rơm** — sổ tao ghi chính cái bẫy `Snapshot` này đã cắn **tao** 3 lần (S180 F-A · S182 F-A · S186). Lần này nó **không phải bẫy của thước tao**, mà là **bẫy nằm trong CHỮ của doc**. H1 bắt đúng, và tự-rút trước khi nộp HIGH — **đây là hành vi đáng ghi nhận, không phải rơm**.

### 1C. 🔴 Load-bearing #1 — orphan run-folder (H2 §6): **0/93 XÁC NHẬN**

Tao **không** chạy lại `find -name '*synthesis*'` của H2. Tao dựng engine khác: **shell glob + `-s` test** (tồn tại VÀ khác 0-byte), dual-accept 2 dạng.

| Số | H2 khai | Tao đếm | Verdict |
|---|---|---|---|
| Universe dir | 96 | **96** | ✅ |
| Dir có `run.md` | 93 | **93** | ✅ |
| Dir KHÔNG có `run.md` | 3 (ngoài phạm vi) | **3** — `S117-pe-approve-minmax-range` · `S117-pe-luyke-finalize` · `S144-bootstrap` | ✅ **ĐẠT + liệt được tên** |
| Orphan-candidate | 1 | **1** = `2026-08-10-S189-bookstart-open` | ✅ |
| Orphan THẬT | **0** | **0** | ✅ **ĐẠT** |

- ✅ **Loại folder phiên đang chạy — khai rõ theo brief:** `2026-08-10-S189-bookstart-open` là folder của **chính phiên này**, IN-PROGRESS (lúc tao đo nó đã có 7 file, synthesis chưa sinh vì bookend chưa đóng) ⇒ **KHÔNG tính orphan**. Đây là loại-trừ **có lý do cấu trúc**, không phải miễn-trừ cho tiện.
- 🔑 **CONTROL DƯƠNG cho nhánh dual-accept — tao tự đòi mình, H2 không làm:** một "dual-accept" mà nhánh thứ 2 **không bao giờ khớp** thì là nhánh CHẾT, và lời khai dual-accept thành rỗng. Tao đo riêng nhánh form-2: **đúng 5 folder được nhận CHỈ nhờ nhánh `harvest/`** — `2026-06-18-h10-implement` · `h10-invest` · `h10-review` · `h910-curate` · `h910-finalize`.
- ⇒ **Nếu chỉ dùng glob phẳng form-1, tao đã báo 5 orphan GIẢ.** Nhánh form-2 **SỐNG**, và con số 5 khớp đúng "5 run cũ 2026-06-18" H2 khai. ✅ **ĐẠT**

### 1D. 🔴 Load-bearing #2 — 42.975 B mồ côi (H2 F-01): **ĐẠT TỪNG BYTE**

🔴 *`ring2-audit` nằm trong danh sách này; tao **không phải** nó ⇒ soi được, no-self-exempt sạch.*

| Vai | H2 khai byte | `stat -c %s` | `grep -c S188` | `grep -c S187` | max nhãn | Verdict |
|---|---|---|---|---|---|---|
| `ring2-audit` | 18.195 | **18195** | **0** | **0** | S186 | ✅ |
| `ring5-audit` | 11.282 | **11282** | **0** | **0** | S185 | ✅ |
| `harness-audit` | 10.664 | **10664** | **0** | **0** | S186 | ✅ |
| `ctx-audit` | 2.834 | **2834** | **0** | **0** | S186 | ✅ |
| **TỔNG** | **42.975** | **42975** (`awk` cộng độc lập) | | | | ✅ **ĐẠT** |

- ✅ **B-05 ĐẠT** — 4 byte khớp tuyệt đối, tổng khớp tuyệt đối (tao cộng bằng `awk` trên output `stat`, **không** cộng lại số của H2).
- ✅ **B-06 ĐẠT từng ô** — bằng chứng git của H2 tái lập chính xác: `5a77f4f1` numstat `ring2-audit` **+1/−0** · `harness-audit` **+1/−0** · `ctx-audit` **+18/−44** (nén). Không sai một con số.
- ✅ **B-03 ĐẠT** — `c7b7ca45` seed đúng **12** `MEMORY.md`.

**2 phép PHÁ tao thử vào F-01 (chi tiết ở §2 falsify) — cả 2 KHÔNG phá được:**
1. *"Delta có land dưới nhãn KHÁC không?"* — probe `L14` / `2026-08-10` ra **hit thật** (ring2 1, ctx-audit 3…). Mở ra đọc: **toàn bộ** thuộc entry **S185/S186** — trùng **ngày dương lịch** (nhiều phiên cùng ngày 2026-08-10), không phải nhãn thay thế. **HELD.**
2. *"Delta có land ở file khác ngoài MEMORY.md không?"* — H2 chỉ soi `MEMORY.md`. Tao quét **toàn bộ** file trong 4 thư mục: có 2 archive (`ring2-audit/archive/2026-08.md`, `ctx-audit/archive/2026-07.md`). Kết: `S188` = **0/0**. Hit `S187=1` trong archive ctx-audit là **dấu xuất-xứ nén** (`"Moved from MEMORY.md L1 @S187"`) = **mention**, không phải entry công việc. **HELD.**

- ✅ **Bổ sung cho load-bearing #3 (lead hỏi):** `git log --diff-filter=D` trên thư mục Migrations = **0 commit** ⇒ **0 migration từng bị xoá**, loại sạch giả-thuyết "số 71 đúng vì mất 1 file". 🔑 **Control dương bắt buộc** (0-hit phải kèm chứng thước sống): cùng cờ `--diff-filter=D` chạy repo-wide since 2026-06-01 ra **4 commit** ⇒ **cờ SỐNG**, số 0 kia là vắng-mặt THẬT chứ không phải cờ câm.

### 1E. 🔴 Load-bearing #4 + THÁCH-CLEAN (bắt buộc — CLEAN sai là ca nguy nhất)

#### (a) mặt ② *"29 everywhere, sạch 6/6 bề mặt"* — ✅ **ĐẠT, tao dựng lại 6/6 bằng engine riêng**

| Bề mặt | H1 | Tao đo | Lệnh tao dùng |
|---|---|---|---|
| 1 đĩa | 29 | **29** | `ls .claude/agents/*.md` = 30 → trừ `README.md` |
| 2 `VALID_ROLES` | 29 | **29** | `awk '/const VALID_ROLES = \[/,/^\]/'` → `grep -oE "'[a-z0-9-]+'"` → `sort -u` |
| 3 `agent-memory/*/` | 29 | **29** | `find -mindepth 1 -maxdepth 1 -type d` |
| 4 `STATUS:480` | 29 | **29** | `sed -n '480p'` |
| 5 `README:27` | 29 | **số đã BỎ HẲN** | trỏ `docs/STATUS.md §Sub-agents` |
| 6 skill-matrix `:194-231` | 29 row | **29 row** | `grep -cE '^\|'` |
| frontmatter | 29/29 × 3 | **29 / 29 / 29** | `model: opus` · `effort: max` · `memory: project` |

✅ **A-19 ĐẠT.** ✅ **A-07 ĐẠT** — vá `README:27` là **BỎ SỐ** thật (dòng nay ghi *"số canonical → `docs/STATUS.md` §Sub-agents — đếm phần-tử, KHÔNG chép số vào đây"*), đúng loại vá đóng-lớp chứ không phải đổi-số.

#### (b) 🔴 THÁCH-CLEAN 1 — mở 1 skill H1 để "fresh": **BROKE. H1 sót một skill STALE thật.**

H1 soi mặt ① và chỉ flag **2/6** project skill (`ef-core-migration` F-6 · `permission-matrix` F-7) ⇒ 4 skill còn lại **ngầm định fresh**. Tao mở `contract-workflow` — chọn có lý do: GĐ3 "Duyệt Hợp đồng" vừa land **S187-S188**, nếu có chỗ nào stale thì phải là đây.

| Phép đo | Kết |
|---|---|
| `mtime` `.claude/skills/contract-workflow/SKILL.md` | **2026-07-30** — *trước* khi GĐ3 land |
| `ContractApprovalWorkflowFamily` trong SKILL | **0** — nhưng file **CÓ THẬT**: `src/Backend/SolutionErp.Domain/Contracts/ContractApprovalWorkflowFamily.cs` |
| `ContractWorkflowGuards` trong SKILL | **0** — file **CÓ THẬT**: `src/Backend/SolutionErp.Application/Contracts/ContractWorkflowGuards.cs` |
| `AwV2_Hd` trong SKILL | **0** — key **CÓ THẬT** trong 2 file `.cs` (`ContractApprovalWorkflowFamily.cs`, `MenuKeys.cs`) |
| **CONTROL DƯƠNG** | `ContractType` = **6** · `phase` = **23** ⇒ thước sống, file không rỗng |

🔴 **Và nặng hơn "thiếu mục" — có một câu SAI về trạng-thái SỐNG:**

> `.claude/skills/contract-workflow/SKILL.md:458` — *"**Còn nợ:** cầu KHKK→HĐ (W5) **chưa làm** ⇒ `pe.contractId` là đường duy nhất tới GĐ3"*

Nhưng W5 **ĐÃ LAND**: commit `b275893c` — *"Contract: **W5**+W6FE card **Nguồn-gốc KHKK** + panel duyệt 2-nút mirror `KhkkWorkflowPanel`…"*. Và họ workflow GĐ3 land `af5f5be8` (2026-08-10).

- 🔑 **Vì sao đây KHÔNG được miễn như bảng lịch-sử:** câu này mở bằng **"Còn nợ:"** = **tự nhận trạng-thái HIỆN-TẠI**, không phải bản-ghi quá-khứ. Đúng cái discriminator mà **chính H1** áp cho F-2 (*"dòng mở bằng 'Tổng:' ⇒ tự nhận ảnh hiện-tại ⇒ stale THẬT"*). Áp cùng thước ⇒ `:458` là **stale THẬT**.
- **Tác hại đo được:** `contract-workflow` là skill **BẮT BUỘC dùng khi task khớp** (CLAUDE.md §Skills). Vai nào mở nó ra làm việc GĐ3 sẽ đọc *"cầu KHKK→HĐ chưa làm"* và **đi dựng lại thứ đã có**.
- ⇒ **A-20 TRƯỢT.** Mặt ① của H1 **PASS_WITH_FLAGS(2) là thiếu** — có ít nhất **1 flag thứ 3** chưa bắt, và nó nặng hơn cả F-6/F-7 (cả hai đều là số/cây lệch; cái này là **chỉ-dẫn sai đường**).

#### (c) THÁCH-CLEAN 2 — mở vai H2 gọi "harvested": ✅ **HELD, có delta APPEND THẬT**

Không tin cột coverage; mở ruột 3 vai H2 xếp vào nhóm CÓ landing (tránh `ring1-audit` = chính tao):

| Vai | `grep -c S188` | Ruột thật (không chỉ nhãn) |
|---|---|---|
| `tooling-auditor` | **3** | `:59` `## S188→S189 … [S188 lead-seed; S189 tự ghi, artifact-first]` + `:27` số roster 6/6 |
| `harness-eval` | **2** | `:52` `## S188 … [LEAD SEED ON-BEHALF]` + `:54` trio nấc-1 MIXED 35 trục, headroom 125.828 tok |
| `lead-gap-auditor` | **2** | `:72` `## S188` + `:74` FLAG-1 HIGH `gap-carry-dropped`, control-dương 327 |

⇒ **3/3 có heading phiên + nội-dung 4-field thật** (task · verdict · learned), **không phải coverage-đếm-tên**. ✅ **B-09 ĐẠT.** CLEAN bên H2 **chịu được thách**.

---

## 2. FALSIFY-LOG (nghĩa-vụ (iii)) — 5 phép, 3 HELD · 2 BROKE

| # | Phép PHỦ-ĐỊNH tao thử | Kết |
|---|---|---|
| **P1** | *"H1 dựng rơm: công-thức doc thật ra chạy đúng, H1 bịa ca lỗi để ghi công tự-rút."* | **HELD** — chạy literal ra **71** thật, nạn nhân đích danh `AddPeApprovedBudgetSnapshot.cs`. 3 engine độc lập (B/C/D) đều ra 72. H1 **không** dựng rơm. |
| **P2** | *"F-01 dương-giả: delta CÓ land, chỉ khác nhãn (L14 / ngày) hoặc khác file (archive)."* | **HELD** — probe ra hit thật nhưng mở đọc: toàn bộ thuộc entry **S185/S186** trùng ngày dương-lịch; 2 archive `S188`=0. Không phá được. |
| **P3** | *"Orphan 0/93 là ĐẠT-ảo do thước quá rộng — `-name '*synthesis*'` nuốt mọi thứ."* | **HELD** — tao dựng engine khác (`-s` test), ra **cùng** 0/93; và chứng nhánh form-2 **sống** (5 folder chỉ nhận được nhờ nhánh đó). |
| **P4** | *"F-02: `ef1d4fbb` **seed** diary cho 4 vai khác."* | 🔴 **BROKE** — xem §3. Động từ sai. |
| **P5** | *"Mặt ① sạch ngoài 2 flag."* | 🔴 **BROKE** — `contract-workflow/SKILL.md:458` stale live-claim (§1E-b). |

---

## 3. 🔴 ĐÍNH CHÍNH F-02 — động từ nào quá tay (lead hỏi đích danh)

**H2 viết:** *"Nhưng `ef1d4fbb` **seed diary** cho **4 vai KHÁC**: `harness-refine` · `harvest-curator` · `reviewer` · `ring1-audit`."*

**Vì sao lọt:** H2 chạy `git show --name-only -- '.claude/agent-memory/*/MEMORY.md'` — glob chỉ khớp `MEMORY.md`, ra đúng 4 tên. Nhưng **`--name-only` không phân biệt THÊM với XOÁ**. Bỏ glob ra, commit đó chạm **11 file**:

```
 5   0  harness-refine/MEMORY.md          ← APPEND THẬT (entry "S188 — LUẬT TICK")
 0  28  harvest-curator/MEMORY.md   +32→ harvest-curator/archive/2026-07.md    ← NÉN
 3   3  reviewer/MEMORY.md          +10→ reviewer/archive/2026-08.md           ← NÉN + sửa
 0   7  ring1-audit/MEMORY.md       +12/+6/+6 → ring1-audit/archive/*          ← NÉN
```

| | |
|---|---|
| **Động từ H2 dùng** | *"seed diary cho 4 vai"* |
| **Động từ ĐÚNG** | *"`ef1d4fbb` **APPEND thật cho 1 vai** (`harness-refine`, +5/−0); 3 vai còn lại là **NÉN/ARCHIVE** (`MEMORY.md` **0 dòng thêm**, chữ **chuyển ra** `archive/`)"* |
| **Seed 12 diary thật nằm ở** | commit **`c7b7ca45` @20:44** (12 `MEMORY.md`) — **KHÔNG PHẢI** `ef1d4fbb` @21:30 |

🔴 **Vì sao đính chính này đáng giữ, không phải bắt bẻ chữ:** F-02 dựng tương-phản *"3 vai được kể tên nhận 0 chữ — trong khi commit đó đi seed 4 vai KHÁC"*, đọc ra thành **lead phân bổ công gom NHẦM CHỖ**. Sự thật nhẹ hơn: commit đó **gần như không seed ai** (1/4), phần lớn là **dọn nhà** (nén xuống archive). Tương-phản thật là *"chạy-bù kể tên 3 vai rồi đi NÉN diary, không gom cho họ"* — vẫn đúng bệnh, nhưng **không phải** thiên-vị 4 vai khác.

- ✅ **B-07 (lõi F-02) vẫn ĐẠT:** 3 vai được kể tên (`ring5` · `ring2` · `harness-audit`) đều `grep -c S188` = **0**. Phát biểu cơ-chế **"narrative-capture ≠ memory-landing" ĐỨNG VỮNG**, và đề-xuất chặn của H2 (đối chiếu từng vai `ls runs/<id>/` ∪ WAL với `grep -c '<nhãn>'`) **vẫn là phép chặn đúng lớp**.
- ❌ **B-08 TRƯỢT** — chỉ mệnh-đề phụ, giữ nguyên gate `GATE-FAIL-5`.

---

## 4. 🔴 PHÂN XỬ TRANH CHẤP H1 ⟂ `lead-stale-auditor` — `ef-core-migration/SKILL.md`

Tao mở file, **không** phán theo uy tín vai.

**Chữ trên đĩa, `SKILL.md:21-25`:**
> `:21-23` — *"🔴 **Cả hai con số đều đọc từ NGUỒN SỐNG, CẤM đọc từ bảng dưới:** số hiện tại → `docs/STATUS.md` (canonical) · cái mới nhất → `ls …/Migrations/*.cs` (trừ `Designer`/`ModelSnapshot`), lấy row cuối"*
> `:25` — *"⇒ Bảng dưới **chỉ để tra lịch sử**; nó **sẽ luôn tụt sau** và điều đó **hợp lệ** — cái sai là câu tự nhận nó là mới nhất."*

### Phán: `lead-stale-auditor` ĐÚNG. H1 F-6 = **DƯƠNG-GIẢ**.

Ba lý do, đo được:
1. **File đã B1-hoá TRỌN cả hai con số sống.** `:21-23` **CẤM** đọc số từ bảng, và định tuyến cả *"số hiện tại"* lẫn *"cái mới nhất"* về nguồn sống. Bảng không còn gánh claim sống nào ⇒ thiếu row 72 **không lừa được ai**.
2. **Áp đúng discriminator của CHÍNH H1.** H1 phân loại F-2 bằng câu hỏi *"dòng này khai QUÁ KHỨ hay tự nhận ẢNH HIỆN-TẠI?"*. `:25` **tự khai là sổ lịch-sử + tuyên bố sẽ tụt sau**. Áp cùng thước ⇒ **không phải stale**. H1 dùng thước đúng cho F-2 nhưng **không áp cho F-6**.
3. **Carve-out này là kết-quả của một vá ĐÚNG LOẠI, do chính vai tao đẻ ra.** `:25` ghi *"Bắt @S181 bằng **thách-CLEAN của `ring1-audit`**"* — hồi đó lỗi thật là câu *"mới nhất = row cuối bảng"*, và vá là **XOÁ câu tự-nhận** chứ không phải chạy theo bơm row. Đó **cùng một khuôn** với vá `README:27` mà H1 vừa khen là *"đóng ĐÚNG CÁCH"* (§1 vá #3). **Khen khuôn BỎ-SỐ ở file này rồi đòi ĐỔI-SỐ ở file kia = không nhất quán.**

### Hệ quả cho F-1 — mệnh-đề "vá cả hai chỗ" **sai gộp lớp**

- **A-14 ĐẠT:** `CLAUDE.md:77` = `**69, 71**` thật, thiếu Mig 72 thật. Đây là **defect THẬT** — ô đó là cột "Migration" của bảng Module, **không có** con trỏ B1, **không có** tuyên-bố tụt-sau ⇒ tự nhận ảnh hiện-tại.
- ❌ **A-15 TRƯỢT:** H1 nói *"Mig 72 vắng ở **2 bề mặt derived độc lập**; vá 1 chỗ rồi tuyên đóng lớp thì **sót đúng một nửa**"*. Hai bề mặt **không cùng lớp**: một cái **gánh claim sống không rào**, một cái **đã rào bằng CẤM + tuyên tụt-sau**. ⇒ **Vá `CLAUDE.md:77` MỘT MÌNH là đóng trọn defect thật.**
- 🔸 Thêm row 72 vào `SKILL.md` = **làm giàu vô hại**, nhưng **không phải điều-kiện để đóng lớp**, và **không được** dùng làm cớ giữ F-6 ở sổ flag.

### 🔑 Quà rơi ra từ tranh chấp — củng cố F-5 của H1

`SKILL.md:23` **đã** ghi công-thức ĐÚNG: *"(trừ `Designer`/**`ModelSnapshot`**)"* — trong khi `STATUS:471` ghi bản HỎNG *"trừ Designer+**Snapshot**"*. ⇒ Đề-xuất F-5 của H1 **không phải phát minh mới**, mà là **đồng-bộ `STATUS:471` về đúng câu chữ đã được chứng trong repo**. Chi phí 1 dòng, có tiền-lệ ngay trong kho. **Nâng F-5 lên đáng vá trước.**

---

## 5. TÁI-DỰNG SỐ CÓ-THỂ-SAI (nghĩa-vụ (iv)) — tổng hợp

Số tao **tự dựng lại**, mỗi số bằng engine KHÁC engine vai kia dùng:

| Số | Nguồn | Kết | Khớp? |
|---|---|---|---|
| Migrations | 4 engine (literal / số-học / tiền-tố / **bất-biến cặp**) | **72** (literal ra 71) | ✅ H1 đúng |
| Migration bị xoá | `--diff-filter=D` + control repo-wide=4 | **0** | ✅ |
| Roster | 6 bề mặt + frontmatter ×3 | **29** đều | ✅ H1 đúng |
| Orphan run-folder | shell `-s` dual-accept + control nhánh form-2 | **0 / 93** (universe 96, 3 no-`run.md`) | ✅ H2 đúng |
| Byte mồ côi | `stat` + cộng bằng `awk` | **42.975** | ✅ H2 đúng |
| Plugin | `python json` parse `~/.claude/settings.json` | **18 reg / 15 en / 3 dis** + đúng 3 tên | ✅ H1 đúng |
| Tests (docs) | `STATUS:476` | **680 PASS** = 45 Domain + 635 Infra | ✅ vá THẬT |

**Không chấm được (KC) — khai thẳng, không bịa ĐẠT:**
- **KC-1 — plugin nấc `used`:** H1 tự khai *"KHÔNG đo được từ repo ⇒ KHÔNG KHAI"*. Tao cũng không có nguồn ⇒ **không chấm**. (Việc H1 **từ chối khai** là hành vi ĐÚNG.)
- **KC-2 — read-limit 0/29:** hằng-số thật nằm trong hook **ngoài repo** (0 hit trong `scripts/`+config). H2 đo theo ký-tự, lead đo độc-lập **khớp**. Tao **không có nguồn thứ 3 độc lập** ⇒ **KC**, không gật theo số đông. 🔸 Ghi nhận: kết-luận đứng ở **cả hai** quy-ước ×1000 và ×1024 ⇒ nhập-nhằng đơn-vị **không đổi verdict**, nên KC này **rủi ro thấp**.
- **KC-3 — coverage tổng 14/18:** tao verify được **4 thủng** (byte-exact) + **3 harvested** (mở ruột), nhưng **không tái dựng trọn mẫu-số 18** trong lượt này ⇒ **KC**. Không gật số tổng chỉ vì 7 mẫu con đều đúng.

---

## 6. SỔ DISPOSITION TỪNG DÒNG — tổng **suy ra từ bảng**, không tự khai

🔴 *Bài `meta_count_selfcoverage_blindspot`: vai đo giỏi vẫn **đếm-về-mình** sai, và sai tập trung TRỌN ở **meta-count/coverage**. Nên con số tổng dưới đây **không được viết trước rồi biện minh** — nó **đếm từ bảng này**.*

| ID | Claim | Vai | Verdict |
|---|---|---|---|
| A-01 | 6 project / 23 standalone / 20 command | H1 | ✅ Đ |
| A-02 | scripts `.ps1` = 37 | H1 | ✅ Đ |
| A-03 | `SKILL:102` "last schema-changing Mig 70" còn đúng | H1 | ✅ Đ |
| A-04 | F-5: công-thức `STATUS:471` HỎNG thật (ra 71) | H1 | ✅ Đ |
| A-05 | Migrations = 72 | H1 | ✅ Đ |
| A-06 | 0 migration từng bị xoá | H1 | ✅ Đ |
| A-07 | roster đĩa = 29 | H1 | ✅ Đ |
| A-08 | `VALID_ROLES` = 29 | H1 | ✅ Đ |
| A-09 | `agent-memory/*/` = 29 dir | H1 | ✅ Đ |
| A-10 | `STATUS:480` = 29 | H1 | ✅ Đ |
| A-11 | `README:27` vá bằng **BỎ SỐ** + đếm 29 | H1 | ✅ Đ |
| A-12 | skill-matrix `:194-231` = 29 row | H1 | ✅ Đ |
| A-13 | frontmatter 29/29 × 3 khoá | H1 | ✅ Đ |
| A-14 | mặt ② "sạch 6/6 bề mặt" | H1 | ✅ Đ |
| A-15 | plugin 18 reg / 15 en / 3 dis + đúng 3 tên | H1 | ✅ Đ |
| A-16 | F-4: `STATUS:10` ghi `roster 28` | H1 | ✅ Đ |
| A-17 | F-1: `CLAUDE.md:77` = `69, 71` thiếu Mig 72 | H1 | ✅ Đ |
| A-18 | 4 vá S188 đều THẬT (Tests 680 · bundle · README · Modules) | H1 | ✅ Đ |
| A-19 | **F-6: `SKILL.md:99` là FLAG** | H1 | ❌ **T** — dương-giả (§4) |
| A-20 | **F-1: "2 bề mặt cùng lớp, vá 1 = sót nửa lớp"** | H1 | ❌ **T** — sai gộp lớp (§4) |
| A-21 | **mặt ① sạch ngoài 2 flag** | H1 | ❌ **T** — sót `contract-workflow:458` (§1E-b) |
| B-01 | orphan **0 / 93**, universe 96 dir | H2 | ✅ Đ |
| B-02 | 3 dir không có `run.md` (ngoài phạm vi) | H2 | ✅ Đ |
| B-03 | dual-accept: nhánh form-2 **sống** (5 folder) | H2 | ✅ Đ |
| B-04 | F-01: 4 vai × byte + `S188`=0 ⇒ **42.975 B** | H2 | ✅ Đ |
| B-05 | F-01 git-evidence `5a77f4f1` numstat từng ô | H2 | ✅ Đ |
| B-06 | "seed 12 diary" = `c7b7ca45` | H2 | ✅ Đ |
| B-07 | F-02 **lõi**: 0/3 vai được kể tên nhận chữ | H2 | ✅ Đ |
| B-08 | coverage — phía "harvested" có APPEND THẬT | H2 | ✅ Đ |
| B-09 | **F-02: "`ef1d4fbb` SEED diary cho 4 vai khác"** | H2 | ❌ **T** — động từ sai (§3) |
| KC-1 | plugin nấc `used` | H1 | ⬜ KC — không nguồn (H1 **từ chối khai** = đúng) |
| KC-2 | F-2 `schema-diagram:515` = 91 bảng | H1 | ⬜ KC — ngoài lượt, tao **không** đo |
| KC-3 | F-3 `PROJECT-MAP` 0-hit ×4 | H1 | ⬜ KC — ngoài lượt, tao **không** đo |
| KC-4 | vá #4 neo `CLAUDE.md:74` | H1 | ⬜ KC — ruột ĐÚNG nhưng row thật ở **`:75`** (lệch 1 dòng, khả năng đếm cả dòng `\|---\|`) |
| KC-5 | read-limit 0/29 vượt | H2 | ⬜ KC — hằng-số hook **ngoài repo**, không có nguồn thứ 3 |
| KC-6 | coverage **tổng** 14/18 | H2 | ⬜ KC — verify 4 thủng + 3 harvested, **chưa** dựng trọn mẫu-số 18 |

**Đếm từ bảng:** Đ = **26** (18 H1 + 8 H2) · T = **4** (3 H1 + 1 H2) · KC = **6** (4 H1 + 2 H2) · **N = 36**.

---

## 7. CHỐT

**H1 `tooling-auditor` — 18Đ / 3T / 4KC.** Chất lượng đo **cao**: 4 vá S188 đều THẬT, mặt ② 6/6 dựng lại khớp tuyệt đối, tự-rút HIGH sai trước khi nộp (F-5) là hành vi đáng ghi nhận. Ba chỗ trượt: **F-6 dương-giả** (§4) · **mệnh-đề gộp-lớp của F-1** (§4) · **sót `contract-workflow:458` stale live-claim** (§1E-b, nặng nhất).

**H2 `harvest-curator` — 8Đ / 1T / 2KC.** Số **rất chắc**: 42.975 B đúng từng byte, orphan 0/93 dựng lại bằng engine khác vẫn khớp, git-evidence tái lập không sai một ô, và tự-tố `F-05` chính mình. Một chỗ trượt: **động từ "seed" ở F-02** (§3) — lõi finding vẫn đứng, **gate `GATE-FAIL-5` GIỮ NGUYÊN**.

🔴 **KHÔNG có verdict-tổng gộp:** 4 claim TRƯỢT ở trên **không** bị nuốt vào chữ "PASS" của vai nào; mỗi cái đứng riêng dòng, có neo `file:line`.

**Đề xuất cho lead (propose-only — tao KHÔNG ghi, lead VERIFY→APPEND B3):**
1. 🔴 **MỚI, chưa ai bắt** — `contract-workflow/SKILL.md:458` bỏ/sửa câu *"Còn nợ: cầu KHKK→HĐ (W5) chưa làm"* (W5 land `b275893c`). Skill BẮT-BUỘC-DÙNG mà chỉ sai đường thì đắt hơn số lệch.
2. **F-1 vá `CLAUDE.md:77` → `69, 71, 72`** — **một mình là đủ**, đừng buộc kèm `SKILL.md` rồi tưởng phải vá cả cụm.
3. **F-5 nâng ưu tiên** — `STATUS:471` sửa *"trừ Designer+Snapshot"* → *"trừ `*.Designer.cs` + `ApplicationDbContextModelSnapshot`"*, **chép đúng câu đã có ở `SKILL.md:23`**.
4. **F-6 ĐỀ NGHỊ HẠ khỏi sổ flag** (giữ làm ghi-chú làm-giàu) — theo §4.
5. **F-01 của H2 giữ nguyên ưu tiên 1** — 42.975 B mồ côi là số THẬT; `ring5-audit` (L1 mới 2.474 B) nặng nhất.
6. Khi vá xong lớp "Mig 72" ⇒ **grep lại bằng LỆNH KHÁC** (bài `absence_looks_like_clean`).

🔸 **Caveat containment (G-015):** tao chỉ ghi **đúng 1 file** — artifact này. `Bash` vẫn là kênh-ghi-mở ⇒ **KHÔNG** tuyên "read-only enforced"; backstop THẬT = lead soát `git status` + commit-gate.
🔸 **Nhãn nấc, không bán quá:** đây là chấm **diff-report @open**, **KHÔNG** phải bản chốt @close.

---

## 8. 🔸 INFORM — bẫy tao SUÝT tự tạo, và nó nằm đúng trục H2 vừa chứng sạch

**KHÔNG phải finding chống H2 — H2 đo ĐÚNG tại thời điểm đo.** Ghi vì nó **vô hình với `git status`**.

- H2 §4 Placement tuyên **0** stray `<runfolder>/.claude/...`. Tao đo lại lúc 00:19: **CÓ 1**.
  `.claude/workflows/runs/2026-08-10-S189-bookstart-open/.claude/agent-memory/ring1-audit/`
- **Nhưng mtime = `00:12:17`**, còn H2 chốt lúc **`00:02:49`** ⇒ stray **sinh SAU** phép đo **~9 phút**. ⇒ **Placement của H2 GIỮ NGUYÊN ĐẠT**, không lật.
- **Nguồn:** scaffold cấp cho `ring1-audit` một đường memory **cwd-relative** nằm dưới run-folder. Đây đúng lớp `agent_cwd_relative_memory_misland` (S54).
- ✅ **Tao KHÔNG ghi vào đó — `find -type f` = 0 file.** Nếu tao ghi nhật-ký vai vào đấy, tao đã **tự chế tạo** đúng cái defect mà trục Placement vừa chứng sạch, ngay trong lượt đi kiểm nó. Tao ghi **1 file duy nhất** = artifact này (persona: vai KHÔNG APPEND `agent-memory/*`; single-writer = lead, B3).
- 🔴 **Vì sao phải báo bằng chữ:** thư-mục **RỖNG** ⇒ **git MÙ** (chính m#13 của H2). Nó sẽ **không** hiện trong `git status` ở commit-gate. Muốn dọn phải dùng `find -type d -empty`, không dùng git.
- **Đề xuất:** lead dọn bằng `find .claude/workflows/runs -type d -name '.claude'` sau lượt; và nếu scaffold còn cấp đường này cho vai sau, vai sau **rất dễ** ghi thật vào đó.

== HẾT ==

