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

> Ghi-đĩa-TRONG-lúc-làm (anti-#53). Mỗi claim append NGAY khi chấm xong. Read-only, propose-only.
> PIN: `sub-tooling-auditor-close-S162.md` (15.517 B, PASS_WITH_FLAGS, 10 finding) + `sub-harvest-curator-close-S162.md` (GATE-FAIL 4 finding).
> no-self-exempt: tao KHÔNG phải H1/H2.

## (i) PIN + fail-safe — CÓ MEASURE

- H1 output tồn tại, byte>0, END TOTAL=10 finding có mặt (`:134`). ✅
- H2 output tồn tại, byte>0, END-line có mặt (`:123`). ✅
- ⇒ KHÔNG NO-OP. Chấm thật.

---

## (iii)+(iv) SỐ TỰ TÁI-DỰNG (đo bằng nguồn/engine KHÁC con-đo)

### TD-1 — roster 23 (đối chứng H1 ②) — **KHỚP 4 nguồn**
| nguồn | lệnh | ra |
|---|---|---|
| đĩa `ls` | `ls -1 .claude/agents/*.md \| wc -l` | **24** (gồm README — bẫy S150 của chính tao) |
| đĩa trừ README | `\| grep -v README.md \| wc -l` | **23** ✅ |
| git (nguồn KHÁC ls) | `git ls-files '.claude/agents/*.md' \| grep -v README \| wc -l` | **23** ✅ |
| agent-memory dir | `find .claude/agent-memory -mindepth 1 -maxdepth 1 -type d \| wc -l` | **23** ✅ |
| `docs/STATUS.md:6` | `sed -n 6p \| grep -o 'roster [0-9]*'` | `roster 23` ✅ |

### TD-2 — universe run-folder (đối chứng H2 §6) — **KHỚP 3/3**
`ls -1d .claude/workflows/runs/*/ | wc -l` = **75** ✅ · có `run.md` = **72** ✅ · không có = **3** ✅ và ĐÚNG 3 tên H2 khai (`S117-pe-approve-minmax-range` · `S117-pe-luyke-finalize` · `S144-bootstrap`).

### TD-3 — F-02 `git log -S` (claim NẶNG nhất H2, dựa TRỌN vào 1 lệnh) — **KHỚP + có CONTROL-DƯƠNG**
- `git log -S"b5799fc" -- .claude/agent-memory/cicd-monitor/archive/` → **0 commit** ✅ (khớp H2)
- `git log -S"a2bbcb9" -- …/archive/` → **0 commit** ✅
- 🔴 **control-dương tao TỰ thêm (H2 KHÔNG chạy):** `git log -S"1a47a61" -- …/archive/` → **1 commit**.
  ⇒ chứng lệnh `-S` trên đúng đường dẫn đó **CÓ RĂNG** — 0-hit của b5799fc/a2bbcb9 là **vắng-mặt THẬT**, không phải lệnh chết/path sai. Đây là mảnh H2 thiếu: claim "RỖNG toàn lịch sử" không kèm control-dương thì không phân biệt được "không có" với "lệnh không bao giờ trả gì".

### TD-4 — bề-mặt 4 `hmw.js VALID_ROLES` (H1 nói "23 tên, tập-TÊN IDENTICAL") — **KHỚP, đo bằng ENGINE KHÁC**
H1 dùng anchor `^\]`. Tao dùng **python regex** trên khối `const VALID_ROLES = [` … `\n]` (`.claude/workflows/hmw.js:22`) ⇒ **23 phần-tử**, tập-tên **IDENTICAL** với 23 tên H1 liệt (`:61`) và với đĩa. Bề-mặt này H1 **THẬT SỰ mở** — không phải khai suông.
⇒ 5/5 bề-mặt roster của H1 tao mở lại được **độc-lập** (đĩa-ls · git-ls-files · STATUS:6 · STATUS:469 · hmw.js · agent-memory-dir = thực ra **6** lượt đo). **0 bề mặt khai-mà-không-mở.**

### TD-5 — Mig 69 (H1 ④a) — **KHỚP, sau khi tao TỰ PHÁ ĐƯỢC CHÍNH TAO**
- Lượt-1 tao đếm ra **68** ⇒ suýt nộp TRƯỢT cho H1.
- 🔴 **Lỗi là của TAO:** filter `grep -v Snapshot` (định bỏ `ApplicationDbContextModelSnapshot.cs`) **ăn luôn** migration `20260717032812_AddPeApprovedBudget**Snapshot**.cs` — tên nó chứa chữ "Snapshot".
- Filter đúng (`grep -v '\.Designer\.cs$' | grep -v 'ApplicationDbContextModelSnapshot\.cs$'`) = **69**; python `os.listdir` (engine khác) = **69**.
- Ordinal khớp tuyệt đối: 66=`AddPeApprovedPriceRange` · **67**=`AddPeApprovedBudgetSnapshot` · **68**=`AddPeAllowApproverDelete` · **69**=`AddContractSigningPlans`. ⇒ H1 ĐÚNG cả số lẫn tên file mới nhất.
- 🔴 Cũng chứng thêm 1 thứ H1 **không nói mà đúng**: `SKILL.md:3` (bản vá S158) trỏ `ls src/Backend/SolutionErp.Infrastructure/**Persistence**/Migrations/*.cs` — tao kiểm path: `Persistence/Migrations` **TỒN TẠI**, `Infrastructure/Migrations` (flat) **KHÔNG** ⇒ con-trỏ "nguồn sống" của bản vá là con-trỏ **THẬT**, không phải path ma.

---

## 🔴 THÁCH-CLEAN (bắt buộc) — 2 mặt: **1 THỦNG / 1 CHỊU**

### CLEAN-A — skill H1 gọi "PASS": `contract-workflow` ⇒ 🔴 **THỦNG (stale THẬT, H1 bỏ lọt)**

H1 `:44-45` xếp `contract-workflow` vào *"4 skill còn lại — PASS (không stale vì đợt này)"*, lý do: *"đợt S162 = FE-only, 0 chạm state-machine"*.

**Đo đĩa (`.claude/skills/contract-workflow/SKILL.md`, 24.949 B):**
| token | hit trong SKILL.md |
|---|---|
| `SigningPlan` | **0** |
| `Kế hoạch ký kết` | **0** |
| `Khkk` / `KHKK` | **0** |
| `PipelineStage` | **0** |

**Nhưng S161 (Mig 69, 07-29) đã đẻ NGUYÊN một state-machine mới NẰM TRONG lãnh-địa khai của chính skill này:**
- `src/Backend/SolutionErp.Domain/ContractSigningPlans/ContractSigningPlanPhase.cs` — **enum phase 5 trạng thái** (`DangSoanThao=1 · ChoDuyet=2 · DaDuyet=3 · TraLai=98 · TuChoi=99`), comment tự khai *"chạy workflow V2 (**ApplicableType=10**)"*.
- `…/Application/ContractSigningPlans/Services/IContractSigningPlanWorkflowService.cs` — **workflow service riêng**.
- `…/IContractSigningPlanCodeGenerator.cs` — **codegen `KHKK/{YYYY}/{Seq:D3}`**, transaction SERIALIZABLE, dùng chung bảng `WorkflowAppCodeSequences`.
- 12 file Domain/App/Api + Configurations mang tiền tố `ContractSigningPlan*`.

**Đối chiếu frontmatter skill (`SKILL.md:3-4`, verbatim):** *"State machine 9 phase cho hợp đồng … **auto-gen mã HĐ RG-001**, **versioned workflow admin-configurable per ContractType**"* + `when-to-use`: *"chuyển phase hợp đồng" · "**mã HĐ sai format**" · "**versioned workflow**"*.
⇒ Ai gặp *"mã KHKK sai format"* / *"KHKK không chuyển phase"* sẽ **bị routing đúng vào skill này** rồi tìm thấy **0 chữ** — tệ hơn: sẽ đọc nhầm luật RG-001 + 9-phase áp cho một máy 5-phase khác hẳn.

🔴 **Đây KHÔNG phải tao nới chuẩn — đây là chuẩn của CHÍNH H1, áp không đều:**
- H1 `:45` tự viết cho `ef-core-migration`: *"stale của nó là **nợ S155+S161**, không phải nợ S162"* ⇒ H1 **công nhận** thước đo = **nợ tích luỹ**, không phải diff-phiên-này.
- H1 `:106` (④h) tự viết: *"Mig 69 `ContractSigningPlans` = **nhánh Contract/KHKK**, hiện **không có module-row nào nhận**"* ⇒ H1 **BIẾT** Mig 69 thuộc nhánh Contract.
- Nhưng tới `:45` thì `contract-workflow` lại được chấm bằng thước **"đợt này"** (yếu hơn) ⇒ **2 thước cho 2 skill trong CÙNG 1 báo-cáo**. Đổi sang thước mạnh của chính H1 ⇒ `contract-workflow` **stale (nợ S161)**.
- Hệ quả về con số: mặt ① lẽ ra **3 flag**, không phải 2. Xếp hạng đề: **MED** (ngang F-1/F-2) — không HIGH vì code có comment tự-dẫn đường, nhưng cao hơn mỹ-phẩm vì skill = cửa tra đầu tiên.

### CLEAN-B — vai H2 gọi "harvested": `reviewer` (4 hit S162) ⇒ ✅ **CHỊU (APPEND THẬT, không phải đếm-tên)**
`git diff --numstat 2554845..HEAD -- .claude/agent-memory/reviewer/` = `16 18 MEMORY.md` + `7 0 archive/2026-07.md`. Mở RUỘT dòng `+`: entry S162 là **entry nội-dung thật** (class `im-lặng-về-độ-chính-xác-của-con-số`, 3 ca cùng lớp, `MenuPermissionHandler.cs:40`, tag `[s162, …]`) — **không phải dòng đếm-tên**. ⇒ coverage của H2 cho `reviewer` có ruột.
- Đối chứng 3 vai còn lại (tự đếm lại, khớp H2 4/4): `frontend-designer` **1** · `reviewer` **4** · `cicd-monitor` **3** · `ctx-verifier` **0** ⇒ **F-01 của H2 ĐÚNG**; numstat `ctx-verifier` = **rỗng hoàn toàn** (0 file đổi) ⇒ không chỉ 0-hit mà **0 ghi**.
- Đồng thời xác nhận **F-04 của H2**: entry `reviewer` dày như vậy mà **0 chuỗi `runs/2026-07-30-S162`** ⇒ đúng là thiếu evidence-pointer.

---

## ⏱ TIME-DRIFT — mốc đo của tao vs lead vá (bài E1-1 S150: vòng-KIỂM chạy SAU vòng-ĐO)

🔴 **Mọi số CLEAN-B + F-01/F-04 ở trên đo TRƯỚC khi lead áp propose-delta của H2.** Lead đã (sau khi tao bắt đầu): seed diary `ctx-verifier` (F-01) · đính chính overclaim `cicd-monitor/MEMORY.md` (F-02) · thêm `Evidence:` cho `frontend-designer` + `reviewer` (F-04).
⇒ Ai đo LẠI bây giờ sẽ thấy 3 file đã sửa. **Đó KHÔNG phải H2 báo sai** — H2 đúng tại thời-điểm nó đo, và tao xác nhận đúng tại thời-điểm TAO đo (trước vá). **CẤM đọc chênh-lệch này thành TRƯỢT cho H2.** Đây đúng 2/2 ca S150 và 3 ca S152: *phạt con-đo vì nó đúng VÀ được nghe theo*.

---

## (iii) FALSIFY-LOG — 5 phép (3 HELD / 2 BROKE)

| # | Phép PHỦ-ĐỊNH cụ thể | Kết quả |
|---|---|---|
| **F-A** | *"H1 bịa số 69 — đĩa chỉ có 68 migration"* → đếm lại 2 lần | 🔴 **BROKE — nhưng vào CHÍNH TAO.** Filter `grep -v Snapshot` của tao nuốt `20260717032812_AddPeApprovedBudget**Snapshot**.cs`. Đếm đúng = **69** (ls + python). **Claim H1 HELD**; suýt tố oan H1 bằng số rác của mình — **tái phát y hệt lỗi `grep -c \|\| echo 0` của tao @S153** |
| **F-B** | *"F-02 của H2 vô-giá-trị vì `git log -S … -- <path archive>` bao giờ cũng trả rỗng (path sai / lệnh chết)"* → chạy **control-dương** trên chuỗi H2 nói CÓ archive | ✅ **HELD.** `git log -S"1a47a61" -- .claude/agent-memory/cicd-monitor/archive/` = **1 commit** ⇒ lệnh có răng ⇒ 0-hit của `b5799fc`/`a2bbcb9` là **vắng-mặt THẬT**. Claim nặng nhất của H2 **đứng vững, và mạnh hơn bản H2 nộp** (H2 thiếu đúng control này) |
| **F-C** | *"4 skill H1 gọi PASS thật sự sạch"* → áp **chính thước nợ-tích-luỹ H1 dùng cho `ef-core-migration`** lên `contract-workflow` | 🔴 **BROKE (vào H1).** 0 hit `SigningPlan`/`Khkk`/`Kế hoạch ký kết` trong 24.949 B skill, trong khi S161 đẻ enum-phase + workflow-service + codegen `KHKK/{YYYY}/{Seq:D3}` ⇒ **stale THẬT** |
| **F-D** | *"H1 khai mở 5 bề mặt nhưng bề-mặt-4 (`hmw.js`) chỉ chép lại, không mở"* → đọc `hmw.js` bằng **python regex**, engine khác anchor `^\]` của H1 | ✅ **HELD.** 23 phần-tử, **tập-TÊN identical** với 23 tên H1 liệt `:61`. H1 mở thật |
| **F-E** | *"Bản vá S158 trỏ path ma"* — `SKILL.md:3` bảo nguồn sống là `…/Persistence/Migrations/*.cs` | ✅ **HELD.** `Persistence/Migrations` **TỒN TẠI** · `Infrastructure/Migrations` (flat) **KHÔNG** ⇒ con-trỏ đúng |

---

## (ii) VERDICT PER-CLAIM — 26 ĐẠT / 2 TRƯỢT / 8 KHÔNG-CHẤM (36 claim)

### H1 `tooling-auditor` — 15 ĐẠT / 2 TRƯỢT / 3 KHÔNG-CHẤM

| # | Claim | Verdict | Neo |
|---|---|---|---|
| A1 | F-1: `SKILL.md:3` frontmatter ĐÃ vá ("KHO LỊCH SỬ, KHÔNG phải nguồn mới nhất") | **ĐẠT** | `sed -n 3p` byte-exact |
| A2 | F-1: `SKILL.md:19` VẪN khai *"mới nhất = row cuối bảng"* | **ĐẠT** | `sed -n 19p` byte-exact |
| A3 | F-1: `skills/README.md:20` cùng lỗi + nhãn *"✅ Updated S117"* | **ĐẠT** | `sed -n 20p` byte-exact |
| A4 | F-1: row cuối bảng = **67** tại `SKILL.md:89` | **ĐẠT** | `sed -n 89p` = row `**67** AddPeApprovedBudgetSnapshot` |
| A5 | F-1: đĩa = **69**, mới nhất `20260729122015_AddContractSigningPlans` | **ĐẠT** | ls-filter-đúng = 69 · `os.listdir` = 69 (xem F-A) |
| A6 | F-1: hệ quả **"lệch 2"** | **ĐẠT** | ordinal 67/68/69 dựng lại khớp tên |
| A7 | F-1-bis: con-trỏ "nguồn sống" của bản vá là path THẬT | **ĐẠT** | `Persistence/Migrations` tồn tại, flat không |
| A8 | F-2: `usePipelineStages.ts:5` tự ghi `#82 PERMISSION 2 TẦNG` | **ĐẠT** | dòng 5 byte-exact |
| A9 | ② bề-mặt-1: đĩa `.claude/agents/*.md` − README = **23** | **ĐẠT** | ls 24→23 · `git ls-files` 24→23 |
| A10 | ② bề-mặt-2: `docs/STATUS.md:469` = **23** | **ĐẠT** | row `\| Sub-agents \| **23** \|` |
| A11 | ② bề-mặt-3: `STATUS:6` `roster 23` | **ĐẠT** | `sed -n 6p \| grep -o` |
| A12 | ② bề-mặt-4: `hmw.js VALID_ROLES` **23**, tập-tên IDENTICAL | **ĐẠT** | python, engine khác (F-D) |
| A13 | ② bề-mặt-5: `agent-memory/*/` = **23** dir | **ĐẠT** | `find -mindepth 1 -maxdepth 1 -type d` |
| A14 | ② "5 bề mặt đều khớp" — **0 bề mặt khai-mà-không-mở** | **ĐẠT** | tao mở lại 6 lượt độc lập |
| A15 | ④a: doc khai Mig **68** / đĩa **69** | **ĐẠT** | như A5 |
| **A16** | ① *"4 skill còn lại — PASS (không stale vì đợt này)"* | 🔴 **TRƯỢT (MED)** | `contract-workflow` 0 hit KHKK/SigningPlan trong khi S161 đẻ `ContractSigningPlanPhase.cs` + WorkflowService + codegen — **thước nợ-tích-luỹ của chính H1 (`:45`) không được áp đều** |
| **A17** | `END TOTAL = 10 finding (① 2 · ② 0 · ③ 0 · ④ 8)` | 🔴 **TRƯỢT (LOW, dẫn xuất A16)** | ① lẽ ra **3** ⇒ TOTAL **11**. Under-count, cùng lớp F-6 S151 |
| A18 | ① inventory 6 project + 23 standalone + 19 command | **KHÔNG-CHẤM** | không đo (giới hạn lượt) |
| A19 | ③ plugin 18/15/3 + marketplace 37 + model pin | **KHÔNG-CHẤM** | không đo |
| A20 | ④b–④h (89→96 bảng · 562→590 test · counter 34→36 · 4 hash bundle · HANDOFF · CLAUDE.md) | **KHÔNG-CHẤM** | không đo. ⚠️ H1 **tự khai** ④b (96) là **DERIVED chưa xác nhận LIVE** — khai-hở đúng cách, giữ nguyên cảnh báo đó |

### H2 `harvest-curator` — 11 ĐẠT / 0 TRƯỢT / 5 KHÔNG-CHẤM

| # | Claim | Verdict | Neo |
|---|---|---|---|
| B1 | universe run-folder = **75** | **ĐẠT** | `ls -1d …/runs/*/ \| wc -l` |
| B2 | có `run.md` = **72** | **ĐẠT** | loop `-f` |
| B3 | không có `run.md` = **3**, ĐÚNG 3 tên (`S117-minmax` · `S117-luyke` · `S144-bootstrap`) | **ĐẠT** | so **TẬP** không chỉ so SỐ |
| B4 | F-02: `git log -S"b5799fc" -- …/archive/` = **RỖNG** | **ĐẠT** | 0 commit + control-dương (F-B) |
| B5 | F-02: `a2bbcb9` archive = **RỖNG** | **ĐẠT** | 0 commit |
| B6 | coverage `ctx-verifier` S162-hit = **0** | **ĐẠT** | `grep -c` (đo trước vá) |
| B7 | coverage `frontend-designer` = **1** | **ĐẠT** | 〃 |
| B8 | coverage `reviewer` = **4** | **ĐẠT** | 〃 |
| B9 | coverage `cicd-monitor` = **3** | **ĐẠT** | 〃 |
| B10 | F-01: `ctx-verifier` **0 record** (không chỉ 0-hit) | **ĐẠT** | `git diff --numstat` vai này = **rỗng hoàn toàn** — chứng MẠNH HƠN bản H2 nộp |
| B11 | F-04: `reviewer` entry dày mà **0** con-trỏ `runs/2026-07-30-S162…` | **ĐẠT** | mở ruột dòng `+` |
| B12 | orphan THẬT = **3/72** (loop dual-accept) | **KHÔNG-CHẤM** | mẫu-số 72 đã ĐẠT (B2); phép dual-accept không chạy lại |
| B13 | Corruption **24 hit / 12 file**, baseline S153 16/10 | **KHÔNG-CHẤM** | không đo |
| B14 | Placement: 0 empty-dir · 1 `.claude` · 1 `agent-memory` · 23 vai | **KHÔNG-CHẤM** (23 vai đã ĐẠT gián tiếp qua A13) | — |
| B15 | F-03 `SHIP-READY` 0 hit trên artifact designer | **KHÔNG-CHẤM** | không đo |
| B16 | 3-bis phân loại MOVED/MODIFIED/stub 3 vai | **KHÔNG-CHẤM** | F-02 đã đại diện |

🔴 **KHÔNG gộp verdict-tổng che TRƯỢT lẻ:** H1 = `PASS_WITH_FLAGS` vẫn đứng về TỔNG THỂ, nhưng **A16 + A17 TRƯỢT riêng** và phải được đọc riêng.

---

## Ngoài trục — nêu verbatim, KHÔNG tự chấm (escalate lead)

`fe-admin/src/hooks/usePipelineStages.ts:3` ghi verbatim: `// File MIRROR SHA256 identical với fe-admin counterpart.` — file NÀY **là** bản fe-admin, nên câu tự trỏ về chính nó (bản fe-user mới đọc đúng). Hệ quả của yêu-cầu 2 file byte-identical. **Trục `reviewer`/code-diff, không phải trục tao** — nêu để lead định đoạt.

---

## KẾT

- **26 ĐẠT / 2 TRƯỢT / 8 KHÔNG-CHẤM** (36 claim) · falsify **5 phép (3 HELD / 2 BROKE — 1 BROKE vào CHÍNH TAO)** · tái-dựng **5 cụm số** (roster 23 ×6 nguồn · universe 75/72/3 ×tập-tên · `git log -S` 0/0 + control-dương 1 · VALID_ROLES 23 ×engine-khác · Mig 69 ×2 engine).
- **thách-CLEAN: A THỦNG / B CHỊU.** Ô 🟢 lại thủng — lần thứ 3 liên tiếp (S152 Placement+Corruption, S159 stray `.claude`, nay `contract-workflow`). **Soi CLEAN vẫn là chỗ ra ăn.**
- Đề lead (propose-only, tao KHÔNG ghi): (1) nâng ① lên **3 flag**, TOTAL **11**; (2) `contract-workflow/SKILL.md` bổ sung nhánh KHKK (enum 5-phase + `ApplicableType=10` + codegen `KHKK/{YYYY}/{Seq:D3}`) — **KHÔNG chép số**, chỉ mô-tả máy + trỏ file; (3) ghi vào luật H1: **thước freshness = nợ TÍCH LUỸ, áp ĐỀU cho mọi skill** (đây là lần đầu bắt được H1 dùng 2 thước trong 1 báo-cáo).

END ring1-audit-close-S162 — VERDICT=KIEM-PASS-WITH-2-TRUOT (26Đ/2T/8KC · falsify 5: 3H/2B · thách-CLEAN A THỦNG / B CHỊU)

