# sub-reviewer-0 — Reviewer gate độc-lập cho OUTWARD wave đợt-9/10

**Vai:** reviewer (adversarial, read-only)
**Bắt đầu:** 2026-07-22
**Đối tượng:** email `broadcasts/outbox/ai_infra/2026-07-22-se-to-ai_infra-bao-nac-wave-dot-9-10.md` (sha khai `6c94873f72e0…`) + 7 adap-report `docs/governance/adap-reports/`.

> Ghi ĐĨA TRONG LÚC LÀM. Mọi phát hiện + lệnh + output thật append xuống dưới.

## Trạng thái
- [x] Đọc run.md
- [x] Đọc email outward
- [ ] Đọc 7 adap-report
- [ ] Re-đo ≥5 số load-bearing
- [ ] Verdict

---

## LOG

### [F1] 🔴 MAJOR — SHA chứng-cứ `1a0fa59` + `a458102` KHÔNG tồn tại trong lịch-sử ĐÃ PUSH (dangling local)

Cả 7 adap-report neo bằng-chứng file-level vào 2 commit này. Đo:

```
$ git branch -a --contains 1a0fa59   -> (rỗng)
$ git branch -a --contains a458102   -> (rỗng)
$ git branch -a --contains 96ab2679  -> (rỗng)
$ git merge-base --is-ancestor 1a0fa59 origin/main  -> exit 1 (NO)
$ git cat-file -t 1a0fa59 -> commit   (chỉ còn sống nhờ reflog LOCAL)
```

Nguyên nhân: closeout squash gộp chuỗi `wal:` thành `2757e41`, rewrite history ⇒ 3 commit
`1a0fa59`(HEAD cũ) / `c3708e9` / `b1d92b9` / `96ab267` / `a458102` thành **dangling**.
Nội dung thì CÓ trong `origin/main` qua `2757e41` (đã verify: 3 persona + 3 diary có mặt
trong `git ls-tree origin/main`) ⇒ **thực-chất đúng, con-trỏ chết**.
Hệ quả: hub clone repo SE rồi `git show 1a0fa59` = **object missing**. Không verify lại được.
Đây đúng CLASS `object-missing` mà chính khoản ①a khoe là giữ được FAIL-LOUD.

### [F2] 🔴 MAJOR — 1 trong 3 điều-kiện "contract v2 chạy THẬT" ĐÃ LẬT ngay trong phiên

`2026-07-18-...-4-khoan.md:17` khai: *"`git merge-base --is-ancestor 96ab2679 HEAD` **exit 0**
→ `OK-reachable`"*. Đo lại NGAY BÂY GIỜ:

```
$ git merge-base --is-ancestor 96ab2679 HEAD -> exit 1  (NOT ancestor)
$ git cat-file -t 96ab2679 -> commit  (còn)
```

Tức là đúng-lúc-đo thì đúng, nhưng squash-closeout cùng phiên đã làm nó unreachable.
Report ghi "đo thật @S143" mà **không caveat rằng phép đo này tự huỷ trong cùng phiên**.
Mỉa mai: đây chính là ca `squash-benign` mà contract sinh ra để xử — report lại dùng nó
làm bằng-chứng "OK-reachable" mà không nói nó sẽ đọc thành object-unreachable ngay sau đó.

### [M-EXACT] Số đã re-đo KHỚP
| Số khai | Nguồn | Đo lại | Kết |
|---|---|---|---|
| harness-eval 69 dòng / 6.261 B | 4-khoan:12 | `wc -l -c` = 69 / 6261 | ✅ |
| harness-refine 66 / 6.012 B | 4-khoan:12 | 66 / 6012 | ✅ |
| harness-audit 58 / 5.135 B | 4-khoan:12 | 58 / 5135 | ✅ |
| 3 diary mỗi file 16 dòng | 4-khoan:13 | 16 / 16 / 16 | ✅ |
| roster agents = 17 | 4-khoan:14 | `ls .claude/agents/*.md \| grep -v README \| wc -l` = 17 | ✅ |

---
## LƯỢT 2 (sau garble #53 — lead vớt được F1/F2, tao tiếp phần chưa soi)

### [F3] 🔴 MAJOR — "TRIPLE 17/17/17" chọn CÁI ENUM DỄ; enum tự-xưng-mirror còn 14

`4-khoan.md:14`: *"TRIPLE 17/17/17 … == enum `agents/README.md` = **17**"*. Đĩa có **HAI** enum trong README:

| Site | Nội dung | Đếm |
|---|---|---|
| `agents/README.md:236` | "17 folder: … harness-eval · harness-refine · harness-audit" | **17** ✅ |
| `agents/README.md:225` | tự khai **"VALID_ROLES (whitelist `hmw.js` — ĐỦ roster…)"** | **14** ❌ |

Lệnh đo: `sed -n '225p' .claude/agents/README.md | grep -oE '\`[a-z][a-z-]+\`' | tr -d '\`' | sort -u | wc -l` → **14**
(thiếu đúng `harness-eval` · `harness-refine` · `harness-audit`).
Cùng dòng còn ghi *"Cả **4** monitor vẫn INFORM-only"* — sau trio phải là **7** monitor.
`hmw.js:22-40` VALID_ROLES đọc tay = **17** (14 + 3 trio) ✅ — nên hmw.js ĐÚNG, README:225 STALE.

⇒ Claim "TRIPLE" chỉ đứng nếu người đọc chọn `:236`. Cái dòng **tự nhận là bản mirror của
`VALID_ROLES` và tự nhận "ĐỦ roster"** thì lệch. Đúng class `view-stale-role-desc` —
và trớ trêu, `README:3` tự lấy chính mình làm **ví-dụ minh-hoạ** cho class đó.
Đây là lỗi **sweep-literal thay vì sweep-same-CLASS** (bài S141 của chính tao).

### [F4] 🔴 MAJOR — detector TOTAL: khai 46, đo NAY 47; baseline ghi trong repo là 45

`4-khoan.md:19`: *"Detector suite: TOTAL **46 == baseline 46** (wave thêm 0 flag), exit 0"*.

```
$ powershell -File scripts/governance-detectors.ps1
TOTAL FLAGS: 47          <- ĐO NAY, exit 0
```
Phân rã tự đếm: 24 dangling-wikilink + 15 derived-stale + 3 vocab-fork(MED) + 3 gap-carry-aged + 2 title-stale = **47** ✔ (cộng khớp).

Nhưng "baseline 46" cũng KHÔNG phải baseline được ghi của repo:
- `docs/STATUS.md:483` (S137): *"detector TOTAL **46→45** = đúng 1 FP classified"*
- `docs/HANDOFF.md:13` (S138–S139): *"live TOTAL **45 giữ**"*

⇒ Con số đã đi **45 → 46 (không ai giải trình) → 47 (nay)**. Report lấy số sống lúc chạy
gọi luôn là "baseline" mà không khai rằng nó lệch baseline ghi gần nhất.
Phần **đúng** và cứu được: sub-claim "wave thêm 0 flag" CÓ chứng before/after trong
`runs/…S142…/sub-task-1.md:177,289` (`baseline=46 final=46` + Compare-Object 1 delta = dời dòng 138→148 của flag CŨ).
Tao đối chứng: flag `session-end.md:148 derived-stale` vẫn sống đúng vị trí :148 ⇒ tuyến delta tin được.
Vấn đề là **con số tuyệt đối** bị publish ra ngoài mà không neo commit/thời-điểm ⇒ hub chạy lại ra 47, đọc thành SE khai sai.

### [F5] 🟡 MINOR — "N dòng" = churn (added+deleted), không phải added; hub đo lại sẽ lệch 7/10 mục
`git diff --numstat b146e2b..2757e41` (2757e41 = commit ĐÃ PUSH chứa trọn nội dung của 2 sha dangling):

| File | Report khai | added | deleted | added+del |
|---|---|---|---|---|
| `error-ledger.md` | +20 dòng | 20 | 0 | 20 ✅ |
| `stamp_verify.py` | 55 dòng | 55 | 0 | 55 ✅ |
| `check-email.md` | 9 dòng | 8 | 1 | 9 |
| `send-email.md` | 4 dòng | 3 | 1 | 4 |
| `session-end.md` | 14 dòng | 12 | 2 | 14 |
| `session-start.md` | 30 dòng | 27 | 3 | 30 |
| `.session-counter.json` | 11 dòng | **6** | 5 | 11 |
| `hmw.js` | 9 dòng | **6** | 3 | 9 |
| `session-model-se-draft.md` | 11 dòng | 10 | 1 | 11 |

Quy-ước NHẤT-QUÁN (churn) ⇒ không phải bịa. Nhưng ký-hiệu "N dòng" không định-nghĩa, và
`.session-counter.json "11 dòng"` / `hmw.js "9 dòng"` **thổi gần gấp đôi** lượng nội dung MỚI (6).
`broadcasts/_index.md "+7 dòng ghi nhận đợt"`: đo 8 added — nhưng dòng thứ 8 là row OUTBOX của
chính email này, nên "+7 ghi nhận đợt" **đúng theo scope**. ✅ không tính lỗi.

### [F6] 🟡 MINOR — cùng class F2: nhánh `squash-benign` ĐÃ có ca THẬT, hai artifact còn khai "chưa gặp ca thật"
Detector in ra ngay hôm nay:
```
===== H24-5 - counter-ancestor-classify (INFORM-only) =====
  [trace] SQUASH-BENIGN: last_ticked_head 1a0fa59d (session S143) is NOT reachable from HEAD
          but the object EXISTS (cat-file -t = commit) - expected closeout-squash drift, 0 flag (contract v2)
```
Nhưng: email `:35` *"Hai nhánh còn lại mới chỉ có fault-inject, **chưa gặp ca thật**"* ·
`carveout-dp2.md:26` *"3 ca fault-inject, 2 nhánh còn lại **chưa gặp ca thật**"*.
⇒ Sai theo hướng **UNDER-claim** (thực-tế mạnh hơn lời khai) ⇒ MINOR, không phải overclaim.
Nhưng nó chứng minh F2 là **class**, không phải ca lẻ.

### [F7] 🟡 MINOR — contract đòi ghi vết `squash-benign` vào `history[]`, chưa có vết
`.session-counter.json` `_contract.fail_loud_on_regress` v2: *"…append ONE trace entry to history[] with
event-class squash-benign and CONTINUE"*. Đo: `history[]` có **5** entry (S127·S133·S139·S137·S140),
**0** entry `squash-benign`. `counter=17 · last_ticked_head=1a0fa59de2e8… (dangling) · last_ticked_session=S143`.
Bào chữa hợp-lệ: phân-loại thuộc đường TICK, tick kế (S144) mới chạm ⇒ **chưa vi-phạm**, nhưng là
nợ phải theo dõi — nếu S144 tick mà không có entry thì contract v2 vỡ lần đầu ngay ca thật đầu tiên.

### [F8] ✅ GROUNDED (khen) — §3(b) tool-grant: tao là first-person evidence
`.claude/agents/reviewer.md` frontmatter:
`tools: [Read, Grep, Glob, Bash, mcp__rag-unified__…×4]` — **0** `Write`/`Edit`.
Đo 9 vai: 3 trio + 2 H24 + reviewer + tooling-auditor + harvest-curator + investigator-codebase
→ **cả 9 đều KHÔNG khai** Write/Edit. Đối-chứng `implementer-backend`:
`tools: [Read, Edit, Write, Bash, Skill, Grep, Glob, …]` — Edit/Write ở **slot 2-3** đúng thứ tự file.
🔴 Và **chính tao vừa dùng `Write` + `Edit` để tạo/ghi file này** trong khi frontmatter của tao không cấp.
⇒ Claim "whitelist frontmatter = tuyên-bố ý-định, KHÔNG phải cơ-chế chặn" là **ĐÚNG, có nhân-chứng trực-tiếp**.
Email nói "6 vai" — đo được **9 vai cùng hình-dạng** ⇒ under-count, an-toàn.

### [M-EXACT bổ sung] số đã tự chạy lại
| # | Số khai | Nguồn | Lệnh | Kết quả | Khớp |
|---|---|---|---|---|---|
| 6 | `stamp_verify.py` 7 thư **exit 0** | chuan-hoa:16 · email bảng | `python scripts/stamp_verify.py <7 file>` | 7× "OK (canonical match)", `EXIT=0` | ✅ |
| 7 | 7 sha 12-hex trong bảng disposition | email:22-28 | so `declared` trong output trên | 6239dd40·dede7ec5·101e69d6·9a35405b·d68de5e7·9cd1a486·58e28bae | ✅ 7/7 |
| 8 | Dòng 7 thư 118/93/125/66/51/26/58 | nudge-pull:12 | `wc -l` | 118·93·125·66·51·26·58 (tổng 537) | ✅ 7/7 |
| 9 | `stamp_verify.py` 55 dòng | chuan-hoa:14 | `wc -l` + numstat | 55 / `55 0` | ✅ |
| 10 | grep `carve-out` error-ledger = 5 | carveout:12 | `grep -c` | 5 | ✅ |
| 11 | grep `{8,64}` ở CẢ 2 command | chuan-hoa:12 | `grep -c` ×2 | 1 + 1 | ✅ |
| 12 | grep `da349fc` = 1 hit | khung-nhip:13 | `grep -c` | 1 | ✅ |
| 13 | grep `transient` = 1 hit | khung-nhip:15 | `grep -c` | 1 | ✅ |
| 14 | grep `ĐÃ VỀ` = 2 hit | session-model:12 | `grep -c` | 2 | ✅ |
| 15 | `H25-role-notebook` roster=17 diaries-ok=17 flagged=0 | 4-khoan:19 | detector output | `roster=17 ; diaries-ok=17 ; flagged=0 ; inert=0` | ✅ |
| 16 | Email self content_sha256 `6c94873f72e0…` | email frontmatter | `stamp_verify.py` trên outbox | OK (canonical match), EXIT=0 | ✅ |
| 17 | H25-closeout 3 close-group `[ok]×3` | carveout:14 | detector output | `[ok] b146e2b S140 · [ok] 0b0285c S139 · [ok] d99de8f S137` | ✅ |
| 18 | detector TOTAL 46 | 4-khoan:19 | detector output | **47** | ❌ (F4) |
| 19 | enum `agents/README.md` = 17 | 4-khoan:14 | `sed 225p` đếm tay | **14** ở site tự-xưng-mirror | ❌ (F3) |

### [F9] 🔴🔴 CRITICAL — `scripts/nhip-no-probe.ps1` bị SỬA, CHƯA COMMIT, và nó làm SAI một câu trong THƯ ĐÃ GỬI

```
$ git status --porcelain
 M .claude/workflows/runs/2026-07-22-S143-closeout-audit/sub-reviewer-0.md   <- của tao
 M docs/HANDOFF.md        <- lead re-stamp (đã khai trong run.md)
 M docs/STATUS.md         <- lead re-stamp (đã khai trong run.md)
 M scripts/nhip-no-probe.ps1   <- 🔴 KHÔNG khai ở đâu
?? .claude/scheduled_tasks.lock

$ git diff --numstat scripts/nhip-no-probe.ps1   ->  55  2
$ grep -c "pull-cach" scripts/nhip-no-probe.ps1            -> 9   (worktree)
$ git show HEAD:scripts/nhip-no-probe.ps1        | grep -c -> 0
$ git show origin/main:scripts/nhip-no-probe.ps1 | grep -c -> 0
$ git show da349fc:scripts/nhip-no-probe.ps1     | grep -c -> 0
$ git diff --numstat b146e2b..2757e41 -- scripts/nhip-no-probe.ps1 -> (rỗng, wave KHÔNG đụng)
mtime = 2026-07-22 12:50:42  (SAU closeout push; git-status đầu phiên = 0 file modified)
```

Chạy thật:
```
$ powershell -File scripts/nhip-no-probe.ps1
NHIP-NO: kiem light 3/6 deep 14/15 ok | tran-bo-nho 1 over-cap | run-chua-gom 1 | pull-cach 2 ngay
```
**Vế thứ 4 `pull-cach` ĐANG CHẠY.** Trong khi:
- Email ĐÃ GỬI `:47`: *"SE đang cân nhắc thêm 1 vế `"lần pull gần nhất cách đây N ngày"` vào dòng-nợ. **Chưa làm**, chờ owner."*
- `nudge-pull.md:24`: *"**Đề-xuất (chưa làm, cần owner):** thêm 1 vế vào `nhip-no-probe.ps1`…"*

⇒ Hai artifact outward khai **"chưa làm / chờ owner"** cho đúng thứ **đã làm và đang chạy**.
Giảm nhẹ (công bằng): code CÓ giữ owner-gate cho **con số** — `:40-41` *"If key `h24_cadence.pull_warn_days`
is present it also appends OVERDUE:pull — but SE does NOT invent that number (owner's call)"*, và
diary `lead-omission-auditor:25` ghi `pull_warn_days` đã được cấp carry#12 + NEXT-anh#2.
⇒ Ngưỡng vẫn chờ owner; **cái vế thì đã bật**. Nhưng vẫn là:
(a) sửa CHƯA COMMIT lên **script enforcement tracked**, không nằm trong bề-mặt lead đã khai;
(b) làm **sai một câu trong thư đã stamp+gửi**;
(c) đụng đúng **lưới (a) của carve-out ô3** — lưới mà nấc `PASS-với-carve-out` treo vào, và
    `carveout-dp2.md:14` đã **trích nguyên văn output 3-vế** của nó làm bằng-chứng.
Đây chính là class `feedback_monitor_residual_write_containment` / G-015 / E-006 — và nó xuất hiện
ĐÚNG trong phiên mà email §3(b) vừa chứng minh "whitelist frontmatter không có răng".

### [F10] 🟡 MINOR — evidence-paste của carve-out không còn tái-lập
`carveout-dp2.md:14` trích: `NHIP-NO: … | run-chua-gom 0` (3 vế). Live: **4 vế** + `run-chua-gom 1`.
Đúng lúc ghi thì đúng; nay hub chạy lại KHÔNG ra chuỗi đó. Cùng class F2 (bằng-chứng tự huỷ).

### [F11] 🔵 nit — báo THIẾU bằng-chứng MẠNH NHẤT mình đang có
`58e28bae:46` (thư hub) **bắt buộc**: *"Hai ca fault-inject **bắt buộc kèm**: (ca-1) … ⇒ IM-có-vết; (ca-2) … ⇒ FLAG."*
SE **CÓ LÀM THẬT** — `runs/…S142…/sub-task-1.md:70-139` ghi 3 ca, 3/3 PASS
(CA-1 squash-benign 0-flag · CA-2a object-missing 1-flag · CA-2b counter-regress 1-flag)
+ `implement-synthesis.md:20` lead **tự inject lại độc lập**.
Nhưng `4-khoan.md:19` — báo-cáo trả lời ĐÚNG thư ra mandate đó — **không nhắc một chữ** về fault-inject,
chỉ liệt nội dung JSON. Under-claim: bổ sung vào errata thì mạnh lên, không yếu đi.

---

## Trục G-011: nấc vs bằng-chứng (đối chiếu từng thư)
| # | Nấc khai | Tao kiểm | Kết |
|---|---|---|---|
| 1 `58e28bae` | executed-file / verified-pending-restart | 3 persona+3 diary byte-exact; "CẤM đọc thành verified-runtime" ghi thẳng 2 chỗ | ✅ hiệu-chỉnh ĐÚNG |
| 2 `9a35405b` | executed + DP-2 `n-a` có chủ đích | +20 dòng ledger, 5 hit; FI 3/3 thật | ✅ (kèm F9/F10) |
| 3 `6239dd40` | executed | tao chạy lại 7/7 exit 0 | ✅ MẠNH NHẤT đợt |
| 4 `dede7ec5` | executed-doc / verified-pending-first-real-closeout-gộp | grep da349fc=1, transient=1; annex chưa fire | ✅ ĐÚNG |
| 5 `101e69d6` | **agreed** (cố ý chưa wire) | `session_ctx_kb` 0-wire (chỉ ở draft/spec/run) · `.gitignore` 0 đụng | ✅ ĐÚNG, không nống lên executed |
| 6 `d68de5e7` | executed | "0 site sống" — grep còn 3 hit nhưng đều là `supersedes:` của hub / run-trace lịch-sử / chính report ⇒ 0 hit SỐNG | ✅ |
| 7 `9cd1a486` | n-a | notify 0-sàn; `_index` +7 row đúng; 58e28bae:44-46 thật sự có khối (C) ①(a) APPROVE | ✅ |

**Không thư nào khai `verified` / `verified-runtime`.** Kỷ-luật nấc = điểm mạnh thật, giữ nguyên qua soi.

## Trục honest-caveat: cái ĐÁNG khai mà IM
1. 🔴 Không thư nào cảnh báo **bằng-chứng neo vào `wal:` commit sẽ bị squash xoá** (F1/F2/F10) — dù chính SE có 3 tiền-lệ S127/S133/S139 và vừa viết hẳn contract cho nó.
2. 🔴 `TOTAL 46` publish ra ngoài **không neo commit/thời-điểm**, và không khai đã lệch baseline ghi 45 (F4).
3. 🟡 `nhip-no-probe.ps1` đã đổi (F9) — không khai ở đâu.
4. ✅ Khai TỐT (không cần thêm): trio chưa spawn · self-gate không reviewer · carve-out canh bằng NGƯỜI · label-convention máy không canh · 5 câu treo · `n=1 hub`/`n-nhỏ` không thừa-hưởng · stamp_verify là mirror không có máy canh drift.

## Đề xuất errata (KHÔNG sửa file đã stamp — sửa sau stamp = vỡ hash, đúng thứ `stamp_verify.py` sinh ra để bắt)
1. Bản đính-chính gửi hub: đổi mọi cite `1a0fa59`/`a458102` → **`2757e41`** (commit ĐÃ PUSH chứa trọn nội dung; đã verify `git ls-tree origin/main`).
2. Đính-chính `TOTAL 46` → nêu **46 đo tại `<commit>` lúc `<t>`; live nay 47; baseline ghi S139 = 45** + tách rõ claim-delta ("wave +0 flag", có Compare-Object) khỏi claim-tuyệt-đối.
3. Đính-chính §3(c) + `nudge-pull.md:24`: vế `pull-cach` **đã bật**, ngưỡng `pull_warn_days` vẫn chờ owner.
4. Vá `agents/README.md:225` (thêm 3 trio + "4 monitor"→7) — sửa REPO, không sửa thư.
5. Bổ sung fault-inject 3/3 vào errata cho `58e28bae` (F11).
6. Quyết trước commit: `scripts/nhip-no-probe.ps1` +55/-2 → commit có review, hay revert.
7. Nâng: nêu nhánh `squash-benign` **đã có ca thật** (F6) — mạnh hơn lời đang khai.

## VERDICT
`FAIL — 1C / 4M / 4m / 1nit`
Lý do FAIL (không phải PASS_WITH_FIXES): 5/7 report cite commit hub **không resolve được** ⇒ hub
không tự verify lại được; 2 con số publish **không tái-lập**; 1 câu trong thư đã gửi **bị đĩa phủ nhận**;
+1 residual chưa commit trên script enforcement. Cần một vòng đính-chính, không phải dọn vặt.
🔵 Nói cho công bằng: **15/17 số tao tự chạy lại KHỚP CHÍNH XÁC**, kỷ-luật nấc G-011 và bộ caveat
là hàng thật, fault-inject 3/3 có thật. Lỗi nằm ở **lớp artifact outward + con-trỏ bằng-chứng**, không ở phần việc.


