# sub-reviewer-0 — R1 `anchor-verify` (S144 adap đợt-11)

> **Run:** `2026-07-22-S144-adap-dot-11` · **Vai:** reviewer (adversarial) · **Câu hỏi:** nền SỰ KIỆN của spec có đứng vững không?
> **Target:** `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` (17.559 B)
> **Phạm vi:** 60 neo tự mở file kiểm (16 neo mã/repo SE + 44 neo trích-dẫn 10 broadcast). Không neo nào được chấm mà chưa mở file.

## VERDICT — `PASS_WITH_FIXES`

**Nền sự-kiện ĐỨNG VỮNG.** 55/60 neo KHỚP nguyên văn · 3 neo KHỚP-nội-dung nhưng **lệch số dòng** · 2 neo **LỆCH thật** (1 neo trỏ nhầm file, 1 neo cắt nửa dòng làm rơi một khoản "áp cho MỌI nhà"). **0 neo KHÔNG TÌM THẤY.**

Không có trích dẫn nào sai chữ tới mức đổi nghĩa. Các suy-luận nặng của spec (P2-1 FAIL clamp · P2-2 đơn-vị-thứ-ba · P3-3 gap CLAUDE.md · P4-2 outbox/all · P4-3 lệch sổ garble) đều **tự đứng được bằng bằng chứng độc lập tao đo lại**.

| Trục | Số |
|---|---|
| Neo chấm | **60** |
| KHỚP | **55** |
| KHỚP nhưng lệch số dòng | **3** (B10 · B14 · B40) |
| LỆCH | **2** (A11 · B43) |
| KHÔNG TÌM THẤY | **0** |
| MAJOR | **4** · MINOR **5** · nit **2** |

---

## MAJOR (phải xử trước khi worker thực-thi)

### M1 — `settings.json:11` trỏ NHẦM FILE (P4-1)
- Spec `:129`: *"`settings.json:11` pin Opus từ 07-20"*.
- Trong repo: `.claude/settings.json` **330 B, 15 dòng, 0 hit** `opus|model|fable`; `git log -1` = **`23bbe97` 2026-07-15**. Dòng 11 = `]`.
- Sự thật nằm ở file **NGOÀI repo**: `/c/Users/pqhuy/.claude/settings.json:11: "model": "claude-opus-4-8[1m]"` — mtime **2026-07-20 13:38** ⇒ **nội dung + số dòng + ngày đều đúng, chỉ SAI ĐƯỜNG DẪN**.
- Vì sao MAJOR: worker/reviewer nào grep trong repo sẽ ra 0 hit và kết luận claim bịa; file global **không nằm trong git** ⇒ claim không tái-lập được bằng CI. Sửa: ghi rõ `~/.claude/settings.json:11` (global, untracked) mỗi lần nhắc.
- Phần còn lại của P4-1 **KHỚP**: `docs/STATUS.md:450` (ô canonical §Sub-agents, CURRENT STATE) vẫn ghi *"em main **Fable 5** (1M) Max"*; `session-start.md:43` outage-recipe bảo fallback sang `claude-opus-4-8[1m]` = đúng thứ đang pin ⇒ **no-op có thật**. Đã có tiền-lệ ghi ở `STATUS.md:462` ("Còn CHỜ ANH") ⇒ xếp O-5 là đúng thẩm quyền.

### M2 — `cost-lens:50` bị cắt nửa dòng, rơi khoản ③ "áp cho MỌI nhà"
- Spec `:21` xếp `cost-lens` = **GHI NHẬN**, neo `:50`.
- `:50` nửa đầu đúng: *"FYI owner-side — KHÔNG floor, không bắt làm gì."* **Nửa sau cùng dòng đó**: *"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ): pattern suggest-1-dòng-non-blocking dùng cho bất-kỳ lựa-chọn vận-hành nào lead làm thay owner được nhưng owner muốn giữ mắt nhìn."*
- Spec chỉ mang `cost-lens:28` (cột "đốt đơn-vị NÀO") vào P2-2; **khoản ③ không vào bất kỳ mục P nào**. Hướng lệch = **under-claim** ⇒ rủi ro bỏ sót thứ hub nói rõ là dùng được cho mọi nhà.

### M3 — C11 giẫm lên knob đã đánh dấu OWNER (P3-2)
- Chẩn đoán của spec **ĐÚNG**: `session-start.md:135` dùng `today − last_sleep_at ≥ 7 ngày`; và mark `RC-pqhuy1987-20-06-2026-10-29-11` (`.claude/governance/ACTIVE-MARKS.md:17`, **🔖 Active-High, anh-confirm S79**) đúng là tuyên *"time/age/recency-decay = false-proxy"* ⇒ SE tự mâu thuẫn với chính mark mình.
- **Nhưng** chính dòng `:135` khai: *"🔴 **KHÔNG bịa số** (giữ INFORM 7-ngày — **DP-5 quyền owner cục-bộ** B1 §3.4)"*.
- C13-checklist `C11` giao **em-main**, acceptance `grep 'ngày|7 day' trong trigger = 0` ⇒ AI **gỡ knob owner đã chốt**. Theo `eval:24`, "bỏ check / đổi cơ chế / thêm gate" = **chủ-dự-án-quyết-LUẬT**; O-1 của spec chỉ phủ **CON SỐ**, không phủ **đổi cơ chế**.
- Sửa: tách C11 thành (a) đo + đề-xuất (AI) và (b) flip cơ-chế → thêm **O-6 owner-quyết-LUẬT**.

### M4 — Nhãn "đo được" không có đường phản-chứng (P0-2)
- Spec `:57`: *"**Nguyên nhân đo được**: … lane sống dùng 21/23 tool-use, lane chết dùng 28/34/35"*.
- `grep "21/23\|28/34/35\|tool-use" run.md sub-investigator-codebase-*.md` trong run-folder = **0 hit**. Không có artifact trên đĩa để ai đó làm con số này TRƯỢT nếu nó sai.
- Load-bearing thật: chính con số này dùng để **bác** phương án thay thế ("Fix KHÔNG phải nâng `maxTurns`"). `maxTurns: 20` thì tao xác nhận (`investigator-codebase.md:14`); phần tool-use thì không.
- Sửa (rẻ, 1 dòng): khai nguồn = khối `<failures>` của harness trong phiên, **không lưu đĩa** — hoặc bỏ nhãn "đo được", giữ nhãn quan-sát.

---

## MINOR

- **m1 — B10:** prompt-floor *"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"* nằm ở `depth-axis:36`; spec cite `:38-43` (trong khoảng đó `:42` chỉ có bản nén *"đồng-ý-lại=0-điểm"*). Chữ đúng, dòng lệch.
- **m2 — B14:** *"áp cho MỌI dự-án"* nằm ở `goi-chot:68` (§6 PROJECT-FIT), spec đặt cạnh `goi-chot:52`.
- **m3 — B40:** `depth-cost:59` được để trong ngoặc kép nhưng là **paraphrase rút gọn**. Nguyên văn: *"nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy 'chết' hay thấy 'sạch'?"* — spec: *"tầng chết thì tầng sau thấy 'chết' hay 'sạch'?"*. Nghĩa giữ, chữ không khớp 100%.
- **m4 — P1-3 neo hụt:** 3 nhãn `APPLIED`/`DORMANT`/chờ-judge (`:37`), literal *"% = FLOOR theo evidence, không phải ceiling"* (`:38`) và negative-control (`:39`) đều là **nguyên văn hub** ở `harness-dong-du-vong:37-39`; spec chỉ cite `:47`. Nên cite `:37-39` — vì C5 acceptance đòi đúng literal đó, cite hụt làm nó trông như chữ SE tự đặt.
- **m5 — P4-3 phân loại trước khi cộng:** "phiên này +2 ⇒ ×27". 3 lane chết lượt-1 là **cháy maxTurns**, KHÁC class #53 (wrong-slice-of-transcript). Sổ đĩa (`feedback_agent_return_garble_recover.md:13`) tự có bài học (c) *"cập-nhật tally ở CUỐI phiên"* — spec đã theo; chỉ cần thêm bước phân-class.

## nit

- **n1 —** `auto:45` (nằm trong chính khoảng `:43-47` spec cite) ghi *"form tự quyết, **chức năng là sàn**"* ⇒ xếp `auto-toan-vong` thuần KHUYẾN NGHỊ hơi nhẹ hơn chữ "sàn". Hướng lệch = under-claim.
- **n2 —** Header spec khai *"10/10 `stamp_verify.py` exit 0"*. Script **có thật** (`scripts/stamp_verify.py`, 2.378 B, 20-07) nhưng tao **KHÔNG chạy lại** ⇒ chưa xác nhận độc lập, không tính là lỗi.

---

## Neo ĐỨNG VỮNG đáng ghi (chống hạ-bar — mấy claim này chịu được soi)

| Claim spec | Bằng chứng độc lập tao đo |
|---|---|
| P2-1 "SE FAIL clamp trần cứng" | `hmw.js:114` *"KHÔNG cap cứng (soft notice only)"* + `:115-117` chỉ `log()` — đúng, và floor `depth-axis:40` đòi *"clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần"* |
| P0-1 "lane chết → null → nuốt lặng" | `hmw.js:225` `return results.filter(Boolean)`; comment `:223` **tự khai** *".filter(Boolean) chỉ lọc null-lane do agent lỗi runtime"* ⇒ code tự tố chính nó |
| P0-1 "CẤM sửa thành throw" | `hmw.js:124-125` *"(per-lane throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn)"* — và vì nó nói **per-lane**, C8 (throw up-front) KHÔNG mâu thuẫn |
| P2-2 "đơn-vị THỨ BA" | `agents/README.md:251` = *"Effective tokens billed (after caching)"* — không phải "tổng vào+ra" cũng không phải "phía-ra" của `depth-cost:59` ⇒ falsifier đúng là CHƯA ĐO ĐƯỢC |
| P2-2 "đóng băng thời 7 sub-agent, roster nay 17" | `README:249-257` (`:253` "7 sub-agents spawn setup"); roster đo 2 cách độc lập: `ls .claude/agents/*.md`=18 (gồm README) và `grep maxTurns`=**17** |
| P3-3 "CLAUDE.md có nói posture không?" | `grep -i hmw CLAUDE.md docs/CLAUDE.md` = **0 hit** ⇒ gap discoverability-home CÓ THẬT |
| P4-2 "`/check-email` bước 2 chỉ ghi outbox/se" | `check-email.md:15` là **dòng DUY NHẤT** chứa `outbox` trong cả file |
| P4-2 "outbox/all = 90 file" | `ls ../../AI_INFRA/broadcasts/outbox/all/*.md \| wc -l` = **90** (khớp chằn chặn) |
| P4-3 "đĩa ×25 vs STATUS/HANDOFF ×23" | đĩa: `feedback_agent_return_garble_recover.md:13` *"+ S143 ×5 = ×25 tổng"*; canonical: `STATUS.md:462` **và** `HANDOFF.md:5` đều *"×20/S118 → ×23/S143"* ⇒ **lệch 2 phía đều verify** |
| P4-4 F-6 ".gitignore thiếu lock" | `grep scheduled_tasks .gitignore` = NOT FOUND |
| ① "goi-chot khoản 3+4 binding" | `goi-chot:67-68` PROJECT-FIT: khoản 3 *"áp cho mọi dự-án … có lệnh điểm-dừng riêng"*, khoản 4 *"áp cho MỌI dự-án viết doc/rule"* |
| ①(4) "bẫy over-apply khoản 2" | `goi-chot:37` giữ nguyên *"resume/continue chỉ còn hợp-lệ cho hội-thoại tiếp-diễn trong cùng lượt làm việc"* ⇒ path-2 cứu #53 KHÔNG bị retire — spec chặn đúng |
| P1-2 "1 vai harness-audit mở rộng là hợp khung" | `harness-dong-du-vong:51` *"gộp hay tách audit (1 con kiểm nhiều vòng hay mỗi vòng 1 con) … mỗi dự-án tự quyết"* |
| "2/5 lane sống" | run-folder có đúng 2 sub-file investigator (`-0`, `-3`) |

---

## Bảng neo đầy đủ

### A. Neo vào mã/repo SE (16)

| # | Neo spec | Verdict | Bằng chứng |
|---|---|---|---|
| A1 | `hmw.js:225` = `return results.filter(Boolean)` | **KHỚP** | đúng nguyên văn; comment `:223` củng cố claim nuốt-lặng |
| A2 | `hmw.js:114-117` *"KHÔNG cap cứng (soft notice only)"* | **KHỚP** | `:114` nguyên văn; `:115-117` = `if (>16) log(...)` |
| A3 | `hmw.js:124-125` *"per-lane throw … STOP-SILENT, tệ hơn"* | **KHỚP** | câu vắt 2 dòng, nguyên văn |
| A4 | `agents/README.md:249-257` bảng cost "7 sub-agents" + "Effective tokens billed" | **KHỚP** | `:249` header · `:251` cột · `:253` hàng |
| A5 | roster 17 | **KHỚP** | 2 cách đo độc lập đều ra 17 |
| A6 | `investigator-codebase` maxTurns=20 | **KHỚP** | `investigator-codebase.md:14` |
| A7 | `reviewer` maxTurns=25 | **KHỚP** | `reviewer.md:14` |
| A8 | SE dùng sleep-check 7 NGÀY | **KHỚP (+cảnh báo M3)** | `session-start.md:135`, kèm nhãn DP-5 quyền owner |
| A9 | `/check-email` bước 2 chỉ `outbox/se` | **KHỚP** | `check-email.md:15` là hit duy nhất |
| A10 | sổ garble đĩa ×25 | **KHỚP** | `feedback_agent_return_garble_recover.md:13` |
| A11 | `settings.json:11` pin Opus từ 07-20 | 🔴 **LỆCH (nhầm file)** | repo `.claude/settings.json` 0-hit, mtime 07-15; global `~/.claude/settings.json:11` mới đúng, mtime 07-20 13:38 |
| A12 | `session-start.md:43` outage-recipe | **KHỚP** | `:43` đúng nội dung; hệ quả "no-op" đứng được nhờ file global (M1) |
| A13 | CLAUDE.md có nói HMW-mode? | **KHỚP (gap thật)** | 0 hit |
| A14 | `.gitignore` thiếu `scheduled_tasks.lock` | **KHỚP** | NOT FOUND |
| A15 | 2/5 lane sống | **KHỚP** | 2 sub-file trong run-folder |
| A16 | 10 thư inbox 07-18→07-21 | **KHỚP** | `ls` = 10 file |

### B. Neo trích 10 broadcast (44) — tóm tắt

- **`spawn-label`** `:22` `:22-27` `:43` `:51` + falsifier `:47` (khuôn C3) — **5/5 KHỚP** nguyên văn.
- **`depth-axis`** `:20` `:38` `:40` `:43` `:55` — **KHỚP**; riêng **B10** verbatim F3 ở `:36` (lệch dòng).
- **`goi-chot`** `:28` `:29` `:37` `:44` `:45` `:52` `:59` `:74` + header §1/§3/§4 + PROJECT-FIT `:67-68` — **KHỚP**; riêng **B14** *"áp cho MỌI dự-án"* ở `:68` (lệch dòng).
- **`harness-dong-du-vong`** `:42` `:44` `:47` `:51` `:59` — **KHỚP**; +neo hụt m4 (`:37-39`).
- **`eval-quality`** `:13` `:15-24` `:19-22` `:24` `:22` `:31` `:55` — **7/7 KHỚP** nguyên văn.
- **`auto-toan-vong`** `:19` `:21` `:27` `:35` `:43-47` — **KHỚP**; nit n1 ở `:45`.
- **`3-khoan`** `:15` `:19-27` (`:25`) `:31-41` (`:36-37`,`:39`) `:47-51` `:53` — **KHỚP**, kể cả claim *"hub tự khai đã đọc nhầm 1 lần"* (`:53`).
- **`depth-cost`** `:53` `:54` `:55` `:63` — **KHỚP**; **B40** `:59` là paraphrase-trong-ngoặc-kép.
- **`cost-lens`** `:28` **KHỚP**; **B43** `:50` 🔴 **LỆCH — cắt nửa dòng** (M2).
- **`hub-tu-danh-gia`** `:62` — **KHỚP**.

---

## Khuyến nghị (mô tả vấn đề + tiêu chí nghiệm thu, KHÔNG viết code hộ)

1. **M1** — mọi chỗ nhắc pin model phải ghi đủ đường dẫn `~/.claude/settings.json:11` (global, ngoài git). Nghiệm thu: grep spec, 0 lần xuất hiện chuỗi `settings.json:11` mà không có tiền tố `~/.claude/`.
2. **M2** — thêm 1 dòng vào P-list cho `cost-lens` khoản ③, hoặc khai rõ "đã cân-nhắc → BÁC vì lý do X". Nghiệm thu: bảng disposition có dòng riêng cho khoản ③.
3. **M3** — chuyển flip cơ-chế sleep-trigger sang mục OWNER-GATED (O-6); C11 giữ lại phần đo + đề xuất. Nghiệm thu: C11 không còn acceptance dạng `grep 'ngày' = 0` khi chưa có chữ owner.
4. **M4** — khai nguồn con số tool-use hoặc bỏ nhãn "đo được". Nghiệm thu: mỗi số mang nhãn đo-lường trong spec trả lời được câu *"phép kiểm nào làm nó TRƯỢT nếu sai?"*.
5. **m1-m4** — sửa số dòng cite (1 phút/cái). Nghiệm thu: mở đúng dòng, thấy đúng chữ.
6. **m5** — phân class trước khi cộng sổ garble ở closeout.

## Ghi chú phương pháp

- Mỗi neo chấm 1 trong 3: **KHỚP** / **LỆCH** / **KHÔNG TÌM THẤY**; không neo nào chấm mà chưa mở file.
- Lệnh dùng: `awk NR>=a&&NR<=b` in kèm `FILENAME:NR` (đọc đúng dòng, không tin grep-context), `git log -1 --` cho mtime/commit, `ls | wc -l` cho phép đếm.
- Không sửa file nào ngoài chính sub-MD này (isolation B6).
