# sub-reviewer-1 — R2 scope-calibration (S144 adap dot-11)

**Vai:** reviewer adversarial · trục = "spec đòi ĐÚNG mức không?"
**Target:** `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` (177 dòng)
**Nguồn:** 10/10 thư `broadcasts/inbox/` đã MỞ THẬT (không suy diễn từ bảng của spec)
**Trạng thái:** DONE

---

## 0. VERDICT — `PASS_WITH_FIXES`

Phân hạng 4 mức của spec (BINDING / BINDING-mixed / KHUYẾN NGHỊ / GHI NHẬN) **đúng 10/10 ở mức THƯ** — mọi neo `file:line` trong bảng ①
đều khớp verbatim khi mở thư gốc. **0 ca phóng-đại ở tầng phân-hạng thư.**

Lỗi nằm ở **tầng khoản** (bên trong thư binding) và **tầng checklist**:

| Loại | Số | Mức nặng nhất |
|---|---|---|
| Phóng-đại (đòi hơn thư) | 2 | 1 MAJOR (C8 sai-trục + tự mâu-thuẫn) |
| Bỏ sót ràng buộc | 4 (+5 khuyến-nghị-cấp) | 2 MAJOR (`harness:46` khoản③ · `goi-chot:38+66+73`) |
| Owner-gate thiếu | 2 | 1 MAJOR (số trần C8) + 1 MAJOR (C12 ghi posture-toggle vào CLAUDE.md) |
| Trục 3 (depth-axis qualify) | — | **ĐÚNG**, có bằng chứng cơ học |
| Trục 4 (retire-resume) | — | **ĐÚNG**, đọc khớp `goi-chot:37` — nhưng bỏ nửa sau của khoản 2 |

---

## 1. TRỤC 1 — PHÓNG ĐẠI (spec đòi HƠN thư)

### 🔴 MAJOR P-1 — C8 "THROW" vừa SAI TRỤC vừa MÂU THUẪN với chính khoản mà nó viện

- Thư `depth-axis:40` (khoản ①): *"clamp trần cứng (vd ≤3) + **assert tổng-lượt ≤ trần**"* — trần này áp lên **SỐ LƯỢT của trục SÂU**
  (cấu-hình đối chiếu `depth-cost:24`: *"5-góc + thử-phá + 3-đào-tầng-2 + thử-phá-2 = **10 lượt**"*).
- Spec `:158` (C8) lại ép trần lên **`taskList.length`** = **CHIỀU RỘNG** (số lane fan-out), neo vào `hmw.js:114-117` (`taskList.length > 16` soft notice).
  Hai đại lượng khác nhau: `hmw.js:175` `parallel(A.taskList...)` = width; depth = *invocation hmw thứ hai* (chính spec `:100` nói vậy).
  ⇒ **fix đúng-chữ-nhưng-sai-trục**: làm xong C8 vẫn **KHÔNG** có `assert tổng-lượt ≤ trần` cho trục sâu.
- Nặng hơn: `depth-axis:43` (khoản ④) ghi rõ vượt ngân-sách ⇒ *"BỎ đào + báo RÕ (**không văng lỗi**, không lặng-thầm bỏ), trả kết-quả chiều-rộng"*.
  Spec `:98` chép đúng câu này (F4 "cận-ngân-sách LOUD") rồi `:158` yêu cầu **THROW** ⇒ **spec tự mâu thuẫn trong cùng 1 tài liệu**.
  Cùng họ với chính lệnh CẤM của spec ở `:53` (P0-1 cấm `throw` vì STOP-SILENT).
- Bối cảnh làm nó nặng thêm: `depth-cost:52` bài-học-1 *"cổng-ngân-sách tự hạ được = **máy đè lệnh owner**"* — SE có `/fable-real` = lệnh owner đích-danh;
  thêm 1 cổng ngân-sách cứng ở đúng đường fan-out là đúng lớp bệnh thư cảnh báo. (Thư này spec xếp GHI-NHẬN nên không soi bài-học-1 — xem O-4 dưới.)
- **Acceptance đề nghị:** C8 tách 2 dòng — (a) *trục SÂU*: assert `tổng-lượt ≤ trần` (trần = O-2, owner); (b) *trục RỘNG*: giữ soft-notice **hoặc** LOUD-skip
  theo `depth-axis:43`, **không** THROW. Nếu vẫn muốn THROW ở width → phải khai là **quyết-định SE vượt floor**, không được viết như "adopt khoản ①".

### 🟡 MINOR P-2 — C6 sweep hồi-tố rộng hơn floor văn bản

- `goi-chot:55` (Floor chuyển được): *"adopt khuôn-câu hai-dạng … cho mọi tài-liệu governance **mới**"*; `:53` *"cửa này chặn từ lúc **VIẾT**, không đợi tới lúc trả nợ"*;
  `:54` hub tự khai *"máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có**"*.
- Spec `:83` + C6 `:156` đòi **sweep toàn bộ doc governance SE + "đếm trước/sau"** = hồi-tố toàn corpus.
  Luật `:52` viết không giới-hạn thời-gian nên cách đọc này *không sai*, nhưng nó là **cạnh nặng nhất** của một luật mà chính hub chưa có máy,
  và đụng thẳng `goi-chot:44-45` (điểm-dừng phải rẻ) + `hub-tu-danh-gia:36` (attention owner = tài nguyên khan hiếm nhất).
- **Acceptance đề nghị:** giữ luật forward-looking là BẮT BUỘC; phần hồi-tố → time-box/mẫu (vd: doc governance sửa trong 30 ngày) + khai rõ residual, thay vì "mọi câu còn lại".

*(Đã soi và KHÔNG tính là phóng-đại: P1-1 "áp MỌI kênh spawn" khớp `spawn-label:27` khoản④ 4-loại; P1-5 audit `/pause` khớp `goi-chot:46` + `:74`.)*

---

## 2. TRỤC 2 — BỎ SÓT RÀNG BUỘC (trục nguy hiểm nhất)

### 🔴 MAJOR O-1 — `harness-dong-du-vong` khoản ③ (tuần-tự trong-vòng) KHÔNG có 1 dòng nào trong spec

- Thư `:46`: *"**Tuần-tự trong-vòng**, song-song giữa-vòng: audit **chờ đúng con đo vòng mình xong** (chống chấm bản stale); các vòng khác nhau chạy song song thoải mái."*
- Spec xếp thư này **BINDING-floor 4 khoản** (`:17`) nhưng chỉ triển khai khoản ① (P1-2) + khoản ④ (P1-3). Khoản ③ **vắng mặt** ở cả ② CÁCH IMPLEMENT lẫn checklist.
- Đây **không** phải khoản vô hại: `hmw.js:175` `const results = await parallel(A.taskList.map(...))` — **không có cơ chế tuần-tự trong 1 invocation**.
  Nếu C4 mở rộng `harness-audit` (file có thật: `.claude/agents/harness-audit.md`) sang 3 vòng và bơm chung 1 `taskList` với các con ĐO ⇒ audit chấm **bản stale/rỗng** = đúng lỗ thư vá.
  Spec đã biết tính chất này (`:100` *"`hmw.js` `parallel()` **không tuần-tự-hoá** ⇒ tầng-2 = invocation hmw THỨ HAI"*) nhưng **không** áp cùng kết luận cho vòng audit.
- **Acceptance đề nghị:** C4 thêm 1 dòng — audit của vòng X chạy ở **invocation hmw sau** con-đo vòng X (hoặc bằng chứng cơ chế tương đương), + nêu rõ vòng khác vẫn song song.

### 🔴 MAJOR O-2 — `goi-chot` khoản 2 **nửa sau** bị bỏ: SE dùng resume + đang DỰA vào model-pin

- Spec `:43` đọc **ĐÚNG** phần retire (xem trục 4). Nhưng thư còn 2 câu spec im:
  - `:38` *"Floor chuyển được: nếu bạn đang resume agent VÀ dựa vào model-override sống qua resume — **coi chừng nó không sống** … Muốn giữ resume → **tự verify trên env mình trước**"*.
  - `:66` (PROJECT-FIT) *"Khoản 2: **chỉ áp nếu bạn dùng resume/continue agent kèm model-override**"* → SE **đúng là ca ĐƯỢC ÁP**.
  - `:73` (SELF-CHECK) *"**Grep chỗ dùng resume/continue agent** — có chỗ nào đang DỰA vào model-override sống qua resume không?"* = việc rẻ, chạy được ngay.
- SE thoả đúng tiền-đề: worker-tier-pin bơm model tại spawn (`hmw.js:219` `model: resolveModel(role, raw, t && t.tier, i)`), và path-2 `SendMessage-resume` là lưới #53
  (spec `:43` khai *"đã dùng 2 lần thành công hôm nay"*). ⇒ Nếu override **không** sống qua resume thì lane được cứu chạy **model khác** mà không ai biết —
  im lặng đúng kiểu `depth-cost:53` *"thử-rồi-chết ≠ chạy-rồi-sạch"*.
- Spec kết luận "path-2 KHÔNG bị retire" rồi **dừng**, nên mất luôn nghĩa vụ kèm theo. Đây là bỏ-sót **có hậu quả**, không phải thiếu chữ.
- **Acceptance đề nghị:** thêm 1 mục P4 (rẻ): grep call-site resume + ghi 1 dòng verdict *"SE có/không dựa vào override sống qua resume"*; nếu CÓ → đo 1 lần trên env SE trước khi tiếp tục tin path-2.

### 🟠 MAJOR-nhẹ O-3 — `harness-dong-du-vong` khoản ② (propose-only) không có dòng disposition

- Thư `:45`: *"**Audit = propose-only**: trả TEXT, lead là người duy nhất ghi; kèm rào tường minh chống sub tự ghi sổ."*
- SE **nhiều khả năng đã đạt** (`hmw.js:185` `const writeGuard = …` + G-015), nên đây là lỗi **sổ sách**, không phải lỗ năng lực.
- Nhưng chính spec ra luật `:169` *"Bảng disposition **TỪNG DÒNG**, không báo số tổng"* — tuyên "4 khoản" rồi làm 2, im 2 = đúng bệnh `meta-count` S119 mà spec tự dặn tránh.
- **Acceptance đề nghị:** bảng 4 dòng/thư-binding với disposition {ADOPT / ĐÃ-CÓ + neo / N-A + lý do}.

### 🟡 MINOR O-4 — 5 khoản "dùng được ngay" trong nhóm GHI-NHẬN/KHUYẾN-NGHỊ bị rơi (cite nửa dòng)

| # | Khoản bị rơi | Neo | Ghi chú |
|---|---|---|---|
| a | `hub-tu-danh-gia:27` *"điểm tự-chấm của lead phải để **NGOÀI mọi kênh sub với tới được** — 'không đưa vào pack' chưa đủ khi sub đọc sổ chung"* + falsifier `:57` | thư | **Fire ĐỎ ngay tại run này**: spec (do lead viết) mang sẵn phán quyết `:67` "SE hiện **FAIL rõ**", `:95` "⇒ **FAIL**", `:18` "→ **SE QUALIFY**" rồi đưa cho chính reviewer chấm ⇒ anchor ngầm. Bằng chứng ngôi-thứ-nhất. |
| b | `hub-tu-danh-gia:62` *"pattern eval-3-góc (§1) + 3 câu kiểm (§6) **dùng được ngay ở mọi nhà**"* | spec chỉ trích nửa sau cùng dòng (*"điểm số và findings là của hub, không áp"*) | cite **nửa dòng** — nửa còn lại là lời mời áp |
| c | `cost-lens:50` *"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ): pattern suggest-1-dòng-non-blocking"* (+ `:44`) | spec cite đúng dòng `:50` nhưng chỉ lấy vế "KHÔNG floor" | cùng lỗi cite-nửa-dòng |
| d | `depth-cost:52` bài-học-1 *"lệnh ép-full-power của owner phải khoá cả chiều MÁY"* | thư | trực tiếp liên quan C8 (P-1) |
| e | `auto:29-31` + `:46` instrument **tự làm tươi** số-đo-đóng-băng | thư | SE có đúng vật đó: bảng cost `agents/README.md:249-257` "đóng băng" (spec `:103` tự khai) — P2-2 chỉ re-ground **1 lần**, không wire nhánh làm-tươi |

*(Nhóm này là khuyến-nghị-cấp ⇒ bỏ được, nhưng phải là bỏ **có chữ**, không phải im.)*

### ✅ Không sót (đã kiểm từng khoản)
- `spawn-label` 4/4 khoản có chỗ đứng (①→P1-1 · ②③→C3 *"0 label bị cắt chữ"* + khuôn 1 kiểu · ④→P1-1 "MỌI kênh spawn" phủ đủ 4 loại `:27`).
- `depth-axis` 4/4 khoản có mặt (F1-F4 `:94-98`), khớp `:40-43`.
- `3-khoan` 3/3 khoản có mặt (P3-2 `:47-51` · P3-3 `:31-41` · P3-4 `:19-27`).
- `goi-chot` khoản 3 (`:44-46`)→P1-5 · khoản 4 (`:52`)→P1-4 · khoản 1/5 → P4-1 + O-5.

---

## 3. TRỤC 3 — ĐIỀU KIỆN KÍCH HOẠT `depth-axis:20` → SE QUALIFY = **ĐÚNG**

Thư `:20`: *"Áp cho dự-án nào có **ensemble đa-agent / đa-lăng-kính** (nhiều model/nhiều góc nhìn chạy song song rồi **tổng-hợp**). Không có ensemble → FYI, chưa cần áp."*

Bằng chứng cơ học (không phải suy luận):
1. `hmw.js:175` — `const results = await parallel(A.taskList.map((t, i) => () => {` ⇒ chạy **song song**.
2. `hmw.js:215-219` — mỗi lane `agent(prompt, { agentType: role, …, model: resolveModel(...) })` ⇒ **đa-agent, đa-vai**, model per-lane.
3. `hmw.js:9` — *"fan-out roster ĐẦY-ĐỦ … return findings + checklistEvidence + memoryDelta"*; bước `@P3` em-main **VERIFY + harvest** ⇒ có **tổng-hợp**.
4. Run đang chạy: `/fable-clone investigator-codebase` 5 lane (spec `:5`) + trio 3-lăng-kính `.claude/agents/harness-{eval,refine,audit}.md` tồn tại trên đĩa.

⇒ 4/4 mảnh của định nghĩa `:20` có mặt. **Không phóng đại.** Kèm theo: `:20` chỉ mở cửa áp — `:55` mới là điểm sàn (*"có trục sâu bật-được + escape width-only, **KHÔNG bắt buộc default nào**"*), và spec trích đúng câu này ở `:94`.

---

## 4. TRỤC 4 — OVER-APPLY KHOẢN 2 GÓI-CHỐT → cách đọc của spec **ĐÚNG**

- Thư `goi-chot:37`: *"…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**, không phải cơ-chế bảo-toàn model."*
- Thư `:32` (tiêu đề khoản) giới hạn retire vào đúng *mục-đích* *"giữ context / chắc model"*.
- SE `SendMessage-resume` cứu #53 = resume **in-session, cùng lượt làm việc**, mục đích = vớt output của con đang sống, **không** phải giữ model/context.
  ⇒ spec `:43` kết *"path-2 KHÔNG bị retire"* = **đọc đúng**, không over-apply. Giữ nguyên lưới #53.
- ⚠️ Nhưng xem **O-2**: đúng ở vế retire không miễn cho SE nghĩa vụ `:38`/`:66`/`:73`.

---

## 5. TRỤC 5 — OWNER-GATED ĐỦ CHƯA (neo `eval:24` {AI-tự-sửa · owner-quyết-SỐ · owner-quyết-LUẬT})

**O-1…O-5 hiện có: đúng và cần.** Thiếu 2 ca, cả 2 đều rơi vào 2 cột owner:

### 🔴 MAJOR G-1 — C8 chứa **con SỐ** + **đổi CƠ CHẾ**, cả hai đều thuộc owner

- `eval:24` xếp *"đổi cơ chế, thêm gate"* = **chủ-dự-án-quyết-LUẬT**; *"ngưỡng, target"* = **chủ-dự-án-quyết-SỐ**; *"AI không tự quyết hai cột sau"*.
- C8 `:158` giao em-main biến soft-notice (`hmw.js:114-117`) thành **THROW** (= thêm gate cứng, đổi cơ chế) tại ngưỡng `<trần>` (= số).
- O-2 chỉ phủ *"giá trị clamp"* của **trục sâu**; trần **width** hiện là `16` ở `hmw.js:115` — **không** nằm trong O-1…O-5.
- Spec tự ra luật `:172` *"**Số của owner** — O-1…O-5 **CẤM** tự đặt"* ⇒ worker cầm C8 sẽ hoặc bịa số, hoặc kẹt. **Mâu thuẫn vận hành.**
- **Acceptance đề nghị:** C8 gắn nhãn `BLOCKED-by-O-2`, và bổ sung `O-6 = trần width + cơ chế (throw hay LOUD-skip)`.

### 🔴 MAJOR G-2 — C12 ghi **posture đang bật** vào `CLAUDE.md` = ghi trạng-thái TOGGLE vào file luật

- Đo tại đĩa: `grep "HMW-mode" CLAUDE.md docs/CLAUDE.md` ⇒ **0 hit** (lỗ spec nêu ở `:121` là **CÓ THẬT**).
- Nhưng HMW-mode là **toggle owner-consent**, không phải mặc-định thường-trực:
  - `.claude/commands/ultra-on.md:2` — *"BẬT HMW-mode … **Gõ = anh CONSENT chạy Workflow (deliberate on-ramp)**"*;
  - `.claude/commands/ultra-off.md:9` — *"**xóa marker** `.claude/hmw-mode.on` … `/session-start` kế báo **OFF**"*.
- `3-khoan:39` chỉ áp cho *"chỉ-thị nào **đổi hành vi mặc định của mọi phiên về sau** (operating-posture)"*. Trạng thái bật/tắt **theo phiên** không thuộc lớp đó.
- Viết thẳng "HMW-mode ON" vào file-đọc-đầu-tiên ⇒ (i) **sai ngay khi owner gõ `/ultra-off`** (drift by construction), (ii) biến một **cửa consent của owner** thành **default có văn bản** = owner-quyết-LUẬT, (iii) trái B1 (derived trỏ canonical, không chép giá-trị).
- **Acceptance đề nghị:** C12 đổi thành *"CLAUDE.md có **1 dòng trỏ NƠI xem posture hiện hành** (marker `.claude/hmw-mode.on` + `/session-start`), KHÔNG chép giá-trị ON/OFF"*; nếu owner muốn HMW-mode thành mặc-định thường-trực → đó là O-mới, hỏi anh.

### 🟡 MINOR G-3 — vài số nhỏ khác tự đặt
`:58` *"≤3 file/lane"* (P0-2/C2) là **ngưỡng** do AI đặt. Rủi ro thấp (kỷ luật nội bộ, đảo được), nhưng spec đã gate `min_pending_shards` (O-1) nên bỏ trống ca này là **bất-nhất**.
Nêu 1 dòng "AI-tự-đặt, đảo được" là đủ.

---

## 6. Ghi chú công bằng (những chỗ spec làm ĐÚNG, chống Smart-Friend ngược)

- **10/10 neo trong bảng ① khớp verbatim** khi mở thư gốc — tao kiểm từng dòng: `spawn-label:22` · `harness:42` · `depth-axis:38`+`:20` · `goi-chot:44-45/:52/:29/:37/:59` · `eval:13` · `auto:43-47` · `3-khoan:15` · `cost-lens:50` · `depth-cost:63` · `hub-tu-danh-gia:62`. Không có neo bịa.
- 3 thư tự khai *"KHÔNG floor"* (`cost-lens:50` · `depth-cost:63` · `hub-tu-danh-gia:20/62`) được xếp GHI-NHẬN ⇒ **không** ép SE làm việc hub không đòi.
- `eval-quality` xếp KHUYẾN NGHỊ dù `:13` nói *"Khung = sàn chức năng"*: lệch **hướng nới**, nhưng thư **không** có mục "Nấc adopt" và **0** câu `/adap-apply` ⇒ chấp nhận được; và spec vẫn giao C10 với acceptance có răng (*"bịa input sai → nó ĐỎ"*).
- Phát hiện `:177` (goi-chot **không** có "Nấc adopt", 0 `/adap-apply` dù binding nhất) — tao **xác nhận đúng**: mở thư, không có mục nào tên "Nấc adopt", không có chuỗi `/adap-apply`. Đây là quan sát tinh, đúng loại chống-lệch-bảng-nấc.
- `hmw.js:225` `return results.filter(Boolean)` — **đúng nguyên văn**; P0-1 chẩn đúng, và lệnh CẤM-throw của nó khớp comment `hmw.js:124-125`.

---

## 7. Danh sách chốt

**{phóng-đại}**
1. `P-1` MAJOR — C8 (`spec:158`) ép trần lên **width** `taskList.length` trong khi `depth-axis:40` nói **tổng-lượt trục sâu**; và **THROW** trái `depth-axis:43` *"không văng lỗi"* + trái chính `spec:98`.
2. `P-2` MINOR — C6 (`spec:156`) sweep **hồi-tố toàn corpus** trong khi floor `goi-chot:55` viết *"mọi tài-liệu governance **mới**"* và `:54` khai hub **chưa có máy**.

**{bỏ-sót}**
1. `O-1` MAJOR — `harness-dong-du-vong:46` khoản ③ **tuần-tự trong-vòng** (chống chấm bản stale) — 0 dòng trong spec; `hmw.js:175` không tuần-tự-hoá ⇒ rủi ro thật cho C4.
2. `O-2` MAJOR — `goi-chot:38` + `:66` + `:73` — SE dùng resume + dựa model-pin (`hmw.js:219`) ⇒ phải **tự verify override sống qua resume**; spec dừng ở "không bị retire".
3. `O-3` MAJOR-nhẹ — `harness-dong-du-vong:45` khoản ② propose-only: không có dòng disposition (dù `hmw.js:185` writeGuard nhiều khả năng đã đạt) — vi phạm chính `spec:169`.
4. `O-4` MINOR ×5 — `hub-tu-danh-gia:27`+`:57` (anchor điểm-tự-chấm, **fire đỏ ngay run này**) · `hub-tu-danh-gia:62` · `cost-lens:50` khoản③ · `depth-cost:52` bài-học-1 · `auto:29-31`+`:46` (instrument tự-làm-tươi).

**{owner-gate thiếu}**
1. `G-1` MAJOR — C8: trần width + cơ chế THROW = owner-SỐ + owner-LUẬT (`eval:24`), chưa có trong O-1…O-5.
2. `G-2` MAJOR — C12: ghi giá-trị posture TOGGLE (`ultra-on.md:2` / `ultra-off.md:9`) vào `CLAUDE.md` = owner-LUẬT + drift-by-construction.
3. `G-3` MINOR — `spec:58` "≤3 file/lane" là số AI tự đặt (chấp nhận được nếu khai).

**Điều kiện để lên PASS:** đóng `P-1`, `O-1`, `O-2`, `G-1`, `G-2` (5 mục) — mỗi mục 1 dòng sửa trong spec, không mục nào đòi code.
