# sub-reviewer-fable-spec — REVIEW-GATE spec v1 adap wave đợt-9/10 (S141, 2026-07-20)

> Vai: reviewer (fable-real single-lane, engine-đắt lệnh-A). Đề-bài: adversarial deep-pass spec v1 (bản đĩa `spec-adap-dot-9-10-20-07-2026.md` 14 468B = authoritative; bản inline task = nén, nhất quán). 5 trục: FIDELITY khuôn hub · CONSISTENCY floor SE · OMISSION · ACCEPTANCE đo-được · RISK chưa khai. Ghi TRONG LÚC LÀM (anti-#53).

## VERDICT: GO-WITH-FIXES — 0 Critical / 7 Major / 9 minor

Spec đứng được: khuôn trio 5-câu + contract ①a + carve-out + stamp + annex đều bám thư hub sát (nhiều chỗ siết thêm đúng hướng: pin-missing→TRƯỢT, FI 2-chiều, TRIPLE-17 chống xoá-README). 7 Major đều fix-được bằng sửa spec ≤1 câu/điểm, không đổi kiến trúc.

## Evidence base (đã chạm đĩa, không tin trí nhớ)

- 7/7 thư inbox đọc trọn: `58e28bae` (trio 5-câu + 4-khoản C) · `9a35405b` (carveout-dp2 khối 1-6) · `6239dd40` (stamp-decode) · `dede7ec5` (đính-chính tick + annex + design-note) · `101e69d6` (session-model kit + manifest 4 khoản + thang 5 nấc) · `d68de5e7` (precedence delta) · `9cd1a486` (nudge).
- Floor đĩa: session-start.md §2.1.2/§2.1.8 (:127-208) · session-end.md §L.b (:52-113) + :142 · `.claude/governance/.session-counter.json` (counter=15, S141 đã tick, history 5 entry, 3 ca FAIL-LOUD S127/S133/S139) · memory-budget.json (measured 14 row + h24_cadence 6/15/3 + C1-list) · hmw.js :22-36/:41/:55/:178-195 · lead-view-auditor.md:1-11 (mẫu frontmatter khớp 100% A1) · check-email.md:17 · send-email.md:28-32 · error-ledger.md:38-42 · governance-detectors.ps1 (:38 RepoRoot · :65-68 INFORM-sink owner-set · H24-1/2/3 + H24-4 sink → tên H24-5 TRỐNG) · agents/README:3/:5/:222 · engine:345 · vocab:51 · workflows/README:64.
- Re-đo độc lập: `git log da349fc` = **2026-07-17 19:12:41 +0700**, label "S135-S136" (force-fire trong message) → mốc annex ĐÚNG ngày; "S135" = item-label đúng (§L.b(j)(vi) "Item 3 S135"). · Sweep roster: bắt 2 site sống NGOÀI spec (dưới, M3) · Sweep "9 roster": chỉ workflows/README:64 ✓ · Sweep precedence stale-label: **0 hit sống** ✓ spec claim đúng · `AI_INFRA/scripts/stamp_verify.py` TỒN TẠI (2 247B, Jul-3) — đọc trọn: regex tolerant `"?([0-9a-fA-F]{8,64})"?` :15 + 2-variant :38-39 + prefix-match :42 + exit-code ✓ đúng như thư mô tả → port verbatim khả thi.

---

## MAJOR (7) — fix trước khi implement

**M1 [B2↔B3↔khuôn ①a] Detector H24-5 thiếu nhánh counter-regress mà FI ca-2 lại kỳ vọng FLAG khi giảm-counter.**
B2 classify: is-ancestor→OK · cat-file=commit→SQUASH-BENIGN · else→FLAG object-missing; "Counter-regress check optional param" (spec:34) không formula, không nói FI bật param. B3 (spec:36): "ca-2 fake-sha 000…0 (+biến thể giảm counter) → KỲ VỌNG FLAG" — biến thể giảm-counter giữ sha reachable ⇒ đường B2 as-written ra OK-reachable 0-FLAG ⇒ **acceptance ③7 "FI 2/2 PASS" bất khả thi hoặc bị né bằng cách chỉ test fake-sha** (Goodhart: test biến-thể dễ đậu). Khuôn ①a: "counter-lùi ⇒ FAIL-LOUD như cũ" — lớp chống giả-mạo. Static-check khả thi read-only: FLAG khi `counter < last_audit.light_at_counter ∨ counter < last_audit.deep_at_counter` (đĩa hiện tại 15 ≥ 14/3 → repo thật vẫn 0-FLAG ✓ ③7 giữ được). **Fix:** quy định regress-branch DEFAULT-ON với formula trên (bỏ "optional param"), FI ca-2 chạy CẢ 2 biến-thể.

**M2 [B2 ↔ governance-detectors.ps1:65-68] FLAG-vào-TOTAL ngày-một mâu thuẫn luật owner-set "detector MỚI vào INFORM-sink".**
:65-68: "INFORM-only flag sink for NEW detectors (C6, H24-4)… a brand-new net whose LOW hits are read by judgement on day one must not move the audited TOTAL" (anti-Goodhart, owner-set). Spec:34 quyết ngược: "object-missing = FLAG thật vào TOTAL". Có đường biện hộ (H24-5 MED + deterministic ≠ "LOW hits read by judgement") nhưng spec KHÔNG reconcile với luật đó. **Fix (1 trong 2):** (a) day-one vào INFORM-sink, promote vào TOTAL sau lượt chạy sạch (răng không mất — contract §2.1.8(b) runtime vẫn FAIL-LOUD); (b) giữ TOTAL nhưng ghi rõ lý-do phân-biệt class + đưa vào Chờ-anh (luật owner-set → owner quyết override).

**M3 [A6 + acceptance ③4] Sweep sót 2 site sống + acceptance tự-giới-hạn "trên các file sửa" = Goodhart-able by construction.**
Grep độc lập bắt: `session-start.md:97` + `session-end.md:142` — cả hai mang "**10 product/quality + 4 monitor INFORM-only**" (đọc MỖI phiên, sống) — KHÔNG có trong danh-sách A6 (inline lẫn disk). ③4 đo "grep trên các file SỬA = 0" ⇒ site ở file CHƯA-sửa vô hình by construction (đúng bệnh "đo cái dễ đo" §L.b(f) đã tự ghi trong repo). **Fix:** +2 site vào A6; acceptance ③4 đổi thành grep REPO-WIDE trừ frozen-history (`archive/ runs/ sessions/ adap-reports/ broadcasts/ agent-memory/`) = 0 hit sống; cân nhắc +3 bullet trio vào khối topology session-start §2.1 (:98-113) + session-end Phase-1 (:36-39).

**M4 [A4/A5 — consent + Light-skip = carve-out chưa khai, 0 lưới]**
Hub câu-3 floor: "chạy ĐỦ CẢ HAI ĐẦU mỗi phiên-LOGIC" (consent-form nhóm được giữ). SE thêm: anh-gật-mới-chạy + "Light → skip hợp lệ" + KHÔNG cadence-key ⇒ chuỗi phiên anh không gật / Light liên tiếp → trio không chạy mà KHÔNG một dòng nợ nào hiện (nhip-no-probe không phủ trio — by design). Đây đúng CLASS carve-out ô3, mà ô3 được hub CONFIRM chỉ ở nấc "PASS-với-carve-out" NHỜ 2 lưới sống (9a35405b khối 2: rủi-ro mới = "chủ quên gật mà không ai kêu"); trio-carve-out hiện 0 lưới. **Fix rẻ:** (i) proposal-line in CẢ khi Light (skip = thấy-mà-không-gật, không phải im lặng); (ii) skip ghi 1 dòng vết session-log/WAL `trio: skipped <lý-do>` (hậu-kiểm đếm được, cùng họ phép-8); (iii) adap-report khai nấc "PASS-với-carve-out (consent + Light-exempt)", KHÔNG tự khai đủ-floor.

**M5 [Process — adap-report / email báo-nấc / STAGE-2 vắng khỏi spec + acceptance]**
Precedence d68de5e7 §5 đòi "tự-báo nấc kể cả 'đã re-verify, không đổi'"; manifest 101e69d6 có thang 5-nấc per-khoản; channel-contract SE (check-email.md STAGE-2 :20-22 + §J2) đòi move processed + `_index`. Spec chỉ nhắc adap-report 1 lần (defer-note hướng-(i), spec:46). Prior waves S137/S139 đều ship adap-reports + email hub. **Fix:** thêm bước "em-main @closeout: 7 disposition adap-report (kể cả SKIP/no-change) + email báo-nấc + STAGE-2 move + _index" + acceptance ③14 đếm được (7/7 disposition tồn tại).

**M6 [A5(i)] Thêm §L.b(k) mà không sửa header range "(a)→(j)".**
session-end.md:52 "auto-maintain **(a)→(j)** (đủ HẾT, KHÔNG skip…)" = range-token sống; :53 CHÍNH LÀ ghi-chú vá class này ("Nhãn cũ ghi 8-step trong khi thân (a)→(i)=9 — view-stale-count… KHÔNG chép số vào nhãn"). Giữ "(a)→(j)" thì (k) đọc thành ngoài-danh-sách-bắt-buộc → skip-able. **Fix:** header → "(a)→(k)" hoặc đúng tinh thần :53 bỏ range; tuỳ chọn thêm mapping "(k) = trio" cạnh "(j) = H24" ở :52.

**M7 [B6] Half-fix: prereq (a) "hub phát mẫu áp dụng" CŨNG đã về — chỉ flip (b) làm draft tự-mâu-thuẫn.**
Draft §4 (đọc đĩa): "không bật trước khi: (a) hub phát mẫu áp dụng, (b) khuôn bộ-ba SUB về, (c) anh duyệt VC". Kit 101e69d6 = "bộ kit + manifest" = mẫu áp dụng — về cùng đợt với 58e28bae; chính B6 trích K4/session_ctx_kb/meld-gap TỪ kit đó. Sau edit-(b), (a) vẫn treo "chờ hub" = stale đúng class spec đặt ra để vá. **Fix 1 dòng:** flip (a) "✅ ĐÃ VỀ 2026-07-18 (101e69d6 — kit + manifest 4 khoản; §5-Q4 van-ngưỡng CHƯA được trả lời)". (c) giữ treo ✓.

## minor (9)

- **n1** A1 "param SE từ chối full-id" = claim CHƯA-ĐO — hmw.js:51 tự khai "CHƯA AI THỬ THẬT (fix#8a)"; doc nói enum-alias. Deviation alias-vs-full-id vẫn ĐÚNG (policy S124 + alias = dạng ĐÃ-test per d68de5e7 caveat; full-id n=0) nhưng wording phải hedge + khai form-deviation trong adap-report.
- **n2** A7 thiếu cập-nhật `measured._note` addendum (tiền-lệ S138 "+2 row H24 đo TƯƠI" ghi trong _note) → thêm "S141 ADDENDUM +3 row trio".
- **n3** B1 "_tick_invariant_note: NET +1/label ≡ hub +1/cặp" — tương-đương chỉ trên cặp ĐÃ ĐÓNG; cặp đang-mở: hub-form +1 (chốt tại dừng) vs SE-form +0 (chờ nối) = lệch transient. Hub đã bless hành-vi (9a35405b khối 1: "chỉ cần re-sync câu-chữ, không phải đo lại") → thêm nửa câu khai transient để auditor sau không đọc thành tick-site-identical.
- **n4** refine "mục đã-BÁC (≥0 dòng)" — "≥0" cho phép luôn-rỗng = tự vô-hiệu mục-đích chống-nghi-thức-rỗng (58e28bae câu 1). Đổi: mục PHẢI hiện diện; 0-item → khai "không có ứng-viên bị bác".
- **n5** refine KHÔNG được pin run-folder đích-danh (audit có, refine không) + không fail-closed khi `harness-eval-return.md` vắng → spawn sai thứ-tự/sai folder = đọc bản cũ/bịa. Mirror rule audit: lead truyền path + input-missing → TỪ-CHỐI.
- **n6** engine:345 cite "hmw.js VALID_ROLES `:22-36`" — A3 chèn 3 dòng làm range stale (→ ~:39). Sửa hint hoặc bỏ line-hint (chuẩn "NO line-hints" đã có ở memory-budget pointer_style).
- **n7** B5 verify chỉ chạy biến-thể quoted (đúng incident-class S141) — thư mục-5 test 3 biến-thể; thêm 1 synthetic không-ngoặc/8-hex hoặc khai chỉ-test-quoted.
- **n8** agents/README:5 "đổi số" (+4→+7) trong khi README:3 tự ghi "Vá @S122 bằng BỎ số, không phải ĐỔI số — đổi số thì roster kế lại stale". Hoặc chuyển form bỏ-số, hoặc giữ đổi-số + 1 dòng lý-do (structural split có giá trị đọc) — hiện spec im lặng trước tension của chính file đích.
- **n9** writeGuard :187 + comment :180-181 enum read-only hiện ĐÃ thiếu lead-view/omission (drift sẵn có từ S121) — thêm trio mà không hoàn-thiện enum = bảo-tồn drift; nhân tiện thêm đủ 2 vai H24 hoặc degrade enum → mô-tả-class.

## Trục-5 RISK — các câu hỏi task đặt, trả lời có bằng chứng

| Câu hỏi | Trả lời | Evidence |
|---|---|---|
| B6 vi phạm carry #13(c) KHÔNG-wire? | **KHÔNG** — edit = truth-up prereq trong draft (doc-only), 0 cơ-chế wire; #13(c) cấm WIRE. Còn M7 half-fix | draft §4 + spec:42 "KHÔNG wire gì khác" + ③10 diff-scope |
| Consent-form trio | Carve-out chưa khai + 0 lưới → **M4** | 58e28bae câu-3 vs spec:22 |
| TUẦN TỰ = kỷ-luật-người? | Audit đã fail-closed (pin-missing→TRƯỢT) = chốt máy; refine chưa → **n5** | spec:16 vs :15 |
| H24-5 FLAG-vs-INFORM | **M2** (luật :65-68 owner-set) + **M1** (regress-branch) | detectors.ps1:65-68 |
| Mốc da349fc | ĐÚNG: 2026-07-17 19:12:41 +0700; label commit "S135-S136", item-label S135 đúng (§L.b(j)(vi)) — nano: có thể ghi "S135-S136 closeout" | git log da349fc |
| Ranh refine⟂lead-omission đủ sắc? | Đủ như spec (discriminator WHOSE-memory: LEAD hot-feed/carry = omission · AGENT corpus = refine); ratify pending đúng chỗ Chờ-anh-1; reinject-ledger dùng chung 2 phía là điểm cần ratify nêu rõ | spec:15 + session-start:112 |
| A7 vi phạm no-hand-edit? | **KHÔNG** — đo-bằng-script rồi chép số THẬT = đúng tiền-lệ S138 ADDENDUM (+2 row H24 "đo TƯƠI"); rule cấm sửa-không-đo. Còn n2 (_note) | memory-budget.json:2/:143 |
| Mirror C1 cấm ghi memory-budget/counter NGAY BÂY GIỜ? | **KHÔNG có cửa-sổ đo active** — C1 window mở "từ script đo đầu-tiên khối (c) closeout tới verdict cuối" (§L.b(c)); trio chưa từng chạy (first-run phiên sau ③12); wave edits land mid-session TRƯỚC closeout ⇒ hợp lệ. Ghi 1 dòng thứ-tự "A7/B1 land trước khối (c)" là đủ | session-end:56 + session-start:135 |

## Fidelity tally 7 thư (trục-1)

1. **58e28bae** khối B câu 1-5 → A1-A5: FAITHFUL (4-lớp refine, chốt-dừng, đã-BÁC, PIN đích-danh, ≥2 số re-run, scribe-ngay, 2-tầng máy-đo→sub-phán, ranh 4 vai, khuôn (a)-(d) + 2 caveat). 2 deviation có chủ-đích: model-alias (n1, justified) + Light-skip (M4, phải khai). Khối C① khuôn contract → B1/A4(i) khớp từng điều-kiện; ② edits-land-trước-review = đã là floor SE (feedback S139); ③ rename ACK n/a; ④a hứa-máy — spec này không thêm câu "máy sẽ quét" nào thiếu mã (H24-5 = mã thật kèm FI) ✓; ④b n/a.
2. **9a35405b** khối 2 → B4 FAITHFUL (2 lưới đúng danh: nhip-no-probe + H25; "nên tụt"→"tụt" = siết, hợp lệ; basis + live-evidence S139→S140 đúng hướng). Khối 3 → hướng (i) DEFER khai trong adap-report + (ii) đã được thay bằng khuôn ①a APPROVED (đến sau, thắng) ✓; carry-đặt-tên đã làm S137 ✓.
3. **6239dd40** → B5 FAITHFUL: regex verbatim thư :37; byte-safe SE đã có từ S125 (check-email:17); lỗ THẬT còn lại = extraction quote-strict (incident S141 suýt-oan 3/3, investigator-diary xác nhận) → pin mẫu + port script = đúng thuốc. n7.
4. **dede7ec5** → B1 note + A5(ii) annex FAITHFUL (baseline khai-1-lần, FAIL chỉ closeout sau mốc, n/a trước mốc, không lặp); design-note log-BOUNDED phản ánh đúng (history[] append-unbounded VERIFIED trên đĩa — 5 entry không cap). n3.
5. **101e69d6** → B6 đúng scope KHÔNG-wire (kit adopt chờ VC = hợp lệ manifest "đã-đồng-ý" pending); M7 prereq-(a).
6. **d68de5e7** → "0 site sống" VERIFIED bằng grep độc lập (0 hit); nghĩa vụ còn lại = record re-verify vào adap-report (M5).
7. **9cd1a486** nudge → ACK-only ✓.

## Acceptance ③ per-dòng (trục-4)

1 ✓ đo được (grep frontmatter + non-empty) · 2 ✓ TRIPLE 3-nguồn + anti-Goodhart cấm-xoá-README (bài #48 R2-C1) · 3 ✓ grep-able · **4 ✗ Goodhart-able (M3)** · 5 ✓ falsify = re-run script so JSON · 6 ✓ ConvertFrom-Json exit · **7 ✗ ca-2 giảm-counter bất khả thi as-spec'd (M1)**; vế repo-thật OK-reachable deterministic trong phiên (head 4c43d74 = ancestor tới khi closeout-squash) · 8 ✓ · 9 ✓ + fallback python-vắng khai thật · 10 ✓ (nửa "0 wire khác" đo bằng diff-scope file draft) · 11 ~ judgement-bounded (diff output trước/sau, flag mới từ roster/STATUS edits dự-kiến C2) · 12 ✓ nấc executed-file/verified-pending-restart = khai thật đúng G-011 · 13 ✓ E-006 backstop. Thiếu: ③14 process (M5).

## Disposition bảng TỪNG finding

| ID | Khối | Mức | Fix 1-dòng | Blocking? |
|---|---|---|---|---|
| M1 | B2/B3/③7 | MAJOR | regress-branch DEFAULT-ON formula `counter < last_audit.*_at_counter` + FI ca-2 chạy cả 2 biến-thể | CÓ (③7 bất khả thi nếu không) |
| M2 | B2 | MAJOR | day-one INFORM-sink HOẶC khai override + Chờ-anh-4 | CÓ (luật owner-set) |
| M3 | A6/③4 | MAJOR | +session-start:97 +session-end:142; ③4 grep repo-wide trừ frozen | CÓ (mục tiêu (E) vỡ nếu không) |
| M4 | A4/A5 | MAJOR | proposal-line in cả Light + vết-skip 1 dòng + adap-report khai carve-out | CÓ (floor-deviation phải khai trước khi báo hub) |
| M5 | ①/③ | MAJOR | +bước em-main @closeout: 7 disposition + email + STAGE-2 + _index; +③14 | CÓ (channel-contract) |
| M6 | A5(i) | MAJOR | header §L.b "(a)→(j)"→"(a)→(k)" hoặc bỏ range | CÓ (cùng commit với (k)) |
| M7 | B6 | MAJOR | flip prereq (a) ĐÃ VỀ (101e69d6) + note Q4 chưa trả lời | CÓ (cùng edit B6) |
| n1 | A1 | minor | hedge "chưa thử full-id (hmw.js:51)" + khai deviation adap-report | không |
| n2 | A7 | minor | +1 câu measured._note "S141 ADDENDUM +3 row" | không |
| n3 | B1 | minor | +nửa câu khai transient-lệch cặp-đang-mở | không |
| n4 | A1-refine | minor | "≥0 dòng" → "mục PHẢI hiện diện, 0-item khai lý-do" | không |
| n5 | A1-refine | minor | pin path cho refine + input-missing→TỪ-CHỐI | không |
| n6 | A6-engine | minor | sửa/bỏ line-hint ":22-36" | không |
| n7 | B5 | minor | +1 test synthetic không-ngoặc/8-hex hoặc khai scope | không |
| n8 | A6-README:5 | minor | chọn form bỏ-số hoặc ghi lý-do giữ đổi-số | không |
| n9 | A3 | minor | hoàn-thiện enum read-only (+2 vai H24) hoặc degrade | không |

*(Blocking "CÓ" = nên fold vào spec TRƯỚC khi phát lệnh worker — tất cả đều là sửa-spec ≤1 câu, không phải redesign. n1-n9 fold lúc implement được.)*

## Đã-thử-phá mà ĐỨNG (positive validation — để không chỉ toàn gạch)

- TRIPLE-17 + cấm-xoá-README: chống đúng catastrophic-Goodhart #48 (adap-report 2026-07-14 :48) ✓
- FI 2-chiều trên cây tạm -RepoRoot: đúng feedback_faultinjection (FLAG đúng ca lỗi + IM-có-vết đúng ca squash) — detector script đã có hạ-tầng -RepoRoot + bài-học slug :398-409 ✓
- Mirror C1 tái-dùng (0 cơ-chế mới): freeze-set canonical §L.b(c) đã phủ đủ mọi bề-mặt instrument đọc (agent-memory/** ⊇ memory-budget.json; counter; agents/*.md) ✓
- ③12 nấc executed-file/verified-pending-restart: đúng thang G-011 + registry-probe BƯỚC 0.6b có sẵn ✓
- KHÔNG cadence-key cho trio = FAITHFUL hub câu-3 "không counter đến-hạn nữa" (đây không phải lỗi — lỗi là thiếu vết-skip, M4) ✓
- "0 site sống precedence" + "K1 gitignore PASS" + nguồn port stamp_verify.py: cả 3 claim của invest-lane RE-VERIFY độc lập ĐỨNG ✓

— reviewer, S141 2026-07-20. Token-cost ước: ~120K in / ~12K out tới điểm ghi file này.
