# spec — 3 khoản owner-gated #17 (O-2) / #18 (O-3) / #19 (O-7)

> **Pipeline anh chỉ định:** `/fable-clone invest` (8 lane, xong) → `/fable-real invest` (deep-pass, xong `wf_5ee94a60-784`) → **spec này** → `hmw` Opus MAX implement.
> **Nấc H21:** engine propose → **lead verify** → **lead ghi (file này)** → worker thực-thi theo con-trỏ spec.
> **Lead đã verify tay 4 khẳng định load-bearing** trước khi ghi (§0). Nguồn propose: `sub-invest-owner-gated.md` (20.451B).

## §0 — Lead verify (đo lại, KHÔNG chép claim của engine)

| # | Khẳng định engine | Lệnh lead chạy | Kết quả |
|---|---|---|---|
| 1 | `WIDTH_CAP = 16` + LOUD-skip đã land | `sed -n '112,134p' hmw.js` | ✅ đúng (nay ở `:135` sau khi chèn đính-chính) |
| 2 | VALID_ROLES = 20 | đếm token `hmw.js:22-41` | ✅ **20** |
| 3 | 0 drift-check width | `grep -ril 'width' scripts/` | ✅ **0** |
| 4 | Attribution "owner chốt O-7" lệch | grep 4 nguồn (dưới) | ✅ **XÁC NHẬN LỆCH** |

**Chi tiết (4):** `hmw.js:116/:120` cũ ghi *"owner chốt O-7 2026-07-22"* ×2 ⟂ `HANDOFF` ghi *"chưa ai duyệt"* + *"số = owner-SỐ"* · `STATUS` ghi *"câm 5 nhãn"* · `grep 'O-7.{0,60}(anh chốt|owner chốt|đã duyệt|ratif)'` toàn `docs/` + `.claude/governance/` = **0 dòng** · `h24-audit` @S149 chấm FLAG này **ĐẠT/HELD** (F2+F3 HELD).
✅ **ĐÃ VÁ @S149** — comment sửa thành khai đúng nguồn (adopt-theo-floor), `node --check` OK, `WIDTH_CAP` giữ nguyên giá trị.

🔴 **Lead SỬA acceptance K7 của engine.** Engine đề xuất `grep -c "owner chốt O-7 2026-07-22" = 0`. **Thước này TRƯỢT OAN bản vá đúng**: dòng đính-chính buộc phải **trích lại** chuỗi sai để nói nó sai ⇒ grep = 1. Đúng class `citation-trap self-reference` (S123: doc định-nghĩa anti-pattern tất yếu chứa mẫu đó). **Discriminator đúng = enclosure (use ⟂ mention)**, không phải khớp-chuỗi trần → xem K7 mới ở §③.

---

## ① Đề-bài

Đóng 3 khoản trong bảng owner-gated `O-1…O-7` (`runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026-v2.md:88-97`, dựng @S144) đã **câm 5 nhãn phiên** (S144→S149) — 0 hit trên 5 bề-mặt owner + 0 session-log.

### #17 = O-2 — posture trục-SÂU + trần tổng-lượt
🔴 **Phát hiện nguồn-gốc:** văn bản gốc **KHÔNG phải** `goi-chot-owner-nam-khoan` (engine đọc trọn 92 dòng: 5 khoản = {default-Opus-MAX, retire-resume, cửa-dừng-thông, lời-hứa-máy, pool≠pin} — **0 khoản về trục sâu**). Nguồn thật = broadcast **`depth-axis`** (sha `f05eba5b`), floor `:40` *"Trục sâu = owner-gated… clamp trần cứng + assert tổng-lượt ≤ trần"*; phạm-vi `:20/:47` *"Không có ensemble → chưa cần áp"*.
**Hiện trạng SE:** `hmw.js` = **width-only**, 1 `parallel()` duy nhất (`:192`), **0 tầng-2 trong máy**. Nhưng **depth ĐÃ tồn tại NGOÀI máy** dạng owner-gated: pipeline 3-bước đang chạy chính phiên này · `/fable-real` per-invocation.

### #18 = O-3 — vai-KIỂM cho "các vòng còn thiếu"
**Đo đĩa: TẬP RỖNG.** Bảng gate `session-end.md:170-176` — V1→`tooling-harvest-audit` · V2→`h24-audit` · V3→`harness-audit` · V4→`sleep-audit` · V5 **floor-không-vai** (hub verbatim `harness-dong-du-vong:24`). VALID_ROLES đủ 20 vai.
⇒ **Không cần build gì.** Còn đúng **2 câu ratify**.

### #19 = O-7 — trần WIDTH
**Cơ-chế ĐÃ land** + fault-inject **7/7 @S144**. Treo thật = **2 mảnh**: (a) SỐ 16 chưa ratify · (b) attribution sai — **(b) đã vá @S149**.
🔴 **Tension chưa ai ghi nhận:** cap **16 < roster 20** ⇒ sweep toàn-roster kiểu S125/S126 nay **bị cắt 4 lane**.

---

## ② Cách implement

### #17 — 3 posture, owner chọn 1 (có-dựng-hay-không = **owner-LUẬT**)
- **A · KHÔNG DỰNG** ⭐ *engine khuyến nghị, lead đồng ý* — giữ width-only + depth qua owner-gated per-invocation. Việc: O-2 → RESOLVED, C8a → N/A-by-posture. **0 dòng code.** Căn cứ: `depth-cost:44-46` đo mode "thật" thắng ở **1/10 giá**; SE đã có mode thật owner-gated.
- **B · args-tally trần xuyên-invocation** — `TRẦN_TỔNG` = **owner-SỐ**. Data nền: per-invocation max **14** (S126) · Σ-per-run-id max **16** (S127, đếm đĩa). Rủi ro: tự-feed Goodhart ⇒ cần detector recount độc lập.
- **C · port full engine** — ❌ **BÁC**: `depth-cost` ≈**10-11×**/run + **9 defect** hub ăn ngay lần chạy đầu.

### #18 — 2 câu ratify, 0 build
- **(a)** V5 giữ **floor-không-vai**? 🔸 Điểm yếu V5 là **COUNTER thiếu** (không máy nào đếm "1 nhãn bị chặn/phiên" — row 18 bảng bước-1), **không phải thiếu ROLE** ⇒ đừng nhét vào O-3.
- **(b)** Luật cho vòng-đo **MỚI** (ca đầu: eval-use C5 đang DEFER): **【1】 mặc-định TÁCH, land cùng đợt** ⭐ *khuyến nghị — đóng O-3 vĩnh viễn* · 【2】 per-case (giá = tái tạo đúng pattern câm-5-phiên).

### #19 — khi owner ký
1. Số vào `memory-budget.json` key `hmw_width {cap, mechanism, ratified}` — precedent O-1/O-6 sống đúng file đó (`:13-14`).
2. `hmw.js WIDTH_CAP` giữ **hardcode = MIRROR** (sandbox no-fs `:5`, không đọc json runtime được) + comment trỏ canonical.
3. **Drift-check** vào `governance-detectors.ps1`: regex `const WIDTH_CAP = (\d+)` vs json, lệch ⇒ FLAG.
4. Nếu **số đổi** → re-run fault-inject 2-chiều. Giữ 16 thì **không redo** (đã 7/7 @S144).

**Cơ-chế (owner-LUẬT) — khuyến nghị GIỮ LOUD-skip:** `depth-axis:43` verbatim *"không văng lỗi, không lặng-thầm bỏ"* · per-lane throw bị nuốt thành null = **STOP-SILENT** tệ hơn (bằng chứng first-person `wf_491c05a8`) · `/fable-real` là lệnh owner đích danh, máy chặn cứng lệnh owner = đúng bệnh `depth-cost:52`.

---

## ③ Checklist

| # | Vai | Deliverable | Acceptance ĐO ĐƯỢC |
|---|---|---|---|
| **K1** | 🔒 **owner** | chọn posture #17 A/B/C (+`TRẦN_TỔNG` nếu B) | vết chữ owner ≥1 bề-mặt: `grep -c 'O-2' <ACTIVE-MARKS\|session-log>` ≥1 — hết "câm 0/5" |
| K2 | em-main | (nếu A) O-2 RESOLVED + C8a→N/A-by-posture | `grep -rn 'BLOCKED-by-O-2' <spec-mới>` = **0** · posture ghi ≥1 dòng ở `harness-11-engine.md` |
| K3 | em-main + implementer | (chỉ nếu B) `args.lanesSoFar` assert + detector recount | fault-inject: `lanesSoFar=TRẦN` → LOUD+skip · Σ>TRẦN → detector FLAG · Σ=TRẦN → 0-flag |
| **K4** | 🔒 **owner** | ratify #18 (a) V5-no-role + (b) luật 【1】/【2】 | như K1, token `O-3` |
| K5 | em-main | O-3 RESOLVED + 1 dòng luật ở home vai-KIỂM | `sed -n '170,176p' session-end.md` giữ đủ 5 dòng con-KIỂM · luật grep ra **đúng 1** home |
| **K6** | 🔒 **owner** | ký #19 {cap, cơ-chế} | `grep -n 'hmw_width' memory-budget.json` = 1 block {cap·mechanism·ratified} |
| K7 | em-main | ✅ **ĐÃ LÀM @S149** — đính-chính attribution | 🔴 **thước SỬA (use⟂mention)**: `grep -n 'owner chốt O-7' hmw.js \| grep -v 'bản trước ghi'` = **0 dòng khẳng định**; hit còn lại phải nằm trong ngoặc kép của khối ĐÍNH-CHÍNH. **CẤM dùng `grep -c … = 0`** — trượt oan (citation-trap). + `node --check` exit 0 |
| K8 | implementer | drift-check width vào `governance-detectors.ps1` | fault-inject cây tạm (`-RepoRoot`): `WIDTH_CAP+1` → FLAG · revert → 0-flag (khuôn S95) |
| K9 | em-main | (chỉ nếu số đổi) fault-inject 2-chiều C8b | `taskList=cap+1` → log "VƯỢT TRẦN WIDTH" + `results ≤ cap` · `taskList=cap` → 0 dòng 🔴 |

**RANH:** AI trong khung = K2/K3/K5/K7/K8/K9 + thiết kế drift-check + đính-chính attribution (sửa-sự-thật). 🔒 **Owner-SỐ** = WIDTH cap · TRẦN_TỔNG (nếu B). 🔒 **Owner-LUẬT** = #17 A/B/C · #19 throw-hay-LOUD-skip · #18 (a)+(b).

## §4 — KHÔNG CHẮC (giữ nguyên từ engine, lead không xoá)
1. **Không loại trừ anh chốt MIỆNG O-7 @S144 mà không ghi sổ.** Nếu vậy thì K6/K7 chỉ là ghi-vết-lại, không phải quyết mới. → **hỏi anh ngay lượt này**.
2. Max-width **14** (S126) đứng trên comment + memory; folder S126 **không còn** `sub-*.md` để đếm lại. Σ=16 (S127) là đếm đĩa thật.
3. "Phần còn lại" của O-3 engine đọc = {V5 + vòng-đo tương lai}. Nếu anh gồm cả lớp instrument thì lập luận là chúng nằm TRONG bề-mặt đo V3 — **cần anh confirm cách đọc**.
4. Engine **không đọc** `hub-tu-danh-gia-3-goc` + `spawn-label-panel` (phục vụ O-4/C3, ngoài 3 khoản). Spec bước-3 đụng O-4 thì lane sau phải đọc.
5. Σ-lane per run-id = 16 (S127) đếm **mọi** `sub-*.md` kể cả reviewer/spec-draft; chỉ tính execute-lane thì **Σ = 11**. **Đơn-vị đếm phải chốt trước** khi dùng làm nền TRẦN_TỔNG.
