Files
solution-erp/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-1.md
pqhuy1987 8b6df0a396
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m25s
[CLAUDE] Docs: S146 closeout — session-model 3 owner-decision + hook 4-path + H24 auto
Ap spec-apply-hub-s145-v2 (5 axis, governance-only: 0 prod-code, 0 migration).
Workflow S145 chet giua chung -> /tiep §4 relaunch-cat-gon wf_3d803740-41d 3/3 DONE.

Owner-decision @S146:
- session_ctx_kb = 64 TUONG-MINH (giu nguyen caveat ghost-wire: 0 reader)
- session-model: scaffold IDEMPOTENT (tach cap-SO vs tao-THU-MUC) · closed.md WIRE
  (session-end §6.3-bis) · V2 AUTO (go cong NGUOI, GIU cong NHIP 6/15/3)

Landed: C7 §N.8 predicate 4-ve · hook wal-flush.ps1 4 path (+.claude/sessions/)
· San-3 tin-hieu ⑤ + ORPHAN-L · D2 KIEM end-only · §L.c completeness-gate co RANG.
LIVE-VERIFY hook 4-path PASS repo THAT (da7ee8a). Session-model chay TRON VONG dau
tien: pause-S146 -> resume-S146 -> ORPHAN-L can so.

H24 force-fire (P=8 pause >= 1, luat auto moi): 2 vai + h24-audit -> 7 FLAG, va het:
- sweep-consent sot 6 site (h24-audit.md:4 = frontmatter description)
- closed.md wired-but-declared-unwired (ghost-wire CHIEU NGUOC)
- owner-decision [7] BI GHI DE do tai-dung slot-index -> mat uy-quyen push
3/3 vai lane-H24 garble #53: ghi-dia-SOM cuu tron, ghi-MUON mat trang.

So: orphan run-folder 3->0 · carry 14->20 (co tag [carry:*]) · +E-013 +E-014
error-ledger · +memory feedback_absence_looks_like_clean · .gitignore +lock file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 00:16:37 +07:00

187 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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**`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`**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.