Files
solution-erp/.claude/workflows/runs/2026-07-25-S149-adap-backlog/sub-apply-L5-evalcuaeval.md
pqhuy1987 398d343403
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m48s
[CLAUDE] Docs: S149-S150 closeout — bookend lượt đầu end-to-end (hình B) + 2 arc đóng + tally #53 chốt 45
- Arc-1 hội-tụ-bookend (rename 5 vai + 4 máy PS1 + C9-C12) + arc-2 adap-backlog 23/23 + probe Opus-5 khép (S149)
- Bookend @close S150: wave 6 vai (4 đo + 2 KIỂM) → 20 FLAG disposition từng-dòng; ring1 31/34-ĐẠT, ring2 10/10 + M-1 view-stale-role-desc
- Khoá _frozen_until_owner CẮM trước h24-signal-write (frozen-held in thật); 9 class FIRE; JUMP dải {5,4,4,3}+asym{1,4} chờ anh #21
- STATUS bump CURRENT S149-S150 + 2 khối Recently Done; HANDOFF segment mới + re-stamp đủ-slug + (17)(18)(19) lật + (14) viết lại + 6 slot #21-#26
- K2 posture-A @engine PHẦN K + K5 luật TÁCH vòng-đo-mới @session-end (O-2/O-3 OWNER-DELEGATED execute)
- sleep-doc derive-monitor-set (bỏ hardcode 4-tên); spawn-model-audit desc/comment fix; h24-signal-write param-default fix (first-live bug)
- M9 on-behalf ×3 (tooling + inv-cb F3 + reviewer F4); ring1/ring4 nhà seed; ring2 3 cite-dead vá
- Sổ garble #53 derive-from-body chốt 45 + sub-class ngược-#53/skeleton-ruột-rỗng (ghi-đĩa CẦN-KHÔNG-ĐỦ)
- Session-log S149-S150 (Sàn-5 đăng-ký 6 run=) + closeout-synthesis dạng-1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 12:17:05 +07:00

144 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-apply-L5 — C-a eval-của-eval (thư 2026-07-21 eval-quality-audit)
> Lane L5 · run `2026-07-25-S149-adap-backlog` · agent tier `opus` effort MAX
> Label (khuôn-④ C3): **ai** = L5-apply · **gì** = C-a bảng eval-của-eval + report eval-quality-audit · **nhịp** = wave-apply S149 · **phiên** = S149 (2026-07-25)
> KHUNG RỖNG ghi ĐĨA TRƯỚC khi đọc/đo (chống #53 return-garble — ghi-đĩa-TRONG-lúc-làm).
> Thư nguồn đọc TRỌN: `AI_INFRA/broadcasts/outbox/all/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md` (55 dòng, `content_sha256: c04d39dbc8f5…`).
## ⓪ Fact-0: giải LỆCH 2 nguồn về trio — KẾT LUẬN: **trio ĐÃ chạy thật; cả 2 nguồn "pending" là VĂN-BẢN STALE, không phải sự-thật khác**
Lệnh giao nêu 2 nguồn. Đo ra **3** nguồn — và nguồn thứ 3 nghiêng cùng phía nguồn thứ 2.
| # | Nguồn | Nói gì | Đo được |
|---|---|---|---|
| 1 | `runs/2026-07-22-S144-trio-first-run/` | trio ĐÃ chạy | **5 file**: `harness-eval-return.md` (10.907 B) · `harness-refine-return.md` (14.321 B) · `harness-audit-return.md` (11.251 B) · `run.md` · `trio-synthesis.md`. Commit **`8b6df0a` 2026-07-23** |
| 2 | `.claude/agent-memory/memory-budget.json:186-188` | "S141 seed - **first-run pending restart+consent**" | Văn-bản **STALE** — chưa ai sửa sau S144 |
| 3 | 🆕 chính diary của trio, vd `agent-memory/harness-refine/MEMORY.md:16` | "S141 seed — **CHƯA chạy lần nào**; first-run chờ restart-CLI + spawn-probe + anh consent" | Cũng **STALE**, cùng gốc |
**Kết luận (khai đúng cái đo được):** trio **ĐÃ CHẠY** first-run thật @S144 (2026-07-22), tuần-tự eval→refine→audit, verdict trong `trio-synthesis.md:7` = `executed-file`**`verified-runtime`**. Hai nguồn "pending" **không mâu thuẫn với nguồn 1 về sự-kiện** — chúng chỉ **chưa được cập-nhật**, vì đúng lý-do đã tự khai ở `trio-synthesis.md:35`: *"phiên S144→S145 chạy tiếp việc khác rồi `/pause`, harvest-gate chưa kịp gom"*.
**Nhưng có một vế "pending" VẪN ĐÚNG theo nghĩa hẹp** — và đây là chỗ dễ nhập nhằng, nên tách bạch:
| Nghĩa của "first-run" | Trạng thái THẬT | Bằng chứng |
|---|---|---|
| trio **chạy task** lần đầu | ✅ **RỒI** | 3 return-file + synthesis |
| trio **ghi diary** lần đầu | ❌ **CHƯA** | eval 1.547 B (mtime **2026-07-20**) · audit 1.513 B (mtime **2026-07-20**) — đứng y nguyên từ ngày seed |
⇒ Con-số `l1_hot` trong budget.json **vẫn khớp đĩa** (eval 1547 = 1547 ✔ · audit 1513 = 1513 ✔); chỉ **câu chữ `rollout`** là sai. Lý do 3 vai không tự ghi: `run.md:9` khai *"3 vai khai không có Write/Edit"* — nên first-run KHÔNG thể sinh diary; phải lead harvest, mà harvest bị cắt.
**Drift phụ đo được:** `harness-refine` = **1.611 B** ≠ 1.616 B ghi trong budget.json (5 B, mtime 2026-07-24 23:11). Truy `git log -p`: commit `9abc2e1` **không phải** entry first-run mà là **đổi tên vai** `lead-omission-auditor``lead-gap-auditor` trong dòng split-boundary. ⇒ diary bị chạm vì lý-do khác, con số budget.json lệch 5 B từ đó.
> 🔴 **Đây chính là ca mẫu của cả đợt rà:** việc ĐÃ chạy, nhưng **bề-mặt-đo không đổi** ⇒ mọi thước đọc `memory-budget.json` sẽ báo "pending" **vĩnh viễn**. Không thước nào trong 17 thước dưới đây đo được ô `rollout` (văn xuôi tự-do, không máy nào parse). Cf. `feedback_absence_looks_like_clean` — vắng-mặt trông giống ổn.
## ① Bảng eval-của-eval — 4 câu của thư + verdict
**Quy ước cột:** **Q1** = đã bắt lỗi THẬT chưa (trích dòng, "chưa từng" cũng là dữ liệu) · **Q2** = activity ⟂ integrity ⟂ **efficacy-outcome** (hệ kiểm bắt được lỗi?) ⟂ **use-outcome** (tri-thức có được DÙNG?) · **Q3** = tự-nói-chuyện-với-mình {(a) token-hoá-thạch · (b) đếm-chính-dòng-định-nghĩa · (c) nhãn-hứa-không-ép · (d) chú-thích-tự-mâu-thuẫn} · **Q4** = bỏ thì lọt gì {dormant-đúng-thiết-kế ⟂ thừa-thật}.
🔒 **2 cột thẩm-quyền ĐỂ TRỐNG — owner điền.** AI chỉ được tự quyết cột "AI-tự-sửa" (vá máy/nhãn/filter); *"AI không tự quyết hai cột sau"* — thư `:24` verbatim.
### A. 7 thước ĐỘC-LẬP (script riêng)
| # | Thước | Q1 — bắt lỗi thật? | Q2 — lớp đo | Q3 — tự-nói? | Q4 — bỏ thì lọt gì | Verdict | 🔒 owner-SỐ | 🔒 owner-LUẬT |
|---|---|---|---|---|---|---|---|---|
| A1 | `mfe-eval.ps1` (Memory-Fidelity) | **CÓ, hôm nay** — fault-inject 3-arm ĐỎ đúng 2/2 (§②). Trước đó: chưa ca tự-nhiên nào | **efficacy-outcome** (nhánh GOODHART-WARN) + activity (span/FIT). Tự tách đúng H6.7 ở `:8-9` | 🔴 **CÓ — dạng MỚI, ngoài 4 dạng của hub: "tự-ăn-nhân-chứng"** (§②.3) | dormant-đúng-thiết-kế cho FIT; **nhưng WARN đang bị tự vô-hiệu** | **SỬA** (bỏ ghi-đè state khi chỉ đọc) | | |
| A2 | `applied-eval-nokey.ps1` | Có — `:276` tự khai *"caught by fault-injection: a sabotaged gate printed CASE FAIL yet the summary…"* | **efficacy-outcome** thuần (gate + 3-case selftest) | **KHÔNG** — mẫu-mực ngược: tự in *"This file is a MECHANISM, NOT a number"* + 4 caveat + từ-chối phát số | thừa-thật nếu bỏ = mất **positive-control duy nhất** dạng gate | **GIỮ** (mẫu chuẩn cho cả bộ) | | |
| A3 | `spawn-model-audit.ps1` | Có — S126 2026-07-16 đo spawn-param THẮNG frontmatter hard-pin (ghi ngay trong §E.5) | activity + integrity (20/20 model+effort); tự khai KHÔNG phải enforcement | **KHÔNG** — có hẳn §E *"what this report does NOT say"* 6 điều phủ-định | dormant-đúng-thiết-kế (retro-only, tự khai `:E.4`) | **GIỮ** | | |
| A4 | `nhip-no-probe.ps1` | Có (gián-tiếp) — `error-ledger.md:50` liệt nó là 1 trong 2 lưới của carve-out; `:61` kiểm S142 = **SỐNG** | activity (đếm nhịp/ngày) — **không** efficacy | Chưa thấy | dormant-đúng-thiết-kế (lưới nhắc, rẻ) | **GIỮ** | | |
| A5 | `distill-shard-probe.ps1` | Chưa từng KÊU tự-nhiên. Live: `pending=15 \| nguong=15 => IM` | activity (đếm shard chưa-gist) | ⚠️ **(d) nhẹ** — header `:3` ghi *"anh chot 7 @S144"* nhưng thân `:55-57` + config live = **15**. Header stale | dormant; **NHƯNG level-blind**: ngưỡng neo vào hiện-trạng (`-gt` cố ý, `:55-57` có lý-do owner) ⇒ chỉ kêu khi **thêm 1**, không bao giờ kêu vì "15 đã nhiều" | **SỬA** (chỉ vá comment `:3`) | | |
| A6 | `measure-agent-memory.ps1` | Chưa từng — tool xuất JSON byte, không có verdict | **activity/integrity** thuần (byte + `l1_over_30kb`) | Chưa thấy | dormant-đúng-thiết-kế (là nguồn số cho thước khác) | **GIỮ** | | |
| A7 | `closeout-sentinel.ps1` | Chưa đo được trong lượt này — `-Commit`**mandatory**, không chạy trần được | efficacy-outcome (per-commit ritual) | Chưa thấy; `:35/:61-71` tự khai positive-control giới-hạn ở obs-pair | dormant-đúng-thiết-kế | **GIỮ** (chưa đủ dữ-liệu để đòi sửa) | | |
### B. 11 check TRONG `governance-detectors.ps1` (TOTAL live = **46**)
🔴 **Kể bằng THÀNH-PHẦN, không bằng số tổng** (bài Goodhart — số tổng che mất ai đang nói):
```
46 = 24 C1-wikilink + 15 C2-derived-stale + 3 H24-2-carry + 3 C3-vocab-fork + 1 H24-1-title
```
| # | Check | Q1 — bắt lỗi thật? | Q2 — lớp đo | Q3 — tự-nói? | Q4 — bỏ thì lọt gì | Verdict | 🔒 owner-SỐ | 🔒 owner-LUẬT |
|---|---|---|---|---|---|---|---|---|
| B1 | **C1** broken-gotcha-ref | Live **0 flag** | integrity | Không | dormant-đúng-thiết-kế | **GIỮ** | | |
| B2 | **C1** dangling-wikilink | Live **24 flag** = **52% toàn TOTAL**. Cùng MỘT lớp: hyphen⟂underscore. Chính detector tự in *"hyphen vs underscore basename fork is common"* | integrity | ⚠️ **(c) nhẹ** — biết nguyên-nhân mà vẫn phát 24 LOW không ai đóng ⇒ **bão-hoà nhiễu**, nuốt tín-hiệu | dormant nhưng đang **che** 22 flag còn lại | **SỬA** (normalize `-``_` rồi mới đếm) | | |
| B3 | **C2/B3** derived-staleness | Live **15 flag**; canonical khớp đĩa (mig 67 · gotcha 83) | integrity | Không — tự in caveat "soft net… can false-positive" + H18-A ratio-band hạ LOW | thừa-thật KHÔNG; đây là lưới chống drift B1 | **GIỮ** | | |
| B4 | **C3** vocab-fork | Live **3 flag** (wave-folder⟂run-trace · Dự trù⟂Ngân sách PRO · two-tier⟂all-inherit⟂worker-tier-pin) | integrity | Không (đã vá lớp citation-trap trước đó) | dormant-đúng-thiết-kế | **GIỮ** | | |
| B5 | **C4** self-line exclusion | **CÓ** — live: `6 paths excluded`, `0 self-match`, `0 leaked` | integrity **về chính bộ đo** (meta-guard) | Đây là **thuốc giải** dạng tự-nói, không phải bệnh | bỏ = detector tự-khớp chính mình (citation-trap đã cháy thật) | **GIỮ** | | |
| B6 | **C5** WAL guardrail | Live `[OK] WAL.md = 30 lines (<= 40)` | integrity (hard cap) | Không | dormant-đúng-thiết-kế (H22) | **GIỮ** | | |
| B7 | **C6** cite-2-tier (INFORM) | Live 0/48 file | integrity | Không — tách `InformCount`, không trộn TOTAL | dormant, mới | **GIỮ** | | |
| B8 | **C9** hmw WIDTH mirror (INFORM) | Live `[ok] 20 == 20`; `:1545` khai FAIL-LOUD khi thiếu mirror | integrity | Không | dormant-đúng-thiết-kế | **GIỮ** | | |
| B9 | **C10** logic-session folder (INFORM) | Live `[ok] session-3 is OPEN`, 0 flag | integrity | Không | dormant, mới @S149 | **GIỮ** | | |
| B10 | **C11** H24 FLAG-khuôn (INFORM) | Live 0 — **và tự khai**: *"MEASURED NOTHING… a 0 after a skip is not a green"* | integrity | **KHÔNG** — mẫu-mực: tự tố cáo "xanh-vì-mù" của chính mình | dormant, mới @S149 | **GIỮ** | | |
| B11 | **H24-2** carry-age | Live **3 flag** (uat-s134 ×7 · uat-s133 ×9 · hook-vs-budget ×13) | activity (đếm streak) | 🔴 **CÓ — dạng (d) chú-thích-tự-mâu-thuẫn, XÁC NHẬN TRONG CODE** (§②.4) | dormant; nhưng đang **bơm số vào TOTAL** | **SỬA** | | |
| — | H24-1 title · H24-3 label-lag · H24-4 pending-flip · H24-5 counter-ancestor · H25-1 closeout-ritual · H25-2 role-notebook | H24-1 = 1 flag · H24-3 `[skip]` · H24-4/5 = 0 · H25-1 `[ok]` 3/3 · H25-2 roster 20, diaries-ok 18, **inert 2** | integrity | H24-3 in `[skip]` trung-thực | phụ-lục, không đủ chỗ soi kỹ lượt này | **GIỮ** (chưa rà sâu — khai thẳng) | | |
**Tổng verdict:** GIỮ **13** · SỬA **4** (A1 · A5 · B2 · B11) · BỎ **0** · THÊM **1 đề-xuất** (§③).
## ② Fault-inject THẬT (`-RepoRoot` cây tạm, khuôn S95) + 2 phát hiện phái sinh
### ②.1 Chọn thước: `mfe-eval.ps1` — **chưa từng bị fault-inject**
Grep `docs/governance/ + runs/` ra 8 hit `mfe-eval` nhưng **0 hit fault-inject cho chính nó**; hit gần nhất (`adap-reports/2026-06-30…harness-17…:49`) chỉ chứng *"mfe-eval.ps1 (A2 reuse) exit-0 KHÔNG vỡ"* = happy-path, **không** chứng có RĂNG. Đủ điều-kiện "chọn thước chưa từng inject".
### ②.2 Kết quả — 3 arm, cây tạm ngoài git, script `scratchpad/mfe-faultinject.ps1`
| ARM | Bơm gì | FIT | GOODHART | Kỳ vọng | Kết |
|---|---|---|---|---|---|
| **0** negative-control | không bơm (bản sao sạch) | PASS | no-warn | PASS / no-warn | ✅ |
| **A** | `.mfe-state.json.strikes_total` 23 → **3** | PASS | **WARN-FIRED** | WARN | ✅ |
| **B** | `lead_tokens` 380000 → **100** | **OVER** | no-warn | OVER | ✅ |
Dòng ĐỎ thật arm A: `GOODHART-WARN: strikes rose (3 -> 23) while set still FITS -> coverage may LIE (set 'fits' but errors recur = not actually applied)`
Dòng ĐỎ thật arm B: `FIT = OVER (worst-case exceeds cap) -> decision: INCREASE budget`
**`mfe-eval` CÓ RĂNG, 2/2 nhánh, im đúng lúc sạch.** Không phải "xanh-vì-mù".
### ②.3 🔴 Phát hiện 1 — **dạng tự-nói-chuyện THỨ 5, chưa có trong 4 dạng của hub: "thước tự ăn nhân-chứng của mình"**
`mfe-eval.ps1` tự khai `:16` *"a measure-and-report tool, NOT a build gate"*`:12-13` *"READ-ONLY on token_governor"* — nhưng nó **GHI** `.claude/agent-memory/.mfe-state.json` mỗi lần chạy (`:205-209` `WriteAllText`; write-ops = **2**, là script **duy nhất** ghi trong 8 thước đọc-only đã soi).
Hệ quả không phải "bẩn git" mà nặng hơn — **cơ-chế cảnh-báo tự tháo ngòi**:
- `:193` đọc `$lastStrikes` từ state → `:205-209` **ghi đè ngay** state bằng số hiện-tại.
- ⇒ sau BẤT KỲ lần chạy nào, `last == current`**GOODHART-WARN không thể nổ** cho tới khi strikes tăng tiếp.
- ⇒ ai chạy MFE "chỉ để xem" (đúng như tôi làm hôm nay) là **đốt mất cửa-sổ cảnh-báo** của lần chạy chính-thức kế tiếp. **Quan-sát tiêu-thụ nhân-chứng.**
**Bằng chứng sống, chính tôi gây ra:** lần chạy baseline làm `git status` hiện ` M .claude/agent-memory/.mfe-state.json`; diff thật = `"at": 2026-07-22 → 2026-07-25``"rca_entries": 12 → 14`. **Đã `git checkout --` hoàn nguyên**, git sạch lại (giữ đúng isolation B6, và trả lại cửa-sổ warn cho lần chạy thật).
### ②.4 🔴 Phát hiện 2 — **H24-2 = dạng (d) nguyên-bản, xác nhận trong code**
- `:909` phát cờ bằng `Write-Flag` ⇒ tăng `$script:FlagCount` = **TOTAL**.
- Nhưng nội-dung cờ ghi `gap-carry-aged **[INFORM]**` + resolve `"INFORM-only - **no action forced**"`; tiêu-đề section `:820` cũng ghi `(INFORM-only)`; docstring `:24` ghi INFORM-only.
- Trong khi `:1818` liệt roster INFORM-ONLY = `C6 + H24-4 + H24-5 + C9 + C11`**KHÔNG có H24-2**; và chính-sách `:65-73` nói rõ sink INFORM là để *"a brand-new net… must not move the audited TOTAL"*.
⇒ Cùng một output vừa nói *"không ép hành-động"* vừa **tính vào TOTAL bị siết**. Nguyên-nhân nhiều khả năng: H24-2 có TRƯỚC khi sink `InformCount` ra đời (`:65` chỉ kể C6, H24-4), lúc thêm sink **quên di-cư**.
**Ảnh hưởng đo được:** 3/46 = **6,5%** TOTAL là cờ tự-nhận không-ép. Nặng hơn: acceptance của chính wave này (`spec:19`) là *"detector TOTAL không tăng"* — mà một `[carry:]` owner **cố ý giữ** sẽ đẩy TOTAL lên và **đọc thành hồi-quy**.
⚠️ **Nhưng vá là RỜI TẬP-ĐO:** chuyển 3 cờ sang INFORM hạ TOTAL 46→43 — *trông y hệt tiến-bộ* mà không sửa gì thật (đúng bài `feedback_goodhart_leave_measurement_set`). ⇒ **KHÔNG tự vá.** Phải owner chốt: baseline mới 43 có được ratify không, hay giữ 46 và chỉ đổi nhãn? → cột 🔒 owner-LUẬT của B11.
## ③ THÊM-mới (đề-xuất, KHÔNG tự wire)
1. **Thước đo "bề-mặt-đo có được cập-nhật không"** — Fact-0 cho thấy trio chạy 3 ngày trước mà 2 chỗ văn-bản vẫn ghi "pending", **0 thước phát hiện**. Đề-xuất check: role có return-file trong `runs/**``memory-budget.json.rollout` còn chữ `first-run pending` ⇒ FLAG INFORM. (Họ-hàng "first-run-role-has-diary" đã đề-xuất lên hub tại `error-ledger.md:118`, đang **chờ hub canonical** — SE không tự chế detector riêng.)
2. **Đưa dạng-5 "tự-ăn-nhân-chứng" vào khung 4-câu** (câu 3 thành 5 dạng) — đề-xuất ngược lên hub qua `/adap-request` nếu anh duyệt.
## ④ KHÔNG CHẮC / honest-caveat
1. **A7 `closeout-sentinel` chưa đo**`-Commit` mandatory; verdict GIỮ là **suy từ đọc code**, không phải từ chạy. Khai thẳng.
2. **Dòng cuối bảng B (H24-1/3/4/5 + H25-1/2)** gộp 6 check vào 1 dòng — **chưa rà 4 câu từng cái**. Đây là thiếu-sót có chủ-đích do trần lượt, KHÔNG phải "đã phủ hết". Cf. `feedback_meta_count_selfcoverage_blindspot`: không lấy số tổng thay cho từng dòng.
3. **Q1 của A4/A5/A6/A7** dựa trên vắng-mặt bằng-chứng (grep sổ ra 0 ca) — vắng-mặt ≠ chứng-minh chưa từng bắt; sổ có thể ghi thiếu.
4. **Fault-inject chỉ phủ `mfe-eval`** (1/17 thước). 16 thước còn lại **chưa có fixture đông-lạnh** — đúng lớp hub cảnh báo (`thư:31` 17/18 check thiếu positive-control). Không suy ra "cả bộ có răng".
5. **Cây tạm nằm ở scratchpad NGOÀI repo** (đúng chỗ tạm được cấp) — nên `git diff` không thấy; containment chứng bằng `git status` sạch sau khi hoàn nguyên `.mfe-state.json`, không phải bằng diff cây tạm.
6. **Số hub KHÔNG chép** (thư `:55` dặn) — mọi con số trên là SE tự đo hôm nay.
## ⑤ Report đã ghi
`docs/governance/adap-reports/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md` — nấc **executed-partial**, đủ 5 trường format-LOCK, trỏ ngược file này cho bảng.
## Log tiến-trình
- [L1] khung rỗng ghi đĩa TRƯỚC khi đo. [L2] đọc spec + sub-invest §② + thư nguồn TRỌN.
- [L3-4] Fact-0: ls+git log folder trio · budget.json:186-188 · **tự tìm ra nguồn-3** (diary trio) · đo byte 3 diary · truy `git log -p` drift 5B refine.
- [L5-7] chạy detector suite live (TOTAL 46) + tally thành-phần theo section + soi code `:909`/`:65-73`/`:1818` xác nhận mâu-thuẫn H24-2.
- [L8-10] map input mfe-eval → dựng `mfe-faultinject.ps1` 3-arm → vá bug PS5.1 (`if` inline không phải expression) → **PASS 3/3**.
- [L11] `git status` bắt **chính mình** làm bẩn `.mfe-state.json` → truy `:205-209` → ra phát-hiện dạng-5 → `git checkout --` hoàn nguyên.
- [L12] probe còn lại (nhip-no · distill-shard · spawn-model · applied-eval · measure-agent) + write-op scan 8 script → mfe là outlier duy nhất.
- [L13] bảng 18 dòng + report.