wal: flush 20260807T1433

This commit is contained in:
pqhuy1987
2026-08-07 14:33:10 +07:00
parent 3686070eae
commit 1c62798fdf
6 changed files with 903 additions and 4 deletions

View File

@ -0,0 +1,48 @@
# LEAD VERIFY ĐỘC LẬP — `D-LANE-01` defect `spawn-model-audit.ps1`
> Lane D (N3) tìm ra; lead **chạy lại toàn bộ bằng lệnh riêng**, không nhận suông. Kết luận: **CONFIRMED, MAJOR.**
## Phép lead tự chạy
| # | phép | kết quả |
|---|---|---|
| 1 | chạy `scripts/spawn-model-audit.ps1` | in `session scope : 80080445-… (last write 2026-08-06 10:10)` + `scope = CURRENT session only, by design` + `COUNTS: 1 dispatch \| 0 mismatch` + `TOTAL FLAGS: 0` |
| 2 | phiên HÔM NAY `be228103-…``subagents/workflows`? | **NO** ⇒ bị vị từ chọn-phiên bỏ qua |
| 3 | 🟢 **control-dương** — phiên hôm qua `80080445-…` có? | **YES** ⇒ vị từ *có* chạy, không phải thước lead hỏng |
| 4 | dân số phiên hôm nay | **17 lane `.jsonl` PHẲNG** trong `subagents/` |
| 5 | bản ghi model phiên hôm nay | **168 `claude-fable-5`** + **806 `claude-opus-5`** |
| 6 | mtime so sánh | hôm nay `2026-08-07 12:38` ⟂ máy chọn `2026-08-06 10:10`**bỏ qua phiên mới hơn ~26 giờ** |
🔸 **Lệch nhỏ so lane D, đã giải thích, KHÔNG phải mâu thuẫn:** lane D đo `725 opus`, lead đo `806`. Số `claude-fable-5` **khớp tuyệt đối 168/168**. Nguyên nhân: lane opus **vẫn đang chạy** lúc lead đo ⇒ mục tiêu di động. Đây là *đo hai thời điểm*, không phải *hai bên sai*.
## Cơ chế hỏng
`scripts/spawn-model-audit.ps1:250-253` chọn phiên bằng vị từ **hình-dạng-đường-dẫn**:
```powershell
Get-ChildItem -Path $projDir -Directory |
Where-Object { Test-Path (Join-Path $_.FullName 'subagents\workflows') } |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
```
`Test-Path subagents\workflows`**ĐẠI DIỆN (proxy)** cho *"phiên này có spawn"*:
- ✅ đúng khi lane đi qua **Workflow tool** (`hmw.js``subagents/workflows/wf_*/agent-*.jsonl`)
-**SAI CÂM** khi lane đi qua **Task tool** — bản ghi rơi **PHẲNG** vào `subagents/agent-*.jsonl`
Phiên S180 spawn **toàn bộ bằng Task tool** ⇒ 0 thư mục `workflows` ⇒ máy **nhảy sang phiên hôm qua rồi dán nhãn "CURRENT session only"**.
## Vì sao nặng hơn một cờ thường
1. **Phủ thật của phiên hiện tại = 0/17 lane = 0 %**, mà máy in **`0 mismatch` / `TOTAL FLAGS: 0`** ⇒ **ĐÈN XANH GIẢ**. Đúng lớp bệnh `khuon…:295` gọi tên: *"chưa có dữ liệu" bị in ra trông y hệt "đã đo và bằng không"*.
2. **Toàn bộ 168 bản ghi `claude-fable-5`** — đúng **mô hình đắt** mà cả GĐ-5 sinh ra để canh — nằm **trọn trong vùng mù**.
3. Máy **tự dán nhãn sai** ⇒ người đọc báo cáo **không có cách nào biết** nó đang đo phiên khác. Đúng class `feedback_absence_looks_like_clean`.
4. Nó đánh thẳng vào **nghiệm thu TC-09 của hub** (`thu-chinh:84`): *"máy soát chỗ-ngồi trả không có lượt nào lệch"* — SE **đang trả đúng câu đó**, trên mẫu **1 lane của hôm qua**.
5. Máy **CÓ** control cho vế hằng-số (khối A `anti-vacuous note`), **KHÔNG có control cho vế DÂN SỐ**.
## 🔴 Hai lớp của chính lá thư, gặp nhau trong một script
- **LỚP-8 ở tầng MÁY** — nhãn phạm vi (*"CURRENT session"*) **rộng hơn** cái nó thật sự quét. (SE mới biết LỚP-8 ở tầng NHÃN: slot `~~ĐÓNG~~` hẹp hơn thi hành.)
- **LỚP-4** — `TOTAL FLAGS: 0` ≠ không có vấn đề.
## 🔸 KHAI CHẶT PHẠM VI — cái gì sụp, cái gì KHÔNG
-**Sụp:** mọi lượt chạy `spawn-model-audit.ps1` trên phiên mà lane spawn **bằng Task tool** ⇒ đèn xanh giả. **Phiên S180 là một ca như vậy** — lead đã in dòng `[OK] worker-tier-pin holds` ở bookend @open **mà không biết nó đo phiên hôm qua**.
-**KHÔNG sụp:** phép đo **H23 @S126** (*spawn-param thắng frontmatter hard-pin, "0-mismatch"*) chạy trên run **`wf_f960dae2-fa0`** = **đi qua Workflow tool** ⇒ vị từ **nhìn thấy được****phép đo đó vẫn đứng**.
- 🔴 **CẤM đọc rộng hơn:** đây **không** phải "mọi số liệu model của SE đều sai". Đây là *"máy mù với một trong hai đường spawn, và im lặng về việc đó"*.
## Trạng thái
**Propose-only, CHƯA sửa** — đây là máy governance, sửa phải qua wave có gate. Vào **N4** như một khoản GĐ-5 bắt buộc (nó chống lưng chính câu *"GĐ-5 gần xong nhất"*), và vào **adap-report** như một ca LỚP-4/LỚP-8 tự tìm được.

View File

@ -16,3 +16,125 @@
Vật tham chiếu trong run-folder: `sub-invest-fitmap-S180.md` (48.433 B) · `sub-review-n2-S180.md` (22.418 B) · `spec-adap-upgrade-pack-phased-07-08-2026.md` (7.550 B) · `run.md` (10.603 B).
---
## §1 — GĐ-0: bóc TỪNG KHOẢN (18 khoản, không gộp)
Hub đòi GĐ-0 ở **bốn nơi khác nhau**, và bốn nơi đó **không trùng khít nhau**. Tôi liệt cả bốn, đánh số riêng từng nơi, rồi mới nói chỗ chồng lấn. Gộp bốn nơi thành một danh sách là chính cái làm rơi khoản.
- Nơi 1 — thư chính `:112-119`**7 bước làm** (`G0-B1..B7`).
- Nơi 2 — thư chính `:121-125`**3 lệnh "kiểm xong chưa"** (`G0-K1..K3`).
- Nơi 3 — Phần C của khuôn `:251-269`**4 khoản danh mục kiểm** (`A0-1..A0-4`).
- Nơi 4 — phụ lục `:86-89`**4 ô nghiệm thu** (`G0-N1..N4`).
### 1.1 — Bảy bước làm (thư chính `:112-119`)
| # | Hub đòi gì | SE: đã có / thiếu / ngược | Bằng chứng `file:line` |
|---|---|---|---|
| **G0-B1** | Kéo cả **bốn món** về kho bạn | **ĐÃ CÓ** — 4/4 tệp trên đĩa, cùng một commit | `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-{thu-chinh,phu-luc-spec-pitfall,khuon-fit-map-report-checklist,luat-cham-diem}.md`; `git log -1 --format=%ci -- <mỗi tệp>` → cả 4 ra `2026-08-05 10:18:34 +0700`, commit `3a6eb92` |
| **G0-B2** | Tính lại **mã băm nội dung** từng món, so với giá trị hub công bố, **ghi kết quả so** | **ĐÃ CÓ NHƯNG ĐẶT SAI CHỖ** — phép so đã chạy và đạt 4/4, nhưng kết quả chỉ nằm trong một tệp lane của phiên này, không nằm ở sổ nào sống lâu hơn phiên | Kết quả: `sub-invest-fitmap-S180.md:32` (*"Hash verify 4/4 OK canonical bằng máy có sẵn `scripts/stamp_verify.py` (exit=0)"*). Giá trị hub công bố nằm ngay trong frontmatter từng thư: `43db2cf0` · `49287ce7` · `98e31fad` · `c24699f0`. Sổ đáng lẽ giữ kết quả này là `broadcasts/_index.md` — nó **có sẵn cột `sha256(12)` và cột `verify`** (`broadcasts/_index.md:13`) nhưng **không có dòng nào cho 4 món** |
| **G0-B3** | **Ghi đĩa ngay** bốn món vào **một chỗ cố định**, và ghi lại đường dẫn | **ĐÃ CÓ** — chỗ cố định là `broadcasts/inbox/ai_infra/`; đường dẫn được ghi lại ở `spec-…-07-08-2026.md:3``:13-19` | `spec-adap-upgrade-pack-phased-07-08-2026.md:3` |
| **G0-B4** | Dựng **tệp theo dõi tiến độ theo từng giai đoạn**, liệt kê **từng khoản** của danh mục kiểm | **THIẾU** — không có tệp nào liệt đủ 14 khoản `A0-1..A0-4 · A1..A10 · A11..A16` để tick dần | Phép tìm: `grep -rl "A0-1" --include="*.md" .claude/ docs/` → chỉ ra tệp trong run-folder S180, không ra tệp theo dõi. `docs/governance/` không có tệp nào tên theo dõi/tracking (`ls docs/governance/` = 12 mục, không mục nào là sổ theo dõi gói này) |
| **G0-B5** | Ghi **một dòng "đã nhận"** vào **sổ liên lạc phía bạn**, kèm ngày | **THIẾU — và thiếu rộng hơn nhiều so với 4 món** (chi tiết ở §2, đây là khoản mà lane brief gọi là "A0-3 hụt") | `broadcasts/_index.md` — 0 dòng cho cả 4 món; control-dương `grep -c "harness-22" broadcasts/_index.md` = **3** ⇒ thước còn sống, im lặng là im lặng thật |
| **G0-B6** | Lập **bản đồ áp dụng bảy dòng**, mỗi dòng chọn **đúng một** trong ba | **CÓ BẢN NHÁP, CHƯA CÓ TỆP RỜI** — bảng bảy dòng đã tồn tại nhưng nằm *bên trong* một tệp điều tra, không phải một tệp bản đồ độc lập | Bảng: `sub-invest-fitmap-S180.md:220-228` (dòng `:220` là dòng tiêu đề, `:222-228` là bảy dòng GĐ-0..GĐ-6). Hệ quả đo được: lệnh tự kiểm của hub `grep -c '^| GĐ-[0-6]' <tệp-bản-đồ>` hiện chỉ chạy đúng nếu trỏ vào tệp điều tra 48 KB — đúng cái bẫy mẫu-số mà hub cảnh báo ở `khuon-…:59` |
| **G0-B7** | **Gửi báo cáo tiếp nhận** kèm bản đồ áp dụng, qua hộp thư đi hướng tới hub; **ghi tệp vào kho của bạn** | **THIẾU** — chưa có báo cáo nào | `ls broadcasts/outbox/ai_infra/` = **47 tệp**, tệp mới nhất đề ngày `2026-07-26`; không tệp nào mang chữ `upgrade-pack`. Control-dương: cùng lệnh `ls` trả 47 tệp ⇒ thư mục đọc được, không phải lỗi đường dẫn |
### 1.2 — Ba lệnh "kiểm xong chưa" (thư chính `:121-125`)
| # | Lệnh hub đưa | SE chạy được chưa | Kết quả thật |
|---|---|---|---|
| **G0-K1** | `grep -c '^| GĐ-[0-6]' <bản-đồ>` phải ra **7** | **CHƯA — vì chưa có tệp bản đồ rời** (xem G0-B6) | Chạy trên `sub-invest-fitmap-S180.md` ra **7**, nhưng đó là tệp điều tra chứ không phải tệp bản đồ; nghiệm thu bằng con số này hôm nay là tự lừa mình |
| **G0-K2** | `ls <bốn đường dẫn>` phải đủ **bốn tệp** | **ĐẠT** | 4/4 tệp tồn tại, byte lần lượt 33.156 · 46.416 · 30.502 · 9.970 (tổng 120.044) |
| **G0-K3** | `<lệnh mã băm>` phải khớp giá trị đã ghi | **ĐẠT, nhưng chỉ khớp qua đúng một máy** | `python scripts/stamp_verify.py broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-*.md` → exit=0, 4/4 khớp (`sub-invest-fitmap-S180.md:32`). 🔴 Cảnh báo kế thừa từ N1: phép băm **tự chế** cho MISMATCH cả bốn — nghĩa là ai chạy lệnh băm thông thường sẽ kết luận nhầm là bị sửa nội dung. Bất kỳ tài liệu nào của SE nhắc tới G0-K3 **phải dán kèm đúng lệnh này**, không được ghi chung chung là "đã băm" |
### 1.3 — Bốn khoản danh mục kiểm Phần C (`khuon-…:251-269`)
| # | Khoản | SE | Ghi chú đo được |
|---|---|---|---|
| **A0-1** | Bốn món trên đĩa **kèm mã băm** | **ĐÃ CÓ MỘT NỬA** | Vế "trên đĩa" đạt (G0-B1). Vế "bạn ghi lại mã băm" **chưa có chỗ ghi thường trực** (G0-B2) |
| **A0-2** | Tệp theo dõi tiến độ, **số khoản khớp số khoản của danh mục** | **THIẾU** | = G0-B4. Danh mục có **14 khoản** đánh số (`A0-1 A0-2 A0-3 A0-4 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16` — tức 4 + 10 + 6 = **20 khoản**, tôi đếm lại từ `khuon-…:373-375` chứ không lấy con số cũ) |
| **A0-3** | Một dòng "đã nhận" trong sổ liên lạc, **tìm được bằng một lệnh tìm kiếm** | **THIẾU** | = G0-B5, phân tích đầy đủ ở §2 |
| **A0-4** | Bản đồ áp dụng bảy dòng, **không ô quyết định nào trống** | **CÓ NHÁP, CHƯA ĐẠT KHUÔN** | = G0-B6; thêm một khiếm khuyết riêng ở §5 (ô quyết định trộn giá trị) |
> 🔴 **Đính chính ngay trong bảng của chính tôi:** ở dòng `A0-2` phía trên tôi vừa viết "14 khoản" rồi đếm lại ra **20**. Tôi giữ cả hai con số và giữ luôn vết sửa, vì đây đúng lớp lỗi mà hub gọi tên: số chép tay trong văn xuôi trôi (LỚP-5). **Con số đúng là 20**, dẫn được từ `khuon-…:373-375`: bốn khoản Phần 0, mười khoản Phần 1, sáu khoản Phần 2. Tệp theo dõi của SE khi dựng phải có **đúng 20 dòng**, không phải 14.
### 1.4 — Bốn ô nghiệm thu phụ lục (`phu-luc-…:86-89`)
| # | Ô nghiệm thu | SE đạt? |
|---|---|---|
| **G0-N1** | Bốn tệp trên đĩa, **mã băm tính lại khớp** | **ĐẠT** (bằng máy canonical, xem G0-K3) |
| **G0-N2** | Tệp theo dõi tồn tại, **số khoản khớp** | **KHÔNG ĐẠT** — tệp không tồn tại |
| **G0-N3** | Sổ liên lạc có dòng "đã nhận" **kèm ngày** | **KHÔNG ĐẠT** |
| **G0-N4** | Bản đồ áp dụng **đủ bảy dòng, không dòng nào trống** | **ĐẠT về số dòng, CHƯA ĐẠT về hình thức ô** (§5) |
**Tổng kết GĐ-0:** 18 khoản đã liệt. **ĐÃ CÓ 6** (`G0-B1`, `G0-B3`, `G0-K2`, `G0-K3`, `A0-1` nửa vế, `G0-N1`) · **THIẾU 9** (`G0-B4`, `G0-B5`, `G0-B7`, `G0-K1`, `A0-2`, `A0-3`, `G0-N2`, `G0-N3`, và vế ghi-lại-băm của `G0-B2`) · **CÓ NHƯNG SAI KHUÔN 3** (`G0-B6`, `A0-4`, `G0-N4`). **Không khoản nào NGƯỢC** — SE không làm điều gì trái với GĐ-0, chỉ chưa làm.
---
## §2 — Khoản A0-3 ("đã nhận" trong sổ liên lạc): lỗ thật rộng gấp năm lần cách nó đang được kể
Đây là câu hỏi số 5 của lane. Câu trả lời ngắn: **đúng, đây là khoản A0-3 của GĐ-0** (đồng thời là bước `G0-B5` và ô nghiệm thu `G0-N3`). Câu trả lời dài quan trọng hơn, vì cách khoản này đang được mô tả — *"bốn thư nằm trong hộp thư hai ngày"***nhỏ hơn lỗ thật rất nhiều**, và vá theo mô tả đó sẽ để lại đúng cái lỗ cũ.
### 2.1 — Hai con số, và mỗi bên đang đếm cái gì
Tôi đo hai lần bằng hai phép độc lập, và hai phép ra cùng một con số, nên con số này đứng được.
- **Phép 1 — đếm dòng trong sổ.** Tách sổ theo hai khối rồi đếm dòng dữ liệu: khối nhận có **45** dòng, khối gửi có **47** dòng. Cộng hai khối cùng hai dòng tiêu đề ra 94, khớp với `grep -cE "^\| " broadcasts/_index.md` = **94**.
- **Phép 2 — đối chiếu ngược từ đĩa.** Duyệt từng tệp trong `broadcasts/inbox/*/`, lấy tên tệp bỏ đuôi, tìm chuỗi đó trong sổ: **69 tệp trên đĩa · 45 tệp có dòng · 24 tệp không có dòng**.
Hai phép gặp nhau ở con số 45. Vậy **lỗ thật là 24 lá thư, không phải 4**. Và lá cũ nhất trong 24 lá đó đề ngày **2026-07-13**, tức là đã nằm im **25 ngày**, không phải 2 ngày.
Nói rõ mỗi bên đếm gì, vì đây là chỗ dễ cãi nhau vô ích:
- **"4 thư · 2 ngày"** đếm *riêng bộ bốn món của gói này*, tính từ lúc chúng hạ cánh xuống đĩa (`2026-08-05 10:18:34`, commit `3a6eb92`) tới hôm nay (`2026-08-07`). Con số này **đúng** trong phạm vi của nó.
- **"24 thư · 25 ngày"** đếm *mọi thư trong hộp thư chưa có dòng trong sổ*. Con số này cũng đúng, và nó mới là phạm vi mà khoản A0-3 nói tới, vì A0-3 đòi *sổ liên lạc* làm được việc của sổ liên lạc.
- Bẫy đơn vị thứ ba, tôi tự dẫm rồi tự bắt: cùng commit `3a6eb92`**năm** tệp cùng thời điểm sửa đổi, không phải bốn — lá thứ năm là `2026-07-28-Governance-day-wake-probe-first-resume.md`. Nếu ai đo bằng thời điểm sửa đổi tệp thì sẽ ra 5; đo bằng "món của gói" thì ra 4.
### 2.2 — Vì sao lỗ này lại tồn tại: luật lane có hai chỗ ghi
Đây mới là nguyên nhân, và nó **không phải là "quên"**. Tôi phân loại 69 tệp theo trường `to:` trong phần đầu tệp:
| Loại thư (`to:`) | Có dòng trong sổ | Không có dòng | Tổng |
|---|---|---|---|
| `se` — thư gửi đích danh | **23** | **0** | 23 |
| `all-fit` — thư phát đại trà | 22 | **20** | 42 |
| `all` — thư phát đại trà | 0 | **1** | 1 |
| (không có dòng `to:`) | 0 | **3** | 3 |
| **Tổng** | **45** | **24** | **69** |
Đọc bảng này ra được ba điều, và điều thứ ba là điều đắt nhất.
1. **Lane thư gửi đích danh sạch tuyệt đối: 23 trên 23.** Đây là control dương mạnh nhất tôi có — nó chứng minh kỷ luật ghi sổ của SE *có tồn tại và có chạy*, nên 24 lá kia không phải do lười.
2. **Lane thư phát đại trà rò gần một nửa: 22 vào sổ, 21 không.** Cùng một loại thư, hai số phận khác nhau.
3. **Chính cuốn sổ tự viết rằng loại thư này không thuộc về nó.** `broadcasts/_index.md:7` ghi: *"Fan-out adap broadcast (≠ email directed) → `outbox/all/` (pull `/adap-apply`), track ở COMMS-LEDGER OUT — KHÔNG ở index này"*. Nghĩa là theo luật của chính SE, 21 lá phát đại trà **không sai khi vắng mặt**. Nhưng 22 lá cùng loại **lại có mặt**, ghi đầy đủ `ai_infra → se`, `processed`, dấu `✓` — ví dụ `broadcasts/_index.md:27`, `:28`, `:30`, `:34`, `:39`. Vậy luật nói một đằng, cuốn sổ làm một nẻo, hai mươi hai lần.
### 2.3 — Cuốn sổ mà luật trỏ tới **không tồn tại trong kho SE**
Đây là phát hiện nặng nhất của §2, và nó biến khoản này từ "quên ghi" thành "không có chỗ để ghi".
Luật ở `_index.md:7` bảo đi ghi ở *COMMS-LEDGER*. Tôi tìm:
- `find . -iname "*COMMS*"` (loại `.git``node_modules`) → **không có tệp nào**.
- Control dương cho chính phép tìm đó: cùng lệnh `find . -iname "*ledger*"` → ra **4 tệp** (`.claude/governance/reinject-ledger.md`, `.claude/workflows/runs/_ledger.md`, `docs/governance/error-ledger.md`, và một tệp nhật ký phiên). Vậy lệnh chạy được, thư mục đọc được; kết quả rỗng là rỗng thật.
- Mọi lần chữ `COMMS-LEDGER` xuất hiện trong kho SE đều đang nói về **kho của hub**, không phải kho SE. Bằng chứng rõ nhất: `.claude/workflows/runs/2026-07-25-S152-h24-open-bookend/sub-lead-stale-close-S152.md:163` liệt ba tệp của hub, trong đó có `docs/governance/COMMS-LEDGER.md` — tức là tệp ấy nằm ở AI_INFRA.
**21 lá thư phát đại trà đang không có sổ nào nhận chúng.** Sổ A từ chối chúng bằng văn bản, sổ B không tồn tại. Đây đúng cái mà GĐ-1 mục (i) gọi tên: *"Cho phép hai chỗ đặt là cho phép hai chỗ tìm, và tới lúc cần thì ai cũng tìm chỗ còn lại."* Ở SE thì tệ hơn một bậc: chỗ còn lại **không có**.
### 2.4 — Khoản này đã từng bị xử là báo động giả, và cách xử đó nay không còn đứng vững
Ngày 2026-07-26, phiên S153 đã gặp đúng câu hỏi này và kết luận là **dương giả**: *"F-4 `_index` inbound = dương-giả (19 thư fan-out `outbox/all`, header `:7` khai track ở COMMS-LEDGER)"*`.claude/workflows/runs/2026-07-26-S153-bookend-close/bookend-close-synthesis.md:25`, và vòng kiểm độc lập ghi nhận không chấm lại ở `sub-ring1-close-S153.md:161`.
Kết luận đó **hợp lệ tại thời điểm đó** trong phạm vi câu hỏi lúc đó ("sổ này có thiếu dòng không?"). Nhưng nó **không trả lời** câu hỏi mà A0-3 đặt ra bây giờ ("bạn có tìm được dòng *đã nhận* bằng một lệnh tìm kiếm không?"). Hai câu hỏi khác nhau, nên hai kết luận không mâu thuẫn nhau — nhưng ai đem kết luận cũ ra dùng cho câu hỏi mới sẽ đóng nhầm một khoản đang hở. Thêm nữa, con số đã trôi từ **19 lên 21** trong mười hai ngày, nên ngay cả trong phạm vi cũ thì lỗ vẫn đang lớn dần.
Cùng cuốn sổ còn mang sẵn một vết tự thú của đúng lớp lỗi này ở phần cuối tệp: *"Reconcile S123 — hai dòng đầu là email S122 đã gửi nhưng chưa từng được log … `_index` là sổ mà hub và audit đọc; email gửi mà không log thì hub không biết có nó."* Lớp lỗi đã được đặt tên, đã được vá một lần ở chiều gửi, và **đang tái diễn ở chiều nhận**.
### 2.5 — Vá thế nào cho đúng khuôn
Bốn việc, làm đúng thứ tự này. Việc 1 và 2 là bắt buộc để đóng A0-3; việc 3 là thứ ngăn nó tái phát; việc 4 là thứ hub sẽ soi.
1. **Chọn một chỗ, bỏ chữ "hoặc".** Quyết định thư phát đại trà nhận vào thì ghi ở đâu, rồi sửa luật ở `broadcasts/_index.md:7` cho khớp với thực tế. Có hai đường đi được, và **đường thứ nhất rẻ hơn nhiều**: (a) mở phạm vi khối `INBOUND` của `_index` để nhận cả thư phát đại trà — cách này hợp thức hóa 22 dòng đã tồn tại thay vì phải gỡ chúng ra; (b) dựng một cuốn sổ thứ hai trong kho SE và **đồng thời** gỡ 22 dòng kia khỏi `_index`. Chọn (b) mà quên vế gỡ là tạo ra đúng tình trạng hai chỗ ghi mà GĐ-1 cấm.
2. **Bù đủ 24 dòng, không bù 4.** Bù 4 dòng cho riêng gói này rồi tuyên đã xong A0-3 là để lại 20 lỗ và làm cuốn sổ tiếp tục nói dối. Mỗi dòng cần: ngày nhận · mã định danh · `ai_infra → se` · nấc hiện tại · mã băm · dấu đối chiếu. Riêng bốn món của gói, mã băm lấy từ phần đầu tệp (`43db2cf0` · `49287ce7` · `98e31fad` · `c24699f0`) và dấu đối chiếu lấy từ kết quả `scripts/stamp_verify.py` — như vậy một việc đóng luôn hai khoản, vì đây cũng chính là chỗ ghi thường trực còn thiếu của `G0-B2`.
3. **Cắm một phép đối chiếu ngược chạy được.** Phép ở §2.1 (duyệt tệp trên đĩa, tìm tên trong sổ, in ra danh sách vắng mặt) là một vị từ máy kiểm hoàn chỉnh cho A0-3 — nó đọc **hai nguồn** (đĩa và sổ) đúng như GĐ-2 mục (ii) đòi, thay vì chỉ đọc sổ, mà đọc sổ thì là tự soi mình. Chạy nó ở cửa đóng phiên là bắt được ngay lá thư kế tiếp bị rơi.
4. **Ba lá không có dòng `to:` phải xử riêng, đừng gộp.** `2026-07-20-Governance-auto-toan-vong-distill-2-tang.md`, `2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md`, `2026-07-25-Governance-model-default-opus-5-max.md` — cả ba thiếu trường `to:`, nên mọi phép phân loại theo `to:` sẽ **bỏ rơi chúng trong im lặng**. Đây là ca "vắng mặt trông giống ổn": chúng không rơi vào bất kỳ nhánh nào của luật lane, kể cả sau khi luật được sửa.
**Một hệ quả cần nói thẳng:** cả bốn món đều mang `to: all-fit`, nghĩa là chúng là thư phát đại trà. Vậy trước khi bù dòng cho chúng, việc 1 phải xong — nếu không thì bù dòng chính là hành vi vi phạm luật đang có hiệu lực ở `_index.md:7`, và ta lại thêm 4 vào con số 22.
---

View File

@ -29,4 +29,414 @@ Hai bộ này **giao nhau nhưng không trùng**. Ví dụ: sàn (v) "Khai luôn
## §1 — Bóc từng khoản (13 khoản, không gộp)
*(các mục dưới đây được append dần trong lúc đo — xem §1.1 trở đi)*
> Ký hiệu: **ĐÃ-CÓ** = SE có vật thật, chạy được · **THIẾU** = không tồn tại · **NGƯỢC** = SE có thứ chỏi hub · **NỬA** = có một phần, khai rõ phần nào.
### B-01 — Liệt kê TỪNG CỬA sinh ý kiến phản biện, mỗi cửa chốt một đích ghi tệp nguyên văn
*(neo: thư chính `:155` bước 1 · phụ lục `:147` sàn (i) · nghiệm thu ô 1 `:172` "liệt kê **từng cửa**, đừng ghi 'tất cả các cửa'")*
**SE đã có — NỬA.** Cửa của SE (liệt từng cửa, không ghi gộp):
| # | Cửa | Có sinh ý kiến phản biện? | Đích ghi tệp nguyên văn | Bằng chứng |
|---|---|---|---|---|
| 1 | `/session-start` (bookend @open) | CÓ — cặp `lead-stale-auditor` + `lead-gap-auditor` + `ring2-audit` | `runs/<id>/sub-<role>-*.md` | `.claude/commands/session-start.md:269` |
| 2 | `/session-end` (closeout) | CÓ — cùng cặp + `harvest-curator` + `tooling-auditor` | `runs/<id>/sub-<role>-*.md` | `session-end.md:119` · `session-end.md:164` (khối instruments) |
| 3 | `/tiep` (nối mạch) | CÓ — Sàn-3 probe + `mind-check` | **KHÔNG có đích tệp bắt buộc** — kết quả in ra hội thoại | `tiep.md:154` (gọi probe) · `:169` (mind-check) |
| 4 | `/pause` | CÓ — đèn nợ + liệt việc đã-review | WAL + `run.md`, **không phải tệp nguyên văn per-cửa** | `pause.md:113` |
| 5 | HMW fan-out (mode B) | CÓ — mỗi sub trả verdict | `runs/<id>/sub-<role>-<i>.md` + `<stage>-synthesis.md` | `.claude/workflows/hmw.js:9` · `runs/README.md:11` (C1 PHẲNG) |
| 6 | HMW mode A (return-delta-only, **default S93+**) | CÓ | **KHÔNG có run-folder — by-design** | `_ledger.md` header (Mode-A ephemeral, S98) |
| 7 | `/adap-apply` · `/adap-report` · `/check-email` | CÓ (phản biện adap) | `docs/governance/adap-reports/` cho report; `/check-email`, `/adap-apply` **CHƯA ĐO** | N1 `sub-invest-fitmap-S180.md:106` cũng khai chưa đo |
**Kết luận B-01:** 5/7 cửa có đích ghi đĩa; **cửa 3 và cửa 4 KHÔNG có** — đây đúng cái bệnh hub kể ở phụ lục `:147` (*"một cờ cảnh báo phát ở cửa trước, tới cửa sau muốn truy lại thì không còn gì để đọc"*). Cửa 6 là **miễn hợp lệ có khai** (by-design, có ghi lý do trong `_ledger.md` header) — đúng chuẩn `không áp dụng` của hub.
**THIẾU:** bảng 7 dòng như trên **chưa tồn tại ở bất kỳ đâu trong repo** — tôi vừa dựng nó lần đầu ngay trong file này. Nghiệm thu ô 1 của hub đòi đúng bảng này.
---
### B-02 — Khuôn tối thiểu của tệp nguyên văn (tiêu đề cố định · nhãn lượt chạy + mô hình tự khai · đầu vào ghim đích danh · kết luận · thân cấm nén)
*(neo: thư chính `:156` bước 2 · phụ lục `:147`)*
**SE — NỬA, và đây là chỗ mỏng nhất của lane ghi.**
- **Có:** `runs/README.md:35` (C2) quy định scaffold `run.md` ở OPEN, có taskList snapshot (`:45`).
- **Có:** AS-20 guard đòi **END-line** `END <slug> — VERDICT=<…>` cho mọi `sub-*.md` (`docs/governance/error-ledger.md:38`).
- 🔴 **NGƯỢC / hở nghiêm trọng:** END-line đó **CHƯA ĐƯỢC WIRE**. `session-end.md:128` khai thẳng: *"Vế 'luật END-line' của H2-P5 **CỐ Ý KHÔNG wire** ở đây — đó là slot **(44)** chờ anh (chưa từng được hỏi)"*. Tức error-ledger cột "guard" mô tả một guard **chưa có đường thi hành** ⇒ người đọc error-ledger tưởng có máy canh. Đây đúng khoản **A16** của hub (*"để người đọc tưởng có máy canh mới là khai sai"*) và đúng lớp **ghost-wire** của chính SE (H18).
- **THIẾU:** 3/5 trường khuôn — *nhãn mô hình tự khai*, *đầu vào ghim đích danh*, *thân cấm nén* — không có quy định thành văn nào ở `runs/README.md`. (File lane B này tự áp đủ 5 trường ở header, nhưng đó là tôi tự áp, **không phải luật repo**.)
---
### B-03 — Đích ghi nằm trong vùng có quét bí mật, không rơi vùng miễn quét
*(neo: thư chính `:157` bước 3 · phụ lục `:147` câu cuối)*
**SE — NỬA, và có một lỗ ĐO ĐƯỢC.**
- **Có:** `scripts/session_ctx.py::secrets_sweep` dùng `rglob` phủ trọn session-dir (`:173`, `:180`) — S153 đã kéo `_mind` vào lưới. ✅ cho `.claude/sessions/`.
- 🔴 **Lỗ:** `scripts/governance-detectors.ps1:128` liệt `'\.claude\workflows\runs\'` trong **ExcludeDirFragment**, và `:1168` tự khai nguyên văn: *"live under .claude/workflows/runs/ which is already an ExcludeDirFragment"*. Nghĩa là **run-folder — nơi chứa toàn bộ vật chứng đắt tiền — nằm trong vùng detector CỐ Ý bỏ qua** cho phần lớn phép quét. C11 phải **tự mở lại** `$runsRoot` (`:1724`) mới soi được. Đây chính xác là cảnh báo cuối sàn (i) của hub: *"đừng đổ vào vùng miễn quét"*.
- **CHƯA ĐO:** `secrets_sweep` có phủ `.claude/workflows/runs/` không — cần `grep -n "runs\|rglob\|scan_root" scripts/session_ctx.py` quanh `:150-200`.
---
### B-04 — Sổ mục lục **hai tầng**: tầng-A gói-theo-loại · tầng-B mục-lục-SỐNG
*(neo: thư chính `:158` bước 4 · phụ lục `:159` sàn (iv))*
🔴 **Đây là khoản NẶNG NHẤT của lane B, và trạng thái thật KHÁC với những gì tên tệp gợi ý.**
**Tầng-A (gói theo loại: mẫu đường dẫn · chức năng · ai ghi · ai đọc · bộ tệp chuẩn) — ĐÃ-CÓ, khá tốt.**
`.claude/workflows/runs/README.md` (18.173 B) — có `C1` cấu trúc PHẲNG (`:11`), `C2` scaffold OPEN (`:35`), `C3` git-tracked verify 2 nấc (`:56`), `C4` per-turn primary (`:74`), `C5` 3-layer anti-miss (`:79`), `C7` caveat trung thực (`:104`), `C8` migration (`:112`), containment model (`:128`).
**Tầng-B (mục-lục SỐNG) — 🔴 KHÔNG TỒN TẠI. `_ledger.md` đã CHẾT, và chết CÓ KHAI.**
Đo (lệnh + kết quả, dán được):
```
ls .claude/workflows/runs/ | wc -l → 90 (ENTRY: 88 thư mục + 2 tệp)
find .claude/workflows/runs -maxdepth 1 -mindepth 1 -type d | wc -l → 88 (FOLDER thật)
wc -c .claude/workflows/runs/_ledger.md → 9683
```
🔴 **Bẫy đơn-vị bắt được ngay tại đây (ca thứ 3 của phiên):** N1 viết *"**90 folder**"* (`sub-invest-fitmap-S180.md:73`). Số 90 là **số ENTRY của `ls`**, không phải số **FOLDER**. Folder thật = **88**. Chênh 2 = đúng 2 tệp `README.md` + `_ledger.md`. N1 không sai phép đo, sai **nhãn đơn vị**. → Hỏi "đếm CÁI GÌ" trước khi hỏi "ai sai": ở đây cả hai số đều đúng với đơn vị của nó.
**Trạng thái `_ledger.md`:** header dòng 3 khai nguyên văn **🧊 RETIRED (H18-B, S100 2026-07-02)** — *"KHÔNG ghi beat mới"*. 15 row lịch sử, **toàn bộ đề ngày 2026-06-18**. Run mới nhất trên đĩa = `2026-08-07-S180-…`. ⇒ **Khoảng chết = 06-18 → 08-07 ≈ 50 ngày, 8815 = 73 run-folder không có dòng nào trong sổ.**
🔸 **Phải khai công bằng:** đây **KHÔNG phải "sổ chết vì quên"**. Nó là **nghỉ hưu CÓ KHAI, có lý do đo được, có người kế nhiệm được chỉ định**: header ghi rõ catch-rate `0/15 row lifetime` + `coverage workflow gần đây 0/8`, và chỉ định *"Orphan-authority = **H2 FOLDER-SCAN**"*, kèm cả **caveat-3 parity trung thực** (*"run-folder-orphan chưa từng xảy ra ở CẢ 2 cơ chế — căn cứ retire = coverage-cấu-trúc, KHÔNG phải catch-rate hơn"*) và **đường đảo ngược** (gỡ dòng này + restore 6 mandate-consumer). Theo thang nhãn GĐ-3 của hub thì đây là **"suy giảm hợp lệ"**, không phải "tự ý bỏ".
**NHƯNG** — với GĐ-2(iv) thì hệ quả vẫn y hệt: **SE hiện KHÔNG có tầng-B mục-lục-sống nào cho `runs/`.** Cái thay thế (`nhip-no-probe` run-chua-gom) là một **BỘ ĐẾM**, không phải **MỤC LỤC**: nó in ra một con số, không liệt kê được run nào, không có ai-ghi/ai-đọc/bộ-tệp-chuẩn per-run, và **không thể dùng làm nguồn thứ hai** cho điểm-danh-2-nguồn (B-08) — vì nó đọc thẳng đĩa, tức nó **chính là nguồn thứ nhất**.
**Trần dung lượng ở tệp cấu hình chung, tài liệu chỉ trỏ khoá — ĐÃ-CÓ và đúng chuẩn hub, nhưng ĐÚNG MỘT TẦNG KHÁC.**
`memory-budget.json` giữ `archive_gate.autoinject_cap_bytes` + `tiers.l2_index.cap_bytes`; `nhip-no-probe.ps1:112-150` **đọc khoá, thiếu khoá thì in `CONFIG-THIEU(...)` chứ KHÔNG tự chế mặc định**. Đây là mẫu đúng y chữ hub. **Nhưng nó áp cho `agent-memory/`, KHÔNG áp cho `runs/`**`runs/_ledger.md``runs/README.md` **không có trần nào**, không khoá config nào, và không máy nào đo kích thước chúng.
---
### B-05 — Vai điểm danh vật chứng, **cấm sửa** và **cấm phán nội dung**
*(neo: thư chính `:159` bước 5 · phụ lục `:153` · nghiệm thu ô 2 `:173` · TC-05 thư chính `:80`)*
**SE — ĐÃ-CÓ ở trục "cấm sửa", THIẾU ở trục "chuyên điểm danh vật chứng".**
- **Cặp quan sát chạy VÔ-ĐIỀU-KIỆN @closeout:** `{harvest-curator, tooling-auditor}``scripts/closeout-sentinel.ps1` header (`:14-15`) khai default `-Roles`. INFORM-only.
- **Ràng "cấm sửa" được cưỡng chế THẬT bằng gì:** không phải bằng lời trong persona (propose-only sub **vẫn Bash-write được** — chính SE đã đo, `error-ledger` G-015). Backstop THẬT = **git-diff commit-gate** (AS-10). Đây là câu trả lời đúng và mạnh cho TC-05, và nó **mạnh hơn** cái hub mô tả (hub chỉ nói "ghi rõ nó cấm sửa" — SE có **cơ chế** chứ không chỉ có **chữ**).
- 🔴 **THIẾU:** cả 2 vai đó **điểm danh MEMORY/TOOLING, không điểm danh VẬT CHỨNG RUN-FOLDER**. Không vai nào có nhiệm vụ "so bộ tệp chuẩn của `runs/<id>/` rồi báo thiếu". `closeout-sentinel` M5 gần nhất — nhưng nó bắt *"audit đo rồi như chưa đo"* (thiếu delta role-dir), không bắt *"tệp trong run-folder cụt/rỗng"*.
---
### B-06 — 🔴 **Máy điểm danh 4 vị từ: VẮNG · RỖNG · CỤT · NÉN-QUÁ-TAY** + vị từ **bộ-tệp-nội-bộ-thư-mục**
*(neo: thư chính `:160` bước 6 · phụ lục `:149` sàn (ii) · bẫy 1 `:165` · nghiệm thu ô 3 `:174`)*
**Đây là trục nặng nhất mà lead giao. Trả lời thẳng: SE có 2/4 vị từ, và cả 2 đều ở SAI TẦNG.**
| Vị từ hub | SE có máy? | Máy nào · ở đâu · phủ cái gì |
|---|---|---|
| **VẮNG** | ✅ **CÓ**, nhưng phủ 2 tầng hẹp | (a) `scripts/nhip-no-probe.ps1:160-181` — vắng `*-synthesis.md` trong run-folder (DUAL-ACCEPT port `tiep.md:40-53`). (b) `scripts/memory-archive-gate.ps1` A7 — pointer trong `archive/_INDEX.md` phải resolve + file tồn tại. |
| **RỖNG** | ✅ **CÓ**, cùng 2 tầng đó | (a) `nhip-no-probe.ps1:168` `(Get-ByteLen …) -gt 0`**chỉ áp cho `*-synthesis.md`**. (b) `memory-archive-gate.ps1` A7 `size>0`. |
| **CỤT** (thiếu đầu / thiếu thân) | ❌ **KHÔNG CÓ MÁY NÀO** | error-ledger `:40` AS-17 — cột guard ghi *"lead verify BYTE-CONTENT tăng thật GIỮA wave"*, cột kiểu ghi thẳng **`procedural`** (`:74`). Tức = **NGHI THỨC, người phải nhớ.** |
| **NÉN QUÁ TAY** (so số ký tự với nguồn cùng đơn vị) | ❌ **KHÔNG CÓ MÁY NÀO** | error-ledger `:39` AS-19 — tự khai nguyên văn: **"🔴 hiện là **nghi-thức, chưa cơ-khí-hoá**"**. SE **đã tự biết và đã tự ghi**; hub chỉ xác nhận từ ngoài. |
| **bộ-tệp-nội-bộ-thư-mục** (soi chính thư mục của lượt chạy hiện tại) | ❌ **KHÔNG CÓ** | Không có định nghĩa "bộ tệp chuẩn của một run-folder" ở bất kỳ đâu. `runs/README.md:11` C1 mô tả *hình dạng* (`run.md` + `sub-*.md` + `*-synthesis.md`) nhưng **không máy nào đọc mô tả đó để đối chiếu**. ⇒ SE đang giẫm **đúng Bẫy 1** của hub (`:165`). |
🔴 **Kết luận B-06 — câu trả lời cho trục "cơ khí hoá vs nghi thức":** N1 nói SE *"có AS-17/AS-19"***đúng về sự tồn tại của LUẬT****sai nếu đọc thành có MÁY**. Bằng chứng không phải suy đoán của tôi — nó là **lời tự khai của chính SE trong cột kiểu của error-ledger**: AS-17 = `procedural`, AS-19 = `chưa cơ-khí-hoá`. Hub GĐ-2 đòi **vị từ máy kiểm được**; ở 2 vị từ đắt nhất (CỤT, NÉN) SE có **0 máy**.
---
### B-07 — Ba nhịp chạy: đầu phiên · **ngay sau mỗi lượt chạy đắt** · cuối phiên
*(neo: thư chính `:161` bước 7 · phụ lục `:157` sàn (iii))*
**SE — 2/3 nhịp ĐÃ-CÓ, nhịp giữa THIẾU (và đó đúng là nhịp cứu được tiền).**
| Nhịp | SE có? | Bằng chứng |
|---|---|---|
| Đầu phiên | ✅ | `session-start.md:269` — bookend @open + `nhip-no-probe` + Sàn-3 |
| Cuối phiên | ✅ | `session-end.md:164` — khối instruments 5 máy: `measure-agent-memory` + `memory-archive-gate` + `crystallized-backfill` + `nhip-no-probe` + `mfe-eval` AUTO |
| **Ngay sau mỗi lượt chạy đắt** | ❌ **THIẾU** | Có `harvest` per-turn primary (`hmw.js:9` C4) nhưng **không có máy điểm danh BẮT BUỘC chạy ngay sau mỗi spawn đắt**. |
🔴 **Đây chính là nhịp mà nếu có thì ca N1 đã được bắt trong ngày.** Hub viết ở `:157`: *"theo sự kiện, ngay sau mỗi lượt chạy đắt — bắt lúc còn cứu được"*. N1 đốt 202K token rồi hạ cánh skeleton; không máy nào chạy giữa lúc đó và lúc lead tình cờ mở file ra đọc.
---
### B-08 — Điểm danh **HAI NGUỒN** (đĩa đọc thẳng ⟂ mục lục), **ghi ra chênh lệch** thay vì làm tròn
*(neo: thư chính `:162` bước 8 · phụ lục `:155` gạch đầu dòng 3 · nghiệm thu ô 6 `:177`)*
🔴 **SE — THIẾU HOÀN TOÀN, và thiếu vì lý do cấu trúc chứ không phải vì quên.**
Điểm danh 2 nguồn cần **hai nguồn độc lập**. SE hiện chỉ có **một**: đĩa. Nguồn thứ hai (mục lục) đã nghỉ hưu (B-04) ⇒ phép so **không có vế phải**. Không phải "chưa làm phép so", mà là **không tồn tại thứ để so**.
**Cần nói rõ vì sao hub coi khoản này nặng** (phụ lục `:155`): *"Chỉ đọc mục lục là sai về nguyên tắc, vì mục lục do chính người điều phối ghi — đọc nó là tự soi mình."* SE hiện ở **thái cực đối xứng**: chỉ đọc **đĩa**. Đĩa thì không nói dối, nhưng đĩa **không biết cái gì lẽ ra phải có mà không có** — nó chỉ biết cái đang có. Đó đúng là lý do `run-chua-gom` đếm được "thiếu synthesis" (vì hình dạng đó được hardcode trong script) nhưng **không đếm được "thiếu lane N3-lane-C"** — không nguồn nào khai lượt chạy này lẽ ra đẻ mấy tệp.
**Nguyên liệu SE có sẵn để dựng vế phải:** `run.md` **đã chứa taskList snapshot ghi TRƯỚC launch** (`runs/README.md:45`, H22). Đó là **bản kê "lẽ ra phải có"** — tức vế phải đã tồn tại về mặt dữ liệu, chỉ chưa ai đọc nó bằng máy. Ở chính run này, `run.md:22`/`:34`/`:60-61` liệt đủ N1…N5. ⇒ khoản B-08 với SE **rẻ hơn vẻ ngoài**: không phải dựng sổ mới, mà là **đọc `run.md` làm nguồn-2**.
---
### B-09 — 🔴 Khoản sàn in đậm **GĐ-2 (v) "Khai luôn điểm mù"** — khoản N2 F-06 báo vắng trọn khỏi bản N1
*(neo: phụ lục `:161` — in đậm ⇒ thuộc sàn bắt buộc theo thư chính `:281`)*
**Hub đòi chính xác cái gì** (đọc nguyên văn `:161`): *"Vật chứng của **chính vai điểm danh** sinh ra **sau khi nó chạy xong**, nên **nó không tự soi được**. Cần **một vai khác cùng phiên**, **cộng lượt soi ở đầu phiên sau**, mới phủ hết."*
Bóc ra 3 vế đo được:
- **(v-1)** thừa nhận thành văn rằng vai điểm danh có điểm mù về chính nó;
- **(v-2)** có **vai thứ hai cùng phiên** soi chéo;
- **(v-3)** có **lượt soi ở ĐẦU PHIÊN SAU** bắt phần lọt.
**SE có tương đương gì (N2 gợi sentinel + bookend — tôi xác nhận và ghi rõ hơn):**
| Vế | SE có? | Vật thật |
|---|---|---|
| (v-1) thừa nhận điểm mù thành văn | ⚠️ **NỬA** — có nhận thức, chưa thành khoản | `runs/README.md:104` **C7 "CAVEAT trung-thực (no-overclaim)"** · `_ledger.md` header *caveat-3 parity* · `error-ledger` AS-17(b) *"phép trích-xuất trả RỖNG phải phân biệt 'không có gì' ⟂ 'phép đo hỏng'"* (`:120`). Đây là **cùng họ** với điểm mù nhưng **không phải cùng mệnh đề**: SE nói *"đừng đọc rỗng thành sạch"*, hub nói *"vai điểm danh không tự soi được chính nó"*. |
| (v-2) vai thứ hai cùng phiên | ✅ **CÓ, mạnh** | `closeout-sentinel.ps1` chạy **cặp** `{harvest-curator, tooling-auditor}` vô-điều-kiện; bookend chạy **cặp** `lead-stale` + `lead-gap`; `ring2-audit` AUTO chạy **sau** cặp và **PIN đích danh run-folder tươi (cấm glob-latest)**. Chữ "PIN đích danh, cấm glob-latest" chính là cơ chế cho phép vai-sau soi vật-chứng-của-vai-trước. |
| (v-3) lượt soi đầu phiên sau | ✅ **CÓ, và đúng nguyên văn hub** | Bookend chạy ở **CẢ HAI đầu**: `session-start.md:269``session-end.md:119` (HÌNH B @S149). `closeout-sentinel` M5 = *"lưới lùi cho cửa chết sớm"*. |
🔴 **Phán quyết B-09 (độc lập, không gật theo ai):**
1. **N2 F-06 ĐÚNG** — khoản (v) vắng trọn khỏi cả cột "Hub đòi" lẫn cột "SE thiếu" của N1 (`sub-invest-fitmap-S180.md:70` liệt đúng 6 ý, không có (v)).
2. **N2 còn nói nhẹ hơn sự thật ở một chỗ**: N2 viết SE *"có họ hàng gần"*. Đo kỹ thì SE **có 2/3 vế ĐẦY ĐỦ và đúng nguyên văn** (v-2, v-3) — đây là khoản SE **gần như đã áp xong** mà bản đồ lại bỏ trắng. Mất khoản này không phải mất cảnh báo, mà là **mất điểm cho việc đã làm đúng** — đúng cái A13 của hub cảnh báo (`:352`).
3. **Còn thiếu thật, và thiếu nhỏ:** chỉ (v-1) — **một dòng thành văn** đặt ở `runs/README.md` C7 nói rõ *"vật chứng của vai điểm danh sinh sau khi nó chạy ⇒ nó không nằm trong phạm vi tự soi; phủ bằng vai-cặp cùng phiên + bookend @open phiên sau"*. Chi phí ≈ 1 đoạn văn; giá trị = đóng trọn một khoản sàn in đậm.
4. 🔴 **Điểm mù mà chính hub cũng chưa nói tới, tôi bổ sung:** ở SE, `ring2-audit` PIN run-folder tươi — nhưng **vật chứng của ring2 lại sinh sau ring2**. Vế (v-3) của hub (bookend phiên sau) chỉ phủ nếu **bookend phiên sau thật sự đọc run-folder phiên trước**. **CHƯA ĐO** — cần `grep -n "run-folder\|runs/\|phiên trước" .claude/agents/lead-gap-auditor.md .claude/agents/lead-stale-auditor.md`.
---
### B-10 — Mức nghiêm trọng **tỉ lệ với chi phí chạy lại**
*(neo: phụ lục `:154` · thư chính `:287` — "nhà không có lượt chạy đắt thì phần này là *không áp dụng*, nhưng phải ghi lý do")*
**SE — THIẾU, và KHÔNG được khai `không áp dụng`.**
SE **có** lượt chạy đắt và có bằng chứng số: `run.md:25` — N1 lượt-1 đốt **202K token / 27 tool-use / 545s**. ⇒ nhánh miễn của hub không áp dụng cho SE.
Máy hiện tại **đối xử mọi tệp như nhau**: `nhip-no-probe` đếm orphan không phân biệt run 3-phút với run 202K-token. Không có trường "chi phí" nào trong `run.md` scaffold bắt buộc (có ghi tay ở `:25` nhưng là **văn xuôi, không phải trường máy đọc**).
🔸 **Ràng buộc SE phải tôn trọng khi dựng:** doctrine *"đo BYTE, CẤM quy token"* (S158). ⇒ trường chi phí nên là **byte đĩa + số tool-use + giây**, hoặc token **có neo nguồn** (dán từ máy, không gõ tay) — chứ không phải một chỉ số tổng tự chế.
---
### B-11 — Bẫy 2 hub: **ghi vật chứng TRƯỚC khi bắn, không phải sau**
*(neo: phụ lục `:166`)*
**SE — ĐÃ-CÓ, và mạnh hơn hub.** `runs/README.md:35` C2 — scaffold `run.md` ở OPEN **TRƯỚC khi invoke Workflow**; `:45` taskList snapshot ghi TRƯỚC launch (H22); spec-pin trước spawn (H21). Hub tự khai mắc lỗi này *"nhiều lần trong cùng một ngày"*; SE đã cơ-khí-hoá bằng thứ tự bắt buộc trong command.
🔸 **Nhưng có mặt sau, và mặt sau đó đang chảy máu:** ghi `run.md` trước ≠ **sub-file** có ruột. Ca N1 hôm nay: `run.md` đầy đủ, `sub-*` rỗng ruột. ⇒ Bẫy 2 đã đóng ở tầng **thư mục**, còn hở ở tầng **tệp con**.
---
### B-12 — Bẫy 3 hub: **cuối ngày là vùng nguy hiểm** — vật chứng bền phải ghi **ngay khi kết luận về**
*(neo: phụ lục `:167`)*
**SE — ĐÃ-CÓ ở mức luật, THIẾU ở mức máy.**
- Luật có, và có **răng đã chứng minh**: AS-17 guard *"resume-in-session ép đổ ruột"* — S151 cứu **5/5 sạch, 0 byte mất** (`error-ledger:74`). WAL S180 khai *"#53: 6/6 vai nặng dính, recover 6/6 **mất 0 byte**"*.
- Nhưng đó là **người vá sau khi sự cố xảy ra**, không phải **máy chặn trước**. Không có vị từ nào chạy tự động lúc kết luận về.
- 🔸 **Đối chứng dương cho biết luật này CÓ tác dụng thật:** `feedback_agent_return_garble_recover` ghi trio return-only **3/3 CLEAN** cùng phiên 10-garble ⇒ khuôn-return-cứng sống sót tốt hơn. Tức SE đã **đo được** thứ giúp giảm mất mát; nó chỉ chưa được đóng thành vị từ.
---
### B-13 — Nghiệm thu ô 4 hub: **đối chứng dương — gài một tệp rỗng vào phạm vi thì máy PHẢI bắt**
*(neo: phụ lục `:175` · thư chính `:169`)*
🔴 **SE — TRƯỢT, và tôi đã chạy phép thử này chứ không suy đoán.** Kết quả ở §2 dưới.
---
## §2 — Phép thử tay: chạy máy SE lên đúng hiện vật của ca N1
**Thiết lập (sandbox, KHÔNG chạm repo thật):**
- Rút bản lượt-1 của N1 từ git: `git show c7248b5:.claude/workflows/runs/2026-08-07-S180-…/sub-invest-fitmap-S180.md`**7.049 B** (khớp đúng con số lead đưa; bản hiện tại ở `d8c107c` = 48.433 B).
- Dựng `sandbox/.claude/workflows/runs/2026-08-07-SBX-skeleton/` gồm: `run.md` · `invest-synthesis.md` · **`sub-invest-fitmap-S180.md` = bản skeleton 7.049 B** · **`sub-empty-lane.md` = 0 byte** (đây chính là "tệp rỗng gài vào phạm vi" mà nghiệm thu ô 4 của hub đòi).
**Đo hiện vật skeleton (bản 7.049 B):**
```
grep -c "^#" → 10 (1 tiêu đề + 9 heading mục)
grep -n "^##" → 9 dòng
grep -c "ĐANG ĐO" → 5 (+2 dòng "[CHỜ §…]" = 7 nhãn treo)
```
Sáu heading mang nhãn treo: `### GĐ-1..GĐ-6 [ĐANG ĐO]` · `## §2 [ĐANG ĐO]` · `## §3 [ĐANG ĐO]` · `## §4 [ĐANG ĐO]` · `## §5 [CHỜ §1-§4]` · `## §6 [CHỜ §1-§5]`.
**Xác nhận con số "6/9" của lead — và khai mẫu số mà lead không khai: mẫu số = 9 dòng heading cấp `##`/`###` (không tính dòng tiêu đề `#`).** Nếu đếm theo **mục cấp 1 (§0…§6) thì là 5/7**; nếu đếm theo **ruột thật thì §0 + GĐ-0 xong, phần còn lại trống**. Ba cách đếm, ba con số, **cùng một sự thật** — nên bắt buộc phải khai đếm-cái-gì.
**Chạy máy SE (`scripts/nhip-no-probe.ps1 -RepoRoot <sandbox>`):**
```
NHIP-NO: kiem light 1/6 deep 14/15 ok | tran-bo-nho 0 over-cap l2idx 0 over | run-chua-gom 0 | pull-cach 16 ngay
exit=0
```
🔴 **`run-chua-gom 0` — SẠCH.** Máy nhìn thẳng vào một thư mục chứa (a) skeleton 6/9 mục rỗng và (b) một tệp **0 byte**, rồi báo **không có gì bất thường**.
**CONTROL-DƯƠNG (bắt buộc — chứng thước không hỏng):** giấu `invest-synthesis.md` đi rồi chạy lại:
```
… | run-chua-gom 1 | … ← bắt được
… | run-chua-gom 0 | … ← trả lại synthesis, sạch trở lại
```
✅ Thước **SỐNG**. Vậy `0` ở trên là **mù thật**, không phải hỏng máy. (Đây đúng phép "0-hit phải kèm control-dương".)
**Kết luận §2 — trả lời trực diện câu lead hỏi:** với ca N1, **KHÔNG máy nào của SE bắt được**, vì:
- `nhip-no-probe` chỉ soi **sự tồn tại + độ rỗng của `*-synthesis.md`**`sub-*.md` **hoàn toàn ngoài tầm**;
- `memory-archive-gate` soi `agent-memory/`, **không soi `runs/`**;
- `closeout-sentinel` M5 soi **delta thư mục vai**, không soi ruột tệp;
- `governance-detectors` C11 có mở `runs/` nhưng chỉ kiểm **khuôn tag FLAG** (và chỉ cho tệp tên chứa `lead-stale|lead-gap|ring2-audit`) + **diary-delta cho vai INFORM-only**`sub-invest-fitmap-*.md` **không khớp cả hai lối**;
- guard AS-17 *"verify byte tăng"***theo đúng thiết kế của nó**: 7.049 > 0 và đang tăng ⇒ mọi vị từ dựa trên **kích thước** đều xanh.
🔴 **Chẩn đoán gốc (không phải "quên viết máy"):** vị từ đang đo **KÍCH THƯỚC**, còn thứ hỏng là **TỈ LỆ KHUNG/RUỘT**. Hai đại lượng này **không tương quan** — một tệp toàn heading tăng byte y hệt một tệp đầy nội dung. Đây cũng đúng chữ SE tự viết trong `feedback_agent_return_garble_recover`: *skeleton-nấc-2 … **byte>0 nên guard "verify byte tăng" mù, phải đọc RUỘT***. SE **đã biết** trước hôm nay; cái thiếu là **vị từ**.
---
## §3 — Vị từ ĐỀ XUẤT (propose-only — lead/anh quyết; tôi không sửa gì)
Bốn vị từ, xếp theo rẻ→đắt. Mỗi cái kèm **cách nó TRƯỢT nếu sai** (để không thành nhãn-đo-lường rỗng).
**V-1 — Tỉ lệ ruột/khung (rẻ nhất, bắt trúng ca N1).**
```
body=$(grep -vcE '^#{1,4} |^\s*$|^>|^\|' <file>) # dòng ruột thật
head=$(grep -cE '^#{1,4} ' <file>) # dòng heading
FLAG nếu head > 0 và body / head < K
```
Ca N1 lượt-1: body ≈ 30 (§0 + GĐ-0), head = 10 ⇒ tỉ lệ ≈ 3. Bản hoàn chỉnh 48.433 B: tỉ lệ cao hơn hẳn. **K phải do owner đặt, và phải đo phân bố trên 88 run-folder hiện có trước khi chọn** — chọn K bằng cảm tính là tự đẻ dương-giả. *Trượt khi:* tệp toàn bảng markdown (`|`) — nên dòng bảng phải tính là ruột, tôi đã loại `^\|` khỏi tử số ⇒ **cần sửa: bảng PHẢI đếm là ruột**. Ghi rõ đây là chỗ vị từ này dễ sai nhất.
**V-2 — Đếm nhãn treo (bắt trực tiếp, gần như 0 dương-giả).**
```
grep -cE '\[(ĐANG ĐO|CHỜ|TODO|PENDING)[^]]*\]' <file> → > 0 ⇒ FLAG "artifact còn nhãn treo"
```
Ca N1 lượt-1 = **7 hit** ⇒ bắt ngay. Bản cuối = cần đo lại (nếu bản cuối vẫn còn nhãn treo hợp lệ thì vị từ này cho dương-giả — **CHƯA ĐO**, cần `grep -cE '\[(ĐANG ĐO|CHỜ)' sub-invest-fitmap-S180.md` trên bản 48.433 B).
*Ưu điểm lớn:***thưởng cho hành vi đúng** — sub ghi nhãn treo thật thà vẫn bị bắt, nhưng bị bắt **có tên**, đúng tinh thần A14 của hub (*"nợ có tên sẽ được trả"*).
**V-3 — Bộ-tệp-nội-bộ-thư-mục = đọc `run.md` làm nguồn-2 (đóng luôn B-08 + Bẫy 1).**
Vị từ: mọi lane liệt trong taskList của `run.md` phải có tệp tương ứng trong cùng thư mục, **và tệp đó phải qua V-1/V-2**. Chênh lệch **in ra danh sách tên**, không in số tổng.
*Đây là khoản đắt nhất nhưng cũng là khoản duy nhất biến "đếm" thành "mục lục".* Nguyên liệu đã có sẵn (`runs/README.md:45` taskList snapshot).
**V-4 — Nén quá tay (AS-19): so số ký tự với nguồn CÙNG ĐƠN VỊ.**
Khi một block bị nén: `chars(sau) / chars(trước)` < ngưỡng **và** số mục (`grep -c '^- '` hoặc `^\|`) giảm FLAG. Hub nói thẳng: không nguồn cùng đơn vị thì **khai "không đo được"** với SE nguồn cùng đơn vị **có sẵn ở git** (`git show HEAD~1:<file>`). *Trượt khi:* nén hợp lệ khai (chuyển sang con trỏ) cần cho phép miễn-trừ **hiện hình** (một dòng khai nơi-đi từng ý, đúng chữ AS-19).
---
## §4 — 🔴 Ca sống của chính vai đi soi (datum, không phải lời xin lỗi)
Lead đo file này lượt-1: **2.765 B · 3 heading · 19 dòng ruột · 0 placeholder**, sau **150K token / 37 tool-use**.
Đây **datum thứ hai trong cùng một phiên** cho đúng lớp bệnh, **khác N1 ở một chỗ có ý nghĩa cho việc chọn vị từ**:
| | N1 lượt-1 | N3-lane-B lượt-1 |
|---|---|---|
| byte | 7.049 | 2.765 |
| nhãn treo | **7** | **0** |
| tỉ lệ ruột/heading | 3 | 6,3 |
| bản chất | khung đầy đủ, **ruột rỗng** | khung nhỏ, **ruột thật nhưng mới bắt đầu** |
**V-2 (đếm nhãn treo) phân biệt đúng hai ca này; V-1 (tỉ lệ) thì không** sẽ đánh cả hai, hoặc tha cả hai, tuỳ K. **Bài học cho người dựng máy: V-2 rẻ hơn VÀ chính xác hơn V-1 cho đúng lớp `skeleton-ruột-rỗng`; V-1 chỉ nên là lưới phụ.** Nếu không ca thứ hai này thì không phát hiện được điều đó ghi lại như bằng chứng, không phải như lời thú tội.
🔸 Khai thẳng mặt còn lại: cả hai ca đều cho thấy **tỉ lệ byte-đĩa / token-đốt** tín hiệu giám sát được (N1: 7.049 B / 202K **15%** giá trị trên đĩa theo chính lead tính; tôi: 2.765 B / 150K). `investigator-codebase` archive S180 đã đề xuất nối tín hiệu này vào AS-17. **Tôi ủng hộ, có bảo lưu:** SE doctrine *"đo BYTE, CẤM quy token"* nếu wire thì token phải **dán nguyên văn từ máy**, không tay (đúng luật A11 + đèn-nợ của hub).
---
## §5 — Ô fit-map GĐ-2: đúng giá trị nào, và mẫu số
N1 ghi ô GĐ-2 = **"áp dụng (nâng từ ~70%)"** (`sub-invest-fitmap-S180.md:224`) TC-05 = **"ĐÃ CÓ 70%"** (`:179`).
🔴 **Cả hai đều vi phạm A11 (con số phải neo nguồn) và Bẫy-5 GĐ-3 (báo đủ tick mà không nói mẫu số).** N2 đã bắt (`sub-review-n2-S180.md:82`) đếm lại **5,5-6/8 bước**. Tôi đếm độc lập theo **mẫu số riêng của lane B = 13 khoản**:
| Trạng thái | Khoản | Số |
|---|---|---|
| **ĐÃ-CÓ (trọn)** | B-05 (cấm-sửa, mạnh hơn hub) · B-11 (ghi trước khi bắn) | **2** |
| **NỬA** ( phần, thiếu phần liệt từng cái) | B-01 (5/7 cửa) · B-02 (2/5 trường, END-line chưa wire) · B-03 (sweep , `runs/` trong ExcludeDirFragment) · B-04 (tầng-A , tầng-B chết) · B-06 (2/4 vị từ, sai tầng) · B-07 (2/3 nhịp) · B-09 (2/3 vế) · B-12 (luật , máy không) | **8** |
| **THIẾU (trọn)** | B-08 (điểm danh 2 nguồn) · B-10 (mức nghiêm trọng theo chi phí) · B-13 (đối chứng dương đã chạy, TRƯỢT) | **3** |
| **NGƯỢC** | **0** GĐ-2 **không có xung đột triết lý nào** với SE. (Xung đột exit-0-advisory cổng-chặn-mã-lỗi của **GĐ-3**, không phải GĐ-2. N1 ghi "Xung đột: không" GĐ-2 **tôi xác nhận N1 đúng ở điểm này**.) | **0** |
**Quy đổi sang các mẫu số khác — để ai đếm kiểu nào cũng lần được:**
- Theo **13 khoản lane B**: `2 trọn + 8 nửa + 3 thiếu` nếu tính nửa = 0,5 thì **6/13 ≈ 46%**.
- Theo **8 bước thư chính** (`:154-162`): trùng cách N2 đếm ** 5,5-6/8 69-75%**.
- Theo **6 ô nghiệm thu phụ lục** (`:172-177`): ô1 nửa · ô2 đạt · ô3 **trượt** · ô4 **trượt (đã chạy, §2)** · ô5 nửa (sổ tồn tại nhưng đã retired; **không có trần khai**) · ô6 **trượt** **1,5/6 = 25%**.
🔴 **Ba mẫu số, ba con số: 46% · 72% · 25%.** Chênh gần **ba lần**. Đây do hub cấm in số trần. Con số "~70%" của N1 **không sai** con số của **mẫu số 8-bước**, tức mẫu số **dễ nhất trong ba**. Mẫu số **khó nhất và cũng là mẫu số hub dùng để cấp nấc** **6 ô nghiệm thu**, đó SE mới **25%**.
**Ô fit-map đúng (1 trong 3 giá trị hub cho phép): `đã áp một phần` không phải giá trị hợp lệ ⇒ chọn `chưa làm` + mốc.** Cụ thể: **GĐ-2 = `chưa làm`**, kèm mốc W2 kèm khai *"tầng-A + vai-cấm-sửa + ghi-trước-khi-bắn đã có sẵn, sẽ tái dùng"*. do phải chọn `chưa làm` chứ không `đã áp`: **4/6 ô nghiệm thu trượt**, trong đó ô-4 tôi **đã chạy phép thử và máy trượt thật** 2) theo A14 của hub, đánh dấu xong không bằng chứng chạy được lớp lỗi đắt nhất.
---
## §6 — CHƯA ĐO (bàn giao được, kèm lệnh cụ thể)
1. `secrets_sweep` phủ `.claude/workflows/runs/` không `grep -n "rglob\|scan_root\|runs" scripts/session_ctx.py` quanh `:150-200`.
2. Bookend @open phiên sau thật sự đọc run-folder phiên TRƯỚC không (vế v-3 của B-09) `grep -n "run-folder\|runs/\|phiên trước\|previous" .claude/agents/lead-gap-auditor.md .claude/agents/lead-stale-auditor.md`.
3. Bản N1 hoàn chỉnh (48.433 B) còn nhãn treo nào không (chỉnh ngưỡng V-2) `grep -cE '\[(ĐANG ĐO|CHỜ)' .claude/workflows/runs/2026-08-07-S180-…/sub-invest-fitmap-S180.md`.
4. Phân bố tỉ lệ ruột/heading trên 88 run-folder để chọn K cho V-1 vòng lặp `grep -vcE` / `grep -cE` trên `runs/*/sub-*.md`.
5. `governance-detectors.ps1` chạy trên repo thật đã xong (nền, exit=0) **chưa đọc output**; cần soi xem FLAG nào chạm `runs/` ngoài C11 không đọc `det-real.txt`, `grep -i "runs\|C11"`.
** 5/5 mục trên ĐÃ ĐÓNG §7 dưới.** Không còn nợ trong lane B.
---
## §7 — Đóng 5 mục `CHƯA ĐO` (đo xong, dán lệnh + kết quả)
### 7.1 — [đóng mục 1] `secrets_sweep` **KHÔNG** phủ `runs/` ⇒ B-03 nặng hơn tôi viết ở §1
```
grep -n "def secrets_sweep\|rglob\|secrets_sweep(" scripts/session_ctx.py
:173 def secrets_sweep(session_dir):
:180 for p in sorted(session_dir.rglob('*')):
:787 hits = secrets_sweep(session_dir)
```
Hàm nhận **`session_dir`** `rglob` **bên trong đó** phạm vi = `.claude/sessions/<n>/`. **`.claude/workflows/runs/` nằm ngoài.**
🔴 **Sửa đánh giá B-03 từ NỬA xuống THIẾU-CÓ-TÊN.** Vật chứng đắt tiền của SE bị **hai vùng miễn cùng lúc**:
1. **ngoài** phạm vi quét mật (`secrets_sweep` chỉ soi `sessions/`);
2. **trong** danh sách loại trừ của detector output thật của lượt chạy hôm nay in nguyên văn cuối: `- excluded: .claude/workflows/runs`.
Hub viết bước 3 (`:157`): *"Kiểm tra đích ghi **nằm trong vùng quét mật**, không rơi vào vùng miễn quét."* **SE trượt đúng khoản này**, trượt nơi đắt nhất. N1 khai *"đích ghi nằm trong vùng có quét bí mật ✓"* (`:79`) câu đó **đúng cho `sessions/`** **N1 có ghi kèm "cho sessions/"**, nên đây **không phải N1 sai**; nhưng ô kết luận GĐ-2 lại không kéo hệ quả cho `runs/`.
---
### 7.2 — [đóng mục 3 + 4] V-2 tinh chỉnh: phân biệt **DÙNG ⟂ NHẮC ĐẾN**, 0 dương-giả trên 3 file
Vị từ thô `grep -cE '\[(ĐANG ĐO|CHỜ)'` **cho dương-giả trên chính bản hoàn chỉnh**:
```
sub-invest-fitmap-S180.md (48.433 B, bản XONG) → 1 hit
:5 > **Trạng thái file:** … Mục nào chưa xong sẽ có nhãn `[ĐANG ĐO]`.
```
Hit đó **câu định nghĩa nhãn**, không phải nhãn đang treo. Đây đúng lớp **citation-trap self-reference** SE đã ghi vào sổ (`feedback_citation_trap_selfreference`: *doc định-nghĩa anti-pattern TẤT-YẾU chứa mẫu đó ⇒ detector khớp-mẫu bắt chính nó*), **cách vá đã có sẵn trong chính bài học đó**: discriminator = **enclosure, use ⟂ mention**.
**Vị từ V-2 chốt lại — neo vào HEADING (chỗ duy nhất nhãn treo có nghĩa "mục này chưa xong"):**
```bash
grep -cE '^#{1,6} .*\[(ĐANG ĐO|CHỜ|TODO|PENDING)' <file> # >0 ⇒ FLAG
```
**Bảng đối chứng 3 file (2 âm-thật + 1 dương-thật):**
| File | thô | **V-2 heading-scoped** | Đúng? |
|---|---|---|---|
| N1 lượt-1 (7.049 B, skeleton) | 7 | **6** | dương-thật **6 khớp đúng con số "6/9" của lead** |
| N1 bản xong (48.433 B) | 1 | **0** | âm-thật (thô cho dương-giả) |
| chính file lane B này | 2 | **0** | âm-thật (thô cho dương-giả) |
**V-2 heading-scoped: 3/3 đúng, 0 dương-giả, 1 lệnh, không cần trạng thái, không cần config.** Đây ứng viên rẻ nhất sạch nhất trong 4 vị từ §3. **tự nó** bắt được ca N1.
🔸 Khai giới hạn thật thà: chỉ bắt sub **thật thà tự dán nhãn treo**. Sub để heading trống trơn (không nhãn) thì V-2 chỗ đó phải **V-1 tỉ lệ ruột/heading** hoặc **V-3 bộ-tệp-nội-bộ** đỡ. Ba vị từ **bổ sung nhau, không thay nhau**.
🔸 Mục 4 (đo phân bố K cho V-1 trên 88 folder) **không còn nằm trên đường tới hạn**: V-2 đã đủ cho ca N1 **không cần ngưỡng nào**. Giữ mục 4 làm việc tuỳ chọn của V-1, không phải điều kiện chặn.
---
### 7.3 — [đóng mục 2] Vế (v-3) của B-09 **yếu hơn tôi viết** — hạ từ ✅ xuống ⚠️ NỬA
```
grep -c "run-folder\|runs/" .claude/agents/lead-gap-auditor.md → 1
grep -c "run-folder\|runs/" .claude/agents/lead-stale-auditor.md → 0
control-dương (từ khoá chắc chắn có, cùng 2 file):
grep -c "FLAG" → lead-gap 3 · lead-stale 4 ⇒ lệnh chạy đúng, 0 ở trên là 0 THẬT
```
hit duy nhất của `lead-gap-auditor` **không phải** chỉ thị đọc run-folder phiên trước dòng tả class `gap-incident-unrecorded` (`:39`).
🔴 **Hệ quả:** cặp bookend **có chạy ở đầu phiên sau** (đúng nhịp), nhưng **spec của cả 2 vai không hề bảo chúng soi vật chứng run-folder của phiên trước**. Cái phủ vế (v-3) trên thực tế **`closeout-sentinel` M5** (delta thư mục vai) + **`nhip-no-probe` run-chua-gom** cả hai đều **không đọc ruột tệp**. điểm của hub (`:161`) **vẫn mở ở SE**: vật chứng do vai điểm danh sinh ra **chưa có ai soi ruột**, kể cả phiên sau.
Sửa bảng B-09: **(v-1) NỬA · (v-2) · (v-3) NỬA** ( nhịp, thiếu chỉ thị) khoản (v) tổng = **1/3 trọn + 2 nửa**, không phải 2/3 như tôi viết §1. **Tự đính chính, giữ cả câu cũ để so.**
---
### 7.4 — [đóng mục 5] Detector thật sự chạm `runs/` bao nhiêu, và chạm để làm gì
Chạy thật `scripts/governance-detectors.ps1` trên repo (read-only, exit=0):
```
TOTAL FLAGS: 49
INFORM-ONLY (…C11 h24-flag-form…): 21 - counted SEPARATELY, NOT in TOTAL
- excluded: .claude/workflows/runs ← in ra ở khối tự khai cuối
self-match check: … leaked excluded files in scan = 0 [OK] 0 self-match (C4 satisfied)
NOTE: DETECT-only lowering net. Exit 0 always (never fails build). FLAGs are advisory.
```
Lọc các dòng chạm `runs/`:
```
grep DETECTOR det-real.txt | grep workflows/runs | wc -l → 21
… | sed 's/|.*//' | sort | uniq -c → 21× "[DETECTOR] LOW"
```
**Cả 21 dòng đều là C11 FLAG-khuôn, severity LOW, INFORM-only, và toàn bộ trỏ vào run-folder S151.** Không một dòng nào nói về **ruột tệp cụt / rỗng / nén**.
🔴 **Ba kết luận đo được, không suy đoán:**
1. `runs/` **vùng loại trừ có tuyên bố** của detector; C11 **cửa hậu duy nhất** mở lại , cửa hậu đó chỉ soi **khuôn tag FLAG** + **diary-delta**.
2. 21 flag chạm `runs/` được đếm **TÁCH khỏi TOTAL 49** ngay cả khi C11 bắt trong run-folder, con số đó **không vào tổng**. Với GĐ-2 điều này quan trọng: **mức nghiêm trọng của vật chứng đắt (B-10) hiện đang bị đặt ở nấc THẤP NHẤT** (`LOW` + `INFORM-only` + ngoài TOTAL) **ngược đúng chiều** hub yêu cầu phụ lục `:154` (*"Lượt chạy đắt thiếu tệp **nghiêm trọng nhất**"*).
3. Câu cuối `Exit 0 always … FLAGs are advisory` hạt nhân xung đột **GĐ-3**, **không phải GĐ-2** tôi **không** kéo vào lane B. Ghi đây chỉ để người đọc sau không nhầm hai lane. *(OD-2: GĐ-3 làm sau GĐ-2, không gộp.)*
---
## §8 — Chốt lane B
**Mẫu số dùng suốt: 13 khoản (B-01…B-13).** Sau khi §7 sửa 2 khoản (B-03 xuống THIẾU, B-09 xuống nửa):
- **ĐÃ-CÓ trọn: 2** B-05 (vai cấm-sửa, backstop git-diff **mạnh hơn hub**) · B-11 (ghi vật chứng trước khi bắn).
- **NỬA: 7** B-01 (5/7 cửa) · B-02 (2/5 trường, END-line ghost-wire) · B-04 (tầng-A , tầng-B chết-có-khai) · B-06 (2/4 vị từ, sai tầng) · B-07 (2/3 nhịp) · B-09 (1 trọn + 2 nửa) · B-12 (luật răng, máy không ).
- **THIẾU trọn: 4** B-03 (`runs/` ngoài quét mật **và** trong excluded) · B-08 (điểm danh 2 nguồn không vế phải) · B-10 (mức nghiêm trọng theo chi phí hiện **đang ngược chiều**) · B-13 (đối chứng dương: **đã chạy, TRƯỢT**).
- **NGƯỢC: 0.** GĐ-2 **không có xung đột triết lý** với SE N1 ghi "Xung đột: không" GĐ-2 **đúng**, tôi xác nhận độc lập. *(Xung đột exit-0 ⟂ cổng-chặn thuộc GĐ-3.)*
**Ô fit-map GĐ-2 = `chưa làm`** (1 trong 3 giá trị hợp lệ), kèm mốc **W2** kèm do: **4/6 ô nghiệm thu của hub trượt**, trong đó ô-4 **tôi đã chạy phép thử và máy trượt thật** 2). Không được ghi `đã áp` theo A14 đó *"nợ vô hình"*, lớp lỗi hub tự nhận đắt nhất năm.
**Mẫu số cho mọi tỉ lệ (bắt buộc khai, vì ba mẫu số lệch gần 3 lần):**
`13 khoản lane B → 5,5/13 ≈ 42%` · `8 bước thư chính → ≈5,5-6/8 ≈ 69-75%` · `6 ô nghiệm thu (mẫu số hub dùng cấp nấc) → 1,5/6 = 25%`.
Con số **"~70%"** của N1 **không sai** con số của **mẫu số dễ nhất trong ba**, **thiếu nhãn mẫu số** nên người đọc mặc định hiểu "gần xong". mẫu số hub thật sự dùng, SE **25%**.
<!-- END sub-n3-lane-b-gd2 VERDICT=GĐ-2 `chưa làm` · 13 khoản: 2 đã-có · 7 nửa · 4 thiếu · 0 ngược · máy bắt ca N1 = 0/5, control-dương xác nhận thước sống · vị từ đề xuất V-2 heading-scoped 3/3 đúng -->

View File

@ -10,14 +10,156 @@
- `sub-invest-fitmap-S180.md` (N1) · `sub-review-n2-S180.md` (N2) · `run.md` · `spec-…md`
- ranh vai: **read-only, propose-only.** Không tự chọn phương án ở 2 xung đột — trình phương án + đánh đổi, quyền chọn là của anh.
> Trạng thái ghi: file này được **đổ ruột trong lúc làm** (chống #53). Mục nào chưa đo xong ghi thẳng `[ĐANG ĐO]`; mục nào không đo được ghi `KHÔNG ĐO ĐƯỢC` kèm lý do.
> Trạng thái ghi: file này được **đổ ruột trong lúc làm** (chống #53). Mục nào chưa đo xong ghi `CHƯA ĐO — cần <lệnh>`; mục nào đo rồi mà không kết luận được ghi `KHÔNG ĐO ĐƯỢC` kèm lý do.
---
## §0 — Cách đọc bảng khoản
Mỗi khoản GĐ-3/GĐ-4 được bóc theo đúng đơn vị **in đậm của phụ lục** (sàn) và **bước làm đánh số của thư chính** (thi hành). Hai nguồn đánh số LỆCH nhau — N2 F-07b đã bắt N1 giẫm chỗ này. Lane C dùng **cặp mã kép**: `TC3-La` = *thư chính bước a* · `PL3-(x)` = *phụ lục khoản (x)*, và ghi rõ khi hai bên không ánh xạ 1-1.
Mỗi khoản GĐ-3/GĐ-4 được bóc theo đúng đơn vị **in đậm của phụ lục** (sàn) và **bước làm đánh số của thư chính** (thi hành). Hai nguồn đánh số LỆCH nhau — N2 F-07b đã bắt N1 giẫm chỗ này. Lane C dùng **cặp mã kép**: `TC3-Lb` = *thư chính bước b* · `PL3-(x)` = *phụ lục khoản (x)*, và ghi rõ khi hai bên không ánh xạ 1-1.
Trạng thái mỗi khoản: `CÓ` (SE đã có vật tương đương, kèm `file:line`) · `NỬA` (có mảnh, thiếu vế) · `THIẾU` (không có vật) · `NGƯỢC` (SE có luật/máy chiều ngược) · `KHÔNG ĐO ĐƯỢC`.
[ĐANG ĐO — các mục dưới đổ dần]
---
# 🔴 PHẦN ƯU-TIÊN — 4 mục N4 không chia wave được nếu thiếu
## §A — XUNG ĐỘT 1: phạm vi THẬT của doctrine exit-0 (ĐO XONG)
### A.1 — Mệnh đề vào vs đo lại
| Mệnh đề vào | Đo lại hôm nay | Kết luận |
|---|---|---|
| N1/lead: *"SE chỉ có **2 máy fail-loud** (`session-counter-tick.ps1`, `h24-signal-write.ps1`) + `hmw.js` checkpoint throw"* | **ĐẾM THIẾU.****5 máy** trả exit≠0 khi PHÁT HIỆN LỖI (không tính exit≠0 do thiếu hạ tầng), và `hmw.js`**4 chỗ throw** chứ không phải 1 | 🔴 **SỬA SỐ** — 2 → **5 máy**, 1 → **4 throw** |
| lead cite `governance-detectors.ps1:1963` | dòng thật = **`:1962`** (`:1964` = `exit 0`). N2 F-11.2 đã bắt; lane C xác nhận ĐỘC LẬP bằng `sed -n '1955,1964p'` | ✅ N2 đúng, dùng `:1962` |
**Vì sao lệch này quan trọng:** đề bài trình bày SE như *"gần như không có cổng chặn nào"* ⇒ mọi phương án hoà giải sẽ bị vẽ như **du nhập một cơ chế lạ**. Đo lại thì SE **đã có sẵn cả hai chế độ**, và **đã có một ranh giới thành văn**. Bài toán đúng vì thế là **mở rộng ranh có sẵn**, rẻ hơn nhiều so với đổi doctrine.
### A.2 — Liệt TỪNG TÊN (17 máy cắm vào cửa lệnh)
Phép đếm: `grep -ohE "scripts/[a-z0-9._-]+\.(ps1|py)" .claude/commands/*.md | sort | uniq -c | sort -rn`**17 tên riêng biệt, 43 lần nhắc**. Control-dương: `session_ctx.py`=8 · `nhip-no-probe.ps1`=6 · `stamp_verify.py`=5 ⇒ thước có bắt, không phải 0-hit câm.
**Nhóm 1 — FAIL-LOUD: exit≠0 khi PHÁT HIỆN LỖI (5 máy)**
| # | Máy | Mã thoát | Điều kiện trả mã ≠0 | Neo |
|---|---|---|---|---|
| 1 | `scripts/session-counter-tick.ps1` | `42`, `$code` | counter regression · missing-head | `:269`, `:79` |
| 2 | `scripts/h24-signal-write.ps1` | `2`, `3` | class ngoài enum-đóng · đầu vào sai khuôn | `:136,:142,:159,:175,:186,:191,:303,:307` |
| 3 | `scripts/memory-archive-gate.ps1` | `2` | **A7 toàn-vẹn con-trỏ**: pointer gãy / archive 0-byte | `:325` |
| 4 | `scripts/session-scaffold.ps1` | `3`, `4`, `5` | không lấy được đồng hồ · trùng id · đè `_context` đã có | `:14,:16,:137-138` |
| 5 | `scripts/stamp_verify.py` | `1` (`2` = sai cú pháp gọi) | băm nội dung KHÔNG khớp `content_sha256` khai báo | `:51` |
**Nhóm 2 — EXIT-0-ADVISORY: luôn 0 kể cả khi đầy cờ (9 máy)**
| # | Máy | Neo `exit 0` | Ghi chú |
|---|---|---|---|
| 6 | `scripts/governance-detectors.ps1` | `:1964` (doctrine `:1962`) | **ĐO SỐNG HÔM NAY: `TOTAL FLAGS: 49` + `INFORM-ONLY: 21` — vẫn `exit 0`** |
| 7 | `scripts/closeout-sentinel.ps1` | `:138,:211,:234,:247` | verdict đọc bằng DÒNG IN, không bằng mã thoát |
| 8 | `scripts/nhip-no-probe.ps1` | `:230` | doctrine tự khai `:10-11` *"exit 0 ALWAYS - a probe MUST NEVER block a stop point"* |
| 9 | `scripts/distill-shard-probe.ps1` | `:23,:27,:53,:71` | thiếu key thì in `FAIL-LOUD (khong gia dinh default)` **nhưng vẫn exit 0** — tên gọi ≠ mã thoát |
| 10 | `scripts/mfe-eval.ps1` | `:45,:48,:334` | tự khai `READ-ONLY on budget; exit 0` |
| 11 | `scripts/spawn-model-audit.ps1` | `:522` (khai `:140`) | tự khai `INFORMATIONAL, exit 0 always` |
| 12 | `scripts/memory-selfimprove-audit.ps1` | `:346` | `:220` khai *"detector owns the verdict"* |
| 13 | `scripts/agent-frontmatter-eol-check.ps1` | `:339` | `:325` khai *"Advisory only - exit code stays 0"* |
| 14 | `scripts/crystallized-backfill.ps1` | `:159,:236` | header `:32` khai *"(7) exit 0 ALWAYS : measure-and-report, NOT a build-gate"* |
**Nhóm 3 — BIÊN (3 máy): exit≠0 CHỈ khi thiếu hạ tầng, không phải khi phát hiện lỗi**
| # | Máy | Mã | Ghi chú |
|---|---|---|---|
| 15 | `scripts/measure-agent-memory.ps1` | `1` | chỉ khi thiếu thư mục gốc (`:7`) |
| 16 | `scripts/applied-eval-nokey.ps1` | `1` | chỉ ở nhánh `-Selftest` (`:346`); chạy thường = `exit 0` (`:362`) |
| 17 | `scripts/session_ctx.py` | — | **0 câu `sys.exit`** trong file ⇒ mã thoát mặc định 0 trừ khi tràn ngoại lệ |
### A.3 — 🔴 PHÁT HIỆN LỚN NHẤT CỦA LANE C: ranh giới ĐÃ TỒN TẠI, SE đã viết thành lời, trong CÙNG MỘT MÁY
`scripts/memory-archive-gate.ps1:323-325` — chép nguyên văn, không sửa:
```
# Exit non-zero only on A7 integrity failure (broken pointer / 0-byte archive).
# Over-cap is a FLAG (not an error) - the gate reports, a human curates.
if ($gateFailPtr -gt 0) { exit 2 } else { exit 0 }
```
Một máy, **hai chế độ, ranh vẽ sẵn**:
- **TOÀN VẸN quyết được bằng máy** (con trỏ có resolve không · tệp có 0 byte không) ⇒ **chặn**.
- **PHÁN XÉT cần người** (vượt trần bao nhiêu thì nên dọn) ⇒ **gắn cờ, không chặn**.
Đối chiếu 5 máy fail-loud thì ranh này **khớp 5/5** — không phải trùng hợp:
| Máy | Thuộc loại | Vì sao chặn được mà không sợ oan |
|---|---|---|
| `session-counter-tick` | sắp GHI trạng thái | từ chối **ghi** một bộ đếm sai — chặn để **không tạo dữ liệu hỏng** |
| `h24-signal-write` | sắp GHI trạng thái | từ chối **ghi** một class ngoài enum |
| `session-scaffold` | sắp GHI trạng thái | từ chối **đè** `_context` đã có |
| `memory-archive-gate` (nhánh A7) | toàn vẹn tham chiếu | con trỏ resolve hay không — nhị phân, không cãi được |
| `stamp_verify.py` | toàn vẹn băm | băm khớp hay không — nhị phân, không cãi được |
**Luật ngầm của SE, nay phát biểu thành lời:** *một máy được phép CHẶN khi (a) nó sắp GHI, hoặc (b) vị từ của nó là nhị phân quyết-được-bằng-máy. Máy chỉ được GẮN CỜ khi vị từ của nó là phán-xét hoặc ước lượng.*
Đây chính là câu trả lời cho *"ranh vẽ ở đâu"*, và nó **không do lane C bịa ra** — nó đã nằm trên đĩa từ S73 (header `memory-archive-gate.ps1:1` ghi *Harness-11 PART-A (S73, 2026-06-18)*).
### A.4 — SE có lý-do-kỹ-thuật CHỐNG chặn-mù, nên gửi ngược hub
`.claude/workflows/hmw.js`**4 chỗ throw**: `:126` (thiếu taskList) · `:132` (checkpoint chưa duyệt) · `:184` (vai ngoài whitelist) · `:209` (sàn danh-nghĩa) — nhiều hơn con số 1 mà đề bài ghi. Quan trọng hơn là **2 chỗ CỐ Ý KHÔNG throw, kèm lý do viết sẵn**:
- `hmw.js:166`*"CHẠY {keptN} lane ĐẦU, BỎ {dropped} lane CUỐI (**LOUD-skip, KHÔNG throw** — depth-axis:43)"*
- `hmw.js:288`*"🔴 **CỐ Ý KHÔNG throw**: :124-125 đã khai per-lane throw **bị nuốt thành null = STOP-SILENT**"*
- `hmw.js:178`*"throw có thể bị nuốt thành null = STOP-SILENT, **tệ hơn**"*
🔴 **Phản biện gửi ngược hub, dùng chính lập luận của hub.** Hub nói *"thuốc căn cơ cho tự-ý là CỔNG CHẶN"* (phụ lục `:206`, khoản (viii)). Nhưng SE đo được một chế-độ-hỏng mà hub chưa liệt: **cổng chặn đặt ở nơi mã thoát bị NUỐT thì biến thành DỪNG CÂM**, và dừng câm **trông giống hệt** "chạy xong sạch" với người đọc. Đó đúng là lớp lỗi hub tự đặt tên ở món 4 `:98`: *"nhãn không phản bác được thì không phải phép đo"*.
**Khoản đề xuất gửi ngược (anh duyệt trước khi gửi):** thang mã thoát 4 trạng thái của GĐ-3 nên kèm điều kiện tiên quyết — **chỉ cắm cổng chặn ở nơi mã thoát CHẮC CHẮN được đọc**; nơi mã thoát có thể bị nuốt thì cổng phải là **dòng in LOUD** thay vì mã thoát. SE có ca thật để dẫn chứng: `hmw.js:288`.
### A.5 — Đánh đổi định lượng, đo sống hôm nay
`powershell.exe -ExecutionPolicy Bypass -File scripts/governance-detectors.ps1`**`TOTAL FLAGS: 49`** + **`INFORM-ONLY: 21`** (đếm tách riêng, chống-Goodhart) — và vẫn **exit 0**.
⇒ Lật `governance-detectors.ps1` sang chế độ chặn **ngay hôm nay** = **49 cờ chặn mọi cửa tức thì**. Đây là con số phải đặt lên bàn trước khi chọn phương án.
### A.6 — 4 PHƯƠNG ÁN HOÀ GIẢI (trình để anh chọn — lane C KHÔNG chọn)
#### PA-1 — "Kéo dài ranh đã có" (ranh = sắp-GHI hoặc vị-từ-NHỊ-PHÂN)
Áp cổng chặn cho đúng lớp máy đã được phép chặn, mở rộng sang các vị từ nhị phân còn đang advisory. Giữ `governance-detectors` + `closeout-sentinel` + 4 probe ở nguyên exit-0.
- **Vào lớp chặn:** vị từ *tồn-tại-tệp-mốc* của nghi thức hai đầu phiên — đúng thứ hub đòi ở nghiệm thu (`phụ lục:223` *"giả lập thiếu một tệp mốc thì cổng phải trả mã khác không"*), vì đó là vị từ nhị phân.
- **Giữ advisory:** mọi thứ phán xét — trôi tài liệu, độ phủ, văn phong, vượt trần, phân tầng trích dẫn.
- **Được:** không cờ nào trong 49 cờ hiện tại bị lật thành chặn ⇒ chi phí chuyển đổi gần bằng 0; ranh đã có sẵn trên đĩa nên không phải dựng luật mới; khớp đúng chữ hub ở phần nghiệm thu GĐ-3.
- **Mất:** **không** phủ được TC-06 (*"tự ý bỏ"*) ở lớp phán xét — một nghi thức bị bỏ mà không sinh tệp mốc thì vẫn lọt. Hub `:206` nói thẳng rằng lời nhắc không phải thuốc.
- **Rủi ro:** sinh ra cám dỗ **không sinh tệp mốc** để khỏi bị cổng bắt — đúng dạng "rời tập-đo" (memory `feedback_goodhart_leave_measurement_set`). Phải kèm luật *cửa nào có nghi thức thì bắt buộc sinh tệp mốc*, mà luật đó lại nằm ở lớp advisory ⇒ vòng lặp chưa đóng. Khai thẳng, không giấu.
#### PA-2 — "Hai mã thoát trong một máy" (tách TOÀN-VẸN ⟂ PHÁN-XÉT ngay trong từng máy)
Nhân bản đúng khuôn `memory-archive-gate.ps1:325` sang các máy nghi thức: mỗi máy tự chia cờ của nó làm hai rổ — rổ *toàn vẹn* lái mã thoát, rổ *phán xét* chỉ in ra.
- **Được:** phủ được cả TC-06 lẫn TC-08 mà **không** lật 49 cờ (phần lớn 49 cờ rơi vào rổ phán xét); giữ nguyên doctrine "đèn không chặn điểm dừng"; là khuôn **SE đã chạy thật từ S73** nên rủi ro thấp.
- **Mất:** phải **phân loại lại từng cờ** trong `governance-detectors.ps1` (49 + 21 = 70 cờ) — công việc thật, không nhỏ. Và bản thân việc phân loại **chính nó là phán xét**, nên phân loại sai sẽ đẻ ra cổng chặn oan.
- **Rủi ro:** rổ toàn vẹn phình dần theo thời gian, mỗi lần có người thấy cờ của mình quan trọng — đúng dạng ranh trôi. Cần luật: **vào rổ toàn vẹn phải có mã dấu RC của anh**, mượn đúng cơ chế `ACTIVE-MARKS.md` đang sống.
#### PA-3 — "Thang 4 trạng thái ở DÒNG IN, không ở mã thoát"
Hub đòi *phân biệt được* bốn trạng thái (`phụ lục:200`: *"Gộp chúng thành một mã là mất thông tin ngay tại chỗ cần nhất"*). Đọc kỹ thì yêu cầu cốt lõi là **phân biệt được**; *mã thoát* là phương tiện hub chọn. SE đã in **dòng verdict khuôn cố định** — đó chính là cách `closeout-sentinel` đang hoạt động (*"exit ALWAYS 0, READ verdict-line"*).
- **Được:** không có rủi ro dừng câm (`hmw.js:288`); tương thích ngược hoàn toàn; làm xong trong một wave; khai với hub là **"làm KHÁC, không phải làm thiếu"** đúng mục 6 của khuôn báo cáo.
- **Mất:** **không có răng** — đúng thứ hub gọi là lời nhắc, và hub đã tuyên nó không phải thuốc. Ai bỏ qua dòng in thì không có gì chặn lại.
- **Rủi ro:** đây là phương án dễ trượt lượt soi chéo của hub nhất. Nếu chọn thì phải khai thẳng và khai trước, kèm bằng chứng `hmw.js:288`, chứ không im lặng.
#### PA-4 — "Cửa sau có răng" (chặn ở lượt SAU, không chặn lượt này)
Không chặn cửa đang chạy. Thay vào đó, **tiền kiểm ở đầu cửa kế** đọc tệp mốc của cửa đã đóng gần nhất; **thiếu mốc thì trả mã thoát ≠0 ngay đầu cửa kế**. Khớp đúng chữ hub `thu-chinh:182` (*"tiền kiểm chi phí bằng không, chạy ở đầu mọi cửa, chỉ đọc, soi cửa đã đóng gần nhất"*) và giữ được TC-07 (anh vắng vẫn thoát phiên được).
- **Được:** hoà cả hai phía — cửa **dừng** không bao giờ bị chặn (TC-07 an toàn, đúng lo ngại của SE), nhưng lệch thì **không thoát được** vì cửa kế sẽ chặn. SE đã có sẵn đúng cơ chế neo: carrier-commit `git log --diff-filter=A -1 -- <marker>` (S158, 8/8 resolve) = *"dấu thời gian ghi TRONG tệp/lịch sử, không tin mtime của hệ điều hành"***trùng khít chữ hub `:182`**.
- **Mất:** trễ một nhịp — lệch bị bắt ở phiên sau chứ không phải tại chỗ. Với phiên dài thì độ trễ đáng kể.
- **Rủi ro:** anh mở phiên mới và **bị chặn ngay ở cửa đầu tiên** vì lỗi của phiên trước, tức trải nghiệm xấu đúng lúc anh vừa ngồi xuống. Phải có đường **khai suy giảm một dòng để đi tiếp**, nếu không thì tự tạo ra một biến thể mới của bệnh TC-07.
**Bảng cân nhanh — để anh cân, KHÔNG phải khuyến nghị:**
| | phủ TC-06 | rủi ro dừng câm | chi phí chuyển | lật 49 cờ? | rủi ro trượt lượt soi hub |
|---|---|---|---|---|---|
| PA-1 | thấp | rất thấp | rất thấp | không | trung bình |
| PA-2 | cao | thấp | **cao** (phân loại 70 cờ) | không | thấp |
| PA-3 | rất thấp | không có | rất thấp | không | **cao** |
| PA-4 | cao | thấp | trung bình | không | thấp |
🔴 **Lane C KHÔNG chọn.** Cả bốn phương án đều thi hành được; chọn cái nào là một quyết định cơ chế, tức **quyền anh** (nguyên tắc SE: đổi cơ chế = quyền anh, memory `feedback_derived_flush_execution`).

View File

@ -34,3 +34,99 @@ thiếu vế kiểm được) · `THIẾU` (không có) · `KHÁC` (SE làm khá
Khi tính tử số tôi tính **ĐỦ = 1 · NỬA = 0.5 · KHÁC = 1 (nếu tương đương kiểm được) · THIẾU = 0**,
**dán cả hai con số**: nghiêm ngặt (chỉ ĐỦ) và nới (ĐỦ + NỬA + KHÁC).
---
## §1 — 🔴 PHÁT HIỆN NẶNG NHẤT CỦA LANE (ghi ngay, trước cả bảng khoản)
### D-LANE-01 [MAJOR] — Máy soát chỗ-ngồi model MÙ TRỌN VẸN với phiên hiện tại, mà vẫn in "0 lệch"
Đây là khoản chống lưng **quan trọng nhất** cho câu "GĐ-5 gần xong nhất" (N1
`sub-invest-fitmap-S180.md:138`, và cũng là ô TC-09 của N1 `:183`). N2 đã verify khoản này và
**không bác được** — nhưng N2 kiểm *hằng-số có đồng bộ không* (2-key `hmw.js:73`
`spawn-model-audit.ps1:102`), **không kiểm máy có phủ được dân số nào không**. Tôi kiểm vế thứ hai,
bằng cách **chạy thật cái máy đó**.
**Lệnh đã chạy (dán nguyên):**
```
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/spawn-model-audit.ps1
```
**Kết quả thật, trích nguyên văn khối B:**
```
session scope : 80080445-1a92-4320-ac13-327a3d919e69 (last write 2026-08-06 10:10)
scope = CURRENT session only, by design (old runs predate the convention; owner-decisions:64)
wf_264fb5c2-0db/agent-a02e9ca3e3a0f1a45.jsonl [reviewer] -> claude-fable-5 (40 record(s))
COUNTS: 1 dispatch | 1 explicit | 0 mismatch
[OK] 0/1 lane(s) drifted off expected 'claude-opus-5'
TOTAL FLAGS: 0
```
**Vì sao đây là lỗi, không phải máy chạy đúng:**
Phiên đang chạy là **S180, ngày 2026-08-07**, id `be228103-d2dc-4df6-aa72-1914725656c5`. Máy lại
tuyên *"CURRENT session only"* rồi đo phiên `80080445…` **ghi lần cuối 2026-08-06 10:10** — tức
phiên **của hôm qua (S179)**. Nhãn *"phiên hiện tại"***nhãn SAI**, và cái sai đó không hề được
khai ra dòng nào.
**Đo dân số bị bỏ sót (lệnh + số):**
| Đại lượng | Lệnh | Giá trị |
|---|---|---|
| Lane spawn của phiên S180 | `ls $P/be228103…/subagents/*.jsonl \| wc -l` | **17** |
| Bản ghi model trong 17 lane đó | `grep -ohE '"message"\s*:\s*\{\s*"model"\s*:\s*"[^"]+"'` rồi tally | **893** (725 `claude-opus-5` + **168 `claude-fable-5`**) |
| Lane máy audit THẤY | dòng `COUNTS:` của chính máy | **1** |
| Bản ghi model máy audit THẤY | dòng lane của chính máy | **40** |
⇒ Máy đo **1/17 lane (5,9 %)****40/893 bản ghi (4,5 %)** — và cả 1 lane nó thấy đều **không
thuộc phiên hiện tại**. Nói cách khác: **phủ thật của phiên hiện tại = 0/17 = 0 %.**
🔴 Toàn bộ **168 bản ghi `claude-fable-5`** — tức đúng cái **mô hình đắt** mà cả GĐ-5 sinh ra để
canh — nằm **trọn trong vùng mù**.
**Cơ chế hỏng, tìm được bằng đọc mã:** `scripts/spawn-model-audit.ps1:250-253` chọn phiên bằng vị từ
**hình-dạng-đường-dẫn**:
```powershell
Get-ChildItem -Path $projDir -Directory |
Where-Object { Test-Path (Join-Path $_.FullName 'subagents\workflows') } |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
```
Vị từ `Test-Path subagents\workflows`**đại-diện (proxy)** cho *"phiên này có spawn"*. Nó đúng khi
lane đi qua **Workflow tool** (`hmw.js``subagents/workflows/wf_*/agent-*.jsonl`), và **sai câm**
khi lane đi qua **Task tool** — lúc đó bản ghi rơi **PHẲNG** vào `subagents/agent-*.jsonl`.
**Đo trên đĩa (0-hit kèm control-dương, đúng ràng buộc lane):**
| Phép đo | Kết quả |
|---|---|
| `test -d be228103…/subagents/workflows` | **NO** (0-hit) |
| `find be228103… -maxdepth 2 -type d -name workflows \| wc -l` | **0** |
| **Control-dương:** `ls 041d0937…/subagents/workflows/` | **`wf_a574cff1-6b9`** ⇒ vị từ *có* chạy, không phải hỏng thước của tôi |
| mtime phiên S180 / mtime phiên máy chọn | `1786081087` / `1785985825` ⇒ máy bỏ qua phiên **mới hơn ~26,5 giờ** |
**Vì sao nó đắt hơn một cờ thường:**
1. Nó đánh thẳng vào **nghiệm thu TC-09 của hub** (`thu-chinh:84`): *"máy soát chỗ-ngồi trả không có
lượt nào lệch"*. Máy SE **đang trả đúng câu đó**`0 mismatch`, `TOTAL FLAGS: 0` — trên một mẫu
**1 lane của hôm qua**. Đây là **đèn xanh giả**, đúng lớp bệnh mà `khuon…:295` gọi tên: *"chưa
có dữ liệu"* bị in ra trông y hệt *"đã đo và bằng không"*.
2. Máy **tự dán nhãn sai** (`CURRENT session only, by design`) ⇒ người đọc báo cáo không có cách nào
biết nó đang đo phiên khác. Đúng lớp **`vắng-mặt trông giống ổn`** trong sổ nhớ SE.
3. Nó là **cùng một cái máy** mà N1 đem ra chống lưng cho "GĐ-5 gần xong nhất", và là **cùng một cái
máy** mà `docs/gotchas`-culture của SE gọi là *"mỗi phép đo kèm CONTROL DƯƠNG"*. Máy có control
cho vế hằng-số (khối A `anti-vacuous note`), **không có control cho vế dân số**.
**Đề xuất nghiệm thu (propose-only, KHÔNG tự sửa):** máy phải (a) chọn phiên bằng **định danh phiên**
hoặc mtime **không lọc theo hình dạng thư mục**; (b) quét **cả hai** vị trí `subagents/*.jsonl`
`subagents/workflows/**/agent-*.jsonl`; (c) khi phiên được chọn **không phải** phiên mới nhất, phải in
**một dòng khai thẳng** chênh lệch đó thay vì giữ nhãn *"CURRENT"*; (d) in **mẫu số**: `n lane đo /
m lane tồn tại`. Phản chứng bắt buộc: chạy trên một phiên chỉ có lane phẳng thì máy **phải** thấy
lane, không được rơi về phiên cũ.
🔸 **Khai công bằng cho SE — 3 vế của máy này ĐỨNG VỮNG và tôi không bác:**
- Khối A **2-key** đồng bộ thật: `hmw.js:73` = `claude-opus-5` = `spawn-model-audit.ps1:102`, và máy
**tự loại grep ngây thơ** (*"naive grep … 2 hit(s) [comment text] -> NOT used as evidence"*) —
đây là chống citation-trap đúng bài.
- Khối C/D đo **26/26 agent** mang `model: opus` **và** 26/26 mang `effort: max`; canonical
`STATUS.md:478` = 26 khớp đĩa 26.
- Khối E **tự khai 6 điều máy KHÔNG nói**, gồm *"Nothing here blocks a spawn"* và *"RETROSPECTIVE
ONLY"*. Đây là **A16 làm đúng** (khai máy/tay, khai giới hạn) — hiếm và đáng giữ.
⇒ Lỗi nằm ở **tầng chọn mẫu**, không nằm ở tầng so sánh. Vá tầng chọn mẫu là đủ; đừng đập cả máy.

View File

@ -14,3 +14,84 @@ Bốn ca lead khai *"giẫm NGAY HÔM NAY"* là bốn ca **lead có lợi khi n
Hai ca **MỚI phát sinh trong chính chuỗi N1→N2** cũng được soi ở đây (đề bài giao): (a) N1 hạ cánh 7.049 B / 6-của-9-mục placeholder sau 202K token; (b) N2 xử vụ số-lệch bằng cách tuyên một bên thắng trong khi thật ra là **lệch ĐƠN VỊ**.
---
## §1 — 9 LỚP LỖI × SE (kiểm lại bảng lead, không gật theo)
### Bảng tổng — verdict của lane E trên từng dòng lead
| LỚP | lead nói | lane E kết luận | ghi chú 1 dòng |
|---|---|---|---|
| 1 quên ghi vật chứng lúc mở | ✅ giẫm | **GIỮ** | #53-family; lane này bổ sung ca thứ 10 = chính tôi |
| 2 thợ rèn không có dao | ✅ ×3 hôm nay | **GIỮ 3/3** — và **nặng hơn lead khai** | mỗi ca có thêm tầng lỗi lead chưa đếm (dưới) |
| 3 chấm chéo lần-1 KHÔNG ĐẠT | ✅ | **GIỮ** | ring1 32Đ/6T · N2 PASS_WITH_FIXES 5 MAJOR |
| 4 exit-0 ≠ không cờ | ✅ | **GIỮ** | `governance-detectors.ps1` tự khai "Exit 0 always" |
| 5 số chép tay trôi | ✅ | **GIỮ** | STATUS:8 mega-line |
| 6 neo số dòng chết ngay khi sinh | ✅ 1 ca | **GIỮ + LEAD SÓT 2 CA** | 3 neo cùng lệch **+2**; 1 neo **chết ngay tại commit sinh ra nó** |
| 7 tuyên gấp-đầy-đủ thân mục lục | ✅ | **GIỮ** | N1 7.049 B; lane E bổ sung: guard byte mù |
| 8 nhãn đã-đóng hẹp hơn phạm vi | ✅ hôm nay | CHƯA ĐO — cần `awk 'NR>=48&&NR<=55' docs/HANDOFF.md` | đo ở §1.4 |
| 9 cưỡng chế tuyên mà chưa có máy | ✅ 2 món (không 3) | CHƯA ĐO — cần grep `tools-whitelist` + `session_ctx_kb` | đo ở §1.5 |
---
### §1.1 — LỚP-6 (neo số dòng) — **lead ĐÚNG 1/3, SÓT 2**
Lead khai đúng **một** neo. Lane E đo cả file `docs/STATUS.md` và tìm **ba** neo tự-trỏ, **cả ba lệch đúng +2**:
| # | neo ở | nội dung neo | đích THẬT bây giờ | lệch | ai tìm |
|---|---|---|---|---|---|
| N-1 | `docs/STATUS.md:8` | ``bundle prod → canonical ở `:479` `` | Bundle hash live ở **`:481`** | +2 | lead |
| N-2 | `docs/STATUS.md:8` | ``Policies/Menu keys — canonical bảng `:470-471` `` | Policies **`:472`** · Menu keys **`:473`** | +2 | **LANE E (lead sót)** |
| N-3 | `docs/STATUS.md:463` | ``đã re-ground 2 lần SAU S168 (`:474` S170 · `:476` +S176)`` | S170 ở **`:476`** · S176 ở **`:478`** | +2 | **LANE E (lead sót)** |
**Lệnh tái lập (chạy được, đã chạy):**
```
python -c "import io,re; L=io.open('docs/STATUS.md',encoding='utf-8').read().split('\n');
[print(n,repr(s[max(0,m.start()-90):m.end()+10])) for n,s in enumerate(L,1) for m in re.finditer(r':(\d{2,4})(-(\d{2,4}))?\`',s)]"
```
Đối chứng vị trí thật: `awk 'NR>=467 && NR<=482' docs/STATUS.md` → 472 = `| Policies |`, 473 = `| Menu keys |`, 476 = `| User memory |` (chứa `S170`), 478 = `| Sub-agents |` (chứa `S176`), 481 = `**Bundle hash live (prod):**`.
🔴 **Phát hiện nặng nhất của mục này — N-3 CHẾT NGAY TẠI COMMIT SINH RA NÓ.**
`git log -S'`:474` S170' -- docs/STATUS.md` → commit **`57e672f`** (S179 closeout). Mở đúng commit đó:
```
git show 57e672f:docs/STATUS.md → S170 ở dòng 476, S176 ở dòng 478
```
Tức tại **chính thời điểm viết**, neo `:474`/`:476` đã trỏ sai. Hub viết *"neo số dòng chết ngay khi sinh"*; ở SE ca này **chết đúng lúc sinh, không cần đợi ai chèn dòng**. Nặng gấp đôi: câu chứa nó là ghi-chú của `lead-stale-auditor` FLAG-6 đang tự khen *"chính dòng này chép ra cái luật mà nó vi phạm"* — rồi vi phạm thêm một luật nữa ngay trong câu đó.
Đối chiếu N-1 và N-2: cả hai **đúng lúc sinh**, chết sau.
- `git log -S'canonical ở `:479`'` → `50e6d8c`; mở ra: bundle ở dòng **479** ✔ đúng lúc sinh.
- `git log -S'canonical bảng `:470-471`'` → `88e7ecf`; mở ra: Policies **470**, Menu keys **471** ✔ đúng lúc sinh.
⇒ **Hai chế độ chết khác nhau trong cùng một file**: *drift-sau-khi-sinh* (N-1, N-2) và *born-dead* (N-3). Thuốc khác nhau: loại 1 cần neo-bằng-chuỗi; loại 2 cần **kiểm tại chỗ lúc viết** (vị-từ máy: mở file, đọc dòng, so nội dung).
🔴 **Vòng ngoài — LỚP-6 ăn thịt thuốc chữa LỚP-5.** Luật B1 của SE (*"KHÔNG chép số, trỏ canonical"*) là thuốc cho LỚP-5. Ba neo trên **chính là B1 đang thi hành**, và cả ba đều hỏng vì được cài bằng **số dòng**. Tức: **thuốc chữa LỚP-5 được xây trên đúng cái bệnh LỚP-6.** Đây là LỚP-2 ở cấp học thuyết, không phải cấp một vai. Đề xuất N4: wave nào đụng B1 **phải** đổi hình thức neo (chuỗi tìm được / tên row) chứ không chỉ vá 3 con số.
---
### §1.2 — LỚP-2 ca (a) `harvest-curator` F-05 — **GIỮ, ĐÚNG NGUYÊN VĂN**
- Vết ở `runs/2026-08-07-S180-bookend-open/sub-harvest-curator-open-S180.md:23-26`: entry S173 *"Corruption ✅ 24 hit/11 file"* — **baseline giao không khai ĐƠN-VỊ**; đo lại `grep -rc` (DÒNG) = 22/11 · `grep -ro | wc -l` (LẦN) = 24/11.
- Bài học chống đúng bẫy đó nằm ở `runs/2026-08-01-S168-bookend-close/sub-harvest-curator-close-S168.md` (**29.299 B**), dòng **269** và **273**, nguyên văn: *"baseline chuyển giao PHẢI ghi kèm đơn-vị: 22 dòng / 24 lần / 11 file"*.
- File đó **chưa về nhà** (nợ F-01 của chính vai) ⇒ vai đi lại đúng bẫy **6 phiên sau**.
- 🔸 **Vệ sinh thước — sắc thái tôi phải khai:** `grep -c "S168" .claude/agent-memory/harvest-curator/MEMORY.md` = **2** (control-dương `grep -c "S17"` = 2, thước sống). Hai hit đó **là mention nằm trong entry S179, không phải entry S168** — `sub-ring1-audit-open-S180.md:13` đã đo độc lập: 4 marker = **2/5/2/2 ở NGUỒN, 0/0/0/0 ở đích**. ⇒ "chưa harvest" đúng **ở cấp entry**, và ai đo bằng `grep -c "S168"` một mình sẽ đọc nhầm thành "đã harvest". Chính là **bẫy đơn-vị lần thứ hai trong cùng một ca** — lần này là đơn-vị *mention ⟂ entry*.
### §1.3 — LỚP-2 ca (b) `lead-stale-auditor.md` — **GIỮ, và nặng hơn lead khai (3 tầng, không 1)**
Lead chỉ nêu `:45`. Đo thật, dòng 45 mang **ba** lỗi chồng nhau, và có **tầng thứ tư** ở dòng 41:
| tầng | nội dung | đo |
|---|---|---|
| T1 stale-count | ví dụ ghi canonical *"= 54"* | canonical THẬT `STATUS.md:473` = **113** |
| T2 neo chết | trỏ `STATUS.md:19` | dòng 19 hiện là đoạn *"Vòng kiểm chặn lead 3 lần: D-4…"* — **không liên quan menu key** |
| T3 tiền-đề bốc hơi | ví dụ nói *"`CLAUDE.md` ghi ~60 menu key"* | `grep -rn "60 menu key" CLAUDE.md docs/CLAUDE.md` = **0 hit**; **control-dương** `grep -inc "menu" CLAUDE.md` = **4** (thước sống), `grep -inE "menu.key" CLAUDE.md` = 1 hit ở `:62` nhưng là `menu-key KeHoachKyKet`, không có số |
| T4 (dòng **41**) | *"Gặp thứ không xếp được vào **5 class** dưới"* + bảng `:45-49` có **5 hàng** | enum thật `memory-budget.json` `lead_self_audit.flag_classes` = **12 phần tử = 6 `view-*` + 6 `gap-*`** ⇒ thiếu `view-claim-broader-than-sample` |
T4 nặng hơn T1-T3 vì T1-T3 nằm ở cột **"Ví-dụ SE"** (minh hoạ, có thể là ca lịch sử), còn T4 là **câu lệnh ràng buộc** (*"CẤM tự chế class"*) — sub đọc persona sẽ thấy json có 6 mà bảng có 5, và không có luật nào bảo phải tin bên nào.
### §1.4 — LỚP-2 ca (c) `ring2-audit.md:4` "5 class" — **GIỮ**
- `ring2-audit.md:4` nguyên văn: *"ĐỌC OUTPUT của `lead-stale-auditor` (view LỆCH source, **5 class** `view-*`) + `lead-gap-auditor` (cái BỊ THIẾU, **6 class** `gap-*`)"*.
- Đo enum: `view-*` = **6** (stale-count · stale-status · stale-header · stale-role-desc · residual-asym · **claim-broader-than-sample**) · `gap-*` = **6** ✔. ⇒ **vế gap ĐÚNG, vế view SAI** — lệch bất-đối-xứng trong cùng một câu.
- Class thứ 6 vào enum @**S172** theo owner (`memory-budget.json:190` `_class_added_S172`, slot 68). ⇒ drift sống **≥5 phiên**.
- 🔴 **Bổ sung lane E — drift này đã bị NHÌN THẤY rồi ĐI VÒNG chứ không vá:** `runs/2026-08-05-S173-bookend-open/sub-lead-gap-open-S173.md:10` viết *"12 class (**5** `view-*` = vai-stale · 6 `gap-*` = vai-GAP · **+1** `view-claim-broader-than-sample` mới)"* — công thức 5+6+1 là **cách kể để khỏi phải sửa persona**. Đây là mẫu *Goodhart: rời tập-đo* (đổi hình dạng cách đếm thay vì vá nguồn). Wave nào chạm enum phải vá **cả 2 persona**, không chỉ ring2.