Files
solution-erp/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-f-maytay.md
2026-08-07 14:42:12 +07:00

447 lines
52 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.

# N3 — LANE F: CƯỠNG CHẾ MÁY ⟂ TAY · VƯỢT-KHUNG · RỦI RO THI CÔNG
> vai `reviewer` (fable-clone) · phiên S180 · lane F/6 (xuyên suốt thứ 2)
> 🔴 File này ĐỔ RUỘT TRƯỚC theo lệnh cứu #53 của lead. Mọi mục dưới đây đã ĐO THẬT trừ chỗ ghi rõ `CHƯA ĐO`.
> Lăng kính: cái gì sẽ VỠ khi thi công · cái gì tuyên có mà không có răng.
---
## §0 — KHAI TRUNG THỰC VỀ CHÍNH LƯỢT NÀY (LỚP-1 + AS-17, ca của chính tôi)
🔴 **Tôi đã mắc `ngược-#53` trong chính lượt đi soi lớp lỗi đó.** Đốt ~155K token / 32 tool-use mà **0 byte trên đĩa** trước khi lead gọi. Đây là **LỚP-1 của hub** (*quên ghi vật chứng lúc mở lượt chạy*) **hội tụ LỚP-2** (*thợ rèn không có dao* — vai đi soi "cưỡng chế nào có răng" lại tự vi phạm cưỡng chế ghi-đĩa).
**Cơ chế thật, không phải đãng trí:** lệnh lane F ghi *"append vào `sub-n3-lane-f-maytay.md`"* nhưng **không ghi mốc BẮT BUỘC tạo file trước tool-call thứ nhất**. Vai đọc "append" thành "append **khi có gì để append**" ⇒ trì hoãn tới khi có kết luận ⇒ chết là mất trắng. Đối chiếu: 3 spawn-probe vai STYLE trả 1 dòng cố định thì 3/3 CLEAN.
**Đề xuất cho N4 (rẻ, đo được):** mọi lệnh lane phải ghi *"tool-call #1 = `Write` file lane với khung heading + dòng `STATUS: đang đo`"*. Không phải nhắc "nhớ ghi" (đó là TAY), mà là **cắm vào vị trí tuần tự** (thứ tự tool-call = thứ duy nhất agent không né được).
---
## §1 — KIỂM KÊ MÁY ⟂ TAY (TC-A16, khuôn Phần B mục 7)
### 1.1 🔴 Phát hiện nền: SE có ĐÚNG **1** máy fire tự động, không phải 14
`.claude/settings.json` (330 B, đọc trọn) khai **duy nhất 1 hook**:
```json
"hooks": { "Stop": [ { "hooks": [ { "type": "command",
"command": "powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1" } ] } ] }
```
**0 hook** `PreToolUse` / `PostToolUse` / `SessionStart` / `UserPromptSubmit`. **0 governance script** trong `.gitea/` (đo: `grep -rl <tên-script> .gitea/` = 0 cho **cả 20/20** script; control-dương: cùng lệnh ra hit ở `.claude/commands/` cho 17/20).
**Phải tách 3 nấc, không phải 2.** Khai "máy/tay" nhị phân là **khai sai theo hướng lạc quan** — đúng thứ LỚP-9 cấm:
| nấc | định nghĩa | phụ thuộc ai nhớ? | SE có gì |
|---|---|---|---|
| **M1 — MÁY THẬT** | CLI/CI tự fire, không ai gõ | KHÔNG | **1**: hook `Stop``wal-flush.ps1` |
| **M2 — MÁY-CÓ-NHẮC (nghi-thức)** | script tồn tại + được tệp lệnh cửa gọi tên; nhưng cửa chỉ chạy khi **anh gõ `/session-start`** và AI **chịu** chạy bước đó | CÓ ×2 (owner gõ + AI tuân) | **17** script |
| **M3 — TAY** | luật viết trong doc, người phải nhớ; hoặc script mồ côi 0-caller | CÓ | phần còn lại |
🔴 **Hệ quả cho khuôn báo cáo hub:** nếu SE điền cột "Máy hay tay" = "máy" cho 17 script M2 thì **đúng chữ mà sai nghĩa** — hub hỏi *"kết quả không-hit có phụ thuộc người nhớ chạy không"*, và với M2 câu trả lời là **CÓ**. Đề xuất SE điền `MÁY-qua-nghi-thức (M2)` + cột thứ 5 *"fire tự động?"*.
### 1.2 Bảng kiểm kê script (đo bằng `grep -rl <script> {commands,agents,governance,.gitea,hooks}`)
| script | caller (lệnh) | agents | gov-doc | CI | hook | nấc |
|---|---|---|---|---|---|---|
| `.claude/hooks/wal-flush.ps1` | — | — | — | 0 | **settings.json Stop** | **M1** |
| `governance-detectors.ps1` | session-end, session-start | 4 | 26 | 0 | 0 | M2 |
| `session-counter-tick.ps1` | session-start | 0 | 0 | 0 | 0 | M2 |
| `nhip-no-probe.ps1` | check-email, pause, session-end, session-start, snapshot, tiep (**6 cửa**) | 2 | 9 | 0 | 0 | M2 |
| `h24-signal-write.ps1` | session-end, session-start | 2 | 0 | 0 | 0 | M2 |
| `session-scaffold.ps1` | session-start | 0 | 0 | 0 | 0 | M2 |
| `distill-shard-probe.ps1` | session-end, session-start, sleep-recovery | 0 | 3 | 0 | 0 | M2 |
| `measure-agent-memory.ps1` | session-end, session-start, sleep-recovery | 3 | 6 | 0 | 0 | M2 |
| `memory-archive-gate.ps1` | session-end | 2 | 8 | 0 | 0 | M2 |
| `mfe-eval.ps1` | session-end, session-start | 3 | 15 | 0 | 0 | M2 |
| `crystallized-backfill.ps1` | session-end, session-start | 2 | 8 | 0 | 0 | M2 |
| `spawn-model-audit.ps1` | fable-clone, session-start | 0 | 8 | 0 | 0 | M2 |
| `session_ctx.py` | pause, session-end, session-start, snapshot, tiep | 1 | 5 | 0 | 0 | M2 |
| `stamp_verify.py` | check-email, send-email | 0 | 18 | 0 | 0 | M2 |
| `closeout-sentinel.ps1` | session-end | 0 | 2 | 0 | 0 | M2 |
| `agent-frontmatter-eol-check.ps1` | session-end | 0 | 4 | 0 | 0 | M2 |
| `applied-eval-nokey.ps1` | session-end | 0 | 5 | 0 | 0 | M2 |
| `memory-selfimprove-audit.ps1` | session-end, session-start | 0 | 8 | 0 | 0 | M2 |
| **`wal-recovery-test.ps1`** (24.986 B) | **0** | 0 | 2 | 0 | 0 | **M3 mồ côi** |
| **`deps-audit.ps1`** (3.281 B) | **0** | 0 | 0 | 0 | 0 | **M3 mồ côi** |
| **`session_scaffold.py`** (6.092 B) | **0** | 0 | 0 | 0 | 0 | **M3 mồ côi** |
🔴 **Danh sách "máy đã biết" trong lệnh lane F liệt 14 — đo trên đĩa ra 21.** Thiếu **7**: `closeout-sentinel` · `agent-frontmatter-eol-check` · `applied-eval-nokey` · `memory-selfimprove-audit` · `wal-recovery-test` · `deps-audit` · `session_scaffold.py`. ⇒ **bản thân phép kiểm kê máy của SE cũng đang chạy bằng trí nhớ** (không có `ls scripts/ | wc -l` neo ở đâu cả). Đây là ca **A16 tự-vi-phạm**.
### 1.3 — 3 script mồ côi: ĐÃ ĐO, kết luận từng cái (A12 liệt từng mục)
`grep -rn "wal-recovery-test|deps-audit" docs/governance/*.md docs/rules.md docs/STATUS.md docs/ .claude/skills/`:
- **`wal-recovery-test.ps1` (24.986 B) — KHÔNG phải ghost-wire.** 0 hit ở `docs/governance/*.md` + `rules.md` + `STATUS.md`**không doc bền nào tuyên nó đang canh gì**. Nó là **đồ gá kiểm thử** cho cơ chế WAL, chạy tay khi cần. Khai đúng nấc: **M3 — TAY, không tuyên**. Hợp lệ theo LỚP-9 (*"chạy tay vẫn hợp lệ"*).
- 🔸 **`deps-audit.ps1` (3.281 B) — không phải ghost-wire, nhưng là ca "MÁY CÓ MÀ MẤT LỐI VÀO"** (đáng ghi, hình dạng riêng):
- `docs/CLAUDE.md:78` liệt nó trong cây `scripts/`**có tuyên tồn tại**.
- Session log `2026-04-23-2200:169,225` khai *"chạy thủ công hoặc **CI gate**"* + *"Run `pwsh scripts/deps-audit.ps1` **mỗi đầu tuần**"* ⇒ **một nhịp TAY được tuyên, không có máy giữ nhịp** (không hook, không CI, 0 caller).
- 🔴 **Và skill sở hữu đúng địa hạt đó — `.claude/skills/dependency-audit-erp` — KHÔNG hề nhắc `scripts/deps-audit.ps1`**: skill chép tay các lệnh `dotnet list` / `npm audit` rời và ghi *"CI integration (**TODO** — Phase 5.1 backlog)"*. ⇒ người tra skill sẽ **gõ lại bằng tay thứ đã có script**, và tưởng CI-gate chưa từng được viết.
- **Phân loại:** không phải LỚP-9 (không ai tuyên "có máy canh deps"). Đây là **lối-vào-đứt** — cùng họ với bài `ring1` @S162 (*skill nhận routing một địa hạt mà 0 hit khi địa hạt đó đẻ máy mới*). **Vá rẻ: 2 dòng trong skill trỏ script + khai thẳng nhịp "đầu tuần" đang là TAY.**
- **`session_scaffold.py` (6.092 B) — trùng vai với `session-scaffold.ps1` (đang được `/session-start` gọi).** 0 caller, 0 tuyên. **CHƯA ĐO:** hai bản có lệch hành vi không (nếu ai đó gọi nhầm bản `.py` sẽ ra kết quả khác). Lệnh: `diff <(...) ` không áp được (khác ngôn ngữ) ⇒ cần đọc 2 file đối chiếu contract output. Rủi ro thấp, nhưng là **mirror không có detector** — cùng lớp `source_order` ở §2.
---
## §2 — GHOST-WIRE MỚI (LỚP-9) — **2 ca MỚI, đã chứng**
Phương pháp: liệt **mọi khoá cấu hình** trong `.claude/agent-memory/memory-budget.json` rồi `grep -rl <khoá> scripts/ .claude/hooks/ .claude/workflows/*.js` (loại chính file json). Khoá **0 reader** = ứng viên. Sau đó đọc `_note` của khối để phân biệt **ghost-wire** (khai có máy / khai chống-hardcode) vs **cố-ý-CÓ-KHAI** (như `pull_warn_days`).
**Control-dương của phép đo:** cùng lệnh cho ra `merge_guard_to_as`=1 (`mfe-eval.ps1`), `hotload_sources`=1 (`crystallized-backfill.ps1`), `light_every`=2, `strike_threshold`=1 ⇒ thước KHÔNG mù.
### 🔴 GHOST-MỚI-1 — `mfe.denominator_sources` (0 reader, mà khối tự tuyên "analyzer never hardcodes")
- **Khai:** `memory-budget.json``mfe._note` = *"Read by scripts/mfe-eval.ps1 ... **Single-source config so the analyzer never hardcodes** (B1 derived-tro-canonical)"*.
- **Đo:** `grep -c denominator_sources scripts/mfe-eval.ps1` = **0**.
- **Phản chứng cứng:** `scripts/mfe-eval.ps1:52-54` **hardcode đúng 3 đường dẫn** mà khoá đó khai:
```
52: $marksPath = Join-Path $RepoRoot '.claude\governance\ACTIVE-MARKS.md'
53: $ledgerPath = Join-Path $RepoRoot 'docs\governance\error-ledger.md'
54: $gotchaPath = Join-Path $RepoRoot 'docs\gotchas.md'
```
- **Hành vi vỡ:** sửa `denominator_sources` trong config → máy **không đổi gì**, im lặng. Người đọc tưởng đã đổi mẫu số MFE.
- **Nặng hơn `session_ctx_kb` @S146 ở chỗ nào:** `session_ctx_kb` chỉ *chưa có reader*; ca này **có một câu khai chủ động rằng máy KHÔNG hardcode**, trong khi máy **đang hardcode**. Đây là H18 class-2 (`defined-but-unread`) **cộng** một phát-biểu-sai-chủ-động.
### 🔴 GHOST-MỚI-2 — `crystallized_backfill.source_order` (0 reader, mà note tuyên "PLANNER prints this order")
- **Khai:** `_source_order_note` = *"**The PLANNER prints this order**; it performs NO pull (DRY...)"*.
- **Đo:** `grep -n source_order scripts/crystallized-backfill.ps1` → **chỉ hit trong comment `:246`**, **0 hit đọc `$cb.source_order`**. Control-dương cùng file: `:85` đọc `$cb.target`, `:88` đọc `$cb.hotload_sources` LIVE.
- **Phản chứng cứng:** `:214-220` **hardcode chuỗi in ra**:
```
214: " 1. gist {0} archive/*.gist.md (4-field distilled)"
215: " 2. value-marked {0} archive lines carrying gotcha# / anti-pattern / root-cause"
220: " order (for reference): 1.gist {0} 2.value-marked-archive {0} 3.curated-RAG ..."
```
- **Hành vi vỡ:** đổi thứ tự trong config → bản in **vẫn thứ tự cũ**. Đây là **mirror-drift không có detector** — đối chiếu `hmw_width.cap` có mirror ở `hmw.js` nhưng **CÓ detector C9 canh drift**; `source_order` mirror mà **0 detector**.
### 🔴🔴 GHOST-MỚI-3 — `h24_cadence.jump_on_class_repeat` = 3 — **KHÔNG MÁY NÀO ĐỌC** (ca ĐẮT NHẤT lane F)
> Ghi sau, nhưng đây là phát hiện **nặng nhất** của lane F. Không phải một khoá lẻ — nó là **cơ chế phản-ứng DUY NHẤT** của nhịp H24 khi phiên ngắn lại.
**SE tuyên gì:** `session-start.md §2.1.8` khai H24 gồm TICK counter + OVERDUE check; các vai đo trích thành văn (`sub-lead-gap-open-S159.md:186`) nguyên văn luật: *"một class lặp ≥ `jump_on_class_repeat` lần → **kéo audit tới sớm, bất-kể counter**"*. Ngưỡng = **3**, `_owner_ratified` (owner-decisions 15-07 Q2 + mark `e50a4bd0`).
**Đo — 0 reader thật, trên TOÀN BỘ `scripts/` + `hooks/` + `workflows/`:**
```
grep -rn "jump_on_class_repeat" scripts/ .claude/hooks/ .claude/workflows/*.js
→ governance-detectors.ps1:848 'create memory-budget.json carrying h24_cadence { light_every, deep_every, jump_on_class_repeat }'
→ governance-detectors.ps1:863 'W2: add h24_cadence { light_every, deep_every, jump_on_class_repeat }'
```
🔴 **Cả 2 hit đều nằm TRONG chuỗi văn bản của thông-báo-sửa-lỗi** (đối số `remediation` của `Write-Flag`), **không phải phép đọc** `$cfg.h24_cadence.jump_on_class_repeat`. Đây đúng bẫy *"grep ra hit ⇒ tưởng có key/có reader"* mà chính SE đã ghi 3 lần (`harness-audit-return.md:76` ca `pull_warn_days`).
**Control-dương (chứng thước KHÔNG mù) — 2 khoá anh em CÓ reader thật:**
```
governance-detectors.ps1:865 elseif ($null -eq $cfg.h24_cadence.light_every) {
governance-detectors.ps1:871 $CadenceM = [int]$cfg.h24_cadence.light_every
nhip-no-probe.ps1:88/91 CONFIG-THIEU(h24_cadence.light_every) / (h24_cadence.deep_every)
```
**Phản chứng thứ hai, cứng hơn — công thức OVERDUE chỉ có 2 vế:**
`nhip-no-probe.ps1:24` (hợp đồng output, nguyên văn): **`OVERDUE when a>=e or b>=f`** — `a/e` = nợ light, `b/f` = nợ deep. **`jump` KHÔNG phải vế thứ ba.** `:106` `$status = if ($over.Count -gt 0)` mà `$over` chỉ nhận light/deep.
**Phản chứng thứ ba — máy GHI sổ không hề so ngưỡng:**
`grep -n "jump\|Jump" scripts/h24-signal-write.ps1` → **rỗng**. Script này thi hành enum-parity rất nghiêm (`:302` từ chối ghi nếu `counts` có khoá ngoài enum), tức nó **giữ sổ rất kỷ luật** — nhưng **không bao giờ đọc ngưỡng** để kêu.
**Hệ quả đã xảy ra thật, đo từ chính sổ SE (mỗi số neo tệp):**
| phiên | trạng thái tally | ngưỡng | có gì fire? |
|---|---|---|---|
| S169 | *"7/11 class chạm/vượt `jump_on_class_repeat`=3"* (`sub-ring2-audit-open-S169.md:140`) | 3 | **không** |
| S172 | `gap-carry-dropped` = **10** = *"3,3× ngưỡng"* (`sub-lead-gap-close-S172.md:60`) | 3 | **không** |
| S173 | *"`class_repeat` **8/12 class ≥ 4**; đỉnh `gap-carry-dropped` **11**"* (`harness-refine-return.md:221`) | 3 | **không** |
⇒ Ngưỡng bị vượt **3,7×**, bởi **8/12 class**, **liên tục ~10 kỳ audit** — và **chưa từng có gì kêu**, vì **không có gì để kêu**.
🔴 **Vì sao đây là ca đắt nhất, không phải khoá lẻ:**
1. **SE đầu tư rất nhiều để NUÔI nó.** ~40 tệp run có khối *"Phân-rã theo class (cho `jump_on_class_repeat`)"*; mỗi vai `lead-gap` / `lead-stale` / `ring2` tính tally từng kỳ. Đó là **công thật, đổ vào một cái phễu không có đáy**.
2. **Mọi vai đều kết đúng một câu**: *"quyết kéo nhịp là của owner/lead, tao chỉ đưa số"* (`sub-lead-stale-open-S169.md:133` và ≥5 nơi khác). Câu đó **chính xác** — và nó **xác nhận** cơ chế này là **TAY**, không phải máy. Nhưng luật thành văn ở `§2.1.8(d)` đọc như một **quy tắc tự động** (*"kéo audit tới sớm, bất-kể counter"*) ⇒ **người đọc tưởng có máy canh**. Đúng câu hub cấm ở LỚP-9.
3. **Nó là lớp phản-ứng duy nhất** khi phiên ngắn lại — `sub-invest-hoi-tu.md:157` từng đề nghị RETIRE và **bị BÁC** vì *"cơ-chế phản-ứng DUY NHẤT"*. Giữ lại một cơ chế **vì nó quan trọng**, rồi **không wire nó**, là kết cục xấu nhất trong 3 lựa chọn (wire / bỏ / giữ-mà-không-wire).
**Phân loại chính xác (đừng gộp):** đây **KHÔNG** phải `defined-but-unread` thuần như `session_ctx_kb` (khoá nằm im, chẳng ai làm gì quanh nó). Đây là **`fed-but-unread`** — sổ được nuôi đều đặn bằng công thật, chỉ thiếu đúng vế so-sánh. 🔴 **Đề nghị SE mở đây thành một sub-class ghost-wire thứ 3** trong H18; nó nguy hiểm hơn class-2 vì **lượng công đổ vào tạo cảm giác cơ chế đang sống**.
**Vá rẻ nhất (propose-only):** thêm vế thứ ba vào `nhip-no-probe.ps1` — đọc `.session-counter.json` → `class_repeat.counts`, so với `h24_cadence.jump_on_class_repeat`, in `OVERDUE:jump` + **liệt TỪNG class vượt** (A12 cấm nén khoảng). **Phản chứng bắt buộc:** hạ 1 class xuống 2 → phải IM; nâng lên 3 → phải KÊU. Chưa có 2 kết quả đó thì đừng tin bản vá.
⚠️ **Cảnh báo thi công:** bật vế này **hôm nay** sẽ kêu **8-12 class cùng lúc** (nợ tồn), không phải 1. Ai bật mà không dự trù sẽ tưởng máy hỏng. Xem §5 wave.
### Ứng viên đã XÉT rồi LOẠI (khai rõ để không ai đếm nhầm — A13)
| khoá | reader | vì sao KHÔNG tính ghost |
|---|---|---|
| `tiep_reload` (mode+sources) | 0 script | `_note` **khai thẳng**: *"KHAI THANG: chua co script-consumer — KHAC class ghost-wire vi hanh-vi tieu thu moi luot /tiep"* ⇒ cố-ý-CÓ-KHAI, cùng lớp `pull_warn_days` |
| `token_governor.pct_print` | 0 script | `_note` **chỉ đích danh reader nghi-thức**: `session-start.md §2.1.6` + `session-end.md §L.b(c)` — **đã verify 2 anchor TỒN TẠI** (`session-start.md:224` = `### 2.1.6 Hot-feed %-print`) ⇒ TAY-có-khai hợp lệ |
| `last_sleep_at` | 0 script | reader = nghi-thức, verify `sleep-recovery-memory-l2.md:64` đọc + `:107` ghi ⇒ TAY-có-khai |
| `token_governor.spawn_fill_directive` | 0 script | chỉ thị hành-vi cho lead, không tuyên có máy |
| `distill_trigger` trục **tuổi** | 0 script | `_residual_khai_that` **khai thẳng**: *"Khai dang DU-DINH ... CHUA CO MAY"* ⇒ mẫu mực đúng của LỚP-9 |
| `harness_floor.rounded_up_tokens` | 0 script | **CHƯA KẾT LUẬN** — xem dưới |
### ⚠️ Ứng viên TREO — `harness_floor.rounded_up_tokens` = 100000
- **Đo:** 0 reader trong `scripts/` + `hooks/` + `hmw.js`. Xuất hiện ở `docs/HANDOFF.md`, `docs/STATUS.md`, `harness-11-engine.md` (văn xuôi).
- **CHƯA ĐO — cần lệnh:** `grep -n "harness_floor\|rounded_up_tokens" docs/governance/harness-11-engine.md docs/STATUS.md` để xem 3 site đó có tuyên "máy trừ sàn này khi tính headroom" không. Nếu có tuyên ⇒ ghost thứ 3; nếu chỉ là *số ghi chép cho người đọc* ⇒ không phải cưỡng chế, loại.
### 🔴 GHOST đã biết — TÁI XÁC NHẬN SỐNG, bằng chứng SINH RA TỪ CHÍNH LƯỢT NÀY (no-self-exempt)
`tools-whitelist-no-teeth` — **tôi là vật chứng**:
- `.claude/agents/reviewer.md` frontmatter (đo tươi): `tools: [Read, Grep, Glob, Bash, mcp__rag-unified__*]` — **KHÔNG có Write, KHÔNG có Edit**.
- Nhưng bộ công cụ runtime cấp cho spawn này **CÓ `Write` và `Edit`**, và tệp bạn đang đọc **được tạo bằng `Write`**. ⇒ whitelist frontmatter **0 răng**, xác nhận lại tại S180.
- **Phổ:** đo 26 file `.claude/agents/*.md` → **20 vai** khai KHÔNG Write/Edit (chỉ 6 vai có: `frontend-designer`, `implementer-backend`, `implementer-frontend`, `office-document`, `test-specialist`, + README không tính). ⇒ **20/26 vai đang "propose-only" bằng LỜI HỨA**, backstop duy nhất = lead soát `git status` @commit-gate (M3 — TAY).
- 🔸 Anh đã chốt **GIỮ** ca này @S179 (`HANDOFF:70`: *"tha CA NÀY, KHÔNG tha cơ-chế"*) ⇒ tôi **không đề nghị đổi**, chỉ khai đúng nấc: **cưỡng chế này là TAY**, không phải máy.
### 🔴 Lớp anh em của LỚP-9: **MÁY TUYÊN PHẠM VI RỘNG HƠN CÁI NÓ QUÉT** (LỚP-8 ở tầng MÁY)
Lead báo lane D bắt `spawn-model-audit.ps1` tự dán nhãn *"CURRENT session only, by design"* mà đọc **phiên hôm qua**, và **sai CÂM** với lane đi qua `hmw.js`.
**Phán của lane F:** đây **KHÔNG phải ghost-wire** (máy CÓ tồn tại, CÓ chạy, CÓ ra số). Nó là **LỚP-8 ở tầng MÁY** — *nhãn phạm vi hẹp/sai so với phạm vi thật*, cộng **LỚP-4** (im lặng đọc thành sạch). Ba lớp phân biệt rạch ròi, đừng gộp:
- **LỚP-9 ghost-wire** = tuyên có máy, **không có máy** → sửa bằng *viết máy hoặc khai tay*.
- **LỚP-8 tầng-NHÃN** = khoản khai đóng, phạm vi thi hành rộng hơn → sửa bằng *so 2 phạm vi khi đóng*.
- **LỚP-8 tầng-MÁY** = máy có thật nhưng **quét hẹp hơn nhãn nó tự dán** → sửa bằng *bắt máy IN RA phạm vi thật nó vừa quét, và IN "0 mẫu" khác "0 lệch"*.
**Tôi tìm thêm được 1 ca cùng hình dạng, đã chứng bằng số — xem §3.1 (H24-2).** Nó là ca **nặng nhất** vì máy in `[ok]` trên vùng nó chưa từng đọc.
---
## §3 — SLOT ĐÓNG-HỤT (LỚP-8, tầng NHÃN)
Tập slot đã đóng, đo bằng `grep -n '^\*\*~~\(\d+\)' docs/HANDOFF.md`: **(68) (69) (70) (71)** @S179 · **(63) (59)** @S168 · thêm mục NEXT-em #6 (E4) đóng @S179 · 2 carry gạch @S179 (`mind-tran-nen-moi-cua`, `adap-apply-2-thu`). (54)-(58) @S167 nằm segment bất-biến.
### 🔴 3.1 — Slot (70): ĐÓNG-HỤT **ĐÃ CHỨNG**, và **RỘNG HƠN** mức S179 mô tả
**Nhãn:** `HANDOFF:50` — *"~~(70) Tách 2 sổ đếm H24~~ ✅ ĐÓNG @S179 — đã thi hành: `scripts/h24-signal-write.ps1` mang `slot 70` ở 3 chỗ (`:66` `:164` `:247`)"*.
**Rider còn sống ở `:51`:** detector **H24-2 dựng segment từ `marks[0]`** ⇒ mọi thứ trước marker đầu **không bao giờ được đọc**.
**Đo tươi (2026-08-07, trên `docs/HANDOFF.md` HEAD `55894a0`), chạy đúng regex của chính script:**
```
marks.Count = 25
marks[0].Index = 34922 -> physical line 172
discarded prefix bytes = 34922 / total 163795 (21,3% đầu file BỊ VỨT)
TOTAL [carry:*] in whole file = 285
[carry:*] BEFORE marks[0] (NEVER READ) = 66 hits, 25 unique
```
**25 slug KHÔNG BAO GIỜ được máy carry-age đọc:**
`acceptance-runtime-khkk` · `account-trung` · `adap-apply-2-thu` · `binh-le-decision` · `bvaau` · `ctx-t9-dogfood` · `ctx-verifier-no-self-append` · `e7-cot-chet-khkk` · `endline-sub-md` · `harvest-no-s168-s171` · `harvest-orphan-s159-tongquan` · `hmw-subfile-index-collision` · `hmw-width-vs-roster` · `mind-tran-nen-moi-cua` · `orphan-retro-harvest-s159` · `pe-phanquyen` · `ring5-audit-gap` · `synthesis-roll-s159-s160` · `tiep-3ter-seed-unwired` · `tiep-reload-underfill` · `tools-whitelist-no-teeth` · `tra-bui-relogin` · `uat-s117` · `uat-s133-budget-freeze` · `uat-s134-luyke`.
🔴 **Ba điều S179 chưa nói, lane F bổ sung:**
1. **Con số đã XẤU ĐI: 12 slug → 25 slug.** Rider @S179 ghi *"nuốt 12 slug"* tại `marks[0]`=`HANDOFF:90`. Nay `marks[0]`=**:172**. Vì sao? Vì chính closeout S179 viết segment mới bằng **`### 🔵 NEXT em @S179`** (heading `###`) trong khi regex chỉ khớp **`^\*\*`** (bold đầu dòng). ⇒ **hành vi vá-doc bình thường làm điểm mù to ra**, im lặng.
2. **Nó ăn trọn khối `Carry @S179`** — tức **chính khối re-stamp** mà `HANDOFF:73` tự tuyên *"re-stamp thật, không phải khai suông"*. Máy canh carry-age **không đọc nổi khối carry mới nhất**. Cái đèn treo ngay trên vùng tối.
3. **Máy vẫn in `[ok]`** — `governance-detectors.ps1:930` in `[ok] carry '<k>' streak=N < M`. Đây đúng **LỚP-4** (mã thoát/đèn xanh ≠ không có cờ) **và** cạm bẫy A4 mà hub cảnh báo: *"chưa có dữ liệu"* in giống hệt *"đã đo và bằng không"*.
**Vá rẻ nhất (propose-only, KHÔNG tự sửa):** cho segment đầu tiên bắt đầu từ **index 0** thay vì `marks[0].Index` (1 dòng), **hoặc** nới regex nhận cả `^#{2,3}\s` heading. Kèm **phản-chứng bắt buộc**: chèn 1 slug giả vào vùng L1-171 → máy PHẢI kêu; gỡ ra → im. Không có 2 kết quả này thì đừng tin bản vá (A16 + mục 9 khuôn hub).
### 🔴 3.2 — Slot (68): ĐÓNG-HỤT **ĐÃ CHỨNG** (ca thứ 2, và nó nối thẳng vào GHOST-MỚI-3)
**Nhãn `HANDOFF:46`:** đóng vì class `view-claim-broader-than-sample` **có mặt** ở `lead_self_audit.flag_classes` (2 hit) **và** `.session-counter.json` → `class_repeat.counts` (1 hit). Kết luận nguyên văn: *"Đóng bằng bằng-chứng ĐĨA, không bằng trí-nhớ."*
**Phạm vi thi hành THẬT — chính thân slot khai:** lý do mở class là *"nó **nằm ngoài TOTAL** ⇒ **không bao giờ chạm `jump_on_class_repeat`**, dù đã tái diễn ≥3 lần"*. ⇒ **Mục tiêu của khoản này là: class phải vào được ĐƯỜNG LEO THANG.** Không phải "có tên trong 2 tệp".
**Đo (2 lệnh đã chạy):**
- `grep -n flag_classes scripts/h24-signal-write.ps1` → **CÓ răng thật**: `:144` nạp enum, `:155`/`:172` **FAIL** nếu class lạ, `:302` **từ chối ghi** nếu `counts` có khoá ngoài enum. ⇒ nửa "vào được sổ" **ĐÚNG**.
- `grep -rn jump_on_class_repeat scripts/` → **0 reader thật** (xem GHOST-MỚI-3). ⇒ nửa "chạm được ngưỡng" **KHÔNG TỒN TẠI**.
🔴 **Kết luận:** slot (68) đóng đúng **một nửa** phạm vi. Class nay vào được sổ và được đếm — nhưng **đích cuối mà slot tự nêu (chạm `jump_on_class_repeat`) là bất khả**, vì ngưỡng đó không có máy nào đọc. Bằng chứng đĩa mà slot viện dẫn (**2 hit + 1 hit**) là **có thật**, nhưng nó chứng minh *"đã ghi tên"*, không chứng minh *"đã có răng"* — **đúng hình dạng slot (70)**: nhãn đóng ở tầng thấp hơn phạm vi thi hành.
🔸 **Không quy lỗi cho người đóng:** cả `ring2` (vai đề xuất) lẫn lead (vai đóng) đều **không sai một chữ nào** trong phạm vi họ đo. Lỗ nằm ở chỗ **không ai hỏi câu của LỚP-8**: *"máy này quét những đâu"* vs *"khoản này áp ở những đâu"*. Đó chính là lý do hub bắt hỏi câu ấy **mỗi lần đóng**.
### 3.3 — Slot (69): ĐÃ ĐO — đóng **đúng khoản**, nhưng lộ **1 cửa hở** (không quy là đóng-hụt)
**Nhãn `HANDOFF:48`:** wire cổng ép-seed C2 vào `pause.md`. **Verify tồn tại**: `.claude/commands/pause.md:24` = `### 2.5 🔴 C2 checklist artifact-vs-entry ÉP SEED TRƯỚC KHI CHỐT (wire @S172, owner slot 69)`.
**Đo phủ sóng cổng trên TOÀN BỘ 19 tệp lệnh** (`grep -ci "artifact-vs-entry|ÉP SEED|ep-seed"`):
```
HIT pause.md 1
HIT session-end.md 1
(17 tệp lệnh còn lại = 0)
```
Đối chiếu tập cửa gọi `nhip-no-probe.ps1` = **6**: `check-email` · `pause` · `session-end` · `session-start` · `snapshot` · `tiep`.
**Phán:** slot (69) **KHÔNG phải đóng-hụt** — nó mở ra vì `/pause` là đường thoát đã gây sót 5 lần, và nó **đã bịt đúng đường thoát đó**. 2/2 cửa **KẾT phiên** (`session-end`, `pause`) đều có cổng.
🔸 **Nhưng lộ 1 cửa đáng ngờ: `/snapshot`.** Đây là cửa **ghi trạng thái** (tức một điểm dừng thật, nơi việc chưa seed sẽ bốc hơi y hệt `/pause`), mà **0 hit** cổng ép-seed. `check-email` / `session-start` / `tiep` là cửa **MỞ/nối**, cổng seed không áp — loại có lý do (A13).
⇒ Ghi thành **1 mục nợ mới**, không phải mở lại slot (69): *"`/snapshot` là cửa dừng thứ 3 chưa có cổng ép-seed"*. Đúng tinh thần A4: **liệt từng cửa mới thấy**, ghi "tất cả các cửa" thì cửa này chìm.
### 3.4 — Slot (71): ĐÓNG ĐÚNG NẤC (không phải đóng-hụt) — khen có bằng chứng
Nhãn đóng = *"hết là câu hỏi"* (uỷ quyền thường trực), **và `HANDOFF:78` khai thẳng**: *"🔸 **KHÔNG đóng** dù có đụng: `[carry:harvest-no-s168-s171]` (mới có uỷ-quyền, **chưa gom byte nào**)"*. ⇒ đây là **mẫu đúng của A15**: tách *"đã đồng ý"* khỏi *"đã thi công"*. Ghi vào cột "làm MẠNH HƠN hub" của khuôn báo cáo.
### 3.5 — E4 (NEXT-em #6) và bài học đảo dấu
`HANDOFF:65-66` đóng E4 vì **tiền-đề đã hết đúng** (sổ `harness-refine` đã có S163/S168/S169). Kèm bài: *"sổ nói dối theo hướng **BI QUAN**"*. 🔴 **Đối xứng với lane F:** cùng một cơ chế cũng nói dối theo hướng **LẠC QUAN** — slot (70) là ca đó. ⇒ **luật đề xuất N4:** trước khi ĐÓNG (không chỉ trước khi leo thang) **đo lại tiền-đề**, vì đo-lại cứu được cả hai chiều.
### 3.6 — CHƯA ĐO: (63), (59), và các `~~carry~~` gạch
`(59)` đóng bằng số đo `184.643 B [46,2K..61,5K]` — có số, có nguồn, **cận-trên nhô khỏi 60K đã khai** ⇒ nhìn lành. `(63)` đóng kèm 6 finding chuyển UAT ⇒ có khai mặt kia.
**Lệnh cần:** với mỗi carry gạch, `grep -c "[carry:<slug>]" docs/HANDOFF.md` — slug đã gạch mà **còn xuất hiện ở khối carry mới nhất** = đóng-hụt hình dạng khác (đóng nhãn, chưa gỡ khỏi tập).
---
## §4 — HỒ SƠ RỦI RO 4 KHOẢN VƯỢT-KHUNG
> N2 đã xác nhận 4/4 **gán đúng cấp**. Đây **KHÔNG lặp N2** — đây là *nếu anh gật thì cái gì vỡ*.
### (1) Đổi `exit-0-advisory` → **cổng CHẶN bằng mã lỗi** ở lớp detector/sentinel
- **Vỡ ở đâu:** `governance-detectors.ps1` tự khai *"Exit 0 always (never fails build)"* mà **hiện đang giơ ~49 cờ**. Bật chặn = **cửa `/session-end` đứng ngay lượt đầu**, và đứng vì **nợ cũ**, không vì lỗi mới.
- **Vỡ thầm nguy hơn:** cờ INFORM-only (H24-2, C9...) **cố ý** không vào TOTAL. Nếu đổi exit-code mà không tách rõ *tập-lái-mã-thoát* ⟂ *tập-báo-cáo-thôi*, sẽ **nuốt luôn INFORM vào cổng** ⇒ đúng LỚP-4 nhưng ngược dấu.
- **Phát hiện bằng gì:** chạy `governance-detectors.ps1` **trước** khi bật, đếm cờ theo severity; nếu bật mà số cờ chặn ≠ số HIGH đã đếm ⇒ tập tín hiệu đã trôi.
- **Rollback:** 1 biến `$FailOnFlags` mặc định `$false` + env-override. **Bắt buộc có `-WhatIf`/dry-run in ra "nếu chặn thì chặn vì cờ nào"** chạy ≥1 phiên trước khi lật.
- **Ranh giới KHÔNG được vượt:** 2 máy đang fail-loud (`session-counter-tick`, `h24-signal-write`) + `hmw` checkpoint throw — **đừng gộp chung**; chúng fail-loud vì *thiếu cấu hình*, khác hẳn *có cờ nội dung*.
- **Rủi ro Goodhart (nêu thẳng):** cổng chặn tạo áp lực **giảm số cờ**. Cách rẻ nhất để giảm cờ là **đổi hình dạng thứ đang bị đo**, không phải sửa bệnh. Phải kèm luật: *hạ số cờ mà không có commit sửa bệnh tương ứng = phải khai*.
### (2) Wire chấm điểm vào 2 cửa phiên + vai tầng-2/tầng-3
- **Vỡ ở đâu:** A8 của hub đòi **3 tầng** (tự chấm / đếm lại độc lập / kiểm PHÉP ĐẾM) và **cấm tầng-3 chấm lại**. SE **chưa từng sinh điểm nào** (N1 đo `grep` chấm điểm = 0, control 3 file) ⇒ đây là **dựng mới hoàn toàn**, không phải chỉnh.
- **Vỡ ngay lượt đầu (chắc chắn, hub đã đo):** *"máy chấm chỉ đọc dòng hội thoại **luôn cho điểm tuyệt đối**"*. SE hiện **không có tỉ lệ phủ sóng** tin của anh ⇒ theo A8 phải in **"KHÔNG ĐO ĐƯỢC", CẤM in điểm**. Nếu wave này in điểm ở lượt đầu ⇒ vi phạm ngay khoản vừa adopt (LỚP-2).
- **Đụng roster:** tầng-2 + tầng-3 = **2 vai**. Roster hiện **26 file** `.claude/agents/*.md` (25 vai + README) mà `hmw_width.cap = 20` ⇒ **full-roster sweep đã LOUD-skip**. Thêm 2 vai = skip thêm 2 lane. **Đây là ràng buộc số học, không phải ý kiến.**
- **Phát hiện:** sau khi wire, chạy 1 phiên thật rồi hỏi *"điểm có bao giờ khác tuyệt đối không"*. Luôn tuyệt đối = máy chết.
- **Rollback:** giữ chấm điểm ở **INFORM-only** ≥3 phiên trước khi cho nó ảnh hưởng bất cứ gate nào.
### (3) 🔴 Sổ-3-khối cạnh WAL — **NGUY CƠ NGUỒN-ĐÔI, khoản rủi ro cao nhất**
- **Vì sao nặng nhất:** SE **đã có** một lane quản trị mạch việc = `.claude/WAL.md` (≤40 dòng by-design, có **hook `Stop` M1 THẬT** flush nó). Đẻ sổ thứ hai cạnh nó ⇒ 2 nơi cùng mô tả "việc đang treo".
- **Vỡ ở đâu, cụ thể:**
(a) `/tiep` nạp lại theo `tiep_reload.sources` — **8 nguồn**, trong đó có WAL. Sổ mới **không tự vào** danh sách ⇒ `/tiep` sẽ **không thấy** ⇒ sổ chết ngay (đúng A3: *"sổ không được tra là sổ chết, còn tệ hơn không có sổ"*).
(b) `§6.4` **xoá WAL mỗi closeout**. Nếu mục sổ mới cũng bị nghi thức nào đó reset ⇒ mất im lặng. Nếu KHÔNG reset ⇒ 2 sổ **lệch nhau** sau vài phiên, và không có luật nào nói ai thắng.
(c) A1 đòi **cột lời nguyên văn = đúng chữ anh nói, cấm diễn giải**. WAL hiện là **văn nén nội bộ** ⇒ **cấm đổ WAL sang cột nguyên văn** — hub đã giẫm đúng bẫy này và khai trong A1.
(d) A2 đòi ghi **NGAY trong lượt**, và **cấm cắm luật vào tệp lệnh của một cửa**; phải cắm vào **tệp ngữ cảnh luôn nạp mỗi lượt**. SE **không có** file auto-inject-mỗi-lượt cho lead ngoài `CLAUDE.md` ⇒ **buộc phải chạm `CLAUDE.md`** ⇒ xem §5 (đụng file auto-inject).
- **Phát hiện:** sau 1 phiên, `diff` tập slug/mục giữa WAL và sổ mới. Lệch ≠ 0 mà không ai kêu ⇒ nguồn-đôi đã sống.
- **Rollback:** dựng sổ mới **read-mostly, dẫn xuất** giai đoạn đầu (WAL vẫn là nguồn duy nhất cho mạch-việc; sổ mới chỉ chứa **3 khối của hub**: việc-được-giao / sở-thích-thường-trực / lời-phàn-nàn — 3 loại này **WAL không có**). ⇒ **vẽ ranh bằng LOẠI NỘI DUNG, không bằng thời điểm ghi.** Đây là ranh giới duy nhất tôi thấy không đẻ nguồn-đôi.
- 🔴 **Ràng buộc bắt buộc nếu anh gật:** mã định danh mục **vĩnh viễn, CẤM tái dụng slot-index** (A1). SE đã có tiền lệ đau đúng lớp này (`vắng-mặt trông giống ổn`: slot-index tái dụng xoá im lặng).
### (4) Đẻ vai mới (giữ-chuẩn-tên / đọc-sổ)
- **Vỡ ở đâu — số học trước đã:** `.claude/agents/*.md` = **26 file** (25 vai + README). `hmw_width.cap = **20**`, cơ chế **LOUD-skip** (chạy 20 lane ĐẦU, **BỎ các lane CUỐI**). ⇒ mỗi vai thêm vào = **thêm 1 lane bị bỏ** ở full-roster sweep. Carry `[carry:hmw-width-vs-roster]` đang treo, anh "OK" @S179 = **ghi nhận, CHƯA phải lệnh đổi số** ⇒ **cap vẫn 20**.
- **Vỡ thứ hai — mirror 2 nơi:** cap sống ở `memory-budget.json` **và** hardcode `hmw.js` `WIDTH_CAP` (sandbox no-fs). Ai nâng cap **phải đổi ĐỒNG THỜI 2 nơi**; detector C9 canh drift (INFORM-only, không chặn) ⇒ **quên 1 nơi thì chỉ có một dòng INFORM cản đường**.
- **Vỡ thứ ba — ngân sách:** `_why_20_not_16` tự khai **8 lane @S149 ≈ 1,06M token ⇒ 20 lane ước ~2,5M**. Thêm 2 vai ⇒ tự xét lại con số này, **đừng để nó trôi im**.
- **Vỡ thứ tư — chi phí bộ nhớ:** mỗi vai mới cần entry `measured{}` trong `memory-budget.json`. Hiện `measured{}` có **17 vai**, roster **25** ⇒ **8 vai đã không có baseline** (HANDOFF `:172` khai: *"6 vai (3 ctx + 3 ring) KHÔNG có baseline ⇒ 'delta 0' với chúng = **chưa từng đo**"*). Thêm 2 vai không seed baseline ⇒ **10 vai mù**.
- **Phát hiện:** `scripts/measure-agent-memory.ps1` + đối chiếu `measured{}` keys ⟂ `.claude/agents/*.md`.
- **Rollback:** vai mới là file `.md` ⇒ xoá file là rollback. **NHƯNG** (xem §5) persona **auto-inject** ⇒ vai mới **không sống cho tới RESTART CLI kế**.
---
## §5 — 🔴 WAVE ĐỤNG MÁY / CẦN RESTART (thứ hay quên nhất)
**Ba lớp "ăn khi nào" khác nhau — trộn là wave sau chạy trên trạng thái cũ:**
| lớp | sửa gì | ăn khi nào | bằng chứng SE |
|---|---|---|---|
| **A. Đọc-mỗi-lần-chạy** | `scripts/*.ps1`, `*.py`, `memory-budget.json` | **NGAY lượt gọi kế** | script đọc file lúc chạy |
| **B. Auto-inject theo spawn** | `.claude/agents/*.md` (persona) · `.claude/agent-memory/*/MEMORY.md` | **spawn KẾ TIẾP** — nhưng chỉ chắc ăn sau **RESTART CLI** (hot-reload ENV-DEP, memory `project_harness4_two_tier_model`: *"EDIT-agent-tồn-tại/command cần restart; agent MỚI khác"*) | S124 restart-lesson |
| **C. Nạp lúc khởi động phiên** | `.claude/settings.json` (hooks) · `CLAUDE.md` · `.claude/commands/*.md` | **RESTART CLI** | hook đăng ký lúc boot |
**Quy chiếu 4 khoản vượt-khung + các wave khả dĩ:**
1. **Wave sửa `governance-detectors.ps1`** (vá H24-2 §3.1 · đổi exit-code) → **lớp A**, ăn ngay. 🔴 **NHƯNG đây là script mà `/session-end` ĐANG dùng** ⇒ nếu wave chạy giữa phiên và làm hỏng script, **cửa đóng phiên hỏng theo**. ⇒ **luật: sửa detector phải chạy `-RepoRoot <cây-tạm>` fault-inject TRƯỚC, và giữ bản backup có thể `git checkout` 1 lệnh.**
2. **Wave đổi `memory-budget.json`** (cap, class mới, `measured{}`) → **lớp A**, ăn ngay ở lượt script kế. An toàn nhất trong 4.
3. **Wave đẻ vai mới / sửa persona** (khoản (4), và **cả `reviewer.md` nếu vá tools-whitelist**) → **lớp B**. 🔴 **Vai mới KHÔNG sống trong phiên tạo ra nó.** Mọi acceptance kiểu *"spawn thử vai mới"* phải xếp **SAU restart**, nếu không sẽ đo trên roster cũ và tưởng hỏng.
4. **Wave cắm luật A2/A3 vào `CLAUDE.md`** (bắt buộc cho khoản (3) sổ-3-khối) → **lớp C, RESTART**. Và `CLAUDE.md` là **bề mặt đắt nhất** — mọi lượt đều nạp.
5. **Wave sửa `.claude/commands/session-*.md`** (wire chấm điểm vào 2 cửa — khoản (2)) → **lớp C**. Cửa `/session-start` đang chạy sẽ **không** thấy bản mới.
6. **Wave thêm hook mới vào `.claude/settings.json`** (nếu muốn nâng M2→M1) → **lớp C, RESTART BẮT BUỘC**, và là thay đổi **rủi ro cao nhất**: hook lỗi = **mọi lượt Stop đều lỗi**, và `wal-flush` hiện là **máy M1 DUY NHẤT** của SE. Hỏng nó = mất mạch việc. Tiền lệ SE: PATH đa-context Windows từng làm hook chết mọi lượt + **fail-open che mất** (ghost-wire class, S111).
**⇒ Thứ tự wave đề xuất (giảm số lần restart, tránh chạy trên trạng thái cũ):**
`A-only` (detector + config, verify ngay) → `B` (persona/vai mới) → **RESTART** → verify B → `C` (CLAUDE.md + commands + settings) → **RESTART** → verify C.
🔴 **Chống lẫn:** mỗi wave B/C phải có **1 phép đo chỉ xanh SAU restart** (ví dụ: spawn vai mới trả 1 dòng cố định). Không có phép đo đó thì không phân biệt được *"chưa ăn"* với *"hỏng"*.
**Dự trù vá — hub tự khai *cả sáu lượt chấm chéo đều KHÔNG ĐẠT lần đầu* (LỚP-3):** lịch phải có **1 vòng vá/wave** làm mặc định. SE có counter-datum riêng cùng hướng: `ring1` 32Đ/6T · H2 `GATE-FAIL` · reviewer thường `PASS_WITH_FLAGS`. ⇒ ai lên lịch "làm xong là xong" sẽ trượt đúng chỗ này.
---
## §6 — PHẦN C: MỤC NÀO CHƯA AI CHẠM (soi toàn chuỗi N1+N2+N3)
Ký hiệu: **[N1]** invest đã phủ · **[F]** lane F lượt này phủ · **CHƯA AI CHẠM** = 0 lane đụng tới giờ (theo `run.md` + `sub-invest-fitmap-S180.md` §4 + `sub-review-n2-S180.md` mà lead trỏ).
| khoản | tình trạng chuỗi |
|---|---|
| **A0-1** bốn món trên đĩa + **mã băm** | **[N1]** — 4/4 hash khớp qua `scripts/stamp_verify.py`; **F-1** gửi ngược hub (frontmatter `DRAFT`/`PENDING`) |
| **A0-2** tệp theo dõi từng khoản | 🔴 **CHƯA AI CHẠM** — chưa lane nào chỉ ra tệp checklist tick-dần trong kho SE. Lệnh: `ls docs/governance/adap-reports/ \| grep upgrade-pack` |
| **A0-3** dòng "đã nhận" trong sổ liên lạc | **[N1]** — `grep "upgrade-pack-phased" broadcasts/_index.md` = **0** (control `harness-22`=3) ⇒ **HỤT, đã biết** |
| **A0-4** bản đồ 7 dòng + máy kiểm `grep -c '^\| GĐ-[0-6]'` = 7 | ⚠️ **NỬA** — N1 có bảng 7 GĐ trong artifact, **nhưng chưa ai chạy đúng lệnh máy kiểm trên đúng tệp bản-đồ**. Lệnh: `grep -c '^| GĐ-[0-6]' <tệp>` |
| **A1** sổ 3 khối, cột nguyên văn | **[N1]** — `grep "sở-thích\|phàn nàn"` = **0** (control 3 file) ⇒ GĐ-4 hổng nhất |
| **A2** ghi NGAY, cắm vào tệp luôn-nạp | 🔴 **CHƯA AI CHẠM** — chưa ai đo SE có cắm luật ghi-ngay vào bề mặt auto-inject không. **[F]** nêu ràng buộc ở §4(3)(d) nhưng **chưa đo** |
| **A3** tra sổ TRƯỚC khi hỏi, ở **≥2 chỗ** | 🔴 **CHƯA AI CHẠM** |
| **A4** đèn bật **MỌI** điểm dừng, liệt TỪNG cửa | ⚠️ **NỬA — [F]**: đo được `nhip-no-probe` gọi từ **6 cửa** (check-email/pause/session-end/session-start/snapshot/tiep). **Chưa ai liệt đủ tập cửa dừng THẬT** và đối chiếu từng cửa. Đặc biệt **chưa ai kiểm phân biệt "chưa có dữ liệu" vs "đã đo và bằng 0"** — mà §3.1 chứng SE **đang sai đúng chỗ đó** |
| **A5** định nghĩa "hỏi lại không kèm thông tin mới" | 🔴 **CHƯA AI CHẠM** |
| **A6** lằn ranh đỏ **liệt kê**, không tính từ | 🔴 **CHƯA AI CHẠM** — SE có `MIND-0`/vai INFORM-only nhưng chưa ai map sang 5 loại của hub (đổi lược đồ · xoá dữ liệu · hướng ra ngoài · không lùi được · dính tiền) |
| **A7** điểm trải nghiệm **tách** điểm kỹ thuật, trừ theo MỤC | **[N1]** — chấm điểm `grep` = **0** (control 3 file) ⇒ chưa có |
| **A8** 3 tầng đếm + **tỉ lệ phủ sóng** | **[N1]** một phần; 🔴 **tỉ lệ phủ sóng CHƯA AI CHẠM** — và nó là điều kiện **CẤM in điểm** |
| **A9** niêm phong 3 mốc | 🔴 **CHƯA AI CHẠM** |
| **A10** đường ghi lại khi chấm sai + **phép thử đẩy nhãn mới vào máy cảnh báo PHẢI bị từ chối** | ⚠️ **NỬA** — SE có `error-ledger.md` + `lead_self_audit.flag_classes`; nhưng **slot (68) chứng SE làm NGƯỢC**: class mới được **nhét vào tập tín hiệu** `flag_classes`. Hub nói tập đó **phải từ chối**. 🔴 **Xung đột triết lý THỨ HAI** — xem §7 |
| **A11** mọi số neo nguồn | **[F]** lane này neo lệnh cho từng số |
| **A12** liệt từng mục, cấm nén khoảng | **[F]** — 25 slug §3.1 liệt đủ tên |
| **A13** "không áp dụng" phải có lý do | **[F]** — bảng "đã XÉT rồi LOẠI" §2 |
| **A14** chưa biết thì ghi "chưa đo được" | **[F]** — mọi chỗ hụt đều ghi `CHƯA ĐO — cần <lệnh>` |
| **A15** 3 nấc khác nhau | ⚠️ **[F] một phần** — §3.4 khen slot (71) đúng nấc. **Chưa ai khai nấc theo TỪNG GĐ** cho cả gói |
| **A16** khai máy ⟂ tay | **[F]** §1 — và phát hiện **thang 2 nấc là sai, phải 3 nấc** |
**Tự chấm nhanh của hub** (mục "Tự chấm nhanh trước khi gửi"): 🔴 **CHƯA AI CHẠM** cả 7 dòng.
---
## §7 — 🔴 XUNG ĐỘT TRIẾT LÝ **THỨ HAI** (N1 tìm được 1, lead giao N2 tìm cái thứ 2 — lane F nộp ứng viên)
**Hub A10 (nguyên văn):** *"nhét lớp lỗi mới vào **tập tín hiệu đóng** của máy cảnh báo... Lớp lỗi này phải sống ở **sổ lỗi**. **Phép thử:** thử đẩy lớp nhãn mới vào máy cảnh báo — nó **phải từ chối**."*
**SE làm ngược, có vật chứng, và vừa ĐÓNG như một thành tựu:** slot (68) `HANDOFF:46` đóng vì đã thêm class `view-claim-broader-than-sample` **vào `lead_self_audit.flag_classes`** (= tập tín hiệu) **và** seed `class_repeat.counts = 0` để giữ bất biến `counts ≡ enum`. Chính slot tự khai lý do: class nằm **ngoài TOTAL** thì *"không bao giờ chạm `jump_on_class_repeat`"* ⇒ SE **cố ý** mở tập để class có răng.
⇒ Hai bên **đối nghịch trực tiếp**: hub bảo *tập tín hiệu phải ĐÓNG, lớp mới về sổ lỗi*; SE có **đường thành văn + tiền lệ owner** (`gap-incident-unrecorded` @S143) để **MỞ tập**. Đây không phải hiểu nhầm — là **hai thiết kế khác nhau về nơi lớp lỗi sống**.
🔸 **Khai mặt kia (không tự bênh):** SE **có** phòng vệ đúng thứ hub sợ — bất biến `counts ≡ enum` bắt buộc seed = 0 cùng nhịp, tức có ý thức *"thêm lớp là đổi ngữ nghĩa bộ đếm"*. Nhưng SE **chưa từng chạy phép thử của hub** (*đẩy nhãn mới vào → máy PHẢI từ chối*) ⇒ chưa biết tập của mình **đóng hay mở**.
**Đề xuất:** đưa vào mục 8 khuôn báo cáo (**phản biện gửi ngược hub**), kèm phản-ví-dụ = tiền lệ S143 owner-ratified.
---
## §8 — TỔNG KẾT SỐ (mỗi số neo lệnh)
| đại lượng | số | lệnh neo |
|---|---|---|
| máy fire tự động (M1) | **1** | đọc trọn `.claude/settings.json` |
| máy-qua-nghi-thức (M2) | **17** | `grep -rl <script> .claude/commands/` |
| script mồ côi 0-caller (M3) | **3** | cùng lệnh, kết quả rỗng + control-dương |
| tổng script trên đĩa | **21** (13 gov + 8 ops/deploy khác) | `ls scripts/*.ps1 scripts/*.py` |
| **ghost-wire MỚI (đã chứng)** | **3** | `jump_on_class_repeat` (🔴 nặng nhất) · `mfe.denominator_sources` · `crystallized_backfill.source_order` |
| ghost-wire treo (chưa kết luận) | **1** | `harness_floor.rounded_up_tokens` |
| ghost-wire cũ tái xác nhận | **1** | `tools-whitelist-no-teeth` — vật chứng = chính file này |
| ca "lối-vào-đứt" (họ khác, không tính ghost) | **1** | `deps-audit.ps1` ⟂ skill `dependency-audit-erp` |
| vai khai KHÔNG Write/Edit | **20/26** | `sed -n '1,12p' .claude/agents/*.md \| grep '^tools:'` |
| **slot đóng-hụt ĐÃ CHỨNG** | **2** — (70), (68) | regex H24-2 · `grep jump_on_class_repeat scripts/` |
| slot đo xong → KHÔNG phải đóng-hụt | **1** — (69) | 2/2 cửa-kết có cổng; lộ nợ mới `/snapshot` |
| slug carry máy không đọc | **25** (66 hit / 285 tổng) | script PowerShell §3.1 |
| % HANDOFF bị H24-2 vứt | **21,3%** (34.922/163.795 B) | cùng script |
| wave cần RESTART | **≥3** (persona · commands/CLAUDE.md · settings hooks) | phân lớp §5 |
| khoản Phần-C chưa ai chạm | **6** (A0-2, A2, A3, A5, A6, A9) + tự-chấm-nhanh 7 dòng | bảng §6 |
| khoản Phần-C mới nửa | **4** (A0-4, A4, A10, A15) | bảng §6 |
---
## §8-bis — 🔴 GHOST-MỚI-3 ĐỔI HÌNH DẠNG WAVE (bổ sung §5, đọc kèm)
Vá `jump_on_class_repeat` **KHÔNG** phải wave lớp-A vô hại như tưởng:
- **Lớp A** (sửa `nhip-no-probe.ps1`) ⇒ ăn ngay. **Nhưng** `nhip-no-probe` được gọi từ **6 cửa** ⇒ hỏng nó = hỏng đèn ở cả 6 cửa cùng lúc. Là script có **bề mặt nổ rộng nhất** trong 21 script.
- **Nợ tồn bung ngay lượt đầu:** 8-12 class đang ≥ ngưỡng ⇒ đèn sẽ kêu **cả nắm** ở lượt bật. Phải quyết TRƯỚC: (a) bật kèm **freeze baseline** (chỉ kêu class TĂNG THÊM sau mốc), hay (b) bật trần và chấp nhận một lượt ồn. Không quyết trước ⇒ người thấy 12 dòng đỏ sẽ tưởng máy hỏng và tắt nó.
- **Đụng khoản vượt-khung (1):** nếu wave "đổi exit-0 → gate" chạy TRƯỚC wave này, cổng sẽ chặn ngay vì nợ tồn. ⇒ **thứ tự bắt buộc: vá jump (INFORM) → chạy ≥1 phiên → mới bàn gate.**
---
## §9 — CÒN NỢ CỦA CHÍNH LANE F (khai theo A14, không giấu)
1. `harness_floor.rounded_up_tokens` — chưa kết luận ghost hay không. Lệnh ở §2.
2. ~~Slot (68)/(69)~~ ✅ **ĐÃ ĐO XONG** — (68) = đóng-hụt đã chứng · (69) = không phải đóng-hụt, đẻ 1 nợ mới (`/snapshot` chưa có cổng ép-seed).
3. `(63)`, `(59)`, các `~~carry~~` gạch — chưa quét từng slug. 🔴 **Ưu tiên cao hơn tôi tưởng lúc đầu**: §3.1 chứng 25 slug carry nằm trong vùng máy không đọc, nên trạng thái "đã gạch" của chúng **chưa từng được máy nào đối chứng**.
4. ~~3 script mồ côi~~ ✅ **ĐÃ ĐO XONG** (§1.3) — 1 hợp lệ, 1 lối-vào-đứt, 1 mirror-không-detector (`session_scaffold.py` còn nợ so contract output).
5. Chưa đọc `sub-invest-fitmap-S180.md` §4 và `sub-review-n2-S180.md` T4 **nguyên văn** — bảng §6 dựng từ `run.md` (lead tóm) ⇒ **cột "[N1]" có thể rộng/hẹp hơn thật**. Ai dùng bảng §6 để chia wave **phải mở 2 tệp đó đối chiếu trước**.
6. Chưa chạy `governance-detectors.ps1` live lượt này (chỉ đọc mã + tái lập regex bằng PowerShell). Số cờ ~49 là **trích từ `run.md`, KHÔNG phải lane F đo**.
---
## §10 — SỔ ANTI-PATTERN CỦA VAI `reviewer` (nội dung lẽ ra vào diary — xem ghi chú cuối)
1. **`fed-but-unread` — sub-class ghost-wire thứ 3, MỚI.** Sổ được nuôi bằng công thật đều đặn (~40 tệp run tính tally), nhưng vế so-sánh ngưỡng không tồn tại. **Nguy hơn `defined-but-unread`** vì khối lượng công đổ vào tạo cảm giác cơ chế đang sống. Phép bắt: với mỗi khoá **ngưỡng**, grep reader và **loại hit nằm trong chuỗi văn bản** (thông báo lỗi, comment) — hit-trong-prose là dương-giả kinh điển, SE đã dính 3 lần với `pull_warn_days`.
2. **Máy in `[ok]` trên vùng nó chưa từng đọc.** H24-2 vứt 21,3% đầu `HANDOFF` rồi in `[ok]` cho phần còn lại. Phép bắt: bắt mọi detector **in ra phạm vi thật vừa quét** (byte/dòng/segment), và phân biệt `0 mẫu` với `0 lệch` — hub gọi đúng tên ở A4.
3. **Vá doc bình thường làm điểm mù của máy TO RA, im lặng.** Đổi `**NEXT em` thành `### NEXT em` ⇒ `marks[0]` trôi từ :90 xuống :172 ⇒ 12 slug → 25 slug bị nuốt. Phép bắt: neo detector vào **cấu trúc ổn định**, và có phản-chứng chạy lại mỗi khi bề mặt bị vá.
4. **Đóng khoản bằng bằng-chứng ĐÚNG nhưng ở TẦNG THẤP HƠN mục tiêu.** Slot (68): chứng "class có tên trong 2 tệp" (thật) trong khi mục tiêu là "class chạm được ngưỡng leo thang" (bất khả). Phép bắt = câu hỏi LỚP-8, hỏi **mỗi lần đóng**: *"máy này quét những đâu"* vs *"khoản này áp ở những đâu"*.
5. **Thang máy/tay 2 nấc là thang HỎNG.** SE có 1 máy fire thật, 17 máy-qua-nghi-thức, 3 mồ côi. Điền "máy" cho cả 17 là đúng chữ sai nghĩa. Luôn hỏi: *"kết quả không-hit có phụ thuộc người nhớ chạy không?"*
6. **Vai propose-only tin vào whitelist frontmatter là tự lừa.** 20/26 vai khai không Write/Edit; runtime vẫn cấp. Lượt này tự chứng: file này tạo bằng `Write` từ vai `reviewer`. Backstop thật = lead soát `git status`, và đó là **TAY**.
7. **`ngược-#53` là lỗi LỆNH, không phải lỗi trí nhớ.** "Append vào file X" bị đọc thành "append khi có gì để append". Chặn được bằng **thứ tự tool-call** (`Write` khung là tool-call #1), không chặn được bằng lời nhắc.
> 🔸 **Khai thẳng — tôi CỐ Ý không tạo `<run-folder>/.claude/agent-memory/reviewer/MEMORY.md`.** Harness trỏ diary của tôi vào đường **lồng trong run-folder**; ghi vào đó sẽ đẻ đúng **stray `.claude` mis-land class-S54** mà `HANDOFF` NEXT-em #4 đang có nguyên một việc đi dọn (*"Dọn 8 dir rỗng mis-land class-S54"*), và lệnh lane cấm ghi ngoài tệp lane. ⇒ Nội dung diary nằm ở §10 này. **Lead quyết**: chép §10 sang `.claude/agent-memory/reviewer/MEMORY.md` (đường THẬT, ngoài run-folder) hay để nguyên. Tôi không tự ghi vào đường thật vì nó nằm ngoài phạm vi lane.
---
**END-LANE-F** — ruột đã đổ. Mọi mục có kết luận hoặc có `CHƯA ĐO — cần <lệnh>`. Không heading rỗng.