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