wal: flush 20260807T1442

This commit is contained in:
pqhuy1987
2026-08-07 14:42:12 +07:00
parent 69f8e74610
commit f302086346
11 changed files with 1354 additions and 1 deletions

View File

@ -1,5 +1,7 @@
# Reviewer Agent — Persistent Memory
- **S180 (2026-08-07) LANE A/6 `/fable-clone reviewer` — bóc GĐ-0+GĐ-1 gói 7-giai-đoạn AI_INFRA (đĩa `runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-a-gd01.md`, 57 KB / 355 dòng; #53 cắn ở return lượt đầu, đĩa cứu trọn):** 🔴 **Bài đắt nhất — "0 hit" ĐÚNG THEO LUẬT vẫn là LỖ THẬT.** Lead giao ca "4 thư inbox 2 ngày, `_index` 0 hit". Đo ra: **24 thư thiếu dòng / 69**, cũ nhất 25 ngày. Nhưng phân loại theo `to:` mới ra chuyện: `to=se` **23/23 CÓ dòng** (control-dương mạnh nhất — kỷ luật CÓ chạy) · `to=all-fit` **22 có / 20 thiếu**. Mà chính `_index.md:7` khai fan-out **KHÔNG** track ở đây, track ở `COMMS-LEDGER``find -iname "*COMMS*"` = **0 tệp trong SE** (control `*ledger*` = 4) ⇒ **sổ mà luật trỏ tới không tồn tại**, 21 thư không có nhà. Và S153 đã phán ca này **dương-giả** (`bookend-close-synthesis.md:25`, hồi đó 19 thư) — phán đúng cho **câu hỏi lúc đó**, sai cho câu hỏi A0-3 bây giờ. ⇒ **Luật: gặp "0 hit", hỏi (a) luật nào nói nó phải có mặt · (b) luật đó trỏ sổ nào · (c) sổ đó CÓ TỒN TẠI KHÔNG.** Bỏ (c) là đóng nhầm khoản đang hở. 🔴 **Bài 2 — đếm HỌ TÊN bằng regex ra 160/159, lệch 1 vì `S57bis`** (hậu tố chữ làm 1 tệp rơi vào 2 nhánh lọc) ⇒ mọi phép phân-họ phải **cộng lại và đối chiếu tổng**, lệch 1 cũng phải truy. Đo được: sessions/ **5 họ** (159 tệp) · runs/ **2 họ** (88, 18 lệch) · scripts/ **3 họ** + cặp sinh-đôi `session-scaffold.ps1``session_scaffold.py` (cùng khái niệm, 2 quy ước) · vai **1 họ SẠCH** (agents 26 = agent-memory 26 = `hmw.js` VALID_ROLES 26, `comm` rỗng 2 chiều — vì có máy STOP-HARD `:173`). 🔴 **Bài 3 — `CLAUDE.md` ghi quy ước nhật ký `YYYY-MM-DD-HHMM-{topic}` khớp ≤64/159 tệp thật, họ đông nhất (78) không khớp cách nào** ⇒ quy ước thành văn duy nhất trong kho **sai với đa số đĩa**, 0 máy chặn. 🔴 **Bài 4 — "single source" tự xưng ≠ chuẩn.** `vocab-alias-map.md:3` tự nhận *"nguồn duy nhất"* nhưng `:8` tự thu hẹp còn **cặp từ đồng nghĩa** ⇒ là **bảng dịch** (nhìn về sau), KHÔNG phải chuẩn (nhìn về trước). 3 phép thử tách: **tiên-đoán** (đưa vai mới chưa có tên — nó câm) · **phủ-sóng** (6 nhóm tên hub đòi: 0/6) · **hướng**. ⇒ SE **không khai `không áp dụng` GĐ-1 được**. 🔴 **Bài 5 — số-trong-chú-thích trôi, bắt bằng 1 lệnh:** `hmw.js` chú thích *"11 class: 5 view-\* + 6 gap-\*"*, đĩa `memory-budget.json` = **12** (6+6); lớp thứ 12 `view-claim-broader-than-sample` **append cuối mảng, ngoài cụm view-\*** ⇒ đếm lướt ra 5, tưởng đúng. Tập tự nhận là **ĐÓNG** mà sai số phần tử = người đọc không biết mình thiếu lớp nào. Tag `[s180, lane-a, 0hit-dung-luat-van-la-lo, so-trong-cua-luat-khong-ton-tai, phan-ho-phai-cong-lai-tong, single-source-tu-xung-la-bang-dich, so-trong-chu-thich-troi]`
- **S179 (2026-08-07) C7 re-review sau vá SỬA-1..6b — `PASS-WITH-8`, 3 MAJOR `[LEAD SEED ON-BEHALF]`:** 🔴 **Lượt ăn tiền nhất từ trước tới nay của vai này: 2/3 MAJOR là lỗi TRONG CHÍNH BẢN VÁ vừa pass 12/12 acceptance.** [1] `git status --porcelain | cut -c4-` **đẻ path RÁC** — rename in MỘT dòng `R old -> new`, path có dấu cách bị quote; lead dựng sandbox đo lại: **2/2 MISS**, thước đề-xuất **2/2 OK**. [2] đổi ba-chấm→hai-chấm **KHÔNG vô-hại mà là REGRESSION có điều-kiện** — lead ĐÚNG rằng md5 y hệt, nhưng chỉ khi `origin/main` còn ancestor; sandbox phân-kỳ: hai-chấm liệt cả `upstream_only.txt` (= ĐÃ PRODUCTION) vào "phần MỚI", ba-chấm ra đúng. ⇒ **thủ phạm thật luôn là `git diff` mù untracked**, lead gán sai tội cho ba-chấm. [3] khối MIRROR lead vừa viết mang số `:112` trong khi chính 6 dòng đó đẩy thành 118 — **mỏ-neo TỰ-VÔ-HIỆU ngay lúc viết**; lead vá thành `:118` thì 3 dòng vá đẩy tiếp thành 121 ⇒ **sửa gốc = bỏ số dòng, neo TÊN SELECTOR**. [4] census "8/9 khoá" của lead THIẾU — §D gốc 25 mục, **3 ý đóng im lặng**, 1 trong 3 (`Đợt B — NỘI DUNG từng mục`) **0 hit ở cả `_mind` lẫn `_context`**. [5] con-trỏ verbatim `ca9208f` sai (thiếu 4.636 B) ⇒ lead vá **per-block**: `d081681` cho MIND-1, `727a512` cho 3 block S179, đối chứng từng cái resolve ra bản CHƯA nén. 🔸 **Bài đắt nhất:** *chẩn-đoán sai vẫn pass acceptance* — cả 2 MAJOR lọt vì acceptance đo **HÌNH-DẠNG chuỗi**, không đo **HÀNH-VI**. 🔴 #53 garble, resume vớt trọn; mảnh garble mang "a third thước defect" ⇒ lead biết có cái thứ 3 trước khi đọc verdict. Tag `[s179, C7, bat-loi-trong-ban-va, ba-cham-dung-hai-cham-regression, cut-c4-path-rac, moc-neo-tu-vo-hieu, acceptance-do-hinh-dang-khong-do-hanh-vi]`
- **S171 (2026-08-04) — 3 lane lens ĐỐI-KHÁNG (`/fable-clone reviewer` ×3), **cả 3 CHẾT hết-giới-hạn nhưng ĐĨA CỨU 74.070 B** `[LEAD HARVEST HOI-TO @S172 — no mo tu closeout truoc; owner slot (71) chot 'gom va sleep thi auto, tu quyet'. Nguon = artifact tren dia, KHONG suy dien]; nguồn `runs/2026-08-04-S171-khkk-ui-mirror-pe/sub-reviewer-lens-{feasibility,regression,fidelity}-s171.md` 26.461 + 24.432 + 23.177 B`:** **feasibility 8 ĐẠT / 6 BROKE** — mở đầu bằng **tự bác giả-thuyết của chính lane** (*'chỉ ghi 1 nhánh' = SAI; claim D-2 HELD, ≥9 chỗ ghi → thật 10*); bắt **trích-dẫn hỏng dạng nhẹ**: `WorkflowService.cs:552` **không trỏ vào cái gì cả** (call-site thật `:485`/`:554`, định-nghĩa ở file KHÁC) nhưng **nội dung claim vẫn HELD***cite sai ≠ claim sai*, phải tách. **regression 8 ĐẠT / 4 BROKE / 10 bỏ-sót** — phát hiện nặng nhất: **A-6 kiểm SAI KHOÁ ⇒ lỗ thủng NGAY TRONG hàng rào bảo-vệ R-4** (bắt `canPe`); R-4 HELD nhưng *lý-do bản invest đưa QUÁ THÔ*. **fidelity DỞ** (§6+§8 trống, `VERDICT=?`) — lead derive ≈12/6/3; bảng N-1→N-4 đối chiếu **từng claim bằng lệnh dán kèm**: N-1 tự phân loại 35 dòng ⇒ khớp 27/6/2 · N-2 khớp chính xác `:106/:125/:249` · **N-3 HELD về THỨ TỰ nhưng lệch con số hình-thức** (chỉ 3 hit `title="N.` vì Section 2 dùng template-literal đếm động, Section 4 là `<section>` trần) — 🔴 **chính bẫy này sau đó lead tự dẫm** (grep `'<Section title='` ra 0, suýt kết FAIL). ⇒ **Bài kép: lane dự báo đúng cái bẫy mà người viết bản sửa vẫn sa vào** — có thước đúng trong tay ≠ sẽ dùng thước đúng. Tag `[s171, 3-lane-doi-khang, dia-cuu-74070, cite-sai-khac-claim-sai, a6-sai-khoa-canPe, template-literal-dem-dong]`

View File

@ -0,0 +1,8 @@
# Reviewer memory — run S180 lane D (GĐ-5 / GĐ-6)
> Ghi ở thư mục ký-ức CỦA RUN (đã scaffold sẵn), KHÔNG ghi đè
> `.claude/agent-memory/reviewer/MEMORY.md` canonical — 6 lane reviewer chạy song song phiên này,
> canonical vừa bị sửa 14:34 ⇒ ghi thẳng vào đó là ca AS-10 fragment/clash. em-main gộp khi closeout.
- [Proxy-vị-từ làm thước mù](proxy_predicate_blind_measure.md) — máy chọn mẫu bằng HÌNH DẠNG đường dẫn, đổi đường spawn là mù câm mà vẫn in "0 lệch"
- [Claim xếp hạng cần hai mẫu số](ranking_claim_needs_two_denominators.md) — "gần xong nhất" chỉ đứng khi có ≥2 đại lượng CÙNG ĐƠN VỊ; N1 đưa 0

View File

@ -0,0 +1,19 @@
---
name: doctrine-line-undercounts
description: Câu doctrine tự khai trong mã ("Exit 0 always") KHÔNG phải phép đếm phạm vi — phải liệt từng máy + soi từng đường thoát, và ranh giới thật thường đã có sẵn trong comment
metadata:
type: feedback
---
Khi được giao đo *"phạm vi thật của doctrine X"*, **đừng đếm bằng câu doctrine**. Liệt **từng máy** rồi soi **từng đường thoát** của nó, và tách bạch 3 loại: exit≠0 **khi phát hiện lỗi** ⟂ exit≠0 **khi thiếu hạ tầng** ⟂ exit-0-luôn.
**Why:** S180 lane C. Đề bài (kế thừa N1 + lead) khẳng định *"SE chỉ có 2 máy fail-loud"*, dựa trên câu `governance-detectors.ps1:1962` *"Exit 0 always (never fails build)"*. Đo lại 17 máy cắm vào cửa lệnh thì ra **5 máy** trả exit≠0 khi phát hiện lỗi (`session-counter-tick` · `h24-signal-write` · `memory-archive-gate:325` · `session-scaffold` · `stamp_verify.py:51`), và `hmw.js`**4 chỗ throw** chứ không phải 1. Con số 2 làm bài toán trông như *"du nhập cơ chế lạ"*; con số 5 làm nó thành *"mở rộng ranh có sẵn"***đổi hẳn tập phương án trình cho owner**.
**How to apply:** ba bước, theo thứ tự.
1. Đếm mẫu số trước (`grep -ohE "scripts/[^ ]+\.(ps1|py)" .claude/commands/*.md | sort | uniq -c`), kèm control-dương để chứng thước có bắt.
2. Soi từng đường thoát; **phân biệt exit≠0-vì-thiếu-config với exit≠0-vì-tìm-thấy-lỗi** — trộn hai loại này là nguồn sai số chính.
3. 🔴 **Tìm ranh giới trong comment trước khi tự vẽ ranh.** Ca S180: `memory-archive-gate.ps1:323-325` đã viết sẵn *"Exit non-zero only on A7 integrity failure... Over-cap is a FLAG (not an error) - the gate reports, a human curates"* — tức **một máy, hai chế độ, ranh đã vẽ**. Ranh đó khớp 5/5 máy fail-loud: *sắp-GHI hoặc vị-từ-nhị-phân ⇒ chặn; phán-xét ⇒ cờ*. Đề xuất dựa trên ranh có sẵn rẻ hơn và khó bị bác hơn nhiều so với ranh tự nghĩ.
Kèm: chạy máy để lấy **số sống** làm đánh đổi định lượng (`governance-detectors.ps1``TOTAL FLAGS: 49` + `INFORM-ONLY: 21`, vẫn exit 0) — *"lật sang chế độ chặn hôm nay = 49 cờ chặn tức thì"* là con số quyết định, không phải lý luận.
Liên quan: [[refuse-coordinator-suggested-verdict]]

View File

@ -0,0 +1,16 @@
---
name: refuse-coordinator-suggested-verdict
description: Coordinator gợi sẵn kết luận ("đó có phải đúng bẫy này không?") vẫn phải đo rồi trả lời ngược nếu đo ra ngược — và ca ngược thường lộ ra khoản làm-MẠNH-HƠN
metadata:
type: feedback
---
Khi coordinator đưa **ca sống kèm kết luận gợi ý** (dạng *"đó có phải đúng bẫy X không?"*), đo tận nơi rồi trả lời theo số đo, **kể cả khi số đo bác lại gợi ý**. Gật theo là đúng anti-pattern Smart-Friend.
**Why:** S180 lane C. Coordinator trỏ `docs/HANDOFF.md:17` (anh nói `"5 -> OK"`, lead tự thu hẹp thành *"ghi-nhận, CHƯA phải lệnh đổi số"*) và hỏi có phải bẫy A1 của hub — *"đổ nhãn-của-đội vào cột lời-nguyên-văn"*. Mở tệp ra thì bảng có **đúng hai cột** `Nguyên văn | Lead thi-hành`; ô nguyên văn chứa đúng bốn ký tự anh gõ; phần diễn giải nằm ở cột kề bên **và đã tự khai bằng chữ đỏ** *"Diễn-giải của lead, không phải chữ của anh"*. ⇒ điều kiện của bẫy (ô nhiễm cột nguyên văn) **không thoả** — chấm theo thang 4 nhãn của hub thì đây là *suy-giảm-hợp-lệ*, không phải lỗi.
Giá trị thật nằm ở **chỗ đo ra ngược**: khuôn sổ của hub chỉ có 6 trường (mã · nguyên văn · thời điểm · trạng thái · số lần nhắc · con trỏ), **không có trường "đội hiểu thành gì"** ⇒ dựng sổ y khuôn hub thì đúng cái sai thật (lead tự thu hẹp phạm vi lệnh) **bốc hơi khỏi sổ**. Tức repo đang làm **mạnh hơn** spec — thành một khoản gửi ngược hub, thay vì một lỗi phải vá.
**How to apply:** ca gợi-ý-ngược ⇒ (1) trích **chữ định nghĩa** của bẫy và tách ra **cơ chế** của nó, (2) kiểm từng điều kiện của cơ chế trên ca thật, (3) nếu không thoả thì nói KHÔNG **và** hỏi tiếp *"vậy spec có bắt được ca này không?"* — câu hỏi thứ hai mới là chỗ ra phát hiện. Và vẫn phải chỉ ra **chỗ repo SẼ mắc** nếu thi công theo bản đồ hiện có (ở đây: đổ 61 tệp auto-memory — toàn nhãn do đội đúc — vào cột nguyên văn = mắc bẫy chính xác từng chi tiết).
Liên quan: [[doctrine-line-undercounts]]

View File

@ -0,0 +1,28 @@
---
name: proxy-predicate-blind-measure
description: Máy đo chọn mẫu bằng vị-từ HÌNH-DẠNG-ĐƯỜNG-DẪN sẽ mù câm khi hạ tầng đổi đường ghi, mà vẫn in "0 lệch" — phải hỏi PHỦ ĐƯỢC BAO NHIÊU, không chỉ hỏi CLAIM CÓ ĐÚNG
metadata:
type: feedback
---
Khi soi một máy đo (audit/detector/gate), đừng dừng ở "hằng-số của nó có đồng bộ không". Phải hỏi
thêm: **nó chọn mẫu bằng vị từ gì, và vị từ đó có còn đúng không?**
**Why:** S180 `scripts/spawn-model-audit.ps1:251-254` chọn phiên bằng
`Test-Path (subagents\workflows)` — một **đại-diện (proxy)** cho "phiên này có spawn". Khi lane đi qua
Agent/Task tool thay vì Workflow tool, bản ghi rơi **phẳng** vào `subagents/agent-*.jsonl`, vị từ trả
false, máy **im lặng tụt về phiên cũ hơn 26,5 giờ** rồi vẫn in `scope = CURRENT session only`
(`:262`), `0 mismatch`, `TOTAL FLAGS: 0`. Đo thật: **0/17 lane** của phiên hiện tại được nhìn, trong
đó có **168 bản ghi `claude-fable-5`** — đúng cái mô-hình-đắt mà máy sinh ra để canh.
Điểm đắt: các claim "0-mismatch" dựa trên nó **không bị chứng minh là SAI**, chúng **mất chỗ dựa**.
Đó là khác biệt giữa *"đã đo và bằng không"* với *"chưa đo gì"* — hai thứ in ra trông y hệt nhau.
**How to apply:**
- Với mỗi máy đo, đòi **mẫu số**: `n đơn vị đã đo / m đơn vị tồn tại`. Không in mẫu số = đèn xanh giả.
- Đòi **control cho vế DÂN SỐ**, không chỉ control cho vế so-sánh. Máy này có control chống grep ngây
thơ (khối A) nhưng **không có** control "mẫu có rỗng không".
- Nhãn tự-mô-tả (`CURRENT session only`) phải **kiểm được**, không được in vô điều kiện.
- Phản chứng bắt buộc khi vá: chạy trên phiên chỉ có lane phẳng ⇒ máy **phải** thấy, không được rơi
về phiên cũ.
- Liên hệ: [[ranking-claim-needs-two-denominators]] — cùng gốc bệnh "đếm-về-tổng".

View File

@ -0,0 +1,27 @@
---
name: ranking-claim-needs-two-denominators
description: Claim xếp hạng ("X gần xong nhất", "Y hổng nhất") chỉ đứng khi có ≥2 đại lượng CÙNG ĐƠN VỊ đem so — từng claim thành phần đúng hết vẫn không đẻ ra được thứ hạng
metadata:
type: feedback
---
Phân biệt hai loại claim khi review: **claim thành phần** ("máy X tồn tại, đo được 0-mismatch") và
**claim xếp hạng** ("GĐ-5 gần xong nhất"). Loại thứ hai cần bằng chứng **khác hẳn** loại thứ nhất.
**Why:** S180 — N1 tuyên *"GĐ-5 gần xong nhất"* dựa trên 5 gạch đầu dòng. Lane N2 verify **~60 phép
đo trên ~45 claim, không claim nào đổ**. Nhưng thứ hạng vẫn sai: đếm cùng thước (8 bước làm của thư
chính) ra **GĐ-5 = 5,33/8 (67 %)** so với **GĐ-2 = 5,56/8 (6975 %)** — GĐ-2 ≥ GĐ-5. Từng viên gạch
đúng, **phép cộng thành thứ hạng** thì sai. Đây là biến thể của *meta-count self-coverage blind-spot*:
đo tốt, đếm-về-tổng thì hỏng.
Hậu quả không dừng ở chữ nghĩa: nhãn "gần xong nhất" chảy vào `run.md` rồi đẻ ra đề xuất "W5 ghép W2",
vi phạm điều-kiện-vào của chính giai đoạn đó. **Nhãn lạc quan → xếp lịch sai.**
**How to apply:**
- Thấy chữ *nhất* / *hơn* / *~N %* ⇒ hỏi ngay **"trên mẫu số nào, và cái nó vượt có mẫu số không?"**
- Tách mẫu số **trước** khi tính tử số; dán bảng để người khác đếm lại được.
- Dùng **≥2 mẫu số độc lập** rồi kiểm hội tụ. S180: 3 mẫu số ra 6067 % ⇒ phép tách không bơm số.
Nếu hai mẫu số lệch nhau, hỏi **"đếm CÁI GÌ"** trước khi hỏi **"ai sai"**.
- Chia vai đúng: một lane kiểm *claim có đứng không*, một lane kiểm *phủ có đủ không*. Lane thứ hai
bắt được thứ lane thứ nhất **không thể** bắt.
- Liên hệ: [[proxy-predicate-blind-measure]].

View File

@ -138,3 +138,233 @@ Bốn việc, làm đúng thứ tự này. Việc 1 và 2 là bắt buộc để
**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.
---
## §3 — GĐ-1: bóc TỪNG KHOẢN (24 khoản) — trục nặng nhất
Hub đòi GĐ-1 ở bốn nơi, giống GĐ-0. Tôi liệt riêng từng nơi.
- Nơi 1 — thư chính `:133-140`**7 bước làm** (`G1-B1..B7`).
- Nơi 2 — phụ lục `:99-119`**5 mục sàn chức năng** (`G1-S(i)..S(v)`) trong đó mục (iii) tự nở thành **6 bước giao thức di trú** (`G1-M1..M6`).
- Nơi 3 — thư chính `:142-146`**2 lệnh "kiểm xong chưa"** (`G1-K1..K2`).
- Nơi 4 — phụ lục `:132-137`**6 ô nghiệm thu** (`G1-N1..N6`).
Tổng **24 khoản** (7 + 5 + 6 + 2 + 6, trừ đi 2 chỗ trùng khít giữa nơi 1 và nơi 2 mà tôi ghi rõ bên dưới).
### 3.1 — Bảy bước làm (thư chính `:133-140`)
| # | Hub đòi | SE | Bằng chứng |
|---|---|---|---|
| **G1-B1** | **Một văn bản chuẩn đặt tên duy nhất**, phủ đủ sáu nhóm tên, kèm **luật lane đơn trị** cho sổ | **THIẾU HẲN** — không có văn bản nào đóng vai chuẩn đặt tên | Ứng viên gần nhất là `docs/governance/vocab-alias-map.md`; phân tích ở §3.3 cho thấy nó **không phải** chuẩn. Ứng viên thứ hai là `docs/rules.md`, nhưng nó là quy ước viết mã (Clean Architecture · React · DB · Git), không phủ tên vai / thư mục lượt chạy / tệp mốc phiên. Ngoài ra §2.3 đã chứng minh **luật lane đơn trị đang VỠ ở đúng cuốn sổ liên lạc** |
| **G1-B2** | **Một vai giữ chuẩn**, quyền hẹp, chia hai lớp an toàn ⟂ nguy hiểm | **THIẾU** — không vai nào trong 26 vai mang nhiệm vụ này | `ls .claude/agents/*.md` = 26 tệp (bỏ `README.md`); không tệp nào có tên hay trục liên quan tới giữ chuẩn tên. Control dương: cùng thư mục có `ring1-audit`/`ring2-audit`/`ring4-audit` là các vai-kiểm chuyên trách, chứng minh SE **biết cách** dựng vai hẹp — nên đây là thiếu chứ không phải không làm được. 🔴 Việc lập vai mới **vượt khung**, phải hỏi anh |
| **G1-B3** | **Sổ đổi tên chỉ-thêm-không-xoá**, có cột *"đã quét những đâu"* ghi **đúng lệnh đã chạy và số hit thật** | **THIẾU** | `vocab-alias-map.md` có tính chất append-only và single-writer (`:6`) nhưng **không có cột "đã quét những đâu"** — 73 dòng, bảng thuộc tính chỉ gồm Canonical · Alias · lý do. Không có ô nào chứa lệnh đã chạy hay số hit |
| **G1-B4** | **Máy soi tên**, cắm vào cổng ở chế độ **báo-cáo-thôi trước** | **CÓ MỘT PHẦN, KHÔNG PHẢI MÁY SOI TÊN** | `scripts/governance-detectors.ps1` có kiểm **C3 vocab-fork** — nhưng nó soi **từ ngữ trong văn bản**, không soi **tên tệp/thư mục/vai**. Đây là hai việc khác nhau, và đây chính là chỗ dễ tuyên nhầm là "đã có". Chế độ báo-cáo-thôi thì SE đã có sẵn ở mức toàn cục (doctrine exit-0) |
| **G1-B5** | **Đối chứng hai chiều cộng phản chứng** trên khu thử, **chép cả hai kết quả vào báo cáo** | **KHÔNG ĐO ĐƯỢC — chưa có máy soi tên để đối chứng** | Vị từ thay thế theo `thư chính:146`: hai tệp đầu tiên (chuẩn + sổ đổi tên) tồn tại → cả hai **đều chưa tồn tại**, nên khai `chưa làm` chứ không phải `không đo được` |
| **G1-B6** | Ghi vào chuẩn: luật **giữ nguyên tên cũ** + **giao thức di trú sáu bước** | **THIẾU VĂN BẢN, NHƯNG TINH THẦN ĐÃ CÓ RẢI RÁC** | `vocab-alias-map.md:14-20` liệt 5 vùng **đóng băng tuyệt đối không viết lại** (`docs/changelog/sessions/**`, `docs/_archive/**`, `docs/governance/adap-reports/**`, `.claude/workflows/runs/**`, `broadcasts/**`) và `:22` giải thích *"không được sửa ngược quá khứ"*. Đây **đúng là** luật giữ-nguyên-tên-cũ của hub, chỉ chưa được gọi tên và chưa nằm trong một chuẩn |
| **G1-B7** | Khi đủ số phiên sạch **nhà bạn tự đặt**, siết máy soi sang chế độ lái mã thoát | **CHƯA TỚI LƯỢT** — phụ thuộc G1-B4. 🔴 Thêm nữa, việc siết bất kỳ máy nào sang lái mã thoát **đụng thẳng vào doctrine exit-0 của SE**, là xung đột đã được N1 xếp loại **vượt khung** | `scripts/governance-detectors.ps1` vùng `:1941+` |
### 3.2 — Năm mục sàn chức năng + sáu bước di trú (phụ lục `:99-119`)
| # | Mục | SE |
|---|---|---|
| **G1-S(i)** | Một văn bản chuẩn + luật lane đơn trị, **bỏ chữ "hoặc"** | **THIẾU** (trùng `G1-B1`) — và §2.3 là ca vỡ lane có thật, đo được |
| **G1-S(ii)** | Vai giữ chuẩn, hai lớp quyền | **THIẾU** (trùng `G1-B2`) |
| **G1-S(iii)** | Giao thức di trú sáu bước | **THIẾU** — bung thành `G1-M1..M6` bên dưới |
| **G1-S(iv)** | **Giữ nguyên tên cũ, tuyệt đối** | **ĐÃ CÓ VỀ THỰC CHẤT**`vocab-alias-map.md:14-22`; thiếu việc ghi thành luật trong một chuẩn |
| **G1-S(v)** | Máy soi tên ở cổng, **phân biệt rạch ròi con số lái mã thoát ⟂ con số chỉ để báo cáo** | **VẾ SAU ĐÃ CÓ, VẾ TRƯỚC CHƯA**`governance-detectors.ps1` đã tách `TOTAL``INFORM` (vùng `:65-72``:1941+`), đúng tinh thần hub. Nhưng chưa có máy soi **tên** |
| **G1-M1** | Ký chuẩn | chưa — không có chuẩn để ký |
| **G1-M2** | **Kiểm kê mọi chỗ máy đang đọc tên** — quét kịch bản, bài kiểm, tệp lệnh | **CHÍNH TÔI VỪA LÀM MỘT PHẦN, XEM §3.4** — nhưng chưa ai chép nó vào sổ nào |
| **G1-M3** | Cho bộ phân tích đọc được **cả tên cũ lẫn tên mới** trước đã | **CÓ MỘT TIỀN LỆ ĐÚNG SÁCH**`scripts/session_ctx.py:351-358` đếm **song song** hai họ `_pause-<i>.md` (khuôn hub, từ S148) và `pause-*.md` (cũ, tới S147), và tự ghi chú rằng dấu gạch dưới đứng đầu khiến hai phép đếm **không thể trùng nhau**. Đây là mẫu để nhân rộng |
| **G1-M4** | Tên mới chỉ áp **từ nay về sau** | tinh thần đã có (`G1-S(iv)`), chưa thành luật |
| **G1-M5** | **Đối chứng hai chiều + phản chứng** | chưa (trùng `G1-B5`) |
| **G1-M6** | Bật chế độ nghiêm sau **một số phiên sạch do nhà bạn đặt** | chưa (trùng `G1-B7`) |
### 3.3 — Trả lời dứt khoát: `vocab-alias-map.md` là **bảng dịch**, KHÔNG phải chuẩn duy nhất
Câu hỏi này phải trả lời rõ vì nếu trả lời sai theo chiều lạc quan thì SE sẽ khai `không áp dụng` cho GĐ-1, và cả gói sẽ đứng trên một nền không có thật.
Tệp tự nhận là *"nguồn duy nhất (single source)"* ngay ở dòng `:3`. Nhưng đọc tiếp chính dòng đó và dòng `:8` thì phạm vi tự thu hẹp lại:
- `:3` — mục đích là *"ghi lại các cặp thuật ngữ ĐỒNG NGHĨA … một khái niệm nhưng đang tồn tại dưới hai cái tên"*, phục vụ đợt rà trôi-nghĩa hằng tháng, để khi kiểm C3 giơ cờ thì người rà **tra xem đâu là từ chuẩn**.
- `:8`*"Chỉ ghi các cặp thật sự là MỘT khái niệm hai tên (fork-để-hợp-nhất). KHÔNG ghi các từ trùng-mặt-chữ nhưng khác nghĩa"*.
Nghĩa là nó **ghi lại các cặp đã lỡ sinh ra**, chứ **không quy định cách đặt tên mới**. Ba phép thử cho ra cùng một kết luận:
1. **Phép thử tiên đoán.** Đưa cho nó một vai mới chưa từng có tên: nó không nói được vai đó phải tên thế nào. Một chuẩn thì nói được.
2. **Phép thử phủ sóng.** Hub đòi chuẩn phủ **sáu nhóm tên**: tên vai · nhãn hiển thị các lớp kiểm · thư mục lượt chạy · tệp mốc phiên · nhãn tác vụ · tên các cuốn sổ. `vocab-alias-map.md` không có mục nào cho bất kỳ nhóm nào trong sáu nhóm đó; nó có các mục theo **cặp từ**, ví dụ mục 1 là `run-trace``wave-folder`.
3. **Phép thử hướng.** Chuẩn nhìn **về phía trước** (tên sau này phải thế nào). Bảng dịch nhìn **về phía sau** (tên cũ ứng với tên nào). `vocab-alias-map.md:14-22` dành hẳn một khối để nói vì sao tên cũ **phải còn mãi** — đó là ngôn ngữ của bảng dịch.
**Kết luận:** `vocab-alias-map.md` là một **bảng dịch tốt** và là **vật liệu đầu vào quý** cho chuẩn (nó đã giải quyết sẵn mục (iv) giữ-nguyên-tên-cũ và đã có kỷ luật một-người-ghi). Nhưng nó **không phải** chuẩn duy nhất mà GĐ-1 đòi. **SE KHÔNG khai `không áp dụng` cho GĐ-1 được.**
### 3.4 — Đếm họ tên đang cùng sống, và kiểm kê đoạn máy đang đọc tên
Đây là phép đo của khoản `G1-M2`, và cũng là thứ quyết định TC-11 (*"không được rớt bất kỳ đoạn máy nào đang đọc tên cũ"*).
**Tám nhóm tên, mười chín họ, sáu nhóm đang đa họ.**
| # | Nhóm tên | Số họ đang sống | Đo bằng gì |
|---|---|---|---|
| 1 | **Tên vai** | **1**`kebab-case` | `.claude/agents/*.md` bỏ README = **26** · `.claude/agent-memory/*/` = **26** · `hmw.js` `VALID_ROLES` = **26**. Đối chiếu hai chiều bằng `comm`: **rỗng cả hai phía** ⇒ ba nguồn khớp tuyệt đối. 🟢 Đây là nhóm **sạch nhất**, và là bằng chứng SE giữ được đơn trị khi có máy chặn |
| 2 | **Tên lệnh** | **1** hình thức (`kebab-case`), có **1 ngoại lệ ngôn ngữ** | `ls .claude/commands/` = **19**; 18 tên tiếng Anh, riêng `tiep.md` tiếng Việt. Không phải lỗi, nhưng chuẩn phải nói rõ ngoại lệ này là cố ý |
| 3 | **Thư mục lượt chạy** | **2** | `ls -d .claude/workflows/runs/*/` = **88**. Khớp `YYYY-MM-DD-S<n>-<slug>` = **70**; không khớp = **18**, tất cả theo họ `YYYY-MM-DD-<chủ-đề>` (`2026-06-18-h10-implement`, `2026-06-18-harness-audit-invest`, `2026-06-18-mig54-pe-review`, `2026-07-11-h21-mtv3-adopt`, `2026-07-13-pe-negative-quote`, …) |
| 4 | **Nhãn tác vụ (tệp con trong lượt chạy)** | **≥3** | Tổng `.md` trong `runs/*/` = **706**. Bắt đầu bằng `sub-` = **402**. Không phải `sub-` và không phải `run.md` = **219**, gồm ít nhất ba kiểu: `<x>-synthesis.md`, `<x>-return.md`, và tên tự do (`C14-disposition-per-khoan.md`, `W0-evidence-15-07-2026.md`, `cicd-verify-<mã>.md`) |
| 5 | **Nhật ký phiên** | **5** | `ls docs/changelog/sessions/` = **159**. (a) `YYYY-MM-DD-HHMM-S<n>-` = **19** · (b) `YYYY-MM-DD-S<n>-` = **78** · (c) `YYYY-MM-DD-s<n>-` chữ `s` **thường** = **13** · (d) `YYYY-MM-DD-HHMM-<slug>` **không có số phiên** = **45** · (e) `YYYY-MM-DD-<slug>` trần = **4**. Tổng cộng 19+78+13+45+4 = 159 ✅ — nhưng tôi phải trừ tay một trùng: `2026-06-11-S57bis-…` rơi vào cả (b) lẫn phép lọc (e) vì hậu tố `bis`, nên bảng thô cộng ra 160 và tôi đã đối chiếu lại để chốt 159 |
| 6 | **Tệp mốc phiên** | **2** | `scripts/session_ctx.py:351-358` khai thẳng: khuôn hub `_pause-<i>.md` (từ S148) và họ cũ `pause-*.md` (tới S147) **cùng sống**, đếm tách. Cùng thư mục còn `_mind-s-<N>.md`, `_context-s-<N>.md`, `_snapshot-<k>.md`, `_tiep-<i>.md` |
| 7 | **Kịch bản** | **3** | `ls scripts/` = **53** mục. `kebab-case` = **45** · `snake_case` (toàn bộ là `.py`) = **5** · có tiền tố phiên hoặc kế hoạch (`s59-`, `s85-`, `s89-`, `s91-`, `plan-b-`, `plan-ca-`, `plan-t5-`, …) = **16** (giao với hai nhóm trên). 🔴 Ca đắt nhất nằm ngay đây: **`scripts/session-scaffold.ps1``scripts/session_scaffold.py` là cùng một khái niệm, hai tên, hai quy ước** — đúng định nghĩa fork mà nhóm 1 đã tránh được |
| 8 | **Tên cuốn sổ** | **2** | `docs/governance/` có họ HOA-GẠCH (`BROADCAST-OUT-SOLUTION-ERP-2026-05-29.md`, `RAG-AUDIT-RESPONSE-2026-05-29.md`) và họ kebab thường (`vocab-alias-map.md`, `error-ledger.md`, `harness-11-engine.md`, `fable-real-runbook.md`, `session-model-se-draft.md`, `ctx-soft-memory-se-draft.md`). Cộng thêm ca `_index``COMMS-LEDGER` ở §2.3 |
**Một hệ quả phải nói ra, vì nó là bằng chứng cứng nhất rằng SE chưa có chuẩn:** `CLAUDE.md` ở gốc kho ghi quy ước nhật ký phiên là `docs/changelog/sessions/YYYY-MM-DD-HHMM-{topic}.md`. Đối chiếu với nhóm 5: nếu đọc chặt, quy ước đó chỉ khớp họ (d) = **45/159**; nếu đọc rộng (coi `S<n>` là một phần của `{topic}`) thì khớp họ (a) và (d) = **64/159**. Cả hai cách đọc đều cho ra: **quy ước duy nhất đang được ghi thành văn trong kho khớp với chưa tới một nửa số tệp thật**, và **họ đông nhất (b, 78 tệp) thì không khớp cách nào**. Văn bản nói một đằng, đĩa làm một nẻo, và không ai bị chặn.
**Mười một đoạn máy đang đọc tên — rớt một đoạn là vỡ.** Tôi quét kịch bản, tệp lệnh và hook bằng mẫu tìm tên tệp/thư mục; danh sách dưới đây là **từng tệp một**, không nén thành khoảng.
| # | Đoạn máy | Đọc tên gì | Hậu quả nếu đổi tên mà quên nó |
|---|---|---|---|
| 1 | `.claude/workflows/hmw.js:22-55` `VALID_ROLES` | 26 tên vai, dạng chuỗi cứng | `:173-185` khai rõ: vai ngoài danh sách = **DỪNG HẲN, không fail mềm**. Đổi tên vai mà quên đây thì **fan-out chết ngay tại chỗ** — may là nó ồn ào, không im lặng |
| 2 | `scripts/governance-detectors.ps1:1102` | `^(sub-.+|.+-return)\.md$` | Tệp con đặt tên khác hai họ này **biến mất khỏi tầm quét**, im lặng |
| 3 | `scripts/governance-detectors.ps1:1105-1106` | suy vai từ tên tệp, ba nấc tham lam: `^sub-(.+)-\d+\.md$` rồi `^sub-(.+)\.md$` | Suy sai vai ⇒ vai bị coi là **chưa từng chạy** ⇒ cờ sai. Chính tệp tự ghi ở `:1068` rằng đây là lớp lỗi đã gặp từ S122 |
| 4 | `scripts/governance-detectors.ps1:1679` | tên tệp phải **chứa** `lead-stale`, `lead-gap`, hoặc `ring2-audit` | Đổi tên ba vai đó ⇒ luật khuôn-cờ **ngừng áp** mà cổng vẫn xanh |
| 5 | `scripts/governance-detectors.ps1:1716` | `sub-h24-audit-*.md` | như trên |
| 6 | `scripts/governance-detectors.ps1:1050` | đường dẫn `docs/changelog/sessions/` | Đổi chỗ nhật ký phiên ⇒ phép kiểm đóng phiên mất một chân |
| 7 | `scripts/governance-detectors.ps1:1605,1633` | `.claude/sessions/session-<N>/_context-s-<N>.md` | Đây đúng loại tệp mà hub gọi là **máy neo đường dẫn cố định** (`phu-luc:119`) — chuẩn phải ghi rõ loại này **giữ tên, để thời điểm sống trong tiêu đề bên trong** |
| 8 | `scripts/session_ctx.py:110,133,351-358,530` | `_snapshot-*`, `session-{N}`, `_pause-*``pause-*`, `_context-s-%d.md` | Đã xử lý đúng sách (đọc được cả hai họ). Nhưng nó **phụ thuộc vào dấu gạch dưới đứng đầu** để không đếm trùng — đổi quy ước tiền tố là hỏng thầm |
| 9 | `scripts/session-scaffold.ps1` **và** `scripts/session_scaffold.py` | sinh ra tên tệp mốc phiên | Hai bản, hai quy ước tên — sửa một bản quên bản kia là đẻ ra họ thứ ba |
| 10 | `scripts/closeout-sentinel.ps1` · `scripts/mfe-eval.ps1` · `scripts/applied-eval-nokey.ps1` · `scripts/crystallized-backfill.ps1` · `scripts/memory-selfimprove-audit.ps1` | đều lọt lưới quét mẫu-tên (đã liệt từng tệp, không gộp) | **CHƯA ĐO chi tiết từng dòng** — cần chạy `grep -nE "sub-\|_mind\|_context\|session-\|runs" <từng tệp>` để lấy đúng số dòng. Tôi khai thiếu chứ không đoán |
| 11 | `.claude/hooks/wal-flush.ps1` | bản thân nó **được neo bằng tên** trong `.claude/settings.json` (`hooks.Stop``powershell.exe … -File .claude/hooks/wal-flush.ps1`) | Đổi tên tệp hook mà quên sửa cấu hình ⇒ **hook im lặng không chạy**, và không có gì báo |
**Thêm một đoạn máy nữa, từ lane D, cùng gốc bệnh:** `scripts/spawn-model-audit.ps1` chọn phiên bằng vị từ `Test-Path subagents\workflows`. Đó là **một vị từ dựa trên tên đường dẫn**, nên nó thuộc đúng nhóm này: phiên nào sinh vai bằng công cụ Task sẽ không có thư mục ấy, máy **mù trọn phiên** mà vẫn in `TOTAL FLAGS: 0`. Hai chỗ chung một gốc: **lấy sự tồn tại của một cái tên làm bằng chứng cho sự tồn tại của một sự kiện.** Chuẩn đặt tên nếu viết đúng phải cấm hẳn lối suy này, và máy soi tên phải in kèm mẫu số để "không hit" không bị đọc thành "sạch".
### 3.5 — Hai lệnh kiểm và sáu ô nghiệm thu của GĐ-1
| # | Khoản | SE |
|---|---|---|
| **G1-K1** | `test -f <chuẩn> && test -f <sổ đổi tên> && echo OK` | **TRƯỢT** — cả hai tệp đều chưa tồn tại |
| **G1-K2** | `<máy soi tên>; echo exit=$?` phải bằng 0 **và in kèm mẫu số mỗi luật** | **KHÔNG ĐO ĐƯỢC** — chưa có máy soi tên. Vị từ thay thế của hub là sự tồn tại của hai tệp đầu, và hai tệp đó cũng chưa có, nên khai `chưa làm` |
| **G1-N1** | Văn bản chuẩn tồn tại, phủ **sáu nhóm tên**, có luật lane đơn trị | trượt |
| **G1-N2** | Vai giữ chuẩn tồn tại, quyền mô tả theo hai lớp | trượt |
| **G1-N3** | Sổ đổi tên tồn tại, chỉ-thêm-không-xoá, có cột *"đã quét những đâu"* | trượt — `vocab-alias-map.md` đạt vế append-only, thiếu vế cột |
| **G1-N4** | Máy soi tên chạy được, mã thoát 0, **in kèm mẫu số** | trượt |
| **G1-N5** | Đối chứng hai chiều đạt; **phản chứng làm máy báo** | trượt |
| **G1-N6** | Luật giữ-nguyên-tên-cũ **được ghi thành văn** | **ĐẠT VỀ NỘI DUNG**`vocab-alias-map.md:14-22`; chưa đạt về chỗ đặt (phải nằm trong chuẩn) |
**Tổng kết GĐ-1:** 24 khoản. **ĐÃ CÓ 3** (`G1-S(iv)`/`G1-N6` luật giữ tên cũ · vế tách số-lái-mã-thoát của `G1-S(v)` · tiền lệ đọc-hai-họ `G1-M3`). **THIẾU 20**. **NGƯỢC 1** — xem ngay dưới.
🔴 **Khoản NGƯỢC duy nhất của cả hai giai đoạn: `G1-B7`.** Hub bảo *"siết máy soi tên sang chế độ lái mã thoát"* sau vài phiên sạch. SE có doctrine **luôn trả mã thoát 0**`scripts/governance-detectors.ps1` (vùng `:1941+`, N1 ghi nhận câu tự khai *"Exit 0 always"*). Đây không phải SE làm sai — đây là **hai triết lý cổng khác nhau**, và N1 đã xếp nó là xung đột **vượt khung** duy nhất của cả gói. Với riêng GĐ-1, hệ quả là: SE làm được `G1-B4` (máy soi ở chế độ báo-cáo-thôi) nhưng **không được tự quyết** `G1-B7`. Đề nghị khai `G1-B7`**hoãn, điều kiện gỡ = anh và AI_INFRA chốt triết lý cổng** — chứ không khai `đã áp`.
---
## §4 — Bẫy hub đã giẫm ở GĐ-0/GĐ-1: SE có nguy cơ giẫm lại không?
Trả lời từng bẫy, có bằng chứng, không gộp. Ba bẫy GĐ-0 (`phu-luc:80-82`) và sáu bẫy GĐ-1 (`phu-luc:123-128`).
### Bẫy GĐ-0
| Bẫy | Nguy cơ ở SE | Căn cứ |
|---|---|---|
| **Nhận mà không ghi đĩa ngay** | 🟢 **THẤP** | Bốn món đã trên đĩa và băm đã khớp 4/4. SE làm đúng bẫy này |
| **Ghi đĩa mà quên tệp theo dõi** | 🔴 **CAO — đang giẫm ngay lúc này** | `A0-2` thiếu (§1.3). Tiến độ gói đang được theo dõi trong `run.md` của một lượt chạy, mà lượt chạy thì kết thúc theo phiên |
| **Bỏ trống dòng nào đó của bản đồ áp dụng** | 🟡 **TRUNG BÌNH — biến thể khác** | Bảy dòng đều có chữ, không dòng nào trống. Nhưng ba dòng **trộn hai quyết định vào một ô** (§5), mà hub nói dòng đọc-không-ra-quyết-định thì lượt kiểm buộc phải xử như quên |
### Bẫy GĐ-1
| Bẫy | Nguy cơ ở SE | Căn cứ |
|---|---|---|
| **Bẫy 1 — bom hẹn giờ theo NGÀY** | 🔴 **CAO** | Đây là bẫy nguy hiểm nhất cho SE, vì nó khớp chính xác hình dạng của nhóm 5. Nếu chuẩn viết *"nhật ký phiên từ nay đặt theo `YYYY-MM-DD-HHMM-S<n>-<slug>`"* rồi ai đó viết một bài kiểm khẳng định "kho sạch", bài kiểm sẽ **xanh hôm nay và đỏ vào ngày quy ước có hiệu lực** mà không ai chạm vào mã. Vá theo hub: tập giá trị hợp lệ phải chứa **cả năm họ đang sống**, và bài kiểm chạy trên đồ gá cô lập, **không khẳng định trên cây tệp sống** |
| **Bẫy 2 — cổng là khoá duy nhất thì cấm khoá ngầm** | 🟡 **TRUNG BÌNH** | SE có tiền lệ tốt: `governance-detectors.ps1` đã tách phần lái mã thoát khỏi phần chỉ báo cáo. Nhưng nếu cắm thêm máy soi tên vào cùng cổng đóng phiên thì rủi ro một lượt dò hỏng nuốt mất kết luận chính là có thật |
| **Bẫy 3 — bài kiểm vá đè lên chính đối tượng đang kiểm** | 🟡 **TRUNG BÌNH** | Chưa có bài kiểm nào để mà vá đè. Cần nêu trước để lượt thi công không tự cấp tín chỉ |
| **Bẫy 4 — máy soi trả không-hit trên kho toàn tên cũ được miễn trừ thì KHÔNG chứng minh máy còn sống** | 🔴 **RẤT CAO — SE là ca sách giáo khoa** | Theo `G1-S(iv)`, **năm vùng đóng băng** được miễn trừ vĩnh viễn, và ba trong năm vùng đó (`sessions/`, `runs/`, `broadcasts/`) chính là nơi chứa **phần lớn** tên đang lệch. Một máy soi tên áp về-phía-trước sẽ trả "không hit" ngay ngày đầu **vì gần như mọi thứ đều được miễn**, và con số 0 đó **không chứng minh gì cả**. Bắt buộc: đối chứng trên khu thử, và in mẫu số |
| **Bẫy 5 — mẫu số quá nhỏ làm "không hit" gần như vô nghĩa** | 🔴 **RẤT CAO** — hệ quả trực tiếp của bẫy 4 | Luật áp về-phía-trước nghĩa là ngày đầu mẫu số bằng 0 hoặc gần 0. **Mọi con số hit phải in kèm mẫu số**, không có ngoại lệ |
| **Bẫy 6 — số bài kiểm đo giữa chừng không phải kết luận cổng** | 🟡 **TRUNG BÌNH** | Phiên này có sáu lane cùng ghi vào một thư mục lượt chạy. Bất kỳ con số nào đếm tệp trong `runs/2026-08-07-S180-…/` **đo ở giữa** đều là con số của một trạng thái không tồn tại. Tôi tự áp luật này: mọi con số trong tệp lane này đều đo trên vùng **ngoài** thư mục lượt chạy, trừ ô `G0-B6`/`G0-K1` mà tôi đã ghi rõ là đang trỏ vào tệp điều tra |
---
## §5 — Ô fit-map đúng cho GĐ-0 và GĐ-1
N2 bắt lỗi F-03: ba trên bảy ô quyết định đang **trộn giá trị**, trong khi Phần A (`khuon-…:31`) bắt *"mỗi dòng chọn **một** trong ba"*. Tôi kiểm lại bảng ở `sub-invest-fitmap-S180.md:222-228` và xác nhận **ba ô trộn nằm ở GĐ-3, GĐ-4, GĐ-5** — cụ thể `:225` *"áp dụng MỘT PHẦN — phần cổng-mã-lỗi HOÃN"*, `:226` *"áp dụng — sổ TRƯỚC, chấm điểm CHỜ ANH GẬT wire"*, `:227` *"áp dụng phần THIẾU nhỏ; phần lõi khai đã có tương đương"*. **Hai ô thuộc lane tôi thì không nằm trong ba ô đó** — nhưng cả hai vẫn cần chỉnh, vì lý do khác.
### GĐ-0 → **`áp dụng`**
Đây là giá trị đúng, và nó là giá trị **duy nhất khả dĩ**: `không áp dụng` đòi lý do kiểm được về một cơ chế tương đương, mà §1 cho thấy chín khoản đang thiếu; `hoãn` thì vô nghĩa vì GĐ-0 là điều kiện tồn tại của mọi phép kiểm về sau, hoãn nó là hoãn cả gói.
Ô hiện tại ở `:222` ghi `**áp dụng**`**đã đúng**. Cần chỉnh một chỗ: phần chữ *"đang làm dở phiên này; còn: dòng đã-nhận `_index`, fit-map file rời, tệp theo dõi A0..A16, adap-report"* liệt **bốn** việc còn nợ, trong khi §1 đếm được **chín** khoản thiếu và **ba** khoản sai khuôn. Chưa kể `A0..A16` viết dưới dạng khoảng, đúng cái mà khoản A12 cấm (*"liệt kê từng mục, cấm nén thành khoảng"*). Đề nghị: giữ nguyên ô quyết định, **viết lại ô lý do thành danh sách từng khoản**.
### GĐ-1 → **`áp dụng`**
Ô hiện tại ở `:223` ghi `**áp dụng** (tailored)`. **Giá trị đúng, nhưng ô cần làm sạch.**
- **Vì sao là `áp dụng` chứ không phải `không áp dụng`:** §3.3 đã chứng minh `vocab-alias-map.md` là bảng dịch. Khai `không áp dụng` đòi *"lý do kiểm được"* — mà lý do khả dĩ duy nhất ("nhà tôi đã có chuẩn riêng, tệp ở đây, máy soi ở kia") thì SE **không dán được đường dẫn nào vào cả hai chỗ trống**. Khai `không áp dụng` ở đây là khai sai.
- **Vì sao không phải `hoãn`:** `hoãn` đòi điều kiện gỡ *"có thể xảy ra và nhận biết được"*. Việc dựng chuẩn không chờ ai — nó chỉ chờ chính SE viết. Không có điều kiện gỡ nào thật cả.
- **Chỉnh hình thức:** bỏ chữ `(tailored)` khỏi **ô quyết định**, đẩy sang ô lý do. Ô quyết định phải đọc được bằng máy và bằng mắt là **đúng một trong ba chữ**. Việc may đo theo nhà mình là mặc định của cả gói (`phu-luc:26`), nói lại trong ô quyết định vừa thừa vừa tạo ra giá trị thứ tư trên thực tế.
- **Chỉnh nội dung:** ô lý do hiện ghi *"vai-giữ-chuẩn = chờ anh (VƯỢT-KHUNG (d))"*. Đúng, và nên tách rõ thành **hai khoản vượt khung riêng biệt**, vì chúng cần hai quyết định khác nhau của anh: (a) `G1-B2` lập **vai giữ chuẩn** — thêm vai thứ 27 vào bộ máy; (b) `G1-B7` siết máy soi sang **lái mã thoát** — đụng doctrine exit-0. Gộp hai cái vào một dấu ngoặc là để anh phải đoán mình đang duyệt cái nào.
> **Về đường thoát "nấc *đã đồng ý*":** không cần dùng ở lane này. Đường thoát đó hợp cho GĐ-3/4/5 nơi SE thật sự chỉ adopt một phần. Với GĐ-0 và GĐ-1 thì SE adopt **trọn sàn chức năng**; hai khoản vượt khung không làm giảm phạm vi adopt, chúng chỉ **chặn nấc** ở `đã thi công` cho tới khi anh chốt. Ghi chúng vào cột lý do là đủ, không cần đổi giá trị ô quyết định.
---
## §6 — Chặn wave đầu: điều gì phải xong trước
Anh đã chốt OD-2: đi **đúng thứ tự GĐ-0 → GĐ-6, cấm nhảy cóc**. Vậy wave đầu tiên **là GĐ-0**, và câu hỏi thật là: GĐ-0 xong thì GĐ-1 có chạy được không, và GĐ-1 có chặn phần còn lại không.
**Trả lời ngắn: GĐ-1 KHÔNG chặn GĐ-2 tới GĐ-5 nếu nó đạt nấc *đã thi công*; nhưng SE KHÔNG được phép khai `không áp dụng` để đi vòng.** Luật điều kiện vào (`thu-chinh:101`) cho hai đường: giai đoạn trước ở nấc *đã thi công*, **hoặc** khai `không áp dụng` kèm lý do tương đương kiểm được. §3.3 đã đóng đường thứ hai. Nên SE **bắt buộc phải thi công GĐ-1** — đó chính là nghĩa của "chốt mở khoá".
**Bốn việc phải xong trước khi wave đầu tiên (GĐ-0) được coi là đóng:**
1. **Chọn một chỗ ghi cho thư phát đại trà** rồi sửa `broadcasts/_index.md:7` cho khớp thực tế — §2.5 việc 1. Đây phải là việc **đầu tiên**, vì việc 2 phụ thuộc nó.
2. **Bù đủ 24 dòng "đã nhận"**, mỗi dòng kèm ngày và mã băm; riêng bốn món dùng kết quả `scripts/stamp_verify.py` để đóng luôn vế ghi-lại-băm của `G0-B2`.
3. **Dựng tệp theo dõi 20 khoản** (`A0-1 · A0-2 · A0-3 · A0-4 · A1 · A2 · A3 · A4 · A5 · A6 · A7 · A8 · A9 · A10 · A11 · A12 · A13 · A14 · A15 · A16`) ở một chỗ sống lâu hơn phiên — **không** để trong thư mục lượt chạy.
4. **Tách bảng bảy dòng ra một tệp bản đồ riêng**, làm sạch ô quyết định theo §5, để lệnh `grep -c '^| GĐ-[0-6]'` chạy được trên đúng tệp của nó chứ không phải trên tệp điều tra 48 KB.
**Việc thứ năm, nằm ngoài wave nhưng phải bắt đầu ngay vì nó cần anh:** hai khoản vượt khung của GĐ-1 (`G1-B2` vai giữ chuẩn · `G1-B7` siết cổng). Nếu hỏi anh ở cuối wave GĐ-1 thì wave đó **treo**; hỏi ngay từ wave GĐ-0 thì tới lúc thi công GĐ-1 đã có câu trả lời. Đây là thứ duy nhất trong lane này có thể làm **song song** mà không vi phạm OD-2, vì hỏi không phải là thi công.
**Một cảnh báo về thứ tự bên trong GĐ-1:** hub xếp bước kiểm kê máy đọc tên (`G1-M2`) ở **bước 2** của giao thức di trú, tức là **sau khi ký chuẩn**. Với SE thì phải làm **ngược lại** — §3.4 cho thấy có ít nhất mười một đoạn máy đang đọc tên, và ba trong số đó suy vai từ tên tệp bằng biểu thức tham lam. Viết chuẩn mà chưa biết máy nào đang đọc gì thì sẽ viết ra một chuẩn **không thể áp mà không làm vỡ thứ gì đó**. Kiểm kê trước, ký chuẩn sau. Đây là chỗ SE nên **làm khác hub và khai rõ là làm khác** ở mục 6 của khuôn báo cáo.
---
## §7 — Khai thẳng những chỗ tôi CHƯA ĐO
Theo luật bằng chứng của gói, tôi liệt từng chỗ chứ không im lặng.
1. **Năm kịch bản ở dòng 10 của bảng §3.4** (`closeout-sentinel.ps1` · `mfe-eval.ps1` · `applied-eval-nokey.ps1` · `crystallized-backfill.ps1` · `memory-selfimprove-audit.ps1`) — mới biết chúng **có** đọc mẫu tên, **chưa** biết đọc mẫu nào ở dòng nào. Cần: `grep -nE "sub-|_mind|_context|session-|runs/|agent-memory" scripts/<từng-tệp>`.
2. **Nhóm tên thứ hai của hub — "nhãn hiển thị các lớp kiểm"** — tôi **chưa đo**. Ứng viên là tập lớp cờ đóng ở `.claude/agent-memory/memory-budget.json` khoá `lead_self_audit.flag_classes`, mà `hmw.js:36-40` mô tả là **11 lớp, vai không tự chế lớp**. Cần đọc thẳng tệp cấu hình để đếm họ tên thật.
3. **`docs/rules.md`** — tôi loại nó khỏi ứng viên "chuẩn đặt tên" dựa trên mô tả phạm vi, **chưa đọc toàn văn**. Nếu trong đó có một mục đặt tên mà tôi bỏ sót thì kết luận `G1-B1` phải sửa. Cần: `grep -nE "đặt tên|naming|quy ước tên" docs/rules.md`.
4. **Sáu mươi chín tệp trong hộp thư — tôi đối chiếu bằng cách tìm tên tệp trong sổ.** Phép này bắt được vắng mặt, nhưng **không** bắt được dòng có mà sai (ví dụ ngày sai, mã băm sai). Số 24 là **cận dưới** của lỗ, không phải con số cuối cùng.
5. **Tôi không chạy lại phép băm bốn món.** Tôi dùng lại kết quả của N1 ở `sub-invest-fitmap-S180.md:32`. Nếu N1 sai thì tôi sai theo. Lệnh tái lập đã dán ở `G0-K3` để ai cũng kiểm lại được.
---
## §8 — Hai khoản CHƯA ĐO ở §7 nay đã đo xong, và một trong hai đẻ ra lỗi mới
### 8.1 — Khoản §7.3: `docs/rules.md` — kết luận `G1-B1` **giữ nguyên**, nay có bằng chứng thay vì suy đoán
`grep -nE "đặt tên|naming|quy ước tên|Naming" docs/rules.md` ra **bốn** vị trí, và cả bốn đều là quy ước **đặt tên trong mã nguồn**:
- `:47` — cách đặt tên lệnh (CQRS `Command`)
- `:56` — cách đặt tên truy vấn (CQRS `Query`)
- `:165` — §3.7 cách đặt tên thành phần React
- `:203` — cách đặt tên bản chuyển đổi cơ sở dữ liệu (PascalCase, ví dụ `AddMasterData`)
Control dương cho chính phép tìm: `grep -c '^##' docs/rules.md` = **70** đề mục ⇒ tệp đọc được và lớn thật, bốn hit là bốn hit thật chứ không phải lệnh hỏng.
**Không vị trí nào chạm vào sáu nhóm tên hub đòi** (tên vai · nhãn hiển thị các lớp kiểm · thư mục lượt chạy · tệp mốc phiên · nhãn tác vụ · tên các cuốn sổ). Vậy `docs/rules.md` phủ **tầng mã nguồn**, còn GĐ-1 đòi **tầng bộ máy vận hành** — hai tầng rời nhau. Kết luận `G1-B1` **THIẾU HẲN** đứng vững, và nay đứng trên phép đo chứ không trên phỏng đoán.
🔸 Một hệ quả có ích cho lượt thi công: `docs/rules.md`**tiền lệ về hình thức** — SE đã biết viết quy ước đặt tên thành văn, chỉ là chưa làm cho tầng bộ máy. Chuẩn của GĐ-1 nên nói rõ ngay dòng đầu rằng nó **không thay** `docs/rules.md`**bổ sung tầng còn thiếu**, nếu không thì lại đẻ ra đúng cái "hai chỗ tìm" mà mục (i) cấm.
### 8.2 — Khoản §7.2: nhãn hiển thị các lớp kiểm — **đo xong, và bắt được một con số đã trôi**
Đọc thẳng `.claude/agent-memory/memory-budget.json`, khoá `lead_self_audit.flag_classes`. Kết quả: **12 lớp**, liệt từng lớp, không nén thành khoảng:
`view-stale-count` · `view-stale-status` · `view-stale-header` · `view-stale-role-desc` · `view-residual-asym` · `gap-carry-dropped` · `gap-carry-aged` · `gap-owner-specifics` · `gap-decision-sunk` · `gap-underfill` · `gap-incident-unrecorded` · `view-claim-broader-than-sample`
🔴 **Lỗi mới, đo được, mức TRUNG BÌNH:** `.claude/workflows/hmw.js` (khối chú thích ngay dưới mục `lead-stale-auditor` / `lead-gap-auditor`, vùng dòng 36-40) viết nguyên văn *"**11 class**: 5 view-\* + 6 gap-\*"*. Thực tế trên đĩa là **12 lớp = 6 `view-*` + 6 `gap-*`**. Lớp thứ mười hai là `view-claim-broader-than-sample`, và nó được **thêm vào cuối mảng**, ngoài cụm `view-*` đang đứng liền nhau — nên người đọc lướt sẽ đếm ra 5 và tưởng chú thích đúng.
Đây đúng **LỚP-5** mà hub đặt tên (*"số chép tay trong văn xuôi trôi … một đại lượng = một con số, neo LỆNH thay vì chép số"*), và cũng đúng luật mà SE đã tự rút ra từ trước là **cấm chép số đếm vào chú thích**. Ba điểm đáng nói:
1. **Chú thích đó tự nhận là mô tả một tập ĐÓNG** (*"vai KHÔNG tự chế class"*). Một tập đóng mà bản mô tả sai số phần tử thì người đọc không có cách nào biết mình đang thiếu lớp nào.
2. **Không máy nào bắt được cái này** — con số nằm trong chú thích, không nằm trong mã chạy, nên chương trình vẫn chạy đúng với 12 lớp thật.
3. **Nó thuộc đúng lăng kính lane này:** đây là **nhóm tên thứ hai trong sáu nhóm hub đòi**, và ngay bên trong nhóm ấy đã có **ba họ con**`view-stale-*` (4 lớp) · `view-residual-*` (1) · `view-claim-*` (1) — cộng với `gap-*` (6). Nghĩa là con số họ tên ở §3.4 phải cộng thêm nhóm này.
**Cập nhật §3.4:** nhóm tên thứ 2 của hub (nhãn hiển thị các lớp kiểm) có **2 họ chính** (`view-*``gap-*`) và **4 họ con** nếu tính tới nấc thứ hai. Vậy bảng tám nhóm ở §3.4 nay thành **chín nhóm**, tổng họ tăng từ 19 lên **21**, và số nhóm đang đa họ tăng từ 6 lên **7**.
**Đề nghị vá (propose-only, không tự sửa):** bỏ hẳn con số khỏi chú thích trong `hmw.js`, thay bằng câu trỏ khoá cấu hình — *"tập lớp cờ = khoá `lead_self_audit.flag_classes` trong `.claude/agent-memory/memory-budget.json`; đếm bằng lệnh, đừng chép số"*. Đây cũng chính là luật B1 mà kho này đã áp cho các con số khác.
### 8.3 — Ba khoản còn lại của §7 vẫn CHƯA ĐO
Không đo được trong lượt này, khai để không ai tưởng đã phủ hết: (1) năm kịch bản ở dòng 10 bảng §3.4 — mới biết **có** đọc mẫu tên, chưa biết mẫu nào ở dòng nào · (2) phép đối chiếu hộp thư chỉ bắt **vắng mặt**, chưa bắt **dòng có mà sai**, nên 24 là cận dưới · (3) phép băm bốn món dùng lại kết quả N1, tôi không chạy lại.

View File

@ -416,4 +416,229 @@ Chữ hub (`phụ lục:200`): *trọn · thiếu-có-tên · không-xác-địn
- **PL3-(vii) guard vắng tệp phải là vị từ máy** — N2 F-07a đã bắt N1 bỏ sót. Lane C xác nhận và bổ sung: SE **giàu vị từ đĩa**, đây là khoản dễ khai tương đương (`Test-Path` rải khắp; `distill-shard-probe.ps1:23` là mẫu chuẩn: *"khong thay memory-budget.json -> probe-loi (khong chan)"*).
- **TC3-L8 trần chi phí cho cửa hay dùng** — SE **KHÔNG ĐO ĐƯỢC** (khớp TC-10 của chính hub). Doctrine SE: *"đo BYTE, CẤM quy token"* (S158). Nếu adopt thì trần = **hướng dẫn + nghĩa vụ khai khi vượt**, đúng chữ hub `:185` (*"Không có dụng cụ đo thì khai KHÔNG ĐO ĐƯỢC, đừng in số bịa"*).
- **TC3-L5 tiền kiểm ở đầu MỌI cửa** — hub đòi **liệt kê từng cửa**, cấm ghi gộp. N1 mới chắc ở `/tiep` + `/session-start`. **CHƯA ĐO** cho `/check-email`, `/adap-apply`, `/adap-report`, `/pause`, `/session-end` — cần: `grep -n "probe\|Sàn-3\|san-3\|nhip-no" .claude/commands/check-email.md .claude/commands/adap-apply.md .claude/commands/adap-report.md`.
- **TC3-L5 tiền kiểm ở đầu MỌI cửa** — 🔴 **ĐO XONG, và kết quả xấu hơn N1 tưởng.** Xem §E.5.
### E.5 — 🔴 ĐO: "tiền kiểm ở đầu MỌI cửa" — SE phủ **4/19 cửa**, không phải "gần đủ"
Phép đo (liệt từng cửa, đúng luật A4 *cấm ghi gộp*): `ls -1 .claude/commands/*.md | wc -l` = **19 cửa**. Đếm dấu vết tiền kiểm mỗi cửa bằng `grep -c "nhip-no-probe\|Sàn-3\|san-3\|tiền kiểm\|probe"`:
| Cửa | hit | Có tiền kiểm thật? |
|---|---|---|
| `session-start.md` | 19 | ✅ |
| `session-end.md` | 12 | ✅ |
| `tiep.md` | 10 | ✅ |
| `pause.md` | 4 | ✅ |
| `sleep-recovery-memory-l2.md` | 2 | 🟡 CHƯA ĐO — hit có thể là nhắc chữ, không phải lời gọi |
| `check-email.md` | 2 | 🟡 CHƯA ĐO — như trên |
| `snapshot.md` | 1 | 🟡 CHƯA ĐO — như trên |
| `adap-apply.md` · `adap-report.md` · `adap-request.md` · `fable-real.md` · `fable-clone.md` · `send-email.md` · `ultra-on.md` · `ultra-off.md` · `user-mark-active.md` · `user-mark-active-high.md` · `user-mark-medium.md` · `user-mark-disable.md` | **0** | ❌ **KHÔNG** |
**Chắc chắn có: 4 cửa. Chắc chắn không: 12 cửa. Cần đo thêm: 3 cửa.** Con số để báo cáo là **4/19 chắc chắn**, cận trên **7/19** nếu 3 cửa kia hoá ra có thật.
🔴 **Ca `LỚP-2` (thợ rèn không có dao) — xảy ra NGAY TRONG LƯỢT NÀY:** cửa `/adap-apply`**chính cửa đang được dùng để áp gói tài liệu này** — có **0 tiền kiểm**. Tức lượt áp một gói quy trình đòi *"tiền kiểm ở đầu mọi cửa"* lại đi qua một cửa không có tiền kiểm nào. Ghi vào báo cáo như một ca thật của lớp lỗi số 2, không phải như lời tự trách.
🔸 **Khai giới hạn của thước:** đây là phép đo **sự hiện diện của chuỗi ký tự**, không phải phép đo *lời gọi có chạy không*. Ba cửa có hit 1-2 cần mở ra đọc mới kết luận được. Không suy 1 hit thành "có tiền kiểm".
---
## §F — Bóc TỪNG KHOẢN GĐ-3 (8 bước thư chính × 8 khoản phụ lục)
> Mã kép: `TC3-L<n>` = bước n của `thu-chinh:178-185` · `PL3-(x)` = khoản (x) của `phu-luc:187-208`. Hai nguồn **không ánh xạ 1-1** — ghi rõ chỗ lệch.
| # | Khoản | Nguồn | Trạng thái SE | Bằng chứng `file:line` |
|---|---|---|---|---|
| **C3-01** | Bốn nhãn lệch nghi thức, mỗi nhãn một vị từ đĩa | `TC3-L1` + `PL3-(i)` | **THIẾU** (có văn hoá cho nhãn *suy-giảm-hợp-lệ*) | §E.1 · `WAL.md` khối `ERRATA` · `nhip-no-probe.ps1:10-11` |
| **C3-02** | Vai kiểm **chỉ đối chiếu, không phán đặc tả**; đặc tả tự chỏi ⇒ gắn cờ xung đột trả người điều phối | `TC3-L2` + `PL3-(ii)` | **NỬA** — có vai kiểm hai đầu, nhưng ràng buộc *cấm phán đặc tả* **chưa thành văn** | `session-start.md:269` · `session-end.md:119` · tiền lệ xử đúng: memory `feedback_edit_must_predate_review` |
| **C3-03** | Vòng hỏi ngược 5 cột, **đóng khi không dòng nào trống** | `TC3-L3` + `PL3-(iii)` | **THIẾU khuôn** — có họ hàng *bảng disposition từng dòng* (S119) | §E.2 |
| **C3-04** | Cổng chặn bằng mã lỗi, **thang 4 trạng thái** | `TC3-L4` + `PL3-(v)` + `PL3-(viii)` | 🔴 **NGƯỢC** — xung đột 1, xem §A | `governance-detectors.ps1:1962` |
| **C3-05** | Tiền kiểm chi phí 0 ở **đầu MỌI cửa**, chỉ đọc, soi cửa đóng gần nhất, chọn cửa bằng **dấu thời gian TRONG tệp** | `TC3-L5` + `PL3-(iv)` | **NỬA** — cơ chế neo **ĐÚNG NGUYÊN VĂN hub**, nhưng phủ **4/19 cửa** | §E.5 · carrier-commit `git log --diff-filter=A -1 -- <marker>` (S158, 8/8 resolve) |
| **C3-06** | Vai kiểm chạy ở **cả hai đầu** phiên | `TC3-L6` + `PL3-(iv)` vế sau | ✅ **CÓ — ĐÚNG NGUYÊN VĂN** | `session-start.md:269` + `session-end.md:119`, spawn **vô điều kiện**, HÌNH B @S149 |
| **C3-07** | Luật **tự trị ba bậc** khi anh vắng, đặt ở chỗ điều phối chắc chắn đọc | `TC3-L7` + `PL3-(vi)` | **THIẾU nội dung** — hạ tầng có, ruột không | xem §F.1 |
| **C3-08** | Trần chi phí cho cửa hay dùng + nghĩa vụ khai khi vượt | `TC3-L8` | **KHÔNG ĐO ĐƯỢC** (khớp TC-10 hub) | doctrine *"đo BYTE, cấm quy token"* (S158) |
| **C3-09** | **Guard vắng tệp phải là vị từ máy**, cấm dùng mệnh đề *"cái đó chưa làm"* | `PL3-(vii)`**không có bước tương ứng ở thư chính** | ✅ **CÓ mạnh** — khai tương đương được | `distill-shard-probe.ps1:23` · `mfe-eval.ps1:45` · `memory-archive-gate.ps1:40-41` |
| **C3-10** | Khai thẳng ranh giới: máy đo **sự hiện diện và khuôn dạng, không đo CHẤT** | `PL3` kết (`:208`) — **không có bước tương ứng** | ✅ **CÓ văn hoá mạnh** | `governance-detectors.ps1:1962` *"FLAGs are advisory"* · `spawn-model-audit.ps1:140` *"INFORMATIONAL"* |
**⇒ GĐ-3: 10 khoản.** Có 3 · Nửa 3 · Thiếu 3 · Ngược 1.
🔴 **Lệch đánh số giữa hai nguồn — ghi để người thi công không trỏ nhầm** (mở rộng N2 F-07b): thư chính có **8 bước**, phụ lục có **8 khoản**, nhưng **không phải 8↔8**. `PL3-(vii)` và câu kết `:208` **không có bước nào ở thư chính**; ngược lại `TC3-L8` (trần chi phí) **không có khoản nào ở phụ lục**. Ai dò theo số khoản của một nguồn sẽ mất 2 khoản.
### F.1 — Đo `C3-07`: luật tự trị ba bậc — hạ tầng CÓ, ruột KHÔNG
N1 để mục này ở dạng *"CHƯA ĐO"*. Lane C đo xong:
- **Hạ tầng:** `.claude/governance/ACTIVE-MARKS.md` tồn tại, **31.197 B**, có **19** dấu vết `RC-pqhuy1987|ACTIVE|mã dấu` ⇒ cơ chế mark sống thật.
- **Ruột ba bậc:** đếm từng vế trên chính tệp đó — `bậc` = **1 hit** (và hit đó là chuỗi *"bậc-MẠNH"*, **không phải** luật tự trị) · `tự vá` = **0** · `an toàn` = **0** · `mơ hồ` = **0** · `phá huỷ` = **0** · `phá hủy` = **0** · `tự trị` = **0** · `vắng` = **0**.
- **Control-dương cho thước:** cùng tệp, mẫu `RC-pqhuy1987|ACTIVE|mã dấu` = **19 hit** ⇒ thước đọc được tiếng Việt có dấu và có bắt. 0-hit ở trên **không phải thước hỏng**.
**Kết luận: `ACTIVE-MARKS.md` là cơ chế uỷ quyền theo từng quyết định, KHÔNG phải luật tự trị ba bậc.** Hai thứ khác nhau: mark trả lời *"anh đã cho phép việc X chưa"*; luật ba bậc trả lời *"anh vắng, gặp việc CHƯA có mark thì làm gì"*. Cái thứ hai SE **không có**.
🔴 **Cảnh báo nguồn-đôi ngay tại đây (§F.2 dưới):** luật tự trị ba bậc bị **hai giai đoạn cùng đòi**`C3-07` đòi nó ở *"chỗ người điều phối chắc chắn đọc"*, và GĐ-4 mục mồi `ST-002` đòi nó **trong sổ**. Xây hai lần = đẻ đúng thứ xung đột 2 đang cố tránh.
### F.2 — 🔴 KIỂM LẠI MỆNH ĐỀ OD-2 "GĐ-4 độc lập GĐ-3" — đề bài dặn đừng nhận suông, và đúng là có lỗ
**Vế ĐÚNG:** hub `thu-chinh:197` nguyên văn — *"Giai đoạn này **độc lập với GĐ-2, GĐ-3 và GĐ-5**"*. Về **điều kiện vào**, GĐ-4 chỉ đòi GĐ-1. ⇒ *cổng-mã-lỗi treo ở §A không chặn điều kiện vào của GĐ-4***mệnh đề này đứng**.
**Ba lỗ đo được, đề bài dặn kiểm và kiểm ra thật:**
1. 🔴 **Trùng VẬT, không chỉ trùng vùng:** `C3-07` (luật tự trị ba bậc) và `ST-002` (mục mồi *tự trị khi anh vắng*) là **cùng một luật**, bị hai giai đoạn đòi ở **hai đích ghi khác nhau**. Làm GĐ-4 trước rồi GĐ-3 sau mà không nối, SE sẽ có **hai bản luật tự trị trôi khỏi nhau** — đúng bệnh nguồn-đôi. **Thuốc:** một bản là NGUỒN, bản kia **trỏ** (luật B1 của SE: *derived trỏ canonical, cấm chép*).
2. **Trùng VÙNG CHẠM:** `C3-05`/`C3-06` sửa `session-start.md` · `session-end.md` · `tiep.md` · `pause.md`; GĐ-4 bước 7 (đèn nợ mọi cửa) và bước 9 (khối chấm điểm hai cửa) sửa **đúng bốn tệp đó**. Chạy W3 và W4 **song song** = xung đột sửa cùng tệp. Không phải lỗi logic, là lỗi lập lịch — nhưng N4 phải biết.
3. **Trùng ĐÍCH CẮM:** `C3-07` đòi cắm ở *"chỗ điều phối chắc chắn đọc"*; GĐ-4 bước 4/5 đòi cắm hai kỷ luật vào *"tệp luôn được nạp mỗi lượt"*. Với SE **hai mô tả này trỏ cùng tập tệp** (`CLAUDE.md` / `auto-memory/MEMORY.md`, §D.3) ⇒ hai wave cùng sửa một tệp.
**Kết luận về OD-2:** *"GĐ-4 độc lập GĐ-3"* **đúng ở trục điều-kiện-vào**, **sai nếu đọc thành "hai wave chạy song song không đụng nhau"**. Khuyến nghị cho N4 (không phải quyết định): W3 và W4 **không xếp song song**, và bên nào chạy trước phải **chốt đích ghi của luật tự trị** cho bên kia trỏ về.
---
## §G — Bóc TỪNG KHOẢN GĐ-4 (9 bước thư chính × 7 khoản phụ lục)
> Mã kép: `TC4-L<n>` = bước n của `thu-chinh:199-207` · `PL4-(x)` = khoản (x) của `phu-luc:238-266`.
| # | Khoản | Nguồn | Trạng thái SE | Bằng chứng |
|---|---|---|---|---|
| **C4-01** | Sổ **ba khối** ở lane quản trị; cột lời nguyên văn có **trần ký tự cứng** | `TC4-L1` + `PL4-(i)` | **THIẾU** (khối 3 trống tuyệt đối) | §D.1 · 0-hit `sở-thích\|phàn nàn`, control *"điểm dừng"*=5 tệp |
| **C4-02** | **Mã định danh vĩnh viễn, cấm tái dụng**; đóng thì lật trạng thái, **không xoá dòng** | `TC4-L2` + `PL4-(ii)` | 🔴 **NGƯỢC — SE đang tái dụng chỉ số** | `HANDOFF:10-17` đánh số `1..7` **lặp lại mỗi phiên**; SE đã trả giá: memory `feedback_absence_looks_like_clean` |
| **C4-03** | **Hai mục mồi** ở khối sở thích, kèm **liệt kê lằn ranh đỏ** | `TC4-L3` + `PL4-(iii)` | **THIẾU chỗ chứa** — nguyên liệu có, chưa liệt kê một chỗ | §D.1 · lằn ranh rải trong 61 tệp auto-memory |
| **C4-04** | Kỷ luật **ghi NGAY**, cắm vào **tệp luôn nạp**, **cấm cắm vào tệp lệnh** | `TC4-L4` + `PL4-(iv)a` | **THIẾU** — chỗ cắm hợp lệ tồn tại, luật chưa có | §D.3 |
| **C4-05** | Kỷ luật **tra sổ trước khi hỏi**, ở **hai chỗ**; + định nghĩa A5 | `TC4-L5` + `PL4-(iv)b` | **THIẾU** | `grep "viện dẫn"` auto-memory = 0 (control `How to apply` = 48/61) |
| **C4-06** | **Lượt dò không tốn phí**: trả *đang treo* + *nhắc từ lần 2*; phân biệt **chưa-có-dữ-liệu ⟂ đo-và-bằng-0**; hỏng thì in dấu hỏi; **không bao giờ chặn** | `TC4-L6` + bẫy-1 | 🟢 **KHUNG ĐÃ CÓ VÀ KHỚP TỪNG CHI TIẾT — chỉ thiếu dữ liệu nguồn** | `nhip-no-probe.ps1:10-11,:49,:230` — read-only, exit-0, luôn in, lỗi in `probe-loi (khong chan)`, `CONFIG-THIEU` không tự chế mặc định |
| **C4-07** | **Đèn nợ ở MỌI cửa dừng**: thứ tự trường cố định · mọi trường luôn in · số **dán nguyên văn từ máy dò, cấm gõ tay** | `TC4-L7` + `PL4-(v)` + bẫy-2 | **NỬA** — có ở **4/19 cửa** | `session-start.md:269` · `session-end.md:118` · `tiep.md:154` · `pause.md:113` — cả 4 in *"probe KHÔNG chặn"* |
| **C4-08** | **Vai đọc sổ độc lập, bốn thấu kính** + **vai soi lại vai này**; nhịp ba cửa, **trong lượt KHÔNG chạy vai này** | `TC4-L8` + `PL4-(vi)` | **THIẾU vai** — có vai soi-vai họ hàng | `ring2-audit` · cặp `lead-stale`/`lead-gap` |
| **C4-09** | **Thu hẹp vai cũ cùng lượt**, ghi rõ phần chuyển giao | `TC4-L8` vế sau + `PL4-(vii)` | **CHƯA ĐO** — cần `grep -rln "yêu cầu của anh\|lời anh\|owner-request" .claude/agents/*.md` + control-dương | — |
| **C4-10** | Áp **luật chấm điểm** (món 4); in khối chấm ở **cả hai cửa phiên** | `TC4-L9` | 🔴 **VẮNG HOÀN TOÀN** | §H |
| **C4-11** | **Cấm đổ nhãn-của-đội vào cột nguyên văn**, đưa vào phụ lục riêng | `PL4` bẫy-5 + `A1`**không có bước tương ứng ở thư chính** | ✅ **SE KHÔNG mắc** — và mạnh hơn hub | §C |
| **C4-12** | **Đường ghi lại khi chấm sai**: xác định *tầng nào sai* · nhãn lớp lỗi riêng · ghi vào nhật ký vai đã sai; lớp lỗi sống ở **sổ lỗi**, **cấm** nhét vào tập tín hiệu của máy cảnh báo | `A10` + `luat:104-106` | **NỬA MẠNH** — vế *phép thử* SE **có máy thật**, vế *quy trình* chưa thành văn | `h24-signal-write.ps1` từ chối class ngoài enum (exit 2/3) + `_frozen_until_owner`; error-ledger = đúng chỗ hub chỉ |
**⇒ GĐ-4: 12 khoản.** Có 2 · Nửa 3 · Thiếu 5 · Ngược 1 · Chưa đo 1.
🔴 **Phép thử A10 chạy được NGAY HÔM NAY, không cần xây gì:** hub đòi *"thử đẩy lớp nhãn mới vào máy cảnh báo — nó **phải từ chối**"*. SE có `h24-signal-write.ps1` với enum đóng + thông điệp *"a monitor may NOT invent a class"* + exit 2. Đây là **khoản GĐ-4 duy nhất SE có thể tick ngay với bằng chứng chạy được**, nên đưa vào wave đầu để có ít nhất một ô xanh có thật.
---
## §H — `luat-cham-diem` bóc theo **4 tầng chấm** + **3 mốc niêm phong** (luật ĐÃ KÝ, áp thẳng)
### H.1 — Phạm vi BẤT BIẾN: dùng `:140`, KHÔNG dùng câu tóm `:23`
Khối chữ ký `:140` liệt **5 khoản** bất biến: *công thức · **nguồn đếm** · bốn tầng · ba mốc niêm phong · **đường ghi lại khi chấm sai***. Câu tóm ở `:23` chỉ nhắc 3 khoản (công thức · ba mốc · ranh giới tầng). N2 F-08 bắt đúng: thiết kế theo `:23` sẽ tưởng *nguồn đếm* là hình thức đổi được — trong khi nó **đã ký**. 🔴 **Lane C xác nhận và nhấn mạnh: chính khoản "nguồn đếm" là khoản đẻ ra xung đột 2** (§B). Đọc nhầm phạm vi ⇒ tưởng có thể né xung đột bằng cách đổi nguồn đếm. **Không né được.**
Cái được đổi: tên trường · cách trình bày · chỗ đặt tệp (`:23`).
### H.2 — Công thức
> **điểm = max(0, 10 số MỤC bị lặp từ lần thứ hai trở lên)** (`:49`)
Ba cách đọc bắt buộc (`:53-55`), thiếu một là áp sai:
1. **MỤC** = một mã yêu cầu **hoặc** một chủ đề phàn nàn — **không phải một lần nói**.
2. Lặp năm lần cùng một mục **vẫn chỉ trừ một**.
3. Nhắc **một lần thì không trừ**.
Điểm sàn 0, không bao giờ âm (`:57`). Nghiệm thu đòi thử một ca lặp nhiều lần cho ra **trừ đúng một** (`:120`).
🔴 **Hệ quả cho SE, đo được:** công thức chỉ cần **số MỤC bị lặp ≥2**. Nó **không cần** cột *trạng thái*. ⇒ **xung đột 2 (§B) không chặn việc chấm điểm** — chấm được ngay cả khi chưa chốt ranh sổ⟂WAL. Đây là một đường tách wave có thật cho N4.
### H.3 — Nguồn đếm (khoản đẻ ra xung đột 2)
- `:63`*"**Cuốn sổ là đường ghi chính**, vì nó được ghi ngay trong lượt trao đổi."*
- `:64` — dòng hội thoại là **gương bắt buộc**: mọi mục có lời nguyên văn **phải** có khối trích tương ứng để đối chiếu với bản ghi phiên.
- `:65` — hub đo thật và thấy dòng hội thoại của mình **rất thưa***"một máy chấm chỉ đọc dòng hội thoại sẽ **luôn cho điểm tuyệt đối**"*. Hub tự gọi đây là lớp *"bộ dò sinh ra để chống X lại tự đẻ ra X"*.
- `:66`**chưa có số phủ sóng thì in `KHÔNG ĐO ĐƯỢC`, CẤM in điểm.** Số phủ sóng = tỉ lệ tin của anh đã được bắt vào dòng hội thoại trên tổng số tin thật.
- `:67` — máy dò phải **loại các dòng mẫu trống** khỏi phép đếm.
🔴 **SE ở đâu:** **KHÔNG ĐO ĐƯỢC** số phủ sóng, và **CHƯA ĐO** cả việc SE có "dòng hội thoại" theo nghĩa hub hay không — cần: `ls .claude/**/transcript*` hoặc xác định vật tương đương. ⇒ Theo đúng luật `:66`, **khối chấm điểm đầu tiên của SE phải in `KHÔNG ĐO ĐƯỢC`, không được in số**. Đây là ô **duy nhất đúng** cho phiên đầu — in một con số 10/10 là vi phạm luật đã ký, và cũng là *"đèn xanh đầu tiên của sổ mới là đèn giả"* (bẫy-1 GĐ-4).
### H.4 — Bốn tầng chấm (`:73-80`)
| Tầng | Ai | Làm gì | Ranh giới CỨNG | SE có vai chưa? |
|---|---|---|---|---|
| **1** | người điều phối (lead) | tự chấm ở **cửa đóng phiên** | chấm **TRƯỚC** khi đọc kết quả tầng 2 | ✅ có người, ❌ chưa có nghi thức |
| **2** | **vai đọc sổ độc lập** | đếm lại độc lập, so lệch **TỪNG MỤC** | **không xem điểm tầng 1** trước khi đếm xong | ❌ **chưa có vai** — VƯỢT-KHUNG |
| **3** | **vai soi độc lập** | **kiểm PHÉP ĐẾM, không chấm lại** | 🔴 **CẤM đề xuất một điểm khác** | 🟡 `ring2-audit` họ hàng gần |
| **4** | **anh** | quyết cuối | im lặng có điều kiện = xác nhận, **chỉ khi đủ 3 mốc** | — |
`:80`*"Cho tầng ba chấm lại là biến nó thành một tầng hai thứ hai, và thế là mất hẳn lớp kiểm."*
**Dòng tổng kết ghi vào sổ phiên** (`:82`) phải có: **điểm cuối · giá trị của cả ba tầng đầu · trạng thái niêm phong · liệt kê TỪNG MỤC bị lặp kèm mã**. Không có mục nào thì ghi thẳng *"danh sách rỗng"***cấm gộp danh sách thành khoảng**.
🔴 **Hội tụ độc lập đáng ghi:** ranh giới tầng-2 (*"không xem điểm tầng 1 trước khi đếm xong"*) là **đúng liều thuốc** cho bệnh SE đã tự chẩn ở memory `feedback_meta_count_selfcoverage_blindspot`*"lead ĐO tốt (~80% đúng) nhưng ĐẾM-VỀ-MÌNH sai (~13%), tập trung trọn ở meta-count/coverage"*. Lead tự chấm phiên của chính mình **chính là** meta-count về mình. ⇒ tầng 2 không phải thủ tục thừa, nó vá một lỗ SE đã đo được. Ghi vào báo cáo như **lý do adopt**, không phải như nghĩa vụ.
### H.5 — Ba mốc niêm phong (`:86-98`) — thiếu một là **nhãn không phản bác được**
| Mốc | Tên trường gợi ý | Nội dung |
|---|---|---|
| **1** | `emit_ts` | thời điểm **điểm được phát ra** |
| **2** | `redisplay_ts` | thời điểm điểm được **hiển thị lại** ở cửa anh chắc chắn đọc |
| **3** | `first_owner_msg_ts` | thời điểm **tin đầu tiên của anh SAU lần hiển thị lại** |
**Điều kiện hợp lệ (`:94`):** mốc 3 đến **SAU** mốc 2, **VÀ** tin ở mốc 3 **không nhắc gì tới điểm**.
**Thiếu mốc 3 ⇒ trạng thái là *chờ niêm phong*** — **không phải** *đã niêm phong***và cũng không đẩy vào hàng chờ của anh** (`:96`).
`:98`, đáng chép nguyên si: *"'chủ dự án đã thấy mà không nói gì' khác hẳn 'chủ dự án chưa thấy'. Không có ba mốc thì hai trạng thái đó **trông y hệt nhau**."*
🔴 **Đây là bài học SE đã có tên riêng:** memory `feedback_absence_looks_like_clean`*"vắng-mặt trông giống ổn"*. Cùng một lớp lỗi, hai nơi tìm ra độc lập. Mốc 2 được hub chỉ định thực hiện **ngay tại khối chấm ở cửa mở phiên** (`:114`).
### H.6 — Chỗ hiển thị (`:110-114`)
In khối chấm điểm ở **cửa mở phiên****cửa đóng phiên**. Ở cửa mở phiên, khối này **THAY THẾ** nghi thức cũ kiểu *"hỏi anh chấm mấy điểm"* — vì chính nghi thức đó là nguyên nhân bệnh TC-12.
🔴 **SE đặc thù, phải khai với hub:** SE **không có nghi thức cũ để thay thế**`grep -rn "chấm điểm" .claude/commands/*.md` = **0 hit** (N1 đo; control-dương *"điểm dừng"* = 5 tệp, N2 sửa số). ⇒ với SE đây là **dựng mới**, không phải thay thế. **TC-12 ở SE nặng hơn ở hub**: hub có điểm nhưng bị treo; SE **chưa từng sinh ra một điểm nào**.
### H.7 — Đường ghi lại khi chấm sai (`:102-106`)
Khi anh điều chỉnh điểm: ghi **phân tích nguyên nhân ngắn xác định TẦNG NÀO SAI** · gắn nhãn lớp lỗi **"chấm sai"** · ghi một dòng vào **nhật ký của vai đã sai**.
🔴 Ràng buộc cứng (`:106`): *"Lớp lỗi 'chấm sai' sống ở **SỔ LỖI**, cấm nhét vào **tập tín hiệu đóng** của máy cảnh báo. Tập đó nuôi bộ đếm ngưỡng; thêm một lớp vào đó là **đổi ngữ nghĩa của cả bộ đếm** mà không ai nhận ra. Muốn có nhịp đếm thì dùng lớp gom sẵn có, hoặc trình chủ dự án xin mở tập tín hiệu — **không tự mở**."*
**SE khớp sẵn:** `h24-signal-write.ps1` = tập tín hiệu đóng **có máy canh thật** (exit 2 khi class ngoài enum); `error-ledger` = sổ lỗi, đúng chỗ hub chỉ. ⇒ chỉ cần **viết quy trình thành văn**, không cần xây máy. Khoản rẻ.
### H.8 — Tám ô nghiệm thu của luật (`:120-127`) — trạng thái SE hôm nay
| # | Ô nghiệm thu | SE hôm nay |
|---|---|---|
| 1 | Công thức thành văn + thử ca lặp nhiều lần ra **trừ đúng một** | ❌ chưa có |
| 2 | Hai hệ đo (trải nghiệm ⟂ kỹ thuật) ở **hai chỗ khác nhau**, không có chỉ số tổng trộn | 🟢 **SE thuận sẵn** — mọi phép đo hiện có đều là kỹ thuật; hệ trải nghiệm chưa tồn tại nên **không có nguy cơ trộn**, chỉ cần đặt đúng chỗ ngay từ đầu |
| 3 | Dòng tổng kết đủ: điểm cuối · 3 giá trị tầng · trạng thái niêm phong · **liệt từng mục kèm mã** | ❌ |
| 4 | Ba mốc có mặt ở phiên gần nhất; mốc 3 sau mốc 2 | ❌ |
| 5 | Thiếu mốc 3 ⇒ in *chờ niêm phong* | ❌ |
| 6 | Chưa có phủ sóng ⇒ in `KHÔNG ĐO ĐƯỢC`, **không in điểm** | ❌ — nhưng đây là ô **SE phải tick đầu tiên** (§H.3) |
| 7 | Lớp *"chấm sai"* ở sổ lỗi; đẩy vào máy cảnh báo thì **máy phải từ chối** | 🟢 **phép thử chạy được NGAY**`h24-signal-write.ps1` |
| 8 | Khối chấm hiện diện ở **cả hai cửa phiên** | ❌ |
**⇒ 2/8 ô SE có thể chạm ngay (ô 2 · ô 7), 6/8 phải dựng.**
---
## §I — VƯỢT-KHUNG: liệt từng khoản, gắn nhãn, KHÔNG tự quyết
Đề bài báo *"2 trong 4 khoản vượt-khung của N1 nằm ở lane này"*. Lane C đo lại: **đúng 2 khoản của N1 nằm ở đây, và lane C tìm thêm 3 khoản nữa**.
| # | Khoản | Vì sao vượt khung | Cần ai |
|---|---|---|---|
| **VK-1** *(N1 (a))* | Đổi doctrine exit-0 → cổng chặn | Đổi **cơ chế đang sống** ở 9 máy + 4 cửa; 49 cờ đang mở | **anh** chọn PA-1/2/3/4 (§A.6); nếu chọn PA-3 thì **báo hub** vì là *làm khác* |
| **VK-2** *(N1 (c))* | Sổ 3 khối = artifact mới cạnh WAL | Nguy cơ nguồn-đôi; PB-2 còn đòi **sửa luật đã ratify** `tiep.md:181` + `pause.md:117` | **anh** chọn PB-1/2/3 (§B.5) |
| **VK-3** *(lane C thêm)* | **Đẻ vai đọc sổ** (tầng 2) + **gán vai tầng 3** | Đụng roster + `hmw.js` VALID_ROLES + GĐ-6 điều-kiện-vào-danh-sách **trọn gói một commit**; và *"thu hẹp vai cũ cùng lượt"***rút bớt quyền của vai đang chạy** | **anh** |
| **VK-4** *(lane C thêm)* | **In khối chấm điểm ở hai cửa phiên** | Sửa nghi thức `session-start.md` + `session-end.md` — nghi thức hai đầu là **vật anh đã chốt**; luật hub miễn *chữ ký hub* (`luat:133`) nhưng **không miễn quyền anh với nghi thức nhà mình** | **anh** |
| **VK-5** *(lane C thêm)* | **Ngoại lệ nhập bảng `HANDOFF:10-17` vào sổ** (§C.5 khoản 3) | Là **ngoại lệ đầu tiên** của luật *cấm đổ dữ liệu cũ vào cột nguyên văn*; mọi ngoại lệ sau sẽ viện nó làm tiền lệ | **anh** |
🔴 Lane C **không quyết khoản nào trong năm khoản trên**. Trình phương án + đánh đổi là hết phần việc của lane C.
---
## §J — Khoản gửi ngược hub (đề xuất — cần anh duyệt trước khi gửi)
1. **Thang mã thoát cần điều kiện tiên quyết về nơi đọc mã** — cổng chặn đặt ở chỗ mã thoát bị nuốt sẽ biến thành **dừng câm**, và dừng câm trông giống hệt chạy-xong-sạch. Bằng chứng SE: `hmw.js:288` + `:178`. Đây đúng là lớp *"nhãn không phản bác được"* mà hub tự đặt tên ở `luat:98`. (§A.4)
2. **Khối *việc-được-giao* thiếu trường thứ bảy: "đội hiểu thành gì"** — thiếu nó thì lớp lỗi *đội tự thu hẹp phạm vi lệnh* không có chỗ lộ ra. Bằng chứng SE làm mạnh hơn: `docs/HANDOFF.md:17`. (§C.4)
3. **`status: DRAFT` + `reviewer_gate: PENDING` trên cả bốn thư** trong khi `thu-chinh:66` tuyên bản nháp thì không có dấu trạng thái đã duyệt — F-1 của N1, lead đã verify 4/4, hash khớp canonical. Lane C **không đo lại**, chỉ nhắc để mục phản biện không rớt.
---
## §K — Ô CHƯA ĐO còn lại (ghi kèm lệnh, không để trống)
| Ô | Lệnh cần chạy |
|---|---|
| `C4-09` thu hẹp vai cũ — vai nào đang soi phần *yêu cầu của anh* | `grep -rln "yêu cầu của anh\|lời anh\|owner-request\|chờ-anh" .claude/agents/*.md` + control-dương `grep -rlc "FLAG" .claude/agents/*.md` |
| §E.5 — 3 cửa hit 1-2 có tiền kiểm thật không | `grep -n "nhip-no-probe\|probe" .claude/commands/check-email.md .claude/commands/snapshot.md .claude/commands/sleep-recovery-memory-l2.md` |
| §H.3 — SE có "dòng hội thoại" theo nghĩa hub không, và số phủ sóng | xác định vật tương đương trước; nếu không có thì kết luận **KHÔNG ĐO ĐƯỢC** là đúng chứ không phải thiếu sót |
| `C4-01` trần ký tự cột nguyên văn đọc từ tệp cấu hình chung | `grep -n "char_cap\|max_chars\|trần" .claude/agents/memory-budget.json` — khuôn có sẵn (`memory-budget.json`), chưa có khoá cho sổ |
---
**END sub-n3-lane-c-gd34** — GĐ-3 **10 khoản** (có 3 · nửa 3 · thiếu 3 · ngược 1) · GĐ-4 **12 khoản** (có 2 · nửa 3 · thiếu 5 · ngược 1 · chưa đo 1) · **5 khoản VƯỢT-KHUNG** · xung đột 1 có **4 phương án**, xung đột 2 có **3 phương án**, lane C **không chọn khoản nào**.

View File

@ -220,3 +220,287 @@ tiên và nên được đo lại chứ đừng chép lo ngại của hub thành
Lệnh đề xuất: đếm thư mục con `~/.claude/projects/<slug>/*/` có `subagents/workflows` so với tổng số
có `subagents/*.jsonl`. **CHƯA CHẠY** ⇒ không phán số.
---
## §2 — GĐ-5: BÓC TỪNG KHOẢN (mẫu số D = 20)
| # | Khoản hub (neo) | SE | Bằng chứng `file:line` |
|---|---|---|---|
| **D-1** | Cửa gọi model đắt **chỉ chủ dự án gõ** (`thu-chinh:222`, `phu-luc:314`) | **ĐỦ** | `commands/fable-real.md:38` *"Lead KHÔNG tự ý gọi engine-đắt — kể cả khi HMW-mode ON"*; H21 per-invocation `:9` |
| **D-2** | Đội **không bao giờ tự nâng hạng** (`thu-chinh:222`) | **ĐỦ** | `fable-real.md:37` *"Engine-đắt per-invocation = đường DUY NHẤT nâng 1 vai lên hạng-nhất"* |
| **D-3** | **Mọi chỗ gọi** mang tham số model **tường minh**; quét kho **không còn chỗ để mặc định** (`phu-luc:313`, nghiệm thu `:331`) | **NỬA** | Tầng frontmatter ĐỦ: audit khối D = **26/26** `model: opus` + **26/26** `effort: max`. Tầng chỗ-gọi **KHÔNG**: `hmw.js:274` `model: resolveModel(...)`, mà `resolveModel` trả **`undefined`** ở **cả hai** nhánh (`:95` role-less, `:96` role-có-frontmatter) = **đúng nghĩa "để mặc định"**. Cộng máy soát mù (§1). |
| **D-4** | Điều phối **chỉ ĐÓNG GÓI, cấm diễn giải lại** (`thu-chinh:223`, `phu-luc:300`) | **NỬA** | Luật CÓ nhưng **sai lane**: `commands/pause.md:53` *"chép nguyên văn, CẤM paraphrase… CẤM dựng lại từ trí nhớ"* — áp cho **sổ lưu trữ**, không áp cho **lượt dispatch** vào sub |
| **D-5** | **Rào** đánh dấu vùng nguyên văn (`thu-chinh:223`) | **NỬA** | Rào CÓ THẬT: tiền tố `> anh:` (`pause.md:53`; `session-start.md:98` `_context-s-<N>.md` FLOW). Chỉ sống ở lane lưu trữ. 🔴 **N1 `:148` khai "chưa có rào-nguyên-văn" là BI QUAN QUÁ** — rào có, đặt nhầm chỗ |
| **D-6** | Cửa **biên dịch ý định** → đặc tả **4 khối** (`thu-chinh:224`, `phu-luc:302`) | **ĐỦ** | spec-file H21 `fable-real.md:28`; instance sống = `spec-adap-upgrade-pack-phased-07-08-2026.md` cùng thư mục |
| **D-7** | **Chỉ ra bản nháp**, không tự thi công (`phu-luc:302`, nghiệm thu `:330`) | **ĐỦ** | `fable-real.md:28` *"Engine propose-only… Engine KHÔNG tự ghi"* |
| **D-8** | **Cửa duyệt chủ dự án** giữa spec-nháp và thi công (`phu-luc:304` tầng 3, nghiệm thu `:332`) | **KHÁC (có khai)** | SE: anh duyệt **ở ĐẦU** (gõ lệnh + vai + đề bài), lead verify spec rồi worker chạy **cùng invocation** — N1 `:147`. Hợp lệ theo *"sàn chỉ nâng"* `thu-chinh:285`, **phải khai mục 6 khuôn B** |
| **D-9** | Thi công song song: **1 nhánh sâu + N nhánh rộng** (`phu-luc:304` tầng 4) | **ĐỦ** | `/fable-real` (1 sâu) ⟂ `/fable-clone` (N rộng); phiên này chạy đúng hình đó — `run.md:4` |
| **D-10** | Tổng hợp = **MỘT LƯỢT GỌI MỚI**, không nối lại (`phu-luc:304` tầng 5) ← **N2 F-09** | **NỬA** | Thiết kế ĐÚNG: `run.md:60` N4 = `/fable-real reviewer` = **lượt gọi mới**. Nhưng **0 luật thành văn** cấm nối-lại-khi-tổng-hợp ⇒ hôm nay đúng vì tình cờ, mai không ai chặn. Xem §1-ter: lý do hub sợ (**rớt tham số model**) **đo thật ở SE = không rớt** |
| **D-11** | Gói ngữ cảnh chuẩn hoá **5 mảnh** (`thu-chinh:225`, `phu-luc:306`) | **NỬA — 3/5** | ✅ nền trỏ-không-chép (`tiep.md:183`) · ✅ lớp mềm mạch việc (`_mind`/WAL) · ✅ ký ức vai cắt theo trần (`hmw.js:9` memory-pack slice + `memory-budget.json`) · ❌ **sở thích** (sổ GĐ-4 chưa có) · ❌ **lời chủ nguyên văn ở lane dispatch** (= D-4/D-5) |
| **D-12** | Mảnh chưa có phải **khai "chưa có"** (`phu-luc:306`) | **NỬA** | Có cho **1** mảnh: `pause.md:53` *"⇒ ghi `(THIẾU — lý do)`"*. Không có luật tổng cho cả gói |
| **D-13** | Vật chứng **CHUNG GỐC**, sổ riêng chỉ là khung nhìn (`thu-chinh:228`, `phu-luc:308`) | **ĐỦ** | `runs/` là gốc duy nhất; file lane này nằm cùng `runs/2026-08-07-S180-…/` với mọi lane khác. **0 đường dẫn thứ hai** |
| **D-14** | **Sổ lượt chạy đắt** tồn tại, 5 cột khung nhìn (`thu-chinh:226`, `phu-luc:316`) | **THIẾU** | 0-hit `grep -rniE "sổ.*(lượt|lần).*đắt|expensive-run"` trên `.claude`+`docs`. **Control-dương:** `grep -rlni "engine-đắt"` = **6 tệp** ⇒ thước chạy, vật không có |
| **D-15** | **Ghi dòng NGAY lúc dựng thư mục** (`thu-chinh:226`) | **THIẾU** | Hành vi tương đương CÓ (`hmw.js:9` scaffold run-folder @P1 trước fan-out) nhưng **không có sổ ⇒ không có dòng**. Vật chủ vắng thì khoản này rỗng |
| **D-16** | **Dòng sống kể cả lượt chết giữa chừng** (`thu-chinh:226`) | **NỬA** | Nghi thức chứng minh được: 7/7 vai #53 phiên này recover 0 byte mất (`run.md:54`). Nhưng là **tệp lane**, không phải **dòng sổ** |
| **D-17** | Vật chứng lượt đắt thiếu tệp = **mức nghiêm trọng CAO NHẤT** (`phu-luc:316`) | **THIẾU** | Thang-nghiêm-trọng-theo-chi-phí-chạy-lại chưa tồn tại (thuộc GĐ-2; N1 `:227` + N2 `:82` đều xếp GĐ-2 thiếu vế này) |
| **D-18** | Vai mới vào **danh sách vai hợp lệ** TRƯỚC khi dùng (`thu-chinh:227`, `phu-luc:312`) | **ĐỦ — MẠNH HƠN SÀN** | `hmw.js:22` `VALID_ROLES`; `:173` *"Vai ∉ VALID_ROLES … DỪNG HẲN (STOP-HARD) — KHÔNG fail-soft"*. Hub chỉ đòi *có danh sách*; SE có **cổng chặn cứng**. Ghi mục 6 khuôn B (làm MẠNH HƠN) |
| **D-19** | **Một lượt thử do chủ gõ** + soi thư mục **đủ bộ tệp chuẩn** (`thu-chinh:229`, nghiệm thu `:334`) | **NỬA** | Vế 1 ĐỦ: anh gõ `/fable-real`+`/fable-clone` (`run.md:4`), đo được **168 bản ghi fable**. Vế 2 THIẾU: **0 máy điểm danh bộ-tệp** (GĐ-2) ⇒ "đủ bộ" chưa ai kiểm |
| **D-20** | Điều kiện vào + **có hạn mức** (`thu-chinh:220`) | **ĐỦ** | Hạn mức **đo được**, không phải khai suông: 168 bản ghi `claude-fable-5` hôm nay. **Không** rơi nhánh `không áp dụng` |
**Tử số GĐ-5:** ĐỦ = D-1,2,6,7,9,13,18,20 (**8**) + KHÁC-tương-đương D-8 (**1**) = **9**
· NỬA ×8 (D-3,4,5,10,11,12,16,19) = **4,0** · THIẾU ×3 (D-14,15,17) = 0.
> ### 🔢 **GĐ-5 = 13,0 / 20 (65 %) nới · 9 / 20 (45 %) nghiêm ngặt**
**Kiểm chéo bằng 2 mẫu số gốc của hub — ba số phải hội tụ, nếu không là tôi tách sai:**
| Mẫu số | Tính | Tỉ lệ |
|---|---|---|
| A — 8 bước làm (`thu-chinh:222-229`) | 0,83+0,5+1+0,5+0+1+1+0,5 = **5,33/8** | **67 %** |
| C — 6 ô nghiệm thu (`phu-luc:330-335`), ô 6 `không áp dụng` vì CÓ hạn mức | 1+0,5+1+0+0,5 = **3,0/5** | **60 %** |
| D — atomic hợp nhất | **13,0/20** | **65 %** |
Ba mẫu số độc lập ra **6067 %**, không mẫu nào lệch ra ngoài dải. ⇒ phép tách của tôi **không bơm số**.
---
## §3 — 🔴 CÂU "GĐ-5 GẦN XONG NHẤT" — KHÔNG ĐỨNG
**N1 tuyên** (`sub-invest-fitmap-S180.md:136` + `:255`, và `run.md:41` chép lại): GĐ-5 = *"GĐ GẦN XONG NHẤT"*.
**Đây là claim XẾP HẠNG.** Một claim xếp hạng chỉ đứng khi có **ít nhất hai** đại lượng cùng đơn vị
đem so. N1 **không** đưa đại lượng nào — không mẫu số cho GĐ-5, và không mẫu số cho cái nó vượt.
**Phép so cùng-đơn-vị duy nhất hiện có trên đĩa** — cả hai đều tính trên **8 bước làm của thư chính**:
| GĐ | Tử/mẫu | Tỉ lệ | Nguồn |
|---|---|---|---|
| **GĐ-2** | **5,56 / 8** | **6975 %** | N2 đếm độc lập, `sub-review-n2-S180.md:82` (liệt từng bước: `(i)✓ (ii)nửa (iii)✓ (iv)nửa (v)✓ (vi)2/4 (vii)2.5/3 (viii)✗`) |
| **GĐ-5** | **5,33 / 8** | **67 %** | lane này, §2 bảng kiểm chéo |
⇒ **Trên cùng một thước, GĐ-2 ≥ GĐ-5.** Câu *"GĐ-5 gần xong nhất"* **không được dữ liệu đỡ**;
tốt nhất là hoà với GĐ-2 trong sai số, xấu nhất là **xếp sai thứ tự**.
**Hai lý do khiến câu này còn nguy hơn một con số lệch:**
1. **Bằng chứng chống lưng chính của nó vừa sập.** N1 dựng "gần xong nhất" trên 5 gạch đầu dòng
(`:137-143`), mà gạch nặng nhất — `spawn-model-audit` *"đo thật 0-mismatch"* — nay đo lại là
**0/17 lane của phiên hiện tại** (§1). Bỏ gạch đó ra, GĐ-5 tụt tiếp.
2. **Nó điều khiển thứ tự wave.** `run.md:41` đã chép "gần xong nhất" vào bảng bậc-trưởng-thành, và
N1 `:243` từ đó suy ra *"W5 … Nhẹ, có thể ghép W2"* — mà N2 `:19-20` đã bác vì vi phạm
**điều-kiện-vào GĐ-5** (`thu-chinh:220` đòi GĐ-2 *đã thi công*) **lẫn OD-2**. Nhãn lạc quan →
xếp lịch sai. Tôi **không** đề xuất lại phương án ghép đó.
🟢 **Công bằng với N1:** bản đồ N1 là bản đồ tốt và N2 đã đo ~60 phép mà không claim nào đổ
(`sub-review-n2-S180.md:128`). Chỗ hỏng **không phải** các claim thành phần — **từng claim đều đứng**.
Chỗ hỏng là **phép cộng chúng lại thành một thứ hạng**. Đúng lớp bệnh sổ nhớ SE gọi là
*meta-count self-coverage blind-spot*: đo tốt, **đếm-về-tổng** thì sai.
**Đề xuất câu thay (propose-only):** bỏ hẳn chữ "gần xong nhất"; thay bằng
*"GĐ-5 ≈ 5,33/8 bước (67 %), ngang GĐ-2 (5,56/8) trong sai số; phần còn thiếu của GĐ-5 nằm ở khoản
CHỐNG-LƯNG (máy soát) nên rủi ro cao hơn phần còn thiếu của GĐ-2 vốn chỉ là công cụ cộng thêm."*
---
## §4 — HAI MÓN N1 NÓI CÒN THIẾU: hub đòi CHÍNH XÁC gì, SE dựng tới đâu
### (a) Sổ khung-nhìn lượt chạy đắt
**Hub đòi 6 vế** (`thu-chinh:226` + `phu-luc:316`), liệt từng vế, không nén thành khoảng:
1. Là **khung nhìn**, KHÔNG phải đường dẫn thứ hai (`phu-luc:308`).
2. Năm cột: **thời điểm · loại · đề bài · con trỏ vật chứng · kết luận**.
3. **Ghi dòng ngay lúc dựng thư mục.**
4. **Dòng sống kể cả khi lượt chết giữa chừng.**
5. Vật chứng **chung gốc** với mọi lượt chạy khác.
6. Thiếu tệp ở lượt đắt = **mức nghiêm trọng cao nhất**.
**SE dựng tới đâu:** vế 1 và 5 **ĐÃ ĐẠT trước cả khi có sổ** (`runs/` là gốc duy nhất — D-13).
Vế 3 có **hành vi** tương đương (`hmw.js:9` scaffold @P1). Vế 4 có **bằng chứng hành vi** mạnh
(7/7 vai #53 recover, 0 byte mất). **Vế 2 và vế 6 = 0.** Bản thân **cuốn sổ = 0** (0-hit, control-dương
6 tệp). Dữ liệu để dựng thì **đã nằm sẵn**: `runs/` + dấu `[engine:` trong nhật ký vai (**8 tệp** có
dấu này — `grep -rl "\[engine:" .claude/agent-memory/`) + chuỗi WAL.
⇒ **Hình dạng đúng của món này = một lượt DERIVE, không phải một cuốn sổ chép tay.** Chi phí thấp.
🔴 Nhưng chỗ **đặt** nó là quyết định của anh: đặt sai thành **nguồn-đôi** với WAL/`runs/` — đúng rủi ro
N1 `:211(c)` đã nêu cho sổ GĐ-4.
### (b) Luật truyền-nguyên-văn
**Hub đòi 3 vế** (`thu-chinh:223`, `phu-luc:300`): điều phối **chỉ đóng gói** · lời thô **đi nguyên
khối** · **có rào** đánh dấu vùng nguyên văn. Cộng luật rút ra số 5 (`thu-chinh:295`):
*"Lời chủ dự án truyền nguyên văn, cấm đi qua bộ não trung gian."*
**SE dựng tới đâu — và đây là chỗ N1 khai SAI CHIỀU:**
N1 `:148` viết *"SE chưa có luật thành văn + chưa có rào-nguyên-văn"*. **Cả hai vế đều có.**
`pause.md:53` là luật thành văn, có rào (`> anh:`), có cả nhánh khai-thiếu (`(THIẾU — lý do)`), có cả
lệnh cấm dựng-lại-từ-trí-nhớ. `session-start.md:98` nhắc lại cho `_context-s-<N>.md`.
**Cái THẬT SỰ thiếu, hẹp hơn nhiều:** luật đó phủ **lane LƯU TRỮ** (ghi vào sổ mạch việc), **không phủ
lane DISPATCH** (đóng gói lời anh gửi vào prompt của vai đắt) — mà lane dispatch mới đúng là cái
GĐ-5 nói tới.
🔬 **Phép đo tự-quy-chiếu, chạy trên chính lượt này:** prompt dispatch của lane D chứa **0** khối
`> anh:` nguyên văn; toàn bộ đề bài là **chữ của lead** (*"N1 nói GĐ-5 là chỗ SE gần xong nhất"*,
*"2 món N1 nói GĐ-5 còn thiếu"*). Tôi là **dụng cụ đo**, và kết quả là: lời anh **đã đi qua bộ não
trung gian** trước khi tới vai chạy model đắt. Đúng thứ `thu-chinh:295` cấm.
🔴 Và đây là **LỚP-2 của hub** (*thợ rèn không có dao*) tái diễn: lượt đi kiểm luật-truyền-nguyên-văn
**chính nó** vi phạm luật đó.
🔴 **CẤM TUYÊN MẠNH — nhắc lại đúng nấc hub tự khai:** `thu-chinh:62` (iii) ghi cưỡng chế nguyên văn
ở hub đang **"BỎ QUA CÓ KHAI, chưa phải ĐÃ CHỨNG MINH"**. ⇒ SE **cấm** viết "đã chứng minh" cho khoản
này. **Kiểm N1 có lỡ tuyên vượt nấc không:** N1 `:148` viết *"hub tự khai cơ chế của chính họ đang
'bỏ qua có khai' ⇒ adopt mức LUẬT-THÀNH-VĂN trước, máy sau"* — **N1 ĐÚNG NẤC, không vượt.**
Lỗi của N1 ở khoản này là **bi quan sai về SE**, không phải lạc quan sai về hub. Ghi rõ để wave sau
đừng đi dựng lại cái đã có.
---
## §5 — TC-07 + luật tự-trị ba bậc: xác nhận số mục, và SE CÓ MẮC không
### §5.1 — Xác nhận N2 F-07b: số mục là **(vi)**, không phải (vii)
Đo trực tiếp trên phụ lục (`sed -n '202,205p'`):
- **`phu-luc:202` = (vi)** — *"**Tiền kiểm KHÔNG BAO GIỜ đứng chờ chỉ thị.** Đây là luật tự trị ba bậc:
bằng chứng rõ thì tự vá và khai lại · mơ hồ thì chọn nhánh an toàn…"*
- **`phu-luc:204` = (vii)** — *"**Guard vắng tệp phải là vị từ máy**…"*
⇒ **N2 F-07b ĐÚNG.** N1 `§7.1` gọi tự-trị-3-bậc là "(vii)" là **con trỏ sai**; nội dung claim đúng.
🔸 Lưu ý phạm vi: khoản này nằm ở **GĐ-3**, không phải GĐ-5 — nhưng nó là **thuốc của TC-07** nên
lane D phải bóc.
### §5.2 — SE CÓ MẮC TC-07 KHÔNG? — **CÓ, dạng nhẹ, và nguyên nhân là cấu trúc**
**Định nghĩa bệnh** (`thu-chinh:82`): *"Chủ dự án mở và đóng phiên lúc rảnh, không ngồi ra chỉ thị
được; quay lại thấy máy **đứng chờ**."*
**Ca sống, đo trên đĩa ngay phiên này** (`grep -n "chờ anh" .claude/WAL.md`, control-dương: cùng tệp
đọc được, tổng **27 dòng**):
| WAL | Nguyên văn | Đọc ra |
|---|---|---|
| `:4` | `goal: bootstrap S180 + bookend @open 5 vòng ĐÓNG; chờ anh chọn việc chính` | máy dựng xong nền rồi **dừng** |
| `:16` | `next: chờ anh chọn (a) áp 4 thư upgrade-pack-phased / (b) dọn nợ governance / (c) việc sản phẩm` | **đứng chờ chỉ thị**, đúng chữ TC-07 |
**Phán: đây là "đứng chờ" hay "hỏi đúng việc hệ trọng"?** Đem áp **lằn ranh đỏ** mà chính hub liệt
(`khuon…:304`, A6): *đổi lược đồ dữ liệu · xoá dữ liệu · việc hướng ra ngoài · việc không lùi được ·
việc dính tiền*. Câu hỏi ở `WAL:16` là **chọn hạng mục việc để làm tiếp** — **không rơi vào ô nào**
trong năm ô đó. Cả ba lựa chọn (a)(b)(c) đều **lùi được**, đều **không dính tiền**, đều **không hướng
ra ngoài**. ⇒ Theo đúng thước của hub, đây là **đứng chờ**, không phải hỏi-hệ-trọng.
⇒ **SE MẮC TC-07.** Không nặng — máy **khai rõ** mình đang chờ (`next:` có ghi), tức là *đứng chờ CÓ
KHAI* chứ không phải treo câm. Nhưng khai xong vẫn là đứng.
**Nguyên nhân cấu trúc — và nó nối thẳng về GĐ-4, không phải GĐ-5:**
SE **có** uỷ quyền thường trực, nhưng **chỉ theo từng lát**, không có mục tổng:
`commands/session-end.md:82` — *"🔓 **UỶ-QUYỀN THƯỜNG-TRỰC** (owner slot (71) @S172, nguyên văn:
*'gom và sleep thì auto nhé, tự quyết'*) — GOM (harvest) và NÉN-NGỦ từ nay là AUTO, lead TỰ QUYẾT,
KHÔNG hỏi từng lần."*
Đây là **đúng khuôn hub muốn** (lời anh nguyên văn + phạm vi + cấm hỏi lại) — nhưng phủ **đúng hai
việc**: gom và ngủ. Không có mục *"tự trị khi chủ dự án vắng"* ở dạng tổng quát — mà đó chính là
**mục mồi thứ hai** hub đòi ở GĐ-4 bước 3 (`thu-chinh:201`).
⇒ **Kết luận nối hai giai đoạn:** TC-07 của SE **không chữa được ở GĐ-5**. Thuốc nằm ở **GĐ-4**
(mục sở-thích-thường-trực cho phép tự trị + lằn ranh đỏ liệt kê) và **GĐ-3** (luật tự trị ba bậc,
`phu-luc:202`). Mà GĐ-4 đúng là ô N1 xếp **hổng nhất** (`run.md:45`). Hai lane khớp nhau độc lập.
🔸 **Giữ nguyên nhãn hub, không tự chế số:** `thu-chinh:92` dán TC-07 = ***chưa có dụng cụ***.
SE cũng **0 bộ đếm đứng-chờ**. Tôi phán được **có bệnh** (bằng 2 dòng WAL), **không phán được tần
suất**. Ai muốn số thì phải dựng bộ đếm trước — **CHƯA ĐO, và cấm điền số ước.**
---
## §6 — GĐ-6: BÓC TỪNG KHOẢN (mẫu số E = 17) + ĐIỀU KIỆN VÀO
### §6.1 — Điều kiện vào: N1 nói "chưa thoả" — **ĐÚNG KẾT LUẬN, nhưng lý do yếu hơn sự thật**
**Hub** (`thu-chinh:242`): *"**Điều kiện vào:** mọi giai đoạn nằm trong phạm vi `áp dụng` của **bản đồ
áp dụng nhà bạn** đã ở nấc *đã thi công*."*
**N1** (`sub-invest-fitmap-S180.md:165`) ghi: *"MỌI GĐ trong phạm-vi-áp-dụng đã thi công — XA NHẤT,
đúng thiết kế."*
🔴 **Lý do thật nặng hơn thế.** Điều kiện vào GĐ-6 tham chiếu tới **bản đồ áp dụng bảy dòng** — và
**vật đó chưa tồn tại trên đĩa SE**: đó chính là khoản **A0-4** (`khuon…:266`), thuộc **GĐ-0**, mà
GĐ-0 còn chưa đóng (N1 `:46` xếp GĐ-0 *"gần đóng"*, và `:58` đo được **A0-3 hụt** —
`grep "upgrade-pack-phased" broadcasts/_index.md` = **0 hit**, control `harness-22` = 3).
⇒ Trạng thái đúng của điều-kiện-vào GĐ-6 **không phải** *"chưa thoả"* mà là
**"chưa ĐÁNH GIÁ ĐƯỢC — thiếu vật tham chiếu"**. Khác biệt có hậu quả: *chưa thoả* gợi ý "cứ làm các
GĐ khác rồi tự khắc thoả"; *chưa đánh giá được* nói rõ **phải đẻ bản đồ áp dụng trước**, nếu không thì
tới lúc mở GĐ-6 vẫn không ai biết "mọi GĐ trong phạm vi áp dụng" là những GĐ nào.
📌 Đây là **một khoản vào wave W0**, không phải wave cuối.
**Kết luận cho câu hỏi của đề bài:** N1 nói SE chưa động GĐ-6 và đó là **đúng thiết kế** — tôi **xác
nhận**, và **không** đề xuất kéo sớm bất kỳ phần nào của GĐ-6. OD-2 giữ nguyên.
### §6.2 — Bảng 17 khoản
| # | Khoản hub (neo) | SE | Bằng chứng |
|---|---|---|---|
| **E-1** | Cổng đồng bộ **4 tầng** chạy + **dán kết quả**, mỗi tầng *khớp*/*lệch đã khai* (`thu-chinh:244`, `phu-luc:343`) | **THIẾU** | Họ hàng có (drift-audit tháng, ring1/ring2) nhưng là **doc-drift + lead-claim audit**, không phải trace ý-tưởng→spec→việc-thật (N1 `:159`) |
| **E-2** | **Trace xuôi**: mảnh → đặc tả → giai đoạn → vật chứng (`phu-luc:349`) | **THIẾU** | — |
| **E-3** | **Trace ngược**: trên đĩa mà không truy được về đặc tả = **phạm vi tự phình**, liệt từng khoản (`thu-chinh:245`, `phu-luc:350`) | **THIẾU** | — |
| **E-4** | **Đối chiếu ba chiều** bảng bệnh: bệnh → thuốc → bằng chứng (`phu-luc:351`) | **THIẾU** | §2 của N1 là **phôi** (12 TC × bằng chứng), chưa có chiều "thuốc" |
| **E-5** | Soi lệch đặc tả ⟂ đĩa, đặc biệt khoản **áp một nửa** (`phu-luc:352`) | **THIẾU** | — |
| **E-6** | **Phán theo mức chặn**, không gộp một cục (`phu-luc:353`) | **THIẾU** | Xung đột nền: doctrine SE `exit-0-advisory` (`governance-detectors.ps1` *"Exit 0 always"*) — N1 `:49` xếp đây là xung đột triết lý |
| **E-7** | Số kỳ vọng cổng điểm danh **suy từ độ dài danh sách**; quét kho tìm số cũ viết cứng (`thu-chinh:246`, `phu-luc:355`) | **NỬA** | ĐẠT ở **một** cổng, đo được hôm nay: `spawn-model-audit` khối C/D suy **26** từ `.claude/agents/*.md` trừ README, cross-check canonical `STATUS.md:478` = 26 ⇒ **khớp**. Chưa phủ **mọi** cổng; N1 `:160` |
| **E-8** | Bài kiểm **ghim liệt kê từng TÊN**, không ghim con số (`thu-chinh:246`, `phu-luc:355`) | **CHƯA ĐO** | Cần: đọc các bài kiểm/cổng roster xem ghim tên hay ghim số. **Lệnh đề xuất:** `grep -rn "VALID_ROLES\|informRoles" .claude scripts tests` rồi soi từng chỗ. **KHÔNG PHÁN** khi chưa chạy |
| **E-9** | **Phép thử đột biến**: bỏ 1 tên ⇒ **nhiều hơn một** bài kiểm đỏ (`thu-chinh:246`, `phu-luc:355`) | **THIẾU** | N1 `:160` *"mutation-test cho cổng roster: KHÔNG CÓ"* |
| **E-10** | **Điều kiện vào danh sách** — vai chỉ vào cổng khi **cùng một commit** đủ 4 vế: tệp vai · thư mục ký ức · chỗ gọi ở **CẢ HAI** cửa · tập đăng ký (`thu-chinh:247`, `phu-luc:357`) | **NỬA** | Vế 1+2 đo được **ĐẠT hôm nay**: `ls .claude/agents/*.md` trừ README = **26**, `ls .claude/agent-memory/` (trừ `memory-budget.json`) = **26** ⇒ **26/26 vai có thư mục ký ức, 0 lệch**. Vế 3 (chỗ gọi 2 cửa) + vế 4 **CHƯA ĐO**. Luật thành văn ràng 4-vế-1-commit: **THIẾU** |
| **E-11** | **Bộ đăng ký sửa trọn gói** — liệt trước mọi chỗ máy đếm vai, sửa hết 1 commit (`phu-luc:359`) | **THIẾU** | Luật chưa thành văn. SE có ca cùng lớp: `"17/17"` hardcode stale (`hmw.js:57` comment) — N1 `:185` |
| **E-12** | Chạy lại **đối chứng đặt tên hai chiều + phản chứng** (`thu-chinh:248`) | **THIẾU (bị chặn ngược)** | Phụ thuộc GĐ-1 (**chuẩn đặt tên duy nhất**) mà N1 `:44` xếp GĐ-1 = **chốt MỞ KHOÁ, chưa có** |
| **E-13** | **Bảng gốc**: mỗi TC 1 dòng, **mỗi ô số kèm lệnh tái lập**; chưa đo ghi thẳng `KHÔNG ĐO ĐƯỢC` (`thu-chinh:249`, `phu-luc:361`) | **THIẾU** | §2 của N1 là **phôi 12 dòng có bằng chứng**, nhưng **không phải** bảng gốc: thiếu cột *đại lượng đo* + *ngày đo*, và nhiều ô **không kèm lệnh tái lập** |
| **E-14** | **Bản nháp dấu** trạng thái *chờ ký*, **mã dấu để trống** cho chủ điền (`thu-chinh:250`, `phu-luc:363`) | **ĐỦ** | `.claude/governance/ACTIVE-MARKS.md` — schema `RC-pqhuy1987-dd-mm-yyyy-hh-mm-ss`, và luật **đúng ngữ nghĩa hub**: *"**Binding (P3):** có stamp = **LỆNH** · không stamp = đang **BÀN**"*. Người thi công **không tự cấp dấu** |
| **E-15** | **Quét đồng bộ tài liệu**: liệt danh sách trước rồi **tick từng cái** (`thu-chinh:251`, `phu-luc:365`) | **NỬA** | Khuôn tick-list có trong nghi thức drift-audit (`rules.md §6.4/§9.4`, dẫn qua `CLAUDE.md:121`); chưa có danh sách chốt cho gói này |
| **E-16** | **Báo cáo cuối** gửi hub; nấc *đã được kiểm chứng* chỉ flip **sau khi hub soi** (`thu-chinh:252`) | **THIẾU** | Chưa có báo cáo nào cho gói này (GĐ-0 chưa đóng) |
| **E-17** | Quét **rò rỉ đặc thù nội bộ** trên bản gửi ra ngoài = **không hit**, + khai chạy **máy hay tay** (`phu-luc:387`, A16 `khuon…:366`) | **NỬA** | Văn hoá khai **có thật và mẫu mực**: khối E của `spawn-model-audit` tự khai 6 điều nó KHÔNG nói, gồm *"Nothing here blocks a spawn"*. **Bảng A16 hợp nhất chưa có** (N1 `:163`); máy quét rò rỉ chưa có |
**Tử số GĐ-6:** ĐỦ = E-14 (**1**) · NỬA ×4 (E-7, E-10, E-15, E-17) = **2,0** · CHƯA ĐO ×1 (E-8, tính 0
và **khai rõ**) · THIẾU ×11 = 0.
> ### 🔢 **GĐ-6 = 3,0 / 17 (18 %) nới · 1 / 17 (6 %) nghiêm ngặt**
**Đọc con số này cho đúng:** 18 % **không phải điểm kém** — GĐ-6 là giai đoạn **niêm phong**, theo
thiết kế nó chỉ mở khi mọi GĐ khác xong. Con số thấp ở đây là **bằng chứng SE đang tuân OD-2**, không
phải bằng chứng SE chậm. Cái đáng chú ý ngược lại: **E-14 đã ĐỦ từ trước** (RC-mark) và **E-7 đã đạt ở
một cổng** — tức SE có sẵn hai mảnh của GĐ-6 mà **không phải đi mượn hình thức của hub**.
---
## §7 — VƯỢT KHUNG (cần anh quyết, lane này KHÔNG tự chốt) — **3 khoản**
1. **Chỗ đặt sổ lượt-chạy-đắt** (§4a). Derive được, nhưng đặt ở đâu để **không thành nguồn-đôi** với
`runs/` và WAL là quyết định kiến trúc. Cùng lớp rủi ro N1 `:211(c)` nêu cho sổ GĐ-4.
2. **Luật truyền-nguyên-văn ở lane DISPATCH** (§4b). Áp nó nghĩa là **lời anh gõ phải được chép nguyên
khối vào prompt của vai đắt**, kèm rào. Điều này **đổi cách anh ra lệnh** (anh phải chấp nhận lời
mình đi thẳng, lead không được tóm gọn) ⇒ **anh quyết, không phải lead quyết**.
3. **GĐ-6 điều-kiện-vào-danh-sách trọn-gói-1-commit** (E-10). Đụng roster + chỗ gọi ở **cả hai cửa
phiên**. `phu-luc:357` gọi đây là *"luật đắt nhất của giai đoạn"* và cảnh báo **nâng sớm là tự khoá
cửa ra của chính mình** — hub đã giẫm thật. **Không chạm trước khi có bản đồ áp dụng.**
🔸 **KHÔNG tính là vượt khung:** vá `spawn-model-audit` (§1). Đó là **sửa lỗi thường**, em-main làm
được, không cần anh. Đừng để nó bị đẩy vào hàng chờ owner rồi nằm đó.
---
## §8 — TỔNG KẾT LANE D
| Trục | Kết quả |
|---|---|
| **GĐ-5** | **13,0 / 20** (65 %) nới · **9 / 20** (45 %) nghiêm · hội tụ 3 mẫu số 6067 % |
| **GĐ-6** | **3,0 / 17** (18 %) nới · **1 / 17** (6 %) nghiêm · điều-kiện-vào **chưa đánh giá được** |
| **"GĐ-5 gần xong nhất"** | **KHÔNG ĐỨNG** — GĐ-2 (5,56/8) ≥ GĐ-5 (5,33/8) trên cùng thước |
| **Vượt khung** | **3** |
| **Lỗi máy tìm được** | **1 MAJOR** (`spawn-model-audit` mù 17/17 lane phiên hiện tại, vẫn in `0 mismatch` + `TOTAL FLAGS: 0`) |
| **Đính chính N1** | 2 (rào-nguyên-văn **có** — N1 bi quan sai · "gần xong nhất" — claim xếp hạng không mẫu số) |
| **Đính chính N2** | 0 — F-07b và F-09 đều **xác nhận đúng** |
| **Đính chính lệnh lead** | 1 (chiều mù bị viết ngược — xem §1-bis(c)) |
| **Đính chính chính tôi** | 1 (con trỏ `:250-253` → `:251-254`) |
**Khoản khai `CHƯA ĐO` — có tên, có lệnh, không giấu:**
1. **E-8** bài kiểm ghim tên hay ghim số — cần soi từng cổng roster.
2. Tỉ lệ phiên đi **đường Workflow****đường Agent** trong lịch sử kho (§1-quater).
3. **E-10** vế 3 (chỗ gọi ở cả hai cửa) + vế 4 (tập đăng ký).
4. Tần suất TC-07 — **không tồn tại dụng cụ**, giữ nguyên nhãn chữ của hub.
**END sub-n3-lane-d-gd56 — VERDICT: GĐ-5 13,0/20 · GĐ-6 3,0/17 · 3 vượt-khung · 1 MAJOR máy-mù · "gần xong nhất" BÁC.**

View File

@ -95,3 +95,71 @@ T4 nặng hơn T1-T3 vì T1-T3 nằm ở cột **"Ví-dụ SE"** (minh hoạ, c
- 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.
### §1.5 — LỚP-8 (nhãn "đã đóng" hẹp hơn phạm vi) — **GIỮ, và lỗ THỦNG ĐÃ TO GẤP ĐÔI SAU KHI ĐÓNG**
Lead khai: slot **(70)** `~~ĐÓNG @S179~~` ở `docs/HANDOFF.md:50` mà rider lỗi máy H24-2 ở `:51` còn sống. **Đúng — nhưng lead khai NHẸ hơn sự thật.**
**(1) Nhãn đóng, có thật:** `docs/HANDOFF.md:50` = *"~~(70) Tách 2 sổ đếm H24 — trung thực đang XOÁ streak~~ ✅ ĐÓNG @S179"*, đóng dựa trên bằng chứng đĩa `scripts/h24-signal-write.ps1` mang `slot 70` ở 3 chỗ (`:66` `:164` `:247`).
**(2) Rider ở `:51` mô tả một lỗi MÁY KHÁC, không nằm trong phạm vi cái được đóng:** detector **H24-2 dựng segment từ `marks[0]`** ⇒ mọi thứ nằm TRÊN marker đầu tiên không bao giờ được đọc.
**(3) Lỗi đó CÒN SỐNG trong mã, đo được — `scripts/governance-detectors.ps1:892-897`:**
$marks = [regex]::Matches($raw, '(?m)^\*\*(?:[^\x00-\x7F]+\s*)?NEXT\s+(?:anh|em)\b')
$segs = @()
$start = $marks[$i].Index # <-- segment DAU bat dau o marks[0]
$end = if ($i+1 -lt $marks.Count) { $marks[$i+1].Index } else { $raw.Length }
$segs += $raw.Substring($start, $end - $start) # <-- phan TREN marks[0] boc hoi
**(4) Đo LỖ THỦNG HÔM NAY (HEAD `55894a0`) — tái lập bằng CHÍNH regex của detector:**
| đại lượng | rider khai @S179 | **đo lại @S180 (lane E)** |
|---|---|---|
| dòng marker đầu tiên khớp regex | `:90` | **`:172`** |
| vùng KHÔNG BAO GIỜ ĐỌC | L1-89 | **L1-171** (trên tổng **572** dòng = **30% đầu file**) |
| số slug carry bị nuốt | **12** | **25** (trên tổng **54** key phân biệt = **46%**) |
| control-dương | — | `[carry:` xuất hiện **289** lần trong file ⇒ thước sống, 0-hit không do regex chết |
⇒ **Sau khi dán nhãn ĐÓNG, lỗ thủng KHÔNG đứng yên — nó to gấp đôi.** Đúng chữ hub: *"hai phạm vi lệch nhau là đường thoát, và đường thoát thì sẽ có người đi qua."*
🔴 **Đòn hồi quy đẹp nhất — trong 25 key bị nuốt CÓ `tools-whitelist-no-teeth`.** Cỗ máy đo tuổi carry **không nhìn thấy** chính cái carry ghi rằng "có cưỡng chế được tuyên mà không có răng". LỚP-2 ở cấp **MÁY**, không phải cấp vai. Trong 25 key bị nuốt còn có `harvest-no-s168-s171` ⇒ nợ harvest ở §1.2 cũng nằm trong vùng mù.
25 key bị nuốt (đủ danh sách, đo đượ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`.
🔸 **Sắc thái phải khai (bẫy thước):** regex đòi `^\*\*` (đậm, đầu dòng). Marker `### 🔵 NEXT em @S179` ở `HANDOFF:29` là **heading `###`, KHÔNG khớp** ⇒ ai đo bằng `grep -n "NEXT em"` sẽ ra `:29` rồi kết luận lỗ chỉ 28 dòng — **sai 6 lần**. Phải đo **bằng chính regex của detector** (đúng bài học `feedback_faultinjection_proves_teeth`). Con số đúng là **:172**.
### §1.6 — LỚP-9 (cưỡng chế tuyên mà chưa có máy) — **LEAD SAI THÊM MỘT MÓN: 2/3 ĐỔ, KHÔNG PHẢI 1/3**
Lead đã tự hạ 3 → 2 món sau khi N1 bác `pull_warn_days`. Lane E đo nốt 2 món còn lại, đúng chỗ N1 tự khai *"chưa đo lại 2 món kia"*:
| món lead giữ | lane E đo | verdict |
|---|---|---|
| `session_ctx_kb` **0-reader @S146** | `.claude/agent-memory/memory-budget.json:8` `_session_ctx_kb_reader` = *"🔄 GHOST-WIRE **DONG @S153** 2026-07-26 (adopt `0df10df4` T7): reader THAT dau tien = `scripts/session_ctx.py`"*. Kiểm mã: `scripts/session_ctx.py:528` *"aux-8: the FIRST REAL READER of session_ctx_kb (closes the H18 ghost-wire)"* + `:563` `caps = _require_budget_kb(repo_root, ['session_ctx_kb'])` = **fail-loud require**, không phải đọc cho vui. Thêm 2 consumer: `.claude/commands/pause.md:55` (*"Vượt `session_ctx_kb` ⇒ distill"*) · `session-start.md:120` | 🔴 **BÁC — stale ~27 phiên.** Ghost-wire ĐÃ ĐÓNG @S153 |
| `tools-whitelist-no-teeth` | Có thật, và **SE đã tự khai ≥7 chỗ**: `ctx-audit.md:102` · `ctx-curator.md:46` · `ctx-verifier.md:42` · `ring1-audit.md:57` · `back-end-reviewer-style.md:133` · `front-end-reviewer-style.md:142` · `database-reviewer-style.md:135` — cùng một câu: *"`tools:` khai không Write/Edit = **MÔ-TẢ Ý-ĐỊNH**, không phải cơ-chế chặn; backstop THẬT = git-diff commit-gate"* | ✅ **GIỮ là CA**, nhưng **đã vá đúng thuốc hub** (vá LỚP-9 = *"hoặc viết máy, **hoặc khai thẳng là chạy tay**"*) ⇒ **KHÔNG phải vết thương hở**, N4 đừng mở wave cho nó |
🔴 **Hệ quả cho lead:** `session_ctx_kb` đổ **đúng cùng kiểu** với `pull_warn_days` đã đổ — *khai trạng-thái-quá-khứ bằng thì hiện-tại*. Hai lần cùng một lỗi trong cùng một ô bảng ⇒ không phải xui, mà là **LỚP-5 tác động lên chính bảng chẩn đoán LỚP-9**. Khuyến nghị N4: mọi ô "ghost-wire" phải **neo bằng LỆNH ĐO**, không bằng tên món.
**LỚP-9 có còn giẫm không? CÓ**, nhưng phải lấy ca khác: `feedback_dryrun_finds_promised_but_unlanded` (S168) — *command chỉ sống trong comment, sống sót 8 wave + 8 gate + 8 cicd + 644 test; guard-chặn-không-có-đường-ghi = chết câm*. LỚP-9 thuần, chưa-khai, và **do dry-run bắt** ⇒ SE có thuốc (dry-run) nhưng không có máy canh thường trực.
### §1.7 — Năm lớp còn lại (1 · 3 · 4 · 5 · 7): GIỮ nguyên verdict lead, không có gì để bác
| LỚP | ca đứng vững | ghi chú lane E |
|---|---|---|
| **1** | #53-family 7 vai/phiên S180 (nay là **10**, xem §2) | thuốc SE = scaffold trước spawn, ĐANG trả lãi |
| **3** | `ring1` 32Đ/6T · N2 trả `PASS_WITH_FIXES 0C/5M/6m` ngay trong chuỗi này | **SE đã cấu trúc sẵn vòng vá** (N1→N5) ⇒ đúng thuốc hub, KHÔNG cần wave |
| **4** | `governance-detectors.ps1` tự khai *"Exit 0 always (never fails build)"* — 49 cờ vẫn exit 0 | xung đột triết lý với GĐ-3 hub (N1 + N2 F-10 đã nêu) |
| **5** | `STATUS:8` mega-line nhiều số stale; luật B1 có mà vẫn trôi | **và B1 tự cài bằng neo LỚP-6 — xem §1.1** |
| **7** | N1 hạ cánh 7.049 B / 6-của-9-mục placeholder sau 202K token | xem §2 ca (a) |
---
## §2 — BA CA MỚI SINH TRONG CHÍNH CHUỖI N1→N2→N3
| ca | đo được | thuộc lớp | vì sao đáng ghi |
|---|---|---|---|
| **(a) N1 skeleton nấc-2** | 7.049 B trên đĩa, **6/9 mục `[ĐANG ĐO]`**, sau **202K token / 27 tool-use / 545 s**; ruột thật `grep -vE '^#{1,4} \|^\s*$' \| wc -l` = **27 dòng / 10 heading** ⇒ ~15% giá trị | **LỚP-7** ∩ **LỚP-2** (bản đồ về lớp lỗi tự giẫm chính lớp nó đang lập bản đồ) | 🔴 **guard "verify BYTE tăng" MÙ HOÀN TOÀN** — byte > 0 và đang tăng. Vị-từ phải đo **NGỮ-NGHĨA ruột**. Đây là **phản-chứng chạy được** cho chính vá LỚP-7 của hub (*"so số ký tự với nguồn cùng đơn vị"*): SE **không có nguồn cùng đơn vị** ⇒ theo luật hub phải ghi **"không đo được"**, vị-từ thay thế = **tỉ lệ dòng-thật / heading** |
| **(b) N2 xử số-lệch bằng "tuyên một bên thắng"** | `runs/`: **88 dir** ⟂ **90 entry** ⟂ **85 có `run.md`** · `auto-memory`: **61 file** ⟂ **60 memory** | **LỚP-2** (vai phản-biện-lỗi-đo giẫm đúng lỗi-đo) ∩ **bẫy đơn-vị** y hệt `harvest-curator` F-05 §1.2 | Ba số **không mâu thuẫn** — chúng đếm **ba CÁI KHÁC NHAU**. Tuyên "bên nào thắng" là **xoá thông tin**: chênh 9085 = **5 run-folder KHÔNG có `run.md`** chính là **TC-04 đang chảy máu**, và nó **biến mất** khỏi báo cáo ngay khi chọn một con số. Tương tự 6160 = **1 file không phải memory** (nhiều khả năng `MEMORY.md` index) = thông tin, không phải lỗi. ⇒ **luật lane E: hai số lệch thì hỏi "đếm CÁI GÌ" TRƯỚC, và GIỮ CẢ HAI kèm đơn-vị** |
| **(c) chính lane E này** | lượt-1 chết khi đĩa mới giữ được phần đầu; 123K token / 33 tool-use rồi return = mô-tả-ý-định | **LỚP-1**#53 | Vai thứ **10** dính trong một phiên ⇒ **#53 ở SE không phải sự cố, nó là NỀN** — đúng cấu trúc LỚP-3 của hub (*"lần đầu KHÔNG ĐẠT là mặc định"*) nhưng ở trục **hạ cánh vật chứng**. Datum mạnh nhất cho **TC-04** trong cả gói |
🔴 **Điểm chung mà N4 phải dùng để xếp wave:** cả ba ca đều **lọt qua mọi guard hiện có** vì guard đo **sự TỒN TẠI** (byte > 0 · file có mặt · số có mặt) chứ không đo **nội dung có NGHĨA**. Wave GĐ-2 nếu chỉ thêm "kiểm tệp có mặt" thì **không chữa được ca nào trong ba ca này**.

View File

@ -0,0 +1,446 @@
# 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.