# N3 — LANE A / 6: GĐ-0 (Tiếp nhận + bản đồ áp dụng) · GĐ-1 (Nền chuẩn đặt tên)

- **Phiên:** S180 · **Vai:** reviewer (`/fable-clone reviewer`) · **Ngày:** 2026-08-07
- **Chế độ:** read-only, propose-only. Ngoài tệp này KHÔNG ghi/sửa tệp nào khác.
- **Ghi đĩa liên tục** (chống #53): mỗi khoản chốt xong append ngay, không đợi cuối.

## §0 — Nguồn đã đọc TRỰC TIẾP (không qua tóm tắt)

| Món | Đường dẫn | Byte | Phần đã đọc |
|---|---|---|---|
| Thư chính | `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-thu-chinh.md` | 33.156 | dòng 24-178 (gồm §Khai-trạng-thái · §Bảng-bệnh · §Luật-chung · §GĐ-0 :109-126 · §GĐ-1 :130-147) |
| Phụ lục spec+bẫy | `…-phu-luc-spec-pitfall.md` | 46.416 | dòng 20-164 (gồm §Chín-lớp-lỗi · §GĐ-0 :64-89 · §GĐ-1 :93-137) |
| Khuôn+checklist | `…-khuon-fit-map-report-checklist.md` | 30.502 | Phần A :29-59 · Phần C :228-385 |
| Luật chấm điểm | `…-luat-cham-diem.md` | 9.970 | (món 4 — chỉ dùng để đếm "bốn món", không thuộc lăng kính lane A) |

Vật tham chiếu trong run-folder: `sub-invest-fitmap-S180.md` (48.433 B) · `sub-review-n2-S180.md` (22.418 B) · `spec-adap-upgrade-pack-phased-07-08-2026.md` (7.550 B) · `run.md` (10.603 B).

---

## §1 — GĐ-0: bóc TỪNG KHOẢN (18 khoản, không gộp)

Hub đòi GĐ-0 ở **bốn nơi khác nhau**, và bốn nơi đó **không trùng khít nhau**. Tôi liệt cả bốn, đánh số riêng từng nơi, rồi mới nói chỗ chồng lấn. Gộp bốn nơi thành một danh sách là chính cái làm rơi khoản.

- Nơi 1 — thư chính `:112-119` — **7 bước làm** (`G0-B1..B7`).
- Nơi 2 — thư chính `:121-125` — **3 lệnh "kiểm xong chưa"** (`G0-K1..K3`).
- Nơi 3 — Phần C của khuôn `:251-269` — **4 khoản danh mục kiểm** (`A0-1..A0-4`).
- Nơi 4 — phụ lục `:86-89` — **4 ô nghiệm thu** (`G0-N1..N4`).

### 1.1 — Bảy bước làm (thư chính `:112-119`)

| # | Hub đòi gì | SE: đã có / thiếu / ngược | Bằng chứng `file:line` |
|---|---|---|---|
| **G0-B1** | Kéo cả **bốn món** về kho bạn | **ĐÃ CÓ** — 4/4 tệp trên đĩa, cùng một commit | `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-{thu-chinh,phu-luc-spec-pitfall,khuon-fit-map-report-checklist,luat-cham-diem}.md`; `git log -1 --format=%ci -- <mỗi tệp>` → cả 4 ra `2026-08-05 10:18:34 +0700`, commit `3a6eb92` |
| **G0-B2** | Tính lại **mã băm nội dung** từng món, so với giá trị hub công bố, **ghi kết quả so** | **ĐÃ CÓ NHƯNG ĐẶT SAI CHỖ** — phép so đã chạy và đạt 4/4, nhưng kết quả chỉ nằm trong một tệp lane của phiên này, không nằm ở sổ nào sống lâu hơn phiên | Kết quả: `sub-invest-fitmap-S180.md:32` (*"Hash verify 4/4 OK canonical bằng máy có sẵn `scripts/stamp_verify.py` (exit=0)"*). Giá trị hub công bố nằm ngay trong frontmatter từng thư: `43db2cf0` · `49287ce7` · `98e31fad` · `c24699f0`. Sổ đáng lẽ giữ kết quả này là `broadcasts/_index.md` — nó **có sẵn cột `sha256(12)` và cột `verify`** (`broadcasts/_index.md:13`) nhưng **không có dòng nào cho 4 món** |
| **G0-B3** | **Ghi đĩa ngay** bốn món vào **một chỗ cố định**, và ghi lại đường dẫn | **ĐÃ CÓ** — chỗ cố định là `broadcasts/inbox/ai_infra/`; đường dẫn được ghi lại ở `spec-…-07-08-2026.md:3` và `:13-19` | `spec-adap-upgrade-pack-phased-07-08-2026.md:3` |
| **G0-B4** | Dựng **tệp theo dõi tiến độ theo từng giai đoạn**, liệt kê **từng khoản** của danh mục kiểm | **THIẾU** — không có tệp nào liệt đủ 14 khoản `A0-1..A0-4 · A1..A10 · A11..A16` để tick dần | Phép tìm: `grep -rl "A0-1" --include="*.md" .claude/ docs/` → chỉ ra tệp trong run-folder S180, không ra tệp theo dõi. `docs/governance/` không có tệp nào tên theo dõi/tracking (`ls docs/governance/` = 12 mục, không mục nào là sổ theo dõi gói này) |
| **G0-B5** | Ghi **một dòng "đã nhận"** vào **sổ liên lạc phía bạn**, kèm ngày | **THIẾU — và thiếu rộng hơn nhiều so với 4 món** (chi tiết ở §2, đây là khoản mà lane brief gọi là "A0-3 hụt") | `broadcasts/_index.md` — 0 dòng cho cả 4 món; control-dương `grep -c "harness-22" broadcasts/_index.md` = **3** ⇒ thước còn sống, im lặng là im lặng thật |
| **G0-B6** | Lập **bản đồ áp dụng bảy dòng**, mỗi dòng chọn **đúng một** trong ba | **CÓ BẢN NHÁP, CHƯA CÓ TỆP RỜI** — bảng bảy dòng đã tồn tại nhưng nằm *bên trong* một tệp điều tra, không phải một tệp bản đồ độc lập | Bảng: `sub-invest-fitmap-S180.md:220-228` (dòng `:220` là dòng tiêu đề, `:222-228` là bảy dòng GĐ-0..GĐ-6). Hệ quả đo được: lệnh tự kiểm của hub `grep -c '^| GĐ-[0-6]' <tệp-bản-đồ>` hiện chỉ chạy đúng nếu trỏ vào tệp điều tra 48 KB — đúng cái bẫy mẫu-số mà hub cảnh báo ở `khuon-…:59` |
| **G0-B7** | **Gửi báo cáo tiếp nhận** kèm bản đồ áp dụng, qua hộp thư đi hướng tới hub; **ghi tệp vào kho của bạn** | **THIẾU** — chưa có báo cáo nào | `ls broadcasts/outbox/ai_infra/` = **47 tệp**, tệp mới nhất đề ngày `2026-07-26`; không tệp nào mang chữ `upgrade-pack`. Control-dương: cùng lệnh `ls` trả 47 tệp ⇒ thư mục đọc được, không phải lỗi đường dẫn |

### 1.2 — Ba lệnh "kiểm xong chưa" (thư chính `:121-125`)

| # | Lệnh hub đưa | SE chạy được chưa | Kết quả thật |
|---|---|---|---|
| **G0-K1** | `grep -c '^| GĐ-[0-6]' <bản-đồ>` phải ra **7** | **CHƯA — vì chưa có tệp bản đồ rời** (xem G0-B6) | Chạy trên `sub-invest-fitmap-S180.md` ra **7**, nhưng đó là tệp điều tra chứ không phải tệp bản đồ; nghiệm thu bằng con số này hôm nay là tự lừa mình |
| **G0-K2** | `ls <bốn đường dẫn>` phải đủ **bốn tệp** | **ĐẠT** | 4/4 tệp tồn tại, byte lần lượt 33.156 · 46.416 · 30.502 · 9.970 (tổng 120.044) |
| **G0-K3** | `<lệnh mã băm>` phải khớp giá trị đã ghi | **ĐẠT, nhưng chỉ khớp qua đúng một máy** | `python scripts/stamp_verify.py broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-*.md` → exit=0, 4/4 khớp (`sub-invest-fitmap-S180.md:32`). 🔴 Cảnh báo kế thừa từ N1: phép băm **tự chế** cho MISMATCH cả bốn — nghĩa là ai chạy lệnh băm thông thường sẽ kết luận nhầm là bị sửa nội dung. Bất kỳ tài liệu nào của SE nhắc tới G0-K3 **phải dán kèm đúng lệnh này**, không được ghi chung chung là "đã băm" |

### 1.3 — Bốn khoản danh mục kiểm Phần C (`khuon-…:251-269`)

| # | Khoản | SE | Ghi chú đo được |
|---|---|---|---|
| **A0-1** | Bốn món trên đĩa **kèm mã băm** | **ĐÃ CÓ MỘT NỬA** | Vế "trên đĩa" đạt (G0-B1). Vế "bạn ghi lại mã băm" **chưa có chỗ ghi thường trực** (G0-B2) |
| **A0-2** | Tệp theo dõi tiến độ, **số khoản khớp số khoản của danh mục** | **THIẾU** | = G0-B4. Danh mục có **14 khoản** đánh số (`A0-1 A0-2 A0-3 A0-4 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16` — tức 4 + 10 + 6 = **20 khoản**, tôi đếm lại từ `khuon-…:373-375` chứ không lấy con số cũ) |
| **A0-3** | Một dòng "đã nhận" trong sổ liên lạc, **tìm được bằng một lệnh tìm kiếm** | **THIẾU** | = G0-B5, phân tích đầy đủ ở §2 |
| **A0-4** | Bản đồ áp dụng bảy dòng, **không ô quyết định nào trống** | **CÓ NHÁP, CHƯA ĐẠT KHUÔN** | = G0-B6; thêm một khiếm khuyết riêng ở §5 (ô quyết định trộn giá trị) |

> 🔴 **Đính chính ngay trong bảng của chính tôi:** ở dòng `A0-2` phía trên tôi vừa viết "14 khoản" rồi đếm lại ra **20**. Tôi giữ cả hai con số và giữ luôn vết sửa, vì đây đúng lớp lỗi mà hub gọi tên: số chép tay trong văn xuôi trôi (LỚP-5). **Con số đúng là 20**, dẫn được từ `khuon-…:373-375`: bốn khoản Phần 0, mười khoản Phần 1, sáu khoản Phần 2. Tệp theo dõi của SE khi dựng phải có **đúng 20 dòng**, không phải 14.

### 1.4 — Bốn ô nghiệm thu phụ lục (`phu-luc-…:86-89`)

| # | Ô nghiệm thu | SE đạt? |
|---|---|---|
| **G0-N1** | Bốn tệp trên đĩa, **mã băm tính lại khớp** | **ĐẠT** (bằng máy canonical, xem G0-K3) |
| **G0-N2** | Tệp theo dõi tồn tại, **số khoản khớp** | **KHÔNG ĐẠT** — tệp không tồn tại |
| **G0-N3** | Sổ liên lạc có dòng "đã nhận" **kèm ngày** | **KHÔNG ĐẠT** |
| **G0-N4** | Bản đồ áp dụng **đủ bảy dòng, không dòng nào trống** | **ĐẠT về số dòng, CHƯA ĐẠT về hình thức ô** (§5) |

**Tổng kết GĐ-0:** 18 khoản đã liệt. **ĐÃ CÓ 6** (`G0-B1`, `G0-B3`, `G0-K2`, `G0-K3`, `A0-1` nửa vế, `G0-N1`) · **THIẾU 9** (`G0-B4`, `G0-B5`, `G0-B7`, `G0-K1`, `A0-2`, `A0-3`, `G0-N2`, `G0-N3`, và vế ghi-lại-băm của `G0-B2`) · **CÓ NHƯNG SAI KHUÔN 3** (`G0-B6`, `A0-4`, `G0-N4`). **Không khoản nào NGƯỢC** — SE không làm điều gì trái với GĐ-0, chỉ chưa làm.

---

## §2 — Khoản A0-3 ("đã nhận" trong sổ liên lạc): lỗ thật rộng gấp năm lần cách nó đang được kể

Đây là câu hỏi số 5 của lane. Câu trả lời ngắn: **đúng, đây là khoản A0-3 của GĐ-0** (đồng thời là bước `G0-B5` và ô nghiệm thu `G0-N3`). Câu trả lời dài quan trọng hơn, vì cách khoản này đang được mô tả — *"bốn thư nằm trong hộp thư hai ngày"* — **nhỏ hơn lỗ thật rất nhiều**, và vá theo mô tả đó sẽ để lại đúng cái lỗ cũ.

### 2.1 — Hai con số, và mỗi bên đang đếm cái gì

Tôi đo hai lần bằng hai phép độc lập, và hai phép ra cùng một con số, nên con số này đứng được.

- **Phép 1 — đếm dòng trong sổ.** Tách sổ theo hai khối rồi đếm dòng dữ liệu: khối nhận có **45** dòng, khối gửi có **47** dòng. Cộng hai khối cùng hai dòng tiêu đề ra 94, khớp với `grep -cE "^\| " broadcasts/_index.md` = **94**.
- **Phép 2 — đối chiếu ngược từ đĩa.** Duyệt từng tệp trong `broadcasts/inbox/*/`, lấy tên tệp bỏ đuôi, tìm chuỗi đó trong sổ: **69 tệp trên đĩa · 45 tệp có dòng · 24 tệp không có dòng**.

Hai phép gặp nhau ở con số 45. Vậy **lỗ thật là 24 lá thư, không phải 4**. Và lá cũ nhất trong 24 lá đó đề ngày **2026-07-13**, tức là đã nằm im **25 ngày**, không phải 2 ngày.

Nói rõ mỗi bên đếm gì, vì đây là chỗ dễ cãi nhau vô ích:
- **"4 thư · 2 ngày"** đếm *riêng bộ bốn món của gói này*, tính từ lúc chúng hạ cánh xuống đĩa (`2026-08-05 10:18:34`, commit `3a6eb92`) tới hôm nay (`2026-08-07`). Con số này **đúng** trong phạm vi của nó.
- **"24 thư · 25 ngày"** đếm *mọi thư trong hộp thư chưa có dòng trong sổ*. Con số này cũng đúng, và nó mới là phạm vi mà khoản A0-3 nói tới, vì A0-3 đòi *sổ liên lạc* làm được việc của sổ liên lạc.
- Bẫy đơn vị thứ ba, tôi tự dẫm rồi tự bắt: cùng commit `3a6eb92` có **năm** tệp cùng thời điểm sửa đổi, không phải bốn — lá thứ năm là `2026-07-28-Governance-day-wake-probe-first-resume.md`. Nếu ai đo bằng thời điểm sửa đổi tệp thì sẽ ra 5; đo bằng "món của gói" thì ra 4.

### 2.2 — Vì sao lỗ này lại tồn tại: luật lane có hai chỗ ghi

Đây mới là nguyên nhân, và nó **không phải là "quên"**. Tôi phân loại 69 tệp theo trường `to:` trong phần đầu tệp:

| Loại thư (`to:`) | Có dòng trong sổ | Không có dòng | Tổng |
|---|---|---|---|
| `se` — thư gửi đích danh | **23** | **0** | 23 |
| `all-fit` — thư phát đại trà | 22 | **20** | 42 |
| `all` — thư phát đại trà | 0 | **1** | 1 |
| (không có dòng `to:`) | 0 | **3** | 3 |
| **Tổng** | **45** | **24** | **69** |

Đọc bảng này ra được ba điều, và điều thứ ba là điều đắt nhất.

1. **Lane thư gửi đích danh sạch tuyệt đối: 23 trên 23.** Đây là control dương mạnh nhất tôi có — nó chứng minh kỷ luật ghi sổ của SE *có tồn tại và có chạy*, nên 24 lá kia không phải do lười.
2. **Lane thư phát đại trà rò gần một nửa: 22 vào sổ, 21 không.** Cùng một loại thư, hai số phận khác nhau.
3. **Chính cuốn sổ tự viết rằng loại thư này không thuộc về nó.** `broadcasts/_index.md:7` ghi: *"Fan-out adap broadcast (≠ email directed) → `outbox/all/` (pull `/adap-apply`), track ở COMMS-LEDGER OUT — KHÔNG ở index này"*. Nghĩa là theo luật của chính SE, 21 lá phát đại trà **không sai khi vắng mặt**. Nhưng 22 lá cùng loại **lại có mặt**, ghi đầy đủ `ai_infra → se`, `processed`, dấu `✓` — ví dụ `broadcasts/_index.md:27`, `:28`, `:30`, `:34`, `:39`. Vậy luật nói một đằng, cuốn sổ làm một nẻo, hai mươi hai lần.

### 2.3 — Cuốn sổ mà luật trỏ tới **không tồn tại trong kho SE**

Đây là phát hiện nặng nhất của §2, và nó biến khoản này từ "quên ghi" thành "không có chỗ để ghi".

Luật ở `_index.md:7` bảo đi ghi ở *COMMS-LEDGER*. Tôi tìm:

- `find . -iname "*COMMS*"` (loại `.git` và `node_modules`) → **không có tệp nào**.
- Control dương cho chính phép tìm đó: cùng lệnh `find . -iname "*ledger*"` → ra **4 tệp** (`.claude/governance/reinject-ledger.md`, `.claude/workflows/runs/_ledger.md`, `docs/governance/error-ledger.md`, và một tệp nhật ký phiên). Vậy lệnh chạy được, thư mục đọc được; kết quả rỗng là rỗng thật.
- Mọi lần chữ `COMMS-LEDGER` xuất hiện trong kho SE đều đang nói về **kho của hub**, không phải kho SE. Bằng chứng rõ nhất: `.claude/workflows/runs/2026-07-25-S152-h24-open-bookend/sub-lead-stale-close-S152.md:163` liệt ba tệp của hub, trong đó có `docs/governance/COMMS-LEDGER.md` — tức là tệp ấy nằm ở AI_INFRA.

⇒ **21 lá thư phát đại trà đang không có sổ nào nhận chúng.** Sổ A từ chối chúng bằng văn bản, sổ B không tồn tại. Đây đúng cái mà GĐ-1 mục (i) gọi tên: *"Cho phép hai chỗ đặt là cho phép hai chỗ tìm, và tới lúc cần thì ai cũng tìm chỗ còn lại."* Ở SE thì tệ hơn một bậc: chỗ còn lại **không có**.

### 2.4 — Khoản này đã từng bị xử là báo động giả, và cách xử đó nay không còn đứng vững

Ngày 2026-07-26, phiên S153 đã gặp đúng câu hỏi này và kết luận là **dương giả**: *"F-4 `_index` inbound = dương-giả (19 thư fan-out `outbox/all`, header `:7` khai track ở COMMS-LEDGER)"* — `.claude/workflows/runs/2026-07-26-S153-bookend-close/bookend-close-synthesis.md:25`, và vòng kiểm độc lập ghi nhận không chấm lại ở `sub-ring1-close-S153.md:161`.

Kết luận đó **hợp lệ tại thời điểm đó** trong phạm vi câu hỏi lúc đó ("sổ này có thiếu dòng không?"). Nhưng nó **không trả lời** câu hỏi mà A0-3 đặt ra bây giờ ("bạn có tìm được dòng *đã nhận* bằng một lệnh tìm kiếm không?"). Hai câu hỏi khác nhau, nên hai kết luận không mâu thuẫn nhau — nhưng ai đem kết luận cũ ra dùng cho câu hỏi mới sẽ đóng nhầm một khoản đang hở. Thêm nữa, con số đã trôi từ **19 lên 21** trong mười hai ngày, nên ngay cả trong phạm vi cũ thì lỗ vẫn đang lớn dần.

Cùng cuốn sổ còn mang sẵn một vết tự thú của đúng lớp lỗi này ở phần cuối tệp: *"Reconcile S123 — hai dòng đầu là email S122 đã gửi nhưng chưa từng được log … `_index` là sổ mà hub và audit đọc; email gửi mà không log thì hub không biết có nó."* Lớp lỗi đã được đặt tên, đã được vá một lần ở chiều gửi, và **đang tái diễn ở chiều nhận**.

### 2.5 — Vá thế nào cho đúng khuôn

Bốn việc, làm đúng thứ tự này. Việc 1 và 2 là bắt buộc để đóng A0-3; việc 3 là thứ ngăn nó tái phát; việc 4 là thứ hub sẽ soi.

1. **Chọn một chỗ, bỏ chữ "hoặc".** Quyết định thư phát đại trà nhận vào thì ghi ở đâu, rồi sửa luật ở `broadcasts/_index.md:7` cho khớp với thực tế. Có hai đường đi được, và **đường thứ nhất rẻ hơn nhiều**: (a) mở phạm vi khối `INBOUND` của `_index` để nhận cả thư phát đại trà — cách này hợp thức hóa 22 dòng đã tồn tại thay vì phải gỡ chúng ra; (b) dựng một cuốn sổ thứ hai trong kho SE và **đồng thời** gỡ 22 dòng kia khỏi `_index`. Chọn (b) mà quên vế gỡ là tạo ra đúng tình trạng hai chỗ ghi mà GĐ-1 cấm.
2. **Bù đủ 24 dòng, không bù 4.** Bù 4 dòng cho riêng gói này rồi tuyên đã xong A0-3 là để lại 20 lỗ và làm cuốn sổ tiếp tục nói dối. Mỗi dòng cần: ngày nhận · mã định danh · `ai_infra → se` · nấc hiện tại · mã băm · dấu đối chiếu. Riêng bốn món của gói, mã băm lấy từ phần đầu tệp (`43db2cf0` · `49287ce7` · `98e31fad` · `c24699f0`) và dấu đối chiếu lấy từ kết quả `scripts/stamp_verify.py` — như vậy một việc đóng luôn hai khoản, vì đây cũng chính là chỗ ghi thường trực còn thiếu của `G0-B2`.
3. **Cắm một phép đối chiếu ngược chạy được.** Phép ở §2.1 (duyệt tệp trên đĩa, tìm tên trong sổ, in ra danh sách vắng mặt) là một vị từ máy kiểm hoàn chỉnh cho A0-3 — nó đọc **hai nguồn** (đĩa và sổ) đúng như GĐ-2 mục (ii) đòi, thay vì chỉ đọc sổ, mà đọc sổ thì là tự soi mình. Chạy nó ở cửa đóng phiên là bắt được ngay lá thư kế tiếp bị rơi.
4. **Ba lá không có dòng `to:` phải xử riêng, đừng gộp.** `2026-07-20-Governance-auto-toan-vong-distill-2-tang.md`, `2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md`, `2026-07-25-Governance-model-default-opus-5-max.md` — cả ba thiếu trường `to:`, nên mọi phép phân loại theo `to:` sẽ **bỏ rơi chúng trong im lặng**. Đây là ca "vắng mặt trông giống ổn": chúng không rơi vào bất kỳ nhánh nào của luật lane, kể cả sau khi luật được sửa.

**Một hệ quả cần nói thẳng:** cả bốn món đều mang `to: all-fit`, nghĩa là chúng là thư phát đại trà. Vậy trước khi bù dòng cho chúng, việc 1 phải xong — nếu không thì bù dòng chính là hành vi vi phạm luật đang có hiệu lực ở `_index.md:7`, và ta lại thêm 4 vào con số 22.

---

## §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` và `: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` và `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` là **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` là **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` mà **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.
