Files
2026-08-07 17:29:49 +07:00

274 lines
32 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# sub-w3-nghi-thuc — W3 / GĐ-3 phần TỰ-CHẠY: nghi thức hai đầu (4 nhãn · vòng hỏi ngược · tiền-kiểm đầu cửa · gói-B persona)
- **Vai:** implementer-backend (lane W3) · **Phiên:** S180 · **Ngày:** 2026-08-07
- **Model tự khai:** claude-opus-5 (effort max)
- **Ghi đĩa liên tục** (chống #53): mỗi mục xong append ngay, KHÔNG chờ cuối lượt.
- **Input ghim (đọc thật, không suy diễn):**
- `.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-c-gd34.md` §E.1 (`:385-398`) · §E.2 (`:400-406`) · §E.5 (`:421-440`) · §F bảng 10 khoản (`:444-463`)
- `…/wave-plan-S180.md` W3 (`:76-90`) — 7 trường đủ
- `…/sub-w1a-mayd-octen.md` §4 R1/R2 (`:458-462`) — 14 đoạn máy, 11 vỡ-câm
- `docs/governance/naming-standard.md` (W1-b vừa ký) · `…/sub-w2-luoi-ghi-dia.md` (W2 vừa xong)
- `broadcasts/inbox/ai_infra/2026-08-04-…-phu-luc-spec-pitfall.md` §GĐ-3
- **PHẠM VI:** CHỈ phần tự-chạy. **W3b (cổng chặn bằng mã lỗi) KHÔNG thuộc wave này** — chờ owner P1 (đã chốt PA-2 về hướng, nhưng phân loại ~70 cờ là wave riêng). 🔴 **Mọi thứ đụng trong lượt này giữ exit 0 / INFORM.**
---
## §0 — Trạng thái ghi đĩa (cập nhật liên tục)
| Mục | Trạng thái | Ghi ở § |
|---|---|---|
| Phép đo nền (wall-clock + bảng 19 cửa + persona) | ✅ XONG | §1 |
| (1) 4 nhãn suy-giảm | ✅ KÝ 4/4 — nhưng **cưỡng chế 1 đủ / 2 nửa / 1 CHƯA CÓ MÁY** | §2 |
| (2) Vòng hỏi ngược 5 cột | ✅ CÓ — khuôn + luật đóng 3 điều kiện + 1 hàng sinh bằng máy | §3 |
| (3) Tiền-kiểm đầu cửa | ✅ **5/19 → 9/19** + máy mới + fault-inject 5/5 | §4 |
| (4) Gói-B persona | ✅ 4 tệp / 5 sửa — 4 phép đo sau-restart **BÀN GIAO lead** | §5 |
| Hệ quả lên máy sống + CHƯA ĐO / CẦN LEAD | ✅ 6 mục | §6 |
**Vật đã hạ cánh:** `docs/governance/ritual-labels.md` (mới) · `scripts/tien-kiem-cua.ps1` (mới) · `.claude/commands/{adap-apply,adap-report,adap-request,check-email}.md` · `.claude/agents/{lead-stale-auditor,ring2-audit,back-end-reviewer-style,database-reviewer-style}.md`.
---
## §1 — PHÉP ĐO NỀN (chạy TRƯỚC khi gõ một dòng nào)
### 1.1 — Wall-clock: trần chi phí cho tiền-kiểm (hub `phu-luc:194` đòi "chi phí bằng không")
Lệnh: `Measure-Command`, n=5, lấy min/trung-vị/max. Máy này, 2026-08-07.
| Phép đo | n | min | **trung vị** | max |
|---|---|---|---|---|
| **CONTROL** — chỉ khởi động `powershell -NoProfile`, không chạy gì | 5 | 143 ms | **156 ms** | 260 ms |
| `scripts/nhip-no-probe.ps1`**đang chạy ở `/pause` + `/tiep`**, tức chi phí ĐÃ ĐƯỢC CHẤP NHẬN | 5 | 419 ms | **423 ms** | 452 ms |
**Phần việc RÒNG của probe đang sống = 423 156 = ~267 ms.** Đây là **trần tham chiếu**: một tiền-kiểm mới muốn cắm vào cửa dừng phải **rẻ hơn con số đã được chấp nhận này**, không phải rẻ hơn một ngưỡng tôi tự đặt.
🔴 **Luật đã thành văn trên đĩa, không phải tôi bịa:** `.claude/commands/check-email.md:41`*"việc NẶNG chỉ sống ở bookend. Ai thêm bước vào đường `/pause`·`/tiep` sau này **phải đo wall-clock trước**"*. Lượt này tuân: đo trước, và **KHÔNG thêm bước nào vào `/pause` · `/tiep`** (cả hai đã có probe rồi — xem §1.2).
🔸 **Khai giới hạn của thước:** đo trên máy này, đĩa nóng, không đo lần-chạy-nguội. Con số dùng để **so tương đối** (mới ⟂ đã-chấp-nhận), không dùng làm SLA tuyệt đối.
### 1.2 — Bảng 19 cửa × tiền-kiểm, TỪNG DÒNG (A4 cấm ghi gộp) — 3 cửa treo của lane C: ĐÓNG
**Thước 1 (CONTROL — dựng lại đúng phép đo lane C `§E.5`):** `grep -c "nhip-no-probe\|Sàn-3\|san-3\|tiền kiểm\|probe"`.
**Thước 2 (SẮC HƠN — vị từ *lời gọi thật*):** `grep -cE '\-File +scripts/[^ ]+\.ps1|node +scripts/|python +scripts/'` — tách **gọi****nhắc tên** (đúng ranh *use ⟂ mention* của W1-b/W2).
| # | Cửa | T1 (lane C) | T2 lời-gọi | `nhip-no-probe` gọi thật? | Kết luận |
|---|---|---|---|---|---|
| 1 | `session-start.md` | 19 | 9 | ✅ `:269` | ✅ **CÓ** |
| 2 | `session-end.md` | 12 | 7 | ✅ `:118` | ✅ **CÓ** |
| 3 | `tiep.md` | 10 | 2 | ✅ `:154` | ✅ **CÓ** |
| 4 | `pause.md` | 4 | 3 | ✅ `:113` | ✅ **CÓ** |
| 5 | `snapshot.md` | 1 | 4 | ✅ `:69` | ✅ **CÓ** — 🔴 lane C để **🟡 CHƯA ĐO**, nay ĐÓNG = **CÓ** |
| 6 | `check-email.md` | 2 | 2 (`stamp_verify.py`) | ❌ `:45`+`:48` = **NHẮC TÊN**, 0 lời gọi | ❌ **KHÔNG** — lane C 🟡 ĐÓNG = KHÔNG |
| 7 | `sleep-recovery-memory-l2.md` | 2 | 0 | ❌ 0 hit tên | ❌ **KHÔNG** — lane C 🟡 ĐÓNG = KHÔNG |
| 8 | `send-email.md` | 0 | 1 (`stamp_verify.py`) | ❌ | ❌ **KHÔNG** |
| 9 | `adap-apply.md` | 0 | 0 | ❌ | ❌ **KHÔNG** 🔴 ca `LỚP-2` |
| 10 | `adap-report.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 11 | `adap-request.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 12 | `fable-real.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 13 | `fable-clone.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 14 | `ultra-on.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 15 | `ultra-off.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 16 | `user-mark-active.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 17 | `user-mark-active-high.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 18 | `user-mark-medium.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
| 19 | `user-mark-disable.md` | 0 | 0 | ❌ | ❌ **KHÔNG** |
**⇒ Trạng thái TRƯỚC lượt này: 5/19 có tiền-kiểm** (không phải 4/19 như lane C ghi — chênh vì `snapshot` được đóng từ 🟡 sang CÓ). **14/19 không có. 0 cửa còn treo.**
🔴 **BÁC MỘT SỐ CỦA LANE F — `check-email` bị đếm nhầm là cửa gọi probe.** `sub-n3-lane-f-maytay.md:49``:253` ghi *"`nhip-no-probe.ps1` — check-email, pause, session-end, session-start, snapshot, tiep (**6 cửa**)"*. Đo lại: `check-email.md` chứa chuỗi `nhip-no-probe.ps1` **2 lần** nhưng **cả 2 đều là NHẮC TÊN**`:45` mượn nó làm *khuôn fail-soft*, `:48` bàn về *đổi vai của vế-4 `pull-cach`*. **0 lời gọi.** ⇒ tập đúng là **5 cửa**, không phải 6. Đây đúng lớp lỗi *use ⟂ mention* mà W1-b/W2 đã dựng vị từ để tách — lane F dùng thước cũ nên dính.
🔸 **Khai giới hạn của thước 2:** nó đo *có dòng lệnh gọi script trong tệp lệnh*, **không** đo *lời gọi đó có được thi hành mỗi lượt không* (tệp lệnh là prompt, người thi hành là model). Vẫn là *sự hiện diện + khuôn dạng, không đo CHẤT* — đúng ranh hub `phu-luc:208`.
### 1.3 — Phép đo persona (gói-B) trước khi sửa
| Persona | Phép đo | Kết quả | Control-dương |
|---|---|---|---|
| `lead-stale-auditor.md` | `grep -cE "run-folder|runs/"` | **0** | `FLAG`=**4** · `governance-detectors`=**2** ⇒ thước đọc được tệp, **0 là THẬT** |
| `lead-stale-auditor.md` | số class `view-*` liệt trong tệp | **5** (`view-residual-asym`·`stale-count`·`stale-header`·`stale-role-desc`·`stale-status`) + câu *"5 class dưới"* `:41` | enum đĩa = **12** |
| `ring2-audit.md:4` | chuỗi *"5 class `view-*`"* | **có** (kèm *"6 class `gap-*`"* — vế này ĐÚNG) | — |
| `back-end-reviewer-style.md:4` | chuỗi `.NET 10` | **có** | `front-end-reviewer-style.md:4` đã de-number @S179 (SỬA-6b) ⇒ khuôn có sẵn |
| `database-reviewer-style.md:4` | chuỗi `EF Core 10` | **có** | như trên |
**Nguồn số enum (đọc đĩa, không tin doc):** `.claude/agent-memory/memory-budget.json` → `lead_self_audit.flag_classes` = **12 phần tử = 6 `view-*` + 6 `gap-*`**. Phần tử thứ 6 của nhánh view là **`view-claim-broader-than-sample`** (mở @S172 theo escalate của `ring2-audit`).
🔴 **PHÁT HIỆN NGOÀI DANH SÁCH ĐỀ BÀI — nặng hơn ca `ring2`:** đề bài chỉ giao sửa `ring2-audit.md:4`. Nhưng `lead-stale-auditor.md` — **chính vai PHẢI DÙNG enum đó** — cũng chỉ liệt **5/6** class `view-*`, thiếu đúng `view-claim-broader-than-sample`. Đây là **ghost-enum tái phát**: đúng lớp lỗi `F-B HIGH` mà `tooling-auditor` đã ghi @S143 (*"enum mở 10→11 nhưng commit KHÔNG đụng `lead-gap-auditor.md` — vai bị luật CẤM tự chế class ⇒ lần tới gặp ca sẽ escalate lại đúng thứ vừa được duyệt"*). Lần này vật thể là nhánh `view-*` và vai là `lead-stale-auditor`. Sửa `ring2` mà bỏ `lead-stale-auditor` = vá cái GƯƠNG, để nguyên cái MÁY.
---
## §2 — (1) BỐN NHÃN — đã ký `docs/governance/ritual-labels.md`, và CHỨNG vị từ chạy THẬT
**Vật đã hạ cánh:** `docs/governance/ritual-labels.md` (kebab thường, đúng `naming-standard.md:170` luật vật MỚI).
### 2.1 — Bốn vị từ, chạy thật, kèm control-dương
`$M` = vật mốc · `$V` = **vật chứng của LƯỢT** (không phải đặc tả) · `$B` = mã bước.
| Vị từ | Lệnh | Ca thật đã chạy | Kết quả | Control-dương |
|---|---|---|---|---|
| (1) vật mốc | `test -e "$M" && echo 1 \|\| echo 0` | `docs/governance/rename-ledger.md` | **0** = VẮNG | `test -e naming-standard.md` → **1** ⇒ thước đọc được đĩa |
| (2) dòng khai | `grep -c -- "$B" "$V"` | `$B=rename-ledger` trong `sub-w1b-chuan-ten.md` | **0** = KHÔNG KHAI | cùng tệp, `grep -c naming-standard` → **6** ⇒ thước đọc được tệp |
| (3) con trỏ `file:line` | `grep -E -c -- "$B.*[^ ]+\.(md\|ps1\|py\|js\|json):[0-9]+" "$V"` | như trên | **0** | cùng tệp, bỏ neo `$B` → **39** ⇒ thước bắt được khuôn con trỏ |
| (4) điều kiện chạy lại | *lệnh do đặc tả nêu* | `naming-standard.md` **không nêu** điều kiện chạy-lại-được cho bước "lập sổ đổi tên" | **không-xác-định** | — |
⇒ Tra bảng quyết định `ritual-labels.md §2.1`: (1)=0 · (2)=0 ⇒ **nhãn `quên`**. **Hàng đầu tiên của vòng hỏi ngược, sinh bằng máy, không bằng cảm giác.**
🔴 **Ca này là một phát hiện thật, không phải ví dụ dựng:** `naming-standard.md:10` tuyên *"Sổ đổi tên: `docs/governance/rename-ledger.md` — chỉ-thêm-không-xoá"* và `:278` tuyên *"Sáu ô còn lại: xem `rename-ledger.md`"* — **tệp không tồn tại**, và **vật chứng lượt W1-b không có dòng khai nào**. Đúng lớp *lời-hứa-chưa-land* (`feedback_dryrun_finds_promised_but_unlanded`). **Tôi KHÔNG sửa `naming-standard.md`** (nằm trong danh sách cấm) — nộp thành 1 hàng cho lead.
### 2.2 — 🔴 NHÃN NÀO **CHƯA CÓ MÁY** (luật nấc W1-a: sạch đúng tới độ sâu máy KIỂM, không sâu hơn một nấc)
| Nhãn | Máy chấm được tới đâu | Nấc |
|---|---|---|
| **quên** | **TRỌN** — `(1)=0 ∧ (2)=0`, cả hai vị từ đều cơ khí | ✅ **CÓ MÁY ĐỦ** |
| **tự ý bỏ** | máy chỉ chấm được nhánh `(2)≥1 ∧ (3)=0`. Nhánh `(4)=sai` **CHƯA CÓ MÁY** — không máy nào chạy lại điều kiện cho phép | 🟡 **NỬA** |
| **suy giảm hợp lệ** | máy chấm được *có khai + có con trỏ*; **không** chấm được *con trỏ trỏ đúng chỗ cho phép hay không* | 🟡 **NỬA** |
| **bị chặn** | ❌ **CHƯA CÓ MÁY.** Phân biệt *"con trỏ tới đặc tả"* ⟂ *"con trỏ tới nỗ lực gỡ"* là phán-xét ngữ nghĩa, `(3)` cho **cùng một số** ở cả hai | ❌ **CHƯA CÓ MÁY** |
**⇒ Nói thẳng: 1/4 nhãn có máy đủ · 2/4 nửa · 1/4 chưa có máy.** Bốn nhãn **đã thành văn 4/4**, nhưng **cưỡng chế bằng máy thì KHÔNG phải 4/4**. Ghi đúng nấc này vào `ritual-labels.md §2.2` chứ không để nó trông như đã cưỡng chế — đó chính là **LỚP-9** (cưỡng chế được tuyên mà chưa có máy) mà cả gói này tồn tại để chữa.
🔴 **Máy anh em để đối chứng (lead chỉ, đã dùng):** `scripts/artifact-integrity.ps1` (W2) đang chạy thật. Nó chấm **vật chứng có đủ ruột không**; bốn nhãn ở đây chấm **bước có chạy không**. Hai trục khác nhau, **không** gộp số.
### 2.3 — 🔴 BÁC MỘT VẾ TRONG KHUNG ĐỀ BÀI (vế này nếu nhận sẽ làm thủng chính bộ nhãn)
Đề bài khung 4 nhãn là *"làm đủ ⟂ làm thiếu CÓ KHAI ⟂ bỏ qua CÓ KHAI ⟂ bỏ qua KHÔNG khai — **chỉ nhãn cuối mới là lỗi**"*.
**Đo lại chữ hub** (`phu-luc:189`, nguyên văn): *tự ý bỏ* = *"bỏ mà không khai, **hoặc** khai là 'bỏ êm' trong khi điều kiện cho phép bỏ **đánh giá lại trên đĩa là sai**"*.
⇒ Hub **có tính** một ca **CÓ KHAI** là lỗi nặng. Nếu áp khung *"chỉ bỏ-qua-KHÔNG-khai mới là lỗi"* thì **viết một dòng khai là tự tha được**, và bộ nhãn thành đồ trang trí. Hai khung cũng **không cùng phân hoạch**: *làm đủ* của đề bài = **TRỌN**, mà TRỌN **không sinh hàng nào** nên nó không phải một trong 4 nhãn.
**Xử:** ký theo **chữ hub**, ghi rõ ở `ritual-labels.md §2.2(a)(b)`: (a) khai không tự miễn trừ · (b) `(4)=không-xác-định` ⇒ rơi về nhãn **NẶNG**, không rơi về nhãn vô tội — vì nếu chỗ mù mặc định về vô tội thì cách rẻ nhất để sạch là **viết đặc tả mơ hồ**.
---
## §3 — (2) VÒNG HỎI NGƯỢC 5 CỘT — đã ký `ritual-labels.md §3`
Khuôn nguyên chữ hub, 5 cá»™t **không Äổi tên**: *bưá»c thiếu hoặc lệch · Äặc tả nói gì · bằng chứng trên ÄÄ©a · nhãn nào · câu hỏi Äích danh*.
**Luật Äóng — ba Äiều kiện, thiếu má»™t là CHƯA ĐÓNG** (`ritual-labels.md §3.2`):
1. **0 ô trá»ng** — kể cả cá»™t *nhãn*: không phân loại ÄÆ°á»£c ⇒ ghi `chưa-phân-loại` **kèm lý do**; ô trá»ng Äọc thành *đã xét và sạch*.
2. Má»—i hàng có **má»™t Äá»nh Äoạt** cá»§a người Äiều phá»i, thuá»™c Äúng 3 giá trá»: `chạy-bổ-sung` · `khai-suy-giảm` · `khai-không-thể-nữa`.
3. Bảng **luôn kèm MẪU SỐ** *N hàng / M bưá»c ÄÆ°á»£c soi*; `M` = sá» bưá»c **thật sá»± ÄÆ°á»£c duyệt**, không phải sá» bưá»c tồn tại.
🔴 **§3.3 CẤM thay bảng bằng má»™t con sá» tổng** — neo thẳng ca S119 (*"vá 19 finding"* khi thật **23**) + con trỏ `feedback_meta_count_selfcoverage_blindspot`. Ghi rõ Äây là **há»™i tụ Äá»™c lập**: luật Äóng cá»§a hub và i học S119 là cùng má»™t kết luận tìm ra ở hai nÆ¡i, để lần sau không ai tưởng là luật ngoại nhập.
🔴 **§3.4 `C3-02` thành văn:** vai kiểm **CHỈ ĐỐI CHIẾU**, nguồn = **chính tệp lệnh cá»§a cá»­a**; Äặc tả tá»± chỏi ⇒ nhãn `Äặc-tả-xung-Äá»™t` + **cả hai** con trỏ + trả người Äiều phá»i; **CẤM tá»± phán**. Ghi rõ: `Äặc-tả-xung-Äá»™t` ở Äây là **giá trá» cá»™t Nhãn**, KHÔNG phải mã thoát (thang mã thoát = W3b).
**Ai sinh bảng:** `lead-gap-auditor` (hàng *thiếu*) + `lead-stale-auditor` (hàng *lệch*) — cặp **Äang spawn vôiều-kiện ở CẢ HAI Äầu phiên**. **0 vai má»i** (Äúng lane C §E.1; vai má»i thuá»™c P4/W4b).
**Hàng mẫu đã sinh BẰNG MÁY** (§2.1): `bưá»c "lập sổ Äổi tên" | naming-standard.md:10 + :278 | (1)=0 (2)=0, control 1/6 | quên | "Sổ này land ở wave nào, hay gỡ hai con trỏ?"` — **1 hàng / 1 bưá»c ÄÆ°á»£c soi**.
---
## §4 — (3) TIỀN-KIá»M ĐẦU CỬA: 5/19 → **9/19**
### 4.1 — Máy mới `scripts/tien-kiem-cua.ps1`
- **Chỉ Äọc · LUÔN `exit 0` · INFORM.** Fail-soft y khuôn `nhip-no-probe`: lá»—i ⇒ `tien-kiem loi (khong chan)`.
- Thi hành Äúng chữ hub `phu-luc:194`: chọn **cá»­a Äóng gần nhất** bằng **dấu thời gian ghi TRONG tệp** — `.claude/WAL.md` dòng `updated:` (cá»­a `/pause`·`/snapshot`) + `.claude/governance/.session-counter.json` khoá `last_ticked_at`/`last_ticked_session` (cá»­a `/session-*`). **KHÔNG dùng `mtime`** (hook `wal:` chạm tệp má»—i lượt; `git checkout` viết lại `mtime` hàng loạt).
- **Pure-ASCII: 0 byte >127.** 🔴 Control-dương cho chính thưá»c ASCII: `ritual-labels.md` = **4.250** byte >127 ⇒ thưá»c **có bắt ÄÆ°á»£c**, sá» 0 kia không phải thưá»c hỏng. *(Bài W2: control-âm-sai = hỏng THƯỚC.)*
- Cờ in ra: `THIEU-TAP` (0/2 nguồn) · `NGUON-HONG:<tên>` · `LECH-PHIEN:<a>/<b>` · `ok`.
### 4.2 — Fault-inject **BA chiều: 5/5 PASS** (harness `scratchpad/fi-tienkiem.ps1`, cây tạm, KHÔNG chạm repo thật)
| Chiều | Ca | Kỳ vọng | Thực tế | |
|---|---|---|---|---|
| **B** | cấy ĐÚNG, 2 nguồn lành | IM = `ok`, 0 dương-giả | `nguon 2/2 \| ok` | ✅ |
| **A-1** | cấy HỎNG nguồn WAL | `NGUON-HONG:Wal` | `nguon 1/2 \| NGUON-HONG:Wal` | ✅ |
| **A-2** | cấy HỎNG nguồn counter | `NGUON-HONG:Counter` | `nguon 1/2 \| NGUON-HONG:Counter` | ✅ |
| **A-3** | 2 nguồn lệch phiên | `LECH-PHIEN` | `nguon 2/2 \| LECH-PHIEN:S177/S180` | ✅ |
| **A2** | **MẤT CẢ TẬP** (xoá cả 2) | cờ `THIEU-TAP` **RIÊNG**, CẤM in `ok` | `THIEU-TAP - 0/2 nguon moc doc duoc \| KHONG ket luan duoc gi` | ✅ |
`exit 0` ở **5/5** (ràng buộc cứng trong harness: `exit != 0` ⇒ FAIL). Harness in **control-harness** (`WAL=True/False counter=True/False`) mỗi ca ⇒ chứng cây tạm thật sự có/không có tệp như ý định.
🔴 **Lượt fault-inject ĐẦU chết vì HARNESS, không vì script:** viết harness inline qua `bash` ⇒ bash nuá»t `$`/backtick cá»§a chuá»—i PowerShell ⇒ tệp WAL "lành" **không bao giờ ÄÆ°á»£c ghi Äúng** ⇒ chiều B in `NGUON-HONG:Wal` **trông y hệt script hỏng**. Dá»±ng lại harness thành `.ps1` Äá»™c lập ⇒ 5/5. Đúng bài S139: *harness cần cùng ká»· luật như production*. Nếu tin lượt Äầu thì đã Äi sá»­a má»™t script **không hỏng**.
### 4.3 — Wall-clock ĐO ĐƯỢC (bắt buộc TRƯỚC khi cắm — luật `check-email.md:41`)
| | trung vị (n=5) | **ròng** (trừ khởi động) |
|---|---|---|
| CONTROL `powershell -NoProfile` khởi động không | 196 ms | — |
| **`tien-kiem-cua.ps1` (MỚI)** | 390 ms | **~194 ms** |
| `nhip-no-probe.ps1` (đã được chấp nhận ở `/pause`·`/tiep`) | 477 ms | ~281 ms |
⇒ Máy má»i **rẻ hÆ¡n cái đã ÄÆ°á»£c chấp nhận**. 🔸 Khai thẳng: phần lá»n 194 ms là Äọc + `ConvertFrom-Json` trên sổ Äếm ~45 KB; **không** phải "bằng không" theo nghÄ©a Äen. Đo trên máy này, ÄÄ©a nóng ⇒ dùng để **so tương Äá»i**, không phải SLA tuyệt Äá»i.
🔴 **KHÔNG cắm vào `/pause` · `/tiep`.** Hai cá»­a đó **đã có** probe; thêm bưá»c nữa = làm Äiểm dừng Äắt lên, trái floor `goi-chot §3` và trái bất-biến `check-email.md:41`. Đây là **quyết Äá»nh có Äo rồi má»i nói không**, không phải bỏ sót.
### 4.4 — Độ phủ sau lượt (mẫu số **19**)
| | n/19 | Cửa |
|---|---|---|
| Trước | **5** | `session-start` · `session-end` · `tiep` · `pause` · `snapshot` |
| Cắm mới | **+4** | `adap-apply` 🔴 *(ca LỚP-2: chính cửa áp gói này)* · `adap-report` · `adap-request` · `check-email` |
| **Sau** | **9** | còn thiếu **10**: `send-email` · `sleep-recovery-memory-l2` · `fable-real` · `fable-clone` · `ultra-on` · `ultra-off` · `user-mark-active` · `user-mark-active-high` · `user-mark-medium` · `user-mark-disable` |
**Control-dương cho phép đếm:** `grep -c tien-kiem-cua .claude/commands/ultra-on.md` = **0** ⇒ con số 9 không do mẫu khớp tràn lan.
🔸 **Vì sao dừng ở 9, không cắm ná»t 10:** 6 cá»­a (`fable-*`, `ultra-*`, `user-mark-*`) là **cá»­a má»™t-dòng, không có Äiểm dừng nào để soi** — cắm vào là **nghi thức trang trí**, và má»—i lời gọi thừa là má»™t cÆ¡ há»™i alarm-fatigue. `send-email` + `sleep-recovery-memory-l2` **Äáng cắm**, xin lead má»™t dòng Äồng ý vì chúng không nằm trong danh sách ưu tiên cá»§a đề bài.
---
## §5 — (4) GÓI-B PERSONA (chỉ ăn từ RESTART kế) — 4 tệp / 5 sửa
| # | Tệp | Sá»­a | Đo TRƯỚC | Đo SAU (trên ÄÄ©a) |
|---|---|---|---|---|
| 1 | `lead-stale-auditor.md` | +mục **Tập-Äo BẮT BUỘC gồm thư mục lượt chạy**: cách soi rẻ (so khá»i trạng-thái `run.md` ⟂ dòng `END`/bảng kết từng `sub-*.md` cùng run-folder) · **PIN Äích danh, cấm `glob-latest`** · ranh: run-folder phiên Đà ĐÓNG = record Äóng-băng, Äừng flag · không lấn `artifact-integrity.ps1` | `run-folder\|runs/` = **0** (control-dương cùng tệp: `FLAG`=4, `governance-detectors`=2) | **6** |
| 2 | `lead-stale-auditor.md` | heading **BỎ SỐ** + trỏ khoá `lead_self_audit.flag_classes`; **+1 dòng bảng** `view-claim-broader-than-sample` | liệt **5** class `view-*`; enum ÄÄ©a = **12 = 6+6** | liệt **6**; `[0-9]+ class` còn 2 hit **Äều hợp lệ** (*"gắn 1 class"* · *"1 class lặp N lần"*) |
| 3 | `ring2-audit.md:4` | **BỎ SỐ cả hai vế**, trỏ khoá. **KHÔNG sá»­a 5â†6** (luật B1) | `5 class` = **1** | `5 class` = **0** · `[0-9]+ class` = **0** (control `class` = 7 ⇒ thưá»c sá»ng) |
| 4 | `back-end-reviewer-style.md:4` | bỏ digit, trỏ `SolutionErp.Domain.csproj` → `TargetFramework` | `.NET 10` = **1** | **0** (control `.NET` = 2 ⇒ thưá»c sá»ng) |
| 5 | `database-reviewer-style.md:4` | bỏ digit, trỏ `SolutionErp.Infrastructure.csproj` → `PackageReference …EntityFrameworkCore*` | `EF Core 10` = **1** | **0** (control `EF Core` = 1 ⇒ thưá»c sá»ng) |
Khuôn de-number lấy **nguyên** từ `front-end-reviewer-style.md:4` (SỬA-6b @S179) — **không tự chế khuôn mới**.
🔴 **PHÁT HIỆN NGOÀI DANH SÁCH ĐỀ BÀI (sá»­a #2):** đề bài chỉ giao `ring2-audit.md:4`. Nhưng `lead-stale-auditor` — **chính vai PHẢI DÙNG enum** — cÅ©ng chỉ liệt **5/6** class `view-*`, thiếu Äúng `view-claim-broader-than-sample`. Đây là **ghost-enum tái phát**, Äúng lá»p `F-B HIGH` mà `tooling-auditor` ghi @S143: vai bá» luật *"CẤM tá»± chế class"* trói ⇒ lần tá»i gặp ca **suy-luận-vượt-mẫu** sẽ **escalate lại Äúng thứ vừa ÄÆ°á»£c duyệt**. Sá»­a `ring2` mà bỏ `lead-stale-auditor` = **vá cái GƯƠNG, để nguyên cái MÁY**.
🔴 **Tá»° BẮT CITATION-TRAP — vòng 1 THỦNG:** ghi chú vá cá»§a tôi trong `lead-stale-auditor.md` **trích nguyên văn** cụm sá» cÅ© ⇒ `grep "5 class"` **vẫn = 1** trên chính bản đã sá»­a Äúng. Vòng 2 diá»…n-giải-không-trích ⇒ **0**. Đúng bài W1-b: *lời-giải-thích nằm TRONG tập Äo*. Đã grep lại bằng **lệnh KHÁC** (`[0-9]+ class` thay chuá»—i cá» Äá»nh) để không tá»± tha.
### 5.1 — 🔴 PHÉP ĐO CHỈ XANH **SAU RESTART** (tôi KHÔNG restart ÄÆ°á»£c — bàn giao lead)
Sá»­a `.claude/agents/*.md` là **hot-reload ENV-DEP**: ÄÄ©a Äổi ngay, **hành vi vai chỉ Äổi sau restart CLI**. Đo trên ÄÄ©a (bảng trên) **KHÔNG chứng ÄÆ°á»£c vai đã ăn**. Bá»n phép sau, má»—i cái **chỉ xanh sau restart**:
| # | Phép đo | Xanh = |
|---|---|---|
| 1 | spawn `lead-stale-auditor`, hỏi *"liệt tập-Äo bắt buá»™c cá»§a mày"* | câu trả lời **có chứa** `runs/` hoặc `run-folder` |
| 2 | spawn `lead-stale-auditor`, hỏi *"nhánh `view-*` gồm class nào"* | liệt **đủ 6**, có `view-claim-broader-than-sample`, và **Äọc khoá** chứ không Äọc sá» trần |
| 3 | spawn `ring2-audit`, hỏi *"má»—i nhánh có bao nhiêu class"* | trả lời **trỏ khoá `lead_self_audit.flag_classes`**, KHÔNG Äọc sá» trần |
| 4 | spawn `back-end-reviewer-style` + `database-reviewer-style`, hỏi *"version .NET / EF Core"* | trả lời **trỏ `.csproj`**, KHÔNG Äọc sá» từ persona |
🔴 Không chạy 4 phép này thì *"chưa ăn"* trông **y hệt** *"hỏng"*, và cả hai trông **y hệt** *"đã xong"*.
---
## §6 — HỆ QUẢ ĐO ĐƯỢC LÊN MÁY ĐANG SỐNG + CHƯA ĐO / CẦN LEAD
### 6.1 — Tripwire `-Expect` cá»§a `naming-scan.ps1` ĐÃ KÊU vì tôi (Äúng thiết kế, KHÔNG phải hỏng)
Chạy `naming-scan.ps1` read-only sau khi land:
```
mau so: 56 muc (tep + thu muc) [!] lech ky vong 55 - chuan hoac kho da doi, doc lai naming-standard.md
OK 54/56 | LECH 1/56 | MIEN-theo-luat 1/56
```
- Nguyên nhân: `scripts/tien-kiem-cua.ps1` là **mục thứ 56** cá»§a nhóm `scripts/`; lead vừa vá `-Expect` **54â†55**, giờ thành **55â†56**.
- 🔴 **`-Expect` kêu VÀNG, KHÔNG Äá»™i thành `LECH`** — `LECH` giữ nguyên 1/56 (`master-import-data.generated.md`), và **cả 2 tệp má»i cá»§a tôi Äều KHÔNG lệch chuẩn**. Đúng như lead mô tả: `-Expect` là **tripwire có chá»§ Äích**, cho `THIEU-TAP` má»™t **mẫu sá»** — **không** phải lá»p lá»—i drift. Tôi **không lặp nhãn "LỚP-5"** mà W2 gán nhầm.
- **Tôi KHÔNG sửa `naming-scan.ps1`** (nằm trong danh sách cấm). **Xin lead bump `-Expect` 55→56.**
- Toàn kho: `LECH 8/236` — **+2 tệp mới của tôi không thêm dòng lệch nào**. Exit 0.
### 6.2 — CHƯA ĐO / CẦN LEAD
1. 🔴 **4 phép đo sau-restart (§5.1)** — tôi không restart được. **Không chạy = gói-B chưa nghiệm thu**, dù đĩa đã đúng.
2. 🔴 **`-Expect` 55→56** trong `naming-scan.ps1` — tệp cấm, lead vá.
3. 🔴 **Hàng vòng-hỏi-ngược Äầu tiên chờ Äá»nh Äoạt:** `docs/governance/rename-ledger.md` **không tồn tại** trong khi `naming-standard.md:10` + `:278` trỏ tá»i nó, và vật chứng W1-b **0 dòng khai** ⇒ nhãn **`quên`**. `naming-standard.md` là **tệp cấm** ⇒ tôi không Äụng. Ba lá»±a chọn: `chạy-bổ-sung` (lập sổ) / `khai-suy-giảm` / `khai-không-thể-nữa` (gỡ 2 con trỏ).
4. 🟡 **`lead-gap-auditor.md:42` neo sá» trần cho nhánh `gap-*`** — hôm nay **ĐÚNG** (6 gap-*), nên **KHÔNG sá»­a** (bài S143: *biết chá»— KHÔNG sá»­a*). Nhưng nó là **neo cùng loại** vá»i 2 cái vừa gỡ ⇒ ứng viên de-number Äợt sau. Ngoài scope W3.
5. 🟡 **Cắm ná»t `send-email` + `sleep-recovery-memory-l2`** (§4.4) — cần lead gật, không có trong danh sách ưu tiên đề bài.
6. â›” **KHÔNG làm, Äúng phạm vi:** thang mã thoát 4 trạng thái (`C3-04` + khoản (v)) = **W3b**, chờ P1. Luật tá»±-trá» 3 bậc (`C3-07`/khoản (vi)) = chờ **P5** owner gật ná»™i dung. Trần chi phí `C3-08` chỉ **khai `KHÔNG ĐO ĐƯỢC`** + nghÄ©a vụ khai, **không phải thuá»c**.
### 6.3 — Bất-biến giữ được
- **Mã thoát: 0 lái.** Máy má»i `exit 0` ở 5/5 fault-inject; 4 tệp lệnh sá»­a Äều ghi rõ *"KHÔNG chặn · máy luôn exit 0 · cổng chặn = W3b"*.
- **14 Äoạn máy (11 vỡ-câm): 0 vỡ.** Chúng Äọc **TÊN** (`sub-*` · `session-<N>` · tên vai · `agent-memory/`). Lượt này **0 Äổi tên, 0 xoá tên**; 2 tệp má»i Äều là tên MỚI đúng chuẩn (`naming-scan` xác nhận 0 dòng lệch mới). Bất-biến ngầm `agents/<role>.md`.BaseName ≡ `agent-memory/<role>/` **không bị chạm** — tôi chỉ sửa RUỘT 4 persona, **0 rename**.
- **Tệp cấm: 0 chạm.** `STATUS.md` · `HANDOFF.md` · `CLAUDE.md` · `broadcasts/_index.md` · `naming-standard.md` · `naming-scan.ps1` · `artifact-integrity.ps1` · `adap-upgrade-pack-*.md`.
---
**END sub-w3-nghi-thuc — 4 nhãn KÝ 4/4 nhưng CƯỠNG CHẾ 1 đủ / 2 ná»­a / 1 CHƯA CÓ MÁY · vòng hỏi ngược 5 cá»™t CÓ (khuôn + luật Äóng 3 Äiều kiện + 1 hàng sinh bằng máy) · tiền-kiểm 5/19 → 9/19 (wall-clock ròng 194 ms < 281 ms đã-chấp-nhận) · persona-B 4 tệp/5 sá»­a, 4 phép Äo sau-restart BÀN GIAO · fault-inject 5/5 ba chiều · 2 chá»— bác đề bài/lane (khung 4-nhãn "chỉ nhãn cuá»i là lá»—i" ⟂ chữ hub · lane F Äếm `check-email` là cá»­a gọi probe trong khi nó chỉ NHẮC TÊN) · 1 sá» cá»§a lane C sá»­a (4/19 → 5/19, `snapshot` Äóng từ CHƯA-ĐO sang CÓ).**