# Nhãn lệch nghi thức + vòng hỏi ngược

> **Nguồn sàn:** `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-phu-luc-spec-pitfall.md` §GĐ-3 khoản (i)(ii)(iii)(vii) + câu kết `:208`.
> **Áp @S180 wave W3.** Bóc khoản: lane C `sub-n3-lane-c-gd34.md` §E.1 · §E.2 · §F (`C3-01` · `C3-02` · `C3-03` · `C3-09` · `C3-10`).
> **Phạm vi văn bản này:** cách **gọi tên** một bước nghi thức bị lệch, và cách **đóng** vòng hỏi ngược. Văn bản này **KHÔNG** định nghĩa cổng chặn hay thang mã thoát — đó là `C3-04` + khoản (v), thuộc wave **W3b**, đang chờ owner (P1). Mọi máy nhắc ở đây **INFORM, exit 0**.

---

## §0 — Vì sao cần nhãn, và vì sao AS-signature không thay được

SE đã có taxonomy `AS-signature` trong `docs/governance/error-ledger.md`. Nó là **chữ ký HÀNH ĐỘNG** — *đã làm sai cái gì*. Bốn nhãn dưới đây là **nhãn Ý ĐỊNH** — *vì sao bước đó không đủ*. Hai trục **không thay thế nhau**; ánh xạ chỉ một phần (*quên* ↔ `E-011`/`AS-15` "nghi thức chạy tắt").

⇒ Đây là **việc mới**, không phải đổi tên cái cũ. Ai định "tái dụng AS cho đủ 4 nhãn" là đang gộp hai trục khác nhau.

🔴 **Ranh của mọi máy nhắc trong văn bản này** (hub `:208`): máy đo **sự hiện diện và khuôn dạng, KHÔNG đo CHẤT**. Một bước có đủ vật mốc mà nội dung rỗng thì máy vẫn im. Nhãn do **người** đặt; máy chỉ **thu thập bốn vị từ** để người không phải đoán.

---

## §1 — Ba khái niệm nền (định nghĩa một lần, dùng suốt)

| Tên | Nghĩa | Vị từ đĩa |
|---|---|---|
| **VẬT MỐC** | thứ hạ cánh xuống đĩa khi bước chạy đủ: một tệp, một thư mục, hoặc **một dòng in có khuôn cố định** trong vật chứng của lượt | `Test-Path <đường dẫn>` · hoặc `grep -c '<khuôn dòng>' <vật chứng>` |
| **DÒNG KHAI** | câu trong vật chứng của lượt, nói rõ bước nào bị bỏ / rút gọn **và vì sao** | `grep -n '<mã bước>' <vật chứng>` |
| **ĐIỀU KIỆN CHO PHÉP** | mệnh đề **chạy lại được** trong chính tệp lệnh của cửa, cho phép bỏ bước đó | lệnh do tệp lệnh nêu; chạy lại ra `đúng`/`sai` |

🔴 **`C3-09` — guard vắng tệp PHẢI là vị từ máy.** Kiểm tồn tại rồi bỏ qua **và khai**. **CẤM** dùng mệnh đề *"cái đó chưa làm"*: mệnh đề đó sai ngay giây tệp kia hạ cánh. Ba neo đã có sẵn trên đĩa, khai tương đương, không dựng lại:

- `scripts/distill-shard-probe.ps1:23` — *"khong thay memory-budget.json -> probe-loi (khong chan)"*
- `scripts/mfe-eval.ps1:45`
- `scripts/memory-archive-gate.ps1:40-41`

---

## §2 — BỐN NHÃN, mỗi nhãn một vị từ kiểm được trên đĩa

Bốn nhãn chỉ áp cho **hàng đã bị nêu là thiếu hoặc lệch**. Bước chạy TRỌN **không sinh hàng nào** — nó không có nhãn, và đó là trạng thái thứ năm nằm ngoài bảng.

| Nhãn | Vật mốc | Dòng khai | Điều kiện cho phép, **chạy lại** | Sức nặng |
|---|---|---|---|---|
| **quên** | **VẮNG** | **0** | *không xét* | Vá, rồi nhắc |
| **tự ý bỏ** | **VẮNG** | **có** | chạy lại ra **SAI** — hoặc đặc tả **không nêu** điều kiện chạy lại được | 🔴 **Nặng nhất.** Vá · ghi `error-ledger.md` · **theo dõi tái phạm** |
| **suy giảm hợp lệ** | VẮNG hoặc **rút gọn** | **có**, kèm con trỏ `file:line` tới đặc tả | chạy lại ra **ĐÚNG** | **Không tính lỗi** |
| **bị chặn** | **VẮNG** | **có**, kèm con trỏ tới **nỗ lực gỡ** (lệnh đã chạy + output nhận được) | *không xét* — điều kiện nằm ngoài kho | Không tính lỗi; nhưng nỗ lực gỡ **phải có vết**, không được là lời kể |

### 2.1 — Vị từ chạy được, từng nhãn

Bốn lệnh dưới đây là **bốn vị từ**, chạy trên `bash`. `$M` = đường dẫn vật mốc · `$V` = vật chứng của lượt · `$B` = mã bước.

```bash
# (1) vat moc co mat khong  -> 0 = VANG
test -e "$M" && echo 1 || echo 0
# (2) co dong khai cho buoc $B khong -> 0 = KHONG KHAI
grep -c -- "$B" "$V"
# (3) dong khai co con tro file:line toi dac ta khong -> 0 = KHONG CON TRO
grep -E -c -- "$B.*[A-Za-z0-9_./-]+\.(md|ps1|py|js|json):[0-9]+" "$V"
# (4) dieu kien cho phep: chay lai chinh lenh ma dac ta neu -> in dung/sai
#     KHONG CO lenh chay lai duoc trong dac ta => ket qua = "khong-xac-dinh"
```

**Bảng quyết định** — đọc `(1)(2)(3)(4)` theo đúng thứ tự, dừng ở dòng khớp đầu tiên:

| (1) vật mốc | (2) khai | (3) con trỏ | (4) điều kiện | ⇒ Nhãn |
|---|---|---|---|---|
| 1 | — | — | — | **TRỌN** — không sinh hàng |
| 0 | 0 | — | — | **quên** |
| 0 | ≥1 | 0 | — | **tự ý bỏ** |
| 0 | ≥1 | ≥1 | `sai` **hoặc** `không-xác-định` | **tự ý bỏ** |
| 0 | ≥1 | ≥1 | `đúng` | **suy giảm hợp lệ** |
| 0 | ≥1 | ≥1 (trỏ **nỗ lực gỡ**, không phải đặc tả) | *không xét* | **bị chặn** |

### 2.2 — 🔴 Hai chỗ luật này CỐ Ý khắt khe hơn "có khai là xong"

**(a) Khai không tự miễn trừ.** Hub `phu-luc:189` viết *tự ý bỏ* gồm cả ca *"khai là 'bỏ êm' trong khi điều kiện cho phép bỏ **đánh giá lại trên đĩa là sai**"*. Nghĩa là **viết một dòng khai KHÔNG đủ để sạch** — dòng khai phải **sống sót phép chạy lại**. Nếu luật được đọc thành *"bỏ qua CÓ KHAI thì không phải lỗi"* thì bất kỳ ai cũng tự tha được bằng một câu, và cả bộ nhãn thành đồ trang trí.

**(b) Mặc định khi không đo được là nhãn NẶNG, không phải nhãn nhẹ.** Cột (4) ra `không-xác-định` (đặc tả không nêu điều kiện chạy lại được) ⇒ xếp **tự ý bỏ**, **không** xếp *suy giảm hợp lệ*. Lý do: nếu chỗ mù mặc định về nhãn vô tội thì cách rẻ nhất để sạch là **viết đặc tả mơ hồ** — thưởng cho đúng thứ cần phạt.

🔸 **Khai thiếu, không giấu:** vế *"đánh giá lại điều kiện trên đĩa"* của nhãn **tự ý bỏ** hiện **CHƯA CÓ MÁY** làm tự động. Cột (4) hôm nay là **thao tác người**: mở tệp lệnh của cửa, tìm mệnh đề điều kiện, chạy lại. Máy chỉ lo `(1)(2)(3)`. Đây là **giới hạn đã biết**, không phải chỗ chưa nghĩ tới.

---

## §3 — VÒNG HỎI NGƯỢC: khuôn 5 cột + luật đóng

Hub `phu-luc:191`: vai kiểm trả về một bảng; người điều phối **định đoạt từng dòng**; **không dòng nào để trống thì mới đóng được**.

### 3.1 — Khuôn (chép nguyên, không đổi tên cột)

| Bước thiếu hoặc lệch | Đặc tả nói gì | Bằng chứng trên đĩa | Nhãn | Câu hỏi đích danh |
|---|---|---|---|---|
| `<cửa>` bước `<mã>` | `<file>:<line>` + trích ≤1 câu | lệnh đã chạy + kết quả `(1)(2)(3)(4)` | một trong 4 nhãn §2 | 1 câu, hỏi **người điều phối**, có thể trả lời bằng *chạy bổ sung* / *khai suy giảm* / *khai không-thể-nữa* |

### 3.2 — Luật đóng (ba điều kiện, thiếu một là **chưa đóng**)

1. **Không ô nào trống.** Kể cả cột *nhãn*: không phân loại được thì ghi `chưa-phân-loại` **kèm lý do**, không để trống — ô 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 ba giá trị: `chạy-bổ-sung` · `khai-suy-giảm` · `khai-không-thể-nữa`.
3. **Bảng đi kèm MẪU SỐ**: *N hàng / M bước được soi*. `M` phải là 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

Không được đóng vòng bằng câu *"đã xử N finding"*. Con số tổng **đóng vai đã-phủ-hết** trong khi mẫu số lệch.

**Ca thật, trong kho này:** S119 — lead tuyên *"vá 19 finding"* trong khi thật **23**. Bài học đã ghi: `.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md` — *"bảng disposition TỪNG DÒNG thay số tổng"*.

🔸 Hai nguồn, một phát hiện: luật đóng của hub (*không dòng nào trống*) và bài học S119 của kho này (*từng dòng, không dùng số tổng*) là **cùng một kết luận tìm ra ở hai nơi độc lập**. Ghi lại để lần sau không ai tưởng đây là luật ngoại nhập.

### 3.4 — 🔴 `C3-02`: vai kiểm CHỈ ĐỐI CHIẾU, KHÔNG PHÁN ĐẶC TẢ

- **Nguồn đối chiếu** của cột *Đặc tả nói gì* là **chính tệp lệnh của cửa đó** (`.claude/commands/<cửa>.md`), không phải trí nhớ, không phải doc phái sinh.
- **Đặc tả tự mâu thuẫn** ⇒ ghi nhãn `đặc-tả-xung-đột` vào cột *Nhãn*, nêu **cả hai** con trỏ `file:line`, và **trả về người điều phối quyết**. **CẤM tự phán đặc tả nào đúng.**
- Tiền lệ đúng luật này đã có: `.claude/auto-memory/feedback_edit_must_predate_review.md` — *"spec tự-mâu-thuẫn → fix-mới thắng footer-cũ **+ khai trong report**"*.

🔸 `đặc-tả-xung-đột` ở đây là **giá trị của cột Nhãn**, dùng để trả việc về người. Nó **không phải** mã thoát — thang mã thoát 4 trạng thái thuộc W3b, chưa chốt.

---

## §4 — AI ghi ở đâu, KHÔNG đẻ vai mới

Bảng §3 do **cặp vai đang chạy sẵn** sinh ra, **không thêm vai nào**:

| Vai | Trục | Cửa spawn |
|---|---|---|
| `lead-gap-auditor` | hàng **thiếu** (bước không có vật mốc) | `session-start` + `session-end`, **vô điều kiện** |
| `lead-stale-auditor` | hàng **lệch** (có vật mốc nhưng trỏ trạng thái cũ) | như trên |

Cả hai đã spawn ở **cả hai đầu phiên** (`C3-06` — hình B @S149), tức khoản *kẹp hai đầu* của hub đã thoả ở vế vai kiểm. Việc W3 thêm là **khuôn trả về**, không phải cơ chế mới.

🔸 Hai vai này **INFORM-only, propose-only**; lead là single-writer (VERIFY → APPEND). Bảng vòng hỏi ngược **không tự hạ cánh vào sổ** — nó là đề xuất.

---

## §5 — TIỀN KIỂM ĐẦU CỬA (`C3-05`)

Hub `phu-luc:194`: *tiền kiểm chi phí bằng không, chạy ở **đầ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 ghi TRONG tệp, không tin thời gian sửa tệp của hệ điều hành**.*

- **Máy:** `scripts/tien-kiem-cua.ps1` — chỉ đọc, **luôn exit 0**, in một dòng `TIEN-KIEM:`. Lỗi bất kỳ ⇒ in `tien-kiem loi (khong chan)` rồi đi tiếp.
- **Vì sao không tin `mtime`:** hook `wal:` chạm tệp ở biên mỗi lượt; `git checkout` viết lại `mtime` hàng loạt. `mtime` trả lời *"tệp bị chạm lúc nào"*, không trả lời *"cửa đóng lúc nào"*. Dấu thời gian **trong** tệp thì không bị hai thứ đó làm trôi.
- **Nguồn dấu thời gian trong tệp** (đọc, không ghi): `.claude/WAL.md` dòng `updated:` · `.claude/governance/.session-counter.json` khoá `last_ticked_at` + `last_ticked_session` + `last_ticked_head`.
- **Độ phủ + trần chi phí:** 🔴 **BẢNG 19 CỬA LIỆT TỪNG DÒNG SỐNG Ở** [`.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w3-nghi-thuc.md` **§1.2**](../../.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w3-nghi-thuc.md) (19 dòng đánh số, 0 cửa treo). `adap-upgrade-pack-tracking.md` chỉ ghi **lệnh dựng** bảng, KHÔNG chứa bảng — đi theo nó là lạc. **Số cửa và số phủ KHÔNG chép ở đây** (B1) — đo lại bằng `ls -1 .claude/commands/*.md | wc -l`.

🔴 **`C3-08` — trần chi phí cho cửa hay dùng: `KHÔNG ĐO ĐƯỢC`.** Kho này có doctrine *"đo BYTE, CẤM quy token"* (S158) nên không in được số token cho một cửa. Adopt ở dạng **hướng dẫn + nghĩa vụ khai**: ai thêm bước vào `/pause` · `/tiep` phải **đo wall-clock trước** (luật đã có sẵn: `.claude/commands/check-email.md:41`) và **khai con số đo được**. Đây là **khai báo, không phải thuốc** — đúng chữ hub `:185`: *"Không có dụng cụ đo thì khai KHÔNG ĐO ĐƯỢC, đừng in số bịa."*

---

## §6 — Ngoài phạm vi văn bản này

| Khoản | Vì sao ngoài |
|---|---|
| `C3-04` cổng chặn bằng mã lỗi | wave **W3b**, chờ owner chốt (P1). Mọi máy W3 giữ **exit 0 / INFORM** |
| khoản (v) thang mã thoát 4 trạng thái | hình dạng đổi theo phương án P1 ⇒ làm trước là làm lại (lane C §E.3) |
| ~~khoản (vi) luật tự trị ba bậc~~ | ✅ **HẾT ngoài-phạm-vi @S181** — anh gật P5 *"nguyên văn"*. Nhà NGUỒN = [`.claude/governance/ACTIVE-MARKS.md` **§LT3**](../../.claude/governance/ACTIVE-MARKS.md) (mark `RC-pqhuy1987-07-08-2026-20-57-48`). Văn bản này + `ST-002` của W4 **TRỎ** về đó, **cấm chép** (chống nguồn-đôi `C3-07` ⟂ `ST-002`) |
