# sub — LANE-7 (Opus 5 MAX) — C-12 máy-quét lời-hứa-máy

> Artifact-first (chống #53): ghi LIÊN TỤC trong lúc làm. Return chỉ là con-trỏ về file này.
> Lane-7 = 1 item duy nhất: **C-12** (effort L, ưu tiên THẤP NHẤT). Nhánh khai hợp lệ: "chưa dựng, đã phân loại" đúng dạng dự-định thư 07-19.

- ts-mở: 2026-08-09 (S185) · cwd `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP`
- KHÔNG commit/push (lead gom cuối) · KHÔNG `store_memory`

## 0. Đọc nguồn TRƯỚC khi chạm (ranh cứng #1)

| Nguồn | Đường dẫn | Dòng load-bearing |
|---|---|---|
| THƯ GỐC | `D:/Dropbox/CONG_VIEC/AI_INFRA/broadcasts/outbox/all/2026-07-19-Governance-goi-chot-owner-nam-khoan.md` | `:52` luật lời-hứa-máy (existence-proof 3 mảnh) · `:54` hub tự khai "máy quét TỰ-ĐỘNG … CHƯA CÓ" · `:53` "chặn từ lúc VIẾT" · `:55` floor = "tài-liệu governance MỚI" |
| REPORT SE | `docs/governance/adap-reports/2026-07-19-Governance-goi-chot-owner-nam-khoan.md` | `:21` khoản 4.4 = executed(cổng-người) · máy-quét = DỰ-ĐỊNH · `:39` honest-caveat "**19 là mẫu-số của lượt đo S144, không phải hằng số**" |
| Artifact gốc | `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C6-cua-loi-hua-may.md` | `:10-12` 3 phép đo (literal→0 mù · loose→19 với 21% dương-giả) · `:14-19` ca `bắt buộc` bị `bắt` nuốt · `:46` use⟂mention discriminator = **enclosure** · `:50-56` acceptance a→e |
| Checklist | `runs/2026-08-09-S185-…/checklist-final.md:44` | C-12 = "19 mẫu-số + positive-control + use⟂mention" |

Ràng buộc thiết kế rút từ 4 nguồn trên (KHÔNG được vi phạm):
1. **Regex KHÔNG được làm mẫu-số** (acceptance b) — regex chỉ là *sàng ứng-viên*; mẫu-số = **danh sách liệt kê tường-minh**.
2. **use ⟂ mention** tách bằng **enclosure**, không bằng hình-dạng/charset (bài `citation-trap` S123).
3. **FP-guard `bắt buộc`**: token *bắt* (catch) phải loại `bắt buộc` (mandatory).
4. Đo **GATE đã cài**, không đo *đã quét sạch* — máy chỉ được tuyên về dòng MỚI-so-baseline, cấm tuyên "corpus sạch".
5. Positive-control BẮT BUỘC — cổng không nhặt được câu-giả = cổng mù = TRƯỢT.

---

## 1. NHẬT KÝ (append liên tục)

### [B1] Đọc nguồn — XONG
4 nguồn ở §0 đã đọc trực tiếp (không qua trung gian). Không phát hiện mâu thuẫn giữa thư gốc và report.

### [B2] Tái lập phép đo S144 trên corpus HÔM NAY — 19 → **29** (drift, không phải hằng số)

```
cd D:/Dropbox/CONG_VIEC/SOLUTION/SOLUTION_ERP
rg -n --no-heading -e "(detector|guard|hook)" docs/governance/*.md | rg -c "(chặn|quét|bắt|đảm)"
# -> 29     (S144 đo cùng khuôn regex lỏng = 19)
```
⇒ Xác nhận **bằng phép đo, không bằng suy luận**, câu honest-caveat `adap-report:39` (*"19 là mẫu-số của lượt đo S144, không phải hằng số"*). Con `19` KHÔNG được dùng làm chỉ-tiêu; C-12 xây mẫu-số MỚI theo đúng acceptance (b) = danh-sách liệt-kê, regex chỉ làm sàng.

### [B3] Dựng máy — `scripts/loi-hua-may-scan.ps1` (ĐÃ CHẠY ĐƯỢC)

Kiến trúc 4 tầng (mỗi tầng buộc bởi 1 acceptance C6):

| Tầng | Làm gì | Ràng buộc gốc |
|---|---|---|
| 1 SÀNG ứng-viên | line có DANH-TỪ-MÁY (`detector\|guard\|hook\|script\|checker\|scanner\|.ps1\|.py\|máy\|lưới`) **và** ĐỘNG-TỪ-NĂNG-LỰC (`chặn\|quét\|bắt(?!\s*buộc)\|đảm\|canh\|tự động\|enforce\|detect`) | (b) — regex **KHÔNG** phải mẫu-số, chỉ là sàng |
| 2 use ⟂ mention | loại theo **ENCLOSURE**: m1 code-fence · m2 blockquote `>` · m3 động-từ nằm trong cặp nháy (`"` `“”` `«»` `‘’` backtick) | (c) + bài S123 citation-trap: discriminator = enclosure, KHÔNG phải charset/hình-dạng |
| 3 existence-proof | proof = path máy CÓ THẬT TRÊN ĐĨA (`Test-Path`) hoặc lệnh chạy được, **tại chỗ** | `goi-chot:52` 3 mảnh |
| 4 baseline-diff | dòng có trong `loi-hua-may-baseline.json` (kèm disposition) = KNOWN; dòng MỚI = FLAG | (d) đo GATE không đo SWEEP + (e) hồi-tố time-box |

Chi tiết chống-lách đã cắm:
- **FP-guard `bắt buộc`** — negative-lookahead `bắt(?!\s*buộc)`; đây đúng con bug đẻ ra 21% dương-giả ở C6, nay là control #2 của self-test.
- **`proof-dead` = HIGH**: câu cite `scripts/x.ps1` mà file KHÔNG tồn tại → nặng hơn câu không cite gì (đây là biến-thể độc nhất của class này mà cổng-người rất khó bắt).
- **Anti-Goodhart**: `-EmitBaseline` phát entry `disposition:"TODO-classify"`, và scanner **VẪN FLAG** entry TODO-classify (LOW) ⇒ tự-sinh baseline KHÔNG tắt được đèn. Fragment < 25 ký tự bị **loại** khi load (fragment ngắn sẽ khớp bừa và tắt đèn nhầm) — có in WARN.
- **Anchor = fragment văn-bản chuẩn-hoá, KHÔNG phải số dòng** (số dòng trôi mỗi lần sửa phía trên ⇒ neo số dòng sẽ tắt/bật nhầm dòng — bài "con-trỏ-số-dòng vào sổ tái-sinh").
- **Self-exclusion C4-style**: `scripts/loi-hua-may-scan.ps1` + `loi-hua-may-baseline.json` + `.claude/workflows/runs/` (chính file này) — nếu không loại, detector khớp CHÍNH NÓ rồi lây qua trích-dẫn (S123 đi 3 đời/1 wave).
- **ASCII-only body** (gotcha #30): 0/24270 byte non-ASCII (`python` đếm byte>127), token tiếng Việt dựng từ code-point lúc RUNTIME.

### [B4] 🔴 Self-test BẮT LỖI THẬT của chính máy (không phải happy-path)

Lượt chạy đầu: **6/8 PASS**, 2 FAIL — và 2 FAIL này là **defect thiết kế thật**, không phải fixture sai:

```
FAIL  C5 cite script KHONG ton tai        [got: proved/proof-ok]
FAIL  C7 dong legacy da liet ke           [got: flag/HIGH/proof-dead:scripts/khong-ton-tai.ps1]
```
Nguyên nhân: cửa sổ tìm proof ±2 dòng ⇒ **hai chiều lây nhiễm** — câu hứa mượn được proof của bullet TRÊN nó, và câu sạch bị gán path-chết của bullet trên nó. Sửa: "tại chỗ" = dòng CỦA NÓ + dòng ngay DƯỚI (sub-bullet/xuống dòng) + dòng ngay TRÊN **chỉ khi** dòng đó không phải một câu-hứa khác (*proof đã có chủ thì không phải proof của mình*); `proof-dead` chỉ nâng HIGH từ **chính dòng đó**. Sau vá:

```
powershell.exe -ExecutionPolicy Bypass -NoProfile -File scripts/loi-hua-may-scan.ps1 -SelfTest
# -> SELF-TEST: 8/8 PASS   (exit 0; FAIL -> exit 1)
```
8 control = 3 positive-must-catch (C1 câu-hứa-không-proof · C5 cite-máy-không-tồn-tại · C8 TODO-classify) + 5 negative-must-NOT-catch (C2 `bắt buộc` · C3 blockquote-định-nghĩa-luật · C4 proof thật · C6 văn thường · C7 baseline). Cây tạm nằm dưới `%TEMP%`, tự xoá; **0 byte inject vào repo thật** (ranh cứng #3).

### [B5] Chạy trên repo THẬT → 2 lỗi nữa lộ ra, cả hai đều là lỗi CỦA MÁY

Lượt chạy thật đầu tiên (`FLAG 64`) — đọc cờ đầu tiên thì thấy sai ngay:

1. 🔴 **HIGH giả** tại `naming-standard.md:50` báo `proof-dead: claude/hooks/wal-flush.ps1`. Kiểm đĩa: `ls .claude/hooks/wal-flush.ps1` → **file CÓ THẬT**. Gốc: `.Trim('.')` của tôi **ăn mất dấu chấm đầu** của `.claude/...` ⇒ biến path sống thành path ma. Vá: chỉ `Trim('`','(',')')` + `TrimEnd(',','.',';',':')`, **cấm TrimStart dấu chấm**. (Đúng lớp "bộ lọc chuỗi thất bại trong im lặng" mà C6 đã đếm 3 ca trong 1 phiên — đây là ca thứ 4, và nó rơi vào chính máy đi soi người khác.)
2. **Sàng quá rộng**: hàng bảng dài / văn 5-why bị hút vào vì danh-từ ở ô này, động-từ ở ô kia cách 300 ký tự. Vá: **proximity** — tách dòng theo `|`, danh-từ ⟂ động-từ phải cùng MỘT khúc và cách ≤ 80 ký tự.

**Kiểm anti-Goodhart cho phép vá số 2** (bắt buộc — "cái mất đi là dương-giả hay CHỨNG-NHÂN?"):
```
# hatch audit dựng sẵn trong máy để ai cũng tái lập được:
scripts/loi-hua-may-scan.ps1 -NoProximity   -> FLAG 63
scripts/loi-hua-may-scan.ps1                -> FLAG 48   (rơi 15)
```
**Đọc TỪNG dòng trong 15 dòng rơi** (không đọc con số tổng): 3 dòng = bảng/tiêu-đề (`| Máy | Fire tự động? | Bằng chứng |`) · 5 dòng = **ghi-chép lịch-sử** trong `error-ledger` (máy nào bắt gì hồi nào) · 4 dòng = **honest-caveat** (`harness-11-engine:289` *"FP-guard … blind-spot có-chủ-đích"* — đúng dòng C6 đã tự nhận là không vi-phạm) · 2 dòng = **dạng dự-định** hợp lệ (`"sẽ bắt bug slug"`, `"chờ owner chốt (P1)"`) · 1 dòng = phát-hiện tự-phê (`"hai máy … mà không cửa nào gọi"`). ⇒ **15/15 là dương-giả hoặc dòng-hợp-lệ, 0 chứng-nhân mất đi.**

🔴 **Và chính lượt đọc-15-dòng này lòi ra lỗ THẬT trong FP-guard:** `fable-real-runbook.md:571` viết **`bắt-buộc` CÓ GẠCH NGANG**, trong khi guard của tôi là `bắt(?!\s*buộc)` — `\s*` không khớp dấu `-` ⇒ **guard rò**, dòng đó chỉ thoát nhờ proximity một cách tình cờ. Vá `[\s-]*` + thêm **control C9** ghim cả hai lối viết. (Đúng bài *"vá 1 CLASS ⇒ grep MỌI matcher cùng-lớp"* — nếu chỉ nhìn con số tổng thì lỗ này sống sót.)

### [B6] Siết định-nghĩa "proof" cho đúng cách kho này viết

`docs/governance/*` gọi tên máy **không kèm thư mục** (`` `governance-detectors.ps1` ``, `` `hmw.js:171-186` ``). Câu đó **đã trả lời** câu hỏi của reviewer (*"mã nào làm việc đó?"*) nên phải tính là proof. Cắm `New-MachineIndex` (mọi `.ps1/.py/.js/.sh` dưới `scripts/` + `.claude/`, trừ `node_modules`): tên trần **resolve được** ⇒ proof-ok; tên trần **không resolve** ⇒ vẫn flag (control C11); path có thư mục nhưng stale mà file tồn tại nơi khác ⇒ proof-ok (không phải máy ma).
⇒ `FLAG 48 → 30`, `proved 11 → 29`. **11/11 control PASS** sau khi thêm C10/C11.

### [B7] MẪU-SỐ — 30 dòng, **chấm tay từng dòng** (đây mới là mẫu-số, không phải output regex)

Corpus bị **các lane khác sửa GIỮA LÚC đo** (đã quan sát: `naming-standard.md` dòng trôi giữa 2 lượt chạy) ⇒ đóng băng 1 cây snapshot rồi chấm trên đó:
```
robocopy docs|scripts|.claude -> %TEMP%\lhm-snap-213114     (17 file governance, 30.3 MB)
scripts/loi-hua-may-scan.ps1 -RepoRoot <snap>   -> candidate 99 | mention 40 | proved 29 | FLAG 30
```
30 dòng đọc bằng MẮT, mỗi dòng 1 disposition + 1 ghi-chú → `scripts/loi-hua-may-baseline.json` (13.460 B, 30 entry, fragment ngắn nhất 51 ký tự, 30/30 fragment duy-nhất):

| disposition | n | nghĩa |
|---|---|---|
| `caveat-honest` | 12 | tự KHAI THIẾU ("mechanized = 0", "CHƯA CÓ MÁY", "mọi máy vẫn `exit 0`") |
| `design-note` | 8 | mô tả ranh/thiết-kế của máy, không phải khẳng-định năng-lực mới |
| `history` | 5 | biên bản sự-cố: máy nào bắt gì, khi nào |
| `draft-proposal` | 3 | nằm trong tệp `*-se-draft.md` chưa wire |
| `proof-elsewhere` | 1 | nêu 5 máy bằng STEM không đuôi `.ps1` — cả 5 đều tồn tại |
| `debt-open` | 1 | nợ ghi rõ dạng dự-định ("CHƯA LÀM… cần một máy chặn/cảnh báo") |
| **`violation-open`** | **0** | — |

🔴 **Đọc cho đúng con số 0 này:** *phân loại bằng MẮT của tôi, không phải máy phán*. Nó khớp với kết luận C6 (*"phần lớn là bản ghi lịch sử / honest-caveat / câu đã CÓ existence-proof"*) — nghĩa là **corpus governance của SE trung thực với class này trong phạm-vi C6**, chứ KHÔNG phải "đã quét sạch mọi thứ".

**Neo = fragment văn-bản, nên sống qua trôi dòng:** baseline sinh trên cây snapshot, đem áp lên **repo SỐNG** (đã bị lane khác sửa) vẫn khớp **30/30**:
```
powershell.exe -ExecutionPolicy Bypass -NoProfile -File scripts/loi-hua-may-scan.ps1
# scope 17 file · candidate 99 -> mention 40 | proved 29 | baseline 30 | FLAG 0   (759ms)
# breakdown: caveat-honest 12 | design-note 8 | history 5 | draft-proposal 3 | proof-elsewhere 1 | debt-open 1
```
Tổng baseline **luôn in vỡ theo disposition**, không in một số: "30 known" đọc thành 30 việc đã xong, còn "debt-open 1 / draft-proposal 3" thì giữ món nợ NHÌN THẤY.

### [B8] FAULT-INJECT trên CÂY TẠM + positive-control (acceptance a)

```
CONTROL DƯƠNG  cây snapshot NGUYÊN + baseline   -> FLAG 0
INJECT-1  thêm "detector nhịp này chặn mọi nhãn sai…"            -> MED  ritual-labels.md:152  no-proof-not-in-baseline   ✅
INJECT-2  thêm "…quét toàn bộ sổ bằng scripts/khong-he-co-may-nay.ps1" -> HIGH ritual-labels.md:153  proof-dead:…         ✅
INJECT-3a sửa KHÚC SAU của 1 dòng đã có trong baseline           -> KHÔNG re-flag (baseline vẫn 30)   ← giới hạn, khai ở §2
INJECT-3b sửa ĐẦU dòng đó ("Fix DA XONG - máy đã canh…")         -> baseline 30→29 + RE-FLAG MED     ✅ chống-tắt-đèn
```
Cây tạm đã xoá sau khi đo (`snap removed: True`). **Repo thật 0 byte bị inject** — `git status --porcelain scripts/ + run-folder` cho đúng 2 dòng `??` của tôi (`loi-hua-may-scan.ps1`, `loi-hua-may-baseline.json`); các file governance đang `M` là của LANE-1/3/4/6, không phải tôi chạm.

### [B9] Phạm vi rộng `-All` (khai số, CHƯA phân loại)

```
scripts/loi-hua-may-scan.ps1 -All
# scope 46 file (+rules/gotchas/CLAUDE/commands/skills) · candidate 145 -> mention 49 | proved 48 | baseline 30 | FLAG 18   (1247ms)
```
18 dòng ngoài corpus C6 **chưa chấm tay** — cố ý: floor `goi-chot:55` chỉ đòi *tài-liệu governance MỚI*, hồi-tố là P-2 time-box (acceptance e). Khai số để không ai tưởng `-All` cũng đã sạch.

---

## 2. 🔴 KHAI THIẾU — đọc trước khi trích bất kỳ dòng nào ở trên

1. **Máy kiểm 1/3 mảnh của luật.** `goi-chot:52` đòi {máy tồn-tại + lệnh chạy được + test/positive-control}. Máy này verify được **mảnh 1** (máy có tồn tại trên đĩa không) và bắt được ca "0 máy nào được nêu tên". **Mảnh 2 + 3 grep không thấy** ⇒ **cổng-người C6 VẪN PHẢI SỐNG**. Cấm đọc thành *"cửa 4.4 đã cơ-giới-hoá trọn"*.
2. 🔴 **CHƯA CÓ CỬA GỌI — máy này hiện chỉ chạy khi có người gõ tay.** Đây đúng hình dạng *"guard dựng mà không ai gọi"* mà `adap-upgrade-pack-tracking.md:147` gọi là phát hiện đắt nhất của W6. Cửa đề xuất: `session-end §L.b(k-ter)` (cùng chỗ `naming-scan.ps1` + `artifact-integrity.ps1`). **Tôi KHÔNG tự cắm**: file lệnh thuộc địa-bàn LANE-3, và sửa file lệnh = ENV-DEP **ăn từ phiên sau restart**. ⇒ để lead quyết.
3. **Anchor phủ ~95 ký tự ĐẦU dòng** (INJECT-3a chứng): sửa ở khúc sau của một dòng dài sẽ KHÔNG bắt tái-duyệt. Trade-off có chủ đích (anchor dài = gãy vì mọi sửa vặt; anchor ngắn = tắt đèn nhầm). Khai, không giấu.
4. **"0 violation-open" là phán của MẮT tôi**, không phải của máy — và chỉ trong 17 file corpus C6 tại thời điểm 2026-08-09 21:31.
5. **Mẫu-số hôm nay = 30, KHÔNG phải 19.** 19 là mẫu-số lượt S144 dưới regex lỏng; cùng regex đó chạy hôm nay ra **29**. Ai đọc "19" như chỉ-tiêu cố định là đọc sai (`adap-report:39` đã cảnh báo đúng câu này).
6. **Report 07-19 §4.4 hiện vẫn ghi *"máy-quét = DỰ-ĐỊNH, chưa có"*** — nay câu đó ĐÃ STALE. Tôi **cố ý không sửa**: `git status` cho thấy **LANE-5 đang mở đúng file đó** (C-9 addendum `tier:` override, phần đuôi 15/88 · 54/88 đã nằm trong file) ⇒ vào nữa là 2 người ghi 1 file. **Bàn giao lead/LANE-5**: thêm block MỚI (giữ dòng cũ, bài-5), evidence = `scripts/loi-hua-may-scan.ps1` + `-SelfTest 11/11` + fault-inject 3 ca, kèm caveat 1/3-mảnh ở mục 1 trên.
7. **Artifact này bị hook `wal:` tự commit** (`20d32450 wal: flush 20260809T2131`) — **tôi không chạy git commit** (ranh cứng #6). 2 file `scripts/` vẫn `??` chờ lead gom.

## 3. VERDICT C-12

**DONE** — máy CÓ THẬT, chạy được, và cả 3 thứ checklist đòi đều có mặt & đo được:

| Checklist đòi | Trạng thái | Bằng chứng |
|---|---|---|
| máy-quét lời-hứa-máy 4.4 | ✅ dựng + chạy | `scripts/loi-hua-may-scan.ps1` (24 KB, ASCII-only 0/24270 byte non-ASCII), 759ms |
| **mẫu-số** | ✅ **30** chấm tay (≠ 19 của S144, đã tái-lập số cũ = 29) | `scripts/loi-hua-may-baseline.json` 30 entry + bảng disposition |
| **positive-control** | ✅ 11/11 self-test + 3 fault-inject trên cây tạm + control dương | `-SelfTest` exit 0 · `-RepoRoot <snap>` |
| **use ⟂ mention** | ✅ tách bằng **enclosure**, 40 dòng mention bị loại đúng | `Get-MentionReason` m1/m2/m3 + control C3 |

Nhánh khai "chưa dựng, đã phân loại" của checklist **không phải dùng đến**. Nhưng 7 khai-thiếu ở §2 là phần KHÔNG được cắt khi trích dẫn kết quả này.


