# sub-task-1 — LANE W1-② — `scripts/agent-frontmatter-eol-check.ps1`

**Role:** implementer · **Run:** 2026-07-15-S119-adap-6-broadcast · **Lane:** W1-② (WRITE-lane)
**File tạo (DUY-NHẤT):** `scripts/agent-frontmatter-eol-check.ps1` (NEW, 335 dòng)
**VERDICT:** ✅ DONE — script live, PS 5.1 parse sạch, fault-inject 5 ca CÓ RĂNG, exit 0.
🔴 **Nấc trung-thực:** gate trên repo thật = **GREEN-BUT-VACUOUS** (0 CR / 37 file). **KHÔNG tính là thành-tựu.**

---

## 1. Tiền-đề: lý-do tồn-tại của script này VỪA BỊ HẠ CẤP

W0.6 spawn-probe @S121 ra verdict **CRLF-TOLERANT**: file agent CRLF hoàn-toàn (276 byte CR) spawn ĐỦ 4 tầng
(discovery/parse/spawn/execute), token 45248 (LF) vs 45240 (CRLF) — lệch 8 = chênh chữ trong prompt, KHÔNG do EOL.
⇒ Giả-thuyết "LF-only reader giết registry" **BỊ BÁC bằng thực-nghiệm**.
⇒ Spec v2:159 ra lệnh: *"ra CRLF-tolerant ⇒ validator **HẠ GIÁ-TRỊ** (chỉ còn hygiene) + **KHAI THẬT**"*.

**Đã tuân:** header `.SYNOPSIS`/`.DESCRIPTION` khai thẳng verdict + số đo + phạm-vi-hẹp. Grep xác nhận **0 hit**
`fatal` / `kill` / `break the registry` theo nghĩa khẳng-định. Trần severity = **MED** (HIGH chỉ dành cho self-broken).

**Phạm-vi CÒN LẠI của refutation (= lý-do script vẫn sống, nói đúng cỡ):**
behaviour-level only · `.claude/agents/` only · **1 build win32**. **KHÔNG phủ:** `commands/`, `skills/`, hook `.ps1`.

---

## 2. Thiết-kế — 4 quyết-định neo vào bài-học đã có

| # | Quyết-định | Neo |
|---|---|---|
| 1 | **Byte-reader** `[System.IO.File]::ReadAllBytes`, đếm `0x0D` | `Get-Content` (kể cả `-Raw`) **nuốt/chuẩn-hoá CR** ⇒ check text-level **KHÔNG BAO GIỜ fail được** = vacuous BY CONSTRUCTION. Phụ: không decode text ⇒ gotcha #30 **không với tới phép đo** |
| 2 | **Structural, KHÔNG grep-chuỗi** — đếm `0x0D` trong vùng cắt theo byte-offset | Bài-học W0.4 #1 tự-tham-chiếu: gate grep-chuỗi trích claim cũ vào file ⇒ FAIL trên bản SỬA ĐÚNG. Structural ⇒ **không thể self-match**. Cộng: script ở `scripts/`, quét `.claude/{agents,commands,skills}` ⇒ **path-disjoint** |
| 3 | **Mọi nhãn PASS/GREEN TÍNH TỪ SỐ ĐO**, count bằng glob | Bài-học W0.4 #2 meta-count + spec v3 fix #9h ("validator W1② chạy glob thay hardcode 12") |
| 4 | **Scope CHẶT** 3 thư-mục, **CẤM repo-wide** | repo-wide `i/lf w/crlf` = 188 file (131 EF Migrations) ⇒ acceptance `count==0` toàn-repo = **đường-giá factory**; mass rm+checkout CẤM phiên này (v2 W0.2). 188 = INFORM-only |

**Severity ladder (hệ-quả CÓ CHỦ-ĐÍCH của refutation):**
- `HIGH` — **chỉ** self-broken (synthetic control fail ⇒ scan vô-nghĩa). **KHÔNG** dùng cho CR finding.
- `MED` — CR trong frontmatter (bề-mặt parser đọc; đúng bề-mặt W0.6 đã probe trên agents/).
- `LOW` — CR chỉ ở body (cùng policy `eol=lf`, xa hot-path hơn).
- `exit 0` LUÔN LUÔN.

**agents/README.md CỐ Ý nằm TRONG scope** — R2-C1 loại README khỏi **ROSTER count** (nó không phải agent), nhưng
EOL policy là **per-file** ⇒ README bị quản như mọi file khác. 2 luật khác nhau CÓ CHỦ-ĐÍCH; đã ghi comment cấm
"sửa cái này bằng cách copy cái kia".

**SYNTHETIC CONTROL (khai rõ trong header — v2 ④(a)):** vì W0.6 bác CRLF-fatality ⇒ **KHÔNG còn file-đã-chết THẬT**
làm positive-control tự-nhiên ⇒ dùng 2 buffer in-memory chạy TRƯỚC mỗi lần quét:
`(+)` CRLF synthetic → BẮT BUỘC FmCr>0 · `(-)` LF synthetic → BẮT BUỘC FmCr=0. Fail ⇒ HIGH + `UNTRUSTWORTHY`.
Header khai đúng giới-hạn: *control chứng-minh **READER** chạy đúng; **KHÔNG** chứng-minh CRLF gây hại.*

---

## 3. FAULT-INJECT — 5 ca trên cây tạm `%TEMP%\eol-fi-w1a` (`-RepoRoot`)

Vật-liệu: copy `.claude/agents/reviewer.md`. Phẫu-thuật byte qua ISO-8859-1 round-trip (bảo-toàn byte tuyệt-đối).

| Ca | Inject | Kỳ-vọng | Số đo THẬT | Kết |
|---|---|---|---|---|
| **A** | all-LF (baseline) | 0 flag | `TOTAL FLAGS: 0 (scoped files=1, CR=0)` | ✅ |
| **B** | **all-CRLF** (mandated) | MED trên đúng file | `[EOL] MED \| .claude/agents/reviewer.md \| eol-frontmatter-cr: 14 CR ... 262 more in body`; CR=**276** | ✅ **FLAG** |
| **C** | FM-CRLF + body-LF | MED, **BodyCr=0** | `14 CR ... 0 more in body`; CR=14 | ✅ |
| **D** | FM-LF + body-CRLF | **LOW** (không MED) | `[EOL] LOW \| ... eol-body-cr: ... 262 CR`; CR=262 | ✅ |
| **A2** | gỡ lỗi → LF | **hết FLAG** | `TOTAL FLAGS: 0 (CR=0)` | ✅ **HẾT FLAG** |

**Boundary/anti-Goodhart — C+D chứng-minh region-attribution là THẬT, không phải đếm CR toàn-file:**
`FmCr(C)=14` + `BodyCr(D)=262` = **276** = `TotalCr(B)`. Số-học khớp chéo 3 lần inject.
Độc-lập: driver tự cắt báo `frontmatter = 14 lines` ⇒ khớp `FmCr=14`.

**Round-trip integrity:** SHA256 bản tạm sau A2 == bản repo gốc
(`4EAF7D3E...07EB` cả 2) ⇒ 4 lần inject **lossless** ⇒ "0 flag" ở A2 KHÔNG phải do file bị nát.

**🔴 Ca E — chứng-minh chính SYNTHETIC CONTROL có răng (meta-test):**
Lập-luận "green có nghĩa vì control PASS" **vô-giá-trị nếu control không bao giờ fail được**.
⇒ copy script ra temp, sabotage **1 chỗ duy-nhất** (`if ($Bytes[$i] -eq 0x0D)` → `0x00`, needle occurrences=1 = phẫu-thuật
chính-xác), chạy trên cây **SẠCH**:
```
  (+) CRLF synthetic : fm=True FmCr=0 BodyCr=0  expect fm=True,FmCr>0  -> FAIL
  (-) LF   synthetic : fm=True FmCr=0 BodyCr=0  expect fm=True,FmCr=0  -> PASS
[EOL] HIGH | scripts/agent-frontmatter-eol-check.ps1 (self) | self-broken: synthetic control FAILED ...
RESULT: UNTRUSTWORTHY - the synthetic control FAILED, so the scan above proves nothing.
```
⇒ Reader mù CR trên cây sạch **KHÔNG ra green** mà ra **UNTRUSTWORTHY**. Không có control, script hỏng sẽ in
"GREEN, 0 flags" **không phân-biệt được** với script chạy đúng. Repo script KHÔNG bị đụng (sabotage trên bản copy;
final run xác nhận lại). Cây tạm đã xoá (`Test-Path = False`).

---

## 4. Chạy trên REPO THẬT — stdout thật

```
  (+) CRLF synthetic : fm=True FmCr=4 BodyCr=1  expect fm=True,FmCr>0  -> PASS
  (-) LF   synthetic : fm=True FmCr=0 BodyCr=0  expect fm=True,FmCr=0  -> PASS
  .claude/agents     scanned=13  frontmatter-CR-files=0   body-only-CR-files=0   CR-bytes=0
  .claude/commands   scanned=18  frontmatter-CR-files=0   body-only-CR-files=0   CR-bytes=0
  .claude/skills     scanned=6   frontmatter-CR-files=0   body-only-CR-files=0   CR-bytes=0
TOTAL FLAGS: 0   (scoped files=37, CR bytes measured=0)
RESULT: GREEN-BUT-VACUOUS - 0 CR bytes existed in the scoped set, so this run had nothing to catch.
EXITCODE=0
```

🔴 **KHAI VACUOUS (đúng lệnh, không tính công):** 37/37 file = 0 CR ⇒ **gate XANH SẴN, 0 việc làm** (v2 W0.2 / R2-C4).
Đối-chứng độc-lập TRƯỚC khi viết script: `tr -dc '\r' < f | wc -c` = 0 trên cả 37 file ⇒ **2 nguồn khớp**.
Script **tự in** nhãn `GREEN-BUT-VACUOUS` + "Do NOT bank this as an achievement" ⇒ nấc trung-thực **nằm trong tooling**,
không chỉ trong report. Giá-trị thật = **bắt regression về sau**, KHÔNG phải lần chạy này.
`files with no parseable frontmatter block: 1` = **`.claude/agents/README.md`** (đo, không đoán) — không flag; body-CR vẫn đếm.

---

## 5. Acceptance

| # | Tiêu-chí | Số đo | Kết |
|---|---|---|---|
| 1 | fault-inject CÓ RĂNG | 5 ca A/B/C/D/A2 + E meta; B flag đúng file, A2 hết flag | ✅ |
| 2 | repo thật 0 flag ở agents/ + khai vacuous | `scanned=13, CR-bytes=0`; nhãn VACUOUS in tự-động | ✅ |
| 3 | grep non-ASCII = 0 · PS 5.1 parse sạch | `LC_ALL=C tr -d '\000-\177'` = **0 byte**; AST `ParseFile` = **0 error** (PS 5.1.26100.8737) | ✅ |
| 4 | header khai đúng nấc W0.6, không bàn 'fatal' | verdict+45248/45240+phạm-vi-hẹp có trong header; trần MED | ✅ |

**Chứng non-ASCII check có răng (chống vacuous):** cùng lệnh chạy trên `.gitattributes` (có tiếng Việt) = **868 byte**
non-ASCII ⇒ phép đo phân-biệt được, không phải luôn-luôn-0.
⚠️ `grep -P '[\x80-\xff]'` (lệnh trong gotcha #37) **CHẾT** trên môi-trường này: `-P supports only unibyte and UTF-8
locales`, exit 2 = **lỗi, KHÔNG phải "sạch"** — suýt đọc nhầm exit-code thành PASS. Dùng `LC_ALL=C tr` thay.

**Self-consistency:** file tự nó `CR = 0`; `git check-attr` ⇒ `text: auto`, `eol: lf` ⇒ chính nó nằm dưới policy nó rao.

---

## 6. Containment

`git status --porcelain` sau khi xong:
```
?? scripts/agent-frontmatter-eol-check.ps1   <- CỦA TAO
?? scripts/wal-recovery-test.ps1             <- lane W1-③, KHÔNG phải tao
```
✅ Đúng 1 file code + 1 file `sub-task-1.md`. KHÔNG git add/commit/push · KHÔNG đụng WAL/agent-memory/CLAUDE/STATUS/spec/run.md
· KHÔNG store_memory/RAG. Cây tạm ngoài repo (được spec lệnh) đã xoá.

---

## 7. Đọng lại

- **Học:** khi thực-nghiệm BÁC lý-do tồn-tại của một cái gate, đường đúng không phải xoá gate cũng không phải giữ nguyên
  giọng cũ — mà **hạ trần severity + khai verdict NGAY TRONG header + thu scope về đúng phần thực-nghiệm CHƯA phủ**.
  Tooling tự khai `GREEN-BUT-VACUOUS` thì nấc trung-thực sống-sót qua tay người đọc sau, report thì không.
- **Bất-ngờ 1:** CRLF-hoá `reviewer.md` ra **đúng 276 CR** = con số W0.6 báo ⇒ **đối-chứng độc-lập** vật-liệu probe
  (cùng file, cùng byte-delta) — không chủ-đích, rơi ra từ fault-inject.
- **Bất-ngờ 2:** `grep -P` của gotcha #37 **không chạy được** ở đây (locale) và **exit 2 trông như "0 match"** nếu chỉ
  liếc — một gate hygiene chống-mojibake **tự nó có thể vacuous-fail-open**. Đã đổi sang `LC_ALL=C tr` + positive control.
- **Bất-ngờ 3:** sandbox chặn `Remove-Item` với path **biến** (báo nhầm `system path 'A:'`); phải `-LiteralPath` chuỗi
  tường-minh mới xoá được cây tạm.
