148 lines
10 KiB
Markdown
148 lines
10 KiB
Markdown
# 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.
|