# sub-investigator-codebase-1 — T1 (S129) — ON-BEHALF TRANSCRIPT

> 🔴 GHI ON-BEHALF bởi em-main từ journal.jsonl wf_3fccd7d1-b63 (2026-07-16 đêm).
> Lane T1 KHÔNG tự ghi file này (class #53 WRITE-lane: khai subMdPath nhưng file không tồn-tại trên đĩa (claimed-but-not-written)).
> Nội-dung dưới = VERBATIM return 4-field từ journal — KHÔNG phải em-main viết lại.
> Verify độc-lập: REVIEW lane R0 re-run probe chính từ đĩa.

---

## findings (verbatim)

## T1 — erratum EOL 16-07 lỗ #4-#7 vs SE (investigator-codebase, PROPOSE-only, read-only)

Nguồn đọc: spec `spec-adap-errata-16-07.md §T1` · broadcast `2026-07-16-Governance-erratum-eol-metric-hai-chieu-va-bon-lo-moi.md §4-§7+§KHÔNG-BIẾT` · `.gitattributes` · `scripts/agent-frontmatter-eol-check.ps1` · `.claude/hooks/wal-flush.ps1` · `runs/2026-07-15-S119-adap-6-broadcast/W0-evidence-15-07-2026.md`. Mọi số = ĐO lúc chạy (dán lệnh+output).

### #4 lone-CR `i/-text` — VERDICT: 0 suspect (SẠCH; check là regression-guard, hiện vacuous)
- `git ls-files --eol | grep 'i/-text' | wc -l` = **19**. TẤT CẢ 19 mang `attr/-text` (declared-binary), `grep 'i/-text' | grep -v 'attr/-text'` = **0** ⇒ 0 file heuristic-binary (không có file nào git tự-đoán binary; mọi cái đều do rule `.gitattributes` khai tường-minh).
- Phân-loại 19 = **12 .docx + 6 .png + 1 .xlsx** (khớp y con-số S120 W0-evidence:36). Từng file ∈ binary-class khai ở `.gitattributes:35-44` (`*.docx`/`*.png`/`*.xlsx`). Ví dụ: `docs/Huong-dan-Duyet-NCC.docx`, `fe-admin/public/logo.png`, `src/Backend/SolutionErp.Api/wwwroot/templates/SOL-CCM-FO-002.07.V01 Don dat hang.xlsx`.
- **Tailor bắt-buộc (spec cảnh-báo)**: filter mẫu erratum `grep -viE '\.(zip|exe|png|jpg|jpeg|gif|pdf|gz|ico|woff2?)$'` THIẾU docx/xlsx/pptx/dll ⇒ chạy nguyên-mẫu trên SE = **13 dương-giả** (12 docx + 1 xlsx lọt qua). Đây là bằng-chứng cụ-thể "filter erratum phải tailor per-project theo class SE khai".
- SE-tailored filter `grep -viE '\.(zip|exe|dll|docx|xlsx|pptx|pdf|png|jpg|jpeg|gif|ico|woff2?)$'` = **0 survivors** ⇒ 0 lone-CR suspect.
- Giá-trị: check `i/-text` VẪN đáng giữ như regression-guard — file text lone-CR MỚI sẽ bị `* text=auto` (`.gitattributes:14`) đoán binary → `i/-text` → lọt filter `w/(crlf|mixed)` của lỗ #1. Hiện SE 0 hit ⇒ vacuously-clean, không cần hành-động.

### #5 fixture EOL byte-cố-ý tracked — VERDICT: N-A-BY-DESIGN (không cần attr-line)
- SE **KHÔNG có fixture EOL byte-cố-ý nào TRACKED**. `eol-check.ps1` dùng control **SYNTHETIC IN-MEMORY**: `agent-frontmatter-eol-check.ps1:215-219` build `$ctrlCrlf`/`$ctrlLf` bằng string literal + `[Encoding]::ASCII.GetBytes(...)` — KHÔNG chạm đĩa (DESIGN NOTE `:41-52` khai rõ "synthetic BY NECESSITY"). Fault-inject qua `-RepoRoot` temp-tree (`:75-87`), không phải fixture cố-định.
- `.gitattributes` KHÔNG có dòng `-text` fixture nào — chỉ có sàn `* text=auto eol=lf` (`:14`) + rule text (`broadcasts/** :20`, `*.sh :23`) + binary-class (`:32-44`). Không có `<fixture>/** -text`.
- DESIGN NOTE `eol-check.ps1:60-63` khai script "path-disjoint from its own scan set" ⇒ zero self-reference, zero fixture-file. ⇒ Hazard erratum #5 ("fixture thiếu `-text` tự chết dưới gói vá") KHÔNG THỂ xảy ra ở SE vì không tồn-tại fixture-để-chết.
- Verdict: **n-a-by-design**. NẾU tương-lai SE thêm 1 fixture byte-cố-ý tracked (vd để test không-synthetic) thì MỚI cần `<fixture-dir>/** -text` đặt SAU `* text=auto` (`.gitattributes:14`). Hiện không cần.

### #6 generator write-site (nguồn drift THẬT) — VERDICT: 1 instance sống, contained bởi attr-floor
Inventory write-verb (`grep -rnE 'Out-File|Set-Content|Add-Content|WriteAllText|WriteAllLines'` trong `scripts/*.ps1` + `.claude/hooks/*.ps1`; hooks chỉ có `wal-flush.ps1` = git add/commit KHÔNG ghi nội-dung):

| Site | Verb/Enc | Target | Tracked? | EOL đo |
|---|---|---|---|---|
| **`scripts/mfe-eval.ps1:204`** | `Set-Content -Encoding UTF8` | `.claude/agent-memory/.mfe-state.json` | **YES** | **`i/lf w/crlf`** (5 CR) ← DRIFT SỐNG |
| `scripts/memory-archive-gate.ps1:224` | `Set-Content -Encoding ASCII` | `.claude/agent-memory/.archive-strikes.json` | **NO** (gitignored, `git check-ignore` xác-nhận) | git-vô-hình |
| `scripts/deploy-all.ps1:108` | `Set-Content UTF8` | prod appsettings ($prod) | NO (deploy-target) | n/a |
| `scripts/setup-iis-sites.ps1:123,172` | `Set-Content UTF8` | IIS index + web.config (prod server) | NO | n/a |
| `scripts/rename-test-users-to-roles.ps1:64` | `Out-File ASCII` | $tmpPath (temp sql) | NO | n/a |
| `scripts/wal-recovery-test.ps1:151,154,170,178` | `WriteAllText` | temp test-tree ($Path) | NO | dùng `\n` literal (LF sẵn) |

- **DUY-NHẤT** site ghi ra file TRACKED-text = `mfe-eval.ps1:204`. PS5.1 `Set-Content` mặc-định `[Environment]::NewLine`=CRLF ⇒ `.mfe-state.json` worktree có CRLF (`tr -cd '\r' | wc -c` = **5**). Đúng luận-điểm erratum #6: generator ghi CRLF thẳng worktree, đi vòng qua smudge.
- **NHƯNG blast-radius bị `* text=auto eol=lf` (`.gitattributes:14`) chặn**: clean-filter normalize CRLF→LF lúc commit ⇒ index/blob giữ LF (`i/lf` xác-nhận), `git status --porcelain .mfe-state.json` = **RỖNG** (worktree khớp blob sau clean). ⇒ CRLF KHÔNG vào history. `git add --renormalize --dry-run` vẫn liệt file ⇒ có normalize latent nhưng cosmetic. Đây là ca "renormalize-benign", KHÁC worst-case erratum (81 file, KHÔNG attr, CRLF vào blob) — SE có attr-floor nên tự trung-hoà.
- `memory-budget.json` = `i/lf w/lf` sạch (OWNER hand-edit, không qua Set-Content generator — `crystallized-backfill.ps1:55` chỉ READ nó). WAL/`broadcasts/_index.md` = `i/lf w/lf` sạch.
- **PROPOSE (advisory, tôn-trọng INFORM-stance — nấc PROPOSE)**: self-check-at-point-of-generation tại `mfe-eval.ps1:204` — thay `Set-Content -Encoding UTF8` bằng ghi LF tường-minh, vd (ASCII-safe, gotcha #30): `[System.IO.File]::WriteAllText($statePath, (($st | ConvertTo-Json) -replace "\`r\`n","\`n") + "\`n")`. Xoá churn worktree + noise `git add --renormalize`. Đây là nicety (blob đã LF), KHÔNG phải defect-fix; KHÔNG cần hard-gate. Defensive-note: `memory-archive-gate.ps1:224` cùng-lớp nhưng target gitignored ⇒ chỉ vá nếu file đó có ngày un-ignore.

### #7 ma-trận 4-ô hub vs SE W0.6 — VERDICT: SE = CRLF-row ALIVE point + restart-verify HỢP-LỆ; ô quote-axis UNDETERMINED
Ma-trận erratum §7 = {worktree CRLF, worktree LF} × {mô-tả `: ` chưa-quote, đã-quote}: (CRLF∧chưa-quote)=CHẾT · (CRLF∧đã-quote)=SỐNG(A/B, 1 quan-sát) · (LF∧đã-quote)=SỐNG · (LF∧chưa-quote)=CHƯA-đo.
- SE W0.6 (`W0-evidence:125-198`): `_crlf-probe.md` CR=276 (worktree-CRLF thuần) spawn OK 4/4 tầng (discovery/parse/spawn/execute), token 45240; `_lf-probe.md` CR=0 spawn OK 45248. Verdict SE = **CRLF-TOLERANT**.
- **Ô quote-axis KHÔNG xác-định được**: probe untracked CỐ-Ý (`W0-evidence:165-168` "CẤM git add" vì `* text=auto eol=lf` sẽ normalize mất CR) ⇒ KHÔNG có blob; `git fsck` dangling blob 3b87bb74 = file PE-frontend không liên-quan. Probe đã XOÁ (`:163` step-3). W0-evidence CHỈ ghi dòng `name:` qua od -c (`:144`), KHÔNG ghi dòng `description:`. ⇒ không thể biết mô-tả probe có `: ` chưa-quote hay đã-quote. Recovery FAILED (fsck/stash/scratchpad/session-log đều 0).
- **Trục SE test = LINE-ENDING, KHÔNG phải quote-axis**: A/B của SE giữ description-format HẰNG-SỐ, đổi đúng 1 biến = EOL (`W0-evidence:134,146`). ⇒ SE đo được: (CRLF∧[format-X])=ALIVE + (LF∧[format-X])=ALIVE với X=CÙNG cột. SE KHÔNG độc-lập test trục quote.
- **Restart-verify HỢP-LỆ (thoả tiêu-chí erratum §7:99 + §KHÔNG-BIẾT:116)**: lượt-1 TRƯỚC restart cả 2 not-found (`:149-157`) — SE **KHÔNG** kết-luận CRLF-fatal (dùng nhóm-chứng LF phát-hiện đó là stale-registry/no-hot-reload, KHÔNG phải CRLF — chính bẫy erratum cảnh-báo); lượt-2 SAU restart (S121) cả 2 OK (`:172-195`). ⇒ kết-quả dương của SE đến SAU re-scan ⇒ có giá-trị (erratum: probe TRƯỚC re-scan = vô-giá-trị bác-bỏ; SE tránh đúng bẫy này).
- **SE củng-cố/bổ-sung/mâu-thuẫn ô nào**:
  - CỦNG-CỐ trục-hàng: "CRLF worktree ≡ LF worktree cho agent-spawn" (scope agents/, 1 win32 build) = hàng-CRLF KHÔNG fatal per-se.
  - CỦNG-CỐ kỷ-luật restart-verify của erratum (SE là ca-mẫu tránh-bẫy).
  - KHÔNG mâu-thuẫn ô-1 (CRLF∧chưa-quote=CHẾT) được — vì không biết format probe. NHƯNG NẾU probe là chưa-quote thì SE sẽ (a) MÂU-THUẪN ô-1 + (b) LẤP ô-4 (LF∧chưa-quote=CHƯA-đo) bằng _lf-probe=ALIVE. Cả 2 = giả-định treo trên format-đã-mất ⇒ khai UNDETERMINED, không claim.
  - ⚠️ **Cảnh-báo over-read**: SE ĐÃ gửi W0.6 verdict cho hub (`W0-evidence:214` R4 "Gửi hub KÈM verdict probe"). NẾU hub trích SE làm "dự-án A/B chứng-minh bọc-nháy-là-lưới-thật" ở ô (CRLF∧đã-quote), đó là OVER-READ: A/B đổi-EOL-only KHÔNG thể lập-luận về trục quote (giữ hằng-số). Đóng-góp THẬT của SE = EOL-tolerance (hàng-axis) + restart-verify, KHÔNG phải quote-axis.
- **PROPOSE matrix-ref cho header eol-check.ps1 (ASCII, đáng làm)**: header hiện documents W0.6 refutation (`:16-31`) nhưng KHÔNG nhắc ma-trận 4-ô/trục-quote ⇒ thêm 1 câu chống over-citation tương-lai, vd: `"S121 W0.6 was an EOL-only A/B (description-quote format held constant); it establishes CRLF-vs-LF spawn tolerance for .claude/agents/ (1 win32 build), NOT the description-colon-quote axis of the hub 4-cell death-matrix. Do not cite it as evidence for or against whether quoting is load-bearing."` Đặt trong block "WHY IT STILL EXISTS - the scope limit" (`:25-31`).

### Tổng-kết SE có mang defect erratum không (4 lỗ)
- #4: KHÔNG (0 suspect). #5: N-A (không fixture). #6: CÓ 1 instance nhẹ (mfe-eval.ps1:204 → .mfe-state.json w/crlf) nhưng attr-floor chặn vào-blob ⇒ cosmetic; PROPOSE point-of-gen LF. #7: SE là data-point CỦNG-CỐ (hàng-EOL tolerant + restart-verify), ô quote-axis undetermined; PROPOSE matrix-ref header chống over-read.
- Diff-proposal (em-main verify+apply, PROPOSE-only): (a) `mfe-eval.ps1:204` LF-normalize; (b) `eol-check.ps1:25-31` +1 câu matrix-ref. Cả 2 ASCII-safe, INFORM-nấc (không hard-gate).

## checklistEvidence (verbatim)

#4: i/-text=19 (100% attr/-text, 0 heuristic-binary = 12 docx+6 png+1 xlsx); erratum-raw-filter=13 dương-giả (thiếu docx/xlsx); SE-tailored-filter=0 suspect ⇒ SẠCH. #5: fixture-tracked=0; eol-check.ps1:215-219 synthetic in-memory; .gitattributes 0 dòng `-text` ⇒ n-a-by-design. #6: write-site inventory=7 call/6 file; TRACKED-text target=1 (mfe-eval.ps1:204 → .mfe-state.json i/lf w/crlf, 5 CR); .archive-strikes.json=gitignored; còn lại prod/temp; git status .mfe-state.json=RỖNG (clean-filter chặn CRLF vào blob). #7: SE probe = CRLF-row(276CR) spawn OK 4/4; ô quote-axis UNDETERMINED (probe untracked+deleted, W0-evidence chỉ ghi name: line); A/B đổi EOL-only KHÔNG test quote-axis; restart-verify HỢP-LỆ (lượt1 pre-restart not-found→KHÔNG kết-luận, lượt2 post-restart OK). Diff-proposal=2 (mfe-eval.ps1:204 LF-norm + eol-check.ps1:25-31 matrix-ref), cả 2 PROPOSE-only ASCII INFORM-nấc.

## memoryDelta (verbatim)

- **task:** T1 erratum EOL 16-07 lỗ #4-#7 vs SE (adap-errata S129, read-only PROPOSE)
- **verdict:** #4 SẠCH 0-suspect (19 i/-text=12docx+6png+1xlsx all attr-declared, erratum-raw-filter=13 dương-giả thiếu docx/xlsx) · #5 n-a-by-design (fixture synthetic in-memory eol-check.ps1:215-219, 0 tracked fixture) · #6 1-instance-nhẹ (mfe-eval.ps1:204 Set-Content→.mfe-state.json w/crlf 5CR, nhưng eol=lf clean-filter chặn vào-blob, git status RỖNG) · #7 SE=CRLF-row ALIVE point + restart-verify HỢP-LỆ, ô quote-axis UNDETERMINED (probe untracked+deleted)
- **learned:** attr-floor `* text=auto eol=lf` biến erratum #6 worst-case (81-file CRLF-vào-blob) thành cosmetic worktree-churn: generator Set-Content vẫn ghi CRLF nhưng clean-filter normalize lúc commit → blob LF, git status clean. Tailor filter erratum theo binary-class dự-án là BẮT-BUỘC: mẫu hub thiếu docx/xlsx → 13 dương-giả tại SE.
- **surprise:** W0.6 A/B probe đổi EOL-ONLY (giữ quote-format hằng-số) ⇒ KHÔNG thể lập-luận về trục-quote của ma-trận hub; NẾU hub trích SE làm bằng-chứng 'quoting là lưới thật' = OVER-READ. Probe untracked CỐ-Ý (CẤM git add vì eol=lf sẽ normalize mất CR) ⇒ 0 blob ⇒ format description KHÔNG recover được, ô quote-axis vĩnh-viễn undetermined. .archive-strikes.json gitignored (git-vô-hình) ≠ .mfe-state.json tracked — cùng generator-pattern khác git-visibility.
