# sub-reviewer-0 — R0 (S129) — ON-BEHALF TRANSCRIPT

> 🔴 GHI ON-BEHALF bởi em-main từ journal.jsonl wf_8a0249f6-709 (2026-07-16 đêm).
> Lane R0 khai subMdPath nhưng file KHÔNG tồn-tại trên đĩa (class #53 WRITE-lane, lần 3-4 trong run này).
> Nội-dung dưới = VERBATIM return 4-field từ journal.

---

## findings (verbatim)

**VERDICT: GO-WITH-FIXES** — T0+T1 core verdicts re-verified ACCURATE from disk (0-defect-site STANDS; #4/#6/#7 measurements reproduce exactly; fix②/③ gradings hold). P2 = GO. P1 = GO-WITH-CONDITIONS (NOT GO-as-proposed — writer-only is a half-fix). One T0 supporting-number FALLS: scoped-set "40" is off-by-one, correct = **39** (I own this side of the 39-vs-40 nail).

=== §R0 sub-reviewer-0.md (full detail — em-main scribe verbatim) ===

## (a) Sweep-hole-hunt (independent angle ≠ T0) — T0 "0 defect site" STANDS

Ran `git grep -nE "w/crlf|i/lf|tr -cd .*\r|0x0[Dd]|grep -c"` + `git grep -n "git push"` + `git grep -n "ls-files --eol"` on `*.ps1 *.md *.js *.yml`, excluding frozen (runs/ except this, sessions/, outbox/, agent-memory archives).
- **Only live EOL-counter** = `scripts/agent-frontmatter-eol-check.ps1` (byte-level 0x0D at :14,:181,:287,:311). CLEAN per fix① (byte CR-count, not `grep -c 'i/lf.*w/crlf'`; catches w/mixed; attr-independent).
- **Only live push-path** = `.claude/commands/session-end.md:209`. All other `git push` hits = doc examples (`docs/rules.md:451`, `vps-setup.md:64`, `cicd.md:105` — bare, no gate), memory logs, or cicd-monitor.md:32 (descriptive) = N/A.
- **Every broken-pattern occurrence** (`grep -c 'i/lf.*w/crlf'`, `[ "$n" -eq 0 ] && git push || echo`) lives in `broadcasts/inbox/ai_infra/2026-07-15-...defect-notice.md:52,74,105` + `2026-07-13-...push-guard.md:77` (hub SOURCE = mention) or `docs/governance/adap-requests/2026-07-15-se-r2...` (SE's own request TO hub = mention). ZERO live SE consumers. Correct use⟂mention.
- session-end.md's OWN `grep -c` uses (:73-75,:165) are WAL-counting (`run=`, `wal:`), NOT EOL, and :175 EXPLICITLY forbids using grep-c exit-code as condition. Corroborates fix③ already adopted.
- ⇒ **T0-claim "0 defect site" STANDS** — my different-angle sweep found no additional live defect site. (Nuance: T0's enumerated "8 live-site" is T0's own framing; the substantive 0-defect holds regardless of whether the enumeration is exactly 8.)
- **Adversarial note (looked, not a defect):** session-end.md §5.0 **:168** DOES use `[ "$K" -eq 0 ] && echo "K=0 → skip" || {...}` — an `A && B || C` SHAPE. But (i) §5.0 is pre-pass with NO `git push`, (ii) B=`echo` never fails so `||C` runs only when the numeric test is false. Safe; T0 correctly did not flag it (fix③ targets push-gating specifically).

## (b) i/-text — T1 #4 STANDS EXACTLY
`git ls-files --eol | grep 'i/-text' | grep -v 'attr/-text'` = **0** (empty). Total `i/-text` = **19**. Breakdown: **12 docx + 6 png + 1 xlsx**. Matches T1 #4 claim to the file. All 19 are attr-declared binary; 0 heuristic-binary. STANDS.

## (c) .mfe-state.json — T1 #6 STANDS + NEW BOM datum
- `git ls-files --eol .claude/agent-memory/.mfe-state.json` → `i/lf  w/crlf  attr/text=auto eol=lf`.
- `git status --porcelain <file>` = **EMPTY** (clean-filter normalizes; worktree matches blob after clean).
- Python byte-count (NOT Get-Content): worktree bytes=85, CR=5, LF=5, CRLF=5. Blob (`git cat-file -p :<file>`): CR=0, LF=5. ⇒ CRLF does NOT enter blob. T1 #6 "1 instance contained, blob LF, porcelain empty, 5 CR" STANDS.
- **NEW (decisive for P1):** worktree first bytes = `ef bb bf 7b 0d 0a` and **blob first bytes = `ef bb bf 7b 0a`** → the committed **blob CONTAINS a UTF-8 BOM** (EF BB BF), 80 bytes. Written by PS5.1 `Set-Content -Encoding UTF8` (BOM + CRLF). Full worktree = `b'\xef\xbb\xbf{\r\n "strikes_total": 21,...}\r\n'`.

## (d) .gitattributes provenance — T0/T1 fix②+surprise STAND
- `git log --format='%h %cI' -- .gitattributes | tail -1` = **08c7036 2026-06-15** = first-touch, `broadcasts/** text eol=lf` ONLY (confirmed via `git show 08c7036:.gitattributes`). This is the column-trap T0 flagged (tail-1 = oldest, NOT landing).
- Class-wide `* text=auto eol=lf` landed at **92de58f 2026-07-15** (`git show 92de58f:.gitattributes` → line 14 `* text=auto eol=lf`). Confirmed NOT present in intermediate **8aa3869 2026-07-12** (`git show 8aa3869:.gitattributes` = only broadcasts/** + *.sh; diff 08c7036..8aa3869 adds no text=auto). Both dates < today ⇒ attr applied+committed. T0/T1 fix② "measure AFTER attr" + surprise "tail-1=first-touch not landing" STAND. Immaterial: neither T0 nor T1 mentioned intermediate 8aa3869, but it did not touch the class-wide rule.

## (e) session-end.md §5.2 push-guard — T0 fix③ grading STANDS
- :194-204 `recount()`→`n=$(recount)`→`if [ "$n" -gt 0 ]`→re-squash→`n=$(recount)`→`[ "$n" -eq 0 ] || { echo "STOP..."; exit 1; }` = comparison on the **NUMBER $n** (via `[` builtin, always clean exit), guard-clause form, NOT grep exit-code, NOT inverted.
- :207 `powershell.exe ... agent-frontmatter-eol-check.ps1  # exit 0 ALWAYS` — eol-check standalone, INFORM.
- :209 `git push origin main` — reached unconditionally relative to eol-check (not `&&`-chained to it). Push IS gated on the WAL-squash NUMBER (correct fix③ form), eol-check is INFORM-only. T0 grading STANDS.

## (f) GRADE P1 (mfe-eval.ps1:204 Set-Content→WriteAllText LF) — **GO-WITH-CONDITIONS (LOW) / else DEFER; NOT GO-as-proposed**
Reader inventory (repo-wide grep `mfe-state`): only ONE programmatic reader = `mfe-eval.ps1:193` `Get-Content $statePath -Raw | ConvertFrom-Json`; writer = `:204`. All other refs (WAL.md, harvest MEMORY, memory-budget.json, eval/mfe/README.md, adap-reports, .session-counter.json) = doc/mention, not parsers. Content is strictly ASCII (strikes_total, rca_entries, at=ISO-date). Reader is BOM-agnostic for ASCII ⇒ **functionally safe**.
**BUT three problems make writer-only a half-fix:**
1. **Consumer-sweep gap (PACK-8 / S87):** reader `:193` reads WITHOUT `-Encoding UTF8` — the ONLY read in the file that omits it (contrast :44, :55, :281 all `-Encoding UTF8`). It currently leans on the BOM for encoding auto-detection. Removing the BOM (WriteAllText) leaves :193 on PS5.1 codepage-guess. Safe for ASCII today, latent trap if state ever carries non-ASCII. ⇒ P1 MUST also add `-Encoding UTF8` to :193 in the SAME commit.
2. **Presentation gap (PACK-9 / S81) — blob mutation not disclosed:** synthesis frames P1 as "xoá churn worktree". Measured: the BOM is IN the tracked blob (c). WriteAllText no-BOM removes it → a one-time 3-byte BLOB change (history), not a no-op worktree cleanup. Must be stated honestly in commit/adap-report.
3. **Presentation gap — benefit overstated:** `git status --porcelain` is ALREADY empty (c2). There is no active churn; the renormalize is latent (visible only under `git add --renormalize --dry-run`). "Remove worktree churn" overstates a benefit that never surfaces in normal workflow.
**Grade:** aligns with erratum lỗ #6 (point-of-generation normalize as first-class prevention) — genuine governance value on SE's ONE tracked-text generator site — SO **GO is defensible IF done completely** (writer :204 + reader :193 + honest framing + ASCII-safe verify re-measuring blob = no-BOM + LF). Writer-only as proposed = NO-GO (would itself be a mini change-constant-miss-consumer). DEFER equally defensible since attr-floor already contains blast-radius (T1's own "nicety, not defect-fix").

## (g) GRADE P2 (matrix-ref sentence into eol-check.ps1 header) — **GO**
Insertion target block **"WHY IT STILL EXISTS - the scope limit of that refutation"** confirmed at **:25-31**. It already documents scope-limits (surfaces: agents-only/1 win32 build; not commands/skills/hooks). T1's proposed ASCII sentence adds an AXIS scope-limit (W0.6 = EOL-only A/B, quote-format held constant, does NOT speak to the description-colon-quote axis of the hub 4-cell matrix). Topically consistent; does NOT contradict severity-ladder (:33-39) or the refutation blocks (:4-5, :16-23 already state REFUTED + CRLF-TOLERANT). Proposed sentence is all-ASCII (gotcha #30 OK). Low-risk doc-in-code, zero behavior change. **GO.** Minor: em-main picks exact insertion line; placement right after the "Verdict: CRLF-TOLERANT ... REFUTED" line (:21) is an equally valid alternative.

## DISCREPANCY NAILED — T0 "40" FALLS, correct = 39
`git ls-files '.claude/agents/*.md'` (non-recursive, incl. README per eol-check design :67) = **15**; `commands/*.md` = **18**; `skills/**/SKILL.md` = **6**. TOTAL = **39**. Matches eol-check.ps1 live output (session-end.md:213 "đo S122: 39") and T2's eol-check print (15+18+6). **T0's "40 file (39 +1 agent mới)" is the error** — T0 fabricated a +1 adjustment assuming the "39" note was stale; 39 is the live-correct count. Does NOT change T0's core 0-defect verdict (all 39 have 0 CR / 0 w-crlf), only its supporting count. R1 has the authoritative nail with the README-in-scope-vs-roster-14 nuance; I confirm the number is 39.

## Cross-doc staleness (observation, not in-diff): harvest-curator/archive/2026-07.md:18 states ".mfe-state.json = gitignored:124 by-design" — `git check-ignore` exit=1 (NOT ignored) + file IS tracked. T1's "tracked" is the correct current truth; the harvest memory is stale. Not blocking (harvest's own memory, outside S129 artifacts) but flag for harvest-curator next pass.

## checklistEvidence (verbatim)

(a) Independent-angle sweep (w/crlf|i/lf|tr-cd\r|0x0D|grep-c + git push + ls-files--eol on ps1/md/js/yml, frozen excluded): only live EOL-counter=eol-check.ps1(byte 0x0D), only live push=session-end:209 gated on WAL-number; ALL broken-pattern hits=inbox/frozen/adap-request=mention, 0 live SE consumer ⇒ T0 "0-defect" STANDS. §5.0:168 A&&B||C shape exists but echo-safe+no-push (correctly not flagged).
(b) i/-text total=19 (12docx+6png+1xlsx); minus attr/-text=0 ⇒ T1#4 STANDS exact.
(c) .mfe-state.json = i/lf w/crlf; porcelain EMPTY; worktree 5CRLF+BOM(85B); blob CR=0 LF=5 but blob HAS BOM ef-bb-bf (80B) ⇒ T1#6 STANDS + new BOM datum (decisive for P1).
(d) tail-1=08c7036 2026-06-15 (first-touch broadcasts-only); class-wide `* text=auto eol=lf` @92de58f 2026-07-15 (NOT in 8aa3869 2026-07-12 which only added *.sh); both<today ⇒ T0/T1 fix②+tail-1-trap surprise STAND.
(e) session-end §5.2: recount()→$n→`[ "$n" -eq 0 ] || exit1` = number-compare guard-clause (not grep exit-code, not inverted); eol-check:207 exit0-ALWAYS INFORM; push:209 uncond ⇒ T0 fix③ STANDS.
(f) P1 GRADE = GO-WITH-CONDITIONS(low)/else DEFER, NOT GO-as-proposed: single reader :193 lacks `-Encoding UTF8` → must sweep same-commit (PACK-8); blob HAS BOM → P1 mutates blob not just churn (PACK-9); porcelain already clean → benefit latent/overstated. Aligns erratum#6 point-of-gen only if writer+reader both done.
(g) P2 GRADE = GO: target block confirmed :25-31; ASCII sentence adds axis-scope-limit consistent w/ refutation(:4-5,:16-23)+severity-ladder(:33-39), no contradiction; em-main pick exact line.
DISCREPANCY: T0 scoped-set "40" FALLS → correct 39 (15 agents incl README + 18 commands + 6 skills = matches eol-check live + T2). T0 core 0-defect unaffected.
CROSS-DOC: harvest-curator/archive 2026-07:18 ".mfe-state.json gitignored" = STALE (check-ignore exit=1, file tracked); T1 "tracked" correct.

## memoryDelta (verbatim)

- **task:** S129 review lane-0 (§R0): re-verify T0+T1 erratum-EOL-16-07 findings from disk + grade 2 diff-proposals P1(mfe-eval.ps1:204 Set-Content→WriteAllText LF) / P2(eol-check.ps1 header matrix-ref sentence).
- **verdict:** GO-WITH-FIXES. T0/T1 core STANDS: 0-defect-site re-confirmed via different-angle sweep; #4(i/-text=19,minus-attr=0)/#6(.mfe-state.json blob-LF porcelain-empty)/#7 measurements reproduce exactly; fix②(attr landed 92de58f 2026-07-15, tail-1-trap)+fix③(session-end§5.2 number-compare) gradings hold. P2=GO. P1=GO-WITH-CONDITIONS not-as-proposed (writer-only=half-fix). T0 supporting-number '40'→FALLS, correct=39.
- **learned:** Grading a writer-encoding change: MEASURE the actual blob bytes, don't trust the framing. The BOM (ef bb bf) was IN the committed blob, so Set-Content→WriteAllText mutates history (−3B), not just 'worktree churn' — and porcelain was already empty so the churn benefit is latent (only under --renormalize --dry-run). The matching reader (mfe-eval.ps1:193) omitted `-Encoding UTF8` (unlike :44/:55/:281) and silently leaned on the BOM for auto-detection → per PACK-8/S87 the reader MUST be swept in the same commit or the diff is the very change-constant-miss-consumer anti-pattern being adopted.
- **surprise:** Two meta-count fabrications, both on the wrong side: (1) T0's off-by-one '40' came from assuming eol-check's live '39' was stale and adding a phantom '+1 new agent' — 39 is live-correct (15 agents incl README + 18 cmd + 6 skill). (2) harvest-curator memory (S107) asserts .mfe-state.json 'gitignored:124' but git check-ignore=NOT-ignored AND the file is tracked with a blob — a stale cross-doc claim; T1's 'tracked' is the correct current truth.
