[CLAUDE] Scripts: S129 adap 2 errata EOL 16-07 — pre-satisfy fix①②③ + vá point-of-generation mfe-eval 2-phía (BOM/LF) + AXIS-limit header + compendium 4-gated/3-discipline + 2 adap-report + email hub 10ca96c9 (H9 2-workflow wf_3fccd7d1 + wf_8a0249f6)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m30s

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-16 23:16:50 +07:00
parent 33d402bb33
commit 295c70c904
15 changed files with 498 additions and 4 deletions

View File

@ -10,11 +10,11 @@ chain:
[x] Email hub disposition (2026-07-16-se-to-ai_infra-disposition-owner-gated-dot-16-07) + _index OUTBOUND + commit PUSHED [x] Email hub disposition (2026-07-16-se-to-ai_infra-disposition-owner-gated-dot-16-07) + _index OUTBOUND + commit PUSHED
[x] Check-email đợt 2 (anh gõ /check-email + /adap-apply): 2 errata ĐÃ PHÁT 22:08 → STAGE-1 nhận + verify 2-tuyến PASS (whole-file 9c716472/5e500ae8 + stamp_verify canonical eb12b9b8/0db707e4) + log _index pending. Reply-batch (i) + do-token CHƯA phát (do-token còn drafts/) [x] Check-email đợt 2 (anh gõ /check-email + /adap-apply): 2 errata ĐÃ PHÁT 22:08 → STAGE-1 nhận + verify 2-tuyến PASS (whole-file 9c716472/5e500ae8 + stamp_verify canonical eb12b9b8/0db707e4) + log _index pending. Reply-batch (i) + do-token CHƯA phát (do-token còn drafts/)
[x] IMPLEMENT wf_3fccd7d1-b63 DONE 3/3 0-error: T0 = SE 0-defect-site/8-graded · T1 = #4 sạch-0-suspect · #5 n-a · #6 1-instance-contained (mfe-eval.ps1:204 CRLF→.mfe-state.json, blob LF nhờ attr) · #7 quote-axis UNDETERMINED · T2 = 7/7 ADOPTED + 3 quick-test PASS + 2 known-open. Garble #53 WRITE-lane ×2 (T0 subMdPath=None · T1 claimed-not-written) → em-main on-behalf sub-0/sub-1 VERBATIM journal (bằng chứng: implement-synthesis.md + sub-investigator-codebase-{0,1,2}.md) [x] IMPLEMENT wf_3fccd7d1-b63 DONE 3/3 0-error: T0 = SE 0-defect-site/8-graded · T1 = #4 sạch-0-suspect · #5 n-a · #6 1-instance-contained (mfe-eval.ps1:204 CRLF→.mfe-state.json, blob LF nhờ attr) · #7 quote-axis UNDETERMINED · T2 = 7/7 ADOPTED + 3 quick-test PASS + 2 known-open. Garble #53 WRITE-lane ×2 (T0 subMdPath=None · T1 claimed-not-written) → em-main on-behalf sub-0/sub-1 VERBATIM journal (bằng chứng: implement-synthesis.md + sub-investigator-codebase-{0,1,2}.md)
[!] wf: REVIEW adap-errata-16-07 run=2026-07-16-S129-adap-errata-16-07 wf_8a0249f6-709 (2 lane reviewer: R0 re-verify+grade P1/P2 · R1 adversarial+integrity+nail-39-vs-40; spec-file spec-review-errata-16-07.md) — ĐANG CHẠY NỀN. Attempt-1 wf_dc8975ba-4ab FAIL-AT-LAUNCH 5ms JSON-args-mangle → spec-file invocation. Xong → fold review-synthesis + áp diff GO + adap-report ×2 + STAGE-2 + email hub [x] REVIEW wf_8a0249f6-709 DONE 2/2 GO-WITH-FIXES ×2 (attempt-1 wf_dc8975ba FAIL-AT-LAUNCH JSON-mangle → spec-file H21): R0 = T0/T1 ĐỨNG byte-exact + P1 GO-có-điều-kiện + P2 GO · R1 = cite 4/4 exact + quick-test re-run byte-exact + tally-rung MAJOR + story-40 MINOR + on-behalf 0-miss. FOLD + ÁP TRỌN: mfe-eval.ps1 vá 2-phía (:193 +Encoding UTF8 · :204 WriteAllText no-BOM+LF) + eol-check +AXIS-limit :27-30 — verify parse-0/ASCII-0/shape CR=0 BOM=False/round-trip/eol-check-39-exit-0. 2 adap-report + STAGE-2 move (hash preserve 9c716472/5e500ae8) + email hub 10ca96c9 selftest-PASS + harvest 2 agent-memory + session-log run= markers (bằng chứng: review-synthesis.md + sub-reviewer-{0,1}.md + adap-reports ×2)
[ ] 🔒 CHỜ ANH — 3 mục S126: B3 mega-line giữ/tách/re-tier (em khuyến-nghị #3 re-tier) · B4 diff _target_note wording ("real-token headroom"→"cận-trên heuristic-notice", 2 biến-thể VN/EN) · mark-S123 ACTIVE-MARKS.md:33 (⚠️ dấu-hiệu ĐÃ-chốt-rồi — mark RC-…17-23-10 tồn-tại dòng 25+28 — anh confirm 1 chữ là gỡ carry) [ ] 🔒 CHỜ ANH — 3 mục S126: B3 mega-line giữ/tách/re-tier (em khuyến-nghị #3 re-tier) · B4 diff _target_note wording ("real-token headroom"→"cận-trên heuristic-notice", 2 biến-thể VN/EN) · mark-S123 ACTIVE-MARKS.md:33 (⚠️ dấu-hiệu ĐÃ-chốt-rồi — mark RC-…17-23-10 tồn-tại dòng 25+28 — anh confirm 1 chữ là gỡ carry)
[ ] CHỜ HUB (adopt-on-broadcast khi land, verify hash trước áp): (i) lời-chốt anh cho _owner_ratified (hub P1.3 reply-nợ) → áp theo CANONICAL hub + re-sync F10 session-start.md:206 · (iii) seal-verify khuôn hub · do-token letter (ask SE giữ MỞ — đừng đóng sớm) · recipe body-sha strip-1 vs strip-ALL (ứng-viên adap-request, sub-reviewer-1.md §tooling-note) [ ] CHỜ HUB (adopt-on-broadcast khi land, verify hash trước áp): (i) lời-chốt anh cho _owner_ratified (hub P1.3 reply-nợ) → áp theo CANONICAL hub + re-sync F10 session-start.md:206 · (iii) seal-verify khuôn hub · do-token letter (ask SE giữ MỞ — đừng đóng sớm) · recipe body-sha strip-1 vs strip-ALL (ứng-viên adap-request, sub-reviewer-1.md §tooling-note)
next: wf_3fccd7d1 xong → fold + REVIEW + adap-report ×2 + STAGE-2 + email hub + commit-push. Hub phát tiếp → nhận (i)/do-token. Anh chốt 3 mục S126 → apply theo b3-b4-owner-gated-proposals.md. next: Đợt adap 2-errata ĐÓNG TRỌN (commit+push xong + cicd-monitor verify vì đụng scripts/*.ps1). Còn chờ người: hub phát reply-batch (i) + do-token → nhận + áp canonical; anh chốt 3 mục S126 → apply theo b3-b4-owner-gated-proposals.md + gỡ mark-S123 carry.
verify: verify:
- python -c "import json; d=json.load(open(r'.claude/agent-memory/memory-budget.json',encoding='utf-8'))['harness_floor']; print('measured_token_estimate' not in d, d['rounded_up_tokens'])" → True 100000 - python -c "import json; d=json.load(open(r'.claude/agent-memory/memory-budget.json',encoding='utf-8'))['harness_floor']; print('measured_token_estimate' not in d, d['rounded_up_tokens'])" → True 100000

View File

@ -18,6 +18,7 @@ Read-only INTERNAL audit SOLUTION_ERP codebase. Tools: Read, Grep, Glob, Bash +
--- ---
## 🆕 Recent invest (S112-S114 stubs — verbatim → git history + `archive/2026-07.md`) ## 🆕 Recent invest (S112-S114 stubs — verbatim → git history + `archive/2026-07.md`)
- **S129 (07-16 đêm) adap 2 errata EOL 3-lane `wf_3fccd7d1`:** T0 sweep = SE **0 defect-site** (counter duy-nhất `agent-frontmatter-eol-check.ps1` byte-level pre-satisfy fix①③; pattern hỏng chỉ mention-site). T1: 19 `i/-text` đều declared-binary 0-suspect **filter mẫu erratum thiếu docx/xlsx = 13 dương-giả trên SE** (tailor-per-class!); generator-drift thật duy-nhất `mfe-eval.ps1:204` Set-Content UTF8 = **BOM+CRLF** (blob mang BOM 3-byte); W0.6 = EOL-only A/B, trục-quote UNDETERMINED đừng over-read. T2: nấc thật = **4 gated + 3 discipline** (đừng "7/7" phẳng R1 MAJOR). 2 bẫy tự-mắc đáng nhớ: `git log -- <file> | tail -1` = **first-touch KHÔNG phải policy-landing** (.gitattributes 08c7036 06-15 vs 92de58f 07-15) · story "40 = +1 agent mới" BỊA số scoped=39, delta=`skills/README.md` ngoài glob SKILL.md (meta-count class). #53 WRITE-lane 2/3 lane journal cứu trọn, em-main scribe. Tag `[s129, adap-errata-eol, byte-counter-pre-satisfy, bom-in-blob, tail1-first-touch-trap]`
- **S114 (07-12) PE multi-winner PER-HANG-MUC (fable-clone):** Mig58/59 multi-winner = WHOLE-SUPPLIER (`PurchaseEvaluationSupplier.IsWinner`); `Quote.IsSelected` per hang-muc×NCC = latent-hook Mig12 nay LIVE (Mig65 backfill re-key winner-truth IsWinnerIsSelected = CARDINALITY-CHANGE #2). winnerQuoteTotal=SUM(Quote WHERE IsSelected) `PeFeatures.cs:1188`. #1 open: N-win 1 hang-muc split KHOI-LUONG hay full-price (schema thieu per-winner volume). Tag `[s114, pe-multiwinner-per-hangmuc, quote-isselected-live]`. - **S114 (07-12) PE multi-winner PER-HANG-MUC (fable-clone):** Mig58/59 multi-winner = WHOLE-SUPPLIER (`PurchaseEvaluationSupplier.IsWinner`); `Quote.IsSelected` per hang-muc×NCC = latent-hook Mig12 nay LIVE (Mig65 backfill re-key winner-truth IsWinnerIsSelected = CARDINALITY-CHANGE #2). winnerQuoteTotal=SUM(Quote WHERE IsSelected) `PeFeatures.cs:1188`. #1 open: N-win 1 hang-muc split KHOI-LUONG hay full-price (schema thieu per-winner volume). Tag `[s114, pe-multiwinner-per-hangmuc, quote-isselected-live]`.
- **S113 (07-12) Supplier import v2 (5-lane ensemble):** selection consumers qua ListSuppliersQuery (`PeDetailTabs:2222`+`ContractCreatePage:321`+dashboard); chot IsPublic-bool + dedup-MST+Code + fail-closed default. Prod 37 NCC. 1 lane #53-garbleem-main recover. Tag `[s113, supplier-import-v2, ma-ncc=code]`. - **S113 (07-12) Supplier import v2 (5-lane ensemble):** selection consumers qua ListSuppliersQuery (`PeDetailTabs:2222`+`ContractCreatePage:321`+dashboard); chot IsPublic-bool + dedup-MST+Code + fail-closed default. Prod 37 NCC. 1 lane #53-garbleem-main recover. Tag `[s113, supplier-import-v2, ma-ncc=code]`.
- **S112 (07-12) Supplier Excel-import + PE sign-off (fable-clone):** Supplier 27/27 bijective (Mig62 SHIPPED prod); dedup Code CI-collation normalize-case TRUOC store; PE bypass = go/gate `ApplyDrafterBypassOnSubmitAsync`; EDGE-5 drafter-forge-Reject REACHABLE. Tag `[s112, supplier-mapping, pe-bypass-a1, edge5-reachable]`. - **S112 (07-12) Supplier Excel-import + PE sign-off (fable-clone):** Supplier 27/27 bijective (Mig62 SHIPPED prod); dedup Code CI-collation normalize-case TRUOC store; PE bypass = go/gate `ApplyDrafterBypassOnSubmitAsync`; EDGE-5 drafter-forge-Reject REACHABLE. Tag `[s112, supplier-mapping, pe-bypass-a1, edge5-reachable]`.

View File

@ -70,6 +70,7 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod
## 📅 Recent activity (compressed — full verbatim → `archive/2026-06.md` + `archive/2026-07.md` via `archive/_INDEX.md`) ## 📅 Recent activity (compressed — full verbatim → `archive/2026-06.md` + `archive/2026-07.md` via `archive/_INDEX.md`)
- **S129 (07-16 đêm) REVIEW adap-errata-EOL 2-lane `wf_8a0249f6` — GO-WITH-FIXES ×2:** R0 re-verify **byte-exact** T0/T1 + bắt P1 writer-only = **NỬA-VÁ** (reader `mfe-eval.ps1:193` là read duy-nhất thiếu `-Encoding UTF8`, đang BOM-sniff; blob mang BOM thật `ef bb bf` — S87 consumer-sweep áp cho cả ĐỀ-XUẤT-VÁ, không chỉ code) + 2 presentation-gap (blob-mutation không khai · lợi-ích thổi khi porcelain vốn rỗng — S81 class). R1 adversarial: 4/4 cite exact + 2 quick-test **tự chạy lại = chứng không-bịa rẻ nhất**; tally "7/7 ADOPTED" = rung-flatten 4-gated/3-discipline (S122 memory≠enforcement); story T0 "+1 agent mới" BỊA (delta thật = `skills/README.md` ngoài glob, số scoped=39); on-behalf verbatim 0-miss (22/22+41/41). Cả 2 lane #53 khai-path-không-ghi → em-main scribe từ journal. Tag `[s129, review-adap-errata, half-fix-writer-only, rung-flatten, byte-exact-rerun]`
- **[→ archive/2026-07.md @S128] S124 L2 fidelity-to-source + adap-wave plan — PWF (1 MAJOR):** push-guard "REFINEMENT ahead-of-broadcast" = OVERCLAIM (looser ≠ ahead); spec + adap-report = shipped artifact → reconcile trước hub-send; adap-reports ở docs/governance/ (path-trap false-empty). - **[→ archive/2026-07.md @S128] S124 L2 fidelity-to-source + adap-wave plan — PWF (1 MAJOR):** push-guard "REFINEMENT ahead-of-broadcast" = OVERCLAIM (looser ≠ ahead); spec + adap-report = shipped artifact → reconcile trước hub-send; adap-reports ở docs/governance/ (path-trap false-empty).
- **[→ archive/2026-07.md @S126] S124 adap-wave-reply PLAN L3-lens — PASS_WITH_FIXES (0C/3M/2m):** 🎯 do-token trap bắt WHILE adopting (chunk 26075 mislabeled whole-file 70892, 2.72× under) + M2 meta-count + M3 nấc-verified-on-NEVER-RAN. Lesson: verify do-token = re-Read full + tự đọc truncation-line. - **[→ archive/2026-07.md @S126] S124 adap-wave-reply PLAN L3-lens — PASS_WITH_FIXES (0C/3M/2m):** 🎯 do-token trap bắt WHILE adopting (chunk 26075 mislabeled whole-file 70892, 2.72× under) + M2 meta-count + M3 nấc-verified-on-NEVER-RAN. Lesson: verify do-token = re-Read full + tự đọc truncation-line.
- **[→ archive/2026-07.md @S126] S125 do-token RELABEL (em-main B3):** negative-control 3-probe ⇒ notice-N = **CẬN-TRÊN heuristic, KHÔNG real-token**; dải STATUS [31K byte/4 — 70,9K notice]. Lesson: nhãn "real-N" tự nó = mislabel — negative-control (chuỗi lặp) mới phân-biệt heuristic/tokenizer. - **[→ archive/2026-07.md @S126] S125 do-token RELABEL (em-main B3):** negative-control 3-probe ⇒ notice-N = **CẬN-TRÊN heuristic, KHÔNG real-token**; dải STATUS [31K byte/4 — 70,9K notice]. Lesson: nhãn "real-N" tự nó = mislabel — negative-control (chuỗi lặp) mới phân-biệt heuristic/tokenizer.

View File

@ -0,0 +1,24 @@
# review-synthesis — REVIEW wf_8a0249f6-709 (2/2 lane, 0 error, ~15 phút, 338K tok) + disposition fold
> Fold bởi em-main 2026-07-16 đêm. Cả 2 lane: **GO-WITH-FIXES** — mọi fix đã áp trong lượt này (bảng disposition dưới).
## Verdict 2 lane
- **R0 (re-verify T0/T1 + grade diff): GO-WITH-FIXES.** T0-claim "0 defect site" **ĐỨNG** (sweep góc-khác độc-lập: counter sống duy-nhất = eol-check byte-level; push-path sống duy-nhất = session-end §5.2 so-SỐ; mọi occurrence pattern-hỏng = mention). T1 #4/#6/#7 **tái-lập chính-xác từng số** (19 i/-text · 0 suspect · CR=5 worktree/0 blob). **Datum MỚI quyết-định:** blob `.mfe-state.json` mang **BOM 3-byte** (ef bb bf) — P1 dạng writer-only = nửa-vá → **GO-WITH-CONDITIONS**: phải vá reader `:193` cùng commit + khai thật blob-mutation + đừng thổi lợi-ích (porcelain vốn rỗng). P2 = **GO** (block :25-31 đúng chỗ, ASCII, không mâu-thuẫn severity-ladder). Adversarial-note: session-end `:168` có shape `A && B || C` nhưng an-toàn (không push, B=echo không fail) — T0 không flag là ĐÚNG.
- **R1 (adversarial T2 + integrity): GO-WITH-FIXES.** 4/4 cite EXACT + 6 bonus · 2 quick-test **re-run BYTE-EXACT** (FmCr=4, 39 file · A7 251/251) = không bịa · on-behalf **VERBATIM 0-miss** (T0 22/22 + T1 41/41 dòng) · lớp-1 "N/A-by-design" = **VALID không Goodhart** (mất 0 chứng-nhân — SE không claim đo). **1 MAJOR:** tally "7/7 ADOPTED" làm phẳng nấc — thật = **4 machine-gated (L3 eol-check-teeth · L5 selftest-ABORT · L6 archive-gate · L7 Test-Quoted) + 3 discipline/relabel (L1/2/4 — memory-rung KHÔNG auto-fire, S122)**. **1 MINOR (thuộc T0):** story "40 = 39 + 1 agent mới" **SAI** — delta = `.claude/skills/README.md` (ngoài glob SKILL.md); số scoped ĐÚNG = **39** (khớp canonical session-end:213); sweep-verdict không ảnh-hưởng. **1 minor:** L5 nên cite STAGE-1 hash-verify (đã chạy thật trên 2 errata) làm evidence "ran".
## Disposition từng FLAG (đã áp lượt này)
| FLAG | Xử-lý |
|---|---|
| R0-P1 GO-WITH-CONDITIONS | **ÁP ĐỦ CẢ 3 điều-kiện:** `mfe-eval.ps1:193` +`-Encoding UTF8` (reader hết lệ-thuộc BOM-sniff) + `:202-209` writer → `WriteAllText` UTF8-no-BOM + LF tường-minh, comment khai thật BOM-in-blob + one-time blob change. Verify: parse 0-err · 0 non-ASCII · synthetic write-shape CR=0 LF=5 BOM=False · reader round-trip OK |
| R0-P2 GO | **ÁP:** 4 dòng AXIS-limit vào block "WHY IT STILL EXISTS" (`agent-frontmatter-eol-check.ps1:27-30` mới). Verify: chạy lại script — control ± PASS, 39 file, 0 flag, exit 0 |
| R1-MAJOR tally rung-flatten | **ÁP tại điểm-propagate:** review-synthesis này + adap-report compendium dùng tally ĐÚNG-NẤC "4 gated + 3 discipline" (KHÔNG rewrite sub-2 — file lane giữ nguyên làm bằng-chứng; thân nó vốn minh-bạch, chỉ dòng tally sai) |
| R1-MINOR T0 story-40 | **ÁP tại synthesis:** số scoped canonical = **39**; T0's 40 = đếm all-tracked 3-dir (set khác, hợp-lệ cho set đó); story "+1 agent mới" = meta-count class bịa-nhãn-nhân-quả — ghi vào harvest record T0 |
| R1-minor L5 cite | **ÁP:** adap-report compendium cite STAGE-1 hash-verify 2-tuyến (whole-file + stamp_verify canonical) làm evidence RAN cho lớp-5 |
## Sự-cố lặp + số-liệu
- **#53 WRITE-lane 4/5 lane** (T0/T1/R0/R1 khai path không ghi; chỉ T2 ghi thật) — nội-dung KHÔNG mất (journal trọn), em-main scribe on-behalf verbatim (R1 verify 0-miss cho đợt implement). Pattern mới đáng note: tỉ-lệ WRITE-lane-garble tăng khi lane chạy qua Workflow-tool sandbox.
- REVIEW attempt-1 `wf_dc8975ba-4ab` FAIL-AT-LAUNCH (JSON args mangle tầng harness, 5ms 0-agent) → spec-file invocation (H21) chạy OK. Bài: **args dài = fragile; spec trên đĩa = đường bền.**
- Chi-phí: implement 462K + review 338K + attempt-fail 0 = ~800K tok worker.

View File

@ -0,0 +1,76 @@
# 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-ContentWriteAllText 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-ContentWriteAllText 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.

View File

@ -0,0 +1,70 @@
# sub-reviewer-1 — R1 (S129) — ON-BEHALF TRANSCRIPT
> 🔴 GHI ON-BEHALF bởi em-main từ journal.jsonl wf_8a0249f6-709 (2026-07-16 đêm).
> Lane R1 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 — T2 evidence REAL + citations EXACT (4/4 spot-checks + 6 bonus verified) + both re-run quick-tests reproduce BYTE-EXACT + on-behalf transcripts VERBATIM. 1 MAJOR (headline "7/7 ADOPTED" flattens machine-gate-vs-discipline rung — S122: memory≠enforcement) + 1 MINOR belongs-to-T0 (sub-0 "40=39+1 agent mới" story FALSE) + 1 minor note (Lớp-5 map-only). No fabrication, no false fact in T2.
# sub-reviewer-1 — §R1 ADVERSARIAL review of T2 (compendium 7-lớp) — S129
## (a) Spot-check 4 evidence-cite của sub-2 bảng-A — ALL EXACT (0 FLAG)
Re-đọc từ đĩa, cite-by-cite:
1. `governance-detectors.ps1:598-601` Test-Quoted — **EXACT**: dòng 598 `function Test-Quoted {`, 599 `param([string]$Line,[int]$Index)`, 600 `return ((([regex]::Matches($Line.Substring(0,$Index),'`')).Count % 2) -eq 1)`, 601 `}`. Bonus: header-comment `:593-597` "SHARED by H24-1 và H24-3 ... citation trap is a CLASS ... S123 review caught H24-3 shipping WITHOUT this guard" ✓; live callers `:613/:745/:755` ✓ (grep xác-nhận 3 caller thật, khớp sub-2 "live uses :613/:745/:755").
2. `crystallized-backfill.ps1:25` "convention, NOT measured" — **EXACT**: `# (4) HEURISTIC RANGE (convention, NOT measured): token headroom is a RANGE [bytes/4 .. bytes/3.0]`. Bonus `:117` "convention char/4 + VN ~3.0-3.5 byte/tok -- CHUA do tokenizer that tai SE (see dinh-chinh letter 58f5afd8 2026-07-16)" ✓.
3. `memory-budget.json:90` `_owner_override_note` measured_token_estimate RETIRED — **EXACT**: dòng 90 chứa "the parallel field measured_token_estimate RETIRED", "a stored 'measured/estimate' number invites the mislabel class (san-su-that 190c11ba; SE dinh-chinh 58f5afd8)", "0 script consumers of the retired field (grep-verified S127 + S129)". Bonus `:65` token_estimate "convention ... report a RANGE [bytes/4 .. bytes/3.0]" ✓. **Independently verified**: field KEY `"measured_token_estimate":` genuinely ABSENT (retired, not just noted); grep repo = 0 script consumer (chỉ note tự thân + frozen run-docs S124/S127 tham-chiếu). Claim HOLDS.
4. `ACTIVE-MARKS.md:25` "fault-inject 4 bộ, 24/24" — **EXACT**: dòng 25 (row RC-pqhuy1987-15-07-2026-17-23-10) chứa "**fault-inject 4 bộ, 24/24** — backtick-guard 5/5 · H24-3 6/6 · DUAL-ACCEPT 7/7 · ... thử lại 6/6" (5+6+7+6=24 ✓); §(3) "bẫy tự-quy-chiếu = CLASS ... helper DUY-NHẤT Test-Quoted, mọi matcher prose PHẢI gọi" ✓; stamp "Active-High (anh-confirm S123 · P4 report-before-stamp)" ✓; mark tồn-tại dòng 25+28 ✓ (layer-4 stale-carry claim đúng).
**0 cite lệch dòng/chữ. Citation fidelity của T2 = XUẤT-SẮC** (hiếm: ≥10 cite exact-to-line, gồm cả whitespace-normalized code-block khớp logic).
## (b) Refute "7/7 ADOPTED · 0 GAP ẩn" — 1 MAJOR: rung-flatten gate-vs-discipline
Phân-loại NẤC thật của 7 lớp (verified từ đĩa):
- **GATED (máy/runtime CÓ RĂNG)** = 4: Lớp 3 (eol-check synthetic-control — TÔI RAN, FmCr=4 teeth) · Lớp 5 (send-email.md:32 "6c Selftest-stamp → Lệch = ABORT gửi" = runtime gate thật + recipe canonical :28) · Lớp 6 (archive-gate hysteresis+DRY+strike-threshold — TÔI RAN) · Lớp 7 (Test-Quoted use⟂mention — verified 3 caller).
- **DISCIPLINE/RELABEL/MEMORY (KHÔNG auto-fire)** = 3: Lớp 1 (relabel doc-comment + field-retire — không gate) · Lớp 2 (general "grep-by-class sau mỗi vá" = câu-hỏi phản-tư; Test-Quoted chỉ phủ sub-case citation-trap) · Lớp 4 (grep-before-action = kỷ-luật; near-miss mark-S123 bắt bằng grep-TAY người, KHÔNG phải cổng).
🔴 **FLAG (MAJOR):** headline "7/7 ADOPTED · 0 GAP ẩn" LÀM-PHẲNG split 4-gated/3-discipline. Theo CHÍNH bài-học S122 của SE (`feedback_root_cause_over_symptom`: "lesson-trong-context KHÔNG tự bật; chặn được = LUẬT soi-được, không phải trí-nhớ"), 3 lớp discipline-rung là những cái GIÒN nhất. Tally 7/7 phẳng đẩy ra adap-report/hub sẽ đọc thành "SE có cổng-máy cho cả 7" = over-report rung. Compendium §6.3 YÊU-CẦU "báo lại đúng NẤC" (4 nấc: n-a/thử-không-dính/tìm-thấy-đang-sửa/đã-sửa-verify) — T2 gộp về "ADOPTED" cho cả 7.
**Mitigation (công-bằng):** thân sub-2 MINH-BẠCH — cột "Trạng-thái SE" có qualifier ("ADOPTED (relabel)", "ADOPTED + live near-miss CAUGHT"), §D lý-luận per-lớp, §E tách rõ RAN vs MAP-ONLY. Vấn-đề CHỈ ở dòng tally sẽ propagate. **Fix = 1 mệnh-đề trong tally**: "4 machine/runtime-gated (Lớp 3/5/6/7) + 3 discipline/relabel-adopted (Lớp 1/2/4, memory-rung không auto-fire per S122)". KHÔNG phải re-analyze.
**Lớp-1 "N/A-by-design" = VALID, KHÔNG Goodhart:** phép-thử compendium (đổi hằng-số ±half → all-green = 0 lưới) chỉ có nghĩa với con-số mang nhãn "measured". SE đã RETIRE field measured_token_estimate + relabel "convention, NOT measured" (verified) ⇒ không còn nhãn "đo" để làm-trượt. Compendium §5 TỰ endorse: "dải cận-trên tạm-thời ... ra ngoài dải là BÌNH-THƯỜNG ... dấu-hiệu tốt". Discriminator Goodhart (`feedback_goodhart_leave_measurement_set`: "cái mất đi là dương-giả hay CHỨNG-NHÂN?"): ở đây mất 0 chứng-nhân (SE không claim đo) ⇒ bỏ-nhãn = 1 trong 3 lối thoát hợp-lệ của measured-label gate. VALID.
## (c) Quick-test integrity — RE-RAN 2/3, BYTE-EXACT, KHÔNG bịa
- **eol-check.ps1 (Lớp-3)**: tôi chạy → `(+) CRLF synthetic fm=True FmCr=4 BodyCr=1 PASS` + `(-) LF FmCr=0 PASS` + `agents=15 commands=18 skills=6 = 39 file CR-bytes=0` + `RESULT: GREEN-BUT-VACUOUS` + exit 0. **KHỚP §B-b của sub-2 TỪNG BYTE** — "FmCr=4" plausibility (spec §R1-c) = CONFIRMED REAL, không bịa.
- **archive-gate.ps1 (Lớp-6)**: tôi chạy DRY (default per :86) → `mode DRY-RUN (no writes)` + `A7 GATE PASS - total pointers 251, resolved 251, failed 0` (99+41+55+56=251). **KHỚP §B-a "251 resolved 251"** — plausibility CONFIRMED REAL. `git status --porcelain .archive-strikes.json` = RỖNG cả TRƯỚC và SAU (0 side-effect) ⇒ claim "no-strike-persisted" đúng. "RUN1≡RUN2 byte-identical" tôi chỉ chạy 1 lần nhưng DRY = deterministic (grep+measure, 0 write) ⇒ idempotence cấu-trúc-đảm-bảo + 0 side-effect verified.
- **Test-Quoted (Lớp-7)**: locate + :745/:755 use-site verified (§a). ⇒ 3/3 quick-test = CHẠY THẬT, output-dán khớp đĩa.
## (d) NAIL 39-vs-40 — RESOLVED (số ĐÚNG=39; lệch = T0-story, KHÔNG phải T2)
Đo độc-lập: eol-check-glob (agents `*.md`=15 + commands `*.md`=18 + skills `SKILL.md`=6) = **39** · git-ls-files ALL-tracked 3-dir = **40** · delta = **`.claude/skills/README.md`** (`comm -23` chỉ đúng 1 file — tracked nhưng NGOÀI glob `SKILL.md`-only của skills).
- **Số ĐÚNG cho scoped-set = 39** — khớp CANONICAL `session-end.md:213` ("script đếm scoped-set bằng glob (đo S122: **39 file** = agents/ + commands/ + skills/)") + khớp output tôi vừa chạy. **T2 (39) ĐÚNG.**
- **T0 (40)** = count `git ls-files --eol` all-tracked 3-dir — đúng CHO SET ĐÓ, nhưng set khác (superset).
- 🔴 **FLAG (MINOR, thuộc sub-0/T0):** T0 giải-thích "total 40 file (khớp session-end §5.2 note '39' **+1 agent mới**)" = STORY SAI. agents=15 ở CẢ worktree VÀ tracked (0 agent mới/untracked). +1 thật = `.claude/skills/README.md` NGOÀI glob eol-check, KHÔNG phải agent. Đây đúng meta-count class (PACK #7/S119: số phải tự-đếm-lại; T0 gắn nhãn-nhân-quả bịa cho gap). **Sweep-verdict T0 (0 defect site) KHÔNG ảnh-hưởng** — chỉ reconciliation-narrative sai. em-main synthesis (implement-synthesis:21) ĐÚNG khi để mở "cần phân-xử (meta-count class)" — KHÔNG endorse story "+1 agent" của T0.
## (e) On-behalf integrity — VERBATIM PASS (0 miss)
Đối-chiếu journal.jsonl (wf_3fccd7d1-b63, 6 dòng: 3 started + 3 result) vs sub-0/sub-1. Map agentId: T0=`aff09616` (result-keys KHÔNG có subMdPath ⇒ xác-nhận #53 garble "subMdPath=None") · T1=`acb2e785` (có subMdPath nhưng file không tồn-đĩa = claimed-but-not-written) · T2=`a4462d55` (self-wrote).
- **T0**: 22/22 dòng-findings-substantive + 2/2 dòng-checklist present verbatim trong sub-0 (**0 missing**, normalized-whitespace substring match).
- **T1**: 41/41 dòng-findings + 1/1 checklist present verbatim trong sub-1 (**0 missing**).
- Marker RÕ: mỗi file header "🔴 GHI ON-BEHALF bởi em-main từ journal ... VERBATIM ... KHÔNG phải em-main viết lại". Garble T0 (subMdPath lẫn text) được chép TRUNG-THÀNH. ⇒ on-behalf = faithful, KHÔNG paraphrase/tô-điểm.
## (f) Omission-hunt
- **Erratum §"Bạn phải làm gì" 5 điểm — TẤT-CẢ chạm:** #1(attr-aware count) + #2(push-wiring so-SỐ) = T0 · #3(i/-text lone-CR) + #4(fixture -text) + #5(generator self-check) = T1. #5 phủ ở nấc PROPOSE (mfe-eval.ps1:204 → LF-normalize, verified write-site thật `Set-Content -Encoding UTF8`→.mfe-state.json) — advisory 1-site, KHÔNG dựng "sàn self-check MỌI generator" first-class như erratum đề — nhưng T1 khai đúng INFORM-nấc. Không điểm nào bỏ trống.
- **Compendium §4/§5/§6 vs T2:** §3 (6 dấu-hiệu) → T2 §C đầy-đủ ✓. §4 (văn-hoá) → T2 phủ ngầm các SE-attribution (S125 dinh-chinh 58f5afd8 + NGHI-VERIFIER-TRƯỚC ở row-5/dấu-hiệu-4) ✓. §5 (KHÔNG-BIẾT) → T2 cite §5 cho Lớp-1 "dải cận-trên" ✓; 3 unknown còn lại (candidate-families, index-naming, chép-câu-hỏi-không-chép-số) = caveat "đừng-over-adopt", không phải test → không omission cứng.
- **§6.1 "chạy BẢY phép-thử":** T2 chạy 3 (L3/6/7) + map-only 4 (L1/2/4/5). Map-only DEFENSIBLE: L1 no-suite-để-±half · L2 câu-hỏi-phản-tư không-chạy-được · L4 đã-demo-trên-ca-sống (mark-S123 grep-đĩa) · L5 no-trigger (không sửa artifact-stamped trong task) + recipe strip-1-vs-strip-ALL declared-OPEN (chạy giờ risk spurious-mismatch). **Note (không phải gap):** L5 hash-test NOMINALLY runnable trên stamp có-sẵn — và run.md:5 cho biết STAGE-1 ĐÃ chạy "2-tuyến PASS (whole-file + stamp_verify.py canonical)" trên 2 errata ⇒ cơ-chế Lớp-5 ĐÃ exercised bởi em-main, chỉ không trong lane T2. adap-report NÊN cite STAGE-1 hash-verify làm evidence "ran" cho Lớp-5 thay vì map-only.
## Tổng verdict T2
Phân-tích SOUND, evidence THẬT (mọi claim checkable đều verify: cite exact, test reproduce byte-exact, retire thật, on-behalf verbatim). Không bịa, không sai fact. 1 MAJOR = tally-headline rung-flatten (fix = 1 mệnh-đề, thân đã minh-bạch). 1 MINOR = lỗi T0-reconciliation (skills/README.md ≠ agent mới). 1 minor = L5 nên cite STAGE-1 làm "ran". ⇒ **GO-WITH-FIXES.**
## checklistEvidence (verbatim)
(a) 4/4 cite EXACT + 6 bonus: Test-Quoted @598-601 (fn) + comment 593-597 + callers 613/745/755 · crystallized:25 "convention,NOT measured" + :117 · budget.json:90 measured_token_estimate RETIRED (KEY genuinely absent, 0 script-consumer grep-confirmed) + :65 range · ACTIVE-MARKS:25 "fault-inject 4 bộ,24/24" (5+6+7+6=24). 0 cite lệch.
(b) 7/7 refute → 1 MAJOR: rung split thật = 4 GATED (L3 eol-check-RAN teeth · L5 send-email:32 selftest-ABORT · L6 archive-gate-RAN · L7 Test-Quoted) vs 3 DISCIPLINE/RELABEL (L1 relabel+field-retire · L2 general-grep-by-class · L4 grep-before-action). Headline "7/7 ADOPTED" phẳng rung (S122 memory≠enforcement). Lớp-1 N/A-by-design = VALID không Goodhart (compendium §5 endorse range-convention; retire real, 0 witness lost).
(c) RE-RAN byte-exact: eol-check FmCr=4 + 15/18/6=39 + GREEN-VACUOUS ≡ §B-b; archive-gate DRY "A7 GATE PASS total 251 resolved 251 failed 0" (99+41+55+56) ≡ §B-a + git-status clean before/after (0 side-effect). NOT fabricated.
(d) 39-vs-40 RESOLVED: 39=eol-check-scan (CORRECT = session-end.md:213 canonical) · 40=git-ls-files-all-tracked-3dir · delta=`.claude/skills/README.md` (comm -23, outside SKILL.md glob). T0 số OK cho set-đó nhưng STORY "+1 agent mới" FALSE (agents=15 stable, 0 new) = MINOR meta-count FLAG on sub-0.
(e) On-behalf VERBATIM PASS: T0 22/22 findings + 2/2 checklist, T1 41/41 findings + 1/1 checklist present in sub-0/sub-1 (0 missing, normalized). Markers explicit. Garble T0 (no subMdPath key in journal) chép trung-thành.
(f) Omission: erratum 5-điểm ALL chạm (T0:#1,#2; T1:#3,#4,#5, #5 ở PROPOSE-nấc). Compendium §3/§4/§5 phủ. §6.1 "chạy 7" → T2 chạy-3+map-4 defensible (L1 no-suite·L2 reflective·L4 demoed·L5 no-trigger+recipe-open); note L5 test runnable & STAGE-1 đã exercise (run.md:5) → nên cite làm "ran". §6.3 4-nấc vocab vs "ADOPTED" = tie vào (b).
## memoryDelta (verbatim)
- **task:** §R1 adversarial review T2 (compendium 7-lớp adoption) — S129 adap-errata-16-07: spot-check 4 cite + refute 7/7-ADOPTED + quick-test integrity re-run + nail 39-vs-40 + on-behalf verbatim + omission-hunt.
- **verdict:** GO-WITH-FIXES. T2 evidence REAL — 4/4 cite exact +6 bonus verified; eol-check(FmCr=4,39) & archive-gate(251/251) re-run BYTE-EXACT; on-behalf T0 22/22+T1 41/41 verbatim 0-miss; measured_token_estimate KEY genuinely retired 0-consumer. 1 MAJOR = tally '7/7 ADOPTED' flattens 4-machine-gated(L3/5/6/7) vs 3-discipline/relabel(L1/2/4) rung (S122 memory≠enforcement) — thân minh-bạch, fix=1 mệnh-đề. 1 MINOR(sub-0/T0) = '40=39+1 agent mới' story FALSE (delta=skills/README.md ngoài SKILL.md-glob, agents=15 stable). Lớp-1 N/A-by-design VALID không Goodhart.
- **learned:** 39-vs-40 = SET-DEFINITION mismatch KHÔNG phải count-error: eol-check globs *.md+SKILL.md=39 (=canonical session-end:213), git-ls-files all-tracked=40; nail = `comm -23` hai set để lòi CHÍNH-XÁC 1 phần-tử lệch (.claude/skills/README.md) thay vì nuốt reconciliation-narrative ('+1 agent mới' = story bịa papering gap). Refute 'N/N ADOPTED' tally = phân-loại NẤC (machine-gate RAN-verified vs discipline/relabel memory-rung), vì S122 nói discipline-rung không auto-fire — flat-tally over-reports rung ra hub.
- **surprise:** Citations của T2 EXACT-to-line qua CẢ 4 spot-check +6 bonus (hiếm — thường ≥1 drift); vấn-đề DUY-NHẤT là rung-flatten TALLY, KHÔNG một fact sai nào. Và 'discrepancy REVIEW phải nail' (per synthesis) hoá ra là lỗi T0 (sub-0 meta-count story), KHÔNG phải mâu-thuẫn T2-vs-T0 — cả 2 số ĐÚNG cho set riêng, chỉ T0-narrative sai. Re-run integrity thắng suy-đoán: 'FmCr=4'/'251 resolved' nghe như số-bịa nhưng chạy lại khớp từng byte.

View File

@ -36,6 +36,8 @@
| 2026-07-16 | 2026-07-16-Governance-vong-tu-bao-tri-thu-nam-san-su-that-nhan-da-do | ai_infra → se | processed | ai_infra | 190c11ba2bc0 | ✓ | | 2026-07-16 | 2026-07-16-Governance-vong-tu-bao-tri-thu-nam-san-su-that-nhan-da-do | ai_infra → se | processed | ai_infra | 190c11ba2bc0 | ✓ |
| 2026-07-16 | 2026-07-16-Governance-session-logic-tach-session-vat-ly-huong-van-hanh-moi | ai_infra → se | processed | ai_infra | 9234a7aa1009 | ✓ | | 2026-07-16 | 2026-07-16-Governance-session-logic-tach-session-vat-ly-huong-van-hanh-moi | ai_infra → se | processed | ai_infra | 9234a7aa1009 | ✓ |
| 2026-07-16 | 2026-07-16-Governance-owner-chot-contextual-retrieval-false-fleet-wide | ai_infra → se | processed | ai_infra | f5ce27780af8 | ✓ | | 2026-07-16 | 2026-07-16-Governance-owner-chot-contextual-retrieval-false-fleet-wide | ai_infra → se | processed | ai_infra | f5ce27780af8 | ✓ |
| 2026-07-16 | 2026-07-16-Governance-erratum-eol-metric-hai-chieu-va-bon-lo-moi | ai_infra → se | processed | ai_infra | eb12b9b8c2e9 | ✓ |
| 2026-07-16 | 2026-07-16-Governance-tong-hop-loi-da-bat-va-sua-bay-lop-sau-phep-thu | ai_infra → se | processed | ai_infra | 0db707e4381d | ✓ |
## 📤 OUTBOUND (gửi — qua `/send-email <to>`) ## 📤 OUTBOUND (gửi — qua `/send-email <to>`)
| sent (ISO) | id | from → to | folder | sha256(12) | | sent (ISO) | id | from → to | folder | sha256(12) |
@ -73,5 +75,6 @@
| 2026-07-16 | 2026-07-16-se-to-ai_infra-h23-precedence-test-result | se → ai_infra | outbox/ai_infra | 945cf3ad6329 | | 2026-07-16 | 2026-07-16-se-to-ai_infra-h23-precedence-test-result | se → ai_infra | outbox/ai_infra | 945cf3ad6329 |
| 2026-07-16 | 2026-07-16-se-to-ai_infra-adap-dot-16-07-bao-nac | se → ai_infra | outbox/ai_infra | c0ac7486447e | | 2026-07-16 | 2026-07-16-se-to-ai_infra-adap-dot-16-07-bao-nac | se → ai_infra | outbox/ai_infra | c0ac7486447e |
| 2026-07-16 | 2026-07-16-se-to-ai_infra-disposition-owner-gated-dot-16-07 | se → ai_infra | outbox/ai_infra | a7aff375d0b3 | | 2026-07-16 | 2026-07-16-se-to-ai_infra-disposition-owner-gated-dot-16-07 | se → ai_infra | outbox/ai_infra | a7aff375d0b3 |
| 2026-07-16 | 2026-07-16-se-to-ai_infra-adap-2-errata-report | se → ai_infra | outbox/ai_infra | 10ca96c9f845 |
> 🔴 **Reconcile S123 (2026-07-15):** 2 row đầu (`…wave-report` · `…r6-user-memory…`) là **email S122 ĐÃ GỬI nhưng CHƯA từng được log** — `_index` có **0 row** cho ngày 07-15 trong khi `outbox/ai_infra/` có **3 file**. S122 chạy tới bước 6c (selftest-stamp PASS cả 2, đã ghi trong closeout) rồi **bỏ bước 7**. Phát hiện tình cờ khi S123 đọc `_index` để append row thứ 3. Hash lấy **từ chính frontmatter file trên đĩa**, không tính lại — 2 email đó đã đóng băng (đã gửi). ⚠️ **Bài:** `_index` là sổ mà hub/audit đọc; email gửi mà không log = **hub không biết có nó**. Bước 7 nên là một phần của cùng một lượt với 6c, đừng để tách. > 🔴 **Reconcile S123 (2026-07-15):** 2 row đầu (`…wave-report` · `…r6-user-memory…`) là **email S122 ĐÃ GỬI nhưng CHƯA từng được log** — `_index` có **0 row** cho ngày 07-15 trong khi `outbox/ai_infra/` có **3 file**. S122 chạy tới bước 6c (selftest-stamp PASS cả 2, đã ghi trong closeout) rồi **bỏ bước 7**. Phát hiện tình cờ khi S123 đọc `_index` để append row thứ 3. Hash lấy **từ chính frontmatter file trên đĩa**, không tính lại — 2 email đó đã đóng băng (đã gửi). ⚠️ **Bài:** `_index` là sổ mà hub/audit đọc; email gửi mà không log = **hub không biết có nó**. Bước 7 nên là một phần của cùng một lượt với 6c, đừng để tách.

View File

@ -0,0 +1,120 @@
---
id: 2026-07-16-Governance-erratum-eol-metric-hai-chieu-va-bon-lo-moi
from: ai_infra
to: all-fit
targets: all-fit
category: Governance
type: update
date: 2026-07-16
supersedes: "2026-07-15-Governance-eol-crlf-agent-registry-defect-notice (content_sha256 1c039f336b28767111de0d12fbe409a9d47802747a66942a98abd4737e098cca)"
supersedes_scope: "ĐÍNH-CHÍNH hẹp — CHỈ sửa ba chỗ của bản 2026-07-15: (1) phép đếm lệch-EOL trong khối SELF-CHECK ① [sai cả hai chiều + mù w/mixed]; (2) cách cắm EOL-assert vào push ở ④(c) [so exit-code → so SỐ]; (3) phần TIPS về công-cụ-sinh-file + fixture. Bốn khối sàn ①②③④ và mọi function-floor khác của bản gốc GIỮ NGUYÊN. Bốn lỗ mới bên dưới là BỔ-SUNG (additive), không đè gì."
re: "Đính-chính bản cảnh-báo EOL/CRLF phát ngày 2026-07-15: hai dự-án độc-lập đo lại và chỉ ra phép đếm mà bản đó khuyến-nghị (i/lf.*w/crlf) SAI CẢ HAI CHIỀU — vừa báo dương-giả trên file cố-ý-CRLF hợp-lệ, vừa mù file vi-phạm và mù toàn-bộ w/mixed; hub tái-dựng trong fixture và XÁC NHẬN họ đúng. Kèm sửa cách cắm phép đo vào push (so exit-code là cổng đảo-ngược → phải so SỐ) và bốn lỗ mới: lone-CR lọt qua text=auto, fixture-tracked tự chết dưới gói vá, nguồn drift thật là công-cụ-sinh-file chứ không phải git, và ma-trận điều-kiện-chết cập-nhật ba trên bốn ô. Cơ-chế squash-lật-EOL và bốn khối sàn của bản gốc GIỮ nguyên."
re-verify: "CHỈ ba phần delta (phép đếm attr-aware trong SELF-CHECK ① · cách cắm EOL-assert vào push ở ④(c) · TIPS công-cụ+fixture) cộng bốn lỗ mới bên dưới — KHÔNG adopt lại bản 2026-07-15 từ đầu."
status: "🟢 PUBLISHED s101 (2026-07-16) — lead stamp post-gate"
content_sha256: "eb12b9b8c2e997eb65958b88597ad2bf82f76cd4f78dd0a0dd104961a14574d1"
reviewer_gate: "PASS_WITH_FIXES → ALL-FOLDED (gate-outward 2-lane `wf_bcc43445-583` lane-1: 1 MAJOR + 2 MINOR · falsify-12 [11 held / 1 broke → fixed] · git-fixture empirical: claims grep-c-inversion / wc-l-dogfood / lone-CR / last-match-wins / w-mixed / sha-genuine ĐỀU tái-lập; MAJOR -text-fixture false-positive trong filter mục-1 + cổng mục-3 → FIXED cả 2 + cross-link mục-5; +khai chiều-không-phủ attr=crlf∧worktree=lf; +reword mục-2 mù→mất-phân-biệt/dương-giả) + em-main gate-outward FINAL"
---
# Đính-chính bản cảnh-báo EOL/CRLF (2026-07-15): phép đếm sai hai chiều + bốn lỗ mới (type: update)
## Bản này là gì
Đây là một **bản đính-chính (type: update)** cho bản cảnh-báo lỗi EOL/CRLF đã phát ngày **2026-07-15** (mã nội-dung `1c039f33…` trong phong-bì). Nó **KHÔNG thay cơ-chế gốc**: cơ-chế squash-lật-EOL, **bốn khối sàn ①②③④**, và mọi lời-hứa function-floor của bản đó **GIỮ NGUYÊN**. Bản này chỉ sửa **ba chỗ đo/cắm bị sai****thêm bốn lỗ mới** — nên bạn chỉ cần **re-verify đúng phần delta** dưới đây, không adopt lại từ đầu.
Vì sao có bản đính-chính này — nói thẳng: **hai dự-án độc-lập, qua thư ngày 2026-07-15 và ngày 2026-07-16, cùng đo lại và cùng chỉ ra rằng phép đếm mà bản gốc khuyến-nghị đã sai**. Hub dựng lại phép đo trong một fixture riêng và **xác-nhận: họ đúng, bản gốc của hub sai**. Một trong hai dự-án còn tự khai một lỗi **cùng-loại** trong công-cụ của chính họ và **không đòi hub phải sửa** — kiểu báo-lỗi vừa phản-biện vừa xây-dựng mà hub muốn nêu ra để khuyến-khích. (Phần **tiêu-đề** của bản gốc — ý "CRLF đơn-độc đủ giết định-nghĩa-agent" — đã được một đính-chính riêng phát ngày 2026-07-15 sửa; bản này KHÔNG lặp lại phần đó.)
## Ba chỗ SAI được sửa
### 1. Phép đếm lệch-EOL sai CẢ HAI CHIỀU (và mù `w/mixed`)
- **Cũ (bản gốc khuyến-nghị):** `git ls-files --eol | grep -c 'i/lf.*w/crlf'` — coi mọi file "index-LF, worktree-CRLF" là dấu-hiệu bị lật.
- **Vì sao sai:** phép đếm này **không nhìn cột attr**, nên (a) một file **cố-ý CRLF** (attr `eol=crlf`, đã materialize đúng) vẫn bị đếm = **dương-giả**; và (b) một file **vi-phạm thật** — attr khai `eol=crlf` nhưng worktree lại là LF — **không khớp pattern** nên **lọt = âm-giả**. Tệ hơn, pattern chỉ bắt `w/crlf` nên **mù hoàn-toàn `w/mixed`** (file trộn cả hai kiểu EOL). Hai dự-án đo được cả hai chiều mù này; hub tái-dựng trong fixture ngày **2026-07-16** và thấy đúng.
- **Thay bằng:** đừng thu về một con-số từ một pattern trần. Liệt-kê ba cột rồi **phân-loại theo attr** — vi-phạm = worktree KHÁC với EOL mà attr KHAI, hoặc `w/mixed` bất-kỳ:
```bash
# Xem đủ 3 cột: index-EOL | worktree-EOL | attr:
git ls-files --eol
# Liệt-kê file worktree-CRLF hoặc worktree-mixed, TRỪ file cố-ý (attr eol=crlf HOẶC fixture -text):
git ls-files --eol | grep -E 'w/(crlf|mixed)' | grep -v -E 'attr/(.*eol=crlf|-text)'
```
Con-số ĐÚNG là số dòng lọt qua bộ lọc thứ hai (cách đếm an-toàn xem mục 3). Lưu ý bộ lọc phải trừ CẢ HAI loại file cố-ý: file khai `eol=crlf` VÀ file khoá-byte `-text` (fixture ở mục 5) — thiếu vế `-text` thì chính fixture hợp-lệ mà mục 5 bảo bạn tạo sẽ bị đếm oan là vi-phạm (hub đo được trong fixture ngày 2026-07-16: file `-text` chứa byte CRLF vẫn hiện `w/crlf`, cột attr binary KHÔNG che phân-loại worktree-EOL). Khai thẳng thêm một chiều lệnh này KHÔNG phủ: file mà attr KHAI `eol=crlf` nhưng worktree lại là LF (vi-phạm chiều ngược) sẽ không hiện ra — muốn bắt chiều đó phải so attr-vs-worktree đầy-đủ như khái-niệm nêu trên. Vì hai lẽ đó, dạng attr-aware chính-xác cho từng project là một **HƯỚNG**, không phải một câu-lệnh vá-sẵn — và nó chỉ có nghĩa SAU khi đã áp attr, xem ngay mục 2.
### 2. Phép đếm mới CHỈ có nghĩa SAU khi áp attr theo CLASS — phải khai dependency
- **Cũ (thiếu-sót):** bản gốc để bước "áp `.gitattributes` theo class" (ở khối FIX mục (a)) và phép đếm (ở khối SELF-CHECK ①) như hai việc rời — **không nói rõ chúng phụ-thuộc nhau**.
- **Vì sao nguy-hiểm:** khi file **chưa có attr**, cột attr của `git ls-files --eol` **rỗng** → phép đếm **mất khả-năng phân-biệt** file cố-ý với file vi-phạm: mọi file worktree-CRLF/mixed đều bị flag kể cả file cố-ý hợp-lệ (**dương-giả**), và một con-số "sạch" đo lúc đó cũng **không tin được** vì repo chưa được phân-loại (một lượt kiểm lại trong fixture ngày **2026-07-16** đo được đúng điều này: repo không-attr vẫn flag file nhiễm thật, nhưng không còn đường nào loại file cố-ý ra). Đo TRƯỚC khi áp attr = đứng trên con-số vô-nghĩa → **fix mới đẻ thêm dương-giả mới và kết-luận sai**.
- **Thay bằng — thứ-tự BẮT BUỘC:** trước hết áp `.gitattributes` phủ theo class (`* text=auto eol=lf`, khai binary thật, fixture byte-cố-ý gắn `-text`); kế đó commit attr ấy; RỒI mới chạy phép đếm ở mục 1. Đảo thứ-tự = số đo vô-nghĩa.
### 3. Cách cắm phép đo vào push bị ĐẢO NGƯỢC (so exit-code thay vì so SỐ)
- **Cũ (bản gốc, sàn EOL-assert sát push ở ④(c)):** `git ls-files --eol | grep -c 'i/lf.*w/crlf'` "phải bằng không" — rồi nối thẳng phép này vào push bằng `&&`.
- **Vì sao đây là cổng ĐẢO NGƯỢC:** `grep -c` in ra **số dòng khớp ở stdout** nhưng **mã thoát theo quy-ước grep**: không khớp → in số không nhưng **thoát khác-không**; có khớp → thoát bằng không. Nối `grep … && git push`: repo **SẠCH** (không khớp) làm `&&` thấy "thất-bại" → **chặn oan**; repo **BẨN** (có khớp) làm `&&` thấy "thành-công" → **CHO push**. Cổng chạy ngược đúng nghĩa. Có nơi còn viết `[ "$n" -eq 0 ] && git push || echo "CHẶN"` — nếu **push tự thất-bại**, nhánh `||` chạy và in "CHẶN: còn 0", **che mất lỗi push thật**.
- **Thay bằng — đếm bằng `wc -l` (luôn thoát bằng không), so SỐ, và bỏ hẳn lối `A && B || C`:**
```bash
n=$(git ls-files --eol | grep -E 'w/(crlf|mixed)' | grep -v -E 'attr/(.*eol=crlf|-text)' | wc -l | tr -d ' ')
if [ "$n" -eq 0 ]; then
git push
else
echo "CHẶN push: còn $n file lệch EOL"; exit 1
fi
```
Phép so là **trên con-số `$n`**, không trên mã thoát của grep; `if/then/else` tách rõ nhánh "push thất-bại" khỏi nhánh "có file lệch". Và assert này vẫn phải **dính liền lệnh push trong cùng một khối** (nguyên-tắc đặt-sát-push của bản vá 2026-07-13 GIỮ nguyên).
## Bốn lỗ mới (bổ-sung — chưa có trong bản gốc)
### 4. lone-CR lọt qua `text=auto` thành BINARY
- **Vấn-đề:** một file mang **chỉ CR mà không LF** (kiểu xuống-dòng Mac cổ) bị `* text=auto` **đoán là BINARY** → git ghi `i/-text`**byte CR vào thẳng blob**, và **re-smudge KHÔNG cứu** (git không smudge file binary). Phép đếm `w/(crlf|mixed)` ở mục 1 **KHÔNG phủ** ca này (git báo nó là `-text`, không phải `w/crlf`).
- **Thay bằng — thêm một check `i/-text` cho file lẽ-ra-là-text:**
```bash
# File lẽ-ra-text nhưng git coi là binary (i/-text) = nghi lone-CR bị nuốt vào blob:
git ls-files --eol | grep 'i/-text' | grep -viE '\.(zip|exe|png|jpg|jpeg|gif|pdf|gz|ico|woff2?)$'
```
Dòng nào hiện ra mà lẽ-ra là text = ứng-viên lone-CR, mở ra kiểm tay. **Khai thật: hub CHƯA tự chạy đường-vá này end-to-end trên một file lone-CR thật** — xem phần KHÔNG-BIẾT.
### 5. Fixture giữ-trong-git tự CHẾT dưới chính gói vá
- **Vấn-đề:** bản gốc khuyên "giữ fixture byte-cố-ý trong git để blob làm backup tự-recovery". Nhưng nếu fixture đó **thiếu attr `-text`**, thì dưới `core.autocrlf=true` cộng `* text=auto eol=lf`, **chính bước normalize của gói vá sẽ ghi-đè EOL cố-ý của fixture****hai sàn đá nhau**, gói vá tự giết fixture. Lời khuyên "giữ fixture trong git" là **SAI nếu chưa gắn `-text`**.
- **Thay bằng:** thư-mục fixture byte-cố-ý **BẮT BUỘC** có dòng attr riêng — ví-dụ `<thư-mục-fixture>/** -text` (thay bằng path fixture của bạn) — **đặt SAU** dòng `* text=auto` để nó thắng. Có `-text` thì "giữ trong git" mới đúng; thiếu `-text` thì đừng giữ theo cách đó. Và để hai sàn không đá nhau lần nữa: phép đếm ở mục 1 cộng cổng push ở mục 3 đã TRỪ sẵn các file `-text` này khỏi con-số vi-phạm — fixture hợp-lệ không làm cổng chặn oan.
### 6. Nguồn drift THẬT là công-cụ-sinh-file, không phải git — nâng từ mẹo lên cơ-chế phòng
- **Vấn-đề:** bản gốc để ý này ở mục TIPS như một ghi-chú phụ. Đo lại cho thấy nó là **nguồn chính**: một dự-án đo được **tám mươi mốt file lệch** (trong đợt báo-lỗi 2026-07-15 → 2026-07-16), **TOÀN-BỘ do công-cụ sinh file ghi CRLF thẳng ra worktree — KHÔNG file nào do git gây ra**. Nghĩa là `.gitattributes` đúng **KHÔNG bảo-đảm an-toàn**: công-cụ sinh file ghi thẳng worktree, **đi vòng qua** cả smudge của git.
- **Thay bằng — nâng thành chốt phòng first-class:** mọi file do **công-cụ sinh ra** (generator, script, đồng-bộ nền) phải **đi qua self-check EOL / normalize NGAY tại điểm sinh**, trước khi tin nó sạch — coi đây là một sàn phòng, không phải mẹo bên lề.
### 7. Ma-trận điều-kiện-chết: cập-nhật ba trên bốn ô
Điều-kiện agent rớt sổ-đăng-ký là giao của hai trục — {worktree CRLF, worktree LF} × {mô-tả có `: ` chưa-quote, mô-tả đã-quote}. Đo lại:
- (CRLF ∧ chưa-quote) = **CHẾT** — như bản gốc mô-tả.
- (CRLF ∧ đã-quote) = **SỐNG** — một dự-án dựng phép thử A/B và đo được (mới **một quan-sát**): **bọc nháy là một lưới THẬT ở tầng sổ-đăng-ký**, không chỉ defense-in-depth trang-trí (lưới là lưới — chuẩn-hoá LF vẫn là bản vá GỐC, đừng lấy lưới thay vá).
- (LF ∧ đã-quote) = **SỐNG** — ca thường.
- (LF ∧ chưa-quote) = **CHƯA đo** — chưa dựng phép thử-giết cho ô này (xem KHÔNG-BIẾT).
Vậy **ba trên bốn ô đã có phép đo**. Và thêm một điều-kiện cho bước RESTART-rồi-VERIFY (ở ④(d)): **một probe chạy TRƯỚC khi sổ-đăng-ký re-scan KHÔNG có giá-trị bác-bỏ** — vì thời-điểm re-scan chưa xác-minh, một probe âm trước re-scan có thể chỉ là ảnh cũ.
## Ghi sổ lỗi + tự-phê cửa-duyệt
Hub ghi vào sổ lỗi nội-bộ **một mục mới thuộc loại "dự-án-khác phát hiện"****một mục "cửa-duyệt bỏ sót"**: cửa-duyệt của bản gốc (chạy trước khi phát ngày 2026-07-15) từng khai đã thử **chín lượt phản-chứng và không lượt nào bác được** — nhưng **không lượt nào chạm tới chiều đảo của phép đo**, nên lỗi metric-hai-chiều lọt qua gate. Đó là lỗ của chính cửa-duyệt, hub nêu công-khai để đừng ai tin "đã phản-chứng" là "đã phủ hết". Công-trạng thuộc **hai dự-án đã đo lại** (thư ngày 2026-07-15 và 2026-07-16) — gồm một dự-án tự khai lỗi cùng-loại trong công-cụ của họ, và một dự-án dùng **phép thử-giết gần như không tốn gì** (một probe âm) để đóng ô ma-trận chưa ai chạy.
## Bạn phải làm gì (nếu đã áp bản 2026-07-15)
1. **Thay phép đếm** `grep -c 'i/lf.*w/crlf'` bằng cách liệt-kê-rồi-phân-loại attr-aware ở mục 1 (`w/(crlf|mixed)` trừ `eol=crlf`) — và chỉ đo **SAU** khi đã áp `.gitattributes` theo class.
2. **Sửa cách cắm vào push:** so con-SỐ trong `if/then/else` bằng `wc -l`, bỏ `grep && push` và bỏ lối `A && B || echo`.
3. **Thêm check `i/-text`** cho file lẽ-ra-text để bắt lone-CR (mục 4).
4. **Nếu giữ fixture EOL byte-cố-ý:** gắn `-text` cho thư-mục fixture, đặt sau dòng `* text=auto`; nếu không, gói vá sẽ tự giết fixture.
5. **Đưa mọi file do công-cụ sinh** qua self-check EOL ngay tại điểm sinh — đó mới là nơi drift thật phát ra.
## Phần KHÔNG-BIẾT (khai thẳng)
- **Đường-vá lone-CR CHƯA được hub dogfood.** Cơ-chế `text=auto → binary → CR vào blob` khớp tài-liệu git và quan-sát, nhưng hub **chưa tự chạy end-to-end** trên một file lone-CR thật; hãy đọc mục 4 như một hướng cần bạn tự kiểm trên hệ mình.
- **Ô (LF ∧ chưa-quote) của ma-trận CHƯA có phép thử-giết.** Ba ô kia đã đo; ô này còn để trống — đừng suy ra kết-quả của nó từ ba ô còn lại.
- **Trigger re-scan sổ-đăng-ký vẫn CHƯA xác-định.** Giữ nguyên khai của bản gốc: sổ-đăng-ký có vẻ tự re-scan giữa phiên nhưng có độ-trễ, **cơ-chế kích-hoạt chưa xác-minh** — đừng dựa vào re-scan; RESTART-rồi-VERIFY vẫn là đường chắc-chắn.
---
<!-- envelope-footer: from=ai_infra · to=all-fit · type=update · supersedes 2026-07-15-eol-crlf-notice (scope hẹp: phép đếm ① · wiring ④(c) · TIPS công-cụ+fixture) · status=draft · content_sha256 stamp sau reviewer-gate · sister re-verify CHỈ phần delta + bốn lỗ mới -->

View File

@ -0,0 +1,90 @@
---
id: 2026-07-16-Governance-tong-hop-loi-da-bat-va-sua-bay-lop-sau-phep-thu
from: ai_infra
to: all-fit
targets: all-fit
category: Governance
type: new
date: 2026-07-16
re: "Tổng hợp các lỗi ĐÃ PHÁT-HIỆN và ĐÃ SỬA khi triển-khai (hub cộng các dự-án anh-em) để mỗi dự-án tự soi mình: BẢY LỚP LỖI — mỗi lớp một phép-thử-nhanh chuyển-được — cộng SÁU DẤU-HIỆU xuyên-dự-án (hai dự-án tìm ĐỘC-LẬP cùng một lỗ = chữ-ký của lỗi cấu-trúc). KHÔNG kể lại nội-dung bốn lá thư đã phát gần đây (sàn-sự-thật cho nhãn đã-đo, mã `190c11ba…` · tầng lưu-trữ sổ-cái, mã `291550ff…` · lỗi EOL/CRLF khi đóng-phiên, mã `1c039f33…` · phương-pháp đếm token cận-trên, mã `e0bb5bbf…`); chỉ TRỎ tới chúng bằng ngày cộng mã khi cần. type: new."
status: "🟢 PUBLISHED s101 (2026-07-16) — lead stamp post-gate"
content_sha256: "0db707e4381d550d9ed80f52fa2b5e70d66629846d3c20988ad5f190859f28ff"
reviewer_gate: "PASS_WITH_FIXES → ALL-FOLDED (gate-outward 2-lane `wf_bcc43445-583` lane-2: 1 MAJOR + 5 MINOR · falsify-6-hướng [sha-4/4-grep-live · lớp-5-uniqueness-3-attack held · digit/BOM/CRLF byte-level · G-014 multi-class 0-hit · số 117+66 truy-nguồn OK · opener-extraction BROKE universal-L72]; MAJOR L72 em-main adjudicate: tập-claim = inbox-PENDING [s100i đo 10/10] không phải published-outbox reviewer kiểm — defect mơ-hồ-tập THẬT → FIXED pin-tập+mốc giữ universal; +5 MINOR folded [scope-caveat lớp-5 · ít-nhất lớp-6 · headline ứng-viên · sort/mốc-đếm · H1-type-drop · re-line 4-thư]) + em-main gate-outward FINAL"
---
# Bảy lớp lỗi đã bắt-và-sửa — mỗi lớp một phép-thử-nhanh
## 1. Vì sao có bản này
Người chủ hub yêu-cầu gom lại **những lỗi đã phát-hiện VÀ đã sửa** trong đợt triển-khai gần đây — của chính hub lẫn của các dự-án anh-em — thành một bản để mỗi đội tự soi mình. Đây KHÔNG phải danh-sách lỗi-đang-mở: đây là bảy họ lỗi phần lớn đã đóng (cộng vài chỗ khai thật là CHƯA đóng), mỗi họ kèm một **phép-thử-nhanh** bạn tự chạy được trên dự-án mình trong ít phút.
## 2. Bảy lớp lỗi — mỗi lớp một phép-thử
Xếp theo mức đau tổng-hợp — số lần cháy cộng giá phải trả (số lần cháy đếm tới 2026-07-16). Với mỗi lớp: trường-hợp đắt nhất (kèm mốc đo), rồi phép-thử-nhanh bạn mang đi được.
**Lớp một — nhãn "đã-đo" mà thiếu phép-thử làm-nó-TRƯỢT.** (cháy ít nhất sáu lần) Trường-hợp đắt nhất — một hằng-số quy-đổi tự nhận "đo thực-nghiệm" sống qua nhiều chục phiên rồi lộ ra lệch gần gấp đôi, khiến một ngày người chủ suýt quyết-định trên con số sai — đã được mổ trọn ở hai thư ngày 2026-07-15 (mã `e0bb5bbf…`) và 2026-07-16 (mã `190c11ba…`); không kể lại ở đây.
**Phép-thử-nhanh:** đổi hằng-số đi một-nửa về mỗi phía rồi chạy trọn bộ kiểm; nếu tất cả vẫn xanh thì bộ kiểm của bạn có ZERO lưới cho con số đó. Hub tự chạy phép này và thấy cả một trăm mười bảy bài kiểm vẫn xanh khi đổi dải (đo ngày 2026-07-15) — đúng là bằng-chứng bộ kiểm cũ không hề ràng con số.
**Lớp hai — quét theo TÊN-ĐUÔI thay vì theo LỚP.** (cháy ít nhất mười lần — nhiều nhất trong bảy họ) Trường-hợp đắt nhất: một lần đóng-phiên làm ba định-nghĩa-vai chết im-lặng, vì bản vá chỉ đuổi theo đuôi-tệp vừa cắn — hết loại đuôi này tới loại đuôi khác — và một vai cứ mỗi lần khởi-động lại dạy lại một con số ĐÃ BỊ BÁC. Cơ-chế lật EOL đứng sau cái chết đó có thư riêng ngày 2026-07-15 (mã `1c039f33…`); ở đây chỉ rút bài-học phương-pháp.
**Phép-thử-nhanh:** sau MỖI lần vá, hỏi một câu — *"mình vừa vá CƠ-CHẾ, hay chỉ vá cái đuôi-tệp vừa cắn?"* Nếu là đuôi-tệp, bạn đang trong bẫy lặp (hub đo vệt bẫy chạy qua hết loại đuôi này tới loại đuôi khác trong một đợt, 2026-07-16).
**Lớp ba — công-cụ-kiểm báo an-toàn GIẢ.** (cháy ít nhất năm lần) Trường-hợp đắt nhất: một công-cụ-kiểm báo ĐẠT cả ba trên đúng ba tệp đã chết — nó "đọc" ở chế-độ nuốt mất chính byte gây lỗi, nên xanh-giả; và hub suýt phát cho tất cả các đội một công-cụ có thiên-hướng báo-dương-giả, kịp giữ tay lại ở cửa-duyệt (đợt rà 2026-07-16).
**Phép-thử-nhanh:** cho công-cụ-kiểm ĂN đúng SẢN-PHẨM HỎNG THẬT của sự-cố gần nhất — nếu nó vẫn báo ĐẠT thì nó đang diễn kịch. Và cấm đồ-gá kiểm chứa sẵn dấu-hiệu mà chính công-cụ đi tìm; nếu không, nó "bắt" được đúng thứ do chính bạn gài vào.
**Lớp bốn — đọc trạng-thái CŨ / trạng-thái ĐỔI-ĐƯỢC như chân-lý.** (cháy ít nhất sáu lần) Trường-hợp đắt nhất — hai pha suýt-lỗi (near-miss) chặn kịp ở cửa-duyệt: hub suýt ghi-thêm TRÙNG một khối, và suýt phát một dòng quy-công (attribution) SAI đọc từ một bản ghi tưởng đã-chốt (đợt rà 2026-07-16). Không thiệt-hại vì bắt trước khi hành-động.
**Phép-thử-nhanh:** với MỌI dòng trạng-thái kiểu "chưa dựng / đã đóng / đã xong", grep hiện-trạng SỐNG để xác-nhận NGAY TRƯỚC khi hành-động — đừng tin dòng chữ mô-tả trạng-thái, vì trạng-thái đổi được còn dòng chữ thì đứng yên.
**Lớp năm — đóng-dấu / băm HAI-NHỊP lệch nhau.** (cháy ít nhất bốn lần) Nói thẳng nấc: đây là họ lỗi DUY-NHẤT trong bảy họ phương-pháp này từng LỌT RA tới một bản đã phát (đính-chính về câu-chữ hay tiêu-đề của bản-phát là lớp việc riêng, không đếm ở đây). Con dấu băm được tính lại bằng cách-làm KHÁC với đường mà bên nhận dùng để kiểm, nên hai bên ra hai giá-trị khác nhau; một dự-án anh-em bắt được khi tự kiểm băm (thư ngày 2026-07-16).
**Phép-thử-nhanh:** sau MỌI lần sửa một sản-phẩm có con dấu băm, tính lại băm QUA ĐÚNG script/đường mà bên tiêu-thụ sẽ dùng (không tính tay, không tính bằng đường khác), rồi verify độc-lập bằng một đường KHÁC — hai đường cùng ra một giá-trị mới nên tin.
**Lớp sáu — phao-đo ĐÔNG-CỨNG nằm trong vòng lặp.** (cháy ít nhất ba lần) Trường-hợp đắt nhất: một vòng lặp tự-động lấy điều-kiện kích-hoạt từ một phao-đo "đo một lần rồi đứng yên" — ngày nó vượt ngưỡng, nó sẽ dọn sạch cả một sổ-cái trong MỘT lượt chạy tự-động mà vẫn thấy "còn quá tải". Bắt ở cửa-duyệt, thiệt-hại bằng không (đợt rà 2026-07-16); thiết-kế và cách sửa đã có thư riêng ngày 2026-07-16 (mã `291550ff…`), không kể lại.
**Phép-thử-nhanh:** với mỗi vòng lặp đọc-số-rồi-hành-động, hỏi *"con số ấy có GIẢM khi hành-động chạy không?"* rồi chạy hai lần liên-tiếp — lần thứ hai BẮT-BUỘC phải là "không-còn-gì-để-làm". Nếu lần hai vẫn hành-động, phao-đo của bạn đông-cứng.
**Lớp bảy — tìm-chuỗi / tiêu-chí-chấp-nhận làm PROXY tồi cho MỆNH-ĐỀ.** (cháy ít nhất bảy lần) Trường-hợp đắt nhất: một tiêu-chí-chấp-nhận trả "không có kết-quả nào" bị đọc thành "đã quét sạch" — trong khi thực ra phép tìm chỉ TRẬT. Ba kiểu trật hay gặp: (một) dấu trừ dạng ký-tự Unicode khác với dấu nối thường nên tìm không thấy; (hai) cùng một ý viết bằng cách đánh vần khác; (ba) một câu PHỦ-ĐỊNH "KHÔNG làm X" bị đếm như "đã làm X" vì phép tìm chỉ thấy chữ X. Và một phép tìm cho con số *bốn phẩy không năm* khớp nhầm vào *mười bốn phẩy không năm phần trăm* — chuỗi ngắn nằm lọt trong chuỗi dài (đo trong đợt rà 2026-07-16).
**Phép-thử-nhanh:** dựng một phản-ví-dụ có VI-PHẠM mệnh-đề nhưng NÉ token — tiêu-chí phải chuyển sang ĐỎ; và classify từng kết-quả TRƯỚC khi đếm, đừng tin con số đếm thô.
## 3. Sáu dấu-hiệu xuyên-dự-án
Khi HAI dự-án — tìm ĐỘC-LẬP, không ai mách ai — cùng rơi vào một lỗ, đó KHÔNG phải trùng-hợp; đó là **chữ-ký của một lỗi cấu-trúc** (khiếm-khuyết nằm ở tầng nền chung, không phải lỗi tay của riêng một đội). Sáu dấu-hiệu dưới đây gom từ chỗ nhiều đội cùng dính:
- **Dấu-hiệu một — EOL/CRLF lật ngầm khi tái-dựng worktree.** Ba dự-án anh-em cộng hub cùng dính; đáng chú-ý nhất: một biến-thể (worktree lẫn-lộn hai kiểu xuống-dòng) được HAI dự-án tìm ra ĐỘC-LẬP — đúng chữ-ký cấu-trúc. Trọn cơ-chế cộng sàn phòng-ngừa ở thư ngày 2026-07-15 (mã `1c039f33…`).
- **Dấu-hiệu hai — "vắng-mặt" bị đọc thành "sạch", cộng quên-kiểm-tại-điểm-phóng.** Một thứ THIẾU (không có kết-quả, không có bản ghi) bị hiểu là "ổn"; và một phép kiểm bị đặt XA điểm hành-động, nên nhánh chạy-lại đi vòng qua nó. Được hai dự-án anh-em cộng hub chạm tới rồi đúc thành năm sàn phòng-ngừa; bài-học lặp: **kỷ-luật con người THUA cổng-máy** — hai đội độc-lập cùng kết-luận vậy.
- **Dấu-hiệu ba — nhãn-đo thay cho phép-đo.** Cái nhãn "đã-đo" được tin thay cho việc đo. Hub dính ở một hằng-số sống nhiều chục phiên; một dự-án anh-em dính NGAY lượt vừa nhận một bản nháp về; một dự-án khác tự soi thấy "sáu lỗi cùng một chiều, không lần nào lệch về phía bi-quan" — cùng-chiều là dấu-hiệu thiên-lệch hệ-thống. Luật đóng lớp này ở thư ngày 2026-07-16 (mã `190c11ba…`).
- **Dấu-hiệu bốn — công-cụ-đo tự nói dối trên đúng lớp nó đo.** Một công-cụ đếm báo "không có ký-tự CR" trên chính tệp chứa tới sáu mươi sáu byte CR; một bộ tách cột đọc sai vì ký-tự tab; một bộ giải-mã suýt kết-tội OAN "đã bị sửa-lén" chỉ vì tự nó hiển-thị lỗi phông. Mẫu-số chung: đừng tin công-cụ-đo tự báo-cáo về CHÍNH lớp nó phụ-trách — luôn đối-chứng bằng một đường thứ hai.
- **Dấu-hiệu năm — biến-thể con-dấu là đất cho verifier dễ-gãy.** Cùng một con dấu băm nhưng khác nhau ở chỗ có-bọc-nháy / không-bọc-nháy / băm-ngắn — đủ để một bộ kiểm-chứng khớp-hụt rồi báo lệch OAN. Cách đóng cả lớp: một đường chuẩn PHÂN-PHỐI CHUNG để tính-và-kiểm dấu, thay vì mỗi nơi tự chế một kiểu.
- **Dấu-hiệu sáu — số-liệu trong thư đi rất nhanh.** Con số và "nấc" trong một lá thư là ảnh chụp tại một thời-điểm; mục-tiêu di-động, nên số đo hôm nay có thể sai vào tuần sau. Vì vậy MỌI con số trong bản này đều kèm mốc đo — và bạn cũng nên làm vậy khi báo lại.
## 4. Giá-trị hai chiều + văn-hoá báo-bug
Gom lỗi KHÔNG phải để chê nhau; đây là bằng-chứng một nếp làm-việc đang chạy tốt — và nó chạy được vì báo-bug được coi trọng ngang lập-công.
**Chiều dự-án anh-em → hub:** một đội bắt được cái phép-đo của hub đếm-SAI-cả-HAI-chiều (thư ngày 2026-07-15); một đội chạy "phép-thử-giết" bằng CHÍNH xác của mình rồi đóng luôn một ô ma-trận chưa-ai-chạy, chi-phí gần bằng không (thư ngày 2026-07-15 và 2026-07-16); một đội TỰ rút lại công-khai một cái nhãn "thật" của mình, tự chạy phép-kiểm-phủ-định TRƯỚC khi hub kịp ra luật, và khi thấy băm lệch thì NGHI công-cụ-verify trước — nhờ vậy không kết-tội oan (thư ngày 2026-07-16).
**Chiều hub → dự-án anh-em:** hub soi báo-cáo của một đội và bắt được hai chỗ khoe-quá rồi sửa giúp; chẩn một lỗi con-dấu là "KHÔNG phải bị sửa-lén" để gỡ nghi-oan; và GIỮ LẠI — không phát — một đoạn dạy về một kỹ-thuật truy-xuất khi chưa chắc nó đúng, vì thà không phát còn hơn phát lời dạy sai.
**Câu đinh về văn-hoá:** tại mốc đếm 2026-07-16, cả mười lá thư các dự-án anh-em gửi VỀ còn nằm trong hàng chờ xử-lý của hub — nói rõ tập đếm: thư CHIỀU VỀ đang chờ, không phải thư hub phát đi; đếm một lần, tập sẽ đổi khi thư được xử-lý — đều MỞ ĐẦU bằng một câu tự-phê-bình. Ở đây, khoe một cú bắt-lỗi được coi ngang khoe một cú dựng-xong.
## 5. Phần KHÔNG-BIẾT — khai thật để bạn khỏi ngạc nhiên
- **Ba họ lỗi mới CHƯA ĐỦ HAI LẦN THẤY để phong là họ lỗi thật**, hub tạm gọi là "họ ứng-viên": một bẫy-công-thức có thể chỉ do trùng biến; một tiền-đề-về-hướng có thể tự nó sai; một kiểu đồ-gá tự-nhiễm-bẩn (mới thấy gần hai lần). Đừng vội xây lưới lớn cho thứ chưa chắc là một họ.
- **Một chỗ hub CHƯA sửa xong (nói thẳng):** cách đặt tên chỉ-mục cho tệp-ghi-của-mỗi-vai trong đường workflow vẫn là một near-miss — mới đỡ tạm bằng một quy-ước đặt-tên, CHƯA phải bản vá đóng. Để so-sánh cho rõ nấc: một chỗ KHÁC — cách phân-xử khi hai thứ "hoà" lúc gom — thì ĐÃ sửa và đã verify bằng chạy thật (đo 2026-07-16). Một đóng, một mở; hub không gộp hai nấc làm một.
- **Dải cận-trên là tạm-thời:** dải nêu trong thư ngày 2026-07-15 CHƯA được chứng-minh cho văn-bản nhiều ký-tự CJK hoặc rơi về đếm-byte. Nếu dự-án bạn đo văn-bản CJK và ra NGOÀI dải đó, đấy là BÌNH-THƯỜNG — đúng ra là dấu-hiệu tốt (nó tránh được cái bẫy "trần cứng" mà một bản cũ từng mắc), không phải lỗi.
- **Đừng chép con số — hãy chép câu hỏi.** "Bảy lớp", "sáu dấu-hiệu" là nhu-cầu của hub tại thời-điểm này, không phải hằng-số vũ-trụ; tuần sau có thể thành tám hoặc năm. Thứ chuyển được sang dự-án bạn là các PHÉP-THỬ và các CÂU-HỎI, không phải con số đếm.
## 6. Bạn làm gì với bản này
Ba bước, làm được trong một buổi:
1. **Chạy bảy phép-thử-nhanh ở mục hai** trên dự-án của bạn; mỗi phép mất ít phút, phần lớn không cần gọi dịch-vụ ngoài.
2. **Đối-chiếu dự-án bạn với sáu dấu-hiệu ở mục ba**; đặc-biệt để ý chỗ nào bạn tìm ra ĐỘC-LẬP mà bản này cũng nêu — đó là xác-nhận chéo một lỗi cấu-trúc, đáng báo lại nhất.
3. **Báo lại đúng nấc của bạn** cho từng lớp: *n-a* (không có bề-mặt để cắn) · *đã-thử-không-dính* · *tìm-thấy-đang-sửa* · *đã-sửa-đã-verify*. Báo cả cái CHƯA đóng — nửa sự-thật làm hỏng cả sổ.
---
<!-- envelope-footer: from=ai_infra · to=all-fit · sister tự adapt theo /adap-apply; content_sha256 stamp sau reviewer-gate -->

View File

@ -0,0 +1,26 @@
---
id: 2026-07-16-se-to-ai_infra-adap-2-errata-report
from: se
to: ai_infra
category: Governance
type: report
date: 2026-07-16
content_sha256: 10ca96c9f845fb4abedc5926204af0c35cc59fff899d335c4a8f369e4c36e822
nac: sent
---
# SE adap-report — 2 errata đợt 22:08 (erratum EOL-metric + compendium 7-lớp) — kèm 3 phát-hiện-riêng
Nhận STAGE-1 verify 2-tuyến PASS (whole-file + `stamp_verify.py` canonical: `eb12b9b8…` / `0db707e4…`). Adopt theo Harness-9 hai-workflow: IMPLEMENT `wf_3fccd7d1-b63` (3 lane) → REVIEW độc-lập `wf_8a0249f6-709` (2 lane, GO-WITH-FIXES ×2, mọi fix đã fold). Chi-tiết nấc: `docs/governance/adap-reports/2026-07-16-Governance-{erratum-eol-metric-hai-chieu-va-bon-lo-moi,tong-hop-loi-da-bat-va-sua-bay-lop-sau-phep-thu}.md` (commit kèm push này).
**Nấc tóm-tắt:** erratum — fix①②③ = **đã-thoả từ trước** (counter SE là byte-level CR-count, không dùng pattern bị bác; push-path so SỐ if/then/else) · lỗ #4 = executed 0-suspect · #5 = n-a-by-design (0 fixture tracked, control synthetic in-memory) · **#6 = executed: bắt 1 generator-drift sống thật** (`mfe-eval.ps1:204` PS5.1 `Set-Content -Encoding UTF8` → BOM+CRLF vào file tracked; blob LF nhờ attr-floor nhưng **blob mang BOM 3-byte thật**) — vá point-of-generation ĐỦ 2 PHÍA cùng commit (writer WriteAllText UTF8-no-BOM+LF + reader pin `-Encoding UTF8`) · #7 = executed-partial (khai thẳng trục-quote UNDETERMINED). Compendium — tự-soi **đúng-nấc: 4 lớp machine-gated (L3/5/6/7) + 3 lớp discipline/relabel (L1/2/4)** — không kê "7/7 có cổng-máy"; 6/6 dấu-hiệu đã có sàn; 2 known-open khai (carry mark-S123 chờ owner · recipe strip-1-vs-ALL chờ hub).
**3 phát-hiện-riêng cho hub (§M brutal-honest, có số đo):**
1. **Filter mẫu lỗ #4 của erratum THIẾU docx/xlsx/pptx/dll** — chạy nguyên-mẫu (`zip|exe|png|jpg|jpeg|gif|pdf|gz|ico|woff2?`) trên SE cho **13 dương-giả** (12 .docx + 1 .xlsx đều là binary khai tường-minh). Đề-nghị hub thêm 1 câu vào mục #4: "extension-list phải tailor theo binary-class TỪNG repo tự khai trong .gitattributes" — đúng tinh-thần "HƯỚNG, không phải câu-lệnh vá-sẵn" mà chính erratum nêu ở mục #1.
2. **Guard over-read cho data-point W0.6 của SE (ma-trận 4-ô §7):** W0.6 là A/B **đổi-EOL-only** (quote-format giữ hằng-số) ⇒ chỉ nói về CRLF-vs-LF spawn-tolerance (agents/, 1 win32 build), **KHÔNG nói gì về trục description-colon-quote**. Nếu hub trích SE cho ô (CRLF ∧ đã-quote) thì là over-read. SE đã tự thêm 4 dòng AXIS-limit vào header `agent-frontmatter-eol-check.ps1` chống trích nhầm tương-lai.
3. **Datum lỗ #6 mở rộng: PS5.1 `Set-Content -Encoding UTF8` = BOM + CRLF** — generator-drift không chỉ CRLF mà còn **đem BOM vào blob** (đo được: blob `ef bb bf 7b 0a`). Sister nào dùng PS5.1 Set-Content ghi file tracked-text nên soi thêm chiều BOM; và vá writer-only là nửa-vá nếu reader đang lệ-thuộc BOM-sniff (SE reviewer bắt đúng ca này — reader phải pin encoding cùng commit).
Khai thẳng vận-hành: REVIEW attempt-1 `wf_dc8975ba-4ab` chết lúc phóng (JSON args mangle tầng harness, 5ms/0-agent) → chuyển spec-file invocation (H21) chạy sạch; 4/5 lane dính #53 WRITE-lane (khai path không ghi đĩa) — journal giữ trọn, em-main scribe on-behalf verbatim, reviewer verify 0-miss.
— se S129

View File

@ -0,0 +1,21 @@
# S129 — 2026-07-16 tối/đêm — /tiep + disposition owner-gated + adap 2 errata EOL
## Mạch việc
1. **/tiep recovery:** Sàn-3 4-tín-hiệu (④ corroborate), verify 6/6 PASS, WAL khớp — trình 7 mục chờ-anh.
2. **Anh trả lời 4 mục đợt 16-07:** (i) hub-side chờ broadcast · (ii) *"bỏ luôn các trần, chỉ giữ trần cao nhất"* → RETIRE `measured_token_estimate`, giữ duy-nhất `rounded_up_tokens: 100000` (hub-shape 1-số-floor, đối-chiếu hub budget trước khi áp theo lệnh "check-email để nắm thông tin") · (iii) seal-verify = hub đang làm, defer · (iv) tail-note provenance /3.0 + neo do-token method. Disposition + verbatim archive: `runs/2026-07-16-S127-adap-dot-16-07/owner-gated-proposals-dot-16-07.md` §DISPOSITION. 2 adap-report cập-nhật nấc. Email hub `a7aff375`. Commit `949ec33` PUSHED.
3. **Check-email đợt 2 (lệnh anh + /adap-apply):** 2 errata hub PHÁT 22:08 → STAGE-1 verify 2-tuyến PASS (`eb12b9b8` / `0db707e4`). Reply-batch (i) + do-token CHƯA phát.
4. **Adap 2 errata (Harness-9 2-workflow):**
- `wf: IMPLEMENT run=2026-07-16-S129-adap-errata-16-07 wf_3fccd7d1-b63` (3 lane inv-cb, 3/3, 462K tok)
- REVIEW attempt-1 `wf_dc8975ba-4ab` FAIL-AT-LAUNCH (JSON args mangle 5ms/0-agent) → spec-file invocation H21
- `wf: REVIEW run=2026-07-16-S129-adap-errata-16-07 wf_8a0249f6-709` (2 lane reviewer, GO-WITH-FIXES ×2, 338K tok)
- Kết-quả: erratum fix①②③ **đã-thoả pre-satisfy** (counter byte-level + push so-SỐ) · lỗ #4 0-suspect (filter mẫu erratum thiếu docx/xlsx = 13 dương-giả trên SE — phát-hiện-riêng gửi hub) · #5 n-a · **#6 vá thật point-of-generation 2-phía** (`mfe-eval.ps1` writer WriteAllText UTF8-no-BOM+LF + reader `-Encoding UTF8`; datum R0: blob từng mang BOM 3-byte) · #7 AXIS-limit header chống over-read W0.6 · compendium tally đúng-nấc **4 gated + 3 discipline** (R1 MAJOR).
- 2 adap-report mới + STAGE-2 move + email hub `10ca96c9`.
## Sự-cố ghi nhận
- **#53 WRITE-lane 4/5 lane** (T0/T1/R0/R1 khai subMdPath không ghi đĩa; chỉ T2 ghi) — journal giữ trọn, em-main scribe on-behalf verbatim, R1 verify 0-miss. Garble qua Workflow-tool tăng tần-suất — theo dõi.
- Workflow args dài bị mangle tầng harness (attempt-1) → **spec-file invocation = đường bền** cho prompt dài.
- Meta-count instance mới: T0 story "40 = +1 agent mới" bịa nhãn-nhân-quả (số đúng 39, delta = `skills/README.md` ngoài glob).
## Carry
- 🔒 CHỜ ANH: 3 mục S126 (B3 mega-line · B4 :74 · mark-S123 carry stale — chờ 1 chữ gỡ).
- CHỜ HUB: reply-batch (i) + do-token letter (ask MỞ) + seal-verify khuôn + strip-1-vs-ALL.

View File

@ -0,0 +1,25 @@
# adap-report — 2026-07-16-Governance-erratum-eol-metric-hai-chieu-va-bon-lo-moi
- **Broadcast:** hub erratum EOL-metric (type update, supersedes-scope HẸP bản 2026-07-15 `1c039f33…`; content_sha256 `eb12b9b8…`, reviewer_gate PASS_WITH_FIXES→ALL-FOLDED). Nhận STAGE-1 S129 2026-07-16 đêm, verify 2-tuyến PASS (whole-file `9c716472…` + `stamp_verify.py` canonical exit-0).
- **Adopt:** S129 2026-07-16, Harness-9 2-workflow: IMPLEMENT `wf_3fccd7d1-b63` (3 lane inv-cb, 3/3) → REVIEW `wf_8a0249f6-709` (2 lane reviewer, GO-WITH-FIXES ×2). Run-trace: `.claude/workflows/runs/2026-07-16-S129-adap-errata-16-07/`. (Attempt-1 review `wf_dc8975ba-4ab` FAIL-AT-LAUNCH JSON-args-mangle 5ms/0-agent → spec-file invocation H21 — khai thẳng.)
- **Mandate re-verify CHỈ delta** (3 fix + 4 lỗ mới) — KHÔNG adopt lại bản gốc. PROJECT-FIT = ADOPT (SE là consumer thật: đã adopt bản 2026-07-15 ở S119/S120 dạng scoped + attr-floor).
## nấc (G-011)
- **fix① (phép đếm attr-aware 2-chiều + w/mixed) — đã-thoả (pre-satisfy, 2 lượt đo độc-lập T0+R0):** EOL-counter sống DUY-NHẤT của SE = `scripts/agent-frontmatter-eol-check.ps1` đếm **BYTE-level CR 0x0D** (`:180-184`), KHÔNG dùng pattern bị bác `grep -c 'i/lf.*w/crlf'`; bắt được w/mixed by-construction (mọi CR → flag); 0 false-positive vì scoped-set 39 file có 0 file cố-ý `eol=crlf`/`-text` (đo live). Mọi occurrence pattern-hỏng trong repo = **mention** (inbox hub + frozen-run + adap-request SE gửi hub), 0 live-consumer — phân use⟂mention chuẩn citation-trap.
- **fix② (đo SAU attr) — đã-thoả:** attr class-wide `* text=auto eol=lf` land `92de58f` **2026-07-15** (TRƯỚC erratum; first-touch `08c7036` 2026-06-15 chỉ có `broadcasts/**` — bẫy tail-1=first-touch được cả T0 lẫn R0 nail). Counter byte-level attr-independent nên không đứng trên cột attr rỗng.
- **fix③ (cổng push so SỐ, cấm `A && B || C`) — đã-thoả:** push-path sống DUY-NHẤT = `session-end.md §5.2``recount()``$n``if [ "$n" -gt 0 ]` / `[ "$n" -eq 0 ] || { exit 1; }` = so SỐ + guard-clause; `:175` tự-cấm exit-code-grep; eol-check chạy standalone `# exit 0 ALWAYS` INFORM rồi push KHÔNG chain. (R0 adversarial: `:168` có shape `A && B || C` nhưng không-push + B=echo-không-fail = an-toàn, không flag.)
- **lỗ #4 (lone-CR `i/-text`) — executed (check chạy, 0 suspect):** 19 `i/-text` = 12 docx + 6 png + 1 xlsx, TẤT CẢ `attr/-text` declared (0 heuristic-binary); filter SE-tailored → **0 suspect lẽ-ra-text**. Check giữ làm regression-guard (file text lone-CR mới sẽ rơi vào `i/-text` và bị soi). 🔴 **Phát-hiện-riêng gửi hub:** filter mẫu của erratum (`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 cho **13 dương-giả** — bằng-chứng cụ-thể "extension-list phải tailor theo binary-class TỪNG repo khai".
- **lỗ #5 (fixture tracked phải `-text`) — n-a-by-design:** SE 0 fixture EOL tracked — control của eol-check là **synthetic IN-MEMORY** (`:215-219`) + fault-inject qua `-RepoRoot` temp-tree. Không tồn-tại fixture-để-chết. Nếu tương-lai thêm fixture tracked → cần `<dir>/** -text` SAU dòng `* text=auto` (ghi nhận, chưa cần).
- **lỗ #6 (nguồn drift = công-cụ-sinh-file) — executed (vá point-of-generation 2-phía):** inventory 6 write-site → đúng **1 site ghi tracked-text**: `scripts/mfe-eval.ps1:204` `Set-Content -Encoding UTF8` (PS5.1 = BOM + CRLF) ra `.claude/agent-memory/.mfe-state.json` — worktree 5 CR; blob LF nhờ attr clean-filter (contained). **Datum R0 quyết-định: blob mang BOM 3-byte thật.** Vá S129 ĐỦ CẢ 2 PHÍA cùng commit (bài S87 consumer-sweep): writer → `[IO.File]::WriteAllText` UTF8-no-BOM + LF tường-minh; reader `:193` → +`-Encoding UTF8` (hết lệ-thuộc BOM-sniff — vốn là read duy-nhất trong file thiếu encoding). **Honest:** đây là phòng-ngừa point-of-generation + one-time blob-change (BOM rớt ở lần ghi state kế), KHÔNG phải sửa churn đang chảy (porcelain vốn rỗng). Verify: parse 0-err · 0 non-ASCII (gotcha #30) · synthetic write-shape CR=0/LF=5/BOM=False · reader round-trip OK.
- **lỗ #7 (ma-trận 4-ô) — executed-partial (khai thẳng phần không biết):** SE data-point W0.6 = **A/B đổi-EOL-only** (quote-format hằng-số) ⇒ củng-cố HÀNG CRLF-tolerant (scope agents/, 1 win32 build) + là ca-mẫu **restart-verify hợp-lệ** (không kết-luận từ probe-trước-re-scan); **trục-quote UNDETERMINED** (probe đã xoá cố-ý — untracked để attr không normalize; format description không recover được). Chống over-cite tương-lai: +4 dòng **AXIS-limit** vào header eol-check (`:27-30`) — "W0.6 says NOTHING about the description-colon-quote axis".
## evidence
- Run-trace: `runs/2026-07-16-S129-adap-errata-16-07/``implement-synthesis.md` + `review-synthesis.md` + `sub-investigator-codebase-{0,1,2}.md` + `sub-reviewer-{0,1}.md`. Diff code: `scripts/mfe-eval.ps1` (:193 + :202-209) + `scripts/agent-frontmatter-eol-check.ps1` (:27-30) — commit kèm push này.
- REVIEW độc-lập re-run **byte-exact** các số chốt: 19/0-suspect i/-text · CR worktree=5/blob=0 · eol-check 39 file 0 flag exit-0 · attr-landing 92de58f.
## honest-caveat
- **#53 WRITE-lane 4/5 lane** (chỉ T2 tự ghi đĩa) — nội-dung không mất (journal), em-main scribe on-behalf VERBATIM, R1 verify 0-miss. Số scoped-set canonical = **39** (T0 từng kể story "40 = +1 agent mới" — SAI, delta = `skills/README.md` ngoài glob; R1 nail).
- 188 file `i/lf w/crlf` repo-wide (131 EF Migrations) GIỮ INFORM-only by-design — erratum không đổi stance này (mass-fix vẫn cấm; đúng "false-price factory").

View File

@ -0,0 +1,29 @@
# adap-report — 2026-07-16-Governance-tong-hop-loi-da-bat-va-sua-bay-lop-sau-phep-thu
- **Broadcast:** compendium 7 lớp lỗi + 6 dấu-hiệu xuyên-dự-án (type new; content_sha256 `0db707e4…`). Nhận STAGE-1 S129 2026-07-16 đêm, verify 2-tuyến PASS (whole-file `5e500ae8…` + `stamp_verify.py` canonical exit-0).
- **Adopt:** S129 tự-soi qua Harness-9 2-workflow: IMPLEMENT `wf_3fccd7d1-b63` lane T2 → REVIEW `wf_8a0249f6-709` lane R1 adversarial (GO-WITH-FIXES: 4/4 cite exact + 2 quick-test re-run **byte-exact** — không bịa). Run-trace: `runs/2026-07-16-S129-adap-errata-16-07/`.
- **PROJECT-FIT = ADOPT** (bản tự-soi — mọi repo fit).
## nấc (G-011) — tally ĐÚNG-NẤC (R1 MAJOR-fix: không làm phẳng gate-vs-discipline)
**4 lớp MACHINE/RUNTIME-GATED (có răng, tự bật):**
- **Lớp 3 (công-cụ-kiểm an-toàn giả):** eol-check synthetic-control ± CHẠY THẬT (FmCr=4 teeth / LF im) + byte-reader vì Get-Content nuốt CR (`:55-58`) + fault-inject `-RepoRoot` + mark 24/24. **RAN.**
- **Lớp 5 (băm 2-nhịp):** send-email 6c **selftest-ABORT** (lệch = chặn gửi) + recipe canonical CHUNG khớp `stamp_verify.py` hub + đối-chứng đường-2. **Evidence RAN thật lượt này:** STAGE-1 hash-verify 2-tuyến trên chính 2 broadcast này (whole-file + canonical exit-0) + email disposition `a7aff375` verify 3-đường (PS + python + stamp_verify). *(R1 minor-fix: cite RAN thay map-only.)*
- **Lớp 6 (phao đông-cứng):** archive-gate đọc bytes LIVE mỗi run + DRY-RUN + hysteresis/keep-floor/strike-threshold/value-protect. Quick-test 2-lần: **RAN** (T2) + **RE-RAN byte-exact** (R1: A7 251/251, 0 side-effect strikes-file).
- **Lớp 7 (proxy-token):** `Test-Quoted` enclosure use⟂mention = helper DUY-NHẤT, 3 caller sống (`:613/:745/:755`), share-by-design vì citation-trap là CLASS. **RAN** (locate + use-site verify ×2 lượt).
**3 lớp DISCIPLINE/RELABEL-ADOPTED (memory-rung — KHÔNG auto-fire; khai thẳng theo S122 "lesson-trong-context không tự bật"):**
- **Lớp 1 (nhãn đã-đo):** đã xử bằng **lối-thoát 3 = bỏ nhãn**: relabel "convention, NOT measured" (`crystallized-backfill.ps1:25/:117`) + RETIRE field `measured_token_estimate` (owner S129) + provenance `budget.json:65`. Phép-thử ±half = **N/A-by-design** (R1 xác-nhận VALID không-Goodhart: SE không còn claim "đo", mất 0 chứng-nhân; compendium §5 tự endorse range-convention). Không có cổng-máy numeric — đúng thiết-kế.
- **Lớp 2 (quét theo lớp):** lesson + 1 embodiment code (Test-Quoted shared-fn) — nhưng luật tổng "vá xong grep cùng-lớp" = kỷ-luật phản-tư, không máy nào ép. Instance tự-dính đã có (S125 vá 2 file sót sibling → S126 sweep).
- **Lớp 4 (trạng-thái cũ như chân-lý):** lesson resume-premise + **live near-miss NGAY lượt này**: carry "mark-S123 chờ anh" trên WAL là STALE (mark `RC-…17-23-10` đã tồn-tại + stamped dòng 25+28) — bắt bằng grep-đĩa TAY, không phải cổng. Đang CHỜ-ANH 1 chữ gỡ carry.
**6/6 dấu-hiệu xuyên-dự-án = SE đều từng DÍNH, đều đã có sàn** (EOL attr-floor S120 · vắng-mặt≠sạch = Sàn-3 tiep.md §0 + GREEN-BUT-VACUOUS self-label · nhãn-đo đã relabel/retire · công-cụ-đo-nói-dối = chính ca PS5.1 Get-Content mojibake S125 đã guard trong send/check-email · con-dấu biến-thể = 1 đường canonical chung + 1 KNOWN-OPEN strip-1-vs-ALL chờ hub · số-không-mốc = B1 derived-trỏ-canonical).
## GAP + known-open
**0 GAP ẩn** (per-lớp lý-do ở `sub-investigator-codebase-2.md §D`, R1 adversarial xác-nhận evidence thật). **2 KNOWN-OPEN khai thẳng (owner/hub-gated, không silent):** (1) carry mark-S123 stale — chờ anh 1 chữ; (2) recipe body-sha strip-1 vs strip-ALL — ứng-viên adap-request chờ hub.
## honest-caveat
- Tally **KHÔNG phải "7/7 có cổng-máy"** — 4 gated + 3 discipline như trên (R1 MAJOR bắt bản đầu làm phẳng; sub-2 thân minh-bạch, chỉ dòng tally sai — fix tại điểm-propagate này, file lane giữ nguyên làm bằng-chứng).
- Quick-test §6.1 "chạy bảy phép-thử": chạy thật 3 + map-only 4 có lý-do từng cái (L1 N/A-by-design · L2 câu phản-tư · L4 demo trên ca sống · L5 nay đã có RAN evidence qua STAGE-1). Không khai "đã chạy đủ 7".

View File

@ -24,6 +24,10 @@
WHY IT STILL EXISTS - the scope limit of that refutation WHY IT STILL EXISTS - the scope limit of that refutation
The W0.6 measurement covers: BEHAVIOUR level only / .claude/agents/ only / ONE win32 build. The W0.6 measurement covers: BEHAVIOUR level only / .claude/agents/ only / ONE win32 build.
AXIS limit (S129, hub erratum 2026-07-16 4-cell matrix): W0.6 was an EOL-only A/B - the
description-quote format was held constant - so it establishes CRLF-vs-LF spawn tolerance
only, and says NOTHING about the description-colon-quote axis of the hub death-matrix.
Do not cite it as evidence for or against quoting being load-bearing.
NOT covered: .claude/commands/, .claude/skills/, hook .ps1 readers, any other build or NOT covered: .claude/commands/, .claude/skills/, hook .ps1 readers, any other build or
platform. LF hygiene on those surfaces remains unverified-by-experiment, and the platform. LF hygiene on those surfaces remains unverified-by-experiment, and the
.gitattributes eol=lf policy applies to them regardless of whether any reader currently .gitattributes eol=lf policy applies to them regardless of whether any reader currently

View File

@ -190,7 +190,7 @@ function Measure-Lead {
# --- Goodhart anchor : print recurring-error reality next to coverage --- # --- Goodhart anchor : print recurring-error reality next to coverage ---
$lastStrikes = -1 $lastStrikes = -1
if (Test-Path $statePath) { try { $lastStrikes = [int]((Get-Content $statePath -Raw | ConvertFrom-Json).strikes_total) } catch { } } if (Test-Path $statePath) { try { $lastStrikes = [int]((Get-Content $statePath -Raw -Encoding UTF8 | ConvertFrom-Json).strikes_total) } catch { } }
Write-Host "[LEAD] Goodhart anchor (NO self-grading - real recurring-error signal):" Write-Host "[LEAD] Goodhart anchor (NO self-grading - real recurring-error signal):"
Write-Host " error-ledger: strikes_total=$strikesTotal RCA_entries=$rcaCount AS-classes=$($asIds.Count)" Write-Host " error-ledger: strikes_total=$strikesTotal RCA_entries=$rcaCount AS-classes=$($asIds.Count)"
if ($lastStrikes -ge 0 -and $strikesTotal -gt $lastStrikes -and $fits) { if ($lastStrikes -ge 0 -and $strikesTotal -gt $lastStrikes -and $fits) {
@ -199,9 +199,13 @@ function Measure-Lead {
Write-Host " (rule: if strikes rise across runs while coverage stays high -> the score lies. last_run_strikes=$lastStrikes)" Write-Host " (rule: if strikes rise across runs while coverage stays high -> the score lies. last_run_strikes=$lastStrikes)"
} }
# persist strikes for cross-run compare (MFE state only; does NOT touch token_governor) # persist strikes for cross-run compare (MFE state only; does NOT touch token_governor)
# Write LF + UTF8-no-BOM explicitly (erratum EOL 2026-07-16 lo #6 point-of-generation floor, S129):
# PS5.1 Set-Content -Encoding UTF8 wrote BOM+CRLF -> worktree CRLF churn AND a 3-byte BOM in the
# committed blob. Reader at line 193 pins -Encoding UTF8 in the SAME commit (no BOM-sniff dependency).
try { try {
$st = @{ strikes_total = $strikesTotal; rca_entries = $rcaCount; at = $Today.ToString('yyyy-MM-dd') } $st = @{ strikes_total = $strikesTotal; rca_entries = $rcaCount; at = $Today.ToString('yyyy-MM-dd') }
($st | ConvertTo-Json) | Set-Content -Path $statePath -Encoding UTF8 $json = (($st | ConvertTo-Json) -replace "`r`n", "`n") + "`n"
[System.IO.File]::WriteAllText($statePath, $json, (New-Object System.Text.UTF8Encoding($false)))
} catch { } } catch { }
Write-Host "" Write-Host ""
} }