Files
solution-erp/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/lead-note-w3-encoding.md
2026-08-07 17:29:49 +07:00

46 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LEAD NOTE — mojibake trong `sub-w3-nghi-thuc.md` (khai thẳng, sửa MỘT PHẦN)
## Sự việc
`sub-w3-nghi-thuc.md` (26 KB) bị **mojibake ở nửa sau** — UTF-8 bị ghi như CP1252.
Bắt được lúc lead đọc verdict từ đĩa: `## §4 — (3) TIỀN-KIá»M…` thay vì `## §4 — (3) TIỀN-KIỂM…`.
## Đo (2 chiều, có control-dương)
| phép | kết quả |
|---|---|
| `U+FFFD` (ký tự thay thế = **mất byte**) | **0** ⇒ 🟢 **KHÔNG mất chữ nào**, chỉ mã hoá hai lần |
| mojibake ban đầu | **1.278** dấu hiệu |
| sau 4 vòng sửa | **1.226** — cải thiện, **KHÔNG hội tụ** |
| 🟢 **control-dương** | `sub-w2-luoi-ghi-dia.md` cùng thư mục = **0 mojibake** ⇒ không phải lỗi toàn kho, chỉ riêng lượt ghi này |
## Vì sao không sửa hết được
Các dòng bị **TRỘN** — đoạn hỏng và đoạn lành xen kẽ **không có ranh sạch**. Thử 4 cách, đều chỉ vá một phần:
1. theo DÒNG + `cp1252` strict → 20 dòng, 52 fail (dòng chứa ký tự ngoài bảng ⇒ cả dòng fail).
2. theo DÒNG + đa codec (`cp1252`/`latin-1`/`cp1258`), chỉ nhận nếu **giảm** mojibake → +5.
3. bảng ngược cp1252 đầy đủ 256 byte, lặp 3 lớp → +1.
4. theo ĐOẠN CON liên tiếp, lặp 3 vòng → 1.278 → 1.226.
## 🔴 Quyết định: DỪNG, không sửa tiếp
- Mỗi vòng ghi lại file = **một lần rủi ro hỏng thêm**; lợi ích biên đang giảm nhanh, rủi ro thì không.
- **Nội dung ĐỌC ĐƯỢC bằng mắt** (mojibake khả nghịch với người đọc) và **0 byte mất**.
- Cố cho đẹp lúc này = tối ưu **hình thức của bằng chứng** trong khi **bản thân bằng chứng đã nguyên vẹn** — đúng kiểu Goodhart mà cả phiên này đi bắt.
- 🔸 **Đường sửa triệt để nếu cần sau:** nhờ chính W3 viết lại các §4-§6 (nó còn nội dung trong context), hoặc đọc bản gốc từ `git log -p` nếu có commit trước lúc hỏng. **Không cấp bách.**
## Gốc kỹ thuật
Bẫy **PowerShell 5.1**: `Set-Content`/`Add-Content` mặc định **ANSI codepage**, không UTF-8. W3 hẳn đã đổi sang append bằng PowerShell ở nửa sau (nửa đầu sạch).
SE **đã biết lớp này**`check-email.md` cảnh báo *"CẤM `Get-Content -Raw` cho hash — PS 5.1 đọc UTF-8-no-BOM bằng ANSI → mojibake → false-tamper (S125)"*. Cùng bẫy, chiều **ghi** thay vì chiều **đọc**.
## 🔴 Lỗ hổng THẬT lộ ra — đáng giá hơn cả bản vá
**`artifact-integrity.ps1` (W2) KHÔNG bắt được ca này.** Nó đo **cấu trúc** (placeholder ở heading · tỉ lệ ruột/khung · tệp rỗng · nguồn-2) — **không đo MÃ HOÁ**.
File này qua hết mọi vị từ W2: có ruột (63 dòng), 0 placeholder, có nguồn-2, không rỗng. **Sạch theo mọi thước đang có, mà hỏng thật.**
**Lại đúng luật W1-a:** *"một artifact sạch **chính xác tới độ sâu máy của nó KIỂM**, không sâu hơn một nấc."* W2 kiểm cấu trúc ⇒ sạch cấu trúc; **mã hoá là nấc chưa ai kiểm**.
**Đề xuất vị từ V-5 (chưa cắm, ghi để W6 hoặc anh phán):**
```
V-5 mojibake: dem ('§','â€','á','á»','ă') trong *.md; >0 => FLAG
+ control-duong: U+FFFD == 0 => "khong mat byte, sua duoc"
+ phan biet 2 nac: U+FFFD>0 = MAT DU LIEU (nang) ⟂ moji-only = SAI MA HOA (sua duoc)
```
🔸 **Rẻ, 1 dòng grep, 0 cấu hình** — cùng hạng với V-2 (vị từ mạnh nhất của W2).
🔸 **CẤM** gộp V-5 vào `LECH` của `naming-scan` — khác trục (tên ⟂ nội dung).