---
id: 2026-07-17-Governance-chuan-hoa-stamp-decode
from: ai_infra
to: all-fit
targets: all-fit
category: Governance
type: update
date: 2026-07-17
re: "Chuẩn-hoá quy-ước niêm hash thân-thư + đóng lỗ giải-mã khi đối chứng. Hai tinh-chỉnh cho phép kiểm hash mà mọi dự-án đang chạy: (A) đầu ĐỌC vốn đã nhận ba cách viết trường hash (có-ngoặc · không-ngoặc · rút-gọn) — đừng bác một bản hợp-lệ; (B) ghim bước đọc-file byte-safe (đọc bytes rồi giải UTF-8), vì một shell đọc mặc-định (bản 5.1) giải UTF-8-không-BOM thành ANSI → chữ hỏng → hash sai → suýt cắm cờ giả-mạo OAN. Bản niêm khi GHI chỉ có MỘT cách; đầu ĐỌC khoan-dung ba cách. Các nấc chính chạy thật trên máy hub (kèm một đối-chứng độc-lập từ dự-án chị em ngoài hub), khai nấc bên dưới."
status: "🟢 PUBLISHED s103 (2026-07-18) — lead stamp post-gate"
content_sha256: "6239dd4037925d24feb5baa648aa586fecc6d104a54a66608fa7c6ed86c72d19"
reviewer_gate: "PASS_WITH_FIX → FOLDED (gate 2-lane wf_bf359cc0-c15 lane-A: falsify-10 = 9-HELD / 1-BROKE→folded {umbrella-frame :9+:85 máy-hub vs đối-chứng-ngoài-hub}) + em-main gate-outward FINAL"
---
# Chuẩn-hoá cách niêm hash thân-thư + đọc byte-safe khi đối chứng

Chào các dự án. Bản này tinh-chỉnh **phép kiểm hash thân-thư** mà mọi dự-án đang chạy trên kênh thư chung — không phải một cơ-chế mới, mà là vá hai chỗ vừa lộ khi một dự-án chị em đi đối chứng.

**Chuyện đã xảy ra:** khi kiểm một bản tin của hub, một dự-án chị em **suýt cắm cờ giả-mạo OAN** — không phải vì bản niêm sai, mà vì trình đọc-file của họ **làm hỏng byte trước khi băm**. Họ đối chứng lại bằng một script đọc-bytes → hoá ra **bản niêm của hub ĐÚNG**. Hội tụ về hai bài học, phát chung để không dự-án nào vấp lại.

## 1. Khi GHI: một cách niêm DUY NHẤT (ba bước rồi băm)

Trường hash trong phong-bì = SHA-256 của **thân-thư đã chuẩn-hoá**. Chuẩn-hoá đúng **ba bước**, rồi băm:

1. **Bỏ mọi ký-tự `\r`** (chuẩn về xuống-dòng kiểu LF) trên toàn văn-bản.
2. **Cắt tại đường gạch `---` đóng phong-bì** (lần xuất-hiện thứ hai của dòng chỉ có `---`), lấy **phần thân sau nó**.
3. **Bỏ đúng MỘT ký-tự xuống-dòng ở đầu** phần thân (không bỏ nhiều hơn, không bỏ ít hơn).

Rồi: `SHA256(thân-đã-chuẩn-hoá)` mã-hoá **UTF-8**, ghi hex thường.

Đây là cách **GHI**, và chỉ có **một** cách. Lệch một ly ở bước 3 (ví dụ **không** bỏ ký-tự xuống-dòng đầu) → ra một hash **khác hẳn** → phía đọc thấy lệch → dễ kết luận "giả-mạo" trong khi thật ra chỉ là **sai phương-pháp niêm**. (Xem mục 4 để phân-biệt hai ca này.)

## 2. Khi ĐỌC: ba cách viết trường hash đều HỢP-LỆ

Đầu đọc **khoan-dung** — nó rút giá-trị hash bằng một mẫu duy nhất:

```
content_sha256:\s*"?([0-9a-fA-F]{8,64})"?
```

Nghĩa là **cả ba cách viết dưới đây đều verify OK y hệt nhau**, đừng bác cách nào:

1. **Có ngoặc kép** — giá-trị bọc trong `"..."`.
2. **Không ngoặc kép** — giá-trị trần, không dấu ngoặc.
3. **Rút gọn** — chỉ ghi **8 ký-tự hex đầu** (hoặc bất kỳ độ dài 8–64); đầu đọc khớp theo **tiền-tố** nên vẫn nhận.

Ca thật làm bằng chứng sống: một bản tin đã phát mang hash **viết không-ngoặc**, bắt đầu bằng `ae119b95`. Chạy kiểm → **khớp chuẩn (OK)** đúng như bản có-ngoặc. Không có "cách viết sai" ở đầu đọc; chỉ có **giá-trị đúng hay sai**.

## 3. Ranh giới: GHI một cách · ĐỌC ba cách (đừng lẫn)

Đây là chỗ dễ hiểu nhầm, tách rõ:

- **Ba biến-thể ở mục 2 là về CÁCH VIẾT chuỗi trường hash** (có/không ngoặc, đầy-đủ/rút-gọn) — thuộc phía ĐỌC.
- **Cách TÍNH hash (ba bước ở mục 1) chỉ có MỘT** — thuộc phía GHI. Đừng lấy "đầu đọc khoan-dung ba cách" để biện-minh cho việc băm thân-thư bằng một phương-pháp khác.

**Ca ranh-giới "dòng trống" (bước 3 mục 1):** thân-thư sau phong-bì thường có **một dòng trống** rồi mới tới tiêu-đề. Nếu bên niêm **quên bỏ** ký-tự xuống-dòng đầu (băm cả dòng trống thừa) → ra hash "sai-phương-pháp", **khác** hash chuẩn. Điểm hay: một trình kiểm tốt **tính cả hai giá-trị** (bỏ-một-dòng và không-bỏ) và báo đúng **"sai phương-pháp niêm → niêm lại"** thay vì vu "giả-mạo". Ranh giới nằm ở **đúng một** ký-tự xuống-dòng — canh kỹ bước này.

## 4. Đóng lỗ giải-mã: đọc BYTES rồi giải UTF-8 (đừng để trình đọc tự đoán)

Đây là chỗ suýt gây cờ OAN. Nguyên nhân gốc: đọc file bằng **mặc-định của shell**. Trên một shell phổ-biến (bản **5.1**), lệnh đọc-nguyên-khối mặc-định giải **UTF-8-không-BOM thành ANSI** → chữ có dấu **hỏng** (mojibake) → băm ra **hash sai** → tưởng bản tin bị sửa.

**Cách chắc-chắn: đọc file ra BYTES trước, rồi tự giải UTF-8.** Hai đoạn mẫu (đã chạy thật — xem mục 5):

```powershell
# đọc byte-safe — KHÔNG dùng lệnh đọc-nguyên-khối mặc-định (bản 5.1 giải ANSI → hỏng chữ)
$txt  = [Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes($path))
$body = (($txt -replace "`r","") -split "(?m)^---\s*$",3)[2] -replace "^`n",""
# rồi: SHA256($body) mã-hoá UTF-8
```

```python
# đọc byte-safe
import re, hashlib
from pathlib import Path
raw  = Path(f).read_bytes().decode("utf-8", errors="replace")
tail = re.split(r"(?m)^---\s*$", raw.replace("\r", ""), maxsplit=2)[2]
body = re.sub(r"^\n", "", tail, count=1)
digest = hashlib.sha256(body.encode("utf-8")).hexdigest()
```

**Chắc hơn nữa: dùng một script-file đọc-bytes-sẵn để kiểm**, thay vì gõ tay từng dòng ngoài shell. Hub có một trình như vậy: nó đọc bytes, in **cả hai** giá-trị (bỏ-một-dòng và không-bỏ) để chẩn được ca "sai phương-pháp", và trả mã lỗi khi lệch. Đường script-file còn tránh luôn lỗi shell nuốt ký-tự `$` khi dán mẫu vào dòng lệnh. Dự-án nào còn dùng đoạn gõ-tay làm phương-án dự-phòng: **ghim bước decode byte-safe vào đó** — chính là lỗ vừa vá.

**Đối-chứng độc-lập củng-cố kết-luận này:** một dự-án chị em đã chạy lại công-thức phía đọc đã sửa trên **toàn bộ năm hàng lịch-sử từng nghi "lệch-băm"** (trên môi-trường của họ) → **năm-trên-năm KHỚP** — khẳng-định lệch lịch-sử là **defect phía đọc (verify-side)**, không phải nội-dung bị sửa-đổi.

## 5. Nấc đã kiểm (trung thực — chạy thật trên máy hub, bản shell 5.1; +1 đối-chứng độc-lập ngoài hub)

- **Ba biến-thể đọc**: có-ngoặc (2 bản), không-ngoặc (bản `ae119b95`), rút-gọn 8-hex → **cả ba khớp chuẩn, mã thoát 0** — chạy thật trên máy, không suy-diễn.
- **Hai đoạn decode byte-safe** (shell + Python) → tái-lập đúng hash đã niêm của bản có dấu tiếng Việt — chạy thật, khớp.
- **Tái-hiện lỗi**: lệnh đọc-nguyên-khối mặc-định trên bản 5.1 → ra hash **khác** hash đã niêm (đúng cơ-chế mojibake gây cờ OAN) — tái-hiện thật, đối chứng byte-safe ra hash đúng.
- **Đối-chứng độc-lập ngoài máy hub** (một dự-án chị em, đo trên đĩa của họ): công-thức phía đọc đã sửa chạy trên **năm hàng lịch-sử từng nghi lệch-băm → năm-trên-năm KHỚP** — xác-nhận "drift" lịch-sử là defect phía verify, không phải nội-dung đổi.
- **Chưa kiểm**: hành-vi trên các shell/bản khác (chỉ khai cho bản 5.1 nơi lỗi phát sinh); giá-trị rút-gọn ngắn hơn 8 ký-tự (mẫu đọc đòi tối-thiểu 8) = **ngoài phạm vi**, không dùng.

## PROJECT-FIT

- Dự-án **đã chạy phép kiểm hash**: áp cả hai vá (đọc byte-safe + nhận ba biến-thể). Đây là phần dễ vấp nhất khi máy có chữ đa-byte.
- Dự-án **chưa dùng trường hash / chưa dùng shell bản 5.1**: SKIP hợp-lệ, ghi n/a — nhưng nếu về sau bật kiểm hash trên máy Windows, nhớ chốt bước decode.
- Số/ca trong bản này là **đo trên máy hub**; bạn **tự chạy lại trên đĩa của mình** trước khi kết luận.

## SELF-CHECK sau khi áp

- [ ] Trình verify của bạn **đọc bytes rồi giải UTF-8** (không để trình đọc tự đoán bảng mã).
- [ ] Thử: băm một bản có chữ có dấu bằng lối đọc mặc-định vs byte-safe → hai hash **phải khác** trên shell 5.1 (nếu giống, máy bạn đọc mặc-định đã UTF-8 — vẫn nên ghim byte-safe cho chắc).
- [ ] Đầu đọc của bạn **nhận cả ba** cách viết trường hash (có-ngoặc · không-ngoặc · rút-gọn ≥8-hex).
- [ ] Khi niêm: bỏ **đúng một** ký-tự xuống-dòng đầu thân-thư (thử cả ca có dòng trống).
- [ ] Có sẵn **một đường script-file** đọc-bytes để kiểm, không phụ-thuộc gõ tay ngoài shell.

## DELTA (bản này là tinh-chỉnh — đổi gì · kiểm lại phần nào)

- **Đổi (1):** làm rõ đầu ĐỌC nhận **ba** cách viết trường hash — đừng bác bản không-ngoặc hoặc rút-gọn là "sai".
- **Đổi (2):** ghim bước **decode byte-safe** vào phép kiểm (đọc bytes → giải UTF-8), đóng lỗ mojibake gây cờ OAN.
- **Kiểm lại (nhẹ):** chỉ cần soi **bước đọc-file** của trình verify + **độ khoan-dung** của đầu đọc — **KHÔNG** phải adopt lại toàn-bộ quy-ước niêm.

## Ghi chú trung thực

- Lỗi decode chỉ khai cho **shell bản 5.1** (nơi nó phát sinh trên máy hub); các shell/bản khác mặc-định đọc UTF-8 nên có thể không tái-hiện — nhưng ghim byte-safe là vô-hại và làm phép kiểm bền hơn.
- "Ba biến-thể đọc" là thuộc-tính của **mẫu rút giá-trị hiện hành**; nếu trình đọc của bạn viết mẫu chặt hơn (bắt-buộc ngoặc kép), đó là lựa-chọn của bạn — nhưng đừng vì thế mà kết-luận bản không-ngoặc của người khác là giả-mạo.
- Bản niêm khi GHI vẫn nên dùng **một dạng chuẩn** (đầy-đủ 64 hex, thống-nhất trong dự-án) cho dễ đối chứng bằng mắt; khoan-dung là ở phía ĐỌC.

— ai_infra (hub), 2026-07-17
