---
description: Nhận email cross-project (2-stage) qua broadcasts/ (Harness 3 §N) cho SOLUTION_ERP (self=se). Verify hash đối chứng. §J2. Adopt AI_INFRA Harness 3 (2026-06-07).
argument-hint: <from_project | all>
---
# /check-email <from_project> — nhận email cross-project (Harness 3 · self=`se`)

> 🔴 Kênh DUY NHẤT (§N) · **pull-copy** chỉ ghi repo MÌNH (§J2). self=`se`. Path map: xem `send-email`. Detail: AI_INFRA `broadcasts/README.md` §Harness 3.

## Tham số
- `$1` = from_project (BẮT BUỘC) ∈ 6 others, hoặc `all` = quét cả 6.

## Quy trình 2-STAGE (audit qua folder)
**STAGE 1 — Nhận (đọc → inbox root, PENDING):**
1. Validate `$1`.
2. READ `<from>/broadcasts/outbox/se/*.md` (message gửi cho se).
3. Mỗi file CHƯA có trong inbox (so id): **COPY VERBATIM** → `broadcasts/inbox/<id>.md` (**root = pending**). [repo MÌNH §J2]
4. **Verify đối chứng:** (a) **whole-file** `Get-FileHash` copy == nguồn (byte-identical = tuyến CHÍNH); (b) **body** recompute `SHA256(body)` == `content_sha256` khai ở frontmatter.

   **4(b) — đầu-đọc stamp KHOAN-DUNG (adopt S141, ghim S142):**
   - 🔴 **ƯU TIÊN chạy SCRIPT, đừng tự chế lệnh rút hash:** `python scripts/stamp_verify.py <file>` — **bản port LOCAL trong repo này** (KHÔNG trỏ hub-path `AI_INFRA/scripts/...` nữa; hub-path chỉ còn là nguồn **re-pull** khi hub đổi §N canon). Script in `declared / canonical / no-strip` + verdict; **exit 0 = OK**, exit 1 = có MISMATCH. Nó còn tách được `WRONG-METHOD` (stamp bằng biến-thể no-strip) khỏi `MISMATCH` thật — thứ mắt thường không phân biệt nổi.
   - **Rút hash declared — PIN mẫu KHOAN-DUNG:** `content_sha256:\s*"?([0-9a-fA-F]{8,64})"?` — phủ **CẢ 3 dạng đang sống trên đĩa**: (i) **có-ngoặc** `content_sha256: "abc..."` · (ii) **không-ngoặc** `content_sha256: abc...` · (iii) **rút-gọn ≥8-hex** (so bằng **tiền-tố**, KHÔNG đòi bằng độ-dài).
   - 🔴 **CẤM mẫu quote-strict `content_sha256:\s*([0-9a-fA-F]+)`** — nó **whiff ngay ký-tự `"` đầu tiên** ⇒ hash có-ngoặc rút ra rỗng ⇒ đọc thành "không khớp" ⇒ **FALSE-TAMPER**. Bẫy ĐÃ GẶP, không phải giả-định: S141 suýt kết oan tamper cả ba trên ba thư mà cả ba đều lành. Mẫu chặt hơn ở đây **KHÔNG** an-toàn hơn — nó chỉ đổi lỗi "bỏ sót" thành lỗi "vu oan".
   - **Body canonical** (khớp ĐÚNG `scripts/stamp_verify.py`): `$txt=[Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes($f)) -replace "^\uFEFF",""; (($txt -replace "\r","") -split "(?m)^---\s*$",3)[2] -replace "^\n",""` → SHA256-UTF8. 🔴 **CẤM `Get-Content -Raw` cho hash** — PS 5.1 đọc UTF-8-no-BOM bằng ANSI → mojibake → **false-tamper** (S125).
   - ✗ → **nghi VERIFIER TRƯỚC** (chạy `python scripts/stamp_verify.py <file>` + test 1 sibling known-good; verifier fail cả sibling ⇒ lỗi tool, KHÔNG phải tamper); vẫn ✗ → **flag tamper, KHÔNG move**, báo anh.
5. Log `_index.md` §INBOUND: `received · id · <from> → se · status=pending · folder=(root) · sha256(12) · verify=✓`.

**STAGE 2 — Xử lý xong → archive (PROCESSED):**
6. Sau khi xử lý → **MOVE** `inbox/<id>.md` → `inbox/<from>/<id>.md`.
7. Update `_index.md`: `status=processed · folder=<from>`.

## Audit (anh)
`ls broadcasts/inbox/*.md` (root) = **pending chưa xử lý** (backlog hiện ngay) · `inbox/<proj>/` = **đã xử lý**.

## Luật
🔴 §N single-channel · 🔴 §J2 pull-copy chỉ-ghi-inbox-MÌNH (KHÔNG push repo bên kia) · **KHÔNG sửa** file copy (bằng chứng) · PHẢI committed · verify-hash trước move.
