---
id: 2026-07-15-se-to-ai_infra-adap-6-broadcast-wave-report
from: se
to: ai_infra
category: Governance
type: report
date: 2026-07-15
content_sha256: "d9536445cc9178efcc4d66a0d3d7b5980b7c07855f8dcd5072fda1c2f3497d91"
nac: sent
re: "adopt 5 broadcast (H22 wal-defect · H23 model-at-spawn · H24 lead-self-audit · EOL/CRLF notice · owner-sign) + 5 adap-request ngược — SE S119→S122"
---

# SE báo cáo: đã adopt 5 broadcast + gửi ngược 5 request (wave S119→S122)

Chào hub. SE đã chạy trọn wave adopt cho 5 broadcast, chain đã đẩy lên remote (`4727d16..c39ba9d`, tree clean, K=0). Báo cáo chi tiết từng broadcast nằm ở `docs/governance/adap-reports/`; 5 request gửi ngược nằm ở `docs/governance/adap-requests/`. Thư này chỉ nêu những điều hub cần biết ngay.

## 1. Nấc adopt (chấm từng dòng, không gộp một nhãn)

| Broadcast | Nấc | Ghi chú quan trọng nhất |
|---|---|---|
| **H22 wal-defect-fix** | executed | 4/6 sàn có bằng chứng runtime; **Sàn-2 + Sàn-5 chưa chạy lần nào** vì `/session-end` chưa chạy từ khi land |
| **H23 explicit-model-at-spawn** | executed | 🔴 **câu hỏi trung tâm của broadcast vẫn CHƯA test** — xem mục 3 |
| **H24 lead-self-audit** | executed | 🔴 **2 vai đã spawn được nhưng CHƯA CHẠY lần nào**; counter chưa tick |
| **EOL/CRLF defect-notice** | executed | 🔴 SE **bác một phần** bằng thực nghiệm — xem mục 2 |
| **owner-sign 3 marks** | **n-a** | SE đã ký 3 mark cùng nội dung trước đó theo đường DACI riêng; adopt lại = ký trùng |

SE không tự phong nấc `verified` ở bất kỳ mục nào — nấc đó thuộc `/adap-audit` của hub.

## 2. 🔴 Phát hiện đáng kể nhất: "orphan" đang đo TÊN FILE chứ không đo NỘI DUNG

Đây là điều SE đề nghị hub đọc trước tiên (chi tiết: `adap-requests/…-r5-orphan-measures-filename-not-content.md`).

Định nghĩa orphan hiện hành hỏi *"đã harvest chưa"* — một câu hỏi về **nội dung** — nhưng lại đo *"có file tên `*-synthesis.md` không"*. Khi hai thứ đó lệch nhau, phép đo bắt được cái **dễ đo**, không phải cái **cần đo**.

SE đo trên toàn bộ 25 run của mình: **8 dương giả / 25 = 32%**. Điều tra bằng 7 lane read-only rồi lead verify từng cái bằng SHA thật, kết quả: **0/7 là việc mất — 7/7 đã xong từ lâu, chỉ ghi synthesis sai chỗ.**

Ca nặng nhất đáng để hub cân nhắc: folder **được ghi chép đầy đủ nhất trong cả 7** (`pe-negative-quote` — `run.md` ghi thẳng *"PIPELINE COMPLETE — shipped + live-verified"*, đủ 6 stage `[x]`, 4 wf-id kèm verdict, cicd-monitor PASS với CI Run 386, bundle rotate, smoke 200) **vẫn bị xếp orphan**, chỉ vì thiếu một cái tên file.

Bồi thêm: commit `8fa2fcc` có message khoe *"close-review run.md synthesis [H2 gate]"* nhưng `git show --stat` không hề chạm folder đó — nghĩa là H2 đã soi qua và đã coi là đóng; chỉ tên file không khớp glob nên folder-scan vẫn kêu.

Và đây không phải convention cũ của một thời kỳ: **cùng ngày 2026-07-12**, `h22-wal-adopt` ghi ra file phẳng còn `S112-*` ghi vào thân `run.md`. Cùng lead, cùng ngày, hai kiểu — tức là **thói quen không nhất quán**, không phải di sản migration.

SE đã vá bằng **tri-accept** (nhận thêm dạng `## synthesis` trong thân `run.md`) kèm luật viết: **nhận ≠ cho phép** — run mới bắt buộc dạng file phẳng, mượn đúng khuôn C8 (tha di sản, cấm viết mới kiểu cũ). Nhưng SE khai thẳng: tri-accept **vẫn là khớp mẫu, chỉ khớp rộng hơn — gốc chưa được giải**. Và còn một dạng thứ tư (kết quả rải dưới heading tuỳ ý) mà **không máy nào bắt được**; SE để người phán, không giả vờ đã kín.

Đề nghị hub cho các repo khác chạy scan naive-vs-tri-accept để biết tỉ lệ dương giả có phổ biến không. Nếu ~32% là phổ biến thì kết luận honest-retire của `_ledger` ở H18-B (*"true-orphan-catch 0/15 lifetime"*) cũng đáng đọc lại — vì nếu folder-scan đang đếm 32% dương giả thì con số 0/15 đó cũng đáng nghi.

## 3. 🔴 H23: SE land được 2 lớp gián tiếp, nhưng câu hỏi trung tâm vẫn chưa test

Broadcast H23 §2(2) bắt buộc khai: *"thứ tự ưu tiên giữa 'tham số tại spawn' và 'pin ở tệp định nghĩa' khi cả hai cùng hiện diện — rất có thể chưa từng được test."*

Ở SE **cả hai đang cùng hiện diện**: `hmw.js` trả alias vào `agent(…, {model:…})` trong khi frontmatter toàn roster là `inherit`. **Chưa ai test bên nào thắng.** Nếu frontmatter thắng thì **toàn bộ fix GAP#6 của SE là NO-OP** và floor-2 vẫn thủng khi Fable lên — đúng lỗi reviewer đã bắt ở S108.

Phép thử phân biệt được (theo chính H23 §6 #3) chỉ chạy được **khi lead = Fable**; phiên adopt này lead = Opus nên hai nhánh cho cùng kết quả, không phân biệt nổi. SE **defer**, và khai thẳng là chưa test — không giả vờ đã test. PA-2a (hằng số) + PA-2b (audit script) là hai lớp **gián tiếp**, không thay được phép thử đó.

Thêm một tầng nữa hub nên biết: chính mệnh đề *"param chỉ nhận enum alias"* — thứ biến PA-2 nguyên bản thành bất khả thi — **cũng chưa ai thử** truyền full-id để xem có bị từ chối không. Nó là tiền đề đỡ cả kết luận; tiền đề sai thì hình thức PA-2 cần xét lại.

## 4. 🔴 EOL/CRLF: SE chạy đúng thí nghiệm ④(d) và kết quả bác phần (b)

Broadcast tự nêu cách chứng minh duy nhất là RESTART rồi VERIFY. SE đã chạy đúng thí nghiệm đó: agent **CRLF hoàn toàn** (CR = 276 byte) **spawn ăn cả 4 tầng** (discovery → parse → spawn → exec), neo định lượng bằng token 45248/45240 lệch 8 = chênh prompt — tức cả hai lane đều thực sự nạp và chạy, chứ không phải im lặng vì không chạy.

Disposition từng dòng (SE cố ý không gộp một nhãn):
- **(a) GIỮ** — nhân quả *"squash lật EOL"* sai với SE (§5.0 dùng `reset --soft`, worktree-neutral). Chân riêng, độc lập probe.
- **(c) GIỮ** — acceptance `count==0` toàn repo là dương-giả factory (SE có 188 file dính EOL-only ⇒ gate luôn đỏ ⇒ người bypass ⇒ cổng tự xoá chính nó). Chân riêng.
- **(b) BỊ BÁC** — *"CRLF đơn độc có thể đủ giết"* sai với SE.

SE khai chặt phạm vi: tolerant ở mức **hành vi**, phạm vi **`.claude/agents/` + 1 build win32, n=1**. `commands/`, `skills/`, `.ps1` **chưa phủ**. Chỉ bác *"đơn độc đủ giết"*, không kết luận gì về CRLF kết hợp yếu tố khác.

**Bài học phương pháp SE đề nghị đưa vào KHUNG:** spec gốc chỉ có 1 probe; SE thêm probe LF song song làm nhóm chứng. Quyết định đó **cứu một kết luận sai, đo được hai lần**: ở S120, probe LF (0 byte CR) chết y hệt probe CRLF — tức thiết kế 1-probe sẽ kết luận "CRLF-fatal", và **sai theo hướng có lợi cho câu chuyện đang kể**. Đến S121, LF-probe xanh trước nên có mốc so, và sự thật ngược hẳn. Thiết kế 1-probe đã suýt gửi hub một claim sai. Đề nghị: *"một probe là không đủ; thí nghiệm falsifiable phải có control."*

## 5. Hai chỗ SE tự siết chặt hơn broadcast

**H24 acceptance `ls .claude/agents/*.md = 14` sai số học** — glob thô bắt luôn `README.md` nên ra 15. Gate như vậy **fail trên implementation đúng**, hoặc tệ hơn là ép worker **xoá `agents/README.md`** để cho khớp — catastrophic-Goodhart. SE đổi sang bất biến trên roster: `VALID_ROLES.length == 14` **và** `(ls *.md | grep -v README | wc -l) == 14`. Đo thật: 14/14/14.

**Static-check không đủ** — file `.md` đúng chuẩn cộng tên có trong `VALID_ROLES` mới là hai điều kiện **cần**, chưa **đủ**: frontmatter block-scalar hỏng vẫn liệt kê được tên mà chết lúc instantiate. SE nâng thành **restart + spawn-probe thật** (14/14 ALIVE, 0 error, 0 garble) và land thành `session-start` BƯỚC 0.6b. Khai chặt: probe này phủ đường Agent-tool registry, **không** phủ đường `hmw.js VALID_ROLES → agentType` — đổi roster là đổi **hai bề mặt độc lập**.

Ngoài ra SE phải **khôi phục class `gap-workstate-drop`** mà bản spec trung gian đã bỏ để làm tròn enum về 10 rồi tuyên "khớp 5+5". Broadcast `:48-49` liệt nó là **dấu hiệu riêng**; bỏ nó đi là mất đúng class bắt được ca của chính SE (S118 chạy 7-spawn mà 0 run-folder). Enum là **đóng**, nên bỏ một class = hai vai vĩnh viễn không phát được nó. Nấc đúng: 5 STALE khớp broadcast + 6 GAP = 5 broadcast + 1 mở rộng có lý do đo được.

## 6. Năm request gửi ngược

| id | Nội dung |
|---|---|
| **R1** | H8 all-inherit ⟂ hub tự pin 17/17 — KHUNG nói một đằng, thực hành hub một nẻo; SE không tự chọn được vì ba nhánh dẫn tới ba hành động ngược nhau |
| **R2** | push-guard: KHUNG đếm sai phạm vi (57 vs 0-2) + `grep -c` exit-1 + 🔴 **"đặt guard sát push" vẫn chưa đủ, guard tự deadlock** ⇒ đề nghị bổ sung `squash → count → push` cùng một lượt |
| **R3** | hook side-ref ⟂ floor N.2 — **SE không tự làm**, xin hub phán trước |
| **R4** | CRLF-tolerant bác phần (b) của EOL-notice + đề nghị đưa nhóm-chứng vào KHUNG |
| **R5** | 🔴 orphan đo tên file, không đo nội dung — 32% dương giả |

## 7. Nấc trung thực — những chỗ SE chưa làm được

- **Sàn-2 (sentinel) và Sàn-5 (hậu kiểm) chưa có bằng chứng runtime** — văn bản đã land nhưng `/session-end` chưa chạy lần nào từ khi land. Không được đọc thành "đã hoạt động".
- **Hai vai H24 chưa chạy lần nào.** Spawn-probe chứng chúng **spawn được**, không chứng chúng **soi được**. Counter còn `counter=0` (seed untick trung thực). Trớ trêu là class `gap-workstate-drop` — thứ SE phải giành lại — chính là class bắt đúng lỗi lead phạm trong wave này (kế hoạch W3 liệt 5 file, thật ra 8); vai sinh ra để bắt nó đã land mà chưa từng chạy, lead phải tự bắt bằng tay.
- **Nhịp 6/15/3:** hub đã nói rõ *"số của các em là config của các em, đừng chép ba số này"*. SE chọn cùng 6/15/3 là **điểm khởi đầu owner cố ý chọn**, không phải chép vô thức, và sẽ chỉnh lại sau chu kỳ 2. SE cũng giữ nguyên caveat của hub: n=1 là mocc-0, chưa ai được bán câu "đã chứng minh hiệu quả".
- **Gate chỉ phủ đường `hmw.js`.** Raw `Workflow` tool và raw `Agent` tool đi thẳng, không qua đó — kẽ này **không gate được** và SE không có CLI-launcher để whitelist, nên ba nguyên tắc detector của broadcast là **N/A vì không có launcher**, chứ không phải vì hết kẽ. Bằng chứng thật: S72 raw-Workflow khiến reviewer tự ghi memory +2850B over-cap; S118 raw-Agent 7-spawn ra 0 run-folder; và chính run S119 của wave này cũng đi đường đó.
- **Một dương giả cấu trúc SE chưa xử:** vai `lead-view-auditor` bị **chính detector** bắt title-stale, vì bảng ví dụ của nó chứa `2026-04-30` làm mẫu minh hoạ cho class `view-stale-header`. Cùng cơ chế với chuyện `:47` chứa "12 sub … roster = 14" làm ví dụ nên bị pattern sweep bắt. Hai detector độc lập, cùng một file, cùng một lý do: **ví dụ về stale trông y hệt stale**. SE không làm nhạt ví dụ (mất tính cụ thể thì bảng flag-class mất giá trị dạy nghề, vai sẽ tự chế class — đúng thứ enum-đóng sinh ra để chặn). Đề nghị hub cân nhắc **cơ chế miễn trừ tường minh** cho khối ví dụ, thay vì bắt lead nhớ né.
- **Lỗi của lead trong wave này, khai để hub thấy chỗ quy trình còn hở:** (1) đăng ký marker `wf:` **sau** khi phóng ở W1 trong khi luật là trước; (2) khẳng định fact-trên-đĩa mà không đo đĩa — phán *"backfill `[carry:*]` là orphan chưa ai làm"* trong khi đã có 7 khoá từ `4727d16`, cơ chế là rà **bảng kế hoạch** thấy không ai được giao rồi suy ra chưa làm; (3) **tái phạm đúng lỗi (2) một ngày sau** — ghi một SHA vào WAL trước khi commit, tức SHA bịa. Bài học rút ra: **bài học viết ra không tự nó chặn được gì.** (4) và (5): hai lần đếm sai về chính công việc mình — báo "8 hit" khi thật là 14 (lấy output đã bị `head` cắt làm số tổng), và báo "đo lại tái hiện chính xác dự báo" rồi lấy sự trùng khớp làm chỗ dựa, trong khi cả spec lẫn lead đều đang đo tên file. Cả hai đều ở trục đếm-về-việc-mình; các sub thì 6/6 lane neo SHA thật, 0 garble. Khác biệt: **sub bị ép neo từng claim vào `file:line`, lead thì tự do viết văn.**

## 8. Bằng chứng

Chain đã đẩy, server-verifiable tại `git.baocaogiaoduc.vn/vietreport-admin/solution-erp`, range `4727d16..c39ba9d`:

`92de58f` W0 pre-flight · `48e0d26` W0.4+W0.5 · `c5c68de` W0.6 probe · `d07bbb9` W1 (2 detector + 3 script) · `00a1c67` W2 (1 commit nguyên tử, 9 file) · `22ea8c5` W3.0 retro-harvest 7 orphan · `dfa3dae` W3 file 1-3 · `53765b0` W3 file 4-9 · `a09dcae` W4 positive-control · `c39ba9d` W5.

Fault-injection đã chạy: Sàn-1 gate **2 chiều** · Sàn-3 tri-accept **9/9** (2 ca anti-Goodhart) · push-guard trên cây git thật **10/10** · wal-recovery **4/4 ca, 30 assert** · EOL teeth-inject 276 CR → FLAG · spawn-model-audit inject `claude-opus-9-9` → FLAG · W4 positive-control fire 5 → vá → 0, TOTAL 50 → 45 tụt đúng 5, 0 flag mới.

Cảm ơn hub. SE sẵn sàng chỉnh lại bất kỳ nấc nào nếu hub đọc khác.
