# adap-report — H22 wal-defect-fix (5 sàn + push-guard)

## 1. id-broadcast
`2026-07-13-Governance-harness-22-wal-defect-fix`

## 2. nấc G-011
**executed** — per-sàn KHÔNG đồng đều, chấm TỪNG DÒNG (gộp 1 nhãn = che mất chỗ yếu):

| Sàn | Nấc | Vì sao đúng nấc đó |
|---|---|---|
| **1** đăng-ký-dương @launch | **executed + runtime-verified** | gate cơ-khí-hoá `hmw.js:147`; fault-inject **2 CHIỀU**: 3 task thiếu `args.run` → **THROW, agent_count=0, token=0, 14ms** (chặn TRƯỚC spawn) · 2 task thiếu cờ → **gate IM, 2/2 sub return** ⇒ ngưỡng ≥3 đúng, không over-fire |
| **2** closeout-sentinel | **verified-pending** | 🔴 văn-bản đã land (`session-end` BƯỚC 0 đặt + §6.4 xoá) nhưng **`/session-end` CHƯA chạy lần nào từ khi land** ⇒ chưa có bằng-chứng runtime |
| **3** ground-truth khi sổ trống | **executed + fault-inject 9/9** | định-nghĩa canonical @`tiep.md` §0 + `session-start` 0.7 rút logic (acceptance `grep -c "chain rỗng"` = **0** ✅). Fault-inject cây tạm 9/9 gồm 2 ca anti-Goodhart |
| **4** test-suite 3 lớp | **executed + runtime-verified** | `scripts/wal-recovery-test.ps1` — **4/4 ca · 30 assert · 0 fail**, có counterfactual tái-hiện DEADLOCK `rebase-exit=0` |
| **5** hậu-kiểm cờ-vs-nội-dung | **executed** | gấp vào `session-end §L.b(f)`; **chưa chạy** (cùng lý do sàn-2) |
| **push-guard** | **executed + RUNTIME-VERIFIED (dùng thật)** | fault-inject cây **git THẬT 10/10** + **push thật phiên này**: `4727d16..c39ba9d`, trailing-K=0, K sau push=0, `wal:`/20-commit **11→7 (không tăng)** |

🔴 **KHÔNG claim `verified`** — nấc đó do `/adap-audit` phía AI_INFRA chấm cross-repo.

## 3. evidence

**Chain commit (ĐÃ PUSH — server-verifiable tại `git.baocaogiaoduc.vn/vietreport-admin/solution-erp`, range `4727d16..c39ba9d`):**

| Wave | sha | Nội dung |
|---|---|---|
| W0 | `92de58f` | `.gitattributes` EOL-class + hook rebase-interlock + FIX#3-bis 4-ca |
| W0.4/0.5 | `48e0d26` | `workflows/README.md:52` gỡ claim STALE + baseline orphan (`git %cI`, KHÔNG mtime) |
| W0.6 | `c5c68de` | probe LF làm **nhóm chứng** (lệch spec CÓ CHỦ-ĐÍCH) |
| W1 | `d07bbb9` | `wal-recovery-test.ps1` 4-ca + 2 detector + eol-check |
| W2 | `00a1c67` | Sàn-1 gate + 3 cờ wrapper **CÙNG 1 COMMIT** (9 file, +296/−14) |
| W3 | `dfa3dae` | `tiep.md` §0 Sàn-3 canonical · `session-start` 0.7-trỏ · `session-end` Sàn-2 + §5.0/§5.2 + Sàn-5 |
| W3 | `53765b0` | `workflows/README.md` orphan-authority TRI-ACCEPT |

**Đo thật:**
- Sàn-1 fault-inject: THROW ở **14ms**, `agent_count=0`, `token=0` ⇒ chặn **TRƯỚC** spawn, không phải sau.
- Sàn-3 fault-inject **9/9** (cây tạm): FLAG đúng → orphan-thật · flat 0-byte · C8 0-byte · chữ "synthesis" **giữa câu văn** (không phải heading). IM đúng → dạng-1 · dạng-2 · dạng-3 · `##   Synthesis` (hoa+space) · folder không `run.md`.
- Sàn-4: 4 ca · **30 assert** · 0 fail; assert `sut-has-no-NONWAL-param` dùng **`Get-Command` reflection** (KHÔNG grep — né tự-tham-chiếu).
- push-guard fault-inject **10/10** trên cây **git thật**.
- `grep -c "chain rỗng" .claude/commands/session-start.md` = **0** (acceptance Sàn-3).

## 4. tailored-gì + skip-gì-vì-sao

**TAILORED (giữ FUNCTION-floor, đổi FORM theo project-fit):**

1. **Sàn-3 → 3 bậc SE-tailored, vá điểm-mù CỦA CHÍNH SE.** Hook `wal-flush.ps1:7` tự-commit **3 path** ở mọi turn-boundary ⇒ 2 tín-hiệu trực-giác nhất (**cây bẩn** + **có commit chưa đẩy**) **MÙ đúng 3 vùng đó**. ⇒ bậc MẠNH dựng từ tín-hiệu hook **không chạm tới được**: ① orphan run-folder (**git-independent**) · ② commit **không phải** `wal:` (hook không sinh loại này) · ③ `closing:` treo · ④ **`wal:`-commit chưa đẩy có đụng `workflows/runs/`** — thu-hồi một phần điểm-mù: dù `WAL.md` bị xoá trắng, **commit của chính hook vẫn tố-giác** run đã dựng.

2. **🔴 Sàn-3 + TRI-ACCEPT (phát-hiện SE, KHÔNG có trong broadcast — xem §5).**

3. **push-guard: KHUNG "đặt guard sát push" CHƯA ĐỦ ⇒ SE làm `squash → count → push` CHAINED 1 LƯỢT.** Lý do đo được: giữa §5.0 và §5.2, closeout **chắc chắn** làm bẩn path hook (ghi `closing:` · spawn sub → `agent-memory/` · ghi `runs/`) ⇒ **mỗi turn-boundary = +1 `wal:`** ⇒ tách ra là **tự sinh lại đúng thứ vừa dọn**. → **đã gửi ngược thành adap-request R2 (γ)**.

4. **Đếm TRAILING, không đếm tổng.** §5.0 **cố ý** để yên `wal:` kẹp dưới commit thường (hard-safety: không rewrite lịch-sử đã đẩy) ⇒ nếu §5.2 đếm toàn dải thì nó đếm luôn mấy cái cố-ý-để-yên ⇒ **chặn push vĩnh viễn**. Đo thật: đếm-toàn-lịch-sử = **57**. **Cả 2 bẫy TÁI HIỆN ĐƯỢC trên cây git thật**, không phải cảnh-báo lý-thuyết:
   - `grep -c` đếm 0 → **exit 1** ⇒ dùng exit-code làm điều-kiện thì ca **SẠCH** bị chặn.
   - đếm-toàn-lịch-sử=1 vs trailing=0 ⇒ đếm tổng chặn push.

5. **4 ca của FIX#3-bis KHÔNG vào `session-end`** — chúng thuộc W0.3 (ca mổ **một lần**) nơi phải chọn *rebase vs reset*. §5.0 **không bao giờ rebase** ⇒ không có nhánh để chọn. Chứng: trailing-K **tự đúng cả 4 ca** — ca(1) `HEAD~K == origin/main` (≡ `reset --soft origin/main` của FIX#3(c)) · ca(2) `base+wal+[CLAUDE]` → K=0 → **push được, KHÔNG deadlock** · ca(3) đáy không bị chạm, nội-dung còn ở INDEX · ca(0) skip.

**SKIP / n-a:** không có sàn nào skip.

## 5. honest-caveat

🔴 **(a) 2 sàn CHƯA có bằng-chứng runtime:** Sàn-2 (sentinel) + Sàn-5 (hậu-kiểm) — 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".**

🔴 **(b) Gate CHỈ phủ đường `hmw.js`.** Kẽ **CÒN LẠI, KHÔNG gate được**: raw `Workflow` tool + raw `Agent` tool đi **thẳng**, không qua file đó ⇒ mất writeGuard + run-trace. Bằng-chứng thật: S72 raw-Workflow ⇒ reviewer tự ghi MEMORY **+2850B over-cap** · S118 raw-Agent 7-spawn ⇒ **0 run-folder** · **chính run S119 của wave này** cũng đi raw-Workflow. SE **KHÔNG có CLI-launcher để whitelist** ⇒ 3 nguyên-tắc detector của broadcast là **N/A vì không có launcher**, **KHÔNG phải vì "hết kẽ"**.

🔴 **(c) Ngưỡng "hoặc ước >5 phút" KHÔNG cơ-khí-hoá được** (script không đo trước thời-lượng) ⇒ nửa đó vẫn là **kỷ-luật người**, không phải cổng.

🔴 **(d) PHÁT-HIỆN NGƯỢC — "orphan" trong thiết-kế H22/H18-B đo TÊN FILE, không đo NỘI DUNG.** SE đo trên 25 run: **naive 13 / dual-accept 8 / C8 cứu 5** ⇒ **8 dương-giả = 32%**. Nặng nhất: folder **ghi chép ĐẦY-ĐỦ NHẤT** (`pe-negative-quote` — có cicd PASS + bundle-hash + smoke 200 + 6 stage `[x]` + dòng *"PIPELINE COMPLETE — shipped + live-verified"*) **VẪN** bị xếp orphan, chỉ vì không có file tên `*-synthesis.md`. Thực-địa có **≥4 dạng** ghi synthesis; doc thừa-nhận **2** ⇒ mệnh-đề C8 dual-accept **CHƯA ĐỦ** → SE mở **TRI-ACCEPT** (nhận dạng-3 `## synthesis` trong thân `run.md`).
  - 🔴 **KHÔNG phải lỗi tailor của SE — là giới-hạn của chính ĐỊNH-NGHĨA orphan.** Gate hỏi *"đã harvest chưa"* (câu hỏi về **NỘI DUNG**) nhưng đo **TÊN FILE** ⇒ đo cái **dễ đo**, không phải cái **cần đo**.
  - **Bồi:** commit `8fa2fcc` khoe message *"close-review run.md synthesis [H2 gate]"* mà `git show --stat` **KHÔNG chạm folder** ⇒ H2-gate **đã soi + coi là ĐÓNG**, chỉ lệch tên file.
  - **KHÔNG phải convention-cũ-một-thời-kỳ:** cùng ngày **07-12**, `h22-wal-adopt` ghi dạng-1 (file phẳng) còn `S112-*` ghi dạng-3 (trong run.md) ⇒ **thói-quen không nhất-quán**.
  - **Kẽ CÒN LẠI:** **dạng-4** (kết-quả rải dưới heading tuỳ-ý) **không máy nào bắt được** — nhận nó = phải nhận "bất-kỳ run.md nào có vẻ nói về kết-quả" ⇒ quá lỏng ⇒ **để người phán**. Khai thẳng: **chưa xử**.
  - **Nấc nhận:** tri-accept = **lưới PHÁT-HIỆN cho bản CŨ, KHÔNG phải giấy phép VIẾT bản MỚI** (mượn đúng khuôn C8: tha di-sản, cấm viết mới kiểu cũ).

🔴 **(e) 7 orphan tồn-đọng ĐÃ ĐÓNG THẬT (anh chủ-dự-án chốt), KHÔNG scope/allowlist.** `22ea8c5` — 7 synthesis viết theo lối **COPY additive** (`run.md` giữ nguyên; file mới tự khai *"bản gốc trong run.md mới là CHUẨN"*) ⇒ **0 rewrite history**. dual-orphan **8→2** (còn wave S119 + run S122 = 2 run đang bay hợp-lệ).

🔴 **(f) 3 lỗi LEAD trong đợt adopt này (khai để hub thấy chỗ quy-trình còn hở):**
   1. **Sàn-1 LỆCH ở chính W1:** lead đăng-ký marker `wf:` **SAU** khi phóng (luật = **TRƯỚC**). Vá ở W3.0: đăng-ký marker thành **nhịp riêng trước phóng**.
   2. **Khẳng-định fact-trên-đĩa mà không đo đĩa:** lead phán *"backfill `[carry:*]` = orphan chưa ai làm"* → **SAI**, đã có 7 khoá từ `4727d16`. Cơ-chế: rà **bảng wave** thấy không ai được giao ⇒ suy ra chưa làm. **"Không wave nào sở-hữu" ≠ "chưa có trên đĩa".**
   3. **Tái phạm chính lỗi #2 một ngày sau:** ghi `Commit 8fb2c9d` vào WAL **TRƯỚC khi commit** = **SHA bịa**. ⇒ **bài học viết ra không tự nó chặn được gì.**

🔴 **(g) GAP THẬT thay claim sai — carry-age vacuous VỀ CẤU-TRÚC:** 45 logic-segment nhưng `carry-lines=1` ⇒ streak **≡1** ⇒ **0 fire VĨNH VIỄN, kể cả sau W2**. Chứng: `tra-bui-relogin` chỉ đóng dấu **seg#0 (S119)**, trong khi **seg#2 (S118)** nhắc **đúng việc đó** mà **không có dấu** ⇒ **tuổi thật ≥2, máy đọc 1**. §Q3 no-retrofit ⇒ đường duy nhất = **nghi-thức RE-STAMP mỗi phiên** (land `session-end §L.b(j)(iv)`). **Khai thẳng: carry mở TRƯỚC S122 có tuổi đo-thiếu.**

---
*Ghi @S122 (2026-07-15) · lead Opus 4.8 · chain ĐÃ PUSH `4727d16..c39ba9d`, tree clean, K=0*
