# Lane A — wal-defect+push-guard

> RETURN-only tu /fable-clone ensemble wf_1f6bd5e2-478 (vai investigator-codebase, model opus).
> Lead ghi (B3 single-writer) — sub KHONG tu ghi. agentId=ac0786c3493eb2fa9

---

VERDICT: SE ĐÃ CÓ vật-liệu cho cả 5 sàn nhưng **0/5 sàn đạt** — và push-guard **KHÔNG THỂ adopt verbatim**: `n=0` là ĐÍCH BẤT-KHẢ-ĐẠT vì `session-end.md:113` CỐ-Ý từ-chối squash wal: bị-kẹp; 57 wal: đã lọt remote **toàn bộ là loại bị-kẹp** (đo: 0/57 nằm ở đuôi) → chứng minh kênh rò chính của SE là **thuật-toán §5.0 chỉ-đếm-đuôi**, KHÔNG phải kẽ turn-seam mà broadcast mô tả; sửa §5.0 là **tiền-đề** của push-guard, không phải phụ-kiện.

---

## Bảng 5 sàn + push-guard

| Sàn | SE hiện-trạng (file:line) | GAP | Cách đối ứng | Acceptance ĐO ĐƯỢC |
|---|---|---|---|---|
| **1** đăng-ký-dương @launch | `hmw.js:19` khai `args.run` "🔴 BẮT BUỘC khi ≥3 task HOẶC >5 phút" — nhưng `hmw.js:9` + `workflows/README.md:32` tự khai **"script no-fs KHÔNG tự ép — enforcement = em-main scaffold @P1"**. Gate DUY-NHẤT đang chạy = `hmw.js:83-85` `checkpointApproved` (anti-accidental-fire, **KHÔNG** phải marker-gate) | **Nửa (i) = 0** (không cổng-vào nào chặn thiếu-marker). **Nửa (ii) ≈ N/A** (không có lời-gọi nội-bộ engine→engine). Sàn = **convention thuần** | Thêm vào `hmw.js` (sau block `checkpointApproved:85`) 1 tripwire **input-only** (no-fs, khả thi): `if (A.taskList.length >= 3 && !(A.run && A.run.dir && A.run.name)) throw` — mirror y hệt pattern `checkpointApproved`. RỒI **cùng commit** truyền cờ ở 3 wrapper: `fable-clone.md:15` · `ultra-on.md:18/33` · `/hmw` — thiếu bước này = **vỡ đường đang chạy** (đúng cảnh báo broadcast §4) | Phóng 3-task **không** `args.run` → throw. Đo: **3/3 wrapper** phóng ≥3-task đều mang `args.run`; `git grep -c "args.run" .claude/commands/` ≥ 3 |
| **2** closeout-sentinel | `session-end.md:143-145` §6.4 reset WAL = bước CUỐI. `pause.md` toàn file: **0 sentinel**. Không có dấu 'đang-đóng' ở bước đầu | **Toàn sàn = 0.** Đóng-phiên chết giữa §L.b(f) → WAL đã bị… (thực ra chưa reset) → nhưng **không dấu nào** phân biệt "chưa chạy session-end" vs "session-end chết giữa" | Ghi `closing: S<nn> @<ts>` vào WAL **ở `session-end` BƯỚC 0** (trước Phase 1 flush); xoá ở `§6.4` — §6.4 đã là **đường LUÔN-CHẠY** sẵn (bước cuối vô-điều-kiện) → xoá-dấu-không-tồn-tại = net-zero, khớp yêu cầu. Self-heal: `0.7` gặp `closing:` + ground-truth sạch → dọn 1 lần, đi tiếp | Cắt session-end giữa chừng → phiên kế `0.7` **thấy** `closing:`. Chạy 1 phiên no-op → `grep -c '^closing:' .claude/WAL.md` = **0** |
| **3** ground-truth khi sổ trống | `session-start.md:51` (a): *"chain rỗng/toàn `[x]` → báo 'WAL sạch' rồi tiếp Phase 1 (no-wait)"* · `tiep.md:15`: *"chain rỗng/toàn `[x]` → DỪNG SẠCH"* | **Lỗi SỐNG, ×2 chỗ:** suy thẳng trống⇒sạch. **VI-PHẠM "định-nghĩa MỘT chỗ"** — logic (a) bị **copy song-bản** dù `session-start.md:54` tự tuyên "bước này CHỈ LÀ CON-TRỎ" (B1 con-trỏ-canonical bị thủng đúng nhánh này) | Định-nghĩa 3-bậc **MỘT chỗ = `tiep.md`** (thêm §0 "Đối-chứng thực-địa"); `session-start.md:51` **xoá logic, chỉ trỏ**. Xem 3-bậc SE-tailored ↓ | 2/2 điểm-vào (`/tiep` + `0.7`) đều gọi CÙNG 1 định-nghĩa. Dựng "WAL trống + 1 run-folder mở" → **cả 2 hỏi-lại**, không tuyên sạch. `grep -c "chain rỗng" .claude/commands/session-start.md` = **0** |
| **4** test-suite 3 lớp | **`ls scripts/ \| grep -iE 'wal\|recover\|tiep'` = NONE.** S111 fault-inject 2-ca (`broadcasts/outbox/ai_infra/2026-07-12-…-wal-adopt-report.md:31`) nhắm **hook-persist** (thiếu-1-path vẫn commit · 0-delta im lặng), **KHÁC trục** với recovery. `harness-11-engine.md:411` (N.7a) tự khai *"pilot CHƯA chạy đủ"* | **0/3 lớp.** Chưa có cả lớp-1 (dừng-sạch). Bị **chặn bởi Sàn 3** — chưa có detector thì không có gì để test | `scripts/wal-recovery-test.ps1` (mẫu `-RepoRoot` cây-tạm đã proven S95 fault-injection) — 4 ca: dừng-sạch(kỳ vọng im) · đứt-giữa-run(bắt) · đóng-phiên-bị-cắt(bắt) · **dấu-treo-nhưng-thực-sạch(self-heal)** | `4 verdict` ghi ra file, **không** gạch-đầu-dòng. Anti-Goodhart: inject-lỗi phải **FLAG**, không chỉ happy-path PASS |
| **5** hậu-kiểm cờ-vs-nội-dung | Gần nhất = `session-start.md:97` §2.1.1 harvest-curator **folder-scan orphan** (`run.md` có, `*-synthesis.md` vắng) + `session-end.md:51` §L.b(f) close-gate. `workflows/README.md:20` = orphan-authority | **Lệch trục:** hiện soi *run-folder ↔ synthesis*, **KHÔNG** soi *cờ `args.run` ↔ mục `wf:` trong WAL*. Và `:98` khai **"Light session → có thể skip"** | Gấp vào §L.b(f) 1 dòng: mọi `runs/<id>/` mtime trong phiên ↔ có dòng `wf: … run=<id>` trong WAL/session-log? Lệch → **NÊU** (informational) | Chênh-lệch = **0**, hoặc in được danh-sách lệch. Chi-phí ~0 (gấp vào gate sẵn có) |

---

## 🔴 push-guard — GAP nghiêm-trọng nhất (mâu-thuẫn cấu-trúc, không phải thiếu-sót)

**Vị trí hiện tại:** `session-end.md:111-115` §5.0 squash → `:117-120` §5.1 commit-chốt → `:122-124` §5.2 push. **§5.0 cách §5.2 hai bước, KHÔNG sát push, KHÔNG cùng lượt.**

**Nhưng kẽ THẬT của SE lớn hơn kẽ broadcast mô tả:**

- `session-end.md:112` — K = số subject **LIÊN-TỤC** `wal:` từ HEAD xuống, **DỪNG ngay khi gặp subject KHÁC**.
- `session-end.md:113` — *"wal: kẹp sâu hơn (sandwiched DƯỚI commit thường chưa-push) → **GIỮ NGUYÊN**, chấp-nhận noise"*.

→ **§5.0 cấu-trúc KHÔNG THỂ đưa n về 0 trong bất-kỳ phiên nào tạo >1 commit.** Đo sống:

```
3fde8af [CLAUDE] Docs: S118 closeout      ← §5.0 @S118 đã fold 2 wal: ở đuôi vào đây (reflog HEAD~2) ✓
c808b9a [CLAUDE] Auth: gate ReportsController
1491d29 wal: flush 20260714T1549          ← BỊ KẸP → §5.0 từ-chối → LỌT
b7f7b56 wal: flush 20260714T1531          ← BỊ KẸP → LỌT
c2135ba [CLAUDE] Auth: PRO role giu quyen
```

**57 wal: trên origin/main = 0 ở đuôi, 57 bị-kẹp** (14 khối liên-tục: 3×1, 6×2, 1×4, 2×7, 1×8, 1×16). Squash CÓ chạy và chạy ĐÚNG — chỉ là **phạm-vi cố-ý hẹp**. Tốc-độ rò ~**10/phiên** (37 @07-12 · 10 @07-13 · 10 @07-14 — bắt đầu đúng ngày hook lên S111, trước đó 0).

**Đo live lượt này (thay đổi so với số lead đo):** `origin/main..HEAD` = **n=4** (lead đo 3 lúc 08:43 → hook fire thêm `aab817b` @09:29). K=4=n → **lúc này** chưa kẹp → guard sẽ PASS. **Nhưng** ngay khi S119 tạo commit thường đầu tiên (spec-file/wave), wal: dưới nó thành bị-kẹp → §5.0 từ-chối → **n>0 vĩnh-viễn → push-guard chặn cứng, không lối thoát.**

**Ba điểm kỹ-thuật (a)(b)(c) — đối chiếu SE:**

- **(a) exit-code trap — SE ĐANG PHƠI-NHIỄM.** Demo chạy sống: `git log --format='%s' origin/main..HEAD | grep -c '^zzz:'` → **in `0`, exit `1`**. `.claude/WAL.md:15` `verify:` hiện dùng **đúng** idiom `| grep -c '^wal:'` → nếu lead chain `&& git push` thì **ca SẠCH bị chặn**. → Bắt buộc `n=$(…); [ "$n" -eq 0 ]`.
- **(b) first-push precheck** — `git rev-parse --verify --quiet origin/main` ✅ EXISTS → **N/A cho SE** (repo đã thiết-lập), nhưng giữ nhánh else = vô-hại.
- **(c) remote-branch tên thật** = **`origin/main`** (`git remote`=origin; `@{upstream}`=origin/main; `§5.2` push `origin main`). §5.0 **đã dùng đúng** `origin/main..HEAD` ✅ — điểm (c) SE đã đạt sẵn.

**Cách đối ứng (2 phần, KHÔNG tách được):**

1. **Nâng §5.0 từ "chỉ-đuôi" → "toàn-bộ-chưa-đẩy".** Hợp-pháp 100%: wal: bị-kẹp **chưa-push** → fold chúng **KHÔNG** vi-phạm N.4 "không rewrite đã-đẩy". ⚠️ `git rebase -i` **bị chặn trong harness này** (Bash tool: "Interactive flags not supported") → dùng `GIT_SEQUENCE_EDITOR` trỏ script (SE đã quen PS1: `wal-flush.ps1`/`governance-detectors.ps1`) rewrite `pick <sha> wal:` → `fixup` (**fixup, KHÔNG drop** — drop = mất nội-dung WAL/agent-memory/runs). **Biên phải xử:** wal: nằm ở **đáy range** (không có commit thường bên dưới để fixup vào) → giữ nhánh `reset --soft HEAD~K` sẵn có; ca n=4=K hôm nay rơi đúng biên này.
2. **Đặt guard SÁT push, CÙNG LƯỢT** — chuyển phép đếm vào chính khối `§5.2`, chained ngay trước `git push origin main`. Đặt ở §5.0 = **KHÔNG đủ** (hook fire ở turn-boundary NẰM SAU §5.0/§5.1).

**Acceptance đo được:** (i) chạy §5.0-mới trên phiên có ≥2 commit thường xen wal: → `n=0`; (ii) `git log --format='%s' origin/main..HEAD | grep -c '^wal:'` **ngay trước** push = 0 **trong cùng transcript-turn** với `git push`; (iii) sau push, `git log --format='%s' origin/main -20 | grep -c '^wal:'` **không tăng** so với 57.

> ⚠️ **Đây là ứng-viên `/adap-request` chính-đáng.** KHUNG push-guard giả-định "squash phủ được mọi wal: chưa-đẩy" — giả-định đó **sai với mọi repo có hook per-turn + closeout >1 commit**. Hub tự soi thấy 9-chưa-đẩy + **1** đã lọt; SE = **57** (57×). Đề-xuất ngược 2 hướng: (α) KHUNG nói rõ squash phải phủ **toàn range chưa-đẩy**, không chỉ đuôi; (β) căn-cơ hơn — **hook commit vào side-ref** (`refs/wal/snapshot` qua `commit-tree`+`update-ref`) thay vì nhánh chính → nhánh không bao giờ có wal: → n≡0 trivially, durability giữ nguyên (ref nằm trong `.git`, Dropbox sync). (β) **lệch N.2 floor** ("git add 3 path + git commit") → phải qua adap-request, KHÔNG tự làm. 🔸 CHƯA VERIFY (β) bằng thực-nghiệm — mới là lập-luận plumbing.

---

## 🧹 57 wal: đã lọt remote — **KHÔNG dọn. Chấp nhận sunk-cost.**

**Có thể không?** Kỹ-thuật thì có (`filter-repo` + force-push). **Có nên không? KHÔNG — 3 lý do xếp theo sức nặng:**

1. **Vi-phạm floor.** `harness-11-engine.md:408` (N.4) + `session-end.md:113`: *"KHÔNG BAO GIỜ rewrite commit đã-push"* = 🔴 FUNCTION-FLOOR, đánh-đổi hard-safety **có chủ-đích**. Dọn = tự phá chính điều khoản mình vừa adopt.
2. **Blast-radius phá chuỗi bằng-chứng của chính H22.** Range từ wal: cũ nhất (`ec81c5c`) = **78 commit, trong đó 21 commit THẬT đổi SHA**. Đo citation trong repo:
   - `12071c5` → cited **12 file** · `67be443` → **10 file** ← **chính là 2 commit chứng-minh hook-FIRE** ở `harness-11-engine.md:407` (N.3) + adopt-report gửi AI_INFRA
   - `88368fd` → 8 · `d436af2` → 7 · `81b59f0` → 7 · `c2135ba` → 6 · `c808b9a` → 6 · `e88e75d` → 4
   → Rewrite = **tự vô-hiệu-hoá bằng-chứng VERIFIED-RUNTIME của H22**, phá `§6.3` "SERVER-VERIFIABLE chain N commit sha", bắn cờ C1 broken-pointer hàng loạt, và làm adap-report đã gửi hub thành **không đối-chứng được**. Đây là cái giá đắt nhất.
3. **Hại thực-tế của 57 = 0.** Chúng là commit **nội-dung hợp-lệ** (WAL.md/agent-memory/runs state), không corrupt gì, chỉ làm `git log` ồn. Cộng: force-push vào remote dùng chung + Gitea runner (CI #388/#389 tham chiếu commit) + repo nằm trong Dropbox (rewrite + cloud-sync = rủi-ro `index.lock`, đã ghi ở N.7(e)).

**Khung đúng để báo anh:** *57 = tổn-thất chìm, **cách-ly bằng chính-sách**, không dọn. Giá-trị của push-guard ở SE = **cầm máu ~10/phiên**, KHÔNG phải dọn quá-khứ.* Nếu muốn "sạch mắt" → cosmetic-only, 0-rewrite: `git log --invert-grep --grep='^wal:'` làm alias xem-log, hoặc note 1 dòng trong `rules.md §5.2` giải-thích wal: pre-S119 = noise đã-đóng-băng.

---

## 3 phát-hiện ngoài đề-bài (đều đo được, đều chạm quyết-định)

1. **Lớp-1 của broadcast KHÔNG lý-thuyết ở SE — S118 là ca THẬT.** `ls .claude/workflows/runs/` → **không có folder S118 nào** (có 2026-07-14-S117-*, nhảy thẳng sang 2026-07-15-S119). Mà HANDOFF:5 ghi S118 = *"em-main-led + **7 spawn** + 3 commit + 2 deploy"*. → Một run 7-agent, trọn ngày, **0 run-folder, 0 dòng `wf:`, 0 marker**. Nếu S118 chết giữa chừng → sổ trống → phiên sau tưởng sạch. **Đây là bằng-chứng nội-bộ SE cho đúng kẽ hub mô tả.**

2. **`workflows/README.md:52` là claim STALE đang che Sàn 1.** Nguyên văn: *"Anti-bypass detector: **SE TAILORED-OUT** — SE chạy workflow qua Anthropic Workflow tool (KHÔNG có CLI-launcher để lách) → **bypass-surface ~N/A**"*. **Bị bác bởi 2 dữ-kiện:** (i) memory `feedback_harness10_run_trace.md:20` — *"**RECURRED S72**: chạy REVIEW qua **RAW Workflow tool** (KHÔNG qua hmw.js wrapper) → KHÔNG inject writeGuard → reviewer tự ghi MEMORY +2850B over-cap → em-main git-status BẮT @session-end + revert"* → kết luận nguyên văn: *"dùng RAW Workflow tool = **MẤT governance của project-wrapper**"*; (ii) S118 raw-Agent 7-spawn ở trên. → **Đồ-thị lời-gọi thật của SE = 3 đường tới engine:** `hmw.js` (đường DUY-NHẤT SE sở-hữu & gate được) · **raw Workflow tool** · **raw Agent/Task tool**. Hai đường sau thuộc harness Anthropic → **SE KHÔNG gate được** = kẽ CÒN-LẠI, đúng như broadcast §5 tự khai. 🔴 Phải sửa `README.md:52` **trước** khi adopt Sàn 1, nếu không cái cớ "tailored-out" sẽ (sai) biện-minh cho việc skip luôn Sàn 1.

3. **Sàn 3 wire thẳng = bão báo-động-giả ngay lượt đầu** (đúng cái `Sàn 2` cảnh báo *"báo-động-giả lặp còn hại hơn kẽ gốc"*). Chạy folder-scan theo authority `README.md:20` → **8/27 run-folder = orphan**, 7 là **tồn-đọng cũ** (S112 ×4, S113, S114, 2026-07-13-pe-negative-quote), 1 là S119 đang bay hợp-lệ. Spot-check 3/7: chỉ có `run.md` + `spec-*.md`, **0 `*-synthesis.md`** (⚠️ CHƯA VERIFY harvest có thật xảy ra vào `agent-memory/` hay không — hai cách đọc, cùng 1 kết luận). → **Phải baseline TRƯỚC khi wire:** hoặc dọn/đóng 7 folder, hoặc giới-hạn scan theo mtime > lần closeout cuối. **Acceptance:** `0.7` trên phiên sạch trả về đúng `{run đang bay của phiên hiện tại}`, tồn-đọng = **0**.

---

## 3-bậc ground-truth SE-tailored (Sàn 3 — vá điểm-mù hook)

Điểm-mù đúng như broadcast: hook `wal-flush.ps1:7` auto-commit **3 path** {`WAL.md` · `agent-memory/` · `workflows/runs/`} → *"dirty file"* và *"commit chưa-đẩy"* **MÙ đúng 3 vùng đó**. Nhưng SE có **lối thoát mà broadcast không kê** — hook chỉ tạo subject `wal:` (`wal-flush.ps1:16`), nên **soi theo PATH bên trong wal:-commit là tín-hiệu sống**:

- **MẠNH** (một cái là đủ để **hỏi-lại**, không tuyên sạch):
  1. `runs/<id>/` có `run.md` mà `*-synthesis.md` vắng/0-byte — **git-independent, miễn-nhiễm hook** ← trụ chính, đã có sẵn ở `session-start.md:97` nhưng **nằm SAU điểm quyết-định `0.7`** và **skippable** (`:98`) → chỉ cần **hoist lên `0.7`**, chi phí ~0
  2. `origin/main..HEAD` có commit **KHÔNG** phải `wal:` → hook không sinh loại này → **không mù**
  3. `closing:` sentinel còn treo (Sàn 2)
  4. 🆕 **wal:-commit chưa-đẩy có đụng `.claude/workflows/runs/`** → **thu-hồi được một phần điểm-mù hook**. Đo sống lượt này: `aab817b` touch `.claude/WAL.md` + `runs/2026-07-15-S119-…/run.md` → dù WAL.md có bị xoá trắng, **commit của chính hook vẫn tố-giác** rằng một run đã được dựng. Lệnh: `git log --name-only --format='%s' origin/main..HEAD | grep -q 'workflows/runs/'`
- **TRUNG-BÌNH:** >N file bẩn ngoài 3 path persist (N tự chỉnh — SE có 188 file i/lf+w/crlf, ngưỡng phải **loại nhiễu EOL** trước, nếu không sẽ luôn kêu → lane B)
- **YẾU:** bẩn thô sau loại-trừ

**Ghi MỘT chỗ = `tiep.md` §0; `session-start.md:51` xoá logic → trỏ.** (`:54` đã tự tuyên là con-trỏ — nay làm cho đúng lời.)