# sub-implement-D-5vong — Axis D (5-vòng closure + completeness-gate CÓ RĂNG)

> Worker-3 `impl-D-5vong` @S146 · relaunch-cắt-gọt qua `/tiep` (S145 chết giữa chừng).
> **File sở-hữu (disjoint):** `.claude/commands/session-end.md` + `.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md`.
> **VERDICT: DONE** (4/4 việc + 4/4 acceptance PASS, output thật dán bên dưới).

---

## 0 — GROUND-TRUTH đo tươi @S146 (TRƯỚC khi sửa gì)

### 0.1 Folder-state 3 vai-KIỂM (landmine phép-4) — lệnh + output THẬT
```
$ ls -la .claude/agent-memory/tooling-harvest-audit/ .claude/agent-memory/h24-audit/ .claude/agent-memory/sleep-audit/ 2>&1
ls: cannot access '…/.claude/agent-memory/h24-audit/': No such file or directory
ls: cannot access '…/.claude/agent-memory/sleep-audit/': No such file or directory
…/.claude/agent-memory/tooling-harvest-audit/:
total 4
drwxr-xr-x 1 pqhuy 197609 0 Jul 22 18:27 .
drwxr-xr-x 1 pqhuy 197609 0 Jul 22 19:49 ..
```
⇒ `tooling-harvest-audit/` **TỒN-TẠI nhưng RỖNG** (0 `MEMORY.md`) · `h24-audit/` + `sleep-audit/` **MISSING**.
⇒ 3 vai **WIRED nhưng CHƯA chạy audit-round THẬT** ⇒ phép-4 = **`not-yet-run (vacuous)`**, KHÔNG FAIL, KHÔNG ĐẠT-ảo.

### 0.2 Ambiguity STALE (VIỆC 1) — xác-nhận trước khi vá
`session-end.md:123` (bản cũ) xếp `h24-audit`/`sleep-audit` vào diện chờ-land về sau ⇒ mâu-thuẫn chính roster Phase 1 (:40-42 đã wire AUTO) + mâu-thuẫn đĩa (3 contract tồn-tại thật).

### 0.3 Phát-hiện thêm TRONG file mình sở-hữu — con-trỏ CHẾT
`session-end.md:42` trỏ **`Phase 4.5`** cho `sleep-audit`. Grep heading file: chỉ có `Phase 1 · 1.5 · 2 · 3 · 4 · 5 · 6` ⇒ **KHÔNG có Phase 4.5** ⇒ broken-pointer (detector C1 sẽ bắt). Vá trong axis D (V4 = vòng nén-ngủ).

### 0.4 vế-count dòng-nợ — spec ghi "3-vế", ĐĨA in 4 đoạn (đo tươi)
- `scripts/nhip-no-probe.ps1:201` = `Write-Host ("NHIP-NO: kiem {0} | {1} | {2} | {3}" …)` ⇒ **4 đoạn**
- `:22` usage-doc = `NHIP-NO: kiem … | tran-bo-nho … | run-chua-gom … | pull-cach N ngay` ⇒ 4
- 4 command (`pause:44` · `tiep:112` · `session-start:216` · `session-end:104`) đều gọi **"4-vế"**
- 🔸 **`scripts/nhip-no-probe.ps1:3` header VẪN ghi "3-part debt line" = STALE** — file NGOÀI quyền mình ⇒ **báo lead, KHÔNG tự sửa**
⇒ Gate viết **"dẫn NGUYÊN VĂN dòng script in"** + **trỏ script làm canonical vế-set** (B1), KHÔNG chốt số vế trong doc ⇒ script đổi vế thì gate không stale.

---

## 1 — VIỆC 1: gỡ ambiguity stale (spec D.4) ✅

**File:** `.claude/commands/session-end.md:132` (bullet 🔸 cuối khối (g-bis)).
- Cũ: "vai #2 `h24-audit` + #3 `sleep-audit` land dần sau khi vai này chạy-thử-1-phiên + báo nấc"
- Mới: **"cả 3 vai-KIỂM đã BUILT + WIRED S145 … Mỗi vai chạy audit-round khi vòng tương-ứng chạy, độc-lập, KHÔNG chờ nhau"** + errata 🧊 nêu rõ bản cũ STALE (mâu-thuẫn roster Phase 1 + mâu-thuẫn đĩa) + trỏ `docs/STATUS.md` §Sub-agents cho số roster (B1 — KHÔNG chép số).

🔴 **Citation-trap gặp THẬT (lớp `feedback_citation_trap_selfreference`):** bản vá đầu **dẫn nguyên văn** cụm stale trong ghi-chú errata ⇒ `grep 'land dần sau'` vẫn = **1** (chính dòng vá). Acceptance là grep-trần, KHÔNG có discriminator use⟂mention ⇒ **diễn-đạt lại không tái-tạo literal** ("xếp vào diện **chờ-land về sau**") thay vì bịa discriminator. Sau vá: **0** (cả bản có dấu lẫn không dấu).

**Kiểm chéo :40-42 (yêu-cầu "2 chỗ không nói ngược"):**
- `:40` `tooling-harvest-audit` — "AUTO sau đo §L.b(g-bis)" ✔ khớp end-only tuyệt-đối
- `:41` `h24-audit` — **sửa thêm** cho khớp coupling: "@§L.b(j)(ii-bis) nếu cặp nổ ở close, @`session-start` §2.1.8 nếu cặp nổ ở open; *wherever it fires*"
- `:42` `sleep-audit` — **sửa** con-trỏ chết `Phase 4.5` → "AUTO sau **mỗi lượt nén** `/sleep-recovery-memory-l2` — post-step của skill, *wherever it fires*: consent @§2.1.2 HOẶC @§L.b(c)" + note 🧊 khai lý-do vá

---

## 2 — VIỆC 2: D2 COMMIT DEFER (option b) + landing site + H24-coupling ✅

**Landing chính:** `session-end.md:124-131` — mục **(vi)** MỚI trong khối (g-bis).
- **Luật 1 dòng** (câu canonical chép sang 3 contract): *"KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close."*
- **3 vế lý-do (viết rõ, không "chưa kịp làm"):** (1) nhịp "hai đầu" buộc tầng **ĐO** 2 đầu (H1/H2 báo-diff @open, wired thật) — KHÔNG buộc tầng **KIỂM**; (2) cột self-verify V1/V2/V4 canonical = **CLOSE-time**, thứ bị chấm chỉ SINH ở close; (3) @open chỉ diff-report đã em-main verify ⇒ **0 artifact authoritative** ⇒ ép KIỂM @open = chấm bản chưa tồn-tại = đúng **ĐẠT-ảo** mà fail-safe NO-OP của cả 3 contract đang cấm.
- **Đánh-đổi + điều-kiện huỷ-defer** khai thẳng: sai @open chỉ soi ở close cùng phiên (trễ, không mất); @open mà sinh artifact authoritative ⇒ **PHẢI xét lại** (defer có điều-kiện huỷ, không đóng vĩnh-viễn).

**H24-coupling — CHỌN option "wherever it fires"** (viết rõ, kèm lý-do + phân ranh 3 vai):
- `h24-audit` bám **cặp H24 wherever it fires**: cặp @§L.b(j)(ii) ⇒ chạy close; cặp @`session-start §2.1.8` (OVERDUE + consent) ⇒ chạy **NGAY tại open, ngay sau cặp**. Lý-do: pin = FLAG-list H24 tươi, **authoritative NGAY khi cặp trả**.
- `sleep-audit` **cùng khuôn** (bám lượt nén — consent @§2.1.2 hoặc @§L.b(c)); pin = `.gist.md` tươi.
- **Chỉ `tooling-harvest-audit` end-only TUYỆT-ĐỐI** (pin H1-chốt + H2-5-trục chỉ sinh ở close).
- Hoà-giải mâu-thuẫn biểu-kiến: **"end-only" = KHÔNG mở nhịp KIỂM RIÊNG @open**; vai vẫn **đi theo con-đo** bất kể con-đo nổ ở đâu.

**3 contract — mỗi file +1 dòng luật (+ coupling riêng):**
| file | dòng | nội-dung |
|---|---|---|
| `.claude/agents/tooling-harvest-audit.md` | `:25` | luật + "end-only **TUYỆT-ĐỐI**", CẤM tự chạy @open |
| `.claude/agents/h24-audit.md` | `:26` (+`:27`) | luật + ngoại-lệ bám cặp H24 *wherever it fires* |
| `.claude/agents/sleep-audit.md` | `:25` (+`:26`) | luật + ngoại-lệ bám lượt nén *wherever it fires* |

Cả 3 **TRỎ** `session-end.md §L.b(g-bis)(vi)` cho lý-do đầy-đủ (B1 — không chép lý-do 3 nơi).

---

## 3 — VIỆC 3: D1 completeness-gate CÓ RĂNG ✅

**Landing:** `session-end.md:145-205` — **§L.c MỚI** (sau §L.b(k), trước Phase 2). Trước đó **repo KHÔNG có** completeness-gate trong `session-end.md` (grep `completeness-gate|phép sàn` trên 2 command = 0 hit — nó chỉ sống trong checklist hub `f71c5b65` + run-folder S135). ⇒ đây là **build mới**, không phải sửa chữ.

**RĂNG = luật đọc kết-quả (dòng :150-153):** mỗi phép chỉ mang 1 trong 3 nhãn —
`ĐẠT` (**bắt buộc dán bằng-chứng đĩa**) · `TRƯỢT` (kèm số/path lệch) · `vacuous` (kèm folder-state).
🔴 **"Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT"** + **"đã verify"/"khớp rồi"/trí-nhớ KHÔNG tính**.
🔴 **Chống meta-count (S119):** báo `phép: ĐẠT a / TRƯỢT b / vacuous c` (a+b+c=4); **CẤM** gộp "4/4 PASS" khi còn vacuous; vacuous **không** cộng tử-số.
🔸 Nấc khai thẳng: gate = **evidence-mandate, KHÔNG chặn** đóng phiên (cùng triết-lý Sàn-5 trong chính file: cổng báo-động-giả ⇒ bị bypass ⇒ tự xoá chính nó).

**Bảng 5 vòng chức-năng** (V1..V5, mỗi vòng con-ĐO + con-KIỂM + bằng-chứng tối-thiểu; ô = con-trỏ, KHÔNG chép logic — B1) + luật `không-nhịp` (không ✓, không TRƯỢT, **không được im-lặng bỏ khỏi bảng**).

**4 phép sàn — mỗi phép có disk-evidence requirement + lệnh chạy được:**
| phép | bằng-chứng BẮT BUỘC | chống-bare-PASS |
|---|---|---|
| **1 — tick vs cửa** | **3 SỐ thật**: `cửa = L nhãn + P dừng` + `counter-delta trước→sau` (snippet `git log … \|\| true` + grep `.session-counter.json`) | lệch ⇒ TRƯỢT + **in danh-sách cửa CÂM**; thiếu 3 số ⇒ TRƯỢT |
| **2 — dòng-nợ tại cửa** | **DÁN NGUYÊN VĂN** dòng `NHIP-NO: …` máy in (kể cả `probe-loi (khong chan)`) | tóm-tắt/diễn-giải/"đã in rồi" ⇒ TRƯỢT |
| **3 — closeout đủ nghi-thức** | **PATH THẬT** — bảng 3 closeout × 4 sổ, UNION-per-label (snippet `git log --name-only \| grep -E`) | ô rỗng ⇒ TRƯỢT + tên sổ thiếu + kỳ nào |
| **4 — vai đã-chạy có sổ** | **roles-ran list** + path `.claude/agent-memory/<role>/MEMORY.md` + **byte>0** + mtime | thiếu sổ/0-byte ⇒ TRƯỢT (AS-8) |

Chi-tiết đáng nêu (đều là bẫy đã trả giá thật, ghi vào gate để khỏi tái):
- phép-1 + phép-3 **DÙNG CHUNG regex closeout §L.b(j)(vi)** — placeholder `<regex closeout — lấy ở (j)(vi)>`, **KHÔNG chép bản thứ 2** (B1).
- phép-1 dùng `|| true` (KHÔNG `|| echo 0`) — đúng bẫy `grep -c` mà chính file đã ghi 3 lần.
- phép-2 **trỏ script làm canonical vế-set**, khai luôn lệch tên gọi hub "3-vế" vs script in 4 đoạn.
- phép-3 **CẤM per-commit-naive** (agent-memory vào qua `wal:` cùng kỳ ⇒ FAIL oan; dẫn ca thật S133 `e53a693` + `9f404d3`) + khai proxy không phân-biệt "không chạy" vs "chạy không ghi sổ" (**cả hai đều lỗi** ⇒ vẫn bắt đúng).

**Dòng báo gate** (ASCII, ghi cạnh khối `memory-triple` trong session-log):
`completeness-gate S<nn>: vong <x>/5 chuc-nang (khong-nhip: <ds>) | phep DAT a / TRUOT b / vacuous c`
+ luật: có TRƯỢT ⇒ NÊU ở Phase 4 **+ đổ vào sổ đích** (carry-slug HANDOFF / WAL-line / STATUS-row).

---

## 4 — VIỆC 4: phép-4 landmine "not-yet-run (vacuous)" ✅

`session-end.md:197-200` — mục 3 của phép-4:
- 🔴 Vai **WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state**, **KHÔNG TRƯỢT** và **KHÔNG ĐẠT** — kèm lệnh `ls -la` 3 folder chạy được.
- 📌 **Baseline @S146 dán vào doc** (mốc 1 lần, KHÔNG lặp mỗi phiên): `tooling-harvest-audit/` tồn-tại **RỖNG** · `h24-audit/`+`sleep-audit/` **MISSING** ⇒ cả 3 = WIRED nhưng CHƯA chạy audit-round THẬT (vai #1 @S145 chỉ spawn-PROBE, cố-ý 0-ghi).
- 🔴 **Chặn ĐẠT-ảo tương-lai (vacuous không phải giấy phép vĩnh-viễn):** khi vòng tương-ứng CHẠY (H1/H2 chốt · cặp H24 chạy · lượt nén chạy) mà vai-KIỂM vẫn không có sổ ⇒ **TRƯỢT thật**, hết cửa vacuous.
- 🔴 Nêu thẳng đây là chỗ dễ ĐẠT-ảo nhất: *"folder trống"* đọc **giống hệt** giữa "chưa tới lượt" và "chạy rồi mà nuốt sổ" ⇒ **phải kèm bằng-chứng vòng đó có/không chạy**, không chỉ kèm `ls`.

---

## 5 — ACCEPTANCE (tự chạy, output THẬT)

```
$ grep -nE 'land d(ầ|a)n sau' .claude/commands/session-end.md ; count=…
count=0                      ← bản CÓ DẤU + không dấu (regex phủ cả 2)
$ grep -c 'land dan sau' .claude/commands/session-end.md
count_ascii=0                ← bản ASCII thuần

$ grep -rnE 'KI(Ể|E)M end-only' .claude/agents/
.claude/agents/h24-audit.md:26: …
.claude/agents/sleep-audit.md:25: …
.claude/agents/tooling-harvest-audit.md:25: …
files=3                      ← ĐÚNG 3 file

$ grep -n 'phép-1 —|phép-2 —|phép-3 —|phép-4 —|CẤM bare-PASS|TỰ ĐỘNG TRƯỢT' .claude/commands/session-end.md
145: ### §L.c — completeness-gate 5-vòng (D1, land S146 — 🔴 CÓ RĂNG: CẤM bare-PASS)
152: > Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT …
170: 🔎 phép-1 — tick vs cửa · bằng-chứng = 3 SỐ thật
180: 🔎 phép-2 — dòng-nợ tại cửa · bằng-chứng = DÁN NGUYÊN VĂN dòng máy in
184: 🔎 phép-3 — closeout đủ nghi-thức · bằng-chứng = PATH THẬT
194: 🔎 phép-4 — vai ĐÃ-CHẠY phải có sổ · bằng-chứng = roles-ran list + path sổ

$ grep -n 'not-yet-run (vacuous)' .claude/commands/session-end.md
197: 🔴 Vai WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state …
```

**Z — governance-only (git status):** 0 file `src/` · `fe-admin/` · `fe-user/` · `tests/` (`prod_files=0`), 0 migration.
File mình chạm ĐÚNG 4 + sub-file này. (`tiep.md` · `wal-flush.ps1` · `harness-11-engine.md` · `.session-counter.json` modified = **worker-1/worker-2**, KHÔNG phải mình.)

---

## 6 — NGOÀI PHẠM-VI (báo lead, KHÔNG tự sửa)

1. 🔸 **`scripts/nhip-no-probe.ps1:3` header STALE** — ghi *"3-part debt line"* trong khi `:22` + `:201` in **4 đoạn**. File ngoài quyền worker-3. Gate §L.c đã **miễn-nhiễm** (đo nguyên-văn, trỏ script), nhưng header nên vá cho khỏi dạy sai.
2. 🔸 Spec-v2:41 ghi *"phép-2 literal dòng-nợ **3-vế**"* — số này **stale so đĩa** (script in 4). Gate cố-ý KHÔNG chép số vế ⇒ không kế-thừa drift.
