# SPEC v2 — Áp hub-answer + 5-vòng closure + tiep/pause/snapshot (synthesize từ /fable-clone ensemble)

> S145 · governance/config-only. v1 verdict ensemble = **FAIL 2C + nhiều MAJOR** (đã verify TỪNG cái trên đĩa). v2 vá hết. Đây là bản **hmw 4.8 MAX** implement. 🔴 3 thay-đổi lớn nhất so v1: **(A) GỠ "4 surface→2" — nó SAI · (C) session_ctx_kb ĐỂ TRỐNG — KHÔNG hardcode 64 · (C↔E) hook 4-path PHẢI cập-nhật Sàn-3 tiep §0 atomic.**

## [1] ĐỀ-BÀI
Áp 3 câu hub (C7 predicate 4-vế · bulk=30 · session-model 101e69d6) + đóng đủ 5 vòng + re-check tiep/pause/snapshot. Governance-only (0 src/·fe-*·tests/, 0 mig).

## [2] CÁCH IMPLEMENT (v2 — per axis)

### Axis A — C7 predicate 4-vế
1. **Viết luật §N** `harness-11-engine.md` (mục mới cạnh WAL H22, implementer chốt số N.x): predicate (i) read-only · (ii) KHÔNG spawn con · (iii) KHÔNG write · (iv) lỗi→`probe-lỗi (không chặn)`→đi-tiếp **[LOAD-BEARING]**. FLOOR = read-only + non-blocking + **gỡ-được-không-hậu-quả**. FORM = wording + interpreter.
2. Reword tập-cấm (KHÔNG cấm-tất): "cấm ĐẮT/side-effect; CHO PHÉP probe read-only non-blocking theo §N". pause.md:44 + tiep.md:112 **TRỎ** §N (B1, không chép predicate).
3. 🔴🔴 **GỠ HẲN v1-A.4 + v1-A2 "4 surface→2" — LÀ TIỀN-ĐỀ SAI.** Verify đĩa: `nhip-no-probe.ps1` có **4 caller THẬT** (pause:44 · tiep:112 · session-start:216 · session-end:104). Header "4 surface" + `session-model-se-draft.md:34` "4 điểm lệnh" = **ĐÚNG**. Spec-author v1 nhầm (session-start/end gọi CẢ nhip-no-probe @216/104 LẪN distill-shard-probe @135). **KHÔNG đụng header/draft.** (run.md:9 mang cùng lỗi → bỏ.)
4. **Fault-inject 2-chiều** (chứng vế-iv, script KHÔNG đổi code — `nhip-no-probe.ps1:203-208` catch→exit 0 đã thỏa): inject-vector = ép `-RepoRoot` bậy HOẶC kill mid-run (S135 precedent `-RepoRoot`); observe **no-hang** (timeout wrapper). (lành) probe OK → dòng-nợ in xong · (lỗi) → `probe-lỗi (không chặn)` + hoàn-tất KHÔNG hang.
5. 🔸 verify `distill-shard-probe.ps1` (probe THỨ-2 @session-start:135) cũng read-only/non-blocking (thỏa §N general) — nếu chưa, thêm.
- **Đường-chết:** đừng đổi python; đừng cấm-tất; đừng chép predicate 2 nơi; **đừng "sửa" header 4→2 (nó ĐÚNG — nhầm distill-shard-probe).**

### Axis B — bulk_note_shards = 30
1. `memory-budget.json:11` null→**30** + `_bulk_note` note (owner-set initial-anchor 2×min-SE, reference-not-copy, cờ LOUD không-đổi-hành-vi). 🔴 BÃO-TO target = **`distill-shard-probe.ps1:63`** (KHÔNG phải memory-budget.json:63 — v1 line-ref mờ).
2. **B-fault-inject boundary CÓ RĂNG** (cây-tạm `-RepoRoot`, bulk=30): **n=30 → tầng-2 IM** (tầng-1 KÊU, chứng "chỉ tầng-1 xử") · **n=31 → `BÃO-TO: backlog 31 > 30`**. Cặp 30/31 chứng ĐỒNG-THỜI `-gt` không off-by-one + tầng-2 độc-lập TRÊN tầng-1. (n≤15 = vô-giá-trị.)
- **Đường-chết:** số ≤15 vô-nghĩa; đừng copy 10 hub.

### Axis C — session-model (BÁM WAL S144)
1. 🔴🔴 **session_ctx_kb = ĐỂ TRỐNG (KHÔNG hardcode 64).** Verify đĩa: **0 script đọc `session_ctx_kb`** (ghost-wire, khác `pull_warn_days` có reader `nhip-no-probe.ps1:190`); K6.2 cấm mượn số chưa-đo; SE artifact (`draft:55`·`spec-adap-dot-11:31`) khai để-trống = TUÂN-THỦ. "vắng→64KB" = default-AT-READ ⇒ để-trống ĐÚNG biểu-diễn "owner chưa chọn". **Chỉ set khi owner directive tường-minh** (kèm `_owner_set`); mặc-định = **KHÔNG đụng key** (hoặc mark `owner-gated-inert-pending-wire`).
2. **hook 4-path** `wal-flush.ps1:13`: 3-path → +**`.claude/sessions/`** (full path). 🔴 KHÔNG "pending-restart" — `settings.json:9` `-File` re-đọc body MỖI Stop ⇒ ăn NGAY. **Live-verify**: stage 1 file `sessions/session-<N>/x` → trigger hook → confirm commit `wal: flush` nuốt nó. + fault-inject.
3. 🔴🔴 **CRITICAL-2 ATOMIC (seam C↔E) — hook 4-path BẮT BUỘC đi kèm cập-nhật Sàn-3 tiep.md §0:**
   - (a) 4 site "3 path"/"3 điểm mù" → **"4 path"/"4 điểm mù"**: `tiep.md:21` · `:23` · `:75` · `:78`.
   - (b) **THÊM strong-signal ⑤** cho `sessions/`: `wal:`-commit chưa-đẩy đụng `.claude/sessions/` (mirror signal ④ cho runs/) — vì per-pause context-map (C.5) hook auto-commit thành `wal:`, phiên chết còn context-map mà signal cũ MÙ = tái mở đúng bug "sổ trống≠sạch".
   - (c) BẬC-TRUNG (:75/:78) "ngoài 3 path"→"ngoài 4 path".
   - Acceptance: `grep "3 path\|3 điểm mù" tiep.md = 0` sau vá.
4. **VC-1 nhãn 2-tầng** `S<nn>` + `logic:L<mm>`. Align `session-model-se-draft.md` (gỡ VC-3 stale `logic-sessions/L<mm>` → hub-form `sessions/session-<N>/`).
5. **Folder scaffold** `session-start.md`: `.claude/sessions/session-<N>/` (N=phiên-LOGIC ID nguyên tăng, regex `^session-\d+$`); .gitignore verify `check-ignore -q` exit=1.
6. **per-pause context-map** `pause.md` append context-block vào `sessions/session-<N>/` (accumulate); `tiep.md` đọc.
7. **orphan-L rule**: phiên chết giữa phiên-logic → `L<mm>`/`session-<N>/` mồ-côi. Thêm rule `tiep` phát-hiện (gộp signal ⑤). KHÔNG để drift-vector hở.
8. **Q4-audit = DEFER** (chỉ display dòng-nợ; KHÔNG audit-rerun giữa phiên = phá C7). Optional: đo khoảng-giãn gửi hub.
- **Đường-chết:** VC-1 1-tầng giết tick; đừng bám VC-3 stale; đừng hardcode session_ctx_kb; hook-4-path mà quên Sàn-3 §0 = vỡ recovery-floor.

### Axis D — 5-vòng closure
1. **Map verified** (lane-4 đĩa): V1→tooling-harvest-audit · V2→h24-audit · V3→harness-audit(built-in, wired 2-đầu) · V4→sleep-audit · V5→measured-label-gate(floor). ✓ REAL.
2. 🔴 **D2 = COMMIT DEFER (option b)** — lane-4 phán DEFER là đọc canonical ĐÚNG: "hai đầu" nhịp buộc tầng **ĐO** (H1/H2 báo-diff @open, wired 2-đầu); cột self-verify V1/V2/V4 canonical = **CLOSE-time**; @open output là diff-report nhẹ (đã em-main-verify), artifact authoritative (chốt/harvest/distill) ở close ⇒ KHÔNG có gì authoritative để audit @open. **Landing site defer-rationale** = ghi vào `session-end.md` cạnh (g-bis) + contract 3 vai (1 dòng "KIỂM end-only: @open chỉ diff-report, authoritative-artifact ở close"). **+ H24-coupling**: khai rõ h24-audit theo cặp H24 **wherever it fires** (nếu H24 OVERDUE chạy @session-start §2.1.8 thì h24-audit theo — HOẶC khai end-only intentional + lý-do).
3. **D1 completeness-gate CÓ RĂNG**: mỗi phép sàn SHOW disk-evidence (KHÔNG bare-PASS): phép-1 cửa-count vs counter-delta (số) · phép-2 literal dòng-nợ 3-vế · phép-3 3 closeout ritual-sổ trace · phép-4 roles-ran list + sổ paths.
4. 🔴 **phép-4 landmine + incremental resolve**: đĩa NOW = `tooling-harvest-audit/` RỖNG (no MEMORY.md), `h24-audit/`+`sleep-audit/` MISSING. 3 KIỂM **WIRED AUTO** nhưng **CHƯA chạy audit THẬT** phiên này (không có measure H1/H2/H24/sleep để chấm; tooling-harvest-audit chỉ spawn-PROBE cố-ý-0-ghi). ⇒ completeness-gate ghi 3 vai = **"not-yet-run (vacuous)" + folder-state evidence**, KHÔNG phép-4 FAIL. Sửa session-end.md:123 "land dần sau" → "cả 3 BUILT+WIRED S145; chạy audit-round khi measure vòng tương-ứng chạy" (gỡ ambiguity với :40-42 AUTO).

### Axis E — tiep/pause/snapshot
1. **E1 concrete teeth** (thay "review PASS" vòng-tròn): `pause.md:17` wf: đủ 5-trường (grep run=/runId=/args=/done=/harvested=) · `tiep.md §0` đủ 4 (→ post-C.2 là 5) signal MẠNH · `tiep.md:127` rule "memory-pack DẪN-XUẤT-LẠI TƯƠI (CẤM reuse cũ)" present · run.md có `## taskList snapshot`.
2. **Fix line-ref** `tiep.md:23` `wal-flush.ps1:7`→`:13` (paths thật ở :13; :7=comment). Gộp khi vá §0 (C.3).
3. Seam C↔E = đã xử ở Axis C.3 (atomic).

## [3] CHECKLIST ACCEPTANCE v2 (đo được, siết teeth)
| # | Axis | Acceptance có-răng |
|---|---|---|
| A1 | C7 luật | §N có predicate 4-vế; **wording khớp FLOOR 3 tính-chất** (read-only·non-blocking·gỡ-được-không-hậu-quả) + tách FLOOR/FORM; pause/tiep TRỎ §N (grep chép-predicate-2-nơi=0) |
| A2 | C7 no-op | 🔴 **KHÔNG đụng "4 surface"/"4 điểm lệnh"** (chúng ĐÚNG); grep header vẫn "4 surface" = pass |
| A3 | C7 fault-inject | inject-vector (`-RepoRoot` bậy/kill) → `probe-lỗi (không chặn)` + no-hang (timeout-observed) |
| B1 | bulk số | `memory-budget.json:11`=30 (>15); grep `bulk_note_shards\|30` trong {commands·agents·engine}=0 (value duy-nhất memory-budget.json) |
| B2 | bulk boundary | n=30→IM · n=31→`BÃO-TO 31>30` trên cây-tạm (chứng -gt + tầng-2>tầng-1); target=`distill-shard-probe.ps1:63` |
| C1 | session_ctx_kb | 🔴 **key ĐỂ TRỐNG** (hoặc `owner-gated-inert-pending-wire`); grep consumer-script (nếu 0 → khai ghost-wire, KHÔNG set số) |
| C2 | hook 4-path | `wal-flush.ps1` = 4 path (+`.claude/sessions/`); **live-verify** (stage→hook→commit nuốt), KHÔNG "restart" |
| C2b | 🔴 Sàn-3 sync | `grep "3 path\|3 điểm mù" tiep.md = 0`; signal ⑤ cho sessions/ tồn-tại; BẬC-TRUNG "4 path" |
| C3 | VC-1 tick-behavior | grep counter/OR-guard/H24 đọc `S<nn>` KHÔNG `L<mm>`; fault-inject ép L<mm> → tick +0 (chứng guard, KHÔNG chỉ label-shape) |
| C4 | scaffold + orphan-L | sessions/session-`<N>` regex + gitignore-verify + per-pause context-map + orphan-L rule + Q4-defer documented |
| D1 | completeness-gate | 5 vòng chức-năng + 4 phép sàn, MỖI phép SHOW disk-evidence (không bare-PASS) |
| D2 | defer-landing | DEFER (b) ghi vào session-end.md/contract 3 vai + H24-coupling khai; phép-4 = 3 KIỂM "not-yet-run vacuous" + folder-state |
| E1 | tiep/pause/snapshot | 4 check cụ-thể (wf:5-trường · Sàn-3 5-signal · memory-pack-rule · taskList-snapshot); line-ref :23→:13 fixed |
| Z | governance-only | 0 file src/·fe-*·tests/ (git-diff); test count giữ; bundle FROZEN |

---

## [4] 🔴 ADDENDUM @S146 (em-main, lúc /tiep relaunch) — C2b THIẾU CONSUMER

> **Bối-cảnh:** v2 mục C.3 chỉ liệt `tiep.md` 4 site. Grep lại toàn-repo lúc relaunch ⇒ **claim "3 path" còn sống ở 3 nơi NỮA mà v2 KHÔNG nhắc**. Đây đúng class `cardinality-change → grep MỌI consumer` (S87/S88: *sửa write-site sót read-site → vỡ feature*). Nếu chỉ theo v2 thì hook thành 4-path còn 3 surface vẫn dạy "3" ⇒ tái-tạo đúng cái drift mà Sàn-3 sinh ra để chặn.

### C2b-EXT — bảng consumer ĐẦY-ĐỦ (phân LIVE ⟂ LỊCH-SỬ)

**🔴 LIVE PRESCRIPTIVE — BẮT BUỘC flip cùng commit với hook:**
| # | file | site | nội-dung phải đổi |
|---|---|---|---|
| 1 | `.claude/hooks/wal-flush.ps1` | `:13` | **SOURCE** — `$paths = @(…)` 3→4 (+`.claude/sessions/`) |
| 2 | `.claude/commands/tiep.md` | `:21` `:23` `:75` `:78` | "3 điểm mù"→4 · "3 path"→4 (v2 §C.3 đã liệt) |
| 3 | 🔴 `docs/governance/harness-11-engine.md` | **N.2** | **CANONICAL FLOOR** — *"`git add` per-path **3 path cố định** {WAL · agent-memory · workflows/runs}"*. **v2 SÓT.** Đây là **luật gốc** mà hook thi-hành ⇒ sót = hook vi-phạm chính floor của nó |
| 4 | 🔴 `.claude/governance/.session-counter.json` | `_why_this_path` | *"The hook covers **exactly 3 paths** … `.claude/governance/` is **OUTSIDE all three**"*. **v2 SÓT.** Ngoài đổi số, PHẢI **tái-verify** mệnh-đề: `.claude/governance/` có còn ngoài **cả 4**? (còn — `sessions/` ≠ `governance/`) ⇒ sửa thành "outside all four" + giữ nguyên lý-do |
| 5 | 🔴 `.claude/auto-memory/project_h22_wal_session_continuity.md` | `:10` | *"persist-only (per-path+CAND+exit-0; **3 path**: WAL/agent-memory/runs)"*. **v2 SÓT — NGUY NHẤT:** file này **auto-inject MỖI PHIÊN** ⇒ để stale = mọi phiên sau bị dạy sai ngay từ context đầu-vào |

**🧊 LỊCH-SỬ — KHÔNG rewrite (nguyên-tắc C8 "đừng rewrite history"):**
`docs/governance/adap-reports/2026-07-14-…:56` (báo-cáo có ngày) · `.claude/agent-memory/reviewer/{MEMORY.md,archive/2026-07.md}` (nhật-ký vai) · `.claude/WAL.md` (bị ghi-đè theo nhịp).
⇒ Chúng mô-tả *trạng-thái LÚC ĐÓ*, đúng tại thời-điểm viết. Đụng vào = phá vết.

### Acceptance C2b-EXT (thay acceptance C2b cũ — siết hơn)

> 🔴 **HIỆU-CHỈNH @S146 sau khi CHẠY THẬT — bản đầu của chính mục này SAI (quá rộng).** Mẫu trần `'3 path'` **khớp nhầm** `session-end.md:162` → *"3 path `runs/<id>/harness-*-return.md`"*, tức **3 đường-dẫn file return của bộ-ba memory** — KHÔNG dính gì tới danh-sách path của hook. Câu đó **ĐÚNG**, phải để yên.
> ⇒ Nếu giữ mẫu trần: acceptance **KÊU vĩnh-viễn** (nợ ảo), hoặc tệ hơn — ai đó "vá" cho hết kêu bằng cách **sửa một câu đang đúng**. Đây đúng class `matcher quá rộng` (họ hàng citation-trap): **discriminator phải là NGỮ-NGHĨA** (*"3 path" nói về HOOK*) chứ không phải literal.
> 🔸 Neo vào **TÍNH-CHẤT**, đừng neo vào literal: cụm chỉ sai khi nó **liệt-kê danh-sách path của `wal-flush.ps1`**.

> 🔴🔴 **HIỆU-CHỈNH LẦN 2 @S146 — reviewer bác bản siết ở trên (F2). Bản siết SAI TRỤC, và nó đã để lọt lỗi thật.**
> Bản siết lọc bằng **co-occurrence CÙNG DÒNG** (`3 path` phải đứng cạnh chữ `hook`/`WAL.md`/…) + **tập-file hẹp**. Đo lại trên `HEAD` tiền-vá: bắt **7/11** site — **trượt 4 ca THẬT**:
> | ca trượt | vì sao |
> |---|---|
> | `session-end.md` ×2 `hook-3-path` | regex chỉ có `3 path` **dấu cách**; đây là **gạch nối** ⇒ 0 match. **Chính ca này sống sót tới lúc reviewer bắt.** |
> | `tiep.md:78` *"Bẩn ngoài 3 path…"* | dòng không chứa từ-khoá hook ⇒ bị vế-2 vứt |
> | `session-model-se-draft.md` ×2 | file **ngoài tập quét** |
> 🔴 **Bài học (lần 2 trong CÙNG một phiên, ngược chiều nhau):** lần 1 bộ lọc **quá rộng** (nuốt câu đúng), lần 2 **quá hẹp** (lọt lỗi thật). Cả hai đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Cách đúng: **loại theo ĐƯỜNG-DẪN** (lịch-sử ⟂ live — thuộc-tính có thật của file), **khớp RỘNG** (mọi biến thể chữ), và miễn-trừ dương-giả bằng **allowlist CÓ TÊN + lý-do**, không bằng mẹo regex.

```bash
# 1) 0 surface LIVE nào còn dạy cardinality CŨ của hook
#    Trục lọc = ĐƯỜNG-DẪN (không phải từ-khoá cùng dòng). Khớp RỘNG mọi biến thể chữ.
grep -rnE '3[ -]path|3 điểm mù|exactly 3 paths|three paths|ba path' \
    --include='*.md' --include='*.json' --include='*.ps1' . 2>/dev/null \
| grep -v '/node_modules/' \
| grep -vE '^\./(broadcasts|docs/governance/adap-reports|docs/changelog|docs/_archive)/' \
| grep -vE '^\./\.claude/(agent-memory|workflows/runs)/' \
| grep -vE '^\./\.claude/WAL\.md:' \
| grep -vE 'harness-\*-return\.md'      # ← ALLOWLIST CÓ TÊN (xem dưới)
| grep -v '🧊'                          # ← USE ⟂ MENTION (xem "citation-trap" dưới)
# 🔴 KỲ-VỌNG **KHÔNG PHẢI 0** — xem ALLOWLIST dưới. Đây là **LƯỚI SOÁT cho người**, KHÔNG phải cổng-chặn.
#
# 🔸 ALLOWLIST — 4 mục, mỗi mục khai lý-do (KHÔNG dùng mẹo regex để giấu chúng):
#   (1) session-end.md  ô V3 bảng 5-vòng: "3 path `runs/<id>/harness-*-return.md`"
#       = 3 ĐƯỜNG-DẪN FILE return của bộ-ba memory. Không dính hook. CÂU ĐÚNG.
#   (2) docs/guides/deployment-iis.md:45  "3 site hoặc 1 site với 3 path"  = path của IIS. Khác miền.
#   (3) docs/guides/rag-onboarding-guide.md:128 "Default 3 path cover docs…" = corpus_paths của RAG. Khác miền.
#   (4) docs/governance/README.md:93  "rag-v1.3 path-b"  = trúng vì SỐ PHIÊN-BẢN `v1.3` + chữ `path`. Rác thuần.
#   + session-model-se-draft.md: "hook 3→4 path" / "body-3-path (control)" = đang KỂ chuyện nới path. ĐÚNG.
#
# 🔸 Vì sao loại 4 nhóm đường-dẫn trên: chúng là LỊCH-SỬ (broadcast hub · adap-report có ngày ·
#   session-log · archive · nhật-ký vai · run-folder · WAL ghi-đè) — đúng tại thời-điểm viết.
#   Sửa = rewrite history, đúng cái C8 cấm. Đây là thuộc-tính CỦA ĐƯỜNG-DẪN, ổn-định hơn từ-khoá.
#
# 🔸 Đối-chứng ANTI-GOODHART (chạy kèm, BẮT BUỘC): bỏ 4 vế `grep -v` đường-dẫn phải ra >0 dòng
#   (đo @S146: **119**). Ra 0 => phép quét đã chết (vacuous), KHÔNG phải repo sạch.
```

### 🔴 KẾT-LUẬN THẲNG về phép này (đừng nâng cấp nó thành cổng)

**Không cơ-khí-hoá được thành zero-gate.** Cụm "3 path" sống hợp-lệ ở **≥3 miền khác** trong repo (IIS site-path · RAG `corpus_paths` · chuỗi phiên-bản `v1.3 path-b`). Mọi regex đủ hẹp để loại chúng đều đủ hẹp để **lọt biến-thể chữ của ca thật** — đã chứng: `hook-3-path` (gạch nối) sống sót qua bản siết và **chỉ reviewer bắt được**.

⇒ Nấc đúng = **lưới soát cho người** + **allowlist có tên**. Cùng khuôn `/tiep §0` đã dùng cho **dạng-4** (*"để nguyên cho người phán, KHÔNG cơ-khí-hoá"*). Ai thêm hit mới thì **phân-loại tay** rồi hoặc vá, hoặc thêm vào allowlist **kèm lý-do**.

### 🪤 CITATION-TRAP — bộ dò bắt chính nốt-vá của mình (xảy ra THẬT @S146, lần thứ 4)

Vá xong `ACTIVE-MARKS.md:20` + `STATUS.md:450`, chạy lại ⇒ **cả hai VẪN kêu**. Lý do: ghi-chú lineage em viết để **giữ vết** có dạng *"🧊 stamp S111 ghi **3-path**; nới +`.claude/sessions/` @S146"* — tức **nốt vá trích-dẫn đúng giá-trị cũ**, và bộ dò khớp-mẫu **không phân-biệt được**:

| | dạng | ví-dụ |
|---|---|---|
| **USE** — phải vá | doc đang **KHẲNG-ĐỊNH** hook có 3 path | *"file ngoài `hook-3-path`"* |
| **MENTION** — phải tha | doc đang **KỂ LẠI** rằng xưa là 3, nay là 4 | *"🧊 stamp S111 ghi 3-path; nới @S146"* |

**Discriminator = `🧊`** — quy-ước SẴN CÓ của repo cho *"phát-biểu đã nghỉ hưu, giữ làm vết"*. Không đẻ ký-hiệu mới; chỉ **dùng đúng cái đã có**.
⚠️ **Giới-hạn thứ-2 (đo được, đừng quên):** `🧊` lọc theo **DÒNG**. `docs/STATUS.md` có **mega-line** dài hàng nghìn ký-tự ⇒ đặt 1 chữ 🧊 ở đó là **miễn-trừ nguyên cả row** khỏi lưới. ⇒ Với mega-line, **đừng dùng 🧊** — hãy **diễn-đạt lineage KHÔNG lặp lại cụm bị dò** (vd *"hook nới từ 3 lên 4 @S146"* thay vì *"3-path tới S145"*). Ca thật @S146: STATUS.md:450 xử đúng theo cách này.
🔴 **Rủi-ro khai thẳng:** ai đó có thể **núp sau 🧊** để giữ một khẳng-định stale thật. Chấp-nhận, vì (a) 🧊 là dấu **người viết cố-ý đặt**, không tự mọc; (b) lưới này vốn **cho người soát**, không phải cổng — người đọc thấy 🧊 vẫn liếc được. Đổi lại: **không có 🧊 thì mọi nốt-vá-có-lineage đều thành dương-giả vĩnh-viễn**, và hậu-quả thực-tế là **người ta sẽ xoá lineage cho hết kêu** — mất đúng thứ quý nhất.

📌 **Lịch-sử 4 lần sửa phép này TRONG CÙNG MỘT PHIÊN — giữ làm vết, đừng xoá:**
| lần | lỗi | ai bắt |
|---|---|---|
| v1 | **quá rộng** — nuốt `session-end.md:162` (câu ĐÚNG về 3 file return) | lead tự bắt lúc chạy |
| v2 | **quá hẹp** — lọc co-occurrence cùng dòng + tập-file hẹp ⇒ **lọt 4 ca thật**, gồm `hook-3-path` | **reviewer** (F2) |
| v3 | **rộng lại** — kéo về 3 miền không liên-quan | lead, khi chạy thật |
🔴 **Bài học nén 1 câu:** ba lần đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Ý-định ở đây là **ngữ-nghĩa** (*"đang nói về danh-sách path của hook"*) — thứ mà **khớp-mẫu không biểu-diễn được**. Chỗ nào ngữ-nghĩa là tiêu-chí thì **để người phán + allowlist có tên**, đừng đẻ thêm regex.

# 2) hook thật = 4 path
grep -n '$paths = @' .claude/hooks/wal-flush.ps1     # phải thấy .claude/sessions/

# 3) mệnh-đề counter còn ĐÚNG sau khi +1 path
grep -o 'OUTSIDE all four' .claude/governance/.session-counter.json   # phải có
```
🔴 **Ranh:** phép (1) **CỐ Ý** loại `adap-reports/` + `agent-memory/` + `WAL.md` khỏi tập quét — chúng là lịch-sử. Quét cả vào sẽ ép rewrite-history, đúng cái sai mà `/tiep §0` dạng-2 C8 đã cảnh-báo.

### §N pin số (seam A↔CE — em-main chốt, KHÔNG để worker tự chọn)
`harness-11-engine.md` PHẦN N hiện có **N.1…N.7** ⇒ luật C7 predicate = **§N.8**. Worker-1 viết §N.8; worker-2 chèn dòng TRỎ `§N.8` ở `pause.md`/`tiep.md`. **Cả hai dùng đúng số này** (chạy song song, không hỏi nhau được).
🔸 Worker-1 **kiêm luôn N.2** (cùng file `harness-11-engine.md` — tránh 2 tay 1 file): sửa "3 path cố định"→"4 path cố định" +`.claude/sessions/`.

## Ghi-chú synthesis (em-main, cho hmw)
- **v1→v2 GỠ:** "4 surface→2" (SAI) · session_ctx_kb=64 (K6.2 vi-phạm + ghost-wire).
- **v1→v2 THÊM:** Sàn-3 §0 atomic (C2b) · phép-4 vacuous-resolve (D2) · B2 boundary 30/31 · C3 tick-behavior · orphan-L rule · fault-inject vectors.
- **Owner-question NỔI:** session_ctx_kb — SE giữ kỷ-luật ĐỂ-TRỐNG (K6.2); owner muốn set 64 tường-minh thì báo, em thêm `_owner_set`.
