# SPEC v1 — Áp hub-answer (C7 + bulk + session-model) + 5-vòng closure + tiep/pause/snapshot re-check

> S145 · governance/config-only (0 prod-code · 0 mig · test giữ · bundle FROZEN). Pipeline: spec → `/fable-clone reviewer` ensemble → em-main synthesize → `hmw` 4.8 MAX. **Số/luật cuối = SE tự đặt SAU verify 2-tuyến (đã) + fault-inject 2-chiều (G-015, hub dặn).**

## [1] ĐỀ-BÀI (3 câu)
Áp 3 câu trả lời canonical của hub (đã verify 2-tuyến `01f567`/`8378a6`): **C7** predicate 4-vế · **bulk_note_shards=30** · **session-model** trên manifest 101e69d6. ĐỒNG THỜI (owner S145): (D) verify + đóng đủ **5 vòng** tự-bảo-trì trong session-start/end · (E) re-check kỹ **tiep/pause/snapshot**. Neo tất cả về canonical (B1 con-trỏ, KHÔNG chép số/luật rải rác).

## [2] CÁCH IMPLEMENT (per axis + đường-chết)

### Axis A — C7 "điểm-dừng-rẻ" (predicate 4-vế)
Hiện: `nhip-no-probe.ps1:65-206` try/catch → `:203-206` catch in `probe-loi (khong chan)` → `:208` `exit 0`; read-only. ✅ Script THỎA 4-vế rồi. CHƯA có luật thành-văn (engine §N = 0 hit).
1. **Viết luật C7 thành-văn** — NHÀ = `harness-11-engine.md §N` (thêm mục N.x "C7 điểm-dừng-rẻ", cạnh WAL H22). Predicate: (i) read-only · (ii) KHÔNG spawn process con · (iii) KHÔNG write file · (iv) lỗi → in `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 (powershell OK, KHÔNG đổi python).
2. **Reword tập-cấm** (KHÔNG "liệt-kê", KHÔNG "cấm-tất"): *"cấm tiến-trình ĐẮT/side-effect (write·network·spawn-con·blocking); CHO PHÉP probe read-only non-blocking theo predicate §N"*.
3. **pause.md:44 + tiep.md:112**: inline-guard TRỎ về §N C7 (B1 — KHÔNG chép predicate 2 nơi).
4. 🔴 **Đính-chính stale-claim:** `nhip-no-probe.ps1:6-7` header "gọi bởi 4 surface (/pause /tiep session-start session-end)" → **SAI**, thực chỉ **2** (pause:44 + tiep:112; session-start/end gọi `distill-shard-probe` script KHÁC). Sửa header → 2. + `session-model-se-draft.md:34` "4 điểm lệnh" → 2.
5. **Fault-inject 2-chiều** (chứng vế-iv, script KHÔNG đổi code): (lành) probe OK → pause in dòng-nợ xong · (lỗi) ép `nhip-no-probe.ps1` lỗi/kill giữa chừng → pause in `probe-lỗi (không chặn)` **VẪN xong, KHÔNG hang**.
- **Đường-chết:** đừng đổi interpreter sang python (FORM, hub KHÔNG đòi); đừng cấm-tất (cấm nhầm probe lành); đừng chép predicate vào pause/tiep (drift 2-nơi).

### Axis B — bulk_note_shards = 30
Hiện: `memory-budget.json:11` = null; BÃO-TO `:63` `if bulkShards!=null AND n -gt bulkShards`. Single-source clean.
1. Set `:11` `null → 30` (2×min-SE=15, **reference-not-copy** — KHÔNG copy 10 của hub; **>tầng-1 15** ✓). +`_bulk_note` semantics (owner-set, cờ LOUD observability, KHÔNG đổi hành-vi nén).
2. **Fault-inject 2-chiều:** (im) pending ≤30 → tầng-2 IM (chỉ tầng-1 xử) · (bão) pending >30 → `BÃO-TO: backlog N > 30`.
- **Đường-chết:** số ≤15 = tầng-2 dưới tầng-1 = vô-nghĩa; đừng copy 10 (min hub=1 khác scale).

### Axis C — session-model (build trên manifest 101e69d6 · BÁM WAL S144 KHÔNG draft VC-3)
Hiện: manifest 4 khoản (①.gitignore PASS ②pause/tiep+WAL CÓ ③session_ctx_kb THIẾU ④folder chưa tạo). 🔴 Draft VC-3 (`logic-sessions/L<mm>`) **STALE** — owner S144 override → hub-form `sessions/session-<N>/`.
1. **session_ctx_kb**: set `memory-budget.json` = **64** (canonical default "vắng→64KB"; owner override được — note owner-gated như `pull_warn_days`).
2. **hook 4-path**: `wal-flush.ps1:13` 3-path → **+`sessions/`** (path-4). 🔴 CHẠM CƠ-CHẾ (owner S144 chốt "hook nối 4-path") — ENV-dep, **restart để ăn**; verify hook fire sau.
3. **Folder scaffold**: `session-start.md` scaffold `.claude/sessions/session-<N>/` (N = phiên-LOGIC ID **nguyên tăng**, regex `^session-\d+$`); `.gitignore` verify không nuốt (`check-ignore -q` exit=1).
4. **VC-1 nhãn 2-tầng**: `S<nn>` (vật-lý) + `logic:L<mm>` (phiên-logic). 🔴 **BẮT BUỘC 2-tầng** — `S<nn>`=phiên-logic thì OR-guard tick **chết** (phép-7 +0, bẫy label-convention S135). Align `session-model-se-draft.md` VC-3 → WAL-S144 hub-form + bump nấc.
5. **per-pause context-map**: `pause.md` append context-block vào `sessions/session-<N>/` (accumulate, KHÁC WAL overwrite ≤40); `tiep.md` đọc context.
6. **Q4 van-audit-giữa-phiên = DEFER** (hub chốt): chỉ build DISPLAY (dòng-nợ đã có); **KHÔNG build audit-rerun giữa phiên** (phá C7 non-blocking). Optional: đo khoảng-giãn 2-đầu gửi hub (§5 mời).
- **Đường-chết:** VC-1 1-tầng = giết tick; đừng theo draft VC-3 stale; hook-change chưa restart = chưa ăn (khai pending-restart); L mồ-côi khi phiên chết = drift-vector (cần rule).

### Axis D — 5-vòng closure (verify + đóng)
Canonical: V1 tooling/harvest→`tooling-harvest-audit` · V2 soi-lead→`h24-audit` · V3 trio→`harness-audit` · V4 nén-ngủ→`sleep-audit` · V5 truth-floor→measured-label-gate(floor). Checklist f71c5b65: completeness-gate = **5 vòng chức-năng + 4 phép sàn** (1 tick-vs-cửa · 2 dòng-nợ-3-vế · 3 closeout-đủ-nghi-thức · 4 vai-đã-chạy-có-sổ).
1. **Verify từng vòng** ĐO+KIỂM đúng nhịp trong session-start/end (bảng 5 hàng × {vòng·ĐO-ở-đâu·KIỂM-ở-đâu·đủ/thiếu}).
2. 🔴 **Đóng GAP session-START KIỂM**: checklist V1 nhịp="HAI ĐẦU". 3 KIỂM mới wire session-END only. Quyết: (a) mở-rộng KIỂM phủ session-start HOẶC (b) **defer có-lý-do** (session-start measure = "báo diff" nhẹ, KIỂM đợi session-end authoritative — document defer + acceptance). /fable-clone lane-4 phán.
3. **Chạy completeness-gate** → PASS (5 vòng + 4 phép sàn).
- **Đường-chết:** "5 vai = 5 vòng đóng" SAI — phải đúng nhịp + qua 4 phép sàn; đừng nhét audit nặng vào điểm-dừng (phá C7).

### Axis E — tiep/pause/snapshot re-check
1. **pause.md**: WAL-write ≤40 · `wf:` snapshot 5-trường · C7 stop-path (nhip-no-probe non-blocking) · commit đích-danh `wal: pause`. Verify đúng + C7-compliant.
2. **tiep.md**: Sàn-3 "sổ trống≠sạch" (4 tín-hiệu MẠNH + DUAL-ACCEPT orphan dạng-3-retired) · ground-truth-thắng-WAL · §4 wf-relaunch cắt-gọt (taskList snapshot + memory-pack DẪN-XUẤT-LẠI TƯƠI). Verify đúng.
3. **snapshot**: `## taskList snapshot` run.md đầy-đủ? `wf: args=<snapshot>`? memory-pack-tươi rule? Integrity.
4. Fix defect nếu tìm thấy.
- **Đường-chết:** đừng reuse memory-pack snapshot cũ (lỗi-thời sau harvest); Sàn-3 KHÔNG suy "chain rỗng ⇒ sạch".

## [3] CHECKLIST ACCEPTANCE (đo được — có răng)
| # | Axis | Acceptance |
|---|---|---|
| A1 | C7 luật | §N có mục C7 predicate 4-vế; pause/tiep TRỎ về §N (grep 0 chép-predicate-2-nơi) |
| A2 | C7 stale-fix | `nhip-no-probe.ps1:6-7` header = "2 surface"; `session-model-se-draft:34` = 2 (grep "4 surface\|4 điểm lệnh" = 0 hit stale) |
| A3 | C7 fault-inject | chiều-lỗi: ép probe lỗi → pause in `probe-lỗi (không chặn)` + hoàn-tất (KHÔNG hang) — chạy thật, KHÔNG happy-path |
| B1 | bulk số | `memory-budget.json:11` = 30 (số > 15); grep derived-copy = 0 |
| B2 | bulk fault-inject | im (≤30) / bão (>30 → `BÃO-TO`) 2-chiều PASS trên cây tạm |
| C1 | session_ctx_kb | key = 64 trong memory-budget.json |
| C2 | hook 4-path | `wal-flush.ps1` = 4 path (+sessions/); khai pending-restart để ăn |
| C3 | VC-1 2-tầng | nhãn = `S<nn>` + `logic:L<mm>` (KHÔNG 1-tầng); draft aligned S144 (VC-3 stale gỡ) |
| C4 | session-model scaffold | sessions/session-`<N>` regex + .gitignore-verify + per-pause context-map + Q4-defer documented |
| D1 | 5-vòng completeness-gate | ĐẠT: 5 vòng chức-năng + 4 phép sàn (bảng verify) |
| D2 | session-start KIỂM gap | đóng HOẶC defer-có-lý-do documented (không im-lặng bỏ) |
| E1 | tiep/pause/snapshot | review PASS; defect (nếu có) fixed; C7-compliant |
| Z | governance-only | 0 file src/·fe-*·tests/ đụng (verify git-diff); test count giữ; bundle FROZEN |
