# SPEC — Lệnh DẬY-NHẸ probe-first cho SOLUTION_ERP (adap `2026-07-28-Governance-day-wake-probe-first-resume`)

> Engine: `/fable-real investigator-codebase` (Fable, single deep-pass, propose-only) — anh GÁN vai @S158.
> Pipeline H21 ①: engine propose → **lead verify** → **lead ghi (file này)** → worker thực-thi theo spec.
> Propose đầy đủ: `sub-invest-day-1.md` (25.440 B, cùng run-folder). File này = bản lead ĐÃ VERIFY.
> 🔴 **CHƯA THI CÔNG.** 3 chỗ chạm canonical cần anh gật — xem §③ cuối.

---

## ① TÍNH-NĂNG / ĐỀ-BÀI

Thêm **một đường dậy RẺ** cho vòng đời tạm-dừng/nối-lại: khi máy **chứng minh được 0-delta** kể từ điểm dừng,
mở cửa sổ mới **không phải trả giá `/tiep` trọn** (nạp-nền + spawn vai kiểm-lúc-đọc). Mọi trường hợp khác **tự nâng**
về `/tiep` đầy đủ. Kèm **guard chống-trùng** ở bước-0 của `/pause` + `/tiep`, và **marker dậy đếm-được từ đĩa**.

**Vì sao SE cần:** SE fit hạng cao nhất của thư (có ĐỦ nền 17-07 kit phiên-logic + nền 25-07 vòng-canh 3-vai
+ `tiep_reload`) ⇒ khoản tiết-kiệm lớn nhất của F1 áp dụng trọn.

**Giá đo được ở SE (engine đo tươi, đơn-vị BYTE — 🔴 CẤM quy ra token, thư nói rõ token nằm trong dải mở):**

| Nguồn `tiep_reload` | Byte |
|---|---|
| `docs/STATUS.md` (2 đoạn khoanh) | 3.295 + 56.210 |
| `docs/HANDOFF.md` (segment mới nhất) | 4.352 |
| `.claude/WAL.md` | 5.369 |
| `_mind-s-7.md` | 30.305 |
| `_context-s-7.md` | 22.584 |
| **Tổng** | **122.115 B** |

Cửa CLEAN sẽ **SKIP 86.441 B (70,8%)** + **1 spawn `ctx-verifier`**.
🔸 So hub: hub 439.328 B / 8 file — **nền SE nhẹ hơn 3,6×**, nên lợi tuyệt-đối nhỏ hơn hub. Khai thẳng, đừng mượn số hub.

**🔴 Datum dogfood SE có mà hub KHÔNG có** (thư tự khai *"dogfood: 0 phiên"*) — đo TRƯỚC khi đọc thư:
chính cửa `/tiep` @S158 này probe ra **CLEAN** (anchor `6c263dd` = HEAD, cây sạch, 0 sentinel) ⇒ **lẽ ra đi đường dậy-nhẹ**,
mà lead đã trả giá full. **1 điểm dữ-liệu, KHÔNG phải bộ số.**

---

## ② CÁCH IMPLEMENT (per-khoản F1-F4, tailor FORM theo SE)

### 🔴 Câu khó nhất — đã có phán quyết CÓ BẰNG CHỨNG: **DỰNG PHÉP-2, KHÔNG tái dùng Sàn-3**

Lead vào cửa này **nghiêng về tái dùng Sàn-3** (sợ 2-nguồn-sự-thật, B1). **Engine bác, và bác đúng** — bằng chứng
lấy từ CHÍNH cửa S158 này, nơi hai phép cho **verdict NGƯỢC NHAU**:

- **Sàn-3 tín-hiệu ②: HIT** — `origin/main..HEAD` có 2 commit non-`wal:` (`d7eaece` spec · `3b6fabc` dọn nợ sổ). *(lead tự đo @§0, độc lập.)*
- **anchor-delta: 0 ⇒ CLEAN** — `_pause-4` head-sha `d7eaece` → carrier `6c263dd` = HEAD. *(lead tự đo, độc lập.)*

⇒ Hai phép trả lời **hai câu KHÁC NHAU**: Sàn-3 hỏi *"có tồn-tại việc dở không?"* (neo `origin/main`) ⟂ probe hỏi
*"có gì ĐỔI so với điểm dừng không?"* (neo marker pause). **Khác câu hỏi thì khác nguồn sự-thật là hợp lệ — B1 không cấm.**

**4 ràng hygiene BẮT BUỘC kèm theo** (thiếu là thủng):
1. Sentinel `closing:` **GỌI CHUNG** tín-hiệu ③ của Sàn-3 (con-trỏ, không chép logic).
2. Mọi verdict DELTA **đổ về `/tiep`** — `/tiep §0` giữ độc quyền là nhà DUY NHẤT phán chữ "sạch".
3. **CẤM dùng từ-vựng "sạch"** trong `/day` (dùng `CLEAN-delta`) — chống người đọc nhầm thành phán quyết Sàn-3.
4. `/tiep §0` ⑤(b) ORPHAN-L: **r-set phải cộng `_day-*`** — thiếu thì phiên có `/day` sẽ **kêu oan**; và **RE-RUN fault-inject** block đó.

### F1 — probe rẻ, chỉ-đọc

- **NEW** `.claude/commands/day.md` — 2 nhánh, bước probe đứng **TRƯỚC**.
- **EXTEND** `scripts/session_ctx.py` + sub-command `day-probe` (`--json`). Tái dùng `_TS_KEY_RE` sẵn có
  (`:48-55` đã đón trước reader loại này). 🔴 Glob **phải lọc theo TÊN FILE** kẻo ăn nhầm `_mind-s-<N>.md`.
- Chọn marker cuối bằng **dấu-thời-gian GHI TRONG file**, KHÔNG dùng mtime (Dropbox chạm lại mtime — SE chạy trong Dropbox).
- **Khoá `day_wake`** trong `memory-budget.json`, có **allowlist dirty**. 🔴 Bắt buộc gồm `.claude/governance/.session-counter.json`
  — nó dirty NGAY lúc probe chạy (tick fire ở cửa vào) ⇒ thiếu allowlist thì F1 **chết nửa số ca**.
- CLEAN → nạp lõi (WAL + `_mind` mới nhất), **SKIP** nạp-nền + **SKIP** spawn `ctx-verifier`.
- Nghiêng an-toàn: probe lỗi / nghi ngờ ⇒ coi là **DELTA**.

### F2 — guard chống-trùng ở HAI lệnh cũ

- `pause.md` **§0**: marker cuối đã là `_pause-*` + probe CLEAN ⇒ **no-op**, 0 marker/0 commit/0 spawn.
  🔴 **Răng thật, không phải lý thuyết:** double-pause hiện đốt **1 spawn `ctx-curator`** (~100K floor theo config).
- `tiep.md` **§-1**: probe CLEAN ⇒ route sang `/day`.
- Cửa thoát cưỡng chế `--full` ở cả hai để anh ép chạy trọn.

### F3 — anchor: **SE-form MẠNH HƠN hub**

- **Bẫy-một XÁC NHẬN 4/4 THẬT ở SE:** mỗi `_pause-i` head-sha → commit kế tiếp **chính là** `wal: pause` của nó
  (`8d4075a` · `976945c` · `73166c5` · `6c263dd`) ⇒ đếm thô từ head-sha ra **DELTA-giả 100%**.
- **SE-form:** anchor = **carrier-commit** `git log --diff-filter=A -1 -- <marker>` (commit ĐẦU TIÊN thêm chính file marker).
  Đo **8/8 resolve được**; **sống-sau-squash by construction**; và **nuốt luôn bẫy-một** (không cần bước resolve riêng).
  `head-sha` trong marker hạ xuống làm **fallback**, guard đúp.
- **Bẫy-hai (sha mồ-côi): 0/8 ở SE hôm nay — tiền-đề của lead SAI, đã bác.**
  Squash `session-end` §5.0/§5.2 **chỉ gọt trailing-`wal:` CHƯA push**; 6/8 sha đã push nên bất khả mồ-côi.
  *(lead re-đo độc lập: `cat-file -e` + `is-ancestor` → **sống 8 / mồ-côi 0**.)*
  🔴 **Guard VẪN BẮT BUỘC**, 3 lý do: (i) tiền lệ **S127** `f9fa77d6` dangling có thật — và nó chứng luôn rằng
  `cat-file -e` **một mình THỦNG** (object còn, ancestor mất) ⇒ **phải kèm `is-ancestor`**; (ii) `6c263dd` (đang là
  anchor `_pause-4` **và** `last_ticked_head`) nằm trong vùng fold-able; (iii) 🔴 **chính feature `/day` tự đẻ điều kiện
  orphan** — chuỗi cửa-nhẹ Q&A sản xuất trailing-`wal:` thuần, đúng thứ squash gọt.
- Mồ-côi ⇒ verdict `anchor-lost` **khai TO** trong report + tự nâng. Hỏng-an-toàn nhưng **phải CÓ TIẾNG**.

### F4 — marker dậy đếm-được

- `_day-<i>.md` **7 trường**, khuôn `_pause-<i>`/`_tiep-<i>`. **0 commit riêng** — hook `wal-flush.ps1` path ④
  (`.claude/sessions/`) chở miễn phí ⇒ **KHÔNG nới hook** ⇒ **KHÔNG đẻ điểm mù mới** cho Sàn-3.
- **Falsifier 2 chiều** cho tầng audit: *CLEAN-giả* (marker ghi CLEAN mà có commit thật giữa anchor và ts ⇒ FLAG)
  · *luôn-DELTA* (mỗi lần tự nâng phải khai signals/`anchor-lost` ⇒ chuỗi tự-nâng dài bất thường là soi được).
- **Drift F4 SE-local đo được (gửi hub — đúng shape s109 hub kể):**
  **`_snapshot` 3/4 vs contract auto-snap `pause.md §2.6(D)`** — PAUSE-4 **thiếu vết snapshot**. *(lead re-đo: snapshot 3, pause 4.)*
  `_context` PAUSE **4/4 khớp**. 🔸 Hai thứ KHÔNG tính là drift: `_tiep` 3-vs-4 (write-order benign) ·
  WAL "window 4" / STATUS "counter 31" (by-design ghi tại pause cửa trước).

### Phản-biện / SKIP (engine nêu, lead nhận)

1. **Không quy token** — chỉ báo byte. Đây chính là lỗi làm thư hub trượt vòng r1 (dán nhãn "token tự đo" lên proxy ký-tự).
2. **Không tái dùng Sàn-3** làm probe (đã luận ở trên).
3. **Không nới hook** để chở `_day-*` — path ④ có sẵn.
4. Lợi tuyệt-đối SE **nhỏ hơn hub 3,6×** — đừng bán bằng số hub.

### 🔎 2 phát hiện NGOÀI đề-bài (engine tự nêu — lead xác nhận cả 2)

- 🔴 **`docs/HANDOFF.md` segment mới nhất = S153**, không có segment cho S155-S157 ⇒ **nguồn-2 của `tiep_reload`
  đang nạp brief cũ 3 nhãn phiên**. *(Lead đụng đúng chỗ này ở §2.6 cửa này: đọc HANDOFF thấy "Last updated: 2026-07-26 (S153)".)*
- `_tiep-1.md` head-sha ghi **7 ký tự** trong khi 7 marker còn lại ghi đủ 40 ⇒ **form drift trong cùng một loại marker**
  (nếu probe so sánh chuỗi thay vì gọi git thì sẽ vấp).

---

## ③ CHECKLIST — acceptance ĐO ĐƯỢC (A1-A8, mỗi phép CÓ ĐƯỜNG TRƯỢT)

> 🔴 Sàn: phép mà **implement sai vẫn PASS** là phép **0-bit**. Thư này bị chính reviewer của hub đánh trượt **2 vòng**
> vì lỗi loại đó ⇒ mỗi dòng dưới phải nêu rõ **trượt khi nào**.

| # | Phép đo | TRƯỢT khi |
|---|---|---|
| **A1** | Chu trình `/pause` sạch → `/day` ⇒ CLEAN; `day-probe --json` in **cả `anchor` lẫn `head-sha` field** và chỉ ra chúng KHÁC nhau | Ai đó cài đếm-thô từ `head-sha` ⇒ DELTA-giả ⇒ FAIL |
| **A2** | Cây tạm: inject marker mang sha **dangling** ⇒ verdict `anchor-lost` + tự nâng | Chỉ dùng `cat-file -e` (không `is-ancestor`) ⇒ lọt ⇒ FAIL — **đúng shape S127** |
| **A3** | `/pause` sạch rồi gõ `/pause` lần 2 ⇒ **số file marker + `git log -1` bất biến** | Sinh thêm marker / commit / spawn `ctx-curator` ⇒ FAIL |
| **A4** | `/tiep` trên nền sạch ⇒ report khai **SKIP nạp-nền + SKIP `ctx-verifier`**; đĩa sinh **đúng 1 `_day-*`, 0 `_tiep-*` mới** | Vẫn nạp nền, hoặc sinh `_tiep` ⇒ FAIL |
| **A5** | Inject (a) dirty 1 byte ngoài allowlist · (b) 1 commit thường ⇒ **DELTA cả 2 chiều** | Một trong hai vẫn CLEAN ⇒ FAIL |
| **A6** | Đếm `_day-*` = N; **falsifier PHẢI FLAG** ca inject CLEAN-giả (marker CLEAN + có commit thật giữa anchor và ts) | Falsifier im ⇒ FAIL (lớp *vắng-mặt trông giống ổn*) |
| **A7** | Sau khi có `_day-*` trên đĩa, `/tiep §0` ⑤(b) ORPHAN-L **im đúng**; rồi **RE-RUN fault-inject** block ⑤(b) 2 chiều | Quên cộng `_day-*` vào r-set ⇒ ORPHAN-L **kêu oan** ⇒ FAIL |
| **A8** | `grep` report `/day`: **0 hit** con số gắn nhãn token | Có số token đơn lẻ ⇒ FAIL (lỗi r1 của hub) |

**Vai + deliverable**

- **Thi công = lead tự tay** (KHÔNG giao implementer): 3 chỗ chạm **canonical**, sai một chỗ là hỏng nghi-thức đang chạy tốt.
- **REVIEW = workflow RIÊNG** — Harness-9 mandate (adap = 2 workflow: IMPLEMENT ⟂ REVIEW độc lập) + report hub kèm run-id.
- **Dogfood 2 cửa** trước khi báo hub — hub tự khai 0 phiên, SE đừng lặp lại lỗi đó.

### 🔴 3 chỗ chạm CANONICAL — CHỜ ANH GẬT, lead KHÔNG tự làm

1. **`tiep.md §0` ⑤(b)** — sửa r-set ORPHAN-L (đụng **nhà canonical của Sàn-3**).
2. **`CLAUDE.md`** — câu *"nối lại DUY-NHẤT bằng `/tiep`"* nay có ngoại lệ `/day` ⇒ phải sửa, nếu không là **ghost-wire chiều ngược**
   (chạy thật mà khai chưa — đúng lớp H18 mà `lead-stale-auditor` bắt @S146).
3. **`check-email.md`** — nhịp "4 CỬA PHIÊN" thành **5 cửa** nếu `/day` cũng dò thư.

<!-- END · 4 KHOAN F1-F4 · 8 ACCEPTANCE A1-A8 · 4 PHAN-BIEN · 2 PHAT-HIEN-NGOAI-DE · 3 CHO-ANH-GAT -->
