# sub-implement-CE-sessionmodel — Axis C (session-model + hook 4-path + Sàn-3 atomic) + Axis E (tiep/pause/snapshot)

> Worker-2 @S146 · spec canonical = `spec-apply-hub-s145-v2.md` (gồm `[4] ADDENDUM @S146`).
> 🔴 Ghi-đĩa TRONG lúc làm (anti-#53 S123) — mỗi bước xong ghi ngay, KHÔNG đợi cuối.

## FILE SỞ-HỮU (disjoint, KHÔNG đụng file worker khác)
`.claude/hooks/wal-flush.ps1` · `.claude/commands/tiep.md` · `.claude/commands/pause.md` · `.claude/commands/session-start.md` · `.claude/governance/.session-counter.json` (chỉ `_why_this_path`) · `.claude/auto-memory/project_h22_wal_session_continuity.md` (chỉ cụm "3 path") · `docs/governance/session-model-se-draft.md`

---

## BƯỚC 0 — GROUND-TRUTH đo tươi trên đĩa @S146 (TRƯỚC khi sửa)

### (0.1) grep consumer "3 path" toàn tập LIVE
```
$ grep -rn '3 path|3 điểm mù|exactly 3 paths|3 path cố định|hook-3-path' \
    .claude/commands/ .claude/hooks/ .claude/auto-memory/ \
    .claude/governance/.session-counter.json docs/governance/harness-11-engine.md \
    docs/governance/session-model-se-draft.md
```
Output THẬT (11 hit / 6 file):

| file:line | nội-dung | chủ-sở-hữu |
|---|---|---|
| `.claude/commands/pause.md:31` | "file NGOÀI hook-3-path" | **TÔI** |
| `.claude/commands/pause.md:34` | "file ngoài hook-3-path" | **TÔI** |
| `.claude/commands/tiep.md:21` | "hook có **3 điểm mù**" | **TÔI** |
| `.claude/commands/tiep.md:23` | "`wal-flush.ps1:7` tự-commit **3 path**" | **TÔI** |
| `.claude/commands/tiep.md:75` | "NGOÀI 3 path hook persist" | **TÔI** |
| `.claude/commands/tiep.md:78` | "Bẩn ngoài 3 path" | **TÔI** |
| `.claude/auto-memory/project_h22_wal_session_continuity.md:10` | "3 path: WAL/agent-memory/runs" | **TÔI** |
| `.claude/governance/.session-counter.json:4` | "exactly 3 paths … OUTSIDE all three" | **TÔI** |
| `docs/governance/session-model-se-draft.md:13` | "persist 3-path" | **TÔI** |
| `docs/governance/session-model-se-draft.md:56` | "quét **đúng 3 path**" (meld-forward-gap) | **TÔI** |
| `.claude/commands/session-end.md:113` `:222` | "hook-3-path" ×2 | 🔴 **WORKER-3** — TÔI KHÔNG ĐỤNG |
| `docs/governance/harness-11-engine.md:406` (N.2) `:407` (N.3) | "3 path cố định" ×2 | 🔴 **WORKER-1** — TÔI KHÔNG ĐỤNG |

🔴 **Phát-hiện MỚI ngoài bảng C2b-EXT của spec** (spec liệt 5 dòng LIVE; đo tươi ra **thêm 4 site**):
- `pause.md:31` + `:34` "hook-**3**-path" (spec chỉ liệt `tiep.md`) — **TÔI vá**.
- `session-end.md:113` + `:222` "hook-**3**-path" — **worker-3 sở-hữu**, tôi KHÔNG đụng ⇒ **residual báo lead**.
- `harness-11-engine.md:407` (N.3) "3 path cố định" — spec chỉ giao worker-1 **N.2**; **N.3 là site thứ-2 cùng file** ⇒ residual báo lead (N.3 là câu LỊCH-SỬ mô-tả commit S111 `12071c5` "chứa ĐÚNG 4 file thuộc 3 path cố định" — có thể giữ nguyên như vết lịch-sử, nhưng phải là **quyết-định có ý-thức**, không phải bỏ sót).
- Lý do class: `cardinality-change → grep MỌI consumer` (S87/S88) — sửa write-site sót read-site = vỡ feature.

### (0.2) `.gitignore` — `.claude/sessions/` có bị ignore không?
```
$ git check-ignore -q .claude/sessions/session-1 ; echo exit=$?
exit=1
```
⇒ **exit=1 = KHÔNG bị ignore** — đúng kỳ-vọng spec C.5. (`.gitignore:82-83` `!.claude/` + `!.claude/**` re-include; không pattern nào sau đó loại `sessions/`.)
```
$ ls -d .claude/sessions
ls: cannot access '.claude/sessions': No such file or directory
```
⇒ thư-mục CHƯA tồn-tại lúc bắt đầu.

### (0.3) `session_ctx_kb` — đếm CONSUMER thật (C1: để TRỐNG, CẤM hardcode 64)
grep toàn repo (ripgrep):
- **0 script đọc key** — hit duy-nhất trong `scripts/` là `scripts/nhip-no-probe.ps1:42` và nó là **COMMENT** (`"same discipline as declining to pick session_ctx_kb"`), KHÔNG phải đọc config.
- `.claude/agent-memory/memory-budget.json` → **0 hit** ⇒ key VẮNG.
- Còn lại toàn doc/spec/run-trace/broadcast (mô-tả, không đọc).
⇒ **ghost-wire class (H18 defined-but-unread)** ⇒ **KHÔNG ĐỘNG GÌ** vào `memory-budget.json` (đúng C1 + K6.2). Đây là hành-động "không làm" **có chủ-đích**, đã đo.

---

## BƯỚC 1 — VIỆC 1: hook 4-path (spec C.2)  ✅ DONE

`.claude/hooks/wal-flush.ps1:13-14` — `$paths` 3 → **4** (+`.claude/sessions/`), kèm 1 dòng comment pure-ASCII (gotcha #30: .ps1 pure-ASCII).

```
$ sed -n '12,15p' .claude/hooks/wal-flush.ps1
  if ((Test-Path ".git/rebase-merge") -or (Test-Path ".git/rebase-apply")) { exit 0 }
  # 4 path (S146): +.claude/sessions/ = thu-muc phien-LOGIC (session-model, hub-form session-<N>).
  # Floor canonical = engine N.2 (KHONG chep list o day - B1 con-tro).
  $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/")
```

🔴 **KHÔNG viết "pending-restart"**: `.claude/settings.json` gọi hook bằng `-File <path>` ⇒ body được đọc LẠI mỗi lần Stop fire ⇒ ăn NGAY, không cần restart. (Xác nhận đọc `.claude/settings.json` — xem BƯỚC 1b.)

### 1b — LIVE-VERIFY (khai THẬT phạm-vi)
Xem mục "LIVE-VERIFY" cuối file — có **2 phần**: (i) hook chạy THẬT trên **cây tạm** (chứng path thứ-4 được nuốt, có `git log --name-only` thật) · (ii) fire trong repo THẬT = **KHÔNG quan-sát được từ trong subagent** → để lead live-verify.

---

## LIVE-VERIFY hook 4-path — 2 CHIỀU, chạy THẬT (không phải happy-path suông)

### (i) settings.json = `-File` ⇒ ăn NGAY, KHÔNG cần restart
```
$ cat .claude/settings.json
"command": "powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1"
```
⇒ body đọc LẠI mỗi lần Stop fire ⇒ **KHÔNG viết "pending-restart"** (đúng spec C.2).
🔸 Event wired = **`Stop`** (KHÔNG có `SubagentStop`) — đây chính là lý do subagent không quan-sát được fire (mục (iii)).

### (ii) 🧪 CHẠY THẬT hook trên CÂY TẠM (precedent S135 `-RepoRoot`; ở đây inject qua `CLAUDE_PROJECT_DIR`)
Cây tạm `…/scratchpad/hook4path/` — git repo riêng, KHÔNG đụng repo thật.

**Chiều A — BODY MỚI (4 path) ⇒ NUỐT `sessions/`:**
```
$ CLAUDE_PROJECT_DIR=<tmp> powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1
hook exit=0
$ git log --name-only --format='%s' -1
wal: flush 20260722T2238

.claude/WAL.md
.claude/sessions/session-1/probe.md          <-- 🔴 PATH THỨ-4 ĐÃ VÀO COMMIT
$ git status --porcelain
?? .claude/hooks/
?? docs/                                      <-- decoy NGOÀI 4 path: KHÔNG bị nuốt (anti-Goodhart control)
```

**Chiều B — NEGATIVE CONTROL, BODY CŨ (3 path) ⇒ KHÔNG nuốt:**
```
$ grep -n 'paths = @' .claude/hooks/wal-flush.ps1
15:  $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/")
$ ... run hook ...
$ git log --name-only --format='%s' -1
wal: flush 20260722T2238

.claude/WAL.md                                <-- CHỈ WAL
$ git status --porcelain | grep sessions
?? .claude/sessions/                          <-- 🔴 VẪN MỒ-CÔI (đúng bug mà 4-path vá)
```
⇒ **2 chiều khớp**: file `sessions/` được nuốt **KHI VÀ CHỈ KHI** `$paths` có path thứ-4. Chứng đây là **nguyên-nhân**, không phải trùng-hợp. Decoy `docs/` im ở cả 2 chiều ⇒ hook KHÔNG nới quá list.

### (iii) 🔴 KHAI THẬT — fire trong REPO THẬT: **KHÔNG quan-sát được từ trong subagent**
- Hook wired ở event **`Stop`** (turn-boundary của **phiên chính**), KHÔNG phải `SubagentStop` ⇒ lượt của worker này **không sinh** boundary đó.
- Tôi cũng **KHÔNG tự chạy hook trong repo thật** vì nó `git add` + `git commit` — vi-phạm LUẬT CỨNG #6 (không commit / không git add; lead lo).
- ⇒ **CẤM tự dán chữ "verified" cho fire-in-repo-thật.** Trạng-thái đúng = **VERIFIED-ON-TEMP-TREE (2 chiều) + PENDING lead live-verify trong repo thật.**
- **Vật-liệu để lead verify đã đặt sẵn:** `.claude/sessions/session-1/probe.md` (xem BƯỚC 4). Lead chỉ cần để một turn-boundary trôi qua rồi:
  `git log --name-only -1` → phải thấy commit `wal: flush …` **nuốt** `.claude/sessions/session-1/probe.md`.

---

## BƯỚC 2 — VIỆC 2: SÀN-3 ATOMIC trong `tiep.md` (spec C.3)  ✅ DONE

| mục | site | làm gì |
|---|---|---|
| (a) | `:21` | "hook có **3 điểm mù**" → **4 điểm mù** |
| (a)+(d) | `:23` | "`wal-flush.ps1:7` … **3 path**" → "**`wal-flush.ps1:13`** … **4 path**" + liệt đủ 4 path |
| (a) | `:24` | "MÙ đúng **3** vùng" → **4** vùng |
| (a) | `:29` | BẬC MẠNH "thấy **1 trong 4**" → **1 trong 5** |
| (b) | `:37` | **THÊM hàng ⑤** vào bảng BẬC MẠNH (lệnh `git log --name-only --format='%s' origin/main..HEAD \| grep -q '.claude/sessions/'`) |
| (b)+orphan-L | `:78-101` | **THÊM block `#### ⑤ ORPHAN-L`** — DUAL 2 cửa (git ⟂ đĩa cân-sổ) |
| (c) | `:103` `:106` | BẬC TRUNG "ngoài **3** path" → **4** path (×2) |
| (e) | `:115-116` | "Cả **4** tín-hiệu MẠNH đều im" → **5** + **luật bất-biến** "mỗi path mới ⇒ mỗi tín-hiệu mới, CÙNG lần sửa" |
| (e) | `:122` | §0.b self-heal: "cả 4 tín-hiệu MẠNH khác" → "cả **4 tín-hiệu MẠNH CÒN LẠI** (= 5 trừ chính ③)" — 🔸 số này **đúng là 4**, không phải 5: ③ `closing:` là chính nó |
| (e) | `:131` | §1 "**4/4** tín-hiệu MẠNH im" → **5/5** |
| §N.8 | `:142` | dòng **TRỎ** `harness-11-engine.md §N.8` (B1 — CHỈ trỏ, KHÔNG chép predicate) |
| C.6 | `:144-149` | **THÊM §2.6** đọc context-map + ghi biên-nhận `resume-*` |

### 🔴 Quyết-định phụ (khai để lead soi): GIỮ `$paths` ĐÚNG DÒNG 13
Bản sửa đầu tôi chèn 2 dòng comment **TRÊN** `$paths` ⇒ đẩy nó xuống **:15** ⇒ acceptance literal `wal-flush.ps1:13` **hỏng**, và mọi trích-dẫn `:13` (spec · run.md · memory) **lão-hoá cùng lúc**. ⇒ **đảo comment xuống DƯỚI**, `$paths` ở lại `:13`. Ghi luôn cảnh-báo trong chính file `.ps1`:
```
16:  # !! GIU $paths O DUNG DONG 13: nhieu doc trich-dan "wal-flush.ps1:13" (tiep.md :23, spec, memory).
17:  #    Chen dong TREN day = lao-hoa het cac trich-dan do (class acceptance-literal-tu-lao-hoa S121).
```
Đã **RE-RUN** live-verify trên body CUỐI sau khi đảo (không tin verify của bản nháp): commit `wal: flush 20260722T2240` vẫn nuốt `.claude/sessions/session-1/probe.md`, decoy `docs/` vẫn im.

### 🧪 Fault-inject ORPHAN-L — 5 ca, 2 CHIỀU (chạy THẬT block trong `tiep.md`, cây tạm)
```
ca 1  pause=1 resume=0            -> ORPHAN-L: .claude/sessions/session-1/ (pause=1 resume=0 closed=0)   ✅ FLAG dung
ca 2  pause=1 resume=1            -> (im)                                                                 ✅ IM dung
ca 3  pause=2 resume=1  (lech 1)  -> ORPHAN-L: .claude/sessions/session-3/ (pause=2 resume=1 closed=0)   ✅ FLAG dung
ca 4  pause=1 + closed.md         -> (im)                                                                 ✅ IM dung
ca 5  thu-muc RONG (0 pause)      -> (im, skip)                                                            ✅ IM dung
```
⇒ **5/5**. Có ca **lệch-1 trên nền không-rỗng** (ca 3) = ca anti-Goodhart: thiếu nó thì detector chỉ bắt được "chưa từng resume", bỏ lọt "resume thiếu 1 lần".

---

## BƯỚC 3 — VIỆC 3: 2 CONSUMER v2 SÓT  ✅ DONE

### (3.1) `.claude/governance/.session-counter.json` → `_why_this_path`
**TÁI-VERIFY mệnh-đề TRƯỚC khi sửa** (không chỉ bump số): `.claude/governance/` có còn ngoài **cả 4** path không?
→ path thứ-4 là `.claude/sessions/`, **≠** `.claude/governance/` ⇒ **mệnh-đề VẪN ĐÚNG**, chỉ con số đổi. Đã ghi câu **RE-VERIFIED at S146** vào chính field đó + luật "lần nới sau phải **kiểm lại câu**, không chỉ bump số".

Verify sau sửa:
```
$ grep -o 'OUTSIDE all four' .claude/governance/.session-counter.json
OUTSIDE all four
$ head -c 3 .claude/governance/.session-counter.json | xxd
00000000: efbb bf                                  ...          <-- BOM CON NGUYEN
$ python -c "import json,io; d=json.load(io.open(...,encoding='utf-8-sig')); ..."
PARSE OK; counter = 20 ; session = S146
last_ticked_head = 474199b32fb0371d76aa2f1c43daa849f973f9fd · last_ticked_at = 2026-07-22
last_audit = 17 17 · class_repeat keys = 8 · history entries = 8
```
🔸 **`git diff --numstat` ra `4 4` — KHÔNG phải tôi sửa 4 dòng.** Soi diff: 3 dòng kia (`counter` 19→20 · `S145`→`S146` · `last_ticked_head`) **đã có sẵn trong cây** = **tick của lead phiên này**, uncommitted từ trước lúc tôi vào. Sửa của tôi = **đúng 1 dòng** `_why_this_path`. (Ghi rõ kẻo đọc numstat thành "worker đụng counter".)

### (3.2) `.claude/auto-memory/project_h22_wal_session_continuity.md:10`
"(per-path+CAND+exit-0; **3 path**: WAL/agent-memory/runs)" → "**4 path** kể từ S146: WAL/agent-memory/runs/**sessions** — path thứ-4 `.claude/sessions/` = thư-mục phiên-LOGIC, đẻ CÙNG tín-hiệu MẠNH ⑤ + ORPHAN-L ở `tiep.md §0`".
🔴 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 (đúng đánh-giá "NGUY NHẤT" của spec).

---

## BƯỚC 4 — VIỆC 4: session-model (spec C.4–C.7)  ✅ DONE

### (4.1) VC-1 nhãn 2 tầng + siết "MỘT con số" — `session-model-se-draft.md §3 VC-1`
`S<nn>` (cửa-sổ vật-lý, **mọi** tick/counter/H24 giữ nguyên đơn-vị) + `logic: L<mm>`. 🔴 **Siết thêm:** `L<mm>` và `session-<N>` dùng **CÙNG con số** (`mm ≡ N`) — 2 cách viết của 1 ID, **KHÔNG phải 2 bộ đếm** (2 counter cho 1 khái-niệm = drift bảo-đảm). + khai vì sao tick an-toàn: OR-guard khớp trên `S<nn>` **không đổi ngữ-nghĩa** ⇒ label-convention S135 còn nguyên, phép-7 không về `+0`; `L<N>` **CẤM** dùng ở guard/counter.

### (4.2) Gỡ VC-3 stale → hub-form (K4 chốt)
`.claude/logic-sessions/L<mm>.md` (**một-tệp-per-phiên**) → **`.claude/sessions/session-<N>/`** (**thư-mục-per-phiên**, hub-form). §4 khoản 1 (K4) đổi từ "chờ anh" → **CHỐT @S146** (căn-cứ: owner override S144 + spec-v2 §C.4; lý-lẽ: thư-mục chịu N khối `/pause` không phải sửa file cũ + trùng path thứ-4 của hook).

### (4.3) Scaffold — `session-start.md` **BƯỚC 0.8** (mới)
- form `.claude/sessions/session-<N>/`, **regex `^session-\d+$`**, `<N>` = `max+1`, **chỉ `/session-start` mở `<N>` mới** (`/tiep` nối, không mở).
- **Đo `.gitignore` THẬT, không suy:**
```
$ git check-ignore -q .claude/sessions/session-1 ; echo "exit=$?"
exit=1          <-- KHONG bi ignore (dung ky-vong spec C.5)
```
- **(d) KHAI RANH** — đã wire gì / chưa wire gì (chống đọc thành "đã adopt session-model"): 0 nghi-thức chuyển per-L trong lượt này.
- **+ vá B1 tại chỗ:** BƯỚC 0.7 cũ chép cứng "**4** tín-hiệu BẬC MẠNH" + "Sàn-3 **4/4** im" ⇒ **stale ngay** khi sàn lên 5. Đổi thành **`k/k` đọc sống từ `tiep.md §0`** + ghi rõ vì sao cấm chép số. (Đây là consumer **thứ 6** của cardinality-change mà không bảng nào trong spec liệt — bắt được nhờ grep-mọi-consumer.)

### (4.4) per-pause context-map — `pause.md` **§2.6** (mới)
File **MỚI mỗi lần pause**: `pause-S<nn>-<yyyyMMddTHHmm>.md`, **3 trường** (quyết-định-đã-chốt · delta-còn-sống · con-trỏ run/commit). **CẤM ghi đè**. Khai ranh với WAL (WAL = mạch-sống ghi-đè ≤40 dòng; context-map = tích-luỹ không cap). CẤM secret. + `pause.md §4` add đích-danh `.claude/sessions/session-<N>/` vào commit `wal: pause` (không dựa hook để chốt điểm dừng — *hook là lưới, không phải nghi-thức*).

### (4.5) `tiep.md §2.6` đọc lại — xem BƯỚC 2.

### (4.6) orphan-L rule — gộp chung signal ⑤, xem BƯỚC 2 (block `#### ⑤ ORPHAN-L` + fault-inject 5/5).

### (4.7) Q4-audit = DEFER  ✅
`session-model-se-draft.md §5` câu 4 + `harness-11-engine.md §N.8`-pointer: chỉ **hiển-thị dòng-nợ**, **KHÔNG audit-rerun giữa phiên-logic** — **1 dòng lý-do**: audit-rerun = ĐẮT + side-effect ⇒ **phá predicate C7**.

### (4.8) `session_ctx_kb` = ĐỂ TRỐNG  ✅ (hành-động = **KHÔNG ĐỘNG GÌ**, có đo)
`memory-budget.json` **0 hit** ⇒ giữ nguyên, **CẤM hardcode 64**. Đo: **0 script đọc key**; hit `scripts/` duy-nhất = **comment** `nhip-no-probe.ps1:42`. Đối-chứng ca song-sinh: `pull_warn_days` **CÓ** reader sống (`nhip-no-probe.ps1:190`) ⇒ analogy "như pull_warn_days" hỏng. Đã ghi phát-hiện vào `draft §4 khoản 2` + `session-start BƯỚC 0.8(d)`.

### (4.9) TRỎ §N.8  ✅ — `pause.md:5.` + `tiep.md §2.5`, **CHỈ TRỎ**, 0 chép predicate (B1).

---

## ACCEPTANCE — 6/6 PASS (lệnh + output THẬT)

```
1) grep -rn '3 path' .claude/commands/tiep.md              -> hits=0                       ✅
2) grep -n 'sessions' .claude/hooks/wal-flush.ps1
   13:  $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/")   ✅
3) grep -o 'all four' .claude/governance/.session-counter.json   -> all four                ✅
4) python json.load(utf-8-sig)  -> PARSE OK; counter = 20 ; session = S146
   head -c 3 | xxd               -> efbb bf  (BOM con)                                      ✅
5) grep -n 'wal-flush.ps1:13' tiep.md -> :23 co ; grep 'wal-flush.ps1:7' -> (none)          ✅
6) grep '^| \*\*⑤\*\*' tiep.md   -> :37 hang ⑤ ton tai trong bang BAC MANH                  ✅
```

**SCOPE GATE (luật cứng #1):**
```
$ git status --porcelain | grep -E '(src/Backend|fe-admin/|fe-user/|tests/)'
0 file prod-code — PASS
```
0 migration · 0 commit · 0 push · 0 `git add` (luật #6 giữ).

---

## 🔴 RESIDUAL — việc CÙNG CLASS còn sống ở file TÔI KHÔNG SỞ-HỮU (báo lead, KHÔNG tự sửa)

Sweep C2b-EXT sau khi tôi xong (`grep -rn '3 path|3 điểm mù|exactly 3 paths|3 path cố định|hook-3-path'`):

| file:line | nội-dung | phán |
|---|---|---|
| `.claude/commands/session-end.md:114` | "file ngoài **hook-3-path**" | 🔴 **THẬT — cùng class, cần → 4.** Worker-3 sở-hữu. |
| `.claude/commands/session-end.md:296` | "M-7 … file NGOÀI **hook-3-path**" | 🔴 **THẬT — cùng class, cần → 4.** Worker-3 sở-hữu. |
| `.claude/commands/session-end.md:162` | "\| `harness-audit` (k) \| **3 path** `runs/<id>/harness-*-return.md` \|" | 🟢 **DƯƠNG-GIẢ — CẤM sửa.** "3 path" ở đây = **3 file return của bộ-ba**, KHÔNG liên-quan hook. Sweep máy-móc sẽ **làm hỏng** dòng này. |
| `docs/governance/harness-11-engine.md` N.2/N.3 | — | ✅ **worker-1 ĐÃ XỬ**: N.2 = "**4 path cố định** {WAL · agent-memory · runs · **sessions**}"; N.3 reword "path cố định **lúc S111**" (giữ đúng vai câu lịch-sử). Floor ↔ hook nay **khớp**. |

🔸 **Bài rút:** `3 path` là chuỗi **đa-nghĩa** — grep-sweep theo literal phải **phân loại từng hit** trước khi đổi (đúng lớp "citation-trap / use ⟂ mention"). 2 hit sửa được, 1 hit **phải tha**.

🔸 **Ngoài phạm-vi quét CỐ Ý (C8 — đừng rewrite history):** `adap-reports/*` (báo-cáo có ngày) · `agent-memory/*` (nhật-ký vai) · `.claude/WAL.md`. Không đụng.

---

## 🔴 KHAI HỞ CÒN LẠI (không bán quá nấc)

1. **Fire hook trong repo THẬT chưa quan-sát được** → `VERIFIED-ON-TEMP-TREE (2 chiều)` + **PENDING lead**. Vật-liệu: `.claude/sessions/session-1/probe.md` (file này **xoá được** sau khi lead verify).
2. **`closed.md` chưa có người ghi** — chân đóng phiên-logic thuộc `/session-end` (VC-2 chờ anh). Ca "pause → đóng thẳng không qua `/tiep`" sẽ **kêu oan**. Hướng hỏng = về phía **hỏi-lại**, không phải im-lặng-bỏ-việc. **KHÔNG được đọc thành "đã kín".**
3. **Nghi-thức KHÔNG chuyển per-L** trong lượt này — chỉ hạ-tầng. Bảng VC-2 vẫn **chờ anh duyệt từng dòng**.
4. **`resume-*` là nghi-thức, không phải code-enforced** — quên ghi ⇒ ORPHAN-L kêu (fail-safe), nhưng vẫn là kỷ-luật người/agent, KHÔNG phải guard có răng.

