Files
solution-erp/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-CE-sessionmodel.md
pqhuy1987 8b6df0a396
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m25s
[CLAUDE] Docs: S146 closeout — session-model 3 owner-decision + hook 4-path + H24 auto
Ap spec-apply-hub-s145-v2 (5 axis, governance-only: 0 prod-code, 0 migration).
Workflow S145 chet giua chung -> /tiep §4 relaunch-cat-gon wf_3d803740-41d 3/3 DONE.

Owner-decision @S146:
- session_ctx_kb = 64 TUONG-MINH (giu nguyen caveat ghost-wire: 0 reader)
- session-model: scaffold IDEMPOTENT (tach cap-SO vs tao-THU-MUC) · closed.md WIRE
  (session-end §6.3-bis) · V2 AUTO (go cong NGUOI, GIU cong NHIP 6/15/3)

Landed: C7 §N.8 predicate 4-ve · hook wal-flush.ps1 4 path (+.claude/sessions/)
· San-3 tin-hieu ⑤ + ORPHAN-L · D2 KIEM end-only · §L.c completeness-gate co RANG.
LIVE-VERIFY hook 4-path PASS repo THAT (da7ee8a). Session-model chay TRON VONG dau
tien: pause-S146 -> resume-S146 -> ORPHAN-L can so.

H24 force-fire (P=8 pause >= 1, luat auto moi): 2 vai + h24-audit -> 7 FLAG, va het:
- sweep-consent sot 6 site (h24-audit.md:4 = frontmatter description)
- closed.md wired-but-declared-unwired (ghost-wire CHIEU NGUOC)
- owner-decision [7] BI GHI DE do tai-dung slot-index -> mat uy-quyen push
3/3 vai lane-H24 garble #53: ghi-dia-SOM cuu tron, ghi-MUON mat trang.

So: orphan run-folder 3->0 · carry 14->20 (co tag [carry:*]) · +E-013 +E-014
error-ledger · +memory feedback_absence_looks_like_clean · .gitignore +lock file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 00:16:37 +07:00

276 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/``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.4C.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>``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.