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>
20 KiB
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ệttiep.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 S11112071c5"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:42và 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ảiSubagentStop⇒ 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 commitwal: 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-startmở<N>mới (/tiepnối, không mở). - Đo
.gitignoreTHẬ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)
- 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). closed.mdchư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".- 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.
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.