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

20 KiB
Raw Blame History

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.json0 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:73 path" → "wal-flush.ps1:134 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 · S145S146 · 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-logic1 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 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 đượcVERIFIED-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.