Files
solution-erp/.claude/commands/snapshot.md
pqhuy1987 24483935cb [CLAUDE] Docs: S148 — session-model port form hub + /check-email 4 cửa + Sàn-3 dual-accept
Session-model (owner chốt "đối ứng đúng chính xác như hub"):
- Form hub: _context-s-<N>.md (STOCK-map + FLOW append-only + STOCK-touched)
  + _pause-<i>/_tiep-<i> marker 5-trường + _snapshot-<i> + _end (thay closed.md)
- Port /snapshot + scripts/session_scaffold.py (near-verbatim)
  + scripts/session_ctx.py TRIMMED CÓ KHAI (chỉ machine-block + secrets-sweep;
    KHÔNG port jsonl/overhead/cap-getter vì chưa có caller = ghost-wire)
- session-2 migrate sang form hub; session-1 giữ legacy (FROZEN)

Sàn-3 ORPHAN-L:
- DUAL-ACCEPT hub + legacy; glob pause-* KHÔNG khớp _pause-1.md nên không đếm đôi
- VÁ bug có sẵn từ S146: chốt-kết ĐÓNG TRỌN thư-mục (bản cũ c=1 chỉ tha 1 pause,
  lệch chính câu session-end §6.3-bis vẫn nói "mọi pause")
- Fault-inject 10/10 hai chiều + anti-Goodhart

/check-email:
- Wire 4 CỬA phiên (session-start/tiep/session-end/pause), 2 CHẾ-ĐỘ:
  DÒ ~5ms ở cửa dừng-nối (ràng buộc BINDING hub goi-chot §3) ⟂ KÉO ở bookend
- DÒ quét 2 kênh + định tuyến: outbox/se -> /check-email · outbox/all -> /adap-apply
- STAGE-2: 10 thư fan-out verify 2 tuyến 10/10 -> inbox/ai_infra/; backlog root = 0

HANDOFF re-stamp: #1 ĐÓNG (trio đã chạy S144) · #2 đổi trục · #3 anh chốt (a)
+ 4 mục mới (13)-(16); carry #15/#17 đóng, #16 đóng nửa (khai rõ vế còn hở)

H24 tick S147->S148: counter 21->22 CLEAN

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 18:03:41 +07:00

5.9 KiB

description
description
Checkpoint KHÔNG-dừng-phiên — ghi _snapshot chốt trạng-thái + commit, KHÔNG stop/bookend (session-model, adopt S148)

/snapshot — chụp-nhanh không-dừng (SE port của hub snapshot.md, adopt S148 2026-07-24)

Checkpoint NHẸ giữa phiên (≤1 turn): 1 Write + 1 commit. KHÔNG stop · KHÔNG bookend · KHÔNG flush agent-memory · KHÔNG hỏi thêm. Xong là làm việc tiếp ngay.

🔗 Cặp với /pause (dừng hẳn) và /tiep (nối lại). /snapshot KHÔNG phải điểm dừng — nó là dấu mốc giữa đường. 🧭 Đóng [carry:snapshot-cmd] (#15) — anh chốt @S148 "làm đi không cần hỏi hub".

0. GUARD — thư-mục có thể CHƯA activate

Resolve sID <N>: đọc field session: trong .claude/WAL.md → mất thì lấy .claude/sessions/session-*/ mtime max → vẫn mù thì hỏi anh 1 dòng. 🔴 .claude/sessions/session-<N>/ CHƯA tồn-tạiSKIP ÊM: in đúng 1 dòng sessions/ chua activate — /snapshot no-op rồi DỪNG. KHÔNG mkdir, KHÔNG chết. (Cấp số <N> là độc-quyền /session-startsession-start.md BƯỚC 0.8.)

1. KHI NÀO fire (3 trigger — AI tự phán)

  • (i) Có quyết-định/kết-luận vừa chốt chưa nằm file nào (còn trong transcript).
  • (ii) NGAY TRƯỚC một workflow-launch diện-WAL: taskList ≥ 3 hoặc ước > 5 phút — chốt state trước khi fan-out.
  • (iii) accumulation-gate: đếm commit substantive tích-luỹ, bỏ qua nhiễu hook.
    • anchor = {subject·ts} của mốc NON-wal: gần nhất_snapshot TRƯỚC đã pin (đọc anchor trong _snapshot-<k-1>.md). 🔴 CẤM lấy HEAD trần — HEAD lúc snapshot thường là commit wal: do hook flush mỗi turn, và closeout-squash sẽ rewrite chính sha đó ⇒ neo vào nó là neo vào thứ sắp biến mất. Neo {subject·ts} sống sót squash.
    • count = git log --format=%s <anchor-sha>..HEAD | grep -vc '^wal:'
    • fire khi count ≥ K. K đọc LIVE từ .claude/agent-memory/memory-budget.json key snapshot_trigger_k. 🔸 Khai thật @S148: key này CHƯA có trong file SE ⇒ áp default-if-absent = 6 đúng theo spec hub. Đây là số của hub, không phải anh chốt — anh muốn khác thì đặt key, đừng sửa số ở đây (B1).
    • fallback (anchor không resolve được sau rewrite / chưa có _snapshot nào): git log --since=<mtime(_snapshot-* mới nhất)>; 0 _snapshot nào ⇒ snapshot ĐẦU do trigger (i)/(ii) lái, KHÔNG do (iii) — chống đếm-quá lúc folder vừa sinh.

2. Ghi _snapshot-<k>.md

k = (số file _snapshot-*.mdhiện có trongsession-/) + 1. 🔴 _snapshot tự chứa essenceKHÔNG double-write vào _context FLOW (FLOW = @pause-only).

Derive machine-block TRƯỚC: python scripts/session_ctx.py machine-block --session <N> --json

# _snapshot-<k> — SESSION-MODEL checkpoint (sID <N>)

ts: <ISO-8601 — ưu tiên git-anchored `git log -1 --format=%cI`, tránh wall-clock tuỳ tiện>
head-sha: <git rev-parse HEAD>
head-subject: <git log -1 --format=%s>
head-ts: <git log -1 --format=%cI>
label: <1 dòng — checkpoint này chốt cái gì>
snapshot-ordinal: <k>

## essence (≤3 dòng — chốt cái CHƯA nằm file)
- <dòng 1>
- <dòng 2>
- <dòng 3>

## machine-block
```json
<paste nguyên JSON của: python scripts/session_ctx.py machine-block --session N --json>
```

Trường BẮT BUỘC đủ: ts · head-sha · head-subject + head-ts · label · snapshot-ordinal · essence ≤3 dòng · machine-block. 🔴 head-subject+head-ts = chống sha-rewrite-rot: sau squash sha đổi, {subject·ts} vẫn resolve lại được. 🔸 Giới-hạn giữ khai (đo @S148): machine-block.changed_files derive từ git diff anchor..HEADchỉ thấy phần ĐÃ COMMIT. Việc đang dirty trong cây (vd docs/ chưa commit) KHÔNG hiện ra. Giữ đúng ngữ-nghĩa hub để sau này re-pull bằng diff; đừng đọc changed_files thành "toàn bộ việc đã làm".

3. Secrets-sweep gate (TRƯỚC commit — BẮT BUỘC)

python scripts/session_ctx.py secrets-sweep --session <N>

  • exit 1 ⇒ CHẶN commit: in file:line mọi hit, xử-lý/redact rồi mới commit.
  • Đã fault-inject @S148 2 chiều: CHẶN đúng ca có sk-… · cho qua ca sạch · 0 dương-giả với ask-me/task-list (token-anchored \b).
  • ⚠️ ACCEPTED-GAP khai thẳng: sweep pattern-bounded (4 mẫu voyage·sk-·gitea_pat·cfut_) ⇒ KHÔNG phủ secret lớp khác (vd mật-khẩu DB trong tin-nhắn verbatim). Đây là BLOCK bảo-thủ trước commit, KHÔNG phải chứng-minh sạch tuyệt-đối.

4. Commit (1 commit)

  • git add .claude/sessions/session-<N>/_snapshot-<k>.md🔴 CHỈ file đích danh, CẤM git add -A/. (rủi ro rò secret).
  • git commit -m "wal: snapshot s<N> _snapshot-<k>" — ASCII-clean (tránh em-dash mangle dưới PowerShell). KHÔNG --no-verify. KHÔNG push.
  • 🔸 Meld-forward @closeout — CHƯA ĐO tại SE: hub ràng commit mang .claude/sessions/ phải được nhập-tiến vào mốc non-wal: liền sau khi squash, KHÔNG bị DROP như wal: thuần. SE squash bằng reset --softvề lý không mất, nhưng chưa có phép đo riêng — trùng [carry:meld-forward-unmeasured] (#19). Đừng claim kín.

5. Xong

Báo 1 dòng: snapshot-<k> ghi @<ts> (count=<n>/K, trigger-<i|ii|iii>) — committed, tiếp việc rồi 1 dòng nhịp-nợ: powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1 (lỗi → probe-loi (khong chan)). 🔴 KHÔNG stop · KHÔNG bookend · KHÔNG DỪNG HẲN — quay lại việc đang làm ngay.