[CLAUDE] Docs: S111 adopt H22 WAL session-continuity — sổ WAL ≤40 + Stop-hook wal-flush.ps1 persist-only VERIFIED-RUNTIME ×2 (12071c5/67be443 hot-reload ENV-DEPENDENT) + /pause·/tiep 1-đường + BƯỚC 0.7/§5.0/§6.4 + FLIP run-trace ≥3-task + engine PHẦN N + detector C5 + mark RC-…12-07-2026-11-43-45 + D10 paths-ignore anh-directed + email 9cdcda2f3c83 (invest/reviewer Fable per-invocation 0-garble · WF wf_5ba3daf6-fe0 3-Opus RUN-TRACE · reviewer PASS_WITH_FIXES 8/8-fix · squash §5.0 dogfood-THẬT K=2)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m11s

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-12 11:45:14 +07:00
parent 318a271930
commit 8aa3869637
30 changed files with 767 additions and 5 deletions

47
.claude/commands/pause.md Normal file
View File

@ -0,0 +1,47 @@
---
description: /pause — chốt điểm dừng chủ-động (Harness-22 WAL session-continuity). Ghi mạch việc dở vào .claude/WAL.md ≤40 dòng + commit `wal: pause` ĐÍCH-DANH rồi DỪNG HẲN — an-toàn để thoát / đổi acc / tắt máy. Nối lại DUY-NHẤT bằng /tiep.
argument-hint: (không tham số)
---
# /pause — chốt điểm dừng chủ-động (Harness-22 WAL session-continuity)
> **Mục-đích:** chốt trạng-thái làm-việc hiện-tại xuống đĩa một cách an-toàn, để có thể thoát / đổi tài-khoản / tắt máy mà KHÔNG mất trí-nhớ đã có và KHÔNG phải đốt lại token cho phần đã xong.
> Cặp với **`/tiep`** (đường recovery duy-nhất). 🔴 restart Claude Code sau khi tạo/sửa command `.md` (no hot-reload).
Thực-hiện **tuần-tự 5 bước** sau; trong lúc chạy **KHÔNG nhận việc mới**:
## 1. NGỪNG spawn mới — xử-lý task đang chạy
- KHÔNG spawn / phóng thêm bất-kỳ task hay workflow nào nữa.
- Với task đang chạy (background hoặc workflow):
- **Sắp-xong** (ước `< ~2 phút`) → **CHỜ** nhận kết-quả rồi **harvest-liền** (append phần trí-nhớ đã verify) trước khi chốt.
- **Còn lâu** → **KHÔNG chờ**. Ghi vào WAL một mục `[!]` **đủ trường**. Nếu là **workflow** → ghi một dòng `wf:` **năm-trường**: `wf:<mục-đích> run=<run-folder> runId=<id|pending> args=<snapshot> done=<k>/<N> harvested=no` (nhánh khôi-phục xem `/tiep`).
## 2. Flush trí-nhớ dirty xuống đĩa
- Đẩy mọi trí-nhớ đang dirty (chưa ghi) xuống đĩa (agent-memory / run-folder).
- Ghi-chú-dở **DÀI** (context, phân-tích giữa chừng) để ở **run-folder / work-state**, **KHÔNG** nhét chi-tiết dài vào WAL — WAL phải giữ tính "liếc một cái là biết".
## 3. Cập-nhật `.claude/WAL.md` đúng schema
- **`chain:`** — đầy-đủ mọi mục trạng-thái (`[x]` đã-xong · `[!]` đang-dở · `[ ]` chưa-làm), **KÈM BẰNG-CHỨNG** là một lệnh / đường-dẫn / hash chứng-minh trạng-thái đó (KHÔNG mô-tả suông).
- **`next:`** — đúng **một mệnh-lệnh cụ-thể**: làm gì tiếp theo.
- **`verify:`** — **ít nhất một lệnh CHẠY ĐƯỢC cho từng mục `[!]`**, để `/tiep` chạy được và đối-chứng.
- 🔴 WAL **ghi-đè toàn-file** (KHÔNG append), **cứng ≤ 40 dòng**. **CẤM secret** (WAL sẽ được commit): không key, không token, không credential.
## 4. Commit ĐÍCH-DANH — message `wal: pause`
- `git add` **đích-danh** đúng các path: **WAL + path persist** (agent-memory / run-folder) **+ file dở**, rồi `git commit -m "wal: pause"`.
- 🔴 **TUYỆT ĐỐI KHÔNG `git add -A`** — chỉ add đúng path cần chốt, tránh nuốt file rác / secret ngoài ý-muốn.
- **KHÔNG push.** (Repo trong Dropbox → thư-mục `.git` được cloud-sync, nên commit local vẫn **durable** qua tắt-máy / đổi-acc.)
## 5. Báo-cáo ngắn rồi DỪNG HẲN
Báo đúng bốn ý:
1. **goal** — mạch việc đang dở là gì.
2. **mục `[!]` đầu-tiên** — bước dở gần nhất.
3. **workflow bỏ lại** (nếu có) — dòng `wf:` đã ghi.
4. "**an-toàn để thoát, đổi acc, hoặc tắt máy**".
Rồi **DỪNG HẲN**, KHÔNG nhận việc mới.
---
🔒 **Bất-biến:** commit ở **bước 4 xảy ra TRƯỚC** tuyên-bố ở **bước 5** — chết ngay sau khi tuyên-bố "an-toàn để thoát" cũng KHÔNG mất gì (điểm dừng đã nằm trên đĩa).
👉 **Nối lại = `/tiep`** (MỘT đường recovery duy-nhất — kể cả khi user gõ "làm tiếp" bằng text thường, KHÔNG tự recovery cách khác).

View File

@ -108,6 +108,12 @@ Plan cha: [tên]
## Phase 5 — COMMIT (release)
### 5.0 Squash wal:-trailing chưa-push (H22 — TRƯỚC commit-chốt)
- Chạy `git log --format=%s origin/main..HEAD` → đếm **K** = số subject **LIÊN-TỤC** bắt đầu `wal:` tính từ HEAD xuống (DỪNG ngay khi gặp subject KHÁC). **K=0 → skip**; **K>0 → `git reset --soft HEAD~K`** gộp các wal-commit staged vào commit-chốt §5.1 (nội-dung đã ở index, chỉ gom lịch-sử — file không đổi).
- 🔒 **Phạm-vi = CHỈ commit CHƯA-push** (khoảng ahead-of-remote) → **KHÔNG BAO GIỜ rewrite commit đã-push**. wal: kẹp sâu hơn (sandwiched DƯỚI commit thường chưa-push) → **GIỮ NGUYÊN**, chấp-nhận noise (hard-safety đổi lấy không-rewrite-lịch-sử-đã-đẩy).
- **Biên push-chết-giữa-phiên-trước:** HEAD = commit-chốt cũ chưa-push → đếm DỪNG tại đó = chốt cũ KHÔNG bị fold, được push lần này (an-toàn, không mất commit).
- Squash xong = **điểm review-diff wal-paths** (AS-10 backstop dời về đây — hook đã commit local các residual-write nếu có; review diff các path WAL/agent-memory/runs TẠI ĐÂY trước khi chốt §5.1; push vẫn gated em-main).
### 5.1 Release + commit
- Kiểm tra release, commit task vừa hoàn thành. ⚠️ Update `SolutionErp.slnx` nếu có `.cs/.csproj` mới.
- Format: `[CLAUDE] <scope>: <imperative message>` + `Co-Authored-By: <lead model hiện tại> <noreply@anthropic.com>` (model = lead runtime phiên hiện-tại per BƯỚC 0.6 probe — KHÔNG hardcode; flip-chain canonical → `docs/STATUS.md` §Sub-agents)
@ -134,6 +140,10 @@ Plan cha: [tên]
- Surface report cho anh main relay AI_INFRA (1 lần báo = ACK+executed+evidence). Em main `/session-start` kế watch + double-check → cơ chế 2 chiều tự duy trì.
- Session KHÔNG adopt infra gì → ghi "N/A (no infra adoption this session)".
### 6.4 Reset WAL (H22 — bước CUỐI)
- Ghi-đè `.claude/WAL.md` về **template rỗng** (mạch dở phiên này đã đóng): `updated`/`session`/`branch` = `—` · `goal` = `(trống — không có mạch dở)` · `chain` = `(rỗng)` · `next`/`verify` = `(trống)`.
- 📝 Note: Stop-hook sẽ commit lần reset này thành **wal-commit trailing** sau turn cuối — **vô-hại**; phiên sau squash nó ở **§5.0**. (Đây là bước CUỐI, sau khi §5 đã commit/push xong — để WAL sạch cho `/session-start §0.7` phiên kế đọc.)
---
**Trigger sau Phase 6:** Session đóng. Working memory có thể `/clear` an toàn (persistent memory đã flush + commit + push).

View File

@ -44,6 +44,15 @@ Em main xác nhận **lead model resolve được** đầu session. **Lead = fro
**Lịch-sử flip-chain đầy-đủ (S98→nay) = canonical [`docs/STATUS.md` §Sub-agents]** (🔴 S106 gộp 1-chain per anh-confirm — reader này KHÔNG enumerate/cập-nhật mỗi flip; chống churn 4-file/flip). **BƯỚC 0.6 probe MỖI phiên** xác-định runtime SỐNG (per-session — KHÔNG tin note phiên trước, KHÔNG steady-state).
## 📋 BƯỚC 0.7 — WAL-check mạch-việc-dở (H22 — adopt S111)
Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40 dòng, tầng persist = Stop-hook) → 2 nhánh:
- **(a) File KHÔNG tồn-tại HOẶC chain rỗng / toàn `[x]`** → báo **1 dòng** "WAL sạch — không có mạch dở" rồi tiếp **Phase 1 bình-thường** (no-wait).
- **(b) Chain CÓ `[!]` hoặc `[ ]`** → BÁO **goal** + **mục `[!]` đầu-tiên** + câu "có mạch dở — gõ `/tiep` để nối, hoặc bảo em bootstrap tiếp bỏ mạch" rồi **CHỜ anh chọn**. 🔴 Đây là **NGOẠI-LỆ CHỜ DUY-NHẤT** của quy-trình no-wait (BƯỚC 0 GIỮ no-wait — echo body rồi chạy thẳng).
> 🧭 Bước này **CHỈ LÀ CON-TRỎ** — toàn-bộ quy-trình recovery (verify-trước-next · ground-truth-thắng · relaunch-cắt-gọt cho `wf:`) viết Ở MỘT CHỖ = [`.claude/commands/tiep.md`](tiep.md) (KHÔNG copy logic vào đây — B1 con-trỏ-canonical). Chặn **TRƯỚC Phase 1 READ** = tiết-kiệm read-set ~368K khi anh chọn `/tiep` (khỏi nạp full context rồi mới nối).
## Phase 1 — READ (load context)
Đọc theo thứ tự, KHÔNG skip:

42
.claude/commands/tiep.md Normal file
View File

@ -0,0 +1,42 @@
---
description: /tiep — recovery MỘT đường cho MỌI kiểu gián-đoạn (Harness-22 WAL session-continuity). Đọc .claude/WAL.md → chạy verify + git status → ground-truth thắng → nối chain từ next; mục wf: → relaunch workflow ĐÃ-CẮT-GỌT. Cặp với /pause.
argument-hint: (không tham số)
---
# /tiep — recovery MỘT đường cho MỌI kiểu gián-đoạn (Harness-22 WAL session-continuity)
> Đây là **đường recovery DUY-NHẤT** để nối lại mạch việc dở sau **bất-kỳ kiểu gián-đoạn nào** — hết giới-hạn, crash, tắt máy, đổi tài-khoản, hay chết giữa một workflow. Gõ `/tiep` (kể cả khi user chỉ nói "làm tiếp" bằng text thường).
> Cặp với **`/pause`**. Đặt tên `/tiep` để tránh đè lệnh dựng-sẵn (`/resume`, `/continue`).
Thực-hiện **tuần-tự 4 bước**:
## 1. Đọc `.claude/WAL.md`
- Đọc file `.claude/WAL.md`.
- Nếu **KHÔNG tồn-tại**, HOẶC **chain rỗng / toàn `[x]`** (không còn mục dở) → báo "**không có mạch dở**" và **DỪNG SẠCH**. KHÔNG bịa việc.
## 2. Đối-chứng ground-truth
- Chạy **TOÀN BỘ** lệnh trong `verify:`.
- VÀ đọc thêm `git status` + disk **run-folder liên-quan****per-turn ≠ per-task (N9):** các *return* của agent có thể mất khi phiên chết, NHƯNG file **per-agent trên đĩa vẫn còn**; nên đọc đĩa, đừng chỉ tin returns.
- So kết-quả thực-tế với `chain:`.
## 3. Ground-truth thắng WAL
- **LỆCH** (kết-quả `verify:` / `git status` mâu-thuẫn `chain:`) → **TIN GROUND-TRUTH**: sửa WAL cho khớp thực-tế, **báo chỗ lệch** cho user, RỒI MỚI chạy tiếp. KHÔNG mù-quáng chạy theo chain sai.
- **KHỚP** → thực-thi từ **`next:`**, nối chain theo thứ-tự các mục còn `[!]` / `[ ]`.
## 4. Mục `[!]` dạng `wf:` → nhánh recovery-workflow
Nếu mục dở là một dòng `wf:` (chết giữa workflow) → relaunch **ĐÃ-CẮT-GỌT**, KHÔNG chạy lại từ đầu:
1. Đọc **run-folder** + `## taskList snapshot` trong `run.md` (danh-sách-task + nội-dung spec đã snapshot lúc phóng).
2. Lấy **bằng-chứng task-nào-đã-xong** bằng cách **grep run-id trong log-phiên** (glob đường-dẫn — đây là grep ĐÍCH-DANH một chuỗi, **KHÔNG** nạp lại toàn-bộ transcript).
3. **Harvest-hồi-tố** phần đã xong: lead verify rồi append trí-nhớ, **đánh-dấu harvest partial-honest**.
4. **RELAUNCH** workflow chỉ với **các task CÒN LẠI** + memory-pack **DẪN-XUẤT-LẠI TƯƠI** (🔴 CẤM dùng snapshot memory-pack cũ — nó lỗi-thời sau khi đã harvest phần xong).
5. Resume-theo-run-id (nếu engine có) = **bonus CHỈ trong cùng phiên** (SAME-SESSION-ONLY) — 🔴 **CẤM claim nó chạy cross-session**; mặc-định dùng relaunch-đã-cắt-gọt.
Xong nhánh workflow thì vận-hành bình-thường tiếp (lead cập-nhật WAL sau mỗi subtask đổi trạng-thái).
---
🔒 **CẤM tuyệt-đối:**
- **CẤM giả-định** một bước đã xong nếu `verify:` KHÔNG chứng-minh.
- **CẤM nạp lại transcript cũ** — WAL + ground-truth (`verify:` + `git status` + đĩa) là ĐỦ; nếu thiếu thông-tin thì **HỎI anh**, đừng đoán.
**Field `session:`:** khác phiên hiện-tại là **BÌNH-THƯỜNG** — đó chính là use-case của `/tiep` (nối qua phiên / đổi acc). CHỈ cảnh-báo khi `updated:` **mới hơn cả lúc phiên hiện-tại bắt đầu** (dấu-hiệu có một phiên khác đang chạy song-song trên cùng repo).