[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
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:
15
.claude/WAL.md
Normal file
15
.claude/WAL.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# WAL — auto-generated, không sửa tay
|
||||||
|
updated: 2026-07-12T11:42 | session: S111 | branch: main
|
||||||
|
goal: Adopt Harness-22 WAL session-continuity (spec: .claude/workflows/runs/2026-07-12-h22-wal-adopt/)
|
||||||
|
|
||||||
|
chain:
|
||||||
|
[x] STAGE-1 hash 4/4 + invest-Fable 14N + spec lead-ghi — ls .claude/workflows/runs/2026-07-12-h22-wal-adopt/spec-h22-wal-adopt-12-07-2026.md
|
||||||
|
[x] em-main row#1/#2/#8/#9: WAL+gitattributes+settings + engine PHẦN N + rules §5.2 + CLAUDE.md + hmw.js — node --check .claude/workflows/hmw.js
|
||||||
|
[x] wf:h22-implement run=.claude/workflows/runs/2026-07-12-h22-wal-adopt runId=wf_5ba3daf6-fe0 args=run.md#taskList-snapshot done=3/3 harvested=yes — ls .claude/workflows/runs/2026-07-12-h22-wal-adopt/implement-synthesis.md
|
||||||
|
[x] hook-FIRE VERIFIED-RUNTIME ×2 — git log --format=%s origin/main..HEAD | grep -c "^wal:"
|
||||||
|
[x] reviewer-Fable PASS_WITH_FIXES 0C·1M·7m + 8-fix applied (M1 CAVEAT-sync · m1 detector-C5 · m6 hook-FIRE-wording · m7 tiep-chain-rỗng; m2/m3/m4 = chính bản WAL này; m5 wording ghi nhận synthesis) — powershell -File scripts/governance-detectors.ps1 (C5 [OK])
|
||||||
|
[!] outward: adap-report + email AI_INFRA + STATUS/HANDOFF + STAGE-2 move — ls docs/governance/adap-reports/2026-07-11-Governance-harness-22-wal-session-continuity.md
|
||||||
|
[ ] mark-proposal AskUser (KHÔNG tự stamp) + squash §5.0 dogfood-THẬT + commit-chốt + push + cicd verify + session-end
|
||||||
|
|
||||||
|
next: Write adap-report theo REPORT-FORMAT LOCK rồi send-email AI_INFRA (selftest-stamp 6c)
|
||||||
|
verify: git log --format=%s origin/main..HEAD | head -5 # wal: trailing liên tục là ĐÚNG (squash §5.0 sẽ gộp)
|
||||||
@ -91,6 +91,8 @@ Bearer từ `POST api.solutions.com.vn/api/auth/login` → status matrix expecte
|
|||||||
|
|
||||||
- **2026-07-10 (S108 first-real-run H19) `[engine: fable-real-single · Fable-S108]`** (em-main harvest B3, GAP-2/3): Task cite-audit 3 artifact S108 (fable-real-runbook 610-line + adap-request hot-reload + email-draft), ~111 anchor. Verdict **PARTIAL — 103/111 exact**: 7 off-by-1/2 (cụm reviewer:37-56 + investigator:46/:77 — systematic quanh code-fence) + 1 drift-note-stale (runbook:123 “9 vai” trong khi engine :328 đã 10) + email-fact FALSE **bắt trúng bẫy honesty** (hmw.js:31 chưa-sửa lúc audit → em-main vá thật sau verdict). Learned: worker-draft cite lệch ±1-2 quanh fence → audit MỞ ĐÚNG DÒNG đừng tin range · drift-note về file khác re-check ngay-trước-commit (canonical có thể được patch song song). Surprise: **meta-drift 2 tầng** — đoạn cảnh-báo-drift tự drift vì engine update TRƯỚC khi note viết xong. Return dòng-1 VERDICT-header chuẩn, 0 garble.
|
- **2026-07-10 (S108 first-real-run H19) `[engine: fable-real-single · Fable-S108]`** (em-main harvest B3, GAP-2/3): Task cite-audit 3 artifact S108 (fable-real-runbook 610-line + adap-request hot-reload + email-draft), ~111 anchor. Verdict **PARTIAL — 103/111 exact**: 7 off-by-1/2 (cụm reviewer:37-56 + investigator:46/:77 — systematic quanh code-fence) + 1 drift-note-stale (runbook:123 “9 vai” trong khi engine :328 đã 10) + email-fact FALSE **bắt trúng bẫy honesty** (hmw.js:31 chưa-sửa lúc audit → em-main vá thật sau verdict). Learned: worker-draft cite lệch ±1-2 quanh fence → audit MỞ ĐÚNG DÒNG đừng tin range · drift-note về file khác re-check ngay-trước-commit (canonical có thể được patch song song). Surprise: **meta-drift 2 tầng** — đoạn cảnh-báo-drift tự drift vì engine update TRƯỚC khi note viết xong. Return dòng-1 VERDICT-header chuẩn, 0 garble.
|
||||||
|
|
||||||
|
- **2026-07-12 (S111 H22 WAL deep-pass) `[engine: fable-real-single · Fable-S111]`:** H22 WAL adopt → READY_WITH_NUANCES + spec 3-mục (em-main gov/settings · w1 pause+tiep · w2 start/end delta · w3 hook+README). Chốt: (1) `.claude/settings*.json` KHÔNG tồn tại → hooks-entry CREATE mới; hook = STAGED-until-verified (S100 ghost-wire, chỉ claim khi thấy `wal:` commit phiên mới). (2) engine`:402` no-OS-hook = MÔ-TẢ (CAVEAT) không phải luật cấm; `:116` E.3 "hook fails-open ≠ gate" → persist-only TƯƠNG THÍCH, update :402; ACTIVE-MARKS 0 mark cấm-hook; H5 start`:41` chỉ cấm hook-switch MODEL. (3) AS-6 KHÔNG tăng: 2 runtime .json gitignored (`.gitignore:124-125`), hook commit LOCAL — push-set ≡ hôm nay. (4) cmd-PATH Git Bash trước WSL, bash 5.2.26 OK. (5) `.gitattributes` exists broadcasts-scoped → append `*.sh`; repo 0 .sh = zero churn. (6) 16 command 0 trùng pause/tiep. (7) Stop-hook fire chỉ TURN-boundary → chết giữa workflow-turn = vật-liệu DISK uncommitted, /tiep đọc cả git status/disk. (8) run.md thiếu taskList snapshot. Learned: "luật cấm hook" phải phân MÔ-TẢ vs LUẬT trước khi đòi carve-out. L1@19.8KB → suggest em-main curate.
|
||||||
|
|
||||||
- **2026-07-11 (S110 H21+MTv3 deep-pass) `[engine: fable-real-single · Fable-S110]`:** Task ground-truth 2 broadcast (H21 spec-file+per-invocation · MTv3 owner-choice) + inventory TOKEN toàn repo + SPEC 3-mục. Verdict **PASS**: (1) **12 persona file SẠCH 0-hit** fable/engine-token (grep 2 vòng cả `engine-đắt|top-model|ensemble`) — NGƯỢC hub vòng-1 bắt persona-phụ lỗi; (2) MTv3 self-check regex §5 chính-thức **0-hit** nhưng extended "lead LUÔN top-model" bắt 5 ACTIVE (engine:332 K.D · runbook:140/:455 · fable-real.md:17 · mark ACTIVE-MARKS:19) = **regex-heuristic-miss class** — sister diễn-đạt khác cụm regex; (3) **hmw.js:38 comment "tier:'fable' khi hệ-trọng" = xung-đột MTv3 §1.3/H21 §3** (đường nâng hạng-nhất DUY NHẤT = owner gõ; comment cho lead-discretion) — comment-only fix; (4) hmw-mode.on = HỆ KHÁC (consent fan-out T3 `ultracode-hmw-mem-governance`, content tự khai /ultra-on) — ngoài scope H21; (5) mega-line "VẪN ON" class = **standing-imperative-trong-history-blurb** (S109-header + HANDOFF NEXT-anh = ACTIVE cần sửa; blurb-body = snapshot giữ). Bẫy fidelity lớn nhất: MTv3 §1.2/1.3 "sub gán cứng hạng-hai" đọc như floor → tưởng phá H8 all-inherit; triage-reply S2 CÙNG NGÀY waive đích-danh ("không đổi gì với form all-inherit"). ⚠️ #53 garble lượt return đầu (trả status-line giữa-chừng thay verdict) → coordinator SendMessage re-emit trong-session = recover OK, diary ghi trước re-emit.
|
- **2026-07-11 (S110 H21+MTv3 deep-pass) `[engine: fable-real-single · Fable-S110]`:** Task ground-truth 2 broadcast (H21 spec-file+per-invocation · MTv3 owner-choice) + inventory TOKEN toàn repo + SPEC 3-mục. Verdict **PASS**: (1) **12 persona file SẠCH 0-hit** fable/engine-token (grep 2 vòng cả `engine-đắt|top-model|ensemble`) — NGƯỢC hub vòng-1 bắt persona-phụ lỗi; (2) MTv3 self-check regex §5 chính-thức **0-hit** nhưng extended "lead LUÔN top-model" bắt 5 ACTIVE (engine:332 K.D · runbook:140/:455 · fable-real.md:17 · mark ACTIVE-MARKS:19) = **regex-heuristic-miss class** — sister diễn-đạt khác cụm regex; (3) **hmw.js:38 comment "tier:'fable' khi hệ-trọng" = xung-đột MTv3 §1.3/H21 §3** (đường nâng hạng-nhất DUY NHẤT = owner gõ; comment cho lead-discretion) — comment-only fix; (4) hmw-mode.on = HỆ KHÁC (consent fan-out T3 `ultracode-hmw-mem-governance`, content tự khai /ultra-on) — ngoài scope H21; (5) mega-line "VẪN ON" class = **standing-imperative-trong-history-blurb** (S109-header + HANDOFF NEXT-anh = ACTIVE cần sửa; blurb-body = snapshot giữ). Bẫy fidelity lớn nhất: MTv3 §1.2/1.3 "sub gán cứng hạng-hai" đọc như floor → tưởng phá H8 all-inherit; triage-reply S2 CÙNG NGÀY waive đích-danh ("không đổi gì với form all-inherit"). ⚠️ #53 garble lượt return đầu (trả status-line giữa-chừng thay verdict) → coordinator SendMessage re-emit trong-session = recover OK, diary ghi trước re-emit.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@ -90,6 +90,7 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod
|
|||||||
|
|
||||||
- **2026-07-10 (S108 first-real-run H19) `[fable-real-single]`** — **FAIL** (1 CRITICAL + 4 MAJOR + 6 minor; em-main 37-fix cùng phiên): email claim “đã sửa comment” khi hmw.js chưa sửa. Lesson: doc assemble-từ-N-worker → grep stale-claim theo CLASS toàn file sau fix đại diện; mọi outward-claim “đã sửa X” phải cat X trước gate. → `archive/2026-07.md`.
|
- **2026-07-10 (S108 first-real-run H19) `[fable-real-single]`** — **FAIL** (1 CRITICAL + 4 MAJOR + 6 minor; em-main 37-fix cùng phiên): email claim “đã sửa comment” khi hmw.js chưa sửa. Lesson: doc assemble-từ-N-worker → grep stale-claim theo CLASS toàn file sau fix đại diện; mọi outward-claim “đã sửa X” phải cat X trước gate. → `archive/2026-07.md`.
|
||||||
- **2026-07-10 (S109 sleep-recovery P3b fidelity-gate 2 gist L2 tooling-auditor + harvest-curator) `[fable-real-single]`:** **PASS_WITH_FIXES** (3 fix, 0 re-distill): (1) gist-2 meta-count "15 entry" ≠ disk 14 — count COPY từ brief, không đếm disk; (2) delta tự-tính "+8.8KB" cạnh cặp 32.2→41.1 (=8.9) — **self-computed derivative = lớp false-specificity MỚI** ngoài S88 merge-mis-attribution; (3) N/A-justification "(resolved monthly S96)" over-claim — ERD-debt §16+ CÒN pending (root CLAUDE.md), chỉ "(55)" resolved → **fact-claim trong N/A-note verify như content**. Bịa=0 ("S49" vượt-verbatim nhưng TRUE — chéo reviewer `_INDEX.md:28`); đảo-nghĩa=0 ("suýt" giữ ×2); drop-oan=0; 3 self-flag honesty NGUYÊN; pointer 10/10 unique+đúng-entry. Lesson: gist-metadata + số-tự-tính + drop-justification = 3 bề mặt lỗi máy token-coverage mù. Return Verdict-header dòng-1, 0 garble.
|
- **2026-07-10 (S109 sleep-recovery P3b fidelity-gate 2 gist L2 tooling-auditor + harvest-curator) `[fable-real-single]`:** **PASS_WITH_FIXES** (3 fix, 0 re-distill): (1) gist-2 meta-count "15 entry" ≠ disk 14 — count COPY từ brief, không đếm disk; (2) delta tự-tính "+8.8KB" cạnh cặp 32.2→41.1 (=8.9) — **self-computed derivative = lớp false-specificity MỚI** ngoài S88 merge-mis-attribution; (3) N/A-justification "(resolved monthly S96)" over-claim — ERD-debt §16+ CÒN pending (root CLAUDE.md), chỉ "(55)" resolved → **fact-claim trong N/A-note verify như content**. Bịa=0 ("S49" vượt-verbatim nhưng TRUE — chéo reviewer `_INDEX.md:28`); đảo-nghĩa=0 ("suýt" giữ ×2); drop-oan=0; 3 self-flag honesty NGUYÊN; pointer 10/10 unique+đúng-entry. Lesson: gist-metadata + số-tự-tính + drop-justification = 3 bề mặt lỗi máy token-coverage mù. Return Verdict-header dòng-1, 0 garble.
|
||||||
|
- **2026-07-12 (S111 H22 WAL session-continuity adopt cổng-cuối, working-tree + 2 commit `wal:`) `[engine: fable-real-single · Fable-S111]`:** **PASS_WITH_FIXES** (0C/1M/~7m). Fault-inject cây tạm 2 ca PASS (1-path-vắng → commit 2-path-còn exit-0, không nuốt ngoài-whitelist; 0-delta im lặng — bịt đúng nhánh lead chỉ "quan sát tự nhiên"). CATCH M-duy-nhất: engine CAVEAT còn "STAGED-until-verified" trong khi N.3 CÙNG FILE đã nâng VERIFIED-RUNTIME — lớp lỗi **nâng-nấc-quên-sync-câu-cũ cùng-diff**. Lesson mới: (1) **live-witness > forensics > lời-khai** — commit `67be443` sinh GIỮA lúc mình đang review (status→diff lệch 3 path) = tự chứng kiến hook fire, không cần tin claim; (2) **NTFS CreationTime × commit-time phân định script-RUN-tay vs hook-FIRE** — commit 11:05:39 rơi GIỮA cửa sổ worker-write (ps1 :32 → pause.md :48) → không thể là tay; (3) WAL `updated:` lead tay-ghi đi TRƯỚC commit-time 47-61' → field máy-đọc phải sinh từ `Get-Date` thật, không ước — false-positive cảnh-báo phiên-song-song /tiep; (4) PATH 3-context data-point: PS-của-mình trả Git-Bash (spawn từ bash, env-inherit) ≠ lead đo WSL-system32 — KHÔNG mâu thuẫn, càng chứng exec-env bất-định → PS1 path-independent đứng. Return verdict-header dòng-1.
|
||||||
- **2026-07-11 (S110 H21+MTv3 adopt cổng-cuối, uncommitted 13-file) `[fable-real-single]`:** **PASS_WITH_FIXES** (0C/5M/~9m). Sàn-5-điểm + 4-note a-d + MTv3-4-vế ĐỦ trên bề mặt chính (2 command + 0.5b/0.6 + engine K.E); X1 hmw nguyên; marker xóa; X8 sạch (mọi "code-enforced" negated). CATCH: (1) worker đổi-fact khi reword — fable-clone:33 "VALID_ROLES nhận cả 12 vai" nhưng hmw.js:22-28 = **10** (engine K.C nói đúng 10) → **claim-về-code trong doc phải grep code lại kể cả khi chỉ reword**; (2) roster-12 promise × VALID_ROLES-10 → lệnh-B 2 vai monitor degrade DEFAULT-subagent silent (hmw.js:104 fail-soft, mất persona+memory-pack) — floor mới EXPOSE edge code cũ mà H19 2-vai-cố-định che khuất; (3) point-edit sót cụm GIỮA-section: runbook §5.1 P5 "EXCLUDED all-but-2" đối đầu P0-mới roster-12 CÙNG checklist; §4.2 fixed nhưng mirror §3.2/§3.3 MISS (asymmetric-mirror-edit); §2.5 q1/q3+bảng marker nguyên un-🧊; (4) 3 supersede-note trỏ 2 adap-report CHƯA tạo = dangling-pointer + outward chưa qua gate. Lesson: sweep hậu-supersede phải đi theo CONCEPT-cluster từng section — acceptance token-hẹp ("Test-Path ngoài 🧊 = 0") PASS trong khi semantics cũ còn nguyên cụm. #53 garble lượt return (status-line thay verdict) → coordinator re-emit request trong-session = recover OK, diary ghi trước re-emit.
|
- **2026-07-11 (S110 H21+MTv3 adopt cổng-cuối, uncommitted 13-file) `[fable-real-single]`:** **PASS_WITH_FIXES** (0C/5M/~9m). Sàn-5-điểm + 4-note a-d + MTv3-4-vế ĐỦ trên bề mặt chính (2 command + 0.5b/0.6 + engine K.E); X1 hmw nguyên; marker xóa; X8 sạch (mọi "code-enforced" negated). CATCH: (1) worker đổi-fact khi reword — fable-clone:33 "VALID_ROLES nhận cả 12 vai" nhưng hmw.js:22-28 = **10** (engine K.C nói đúng 10) → **claim-về-code trong doc phải grep code lại kể cả khi chỉ reword**; (2) roster-12 promise × VALID_ROLES-10 → lệnh-B 2 vai monitor degrade DEFAULT-subagent silent (hmw.js:104 fail-soft, mất persona+memory-pack) — floor mới EXPOSE edge code cũ mà H19 2-vai-cố-định che khuất; (3) point-edit sót cụm GIỮA-section: runbook §5.1 P5 "EXCLUDED all-but-2" đối đầu P0-mới roster-12 CÙNG checklist; §4.2 fixed nhưng mirror §3.2/§3.3 MISS (asymmetric-mirror-edit); §2.5 q1/q3+bảng marker nguyên un-🧊; (4) 3 supersede-note trỏ 2 adap-report CHƯA tạo = dangling-pointer + outward chưa qua gate. Lesson: sweep hậu-supersede phải đi theo CONCEPT-cluster từng section — acceptance token-hẹp ("Test-Path ngoài 🧊 = 0") PASS trong khi semantics cũ còn nguyên cụm. #53 garble lượt return (status-line thay verdict) → coordinator re-emit request trong-session = recover OK, diary ghi trước re-emit.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
47
.claude/commands/pause.md
Normal file
47
.claude/commands/pause.md
Normal 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).
|
||||||
@ -108,6 +108,12 @@ Plan cha: [tên]
|
|||||||
|
|
||||||
## Phase 5 — COMMIT (release)
|
## 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
|
### 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.
|
- 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)
|
- 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ì.
|
- 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)".
|
- 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).
|
**Trigger sau Phase 6:** Session đóng. Working memory có thể `/clear` an toàn (persistent memory đã flush + commit + push).
|
||||||
|
|||||||
@ -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).
|
**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)
|
## Phase 1 — READ (load context)
|
||||||
|
|
||||||
Đọc theo thứ tự, KHÔNG skip:
|
Đọc theo thứ tự, KHÔNG skip:
|
||||||
|
|||||||
42
.claude/commands/tiep.md
Normal file
42
.claude/commands/tiep.md
Normal 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).
|
||||||
@ -17,6 +17,7 @@
|
|||||||
| `RC-pqhuy1987-20-06-2026-10-29-11` | `rules.md §6.6 DM-time/age` (≙ §F4.2-ext / H-14) | **Mở-rộng mark-1** — time/age/recency-decay = **false-proxy** (cùng-họ team-size); kiến-trúc KHÔNG dựa cũ / lâu-chưa-dùng / auto-decay; trần budget=(dung-lượng÷tốc-độ-thay-mới) KHÔNG núm-decay-tuổi, drift=đường-nền-cuộn KHÔNG cửa-sổ-tuổi; **additive** (mark-1 GIỮ) | **pain:** cap∝chunk_count = Goodhart-vanity + age-window drift = alarm-spam (sự-cố thật H-14); SE memory-budget từng dễ mắc "giảm-theo-độ-cũ" · **volume:** 6 dự-án áp budget/drift/eval + SE L1/L2/L3 + archive-gate · **quality:** age-decay cắt memory-tốt = false-economy (DM-004 Goodhart §6.6) | null (additive) | 🔖 **Active-High** (anh-confirm S79 via `/user-mark-active-high` · P4 DACI · supersedes:null) |
|
| `RC-pqhuy1987-20-06-2026-10-29-11` | `rules.md §6.6 DM-time/age` (≙ §F4.2-ext / H-14) | **Mở-rộng mark-1** — time/age/recency-decay = **false-proxy** (cùng-họ team-size); kiến-trúc KHÔNG dựa cũ / lâu-chưa-dùng / auto-decay; trần budget=(dung-lượng÷tốc-độ-thay-mới) KHÔNG núm-decay-tuổi, drift=đường-nền-cuộn KHÔNG cửa-sổ-tuổi; **additive** (mark-1 GIỮ) | **pain:** cap∝chunk_count = Goodhart-vanity + age-window drift = alarm-spam (sự-cố thật H-14); SE memory-budget từng dễ mắc "giảm-theo-độ-cũ" · **volume:** 6 dự-án áp budget/drift/eval + SE L1/L2/L3 + archive-gate · **quality:** age-decay cắt memory-tốt = false-economy (DM-004 Goodhart §6.6) | null (additive) | 🔖 **Active-High** (anh-confirm S79 via `/user-mark-active-high` · P4 DACI · supersedes:null) |
|
||||||
| `RC-pqhuy1987-20-06-2026-23-07-37` | `harness-11-engine.md §G` + `memory-budget.json` + `rules.md §6.6` (≙ AI_INFRA H-15) | **H-15 memory-budget per-agent (token-based):** token-governor (**v3 §G.5 S83:** Tầng-1 hot-feed per-role **lead 380K (v4 §G.5 S94 owner-override, SE-specific để chứa full read-set ~368K — lead KHÔNG còn AI_INFRA-parity)/mem-sub 60K/wf-sub 50K** (subs giữ parity) + **spawn-fill-to-budget** (sub Tầng-1 = MEMORY.md byte-cap + spawn-prompt giàu, `spawn_fill_directive`); **v2 §G.4 S82:** L2/L3 **bỏ-trần** on-demand + báo-% 2-đầu-phiên; con-số = **quyền CHỦ-DỰ-ÁN/anh** + AI thực-thi-đúng-số + báo-%) + **value-gated archival** (giữ recurring-bug/anti-pattern/gotcha bất-kể tuổi) + fill-L1-full (budget = sàn-tận-dụng KHÔNG trần-tiết-kiệm) + work-state-block @session-start + %-print 2-đầu-phiên + 2-governor (byte⟂token) | **pain:** tiết-kiệm-token → quên-việc/rơi-trạng-thái giữa phiên (sự-cố thật — Tầng-1 mỏng = lead quên việc nhiều phiên, bằng-chứng v2); SE keep-floor age-based có thể archive gotcha cũ ra khỏi L1 — value-gate FLAG đã bắt thật (test-specialist gotcha#/guard) · **volume:** 11-agent × (SÀN 30K + Tầng-1 hot-feed per-role lead 220K/mem-sub 60K/wf-sub 50K, v3 §G.5 full-parity) always-load/spawn + L2 archive ~240KB (cicd 194KB) cần value-protect · **quality:** quên-việc → làm-lại → tốn-hơn (Goodhart); giữ hard-won lessons | null (additive — mark `…11` GIỮ; H-15 mở-rộng value-axis xuống tầng-bộ-nhớ) | 🔖 **Active-High** (anh-confirm S81 · **v2-delta anh-confirm S82** `RC-pqhuy1987-21-06-2026-01-58-01` — hot-feed-lớn/bỏ-trần/anh-authority · **v3-delta anh-directed S83** `RC-pqhuy1987-22-06-2026-16-35-37` — full-parity 220/60/50 + spawn-fill-to-budget · **v4-delta anh-directed S94** `RC-pqhuy1987-29-06-2026-23-25-50` — lead 220K→**380K** SE-override để chứa full read-set ~368K (⚠️ ~97% fill = context-rot trade-off owner-accepted; trần budget ⟂ harness Read-25K/call → mega-line STATUS/HANDOFF VẪN cần re-tier mới Read-trọn), P4 DACI report-before-stamp ✓) |
|
| `RC-pqhuy1987-20-06-2026-23-07-37` | `harness-11-engine.md §G` + `memory-budget.json` + `rules.md §6.6` (≙ AI_INFRA H-15) | **H-15 memory-budget per-agent (token-based):** token-governor (**v3 §G.5 S83:** Tầng-1 hot-feed per-role **lead 380K (v4 §G.5 S94 owner-override, SE-specific để chứa full read-set ~368K — lead KHÔNG còn AI_INFRA-parity)/mem-sub 60K/wf-sub 50K** (subs giữ parity) + **spawn-fill-to-budget** (sub Tầng-1 = MEMORY.md byte-cap + spawn-prompt giàu, `spawn_fill_directive`); **v2 §G.4 S82:** L2/L3 **bỏ-trần** on-demand + báo-% 2-đầu-phiên; con-số = **quyền CHỦ-DỰ-ÁN/anh** + AI thực-thi-đúng-số + báo-%) + **value-gated archival** (giữ recurring-bug/anti-pattern/gotcha bất-kể tuổi) + fill-L1-full (budget = sàn-tận-dụng KHÔNG trần-tiết-kiệm) + work-state-block @session-start + %-print 2-đầu-phiên + 2-governor (byte⟂token) | **pain:** tiết-kiệm-token → quên-việc/rơi-trạng-thái giữa phiên (sự-cố thật — Tầng-1 mỏng = lead quên việc nhiều phiên, bằng-chứng v2); SE keep-floor age-based có thể archive gotcha cũ ra khỏi L1 — value-gate FLAG đã bắt thật (test-specialist gotcha#/guard) · **volume:** 11-agent × (SÀN 30K + Tầng-1 hot-feed per-role lead 220K/mem-sub 60K/wf-sub 50K, v3 §G.5 full-parity) always-load/spawn + L2 archive ~240KB (cicd 194KB) cần value-protect · **quality:** quên-việc → làm-lại → tốn-hơn (Goodhart); giữ hard-won lessons | null (additive — mark `…11` GIỮ; H-15 mở-rộng value-axis xuống tầng-bộ-nhớ) | 🔖 **Active-High** (anh-confirm S81 · **v2-delta anh-confirm S82** `RC-pqhuy1987-21-06-2026-01-58-01` — hot-feed-lớn/bỏ-trần/anh-authority · **v3-delta anh-directed S83** `RC-pqhuy1987-22-06-2026-16-35-37` — full-parity 220/60/50 + spawn-fill-to-budget · **v4-delta anh-directed S94** `RC-pqhuy1987-29-06-2026-23-25-50` — lead 220K→**380K** SE-override để chứa full read-set ~368K (⚠️ ~97% fill = context-rot trade-off owner-accepted; trần budget ⟂ harness Read-25K/call → mega-line STATUS/HANDOFF VẪN cần re-tier mới Read-trọn), P4 DACI report-before-stamp ✓) |
|
||||||
| `RC-pqhuy1987-11-07-2026-20-42-01` | `harness-11-engine.md §K.E` + `.claude/commands/fable-{real,clone}.md` + `session-start BƯỚC 0.5b/0.6` (≙ AI_INFRA H-21 + model-tier-v3) | **H-21 engine-đắt PER-INVOCATION + spec-file kết-tinh + MTv3 lead owner-choice** (supersede-partial H19). **Sàn:** (1) engine-đắt CHỈ chạy trong lượt anh gõ `/fable-real\|/fable-clone <vai> <đề-bài>` — vai anh gán đích-danh ∈ roster 12, thiếu/sai → hỏi anh, lead KHÔNG tự ý (kể cả HMW-ON) · (2) mỗi run sinh **spec-file 3-mục** (engine propose → lead verify → LEAD ghi → worker hạng-hai thực thi theo spec, kể cả run chấm/verify) · (3) lead = **frontier-class do anh chọn per-session** {Fable 5 \| Opus 4.8 — 1M MAX}, CẤM Sonnet/Haiku-class ghế lead; owner-chọn-hạng-hai ≠ outage (0 caveat/0 revert-nghĩa-vụ), outage đóng → hỏi anh ĐÚNG 1 dòng · (4) 4 ghi-chú trung-thực a-d giữ nguyên nấc (owner-gated + kỷ-luật, KHÔNG code-enforced). K.C 3 GAP-guard + định-nghĩa 2 engine GIỮ từ H19 | **pain:** "quyết-theo-từng-tác-vụ dễ quên hạ-tầng" (kế thừa H19) + cách-làm bay hơi trong prompt → spec-file kết tinh git-tracked (sự-cố thật hub) + flip-chain dán nhãn outage khi thật ra owner-choice · **volume:** mọi lượt engine-đắt × 12 vai × 2 lệnh + BƯỚC 0.6 mỗi phiên + worker-pipeline theo spec · **quality:** audit-trail spec qua git + owner-gated chống auto-elevate + reviewer-Fable dogfood run-1 bắt 5 Major thật (M1 worker-đổi-fact · M2 boundary-gap → VALID_ROLES 12) | `RC-pqhuy1987-03-07-2026-17-46-35` (partial — floor-point 1/2 + marker-toggle; K.C + 2-engine GIỮ) | 🔖 **Active-High** (anh-confirm S110 via AskUserQuestion "Stamp mark MỚI thay mark cũ" · P4 report-before-stamp: `/check-email`→invest-Fable→spec→WF `wf_0c3b307f-a64`→reviewer-Fable PASS_WITH_FIXES→fix→present→confirm→stamp) |
|
| `RC-pqhuy1987-11-07-2026-20-42-01` | `harness-11-engine.md §K.E` + `.claude/commands/fable-{real,clone}.md` + `session-start BƯỚC 0.5b/0.6` (≙ AI_INFRA H-21 + model-tier-v3) | **H-21 engine-đắt PER-INVOCATION + spec-file kết-tinh + MTv3 lead owner-choice** (supersede-partial H19). **Sàn:** (1) engine-đắt CHỈ chạy trong lượt anh gõ `/fable-real\|/fable-clone <vai> <đề-bài>` — vai anh gán đích-danh ∈ roster 12, thiếu/sai → hỏi anh, lead KHÔNG tự ý (kể cả HMW-ON) · (2) mỗi run sinh **spec-file 3-mục** (engine propose → lead verify → LEAD ghi → worker hạng-hai thực thi theo spec, kể cả run chấm/verify) · (3) lead = **frontier-class do anh chọn per-session** {Fable 5 \| Opus 4.8 — 1M MAX}, CẤM Sonnet/Haiku-class ghế lead; owner-chọn-hạng-hai ≠ outage (0 caveat/0 revert-nghĩa-vụ), outage đóng → hỏi anh ĐÚNG 1 dòng · (4) 4 ghi-chú trung-thực a-d giữ nguyên nấc (owner-gated + kỷ-luật, KHÔNG code-enforced). K.C 3 GAP-guard + định-nghĩa 2 engine GIỮ từ H19 | **pain:** "quyết-theo-từng-tác-vụ dễ quên hạ-tầng" (kế thừa H19) + cách-làm bay hơi trong prompt → spec-file kết tinh git-tracked (sự-cố thật hub) + flip-chain dán nhãn outage khi thật ra owner-choice · **volume:** mọi lượt engine-đắt × 12 vai × 2 lệnh + BƯỚC 0.6 mỗi phiên + worker-pipeline theo spec · **quality:** audit-trail spec qua git + owner-gated chống auto-elevate + reviewer-Fable dogfood run-1 bắt 5 Major thật (M1 worker-đổi-fact · M2 boundary-gap → VALID_ROLES 12) | `RC-pqhuy1987-03-07-2026-17-46-35` (partial — floor-point 1/2 + marker-toggle; K.C + 2-engine GIỮ) | 🔖 **Active-High** (anh-confirm S110 via AskUserQuestion "Stamp mark MỚI thay mark cũ" · P4 report-before-stamp: `/check-email`→invest-Fable→spec→WF `wf_0c3b307f-a64`→reviewer-Fable PASS_WITH_FIXES→fix→present→confirm→stamp) |
|
||||||
|
| `RC-pqhuy1987-12-07-2026-11-43-45` | `engine PHẦN N` + `.claude/hooks/wal-flush.ps1` + `.claude/settings.json hooks` + `session-start BƯỚC 0.7` / `session-end §5.0+§6.4` + `commands/pause·tiep` + `workflows/README FLIP-policy` (≙ AI_INFRA H-22 CANONICAL §I4 + §H1) | **H-22 WAL session-continuity.** **Sàn:** (1) sổ `.claude/WAL.md` ≤40 dòng ghi-đè-không-append (chain-bằng-chứng + next + verify-trước-next, ground-truth thắng, cấm secret; detector C5 bắt >40) · (2) hai tầng ghi: lead single-writer nội-dung ⟂ Stop-hook `wal-flush.ps1` persist-only (per-path+CAND+exit-0; ĐƯỢC add+commit 3-path `wal:` / KHÔNG content·push·block·path-ngoài) · (3) MỘT đường recovery `/tiep` (+`/pause` chốt dừng; CẤM transcript; wf: = relaunch-cắt-gọt + pack-re-derive; resume-run-id = same-session-only) · (4) delta mở/đóng: BƯỚC 0.7 WAL-check (ngoại-lệ CHỜ duy-nhất) + §5.0 squash `wal:`-trailing chưa-push (KHÔNG rewrite đã-push) + §6.4 reset cuối · (5) run ≥3-task HOẶC >5' = BẮT BUỘC RUN-TRACE per-agent-file + taskList-snapshot + dòng `wf:` 5-trường. Commit `wal:` = ngoại-lệ DUY-NHẤT format `[CLAUDE]` (rules §5.2) | **pain:** phiên chết giữa mạch = mất trí-nhớ chưa-ghi + đốt-lại token (sự-cố thật SE: WF2 S101 MẤT theo CLI-restart phải re-run · diary transcript-lost ×2 S110 · W3 return-truncate NGAY run adopt này — per-agent-file cứu) · **volume:** MỌI phiên (BƯỚC 0.7 + §5.0/§6.4) × mọi workflow ≥3-task × 3-path memory/run trên đĩa · **quality:** hook-FIRE VERIFIED-RUNTIME ×2 (`12071c5`/`67be443` — reviewer refute 3-hướng forensics NTFS×git đều GÃY) + fault-inject 2-ca PASS + persist deterministic thay kỷ-luật-nhớ-tay (vá đúng root-cause sổ-tay-chết); ENV-DEPENDENT hot-reload khai đúng nấc, STAGED-until-verified giữ làm nguyên-tắc hook tương-lai | null (additive) | 🔖 **Active-High** (anh-confirm S111 via AskUserQuestion "Stamp Active-High" · P4 report-before-stamp: `/check-email`→invest-Fable READY_WITH_NUANCES 14N→spec lead-3-chỉnh→WF `wf_5ba3daf6-fe0` 3-Opus RUN-TRACE→reviewer-Fable PASS_WITH_FIXES 0C·1M·7m→fix 8/8→present→confirm→stamp; D10 paths-ignore anh-directed cùng lượt) |
|
||||||
|
|
||||||
## 🟢 ACTIVE (follow + nhắc-lại xuyên-suốt — HIỆN @session)
|
## 🟢 ACTIVE (follow + nhắc-lại xuyên-suốt — HIỆN @session)
|
||||||
_(trống)_
|
_(trống)_
|
||||||
|
|||||||
19
.claude/hooks/wal-flush.ps1
Normal file
19
.claude/hooks/wal-flush.ps1
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# wal-flush.ps1 - WAL persist-only Stop hook (H22 S111). KHONG sinh noi dung, KHONG push, KHONG block.
|
||||||
|
# Fail-open MOI nhanh: exit 0 ke ca loi (Stop-hook exit!=0 co hanh vi rieng - CAM).
|
||||||
|
# Per-path add + CAND commit (X3: add/commit da-pathspec = all-or-nothing khi 1 path vang).
|
||||||
|
try {
|
||||||
|
$root = if ($env:CLAUDE_PROJECT_DIR) { $env:CLAUDE_PROJECT_DIR } else { "." }
|
||||||
|
Set-Location $root
|
||||||
|
$paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/")
|
||||||
|
$cand = @()
|
||||||
|
foreach ($p in $paths) {
|
||||||
|
git add -- $p 2>$null
|
||||||
|
git diff --cached --quiet -- $p 2>$null
|
||||||
|
if ($LASTEXITCODE -ne 0) { $cand += $p }
|
||||||
|
}
|
||||||
|
if ($cand.Count -gt 0) {
|
||||||
|
$ts = Get-Date -Format "yyyyMMddTHHmm"
|
||||||
|
git commit -q -m "wal: flush $ts" -- $cand 2>$null | Out-Null
|
||||||
|
}
|
||||||
|
} catch { }
|
||||||
|
exit 0
|
||||||
14
.claude/settings.json
Normal file
14
.claude/settings.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"hooks": {
|
||||||
|
"Stop": [
|
||||||
|
{
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -23,12 +23,13 @@ Phân biệt RAW (prefix `sub-`) vs VERIFIED (suffix `-synthesis.md`) bằng **T
|
|||||||
|
|
||||||
| | DEFAULT return-delta-only (§J4) | RUN-TRACE mode (§J6) |
|
| | DEFAULT return-delta-only (§J4) | RUN-TRACE mode (§J6) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Khi dùng | fan-out NHẸ (~2-3 phút, read/analyze — vd recon) | workflow DÀI / sinh nhiều detail / cần audit-trail |
|
| Khi dùng | fan-out NHỎ (<3 task **VÀ** ước ≤5 phút; read/analyze — vd recon) | workflow DÀI / sinh nhiều detail / cần audit-trail |
|
||||||
|
| Bắt buộc? (sàn H22 S111) | mode-A hợp lệ cho fan-out NHỎ | **BẮT BUỘC khi run ≥3 task HOẶC ước chạy >5 phút** (`args.run` → per-agent-file `sub-<role>-<i>.md`) |
|
||||||
| Sub ghi file? | KHÔNG — chỉ return `memoryDelta` + `findings` | write-sub GHI full-detail vào `runs/<run-id>/sub-<role>-<i>.md` (phẳng); read-only sub → `findings` + `subMdPath` → em main scribe |
|
| Sub ghi file? | KHÔNG — chỉ return `memoryDelta` + `findings` | write-sub GHI full-detail vào `runs/<run-id>/sub-<role>-<i>.md` (phẳng); read-only sub → `findings` + `subMdPath` → em main scribe |
|
||||||
| Lead làm | VERIFY + APPEND @P3 (B3) | đọc `sub-<role>-<i>.md` on-demand + ghi `<stage>-synthesis.md` per-turn (C4) + H2 gom @session-end (B5, backstop) |
|
| Lead làm | VERIFY + APPEND @P3 (B3) | đọc `sub-<role>-<i>.md` on-demand + ghi `<stage>-synthesis.md` per-turn (C4) + H2 gom @session-end (B5, backstop) |
|
||||||
| Rủi ro mất detail | có (delta lossy) — chấp nhận cho việc nhẹ | KHÔNG (full-detail giữ trong run-folder tracked) |
|
| Rủi ro mất detail | có (delta lossy) — chấp nhận cho việc nhẹ | KHÔNG (full-detail giữ trong run-folder tracked) |
|
||||||
|
|
||||||
> Mặc định DEFAULT. RUN-TRACE chỉ bật khi workflow dài/nhiều detail/cần dấu-vết (set `args.run = {name, dir}`). KHÔNG bắt mọi fan-out tạo run-folder.
|
> **Sàn H22 (S111) — FLIP policy:** mode-A return-delta-only VẪN hợp lệ cho fan-out NHỎ, NHƯNG **run ≥3 task HOẶC ước chạy >5 phút = BẮT BUỘC RUN-TRACE mode** (`args.run` → per-agent-file `sub-<role>-<i>.md` trong run-folder). Lý-do: chết giữa run vẫn còn vật-liệu trên đĩa để `/tiep` nối lại — **per-TURN ≠ per-TASK: returns mất khi chết giữa turn, nhưng file trên disk còn**. Fan-out NHỎ dưới ngưỡng → DEFAULT return-delta-only vẫn OK (KHÔNG bắt MỌI fan-out tạo run-folder).
|
||||||
|
|
||||||
## Quy trình RUN-TRACE (B1–B6)
|
## Quy trình RUN-TRACE (B1–B6)
|
||||||
1. **B3 SCAFFOLD TRƯỚC (em main @P1):** tạo `runs/<run-id>/` + `run.md` (FLAT — KHÔNG cần `sub-md/`/`harvest/` subfolder hay `.gitkeep`; file `sub-*`/`*-synthesis.md` sinh phẳng cùng cấp khi fan-out chạy). *(🧊 bước "ghi OPEN-beat vào `runs/_ledger.md`" retired H18-B S100 — orphan-authority = folder-scan.)* ⚠️ `hmw.js` chạy JS-sandbox **no-filesystem** → KHÔNG tự tạo folder; **em main Write @P1** TRƯỚC khi invoke Workflow. (Đây là fragile-point — quên scaffold = run mất dấu-vết âm-thầm; xem `runs/README.md` §C7.)
|
1. **B3 SCAFFOLD TRƯỚC (em main @P1):** tạo `runs/<run-id>/` + `run.md` (FLAT — KHÔNG cần `sub-md/`/`harvest/` subfolder hay `.gitkeep`; file `sub-*`/`*-synthesis.md` sinh phẳng cùng cấp khi fan-out chạy). *(🧊 bước "ghi OPEN-beat vào `runs/_ledger.md`" retired H18-B S100 — orphan-authority = folder-scan.)* ⚠️ `hmw.js` chạy JS-sandbox **no-filesystem** → KHÔNG tự tạo folder; **em main Write @P1** TRƯỚC khi invoke Workflow. (Đây là fragile-point — quên scaffold = run mất dấu-vết âm-thầm; xem `runs/README.md` §C7.)
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
name: 'hmw',
|
name: 'hmw',
|
||||||
description: 'HMW P2 execute (SOLUTION_ERP) — fan-out 9-agent roster có MEMORY-PACK slice (qua args vì script không đọc file) + return findings + checklistEvidence + memoryDelta (spawn-record 4-field). 2 MODE (Harness 2, 06-07): (A) DEFAULT return-delta-only — fan-out nhẹ, sub KHÔNG ghi file, git-diff verify. (B) RUN-TRACE mode (args.run, Harness-10) — workflow DÀI, em main scaffold .claude/workflows/runs/<run-id>/ TRACKED FLAT (run.md + sub-<role>-<i>.md + <stage>-synthesis.md phẳng cùng cấp) @P1, sub ghi full-detail vào CHỈ sub-<role>-<i>.md mình (B4/B6), harvest per-turn primary (C4) + H2 gom @session-end = backstop verify-idempotent. taskList thoải mái (queue theo slot, không cap cứng). memoryDelta KHÔNG tự ghi — em main VERIFY + APPEND-only @P3 (no-overwrite-unverified, B3). Model H8 all-inherit (Harness-8 2026-06-16): role-có-frontmatter inherit top-tier lead · role-less inherit · per-task tier:\'fable\'|\'opus\' escape-hatch. Scope = repo SOLUTION_ERP ONLY (S1 — KHÔNG fan-out repo/corpus khác).',
|
description: 'HMW P2 execute (SOLUTION_ERP) — fan-out 9-agent roster có MEMORY-PACK slice (qua args vì script không đọc file) + return findings + checklistEvidence + memoryDelta (spawn-record 4-field). 2 MODE (Harness 2, 06-07): (A) DEFAULT return-delta-only — fan-out NHỎ (<3 task VÀ ≤5 phút), sub KHÔNG ghi file, git-diff verify. (B) RUN-TRACE mode (args.run, Harness-10) — 🔴 BẮT BUỘC khi run ≥3 task HOẶC ước >5 phút (sàn H22 S111; script no-fs KHÔNG tự ép — enforcement = em-main scaffold @P1 + set args.run) — workflow DÀI, em main scaffold .claude/workflows/runs/<run-id>/ TRACKED FLAT (run.md + sub-<role>-<i>.md + <stage>-synthesis.md phẳng cùng cấp) @P1, sub ghi full-detail vào CHỈ sub-<role>-<i>.md mình (B4/B6), harvest per-turn primary (C4) + H2 gom @session-end = backstop verify-idempotent. taskList thoải mái (queue theo slot, không cap cứng). memoryDelta KHÔNG tự ghi — em main VERIFY + APPEND-only @P3 (no-overwrite-unverified, B3). Model H8 all-inherit (Harness-8 2026-06-16): role-có-frontmatter inherit top-tier lead · role-less inherit · per-task tier:\'fable\'|\'opus\' escape-hatch. Scope = repo SOLUTION_ERP ONLY (S1 — KHÔNG fan-out repo/corpus khác).',
|
||||||
phases: [{ title: 'Execute', detail: 'fan-out memory-pack-injected agents, structured return' }],
|
phases: [{ title: 'Execute', detail: 'fan-out memory-pack-injected agents, structured return' }],
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ export const meta = {
|
|||||||
// spec: '<acceptance-criteria / context chung>',
|
// spec: '<acceptance-criteria / context chung>',
|
||||||
// checkpointApproved: true, // em main set SAU khi BÁO {số agent·vai·task} @inform (S2)
|
// checkpointApproved: true, // em main set SAU khi BÁO {số agent·vai·task} @inform (S2)
|
||||||
// taskList: [ { role:<VALID_ROLES|null>, label:'..', prompt:'..', tier:'fable'|'opus'? }, ... ] // tier = per-task model override (H4.5)
|
// taskList: [ { role:<VALID_ROLES|null>, label:'..', prompt:'..', tier:'fable'|'opus'? }, ... ] // tier = per-task model override (H4.5)
|
||||||
// run: { name:'<run-id>', dir:'.claude/workflows/runs/<run-id>' } // OPTIONAL — bật RUN-TRACE mode (B, Harness-10 TRACKED). Folder + run.md em main ĐÃ scaffold @P1 (script no-fs). [legacy alias: args.wave]
|
// run: { name:'<run-id>', dir:'.claude/workflows/runs/<run-id>' } // 🔴 BẮT BUỘC khi run ≥3 task HOẶC ước >5 phút (sàn H22 S111 — chết giữa run còn vật-liệu đĩa cho /tiep; dưới ngưỡng = tùy chọn) — bật RUN-TRACE mode (B, Harness-10 TRACKED). Folder + run.md em main ĐÃ scaffold @P1 (script no-fs). [legacy alias: args.wave]
|
||||||
// }
|
// }
|
||||||
|
|
||||||
const VALID_ROLES = [
|
const VALID_ROLES = [
|
||||||
|
|||||||
@ -0,0 +1,19 @@
|
|||||||
|
# implement-synthesis — 2026-07-12-h22-wal-adopt (S111, WF `wf_5ba3daf6-fe0`)
|
||||||
|
|
||||||
|
> Lead verified per-turn (C4). 3/3 worker Opus DONE · 0 error · 0 empty · ~322K tok · 7.8'. Git-diff P3: **residual 0** — mọi file M/?? accounted (3 lane + em-main + broadcasts pull). Raw: `sub-task-0/1/2.md` cùng cấp.
|
||||||
|
|
||||||
|
## Verdict per-lane (lead re-verify độc lập trên disk)
|
||||||
|
|
||||||
|
- **W1 `w1-pause-tiep` — PASS 10/10 acceptance.** `pause.md` 47L + `tiep.md` 42L, port trung thực §4+§6 (fidelity-map từng bước → dòng-nguồn trong sub-task-0.md); né X4 (không kéo squash vào /pause) + X5 (không nhắc hook trong commit thủ-công). ⚡ Hệ đăng-ký skill `/pause`+`/tiep` NGAY giữa phiên (system-reminder) — data-point hot-reload #1b; hiệu-lực đầy-đủ verify phiên mới.
|
||||||
|
- **W2 `w2-session-cmds` — PASS pure-insert 3 điểm.** session-start +9 (BƯỚC 0.7 @47-54, sau 0.6 trước Phase-1, "CHỜ anh chọn" = ngoại-lệ duy-nhất, con-trỏ tiep.md B1) · session-end +10 (§5.0 @111 squash `origin/main..HEAD` + biên push-chết + review-diff wal-paths AS-10; §6.4 @143 reset-WAL trước footer). Deletion-check `^-[^-]` = 0 (insert-only, 0.5/0.5b/0.6 untouched).
|
||||||
|
- **W3 `w3-hook-readme` — PASS (lead verify disk — return bị notification-truncate, vô hại).** `wal-flush.ps1` 20L đúng skeleton ASCII (per-path add + CAND + try/catch + exit 0; 0 push/content/block) · workflows/README flip-policy đúng sàn (+bảng row "Bắt buộc?"; mode-A nhỏ vẫn hợp lệ) · runs/README +11 section taskList-snapshot (điều-kiện áp + wf: 5-trường + X6 memory-pack-re-derive).
|
||||||
|
|
||||||
|
## ⚡ Finding vượt kỳ vọng (lead, sau WF)
|
||||||
|
|
||||||
|
**Hook-FIRE VERIFIED-RUNTIME CÙNG PHIÊN** — `12071c5 "wal: flush 20260712T1105"` fire ở Stop cuối turn lead (TRƯỚC cả khi WF xong), chứa đúng 4 file 3-path, CAND chuẩn, không push. Broadcast honest-(c) giả định "hook chỉ nạp lúc khởi-động phiên" → trên harness NÀY = hot-reload (ENV-DEPENDENT, không fleet-generalize — triage-S5 lesson). Hệ quả: row #6 "chạy tay 2 ca" THỪA (bằng chứng mạnh hơn đã có); ca-2 (0-delta exit-0 im lặng) quan sát tự nhiên các turn sau.
|
||||||
|
|
||||||
|
## memoryDelta harvest (3 worker role-less → nhà = synthesis này, run-trace pattern; C4 per-turn)
|
||||||
|
|
||||||
|
- **W1:** task=D3 port 2 command /pause /tiep · verdict=PASS 10/10, isolation sạch · learned=port command từ broadcast: map TỪNG bước→dòng-nguồn (fidelity table) + né dead-end bằng chỉ-viết-phần-được-giao (không kéo §5 vào /pause = né X4) · surprise=skill-registry đăng-ký /pause /tiep NGAY sau Write (hot-reload); git-status lộ ~13 file sibling-task — worker phải tự phân-định scope mình vs sibling tránh em-main hiểu nhầm.
|
||||||
|
- **W2:** task=D4+D5 point-insert BƯỚC 0.7 + §5.0/§6.4 · verdict=PASS 3+4 acceptance, insert-only 0-deletion · learned=point-insert giữ số cũ (X10) + grep-acceptance đếm được ngay trong return; "origin/main..HEAD" chỉ xuất hiện 1 lần literal (dòng lệnh) — reword phần prose tránh double-count · surprise=footer session-end phải đứng SAU §6.4 (reset = bước cuối THẬT — vị trí footer là ranh giới ngữ nghĩa, không chỉ cosmetic).
|
||||||
|
- **W3:** task=D2 PS1-hook + D6 policy-flip 2 README · verdict=PASS (lead disk-verify) · learned=PS1 port giữ skeleton lead-verified + pure-ASCII comment (#30); flip-policy giữ mode-A-nhỏ-hợp-lệ tránh over-mandate · surprise=(return notification-truncate — chi tiết trong sub-task-2.md; per-agent-file cứu đúng như N9 mô tả: return mất một phần, disk còn nguyên).
|
||||||
19
.claude/workflows/runs/2026-07-12-h22-wal-adopt/run.md
Normal file
19
.claude/workflows/runs/2026-07-12-h22-wal-adopt/run.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Run — 2026-07-12-h22-wal-adopt (S111)
|
||||||
|
|
||||||
|
- **Đề-bài:** Adopt Harness-22 — WAL session-continuity (sổ `.claude/WAL.md` ≤40 dòng + Stop-hook persist-only + cặp `/pause`·`/tiep` + delta mở/đóng phiên + WAL-cho-workflow relaunch-cắt-gọt). Nguồn: broadcast `2026-07-11-Governance-harness-22-wal-session-continuity` (body-sha `3de0758a6377` verified) + notify `c64a7ac2a1bb`, pulled 2026-07-12 hash 4/4 MATCH.
|
||||||
|
- **Lệnh anh (owner-gated, H21 semantic):** `/check-email AI_INFRA và /adap-apply … /fable-real invest và review - đề tài là harness mà AI_INFRA apply xuống. Sau đó hwm cho Opus 4.8 MAX xử lý. Xong thì session-end` — vai engine-đắt anh gán: `investigator-codebase` (ground-truth) + `reviewer` (cổng-cuối); worker thực thi = Opus 4.8 MAX qua HMW.
|
||||||
|
- **Spec:** [`spec-h22-wal-adopt-12-07-2026.md`](spec-h22-wal-adopt-12-07-2026.md) — engine-propose bởi investigator-codebase (Fable-real single-deep-pass, READY_WITH_NUANCES 14N, 0-garble) → lead verified + CHỈNH 3 điểm (hook PS1 path-independent [2-context PATH conflict] · row#9 node-check · gitattributes giữ) → lead ghi (single-writer, H21 note-c).
|
||||||
|
- **Pipeline:** STAGE-1 pull+verify (done) → invest-Fable (done) → spec (done) → WF implement **`wf_5ba3daf6-fe0`** 3-worker-Opus RUN-TRACE (done 3/3, 0-error ~322K tok) → em-main still-mine (row#1/#2/#8/#9 done) → reviewer-Fable cổng-cuối (next) → adap-report/email/mark → STAGE-2 move + commit + cicd → session-end.
|
||||||
|
- **Run-id workflow:** WF-implement: **`wf_5ba3daf6-fe0`** (3/3 DONE) · invest-Fable + reviewer-Fable: spawn-direct (không qua workflow).
|
||||||
|
- **First-hand pre-check (lead, trước spec):** `bash` PATH = 2-context NGƯỢC nhau (PS-context → WSL-hỏng · cmd-context → Git-Bash) → hook PS1 · `.claude/settings.json` CHƯA tồn tại (tạo mới) · `.gitattributes` ĐÃ có (append) · repo TRONG Dropbox ((e) nguyên văn).
|
||||||
|
- **⚡ Finding runtime S111:** Stop-hook **HOT-RELOAD + FIRE ngay giữa phiên** — commit `12071c5 "wal: flush 20260712T1105"` (11:05:39, KHÔNG cần restart) chứa ĐÚNG 4 file thuộc 3 path cố định (WAL.md + diary invest + run.md + spec), CAND-commit chuẩn (settings.json/broadcasts/docs đứng ngoài), không push. → **N.3 STAGED-until-verified nâng VERIFIED-RUNTIME S111 cùng phiên** (caveat ENV-DEPENDENT giữ — data-point #2 sau skill-registry hot-reload; phiên mới re-check 1 lần trong pilot).
|
||||||
|
|
||||||
|
## taskList snapshot
|
||||||
|
|
||||||
|
> (H22 — ghi trước launch; snapshot này ghi hồi-tố NGAY SAU run đầu vì chuẩn mới sinh ra TRONG chính run này — các run sau ghi TRƯỚC launch.)
|
||||||
|
|
||||||
|
| # | role | label | prompt-gist |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 0 | (role-less, tier:opus) | w1-pause-tiep | TẠO `.claude/commands/pause.md` + `tiep.md` — port broadcast §4+§6, /pause 5-bước + /tiep 4-bước + nhánh wf: relaunch-cắt-gọt |
|
||||||
|
| 1 | (role-less, tier:opus) | w2-session-cmds | EDIT session-start.md (BƯỚC 0.7 WAL-check) + session-end.md (§5.0 squash + §6.4 reset) — point-insert, no-renumber |
|
||||||
|
| 2 | (role-less, tier:opus) | w3-hook-readme | TẠO `.claude/hooks/wal-flush.ps1` (PS1-port skeleton lead-verified) + EDIT workflows/README.md flip-policy + runs/README.md taskList-snapshot template |
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
# SPEC — h22-wal-adopt — 12-07-2026 (S111)
|
||||||
|
|
||||||
|
> **Provenance (H21 note-c):** engine-propose = investigator-codebase **Fable-real single-deep-pass** (lệnh-A anh gõ `/fable-real invest và review — đề tài harness AI_INFRA apply xuống`; return SẠCH 0-garble, VERDICT `READY_WITH_NUANCES` 14 nuance N1-N14) → **lead verified + CHỈNH 3 điểm**: (1) **D2 hook = PowerShell `.ps1` variant** thay bash-nguồn — evidence xung-đột 2-context: lead đo PS-context `Get-Command bash` → `C:\WINDOWS\system32\bash.exe` WSL-HỎNG (execvpe fail) vs invest đo cmd-context `where bash` → Git-Bash đứng trước; exec-env hook thật KHÔNG xác định được trong phiên → chọn path-independent `powershell.exe` (system32, tuyệt đối); port NGUYÊN semantics sàn (per-path add + CAND commit + exit-0 mọi nhánh + 0 content/push/block); script-RUN verify tay được ngay phiên này — hook-FIRE vẫn phiên mới (N1 STAGED giữ) · (2) row #9 acceptance = `node --check` PASS (precedent S110 X7, bỏ wording mơ hồ) · (3) `.gitattributes` `*.sh text eol=lf` VẪN append (phòng-hờ .sh tương lai + fleet-parity, vô hại — repo hiện 0 file .sh) → **lead tự ghi file này** (single-writer). Worker KHÔNG tự đọc file — lead bơm nguyên văn qua args (hmw.js pattern).
|
||||||
|
|
||||||
|
## Mục 1 — Tính-năng / đề-bài
|
||||||
|
|
||||||
|
Adopt **Harness-22 WAL session-continuity** (broadcast `2026-07-11-Governance-harness-22-wal-session-continuity`, body-sha `3de0758a6377` verified): sổ `.claude/WAL.md` ≤40 dòng ghi-đè-không-append (chain-bằng-chứng `[x]/[!]/[ ]` + next 1-mệnh-lệnh + verify-trước-next, ground-truth thắng, cấm secret) · Stop-hook `.claude/hooks/wal-flush.ps1` persist-only per-path+CAND+exit-0 (**STAGED-until-verified** — hook nạp lúc khởi-động phiên, phiên này KHÔNG THỂ verify fire) + `.gitattributes` `*.sh text eol=lf` append · cặp `/pause` `/tiep` (MỘT đường recovery duy nhất) · delta session-start (**BƯỚC 0.7 MỚI** WAL-check — ngoại-lệ CHỜ duy nhất) + session-end (**§5.0** squash `wal:` trailing chưa-push + **§6.4** reset-WAL bước cuối) · WAL-cho-workflow (mandate run-trace ≥3-task/>5', taskList-snapshot vào run.md, dòng `wf:` 5-trường, harvest-liền C4 + per-agent-file + honest per-turn≠per-task N9, /tiep = relaunch-cắt-gọt + memory-pack re-derive tươi, resume-run-id = bonus SAME-SESSION-ONLY) · codify engine **PHẦN N** + CAVEAT:402 honest-update + rules §5.2 exception `wal:` + CLAUDE.md 2-dòng con-trỏ + honest (a)-(e) áp SE (e = Dropbox 2-chiều: risk index.lock + bonus .git-sync durability).
|
||||||
|
|
||||||
|
**Xong nghĩa là (DoD grep-được):** `Test-Path .claude/WAL.md`=True và ≤40 dòng · `.claude/hooks/wal-flush.ps1` chạy tay exit-0 + tạo commit `wal:` thật (script-RUN verified; hook-FIRE = phiên mới) · grep `"Stop"` `.claude/settings.json` ≥1 · grep `*.sh text eol=lf` `.gitattributes` =1 · grep `wal:` `docs/rules.md` ≥1 · grep `BƯỚC 0.7` session-start.md =1 · grep `reset --soft` session-end.md ≥1 · engine grep `PHẦN N` ≥1 + `STAGED-until-verified` ≥1 + honest (a)-(e) đủ 5 · CLAUDE.md grep `/tiep` ≥1 · workflows/README.md vùng :31 có `BẮT BUỘC` · adap-report + email AI_INFRA + mark-proposal trình anh (CHƯA stamp) · HANDOFF NEXT-anh có pilot-checklist + restart-CLI note.
|
||||||
|
|
||||||
|
## Mục 2 — Cách implement
|
||||||
|
|
||||||
|
### Quyết định thiết kế
|
||||||
|
- **D1 — WAL.md:** template rỗng nguồn §2 NGUYÊN VĂN; tracked (verify idiom N12: `git check-ignore` exit-1 = NOT-IGNORED cho re-included path `!.claude/**` .gitignore:82-83 — đừng đọc exit-code trần); ghi-đè toàn-file mỗi lần; lead single-writer nội-dung sau MỖI subtask đổi trạng-thái; dogfood ghi-chain ngay trong phiên S111 này.
|
||||||
|
- **D2 — Hook (LEAD-CHỈNH PS1):** `.claude/hooks/wal-flush.ps1` port NGUYÊN logic nguồn §3: 3 path cố định `.claude/WAL.md` + `.claude/agent-memory/` + `.claude/workflows/runs/` (N3 — GIỮ NGUYÊN, AS-6 không tăng: 2 json churn `.mfe-state`/`.archive-strikes` đã gitignored :124-125, `memory-budget.json` tracked đổi-hiếm-owner-directed; hook chỉ commit LOCAL, CI trigger lúc PUSH, squash → push-set ≡ hôm nay); **per-path `git add` từng cái** (X3 — add đa-pathspec = all-or-nothing khi 1 path vắng, bài học đắt nguồn) + CAND-list chỉ path thực-có-staged + commit `-m "wal: flush <yyyyMMddTHHmm>"` KHÔNG Co-Authored-By + **exit 0 MỌI nhánh** (try/catch bọc toàn thân; Stop-hook exit≠0 có hành vi riêng — CẤM); KHÔNG content-gen, KHÔNG push, KHÔNG block-stop, KHÔNG path ngoài list. `settings.json` CREATE MỚI (N1 — file chưa tồn tại, merge-concern moot) nested-schema: `{"hooks":{"Stop":[{"hooks":[{"type":"command","command":"powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1"}]}]}}`. **Status = STAGED-until-verified** (X5): codify + enable cùng commit nhưng CẤM claim "đang chạy" trước khi thấy commit `wal:` do HOOK sinh trong `git log` phiên MỚI (script-RUN tay ≠ hook-FIRE); honest-note (c) nguồn: nếu phiên mới không fire → thử biến-thể phẳng rồi verify lại.
|
||||||
|
- **D3 — /pause /tiep:** GIỮ tên nguồn (N11 — 16 command hiện có, 0 trùng); `.claude/commands/pause.md` = logic nguồn §4 /pause 5-bước (ngừng-spawn → flush-dirty → WAL-đúng-schema → commit ĐÍCH-DANH `wal: pause` KHÔNG `git add -A` → báo-cáo + DỪNG HẲN; bất-biến: commit TRƯỚC tuyên-bố an-toàn); `.claude/commands/tiep.md` = nguồn §4 /tiep 4-bước + nhánh `wf:` §6 (đọc WAL → không-tồn-tại/toàn-`[x]` = báo "không có mạch dở" DỪNG SẠCH → chạy TOÀN BỘ verify → lệch = TIN GROUND-TRUTH sửa WAL trước → thực-thi next; mục `wf:` → relaunch-CẮT-GỌT: đọc run-folder + taskList-snapshot, grep run-id trong log-phiên = bằng-chứng đích-danh task-đã-xong, harvest-hồi-tố partial-honest [lead verify rồi append], relaunch CHỈ task còn lại + memory-pack RE-DERIVE TƯƠI); /tiep verify đọc CẢ `git status` + disk run-folder KHÔNG chỉ git-log (N9); CẤM nạp transcript cũ; field `session:` khác phiên = BÌNH-THƯỜNG, chỉ cảnh-báo nếu `updated` mới hơn lúc phiên hiện-tại bắt đầu.
|
||||||
|
- **D4 — session-start:** **BƯỚC 0.7 MỚI** chèn sau BƯỚC 0.6 (:37-45) TRƯỚC Phase 1 READ (:47) — chặn trước read-set ~368K = token-save lớn nhất (N6); nội dung: đọc `.claude/WAL.md` → có `[!]` hoặc `[ ]` → báo "có mạch dở, `/tiep` để nối" + **CHỜ anh chọn** (ngoại-lệ CHỜ DUY NHẤT của quy-trình no-wait; chỉ là CON-TRỎ — quy-trình recovery viết ở MỘT chỗ = tiep.md); chain rỗng/toàn-`[x]` → tiếp bình-thường. GIỮ NGUYÊN số 0.5/0.5b/0.6 (X10, precedent D4 S110 chống renumber-churn).
|
||||||
|
- **D5 — session-end:** **§5.0 MỚI** ngay trước §5.1 (:111): đếm K = subject liên-tục `^wal:` từ HEAD xuống trong `git log --format=%s origin/main..HEAD` (span CHƯA-push — không bao giờ rewrite đã-push X4) → K>0 → `git reset --soft HEAD~K` gộp vào commit-chốt; K=0 → skip; biên N7: (i) push chết phiên trước → HEAD=chốt-cũ-chưa-push KHÔNG bị fold (đếm dừng ở subject ≠wal:), được push lần này; (ii) wal: sandwiched dưới chốt → GIỮ (noise chấp nhận, per nguồn §5); +1 dòng N14: "squash xong = điểm review-diff wal-paths (AS-10 backstop dời về đây, KHÔNG mất — push vẫn gated em-main)". **§6.4 MỚI** sau §6.3 (:129) TRƯỚC footer :139: reset WAL về template rỗng = bước CUỐI (hook sẽ commit lần reset thành wal-commit trailing sau turn cuối — vô-hại, phiên sau squash).
|
||||||
|
- **D6 — WAL-cho-workflow:** `workflows/README.md:31` + bảng :24 FLIP policy: mode-A vẫn cho fan-out NHỎ, nhưng **run ≥3 task HOẶC ước >5 phút = BẮT BUỘC RUN-TRACE mode (args.run — per-agent-file trong run-folder)** (sàn H22 owner nguồn đã chốt); run.md template +section `## taskList snapshot` (role · label · prompt-gist) ghi TRƯỚC launch (N10); dòng `wf:<mục-đích> run=<folder> runId=<id|pending> args=<snapshot-ref> done=<k>/<N> harvested=<yes|no|partial>` vào WAL NGAY SAU launch, lead điền runId khi có; harvest-LIỀN mỗi task xong = C4 per-turn (ĐÃ CÓ — hmw.js:99 + session-end:51) + honest-note granularity N9 (per-TURN ≠ per-TASK: `parallel()` trả cả batch cuối turn, Stop-hook cũng fire ở turn-boundary → chết GIỮA turn = returns mất, per-agent-file trên DISK là lớp cứu → /tiep đọc cả disk); memory-pack KHÔNG snapshot (X6 — re-derive tươi lúc /tiep; hiện đã compliant: pack qua args hmw.js:15); resume-by-run-id = bonus SAME-SESSION-ONLY (engine Workflow docs "same-session only" — CẤM claim cross-session, honest-note (d)).
|
||||||
|
- **D7 — Codify:** engine `docs/governance/harness-11-engine.md` **PHẦN N MỚI** (trước CAVEAT :401): schema WAL + 2 tầng ghi (lead nội-dung ⟂ hook persist) + hook ĐƯỢC làm {git add 3-path, CAND-commit `wal:`} / KHÔNG-ĐƯỢC {content-gen, push, block-stop, path-ngoài-list, exit≠0} + STAGED-until-verified + honest (a)-(e) áp SE [(a) pilot chưa chạy tại SE — kill-test/đổi-acc/hook-fire = phiên mới+anh; (b) SE 0-mark-cấm-hook, N2 mô-tả-vs-luật, thứ-tự codify-trước-enable ĐÃ tôn trọng cùng-commit; (c) nested-schema default, fallback flat nếu phiên mới không fire; (d) resume-run-id same-session-only; (e) Dropbox 2-chiều: risk index.lock thấp-nhưng-có fail-open tự-lành + bonus .git-sync = commit local chưa-push vẫn sống qua tắt-máy/đổi-máy → /pause không cần push vẫn durable]; CAVEAT :402 honest-update: thêm ngoại-lệ đích-danh "Stop-hook wal-flush persist-only (PHẦN N) — 0-content, fail-open, KHÔNG phải gate (E.3-compatible)"; `docs/rules.md` §5.2 (:213-221) append exception: "ngoại-lệ DUY-NHẤT: commit `wal:` (Stop-hook persist + /pause + WAL-reset) — máy sinh, KHÔNG Co-Authored-By, bị squash vào commit-chốt trước push (session-end §5.0)"; root `CLAUDE.md` 2 dòng con-trỏ: "Mạch việc dở nằm ở `.claude/WAL.md`; nối lại DUY-NHẤT bằng `/tiep` — kể cả khi anh gõ 'làm tiếp' bằng text thường. Không tự recovery cách khác."
|
||||||
|
- **D8 — hmw.js :9/:19 comment-only** (em-main, X7 KHÔNG đổi code): :9 meta note mode-A default → "+ mandate H22: ≥3-task/>5' PHẢI RUN-TRACE (em-main scaffold + set args.run — script no-fs không tự ép, enforcement = convention lead)"; :19 `run: OPTIONAL` → wording mandate-ref.
|
||||||
|
- **D9 — Mark H22 MỚI** trình anh cuối phiên (P4 report-before-stamp §L.b(h)) — KHÔNG tự stamp (X5-mark); đề xuất §-target: `engine PHẦN N` + `.claude/hooks/` + `session-start BƯỚC 0.7` / `session-end §5.0+§6.4` (≙ AI_INFRA H-22 CANONICAL §I4 + §H1).
|
||||||
|
- **D10 — Optional KHÔNG-block (owner-OK sau):** deploy.yml paths-ignore +`.claude/agent-memory/**` +`.claude/workflows/runs/**` (precedent `.claude/skills/**` :23) — triệt noise CI khi budget.json đổi; ghi option vào adap-report + HANDOFF, KHÔNG làm trong run này.
|
||||||
|
|
||||||
|
### Ràng buộc thật
|
||||||
|
Worker Opus edit-DIRECT trong PHẠM VI file được giao (3 lane disjoint; residual → em-main git-diff revert AS-10) · WAL.md + .gitattributes + settings.json + engine + rules + CLAUDE.md + hmw.js + adap-report + email + mark-proposal + HANDOFF = em-main · command .md + hook = restart-CLI/phiên-mới mới ăn (S27 + ENV-DEPENDENT S110) → pilot-checklist nằm HANDOFF NEXT-anh · HISTORY (session-log, archive verbatim, adap-report cũ, diary) GIỮ nguyên văn · script-RUN tay verify trong phiên ≠ hook-FIRE (phiên mới).
|
||||||
|
|
||||||
|
### Đường chết cần né
|
||||||
|
(X1) đụng `hmw-mode.on`/BƯỚC 0.5/`ultra-*` — HỆ KHÁC (HMW consent) · (X2) hook thêm content-gen/push/block-stop · (X3) add/commit đa-pathspec all-or-nothing · (X4) rewrite commit đã-push khi squash · (X5) claim hook "đang chạy" trước verify phiên mới (ghost-wire S100) · (X6) snapshot memory-pack · (X7) đổi code hmw.js (chỉ comment) · (X8) WAL append thay ghi-đè / vượt 40 dòng / chứa secret · (X9) commit script .sh trước khi .gitattributes có `*.sh` (n/a với .ps1 nhưng giữ thứ-tự: gitattributes trước) · (X10) renumber BƯỚC/§ cũ · (X11) tự stamp mark.
|
||||||
|
|
||||||
|
## Mục 3 — Checklist thực hiện
|
||||||
|
|
||||||
|
| # | Vai | Deliverable | Acceptance (đo được) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | em-main | `.gitattributes` append `*.sh text eol=lf` (X9-first) + `.claude/WAL.md` template nguồn §2 | grep `*.sh text eol=lf` =1; `Test-Path .claude/WAL.md`=True; `(gc).Count` ≤40; check-ignore idiom → NOT-IGNORED |
|
||||||
|
| 2 | em-main | `.claude/settings.json` CREATE hooks-entry PS1 + STAGED-note trong engine | grep `"Stop"` =1; grep `wal-flush.ps1` =1; engine grep `STAGED-until-verified` ≥1 |
|
||||||
|
| 3 | worker-opus-1 (edit-direct, file MỚI) | `.claude/commands/pause.md` + `.claude/commands/tiep.md` (D3) | 2 file frontmatter `description:`; tiep grep "transcript"≥1(CẤM) + "ground-truth"≥1 + "wf:"≥1 + nhánh WAL-rỗng-dừng-sạch + "git status"≥1; pause grep "wal: pause"≥1 + "git add -A"≥1(CẤM-context) + trỏ /tiep |
|
||||||
|
| 4 | worker-opus-2 (edit-direct) | session-start.md BƯỚC 0.7 (D4) | grep "BƯỚC 0.7"=1; "CHỜ"≥1 vùng 0.7; git-diff KHÔNG chạm 0.5/0.5b/0.6/Phase-1+ |
|
||||||
|
| 5 | worker-opus-2 (edit-direct) | session-end.md §5.0 + §6.4 (D5) | grep "origin/main..HEAD"=1; "reset --soft"=1; "KHÔNG rewrite"≥1; "review-diff wal-paths"≥1; §6.4 sau 6.3 trước footer |
|
||||||
|
| 6 | worker-opus-3 (edit-direct, file MỚI) | `.claude/hooks/wal-flush.ps1` (D2 PS1-port) | lead chạy tay `powershell -ExecutionPolicy Bypass -File` exit-0 ×2 ca (có-delta → commit `wal:` thật; 0-delta → exit-0 im lặng); grep "exit 0"≥2 + try/catch; per-path loop + CAND; 0 push/content/block |
|
||||||
|
| 7 | worker-opus-3 (edit-direct) | workflows/README.md policy-flip :31+bảng + run.md template +`## taskList snapshot` (D6) | vùng :31 có "BẮT BUỘC" + "≥3"/"5 phút"; grep "taskList snapshot"≥1; mode-A vẫn hợp lệ cho fan-out nhỏ |
|
||||||
|
| 8 | em-main | engine PHẦN N + CAVEAT:402 + rules §5.2 + CLAUDE.md pointer (D7) | grep "PHẦN N"≥1; :402 có "ngoại-lệ"; rules grep "wal:"≥1; CLAUDE.md grep "/tiep"≥1; honest a-e đủ 5 trong PHẦN N |
|
||||||
|
| 9 | em-main | hmw.js :9/:19 comment-only (D8) | `node --check .claude/workflows/hmw.js` PASS; grep "OPTIONAL" :19 vùng = 0 (thay mandate-ref); git-diff hmw.js chỉ comment-line |
|
||||||
|
| 10 | em-main | WAL.md dogfood ghi-chain S111 + run.md update + adap-report + email AI_INFRA + mark-proposal (D9) | WAL chain ≥3 mục [x] bằng-chứng lệnh; report nêu ĐÚNG NẤC "khung dựng + STAGED + script-RUN-verified, hook-FIRE + pilot = phiên mới"; ACTIVE-MARKS CHƯA đổi; AskUserQuestion trình |
|
||||||
|
| 11 | reviewer-Fable (vai anh gán trong lệnh) | Cổng-cuối biên-test + sweep | fault-inject cây tạm: hook thiếu-1-path vẫn commit path-còn + exit-0; WAL >40-dòng bị bắt; /tiep WAL-rỗng dừng sạch; grep toàn-repo con-trỏ recovery = MỘT đường /tiep; honest a-e present; 0.5/hmw-mode/ultra-* untouched; spec-compliance từng row |
|
||||||
|
| 12 | em-main | HANDOFF pilot-checklist + restart-CLI note + STATUS blurb | NEXT-anh có: restart CLI · phiên mới verify hook-FIRE (git log `wal:`) · kill-giữa-chain → /tiep · đổi-acc · squash dry-run thật · pause-roundtrip 1 workflow THẬT |
|
||||||
|
|
||||||
|
**Map sàn-H22 → row:** ① sổ WAL ≤40/schema/ghi-đè → #1+#10 · ② hai tầng ghi (lead⟂hook persist-only 0-content fail-open per-path) → #2+#6+#8 · ③ /pause+/tiep 1-đường → #3+#11 · ④ delta mở/đóng (WAL-check · squash chưa-push · reset cuối) → #4+#5 · ⑤ WAL-workflow (snapshot args · wf: · harvest-liền · relaunch-cắt-gọt · mandate per-agent-file · trung-thực mất-mát) → #7+#8+#3(nhánh wf:) · honest (a)-(e) → #8+#10.
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
# sub-task-0 — D3: tạo 2 command file `/pause` + `/tiep` (Harness-22 WAL session-continuity)
|
||||||
|
|
||||||
|
**Role:** implementer (Write tool) · **Scope:** CHỈ 2 file MỚI + file này. Không đè gì.
|
||||||
|
**Nguồn FROZEN đã đọc:** `broadcasts/inbox/2026-07-11-Governance-harness-22-wal-session-continuity.md` (§4 dòng 101-120 + §6 dòng 130-140). KHÔNG tự đọc spec-file (nhận phần liên-quan qua prompt).
|
||||||
|
**Format mẫu:** `.claude/commands/send-email.md` dòng 1-4 (frontmatter `description:` + `argument-hint:`).
|
||||||
|
|
||||||
|
## Deliverables (2 file MỚI — đều `??` untracked, xác-nhận không đè)
|
||||||
|
| File | Dòng | Nội-dung |
|
||||||
|
|---|---|---|
|
||||||
|
| `.claude/commands/pause.md` | 47 | `/pause` — chốt điểm dừng chủ-động, 5 bước tuần-tự + bất-biến + con-trỏ `/tiep` |
|
||||||
|
| `.claude/commands/tiep.md` | 42 | `/tiep` — recovery MỘT đường, 4 bước + nhánh `wf:` + khối CẤM |
|
||||||
|
|
||||||
|
> Cả 2 file tự-động đăng-ký thành slash-command (hệ báo skill `pause`/`tiep` xuất-hiện sau Write) → frontmatter hợp-lệ, well-formed.
|
||||||
|
|
||||||
|
## Port-fidelity map → broadcast (trung-thực, không bịa)
|
||||||
|
|
||||||
|
### pause.md ← §4 phần `/pause` (broadcast dòng 103-111)
|
||||||
|
- Bước 1 (dòng 15-17) ← BC 105: NGỪNG spawn; sắp-xong <~2' → chờ+harvest-liền; còn lâu → KHÔNG chờ, WAL `[!]` đủ trường, workflow = dòng `wf:` 5-trường (port nguyên `wf:<mục-đích> run= runId= args= done=k/N harvested=no`).
|
||||||
|
- Bước 2 (dòng 19-21) ← BC 106: flush dirty; ghi-chú-dở dài để run-folder/work-state, KHÔNG nhét vào WAL.
|
||||||
|
- Bước 3 (dòng 23-27) ← BC 107 + §2 (BC 34-37): chain kèm BẰNG-CHỨNG · `next:` 1 mệnh-lệnh · `verify:` lệnh chạy-được cho từng `[!]` · **ghi-đè toàn-file ≤40 dòng · CẤM secret**.
|
||||||
|
- Bước 4 (dòng 29-32) ← BC 108: commit ĐÍCH-DANH (WAL + path persist + file dở) msg `wal: pause` · **TUYỆT ĐỐI KHÔNG `git add -A`** · KHÔNG push [Dropbox `.git` cloud-sync = local durable].
|
||||||
|
- Bước 5 (dòng 34-42) ← BC 109: báo goal / mục `[!]` đầu / workflow bỏ lại / "an-toàn để thoát, đổi acc, tắt máy" → DỪNG HẲN.
|
||||||
|
- Bất-biến (dòng 45) ← BC 111: commit bước-4 TRƯỚC tuyên-bố bước-5.
|
||||||
|
- Con-trỏ (dòng 47) ← §7 mục 5 (BC 154): "Nối lại = `/tiep` (MỘT đường recovery duy-nhất)".
|
||||||
|
|
||||||
|
### tiep.md ← §4 phần `/tiep` (BC 113-120) + nhánh `wf:` §6 (BC 130-140)
|
||||||
|
- Bước 1 (dòng 14-15) ← BC 115: đọc WAL; không tồn-tại / chain toàn `[x]` → "không có mạch dở" **DỪNG SẠCH**.
|
||||||
|
- Bước 2 (dòng 17-20) ← BC 116 + SE-tailor N9: chạy TOÀN BỘ `verify:` **VÀ** đọc `git status` + disk run-folder (per-turn≠per-task: returns mất được nhưng per-agent-file trên đĩa còn) — đây là delta SE thêm theo prompt, so chain.
|
||||||
|
- Bước 3 (dòng 22-24) ← BC 117: LỆCH → TIN GROUND-TRUTH (sửa WAL, báo lệch, rồi mới chạy) · KHỚP → thực-thi từ `next:`, nối chain thứ-tự.
|
||||||
|
- Bước 4 (dòng 26-32) ← BC 118 + §6 (BC 137-138): mục `wf:` → recovery-workflow: đọc run-folder + `## taskList snapshot` trong run.md; grep run-id trong log-phiên (glob — grep ĐÍCH-DANH, KHÔNG nạp toàn transcript); harvest-hồi-tố partial-honest; **RELAUNCH đã-cắt-gọt chỉ task CÒN LẠI + memory-pack DẪN-XUẤT-LẠI TƯƠI (CẤM snapshot pack cũ)**; resume-by-run-id = bonus SAME-SESSION-ONLY, CẤM claim cross-session.
|
||||||
|
- Khối CẤM (dòng 38-40) ← BC 120: CẤM giả-định bước xong nếu `verify:` không chứng-minh · **CẤM nạp lại transcript cũ** (WAL+ground-truth đủ; thiếu → HỎI anh).
|
||||||
|
- Field `session:` (dòng 42) ← BC 120: khác phiên = BÌNH-THƯỜNG (use-case); chỉ cảnh-báo nếu `updated:` mới hơn lúc phiên hiện-tại bắt đầu (dấu phiên song-song).
|
||||||
|
|
||||||
|
## Dead-ends né được (checklist X)
|
||||||
|
- **X4** (rewrite commit đã-push): pause.md chỉ "KHÔNG push" + rationale Dropbox-durable. KHÔNG hề nhắc squash/reset/rewrite (đó là §5 delta = task khác). ✅
|
||||||
|
- **X8** (WAL append / >40 / secret): pause.md bước-3 ghi rõ "ghi-đè toàn-file (KHÔNG append), cứng ≤40 dòng, CẤM secret". ✅
|
||||||
|
- **X5** (claim hook 'đang chạy'): 2 file KHÔNG nhắc Stop-hook. Commit bước-4 là commit THỦ-CÔNG của lệnh `/pause`, độc-lập hook. ✅
|
||||||
|
- **X1/X7/X10:** không đụng hmw-mode/BƯỚC-0.5/ultra-*/hmw.js; file MỚI nên không renumber gì. ✅
|
||||||
|
- **Isolation:** git-status → chỉ `.claude/commands/pause.md` + `.claude/commands/tiep.md` là `??` do tôi tạo; các M/?? khác (session-*.md, .gitattributes, hooks/, settings.json, CLAUDE.md, rules.md…) = sibling D-task, KHÔNG do tôi. ✅
|
||||||
|
|
||||||
|
## Acceptance (row #3) — grep-count evidence
|
||||||
|
| Check | Kết-quả | Line |
|
||||||
|
|---|---|---|
|
||||||
|
| pause.md frontmatter `description:` | PASS | L2 |
|
||||||
|
| pause.md `wal: pause` ≥1 | PASS (3×) | L2, L29, L30 |
|
||||||
|
| pause.md `git add -A` ≥1 (câu CẤM) | PASS (1×) | L31 "TUYỆT ĐỐI KHÔNG `git add -A`" |
|
||||||
|
| pause.md trỏ `/tiep` | PASS (5×) | L47 con-trỏ cuối "Nối lại = `/tiep`" |
|
||||||
|
| tiep.md frontmatter `description:` | PASS | L2 |
|
||||||
|
| tiep.md `transcript` ≥1 (câu CẤM) | PASS (2×) | L40 "CẤM nạp lại transcript cũ" + L29 |
|
||||||
|
| tiep.md `ground-truth` ≥1 | PASS (3×) | L17, L40 (lowercase), L2 |
|
||||||
|
| tiep.md `wf:` ≥1 | PASS (3×) | L2, L26, L27 |
|
||||||
|
| tiep.md nhánh WAL-rỗng-dừng-sạch | PASS | L15 "chain toàn `[x]` → 'không có mạch dở' → DỪNG SẠCH" |
|
||||||
|
| tiep.md `git status` ≥1 | PASS (4×) | L19, L23, L40, L2 |
|
||||||
|
|
||||||
|
**Verdict: 10/10 acceptance PASS.** 2 file well-formed (auto-đăng-ký slash-command), port trung-thực, isolation sạch.
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
# sub-task-1 — EDIT 2 session-command (D4+D5 spec) — H22 WAL session-continuity
|
||||||
|
|
||||||
|
**Role:** implementer (Write/Edit) · **Run:** 2026-07-12-h22-wal-adopt · **Scope FILE giao:** `.claude/commands/session-start.md` + `.claude/commands/session-end.md` (KHÔNG file khác).
|
||||||
|
|
||||||
|
## Việc đã làm (3 point-insert, KHÔNG renumber — X10 né)
|
||||||
|
|
||||||
|
### (1) session-start.md — CHÈN BƯỚC 0.7 MỚI
|
||||||
|
- **Vị-trí:** ngay SAU khối BƯỚC 0.6 (dòng flip-chain `…BƯỚC 0.6 probe MỖI phiên…`) và TRƯỚC `## Phase 1 — READ`. Hunk `@@ -44,6 +44,15 @@` = insert-only +9 dòng.
|
||||||
|
- **Heading:** `## 📋 BƯỚC 0.7 — WAL-check mạch-việc-dở (H22 — adopt S111)` (dòng 47).
|
||||||
|
- **Nội-dung:** em main đọc `.claude/WAL.md` → nhánh (a) file-vắng/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 (no-wait); nhánh (b) chain có `[!]`/`[ ]` → BÁO goal + mục `[!]` đầu + câu "gõ `/tiep` để nối, hoặc bảo em bootstrap tiếp bỏ mạch" → **CHỜ anh chọn** = NGOẠI-LỆ CHỜ DUY-NHẤT của no-wait (BƯỚC 0 GIỮ no-wait).
|
||||||
|
- **B1 con-trỏ-canonical:** ghi rõ bước này CHỈ LÀ CON-TRỎ, recovery-logic viết ở MỘT CHỖ = `[.claude/commands/tiep.md](tiep.md)` (KHÔNG copy verify/relaunch vào đây). Lý-do chặn TRƯỚC Phase 1 READ = tiết-kiệm read-set ~368K khi anh chọn /tiep.
|
||||||
|
- Thứ-tự BƯỚC sau chèn: 0 → 0.5 → 0.5b → 0.6 → **0.7 (47)** → Phase 1 (56). Không đụng 0.5/0.5b/0.6.
|
||||||
|
|
||||||
|
### (2a) session-end.md — CHÈN §5.0 MỚI (TRƯỚC §5.1)
|
||||||
|
- **Vị-trí:** giữa `## Phase 5 — COMMIT (release)` và `### 5.1 Release + commit`. Hunk `@@ -108,6 +108,12 @@` = insert-only.
|
||||||
|
- **Heading:** `### 5.0 Squash wal:-trailing chưa-push (H22 — TRƯỚC commit-chốt)` (dòng 111).
|
||||||
|
- **Nội-dung:** `git log --format=%s origin/main..HEAD` → đếm K = số subject LIÊN-TỤC bắt đầu `wal:` từ HEAD xuống (DỪNG khi gặp subject khác); K=0→skip; K>0→`git reset --soft HEAD~K` gộp vào commit-chốt §5.1.
|
||||||
|
- **Hard-safety (X4 né — KHÔNG gợi rewrite pushed):** phạm-vi = CHỈ commit CHƯA-push (ahead-of-remote) → **"KHÔNG BAO GIỜ rewrite commit đã-push"**; wal: kẹp sâu (sandwiched dưới commit thường chưa-push) → GIỮ NGUYÊN chấp-nhận noise. Biên push-chết-giữa-phiên-trước: HEAD=chốt-cũ-chưa-push → đếm dừng tại đó, chốt cũ KHÔNG fold, push lần này.
|
||||||
|
- **AS-10 backstop:** +1 dòng "squash xong = điểm **review-diff wal-paths**" (hook đã commit local residual-write nếu có → review diff path WAL/agent-memory/runs tại đây trước chốt; push vẫn gated em-main).
|
||||||
|
- ⚠️ `origin/main..HEAD` chỉ xuất-hiện 1 LẦN (trong lệnh git log); dòng "Phạm-vi" reword "khoảng ahead-of-remote" KHÔNG lặp literal → thoả acceptance grep=1. `reset --soft` cũng 1 lần duy nhất.
|
||||||
|
|
||||||
|
### (2b) session-end.md — CHÈN §6.4 MỚI (SAU §6.3, TRƯỚC footer)
|
||||||
|
- **Vị-trí:** sau dòng cuối §6.3 (`…"N/A (no infra adoption this session)".`) và TRƯỚC `---` + footer `**Trigger sau Phase 6:**`. Hunk `@@ -134,6 +140,10 @@` = insert-only.
|
||||||
|
- **Heading:** `### 6.4 Reset WAL (H22 — bước CUỐI)` (dòng 143; footer dòng 149).
|
||||||
|
- **Nội-dung:** ghi-đè `.claude/WAL.md` về template rỗ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 reset thành wal-commit trailing sau turn cuối = vô-hại, phiên sau squash ở §5.0. Framing future-tense "hook sẽ commit" (X5 né — KHÔNG claim hook đang-chạy phiên này).
|
||||||
|
|
||||||
|
## Acceptance evidence (grep-count)
|
||||||
|
| # | Check | Kết-quả | Verdict |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 4a | session-start `grep -c 'BƯỚC 0.7'` | 1 | PASS |
|
||||||
|
| 4b | `'CHỜ'` trong vùng 0.7 (dòng 52, giữa 47…56) | 1 (≥1) | PASS |
|
||||||
|
| 4c | git-diff KHÔNG chạm 0.5/0.5b/0.6/Phase-1 | insert-only, 0 deletion | PASS |
|
||||||
|
| 5a | session-end `grep -c 'origin/main..HEAD'` | 1 | PASS |
|
||||||
|
| 5b | `grep -c 'reset --soft'` | 1 | PASS |
|
||||||
|
| 5c | `'KHÔNG'` gần `'rewrite'` (dòng 113 §5.0) | ≥1 | PASS |
|
||||||
|
| 5d | `grep -c 'review-diff wal-paths'` | 1 (≥1) | PASS |
|
||||||
|
| 5e | §6.4(143) SAU §6.3(135) TRƯỚC footer(149) | đúng thứ-tự | PASS |
|
||||||
|
|
||||||
|
## Isolation (B6 audit)
|
||||||
|
- `git diff --stat` file giao: `session-end.md +10`, `session-start.md +9` = 19 insertion, insert-only (grep `^-[^-]` diff = 0 content-deletion).
|
||||||
|
- Tôi CHỈ Edit 2 file giao + Write file này (`sub-task-1.md`). KHÔNG đụng file nào khác.
|
||||||
|
- `git status` toàn-repo có nhiều file M/?? (pause.md, tiep.md, hooks/, settings.json, CLAUDE.md, harness-11-engine.md, rules.md, .gitattributes, broadcasts/_index.md, 2 README) = **sibling-task cùng wave H22 (shared tree)**, KHÔNG phải write của tôi.
|
||||||
|
|
||||||
|
## Dead-ends né (theo spec)
|
||||||
|
- X1: KHÔNG đụng hmw-mode.on / BƯỚC 0.5/0.5b/0.6 / ultra-*.md.
|
||||||
|
- X4: wording §5.0 khẳng-định "KHÔNG BAO GIỜ rewrite commit đã-push", reset chỉ khoảng chưa-push.
|
||||||
|
- X5: §6.4 dùng "hook SẼ commit" (future) — KHÔNG claim hook đang-chạy phiên này.
|
||||||
|
- X8: §6.4 reset = ghi-đè template rỗng ~8 dòng (≤40), no secret.
|
||||||
|
- X10: 0.7/5.0/6.4 = số MỚI chèn-điểm, KHÔNG renumber mục cũ.
|
||||||
|
- KHÔNG commit (em-main commit cuối phiên).
|
||||||
|
- KHÔNG đọc spec-file (nhận qua prompt); chỉ đọc broadcast FROZEN + 2 file giao.
|
||||||
@ -0,0 +1,87 @@
|
|||||||
|
# sub-task-2 — H22 hook PS1 + FLIP policy workflow (D2+D6)
|
||||||
|
|
||||||
|
**Role:** implementer-backend (Write/Edit-capable) · **Run:** 2026-07-12-h22-wal-adopt · **Spec:** D2 (hook PS1) + D6 (FLIP RUN-TRACE policy)
|
||||||
|
|
||||||
|
## Scope (3 deliverables, isolation-clean)
|
||||||
|
1. CREATE `.claude/hooks/wal-flush.ps1` (folder mới)
|
||||||
|
2. EDIT `.claude/workflows/README.md` — FLIP 2-mode policy
|
||||||
|
3. EDIT `.claude/workflows/runs/README.md` — add `## taskList snapshot` section
|
||||||
|
|
||||||
|
Không đụng file nào khác. `git status` cho thấy nhiều file M/?? khác = việc của sibling-task trong cùng fan-out song-song (session-*.md, .gitattributes, pause.md, tiep.md, settings.json, CLAUDE.md, rules.md, harness-11-engine.md, broadcasts/*) — KHÔNG phải write của tôi.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## (1) `.claude/hooks/wal-flush.ps1` — port bash→PS 5.1, persist-only
|
||||||
|
|
||||||
|
Port nguyên semantics từ broadcast §3 (bash `wal-flush.sh`, dòng 82-97) sang PowerShell 5.1 dùng skeleton lead-verified. **Chỉnh cosmetic DUY-NHẤT: 2 em-dash `—` trong comment → hyphen `-`** để đạt pure-ASCII (lesson #30 — tránh mojibake .ps1). KHÔNG thêm logic ngoài skeleton.
|
||||||
|
|
||||||
|
Nội dung final (788 bytes, pure-ASCII, LF, no-BOM):
|
||||||
|
```
|
||||||
|
# wal-flush.ps1 - WAL persist-only Stop hook (H22 S111). KHONG sinh noi dung, KHONG push, KHONG block.
|
||||||
|
# Fail-open MOI nhanh: exit 0 ke ca loi (Stop-hook exit!=0 co hanh vi rieng - CAM).
|
||||||
|
# Per-path add + CAND commit (X3: add/commit da-pathspec = all-or-nothing khi 1 path vang).
|
||||||
|
try {
|
||||||
|
$root = if ($env:CLAUDE_PROJECT_DIR) { $env:CLAUDE_PROJECT_DIR } else { "." }
|
||||||
|
Set-Location $root
|
||||||
|
$paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/")
|
||||||
|
$cand = @()
|
||||||
|
foreach ($p in $paths) {
|
||||||
|
git add -- $p 2>$null
|
||||||
|
git diff --cached --quiet -- $p 2>$null
|
||||||
|
if ($LASTEXITCODE -ne 0) { $cand += $p }
|
||||||
|
}
|
||||||
|
if ($cand.Count -gt 0) {
|
||||||
|
$ts = Get-Date -Format "yyyyMMddTHHmm"
|
||||||
|
git commit -q -m "wal: flush $ts" -- $cand 2>$null | Out-Null
|
||||||
|
}
|
||||||
|
} catch { }
|
||||||
|
exit 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Semantics-fidelity bash→PS (từng dòng khớp):
|
||||||
|
| bash §3 | PS 5.1 | Khớp |
|
||||||
|
|---|---|---|
|
||||||
|
| `cd "${CLAUDE_PROJECT_DIR:-.}" \|\| exit 0` | `$root = if($env:CLAUDE_PROJECT_DIR){...}else{"."}; Set-Location $root` (trong try/catch→exit 0) | ✅ fail-open |
|
||||||
|
| `P=".claude/WAL.md .claude/agent-memory/ .claude/workflows/runs/"` | `$paths = @(3 path y-hệt)` | ✅ 3 path |
|
||||||
|
| `git add -- "$p"` per-path | `git add -- $p 2>$null` per-path | ✅ per-path (X3 all-or-nothing tránh) |
|
||||||
|
| `git diff --cached --quiet \|\| CAND+=p` | `git diff --cached --quiet; if($LASTEXITCODE -ne 0){$cand+=$p}` | ✅ exit!=0 = có staged |
|
||||||
|
| `[ -z "$CAND" ] && exit 0` | `if($cand.Count -gt 0){commit}` | ✅ chỉ commit khi non-empty |
|
||||||
|
| `git commit -q -m "wal: flush $(date +%Y%m%dT%H%M)" -- $CAND` | `$ts=Get-Date -Format "yyyyMMddTHHmm"; git commit -q -m "wal: flush $ts" -- $cand` | ✅ (T literal trong .NET format, khớp `%Y%m%dT%H%M`) |
|
||||||
|
| `exit 0` cuối | `exit 0` cuối | ✅ fail-open mọi nhánh |
|
||||||
|
|
||||||
|
### Guard-rail đã verify (dead-ends né):
|
||||||
|
- **X2 (0 content-gen / 0 push / 0 block):** grep Set-Content/Out-File/Add-Content/echo/`>>` = NONE-OK · `git push` = NO-GIT-PUSH-OK (chỉ 'push' trong comment `KHONG push`) · `exit [1-9]` = NONE-OK (chỉ `exit 0`).
|
||||||
|
- **X8:** hook chỉ add/commit path cố-định (WAL + agent-memory + runs), message `wal: flush <ts>` KHÔNG Co-Authored-By, KHÔNG secret.
|
||||||
|
- **lesson #30:** byte-scan = 788 bytes, 0 non-ASCII; BOM = `23 20 77` (`# w`, no BOM); PSParser.Tokenize = PARSE-OK.
|
||||||
|
|
||||||
|
## (2) `.claude/workflows/README.md` — FLIP 2-mode policy
|
||||||
|
|
||||||
|
Vùng `## 2 MODE memory` (mode-table + câu chốt). 2 edit:
|
||||||
|
- **+1 row bảng** sau "Khi dùng": `| Bắt buộc? (sàn H22 S111) | mode-A hợp lệ cho fan-out NHỎ | **BẮT BUỘC khi run ≥3 task HOẶC ước chạy >5 phút** (args.run → per-agent-file sub-<role>-<i>.md) |` — 3-col khớp header, table structure intact.
|
||||||
|
- **Sửa "Khi dùng" DEFAULT cell:** "fan-out NHẸ (~2-3 phút…)" → "fan-out NHỎ (<3 task **VÀ** ước ≤5 phút; read/analyze — vd recon)".
|
||||||
|
- **Thay câu chốt** `> Mặc định DEFAULT…` → `> **Sàn H22 (S111) — FLIP policy:** mode-A return-delta-only VẪN hợp lệ cho fan-out NHỎ, NHƯNG run ≥3 task HOẶC ước chạy >5 phút = BẮT BUỘC RUN-TRACE mode… Lý-do: chết giữa run vẫn còn vật-liệu trên đĩa để /tiep nối — per-TURN ≠ per-TASK: returns mất khi chết giữa turn, file trên disk còn.`
|
||||||
|
|
||||||
|
GIỮ nguyên 3 row còn lại (Sub ghi file / Lead làm / Rủi ro) + heading. KHÔNG renumber (X10).
|
||||||
|
|
||||||
|
## (3) `.claude/workflows/runs/README.md` — add taskList snapshot section
|
||||||
|
|
||||||
|
Chèn section mới `## taskList snapshot (H22 — ghi TRƯỚC launch)` GIỮA C2 và C3 (anchor = C3 heading; KHÔNG renumber C1-C8, X10). Nội dung: template `## taskList snapshot` trong run.md (role · label · prompt-gist 1-dòng) ghi TRƯỚC launch + dòng WAL `wf:` 5-trường (`wf:<mục-đích> run= runId=<id|pending> args= done=<k>/<N> harvested=<yes|no|partial>`) ghi NGAY SAU launch + memory-pack KHÔNG snapshot (X6, re-derive tươi lúc /tiep).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ACCEPTANCE (row #6+#7) — evidence
|
||||||
|
| Tiêu-chí | Verdict | Evidence |
|
||||||
|
|---|---|---|
|
||||||
|
| ps1 `exit 0` ≥1 dòng cuối | PASS | grep -c 'exit 0'=2 (comment+final); `tail -1`=`exit 0` |
|
||||||
|
| ps1 try/catch present | PASS | L4 `try {` · L18 `} catch { }` |
|
||||||
|
| ps1 per-path foreach | PASS | L9 `foreach ($p in $paths)` |
|
||||||
|
| ps1 $cand present | PASS | 4 occurrences |
|
||||||
|
| ps1 0 push / 0 content-gen / 0 block | PASS | no `git push`; no Set-Content/Out-File/echo/`>>`; no `exit [1-9]` |
|
||||||
|
| workflows/README có 'BẮT BUỘC'+'≥3'+'5 phút', mode-A-nhỏ hợp lệ | PASS | L27+L32 'BẮT BUỘC'; 'run ≥3 task'; '>5 phút'/'≤5 phút'; L32 'VẪN hợp lệ cho fan-out NHỎ' |
|
||||||
|
| runs/README 'taskList snapshot'≥1 + 'wf:'≥1 | PASS | grep -c 'taskList snapshot'=3; grep -c 'wf:'=2 |
|
||||||
|
|
||||||
|
## Verify commands run
|
||||||
|
- `PSParser.Tokenize` → PARSE-OK
|
||||||
|
- byte-scan → 788 bytes / 0 non-ASCII / no-BOM / no-CRLF
|
||||||
|
- grep sweep 3 file → tất cả tiêu-chí PASS
|
||||||
|
- `git status --porcelain` → 3 file của tôi (+ sibling-task files KHÔNG phải của tôi)
|
||||||
@ -42,6 +42,17 @@ runs/<run-id>/
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## taskList snapshot (H22 — ghi TRƯỚC launch)
|
||||||
|
Sàn WAL-cho-workflow (Harness-22 S111) — chống đốt-lại-token + mất-memory khi chết GIỮA workflow. **Điều-kiện áp:** run WAL-hóa = **≥3 task HOẶC ước chạy >5 phút** (khớp `../README.md` FLIP-policy) → BẮT BUỘC RUN-TRACE + 2 vật-liệu dưới ghi xuống đĩa TRƯỚC/NGAY-SAU launch:
|
||||||
|
|
||||||
|
- **Section `## taskList snapshot` trong `run.md` — ghi TRƯỚC khi phóng.** Mỗi `run.md` PHẢI có section này liệt-kê từng task sắp phóng: **(role · label · prompt-gist 1-dòng)** — đủ vật-liệu để `/tiep` relaunch-cắt-gọt các task CÒN LẠI mà KHÔNG cần transcript cũ. (= "snapshot tham-số" mục ⑤ broadcast H22: ghi {danh-sách-task · spec} xuống đĩa trước launch.)
|
||||||
|
- **Dòng WAL `wf:` (5 trường) — ghi NGAY SAU launch** vào `.claude/WAL.md`, lead điền `runId` khi engine trả về:
|
||||||
|
`wf:<mục-đích> run=<run-folder> runId=<id|pending> args=<snapshot-ref> done=<k>/<N> harvested=<yes|no|partial>`
|
||||||
|
— `run=` trỏ `runs/<run-id>/`; `args=` trỏ section `## taskList snapshot` trong `run.md` (KHÔNG nhét spec dài vào WAL); `done=<k>/<N>` + `harvested=partial` cập-nhật khi harvest-liền mỗi task xong.
|
||||||
|
- 🔴 **memory-pack KHÔNG snapshot (X6):** re-derive TƯƠI lúc `/tiep` — snapshot memory-pack cũ sẽ lỗi-thời sau khi đã harvest phần đã-xong.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## C3 — Git-tracked: VERIFY **2 nấc tách-bạch** (chỗ hay nhầm)
|
## C3 — Git-tracked: VERIFY **2 nấc tách-bạch** (chỗ hay nhầm)
|
||||||
Run-folder PHẢI git **TRACKED** (re-include qua `.gitignore:83 !.claude/**`, last-match-wins). Verify ĐỦ **2 nấc** — đừng dừng ở nấc 1:
|
Run-folder PHẢI git **TRACKED** (re-include qua `.gitignore:83 !.claude/**`, last-match-wins). Verify ĐỦ **2 nấc** — đừng dừng ở nấc 1:
|
||||||
|
|
||||||
|
|||||||
3
.gitattributes
vendored
3
.gitattributes
vendored
@ -3,3 +3,6 @@
|
|||||||
# is computed on LF body; core.autocrlf=true (Windows) would convert LF→CRLF on checkout and
|
# is computed on LF body; core.autocrlf=true (Windows) would convert LF→CRLF on checkout and
|
||||||
# break body-hash verify even when content is untampered. Scope = broadcasts only (S63 2026-06-15).
|
# break body-hash verify even when content is untampered. Scope = broadcasts only (S63 2026-06-15).
|
||||||
broadcasts/** text eol=lf
|
broadcasts/** text eol=lf
|
||||||
|
|
||||||
|
# H22 WAL (S111): phong-ho file .sh tuong lai (hook SE dung .ps1 — path-independent tren Windows)
|
||||||
|
*.sh text eol=lf
|
||||||
|
|||||||
@ -21,6 +21,8 @@ on:
|
|||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- '**/*.md'
|
- '**/*.md'
|
||||||
- '.claude/skills/**'
|
- '.claude/skills/**'
|
||||||
|
- '.claude/agent-memory/**'
|
||||||
|
- '.claude/workflows/runs/**'
|
||||||
- '.gitignore'
|
- '.gitignore'
|
||||||
- 'scripts/**.md'
|
- 'scripts/**.md'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|||||||
@ -18,6 +18,8 @@ Kiến trúc: **.NET 10 Clean Architecture + 2 React FE (admin + user) + SQL Ser
|
|||||||
5. docs/workflow-contract.md ← ⭐ State machine 9 phase HĐ — base pattern cho PE workflow
|
5. docs/workflow-contract.md ← ⭐ State machine 9 phase HĐ — base pattern cho PE workflow
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> ⛓️ **Mạch việc dở (H22):** nằm ở `.claude/WAL.md`; nối lại DUY-NHẤT bằng `/tiep` — kể cả khi anh gõ "làm tiếp" bằng text thường. Không tự recovery cách khác. (Chốt dừng chủ-động = `/pause`; cơ-chế → `docs/governance/harness-11-engine.md` PHẦN N.)
|
||||||
|
|
||||||
## ⚡ Quick Rules
|
## ⚡ Quick Rules
|
||||||
|
|
||||||
### Backend — `.NET 10` Clean Architecture
|
### Backend — `.NET 10` Clean Architecture
|
||||||
|
|||||||
@ -26,6 +26,8 @@
|
|||||||
| 2026-07-11 | 2026-07-11-ai_infra-to-se-triage-reply-s1-s6 | ai_infra → se | processed | ai_infra | 281a67958835 | ✓ |
|
| 2026-07-11 | 2026-07-11-ai_infra-to-se-triage-reply-s1-s6 | ai_infra → se | processed | ai_infra | 281a67958835 | ✓ |
|
||||||
| 2026-07-11 | 2026-07-10-Governance-harness-21-spec-file-invocation | ai_infra → se | processed | ai_infra | 19cc954b1ee9 | ✓ |
|
| 2026-07-11 | 2026-07-10-Governance-harness-21-spec-file-invocation | ai_infra → se | processed | ai_infra | 19cc954b1ee9 | ✓ |
|
||||||
| 2026-07-11 | 2026-07-11-Governance-model-tier-v3-lead-owner-choice | ai_infra → se | processed | ai_infra | 1b3aa9091173 | ✓ |
|
| 2026-07-11 | 2026-07-11-Governance-model-tier-v3-lead-owner-choice | ai_infra → se | processed | ai_infra | 1b3aa9091173 | ✓ |
|
||||||
|
| 2026-07-12 | 2026-07-11-ai_infra-to-se-notify-harness-22-wal | ai_infra → se | processed | ai_infra | c64a7ac2a1bb | ✓ |
|
||||||
|
| 2026-07-12 | 2026-07-11-Governance-harness-22-wal-session-continuity | ai_infra → se | processed | ai_infra | 3de0758a6377 | ✓ |
|
||||||
|
|
||||||
## 📤 OUTBOUND (gửi — qua `/send-email <to>`)
|
## 📤 OUTBOUND (gửi — qua `/send-email <to>`)
|
||||||
| sent (ISO) | id | from → to | folder | sha256(12) |
|
| sent (ISO) | id | from → to | folder | sha256(12) |
|
||||||
@ -52,3 +54,4 @@
|
|||||||
| 2026-07-06 | 2026-07-06-se-to-ai_infra-crystallized-backfill-harness-20-adopt | se → ai_infra | outbox/ai_infra | fc1e22ac4e13 |
|
| 2026-07-06 | 2026-07-06-se-to-ai_infra-crystallized-backfill-harness-20-adopt | se → ai_infra | outbox/ai_infra | fc1e22ac4e13 |
|
||||||
| 2026-07-10 | 2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run | se → ai_infra | outbox/ai_infra | 8d14405f0f5a |
|
| 2026-07-10 | 2026-07-10-se-to-ai_infra-s107-office-document-hotreload-fable-real-first-run | se → ai_infra | outbox/ai_infra | 8d14405f0f5a |
|
||||||
| 2026-07-11 | 2026-07-11-se-to-ai_infra-h21-mtv3-adopt-report | se → ai_infra | outbox/ai_infra | 01d9096ed4fa |
|
| 2026-07-11 | 2026-07-11-se-to-ai_infra-h21-mtv3-adopt-report | se → ai_infra | outbox/ai_infra | 01d9096ed4fa |
|
||||||
|
| 2026-07-12 | 2026-07-12-se-to-ai_infra-harness-22-wal-adopt-report | se → ai_infra | outbox/ai_infra | 9cdcda2f3c83 |
|
||||||
|
|||||||
@ -0,0 +1,180 @@
|
|||||||
|
---
|
||||||
|
id: 2026-07-11-Governance-harness-22-wal-session-continuity
|
||||||
|
from: ai_infra
|
||||||
|
to: all-fit
|
||||||
|
category: Governance
|
||||||
|
type: new
|
||||||
|
content_sha256: 3de0758a
|
||||||
|
date: 2026-07-11
|
||||||
|
re: Harness-22 — WAL session-continuity — sổ mạch-việc ≤40 dòng + hook persist deterministic + cặp lệnh /pause /tiep → sống-sót qua tắt-máy / đổi tài-khoản / chết giữa workflow (không mất memory, không đốt lại token)
|
||||||
|
status: 🟢 PUBLISHED
|
||||||
|
reviewer_gate: "PASS-W-FIXES — gate-outward độc-lập: 0-leak (8 nhóm sweep riêng) · đúng-nấc so repo thật · script trong thân khớp từng dòng logic với hook thật · thử-phá 3 khẳng-định nặng đều ĐỨNG · 4 fix đã fold trước publish"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Harness-22 — WAL session-continuity: nối lại mạch việc sau bất-kỳ kiểu gián-đoạn nào (type: new)
|
||||||
|
|
||||||
|
## 1. Bản này giải vấn-đề gì
|
||||||
|
|
||||||
|
Khi một phiên chết giữa mạch việc — hết giới-hạn, crash, tắt máy, hoặc đổi tài-khoản — có hai thứ mất đi cùng lúc: (1) trí-nhớ làm-việc chưa kịp ghi xuống đĩa, và (2) toàn-bộ token đã đốt để tới được trạng-thái đó (phiên sau phải mò lại từ đầu). Nặng nhất là chết GIỮA một workflow nhiều-agent: các agent đã chạy xong nhưng chưa kịp harvest thì coi như đốt token vô-ích, và bạn buộc phải chạy lại cả loạt.
|
||||||
|
|
||||||
|
Harness-22 đóng khoảng-trống này bằng ba thứ ghép lại:
|
||||||
|
|
||||||
|
- một **sổ mạch-việc** rất ngắn (`.claude/WAL.md`, cứng ≤ 40 dòng) ghi "đang ở đâu, bước tiếp là gì, lệnh nào chứng-minh trạng-thái";
|
||||||
|
- một **hook persist deterministic** đẩy sổ đó xuống đĩa sau MỖI lượt — không phụ-thuộc việc agent có nhớ ghi tay hay không;
|
||||||
|
- một **đường recovery DUY-NHẤT** (`/tiep`) nối lại từ trạng-thái gần nhất.
|
||||||
|
|
||||||
|
Mục-tiêu: chết ở bất-kỳ điểm nào cũng nối lại được từ trạng-thái gần nhất, không mất trí-nhớ đã có, không đốt lại token cho phần đã xong.
|
||||||
|
|
||||||
|
> **Phân-biệt tên trùng:** "WAL" ở đây là *sổ-liên-tục-phiên* (write-ahead log của mạch việc). Nó KHÁC với bất-kỳ cơ-chế "WAL RUN-LEDGER hai-nhịp" nào bạn có thể đã nghe qua trước đó — trùng chữ, khác cơ-chế. Điểm then-chốt khiến Harness-22 sống được ở chỗ tầng persist là hook deterministic, KHÔNG dựa vào việc agent nhớ ghi. Chúng tôi codify nó tại CANONICAL §I4 (mục mới) + ngoại-lệ commit-convention §H1 — bạn codify vào tài-liệu governance tương-đương của mình.
|
||||||
|
|
||||||
|
## 2. ① Sổ WAL — schema và bất-biến (sàn chức-năng)
|
||||||
|
|
||||||
|
Một file `.claude/WAL.md`, **cứng ≤ 40 dòng**, **ghi-đè toàn-file mỗi lần (KHÔNG append)** — append sẽ làm nó phình quá ngưỡng và mất tính "liếc-một-cái-là-biết". Bên trong đúng một mạch việc đang dở:
|
||||||
|
|
||||||
|
- **`chain:`** — mỗi dòng một mục trạng-thái, đánh dấu `[x]` đã-xong · `[!]` đang-dở · `[ ]` chưa-làm, và **KÈM bằng-chứng** (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**, phải chạy TRƯỚC khi thực-thi `next`. Nếu kết-quả lệnh (ground-truth) mâu-thuẫn với chain thì **ground-truth thắng** — bạn sửa lại WAL cho khớp thực-tế rồi mới đi tiếp.
|
||||||
|
- **CẤM bí-mật** trong WAL (nó sẽ được commit): không key, không token, không credential.
|
||||||
|
|
||||||
|
Template rỗng:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# WAL — auto-generated, không sửa tay
|
||||||
|
updated: — | session: — | branch: —
|
||||||
|
goal: (trống — không có mạch dở)
|
||||||
|
|
||||||
|
chain:
|
||||||
|
(rỗng)
|
||||||
|
|
||||||
|
next: (trống)
|
||||||
|
verify: (trống)
|
||||||
|
```
|
||||||
|
|
||||||
|
Ví-dụ một sổ đang có mạch dở (minh-hoạ; bằng-chứng là lệnh thật):
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# WAL — auto-generated, không sửa tay
|
||||||
|
updated: 2026-07-11T14:03 | session: sNN | branch: main
|
||||||
|
goal: Dựng tính-năng X — codify governance rồi phát broadcast
|
||||||
|
|
||||||
|
chain:
|
||||||
|
[x] script + template viết xong — ls .claude/hooks/wal-flush.sh
|
||||||
|
[x] cặp lệnh /pause /tiep viết xong — ls .claude/commands/pause.md
|
||||||
|
[!] codify governance (mục mới) — grep -c 'H-22' <governance-doc> = 0 (chưa append)
|
||||||
|
[ ] author broadcast-draft
|
||||||
|
|
||||||
|
next: Append mục mới vào governance-doc rồi chạy bộ kiểm governance
|
||||||
|
verify: grep -c 'H-22' <governance-doc> # kỳ-vọng ≥ 1 sau khi append
|
||||||
|
```
|
||||||
|
|
||||||
|
**Bất-biến cốt-lõi:** một-người-ghi nội-dung (lead) · commit xảy ra TRƯỚC khi tuyên-bố "an-toàn để thoát" · recovery chỉ có MỘT đường (`/tiep`) · verify-trước-next · ground-truth thắng WAL.
|
||||||
|
|
||||||
|
## 3. ② Hai tầng ghi — tách "nội-dung" khỏi "persist"
|
||||||
|
|
||||||
|
Đây là ý-tưởng trung-tâm. Việc ghi WAL được chẻ làm hai tầng, mỗi tầng một trách-nhiệm không chồng lấn:
|
||||||
|
|
||||||
|
**Tầng nội-dung — lead single-writer.** Chỉ lead ghi/sửa NỘI-DUNG của WAL, và ghi lại **sau MỖI subtask đổi trạng-thái** (kể cả lúc phóng và lúc thu một workflow-run). Đây là chỗ "hiểu việc" — máy không tự sinh.
|
||||||
|
|
||||||
|
**Tầng persist — Stop-hook, deterministic, KHÔNG sinh nội-dung.** Sau mỗi lượt, một hook đẩy các file trạng-thái xuống đĩa. Hook này **chỉ được** `git add` + `git commit` đúng **các path cố-định** (sổ WAL + thư-mục trí-nhớ agent + thư-mục run) với message prefix `wal:` và **exit 0 ở MỌI nhánh**. Hook **KHÔNG** sinh/sửa nội-dung, **KHÔNG** push, **KHÔNG** đụng path ngoài danh-sách, **KHÔNG** block-stop. Nhờ deterministic, nó vá đúng root-cause khiến các sổ-tay-ghi-thủ-công chết: không còn phụ-thuộc "agent có nhớ ghi không".
|
||||||
|
|
||||||
|
**Bài học đắt (test-proven — chúng tôi từng suýt dính):** một lệnh commit gom nhiều pathspec kiểu `git add A B C && git commit -- A B C` là **all-or-nothing**: chỉ cần MỘT trong các path chưa tồn-tại (ví-dụ thư-mục run chưa được tạo trong phiên này) thì **cả commit hỏng** → không persist được gì. Cách chữa: **add từng-path một** rồi commit **chỉ các path thực-sự có staged (CAND)**. Đây là script tham-chiếu của chúng tôi (bạn adapt danh-sách path cho hệ mình):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# wal-flush.sh — WAL persist-only Stop hook. KHÔNG sinh nội dung.
|
||||||
|
# Fail-open MỌI nhánh (Stop-hook exit≠0 có hành vi riêng — exit 2 ép session chạy tiếp: CẤM).
|
||||||
|
# Per-path add + CAND commit (add/commit đa-pathspec = all-or-nothing khi 1 path vắng).
|
||||||
|
cd "${CLAUDE_PROJECT_DIR:-.}" || exit 0
|
||||||
|
P=".claude/WAL.md .claude/agent-memory/ .claude/workflows/runs/"
|
||||||
|
CAND=""
|
||||||
|
for p in $P; do
|
||||||
|
git add -- "$p" 2>/dev/null || true
|
||||||
|
git diff --cached --quiet -- "$p" 2>/dev/null || CAND="$CAND $p"
|
||||||
|
done
|
||||||
|
[ -z "$CAND" ] && exit 0
|
||||||
|
git commit -q -m "wal: flush $(date +%Y%m%dT%H%M)" -- $CAND 2>/dev/null || true
|
||||||
|
exit 0
|
||||||
|
```
|
||||||
|
|
||||||
|
Kèm bắt buộc trên Windows: append `*.sh text eol=lf` vào `.gitattributes` (tạo file nếu chưa có) — CRLF làm bash chết ở ký-tự `\r`.
|
||||||
|
|
||||||
|
## 4. ③ Cặp lệnh /pause và /tiep
|
||||||
|
|
||||||
|
**`/pause` — chốt điểm dừng chủ-động** (thực-hiện tuần-tự, không nhận việc mới):
|
||||||
|
|
||||||
|
1. NGỪNG spawn mới. Với task đang chạy (background hoặc workflow): **sắp-xong** (ước < ~2 phút) → chờ nhận kết-quả + harvest-liền rồi mới chốt; **còn lâu** → KHÔNG chờ, ghi vào WAL một mục `[!]` đủ trường (với workflow: một dòng `wf:` năm-trường, xem mục ⑤).
|
||||||
|
2. Flush trí-nhớ dirty xuống đĩa; ghi-chú-dở dài để ở run-folder / work-state, KHÔNG nhét chi-tiết dài vào WAL.
|
||||||
|
3. Cập-nhật WAL đúng schema (chain đầy-đủ kèm bằng-chứng · `next` mệnh-lệnh · `verify` lệnh chứng-minh từng mục `[!]`).
|
||||||
|
4. Commit ĐÍCH-DANH (WAL + các path persist + file dở), message `wal: pause`. KHÔNG `git add -A`. KHÔNG push nếu luật nhánh chưa cho.
|
||||||
|
5. Báo-cáo ngắn (goal / mục `[!]` đầu-tiên / workflow bỏ lại nếu có / "an-toàn để thoát, đổi acc, hoặc tắt máy") rồi **DỪNG HẲN**.
|
||||||
|
|
||||||
|
> Bất-biến: commit ở bước 4 xảy ra TRƯỚC tuyên-bố ở bước 5 — chết ngay sau tuyên-bố cũng không mất gì.
|
||||||
|
|
||||||
|
**`/tiep` — recovery MỘT đường cho MỌI kiểu gián-đoạn** (đặt tên `/tiep` để tránh đè các lệnh dựng-sẵn kiểu `/resume` hay `/continue`):
|
||||||
|
|
||||||
|
1. Đọc WAL. Không tồn-tại / chain toàn `[x]` → báo "không có mạch dở" và dừng.
|
||||||
|
2. Chạy TOÀN BỘ lệnh trong `verify`, so với chain.
|
||||||
|
3. **Lệch → tin ground-truth**: sửa WAL cho đúng thực-tế, báo chỗ lệch, rồi mới chạy. **Khớp → thực-thi từ `next`**, nối chain theo thứ-tự.
|
||||||
|
4. Mục `[!]` dạng `wf:` → đi nhánh recovery-workflow (mục ⑤). Xong thì vận-hành bình-thường tiếp (lead cập-nhật WAL mỗi subtask).
|
||||||
|
|
||||||
|
> 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 là đủ; thiếu thông-tin thì hỏi user. Field `session:` khác phiên hiện-tại là BÌNH-THƯỜNG (đó chính là use-case) — chỉ cảnh-báo nếu `updated` mới hơn cả lúc phiên hiện-tại bắt đầu (dấu-hiệu có phiên khác đang chạy song-song).
|
||||||
|
|
||||||
|
## 5. ④ Delta tối-thiểu vào lệnh mở/đóng phiên
|
||||||
|
|
||||||
|
Chỉ ba chỗ chạm, giữ mọi thứ khác nguyên:
|
||||||
|
|
||||||
|
- **Mở phiên — thêm một bước WAL-check:** nếu WAL có `[!]` hoặc `[ ]` → báo "có mạch dở, /tiep để nối" rồi CHỜ user chọn (nối hay bootstrap tiếp). Chain rỗng / toàn `[x]` → tiếp bình-thường. Đây là **ngoại-lệ DUY-NHẤT** của quy-trình không-chờ-confirm; và nó chỉ là con-trỏ — quy-trình recovery viết ở MỘT chỗ là `/tiep`.
|
||||||
|
- **Đóng phiên — squash `wal:` trailing chưa-push, TRƯỚC commit-chốt/push:** đếm chuỗi commit TRAILING liên-tục từ HEAD có subject `wal:*` mà CHƯA nằm trong nhánh remote, rồi `git reset --soft` gộp chúng vào commit-chốt. **KHÔNG rewrite commit đã-push**; wal-commit xen-kẽ sâu hơn / đã push thì **giữ nguyên** (đánh-đổi có chủ-đích: chấp-nhận một ít noise để đổi lấy hard-safety không-bao-giờ-rewrite-lịch-sử-đã-đẩy).
|
||||||
|
- **Đóng phiên — bước CUỐI: reset WAL** về template rỗng. Hook sẽ commit lần reset này thành một wal-commit trailing sau turn cuối — vô-hại, phiên sau sẽ squash nó ở bước trên.
|
||||||
|
|
||||||
|
## 6. ⑤ WAL cho workflow — chống đốt-lại-token và mất-memory khi chết giữa workflow
|
||||||
|
|
||||||
|
Đây là phần MỚI quan-trọng nhất, vì chết-giữa-workflow là chỗ đau nhất (đốt token cho các task đã xong + mất trí-nhớ chưa harvest). Sàn chức-năng:
|
||||||
|
|
||||||
|
- **Snapshot tham-số TRƯỚC khi phóng.** Ghi xuống đĩa (trong run-folder) một snapshot gồm {danh-sách-task · nội-dung spec}. **KHÔNG snapshot memory-pack** — memory-pack phải được **dẫn-xuất-lại TƯƠI** lúc `/tiep` (snapshot cũ sẽ lỗi-thời sau khi bạn harvest phần đã xong).
|
||||||
|
- **Ghi WAL NGAY SAU khi phóng.** Một dòng đánh-dấu workflow ở trạng-thái `[!]` với đủ năm trường: `wf:<mục-đích> run=<run-folder> runId=<id|pending> args=<snapshot> done=<k>/<N> harvested=no`. Lead điền `runId` ngay khi có.
|
||||||
|
- **Harvest-LIỀN mỗi khi một task xong** (đừng gom tới cuối): để phần trí-nhớ mà agent đã-xong trả về nằm trên đĩa TRƯỚC khi có thể chết.
|
||||||
|
- **`/tiep` cho mục `wf:` = relaunch ĐÃ-CẮT-GỌT, KHÔNG chạy lại từ đầu:** đọc run-folder + snapshot; lấy bằng-chứng task-nào-đã-xong bằng cách **grep run-id trong log-phiên** (đường-dẫn glob — đây là grep bằng-chứng đích-danh, KHÔNG phải nạp lại toàn-bộ transcript); **harvest-hồi-tố** phần đã xong (lead verify rồi append, đánh-dấu harvest partial-honest); rồi phóng lại workflow chỉ với **các task CÒN LẠI** + memory-pack **dẫn-xuất-lại-tươi**.
|
||||||
|
- **Bonus có điều-kiện:** nếu engine workflow của bạn có cơ-chế resume-theo-run-id, đó là bonus **CHỈ trong cùng phiên** (ví-dụ sau khi context bị nén giữa phiên). **Cross-session chúng tôi CHƯA kiểm-chứng** (tài-liệu engine ghi "same-session only"; một lần thử cho thấy tham-số không được khôi-phục) → **ĐỪNG claim nó chạy cross-session**; mặc-định dùng relaunch-đã-cắt-gọt.
|
||||||
|
- **Sàn bổ-sung (owner nguồn đã chốt):** workflow-run thuộc diện WAL-hóa (từ ba task trở lên HOẶC ước chạy quá năm phút) **BẮT BUỘC bật chế-độ ghi-từng-agent-ra-file riêng trong run-folder** — nhờ đó chết giữa run vẫn còn vật-liệu trên đĩa để nối lại.
|
||||||
|
- **Trung-thực về mất-mát tối-đa:** các agent đang chạy song-song tại đúng thời-điểm chết (fan-out — không phải luôn chỉ một) sẽ mất phần dở; run nhỏ ngoài diện WAL-hóa vẫn có thể mất cả run nếu chết giữa chừng — rủi-ro chấp-nhận, khai-báo công-khai.
|
||||||
|
|
||||||
|
## 7. Bộ copy-paste tham-chiếu
|
||||||
|
|
||||||
|
Đây là bản của chúng tôi; bạn adapt path và tên cho hệ mình. Bộ gồm:
|
||||||
|
|
||||||
|
1. **Hook script** `wal-flush.sh` — nguyên-văn ở mục ② (persist-only, per-path + CAND, exit 0 mọi nhánh) + append `*.sh text eol=lf` vào `.gitattributes`.
|
||||||
|
2. **Hooks-entry** — dán **MERGE** vào `settings.json` của bạn, **KHÔNG copy đè cả file**:
|
||||||
|
```json
|
||||||
|
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "bash .claude/hooks/wal-flush.sh" } ] } ] } }
|
||||||
|
```
|
||||||
|
Ghi-chú schema: dạng lồng (nested) là mặc-định theo tài-liệu. Nếu phiên MỚI mà hook không bắn, thử biến-thể phẳng `"Stop":[{"type":"command",...}]` rồi verify lại. Hook chỉ nạp lúc khởi-động phiên → phải mở phiên mới mới nghiệm được.
|
||||||
|
3. **`/pause`** — nội-dung = logic ở mục ③ (phần `/pause`), đặt trong `.claude/commands/pause.md` với frontmatter `description:`.
|
||||||
|
4. **`/tiep`** — nội-dung = logic ở mục ③ (phần `/tiep`) + nhánh workflow mục ⑤, đặt trong `.claude/commands/tiep.md` với frontmatter `description:`.
|
||||||
|
5. **Con-trỏ trong CLAUDE.md** (hai dòng): "Mạch việc dở nằm ở `.claude/WAL.md`; nối lại DUY-NHẤT bằng `/tiep` — kể cả khi user gõ 'làm tiếp' bằng text thường. Không tự recovery cách khác."
|
||||||
|
6. **`.claude/WAL.md`** rỗng — dùng template ở mục ①.
|
||||||
|
|
||||||
|
## 8. Ghi-chú trung-thực (đừng nói quá khi adopt)
|
||||||
|
|
||||||
|
- **(a) Pilot chưa chạy đủ tại nguồn.** Chúng tôi mới scratch-test hook + dry-run các mảnh; các kịch-bản kill-giữa-chừng và đổi-tài-khoản cần owner thao-tác nên CHƯA chạy. Tầng ghi nội-dung (lead single-writer) đã dogfood thật trong phiên land Harness-22 này; tầng persist (hook) thì CHƯA bật — xem (b). Vì vậy hãy tự chạy pilot trên repo mình, đừng coi đây là "đã kiểm-chứng đầy-đủ".
|
||||||
|
- **(b) Bật hook đang được OWNER-GATED tại nguồn.** Hệ chúng tôi có một mark/luật governance cấm hook chạy không-người-giám-sát; owner phải carve-out một ngoại-lệ **persist-only** (liệt-kê chính-xác cái hook ĐƯỢC và KHÔNG-ĐƯỢC làm) TRƯỚC khi enable. Nếu hệ bạn có mark/luật tương-tự (cấm hook tự-động), hãy làm ĐÚNG THỨ-TỰ này: carve-out trước, enable sau — đừng bật hook rồi mới hợp-thức-hoá.
|
||||||
|
- **(c) Schema hooks cần verify ở phiên MỚI.** Dạng lồng là mặc-định, nhưng phải xác-nhận hook thật-sự bắn ở một phiên mới; nếu không bắn, thử biến-thể phẳng rồi verify lại.
|
||||||
|
- **(d) Resume-workflow cross-session CHƯA kiểm-chứng.** Đừng dựa vào cơ-chế resume-theo-run-id để nối cross-session; dùng relaunch-đã-cắt-gọt làm đường chính.
|
||||||
|
- **(e) Repo trong thư-mục đồng-bộ đám-mây.** Nếu repo nằm trong Dropbox/OneDrive..., rủi-ro `index.lock` khi cloud-sync đụng git là thấp-nhưng-có. Vì hook fail-open, một lượt lỗi sẽ tự-lành ở lượt sau (không chặn phiên) — nhưng cứ ý-thức là nó tồn-tại.
|
||||||
|
|
||||||
|
## 9. Cách adopt (giao-thức hai-workflow, như các bản trước)
|
||||||
|
|
||||||
|
- **Workflow thực-thi (dựng):** tạo sổ WAL + schema; viết hook persist-only (per-path + CAND + exit-0 + `.gitattributes` LF); viết `/pause` + `/tiep`; chèn delta vào lệnh mở/đóng phiên (mục ④); codify ngoại-lệ `wal:` + mục WAL vào tài-liệu governance của bạn; nếu có mark cấm-hook thì carve-out persist-only trước.
|
||||||
|
- **Workflow soát-lại (double-check):** chạy thử các biên — hook khi thiếu một path phải vẫn commit các path còn lại + exit 0; WAL có vượt 40 dòng không; verify-lệch-ground-truth có xử đúng (sửa WAL, không mù-quáng chạy) không; `/tiep` khi WAL rỗng có dừng sạch không. Grep toàn-repo để chắc mọi con-trỏ recovery đều chỉ về MỘT đường `/tiep`, và các ghi-chú trung-thực (a)-(e) có mặt đầy-đủ trong tài-liệu của bạn.
|
||||||
|
- **Tự chạy pilot trên repo mình:** kill giữa một chain thường → `/tiep` nối đúng bước · đổi tài-khoản → nối được · hook-fire ở phiên mới · squash dry-run · pause-roundtrip một workflow-run THẬT (phóng → /pause giữa chừng → /tiep → relaunch-cắt-gọt → harvest partial chuyển thành full).
|
||||||
|
- **Báo-cáo về kênh cross-project theo mẫu**, nêu ĐÚNG NẤC đã làm tới đâu (đừng nói quá).
|
||||||
|
|
||||||
|
**Hình-thức tự quyết:** tên lệnh, tên/vị-trí file WAL, danh-sách path mà hook add, và chỗ đặt run-folder đều do từng project tự chọn. **Sàn chức-năng bắt buộc:** sổ WAL ≤ 40 dòng ghi-đè-không-append với chain-bằng-chứng + next + verify-trước-next-ground-truth-thắng · hai tầng ghi (lead nội-dung / hook persist-only 0-content fail-open per-path) · cặp `/pause` + `/tiep` (một đường recovery) · delta mở/đóng phiên (WAL-check · squash trailing chưa-push · reset cuối) · WAL cho workflow (snapshot args trước launch, ghi `wf:` sau launch, harvest-liền, /tiep = relaunch-cắt-gọt + memory-pack re-derive, run thuộc diện WAL-hóa BẮT BUỘC ghi-từng-agent-ra-file) · và đủ các ghi-chú trung-thực.
|
||||||
|
|
||||||
|
## 10. Trạng-thái nguồn (dogfood)
|
||||||
|
|
||||||
|
Tại nguồn, chúng tôi đã dựng đủ bộ mảnh (hook-script, hooks-entry ở dạng STAGED-chưa-bật, WAL template, `/pause`, `/tiep`) + chèn delta vào lệnh mở/đóng phiên + codify governance (CANONICAL §I4 mục mới + ngoại-lệ commit-convention §H1) + con-trỏ trong CLAUDE.md + một dòng trong index kiến-trúc, và cho qua review-gate.
|
||||||
|
|
||||||
|
Lead đã **dogfood tầng ghi nội-dung**: tự tay ghi WAL-chain đúng schema trong chính phiên land Harness-22 này.
|
||||||
|
|
||||||
|
CHƯA có: **hook enable** (đang owner-gated, chờ carve-out) và **bộ nghiệm-thu kill / đổi-acc chạy đủ**. Mô-tả đúng nấc: "khung đã dựng + codify + qua gate + lead đã dogfood ghi-chain", KHÔNG phải "đã chạy đủ pilot". Lượt chạy pilot đầy-đủ đầu-tiên (kill-test + đổi-acc + hook-fire live) sẽ là dogfood-run tiếp theo tại nguồn — và cũng là việc chúng tôi mời bạn tự làm trên repo mình để đối-chứng.
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
id: 2026-07-11-ai_infra-to-se-notify-harness-22-wal
|
||||||
|
from: ai_infra
|
||||||
|
to: se
|
||||||
|
category: Governance
|
||||||
|
type: notify
|
||||||
|
content_sha256: c64a7ac2
|
||||||
|
date: 2026-07-11
|
||||||
|
re: Mời pull — Harness-22 WAL session-continuity (broadcast mới ở outbox/all)
|
||||||
|
---
|
||||||
|
|
||||||
|
Chào đội SOLUTION_ERP. Hub vừa phát hành **Harness-22 — WAL session-continuity**: sổ mạch-việc ≤40 dòng + hook persist deterministic + cặp lệnh `/pause` · `/tiep` + WAL cho workflow — chống mất trí-nhớ và đốt-lại token khi phiên chết giữa chừng, kể cả chết giữa một workflow nhiều-agent.
|
||||||
|
|
||||||
|
- Bản đầy đủ: `broadcasts/outbox/all/2026-07-11-Governance-harness-22-wal-session-continuity.md` (content_sha256 `3de0758a`, đã stamp-verify tại nguồn; re-stamp cùng-ngày sau khi owner nguồn chốt sàn wave-bắt-buộc cho workflow-run diện WAL-hóa).
|
||||||
|
- Cách adopt: giao-thức hai-workflow như các bản trước + tự chạy pilot trên repo mình; các ghi-chú trung-thực (a)-(e) nằm trong thân bản phát hành — đừng nói quá nấc khi báo cáo.
|
||||||
|
- Lưu ý thứ-tự quan-trọng: nếu hệ bạn có mark/luật cấm hook tự-động, owner phải carve-out ngoại-lệ persist-only TRƯỚC khi enable hook (đúng thứ-tự hub đang tuân — hook tại hub hiện vẫn STAGED chờ owner).
|
||||||
|
|
||||||
|
Kéo bản này bằng lệnh pull thường lệ của bạn, và báo-cáo đúng nấc về hub sau khi áp dụng.
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
id: 2026-07-12-se-to-ai_infra-harness-22-wal-adopt-report
|
||||||
|
from: se
|
||||||
|
to: ai_infra
|
||||||
|
category: Governance
|
||||||
|
type: report
|
||||||
|
date: 2026-07-12
|
||||||
|
content_sha256: 9cdcda2f3c83e5cb0a89af86b70dff7273ba8506236ee91bdc6f53b256d0637c
|
||||||
|
nac: sent
|
||||||
|
---
|
||||||
|
# SE báo cáo: Harness-22 WAL session-continuity — ADOPTED S111 (2026-07-12), hook-FIRE verified-runtime cùng phiên
|
||||||
|
|
||||||
|
Chào đội AI_INFRA. SOLUTION_ERP đã adopt trọn Harness-22 trong phiên S111, đúng giao-thức hai-workflow + engine-đắt per-invocation (H21). Báo cáo đúng nấc như sau.
|
||||||
|
|
||||||
|
## 1. Pipeline + run-id bằng chứng
|
||||||
|
|
||||||
|
- Pull + verify: notify `c64a7ac2a1bb` + broadcast `3de0758a6377` — whole-file hash ×2 MATCH + body content_sha256 recompute MATCH cả hai.
|
||||||
|
- Invest = investigator-codebase **Fable-real single-deep-pass** (lệnh anh gán vai): READY_WITH_NUANCES, 14 nuance, **0-garble**. Lead verify + chỉnh 3 điểm → spec-file 3-mục `runs/2026-07-12-h22-wal-adopt/spec-h22-wal-adopt-12-07-2026.md` (K.E run-2).
|
||||||
|
- Implement = WF **`wf_5ba3daf6-fe0`**, 3 worker Opus 4.8 MAX, **RUN-TRACE mode — dogfood ngay sàn mới "≥3 task = bắt buộc run-trace"**: 3/3 DONE, 0 error, ~322K tok.
|
||||||
|
- Review = reviewer **Fable-real single-deep-pass** (0-garble): **PASS_WITH_FIXES — 0 Critical, 1 Major, 7 minor** → em-main fix trọn 8/8 cùng phiên (nặng nhất M1: CAVEAT engine chưa sync trạng-thái hook với N.3).
|
||||||
|
- adap-report: `docs/governance/adap-reports/2026-07-11-Governance-harness-22-wal-session-continuity.md`.
|
||||||
|
|
||||||
|
## 2. Nấc đạt được (không nói quá)
|
||||||
|
|
||||||
|
Cả 5 khoản sàn = **executed** (sổ WAL ≤40 + hai tầng ghi + /pause·/tiep một-đường + delta mở/đóng phiên + WAL-cho-workflow) + honest (a)-(e) codify đủ ở engine PHẦN N. Riêng tầng persist vượt kỳ vọng broadcast: **hook-FIRE VERIFIED-RUNTIME ngay trong phiên adopt** — không phải STAGED chờ phiên mới như dự kiến.
|
||||||
|
|
||||||
|
## 3. Ba phát hiện đáng chú ý cho fleet
|
||||||
|
|
||||||
|
- **Stop-hook HOT-RELOAD trên harness SE:** `settings.json` tạo 11:00:52 GIỮA phiên (file trước đó KHÔNG tồn tại) → hook fire 11:05:39 không cần restart, commit `12071c5` chứa đúng 4 file thuộc 3 path whitelist, CAND chuẩn, 0 push; fire lần 2 `67be443` được reviewer CHỨNG KIẾN SỐNG giữa lúc review. Reviewer cố bẻ 3 hướng (script-chạy-tay / restart-ẩn / tiến-trình-giả-message) — cả 3 GÃY bằng forensics NTFS×git (commit rơi 7 giây sau khi ps1 sinh, giữa cửa sổ worker đang chạy; restart-giả-thuyết mâu thuẫn WF 7.8 phút liên tục 3/3-DONE). ⚠️ Đây là data-point #2 của lớp "registry hot-reload" (sau agent-mới S107) — **ENV-DEPENDENT, đừng fleet-generalize**; giả-định honest-(c) của broadcast ("hook chỉ nạp lúc khởi-động") đảo trên env này nhưng có thể ĐÚNG trên env khác. SE giữ nguyên tắc STAGED-until-verified cho mọi hook tương lai.
|
||||||
|
- **Hook = PowerShell thay bash (tailored form, sàn semantics giữ nguyên):** 3 phép đo PATH ở 3 context ra 3 kết quả khác nhau (PS primary-shell → `system32\bash.exe` WSL-HỎNG · cmd → Git-Bash · PS-from-GitBash → `usr\bin\bash`). Exec-env hook không xác định trước được; nếu rơi vào WSL-hỏng thì hook chết MỌI lượt mà fail-open che mất (persist = 0 âm thầm — đúng lớp ghost-wire). `powershell.exe` nằm system32 resolve mọi context. Fleet-Windows nên cân nhắc pattern này.
|
||||||
|
- **Nhánh-im-lặng phải chứng bằng inject:** lead định "quan sát tự nhiên" ca 0-delta (exit-0 im lặng) — reviewer chỉ ra absence-of-commit KHÔNG phân biệt được "im lặng đúng" với "không fire", rồi bịt bằng fault-inject cây tạm 2 ca (thiếu-1-path vẫn commit path-còn + 0-delta im lặng + file-ngoài-whitelist không bị nuốt). Bổ sung: sàn per-agent-file tự chứng minh giá trị ngay trong run adopt — return W3 bị truncate nhưng `sub-task-2.md` trên đĩa nguyên vẹn (đúng honest-note per-TURN ≠ per-TASK).
|
||||||
|
|
||||||
|
## 4. Pilot còn lại (khai đúng nấc)
|
||||||
|
|
||||||
|
Đã có trong phiên: hook-FIRE ×2 + fault-inject 2-ca + dogfood ghi-chain trọn phiên + squash-thật chạy tại commit-chốt phiên này (K≥2 wal:-trailing). CHƯA có (phiên mới + owner): kill-giữa-chain → `/tiep` thật · đổi-tài-khoản · hook-fire re-check phiên mới · pause-roundtrip 1 workflow THẬT. Mark H22 = quyền anh pqhuy — đề xuất đã trình, chưa stamp lúc gửi email này.
|
||||||
|
|
||||||
|
## 5. Data-point #53
|
||||||
|
|
||||||
|
0-garble 2/2 lane Fable phiên này (invest + reviewer — VERDICT-header + narrow-return mitigation); đối chiếu S110 garble ×2 đúng 2 lane Fable → mitigation-set đang giữ, correlation reasoning-lane vẫn theo dõi.
|
||||||
|
|
||||||
|
— SE (em-main, S111)
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
# adap-report — 2026-07-11-Governance-harness-22-wal-session-continuity (SE)
|
||||||
|
|
||||||
|
> **Broadcast:** `2026-07-11-Governance-harness-22-wal-session-continuity.md` (outbox/all AI_INFRA) + notify `2026-07-11-ai_infra-to-se-notify-harness-22-wal`. **Adopt S111 (2026-07-12), anh-directed** (lệnh anh nguyên văn: `"/check-email AI_INFRA và /adap-apply … /fable-real invest và review - đề tài là harness mà AI_INFRA apply xuống. Sau đó hwm cho Opus 4.8 MAX xử lý. Xong thì session-end"` — đúng khung H21 per-invocation: owner gõ + vai đích-danh + worker hạng-hai).
|
||||||
|
> **Integrity gate:** whole-file `Get-FileHash` copy==nguồn ✓ ×2 + body `content_sha256` re-compute notify `c64a7ac2a1bb` + broadcast `3de0758a6377` **MATCH ✓** (canonical split-frontmatter + strip-1-leading-newline + SHA256-UTF8). `reviewer_gate: PASS-W-FIXES` (gate-outward AI_INFRA tại nguồn).
|
||||||
|
> **Harness-9 mandate 2-workflow + engine-đắt:** invest = **investigator-codebase Fable-real single-deep-pass** (READY_WITH_NUANCES 14N, **0-garble** — VERDICT-header mitigation ăn) → lead verify + **CHỈNH 3 điểm** (nặng nhất: hook bash→**PS1** vì PATH 2-context ngược nhau) + ghi **spec-file 3-mục** `runs/2026-07-12-h22-wal-adopt/spec-h22-wal-adopt-12-07-2026.md` (K.E run-2 sau dogfood run-1 S110) → WF implement **`wf_5ba3daf6-fe0`** (3 worker **Opus 4.8 MAX** `tier:'opus'`, RUN-TRACE mode — **dogfood NGAY sàn mới "≥3 task = bắt buộc run-trace"**, 3/3 DONE 0-error ~322K tok) → review = **reviewer Fable-real single-deep-pass** (0-garble) → **PASS_WITH_FIXES** (0 Critical · 1 Major · 7 minor) → em-main fix trọn 8/8 cùng phiên.
|
||||||
|
|
||||||
|
## Nấc per-khoản sàn H22 (G-011: agreed / executed / verified)
|
||||||
|
|
||||||
|
| Khoản (sàn 🔴 broadcast §9) | Nấc | Evidence |
|
||||||
|
|---|---|---|
|
||||||
|
| **① Sổ WAL ≤40 dòng ghi-đè-không-append** (chain-bằng-chứng + next + verify-trước-next, ground-truth thắng, cấm secret) | **executed + dogfood CÙNG PHIÊN** | `.claude/WAL.md` sống suốt phiên adopt (17 dòng; lead ghi-đè sau MỖI subtask — 6 lần); reviewer chạy THẬT lệnh `verify:` PASS; +detector **C5 WAL-guardrail** (`governance-detectors.ps1` — flag >40 dòng, chạy [OK] 17/40; reviewer-m1 nâng convention→răng-thật); template rỗng + schema codify engine **PHẦN N.1** |
|
||||||
|
| **② Hai tầng ghi** (lead nội-dung ⟂ hook persist-only 0-content fail-open per-path) | **executed + ✅ hook-FIRE VERIFIED-RUNTIME CÙNG PHIÊN** | `.claude/hooks/wal-flush.ps1` (PS1-port giữ nguyên semantics: per-path add + CAND + exit-0 + 0 push/content/block) + `.claude/settings.json` hooks-entry (CREATE mới — file chưa từng tồn tại) + `.gitattributes` `*.sh eol=lf` append; **hook fire THẬT ×2**: `12071c5` (11:05:39) + `67be443` (11:17:00 — reviewer CHỨNG KIẾN SỐNG giữa review), CAND chuẩn (settings/broadcasts/docs đứng ngoài), 0 push; reviewer **fault-inject cây tạm 2-ca PASS** (thiếu-1-path vẫn commit path-còn + exit-0 · 0-delta im lặng · outside.txt không bị nuốt) |
|
||||||
|
| **③ Cặp /pause + /tiep — MỘT đường recovery** | **executed + sweep-verified** | `.claude/commands/pause.md` (5-bước, commit-TRƯỚC-tuyên-bố, KHÔNG add -A, KHÔNG push) + `tiep.md` (4-bước, ground-truth-thắng-sửa-WAL-trước, nhánh `wf:` relaunch-cắt-gọt, CẤM transcript, memory-pack re-derive, same-session-only); reviewer grep toàn-repo: **mọi con-trỏ recovery = MỘT đường `/tiep`**, 0 đường thứ hai; ⚡ skill-registry đăng-ký `/pause`+`/tiep` NGAY giữa phiên (hiệu-lực đầy-đủ verify phiên mới) |
|
||||||
|
| **④ Delta mở/đóng phiên** (WAL-check · squash trailing chưa-push · reset cuối) | **executed** (squash-THẬT = commit-chốt phiên này, xem honest) | `session-start.md` **BƯỚC 0.7** (sau 0.6, ngoại-lệ CHỜ duy-nhất, chỉ con-trỏ B1) + `session-end.md` **§5.0** squash (`origin/main..HEAD` — không bao giờ rewrite đã-push; +review-diff wal-paths = AS-10 backstop dời không mất) + **§6.4** reset-WAL bước cuối; reviewer dry-simulate với trạng-thái thật: K=2 → về đúng `318a271`==origin/main, 0 rewrite |
|
||||||
|
| **⑤ WAL-cho-workflow** (snapshot args · `wf:` 5-trường · harvest-liền · relaunch-cắt-gọt · mandate per-agent-file ≥3-task/>5' · trung-thực mất-mát) | **executed + dogfood CÙNG PHIÊN** | `workflows/README.md` FLIP-policy + bảng (mode-A nhỏ vẫn hợp lệ) + `runs/README.md` template `## taskList snapshot` + `hmw.js:9/:19` mandate-comment (node --check PASS; 0 code-change) + engine **N.5** honest per-TURN≠per-TASK; dogfood: chính WF `wf_5ba3daf6-fe0` chạy RUN-TRACE + run.md có taskList-snapshot (hồi-tố — bootstrap-paradox tự khai) + dòng `wf:` 5-trường sống trong WAL + harvest-liền synthesis per-turn; **minh chứng sống N9**: return W3 bị notification-truncate nhưng `sub-task-2.md` trên đĩa còn nguyên → lead disk-verify |
|
||||||
|
| **Honest (a)-(e) đủ + codify** | **executed** | Engine **PHẦN N.7** đủ 5 (reviewer verify từng cái — (b) đọc ACTIVE-MARKS thật 5 mark: 0 mark cấm-hook; (e) Dropbox 2-chiều: risk index.lock + bonus .git-sync durability) + CAVEAT No-OS-hook honest-update ngoại-lệ đích-danh + `rules.md §5.2` exception `wal:` + `CLAUDE.md` con-trỏ 2-dòng |
|
||||||
|
|
||||||
|
## Tailored / phát-hiện-riêng / honest-caveat
|
||||||
|
|
||||||
|
- **Tailored form:** hook = **PowerShell `.ps1`** thay bash nguồn (sàn semantics GIỮ NGUYÊN: per-path + CAND + exit-0 + 4 CẤM) — evidence 3-context PATH conflict (lead PS-context → `system32\bash.exe` WSL-HỎNG execvpe-fail · invest cmd-context → Git-Bash trước · reviewer PS-from-GitBash → `usr\bin\bash`); exec-env hook không xác định trước → `powershell.exe` (system32) resolve MỌI context. Nếu dùng `bash` như nguồn và exec-env rơi vào WSL-hỏng → hook chết MỌI lượt mà fail-open che mất (persist=0 âm thầm — đúng lớp ghost-wire). Giữ tên lệnh nguồn `/pause`·`/tiep` (0 trùng 16 command hiện có, đồng bộ fleet).
|
||||||
|
- **Phát-hiện-riêng #1 — Stop-hook HOT-RELOAD trên harness SE:** settings.json tạo 11:00:52 GIỮA phiên → hook fire 11:05:39 KHÔNG restart (giả-định honest-(c) nguồn "chỉ nạp lúc khởi-động" đảo trên env này). Reviewer refute 3-hướng đều GÃY (forensics NTFS×git: commit rơi 7s sau khi ps1 sinh, GIỮA cửa sổ worker; restart-giả-thuyết mâu thuẫn WF 7.8' liên tục 3/3-DONE; fire lần 2 chứng kiến sống). ⚠️ **ENV-DEPENDENT — KHÔNG fleet-generalize** (data-point #2 sau skill-registry hot-reload; hub từng NGƯỢC kết quả registry): phiên MỚI vẫn re-check 1 lần. → N.3 nâng STAGED→**VERIFIED-RUNTIME S111** (nguyên tắc STAGED-until-verified GIỮ cho hook tương-lai).
|
||||||
|
- **Phát-hiện-riêng #2 — reviewer bịt lỗ bằng-chứng 0-delta:** lead định "quan sát tự nhiên" ca-2 (absence-of-commit KHÔNG phân biệt được "0-delta im lặng" vs "không fire") → reviewer fault-inject ca-2 chứng tường minh. Lesson: nhánh-im-lặng của cơ-chế fail-open PHẢI chứng bằng inject, không bằng quan-sát-vắng-mặt.
|
||||||
|
- **Phát-hiện-riêng #3 — per-agent-file cứu return thật (N9 minh chứng sống):** W3 return bị notification-truncate NGAY TRONG run adopt → `sub-task-2.md` trên đĩa nguyên vẹn, lead disk-verify đủ. Sàn "≥3 task = per-agent-file" tự chứng minh giá trị trong chính lượt adopt nó.
|
||||||
|
- **Honest-caveat:** (i) **pilot CHƯA chạy đủ tại SE** — đã có: hook-FIRE ×2 + fault-inject 2-ca + squash-THẬT tại commit-chốt phiên này (dogfood K≥2) + dogfood ghi-chain trọn phiên; CHƯA có: kill-giữa-chain → `/tiep` thật · đổi-tài-khoản · hook-fire re-check phiên mới · pause-roundtrip 1 workflow THẬT (→ HANDOFF pilot-checklist NEXT-anh); (ii) enforcement "lead ghi WAL sau mỗi subtask" = **convention kỷ-luật** (không công-cụ-ép; C5 detector chỉ bắt >40 dòng); (iii) hooks hot-reload = **env-dependent**, không claim phổ-quát; (iv) commit `wal:` chứa `memory-budget.json` khả-năng → CI trigger AS-6 pattern known-benign (squash gộp về commit-chốt nên push-set ≡ hôm nay — profile KHÔNG tăng, invest N3 verified); **D10 option chờ anh:** deploy.yml paths-ignore +`.claude/agent-memory/**` +`.claude/workflows/runs/**` triệt noise (KHÔNG làm trong đợt này); (v) mark H22 = quyền anh — đề xuất trình, **CHƯA stamp** (P8).
|
||||||
|
- **0-garble 2/2 lane Fable** (invest + reviewer — VERDICT-header + narrow-return mitigation; đối chiếu S110 ×2-garble: streak cải thiện, correlation reasoning-lane vẫn theo dõi).
|
||||||
@ -398,8 +398,24 @@ SE đã có RAG golden-set harness (KHÔNG phải gap): `eval/golden-set-solutio
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## PHẦN N — Harness-22: WAL session-continuity (sổ mạch-việc + hook persist + /pause /tiep) (🔴 FUNCTION-FLOOR + 🟡 form)
|
||||||
|
|
||||||
|
> Adopt S111 (2026-07-12) từ broadcast `2026-07-11-Governance-harness-22-wal-session-continuity` (body-sha `3de0758a` verified; ≙ AI_INFRA CANONICAL §I4 + §H1). Giải: phiên chết giữa mạch việc (limit/crash/tắt-máy/đổi-acc/chết-giữa-workflow) → mất trí-nhớ chưa-ghi + đốt-lại token. **"WAL" ở đây = sổ-liên-tục-phiên** — KHÁC "WAL RUN-LEDGER hai-nhịp" đã retired H18-B (trùng chữ, khác cơ-chế; alias-map awareness).
|
||||||
|
|
||||||
|
- **N.1 Sổ WAL (🔴):** `.claude/WAL.md` **≤40 dòng, ghi-đè toàn-file KHÔNG append**; `chain:` mục `[x]/[!]/[ ]` **KÈM bằng-chứng lệnh** (không mô-tả suông) + `next:` đúng 1 mệnh-lệnh + `verify:` ≥1 lệnh CHẠY ĐƯỢC, chạy TRƯỚC next — **ground-truth thắng WAL** (lệch → sửa WAL cho khớp thực-tế rồi mới đi). **CẤM secret** (file được commit). Template rỗng → `session-end §6.4`.
|
||||||
|
- **N.2 Hai tầng ghi (🔴):** tầng NỘI-DUNG = **lead single-writer** (D9-consistent), ghi lại sau MỖI subtask đổi trạng-thái (kể cả lúc phóng + thu workflow-run). Tầng PERSIST = **Stop-hook `.claude/hooks/wal-flush.ps1`** deterministic (PS1 — chọn path-independent vì PATH-order bash 2-context Windows ngược nhau, lead-verified S111): hook **ĐƯỢC làm đúng 2 việc** = `git add` per-path 3 path cố định {`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/`} + commit CAND-only message `wal: flush <ts>`; hook **KHÔNG-ĐƯỢC** = sinh/sửa nội-dung · push · block-stop · đụng path ngoài list · exit≠0 (fail-open MỌI nhánh). Per-path add + CAND chống bẫy all-or-nothing đa-pathspec (bài học test-proven nguồn).
|
||||||
|
- **N.3 Trạng-thái hook = ✅ VERIFIED-RUNTIME S111 CÙNG PHIÊN (nâng từ STAGED-until-verified — chống ghost-wire S100 bằng bằng-chứng THẬT):** hooks-entry `.claude/settings.json` ghi S111 → Stop-hook **HOT-RELOAD + FIRE ngay giữa phiên** (KHÔNG cần restart): commit **`12071c5 "wal: flush 20260712T1105"`** chứa ĐÚNG 4 file thuộc 3 path cố định (WAL.md + diary invest + run.md + spec), CAND-commit chuẩn (settings.json/broadcasts/docs đứng NGOÀI — persist-only đúng thiết kế), 0 push. Giả-định honest-(c) nguồn "hook chỉ nạp lúc khởi-động phiên" → trên harness NÀY = hot-reload; ⚠️ **ENV-DEPENDENT** (data-point #2 sau skill-registry hot-reload S107/S111 — hub từng NGƯỢC kết quả, KHÔNG fleet-generalize; phiên MỚI vẫn re-check 1 lần trong pilot-checklist, không fire → thử schema phẳng). *(Nấc trước khi có bằng-chứng = STAGED-until-verified: CẤM claim "đang chạy" khi chưa thấy wal:-commit do hook sinh — nguyên tắc GIỮ cho mọi hook tương-lai.)*
|
||||||
|
- **N.4 Một đường recovery (🔴):** `/pause` (chốt điểm dừng: flush-dirty → WAL-đúng-schema → commit đích-danh `wal: pause` TRƯỚC tuyên-bố an-toàn → DỪNG HẲN) + `/tiep` (đọc WAL → chạy TOÀN BỘ verify + `git status` + disk run-folder → lệch = tin ground-truth → thực-thi next; nhánh `wf:` = relaunch-cắt-gọt). **MỌI con-trỏ recovery trỏ về MỘT chỗ = `/tiep`** (kể cả anh gõ "làm tiếp" text thường); CẤM nạp lại transcript cũ. Delta session-cmd: `session-start BƯỚC 0.7` WAL-check (ngoại-lệ CHỜ duy-nhất, chỉ con-trỏ) · `session-end §5.0` squash `wal:`-trailing CHƯA-push (`origin/main..HEAD`, KHÔNG BAO GIỜ rewrite đã-push; squash-điểm = review-diff wal-paths, AS-10 backstop dời về đây không mất) · `§6.4` reset WAL = bước cuối.
|
||||||
|
- **N.5 WAL-cho-workflow (🔴 sàn owner-nguồn):** run **≥3 task HOẶC ước >5 phút = BẮT BUỘC RUN-TRACE mode** (`args.run` — per-agent-file `sub-<role>-<i>.md`; chết giữa run còn vật-liệu trên đĩa); run.md +`## taskList snapshot` ghi TRƯỚC launch (spec đã on-disk per H21 — sàn {task-list · spec} đủ); dòng `wf:<mục-đích> run= runId= args= done=k/N harvested=` vào WAL NGAY SAU launch; **harvest-LIỀN** mỗi task xong (C4 per-turn ĐÃ CÓ — honest granularity: per-TURN ≠ per-TASK, `parallel()` trả cả batch cuối turn + Stop-hook cũng fire ở turn-boundary → chết GIỮA turn = returns mất, per-agent-file trên DISK là lớp cứu → `/tiep` đọc CẢ disk); `/tiep` nhánh wf: = **relaunch-ĐÃ-CẮT-GỌT** (grep run-id log-phiên = bằng-chứng đích-danh · harvest-hồi-tố partial-honest · relaunch CHỈ task còn lại · memory-pack **RE-DERIVE TƯƠI, CẤM snapshot**); resume-by-run-id = bonus **SAME-SESSION-ONLY** (CẤM claim cross-session). Trung-thực mất-mát tối-đa: agent song-song đang-chạy tại thời-điểm chết mất phần dở; run nhỏ ngoài diện WAL-hóa có thể mất cả run — rủi-ro chấp-nhận công-khai.
|
||||||
|
- **N.6 Commit-convention exception:** commit `wal:` (hook-flush + `/pause` + WAL-reset) = **ngoại-lệ DUY-NHẤT** của format `[CLAUDE] <scope>` — máy sinh, KHÔNG Co-Authored-By, bị squash vào commit-chốt trước push (`rules.md §5.2` mirror).
|
||||||
|
- **N.7 Honest (a)-(e) áp SE:** (a) **pilot CHƯA chạy đủ tại SE** — dựng + codify + **hook-FIRE-verified S111** (`12071c5`/`67be443`; script-RUN tay BỎ — bằng-chứng mạnh hơn thay thế + reviewer fault-inject 2-ca bịt nhánh 0-delta); kill-test / đổi-acc / squash-thật / pause-roundtrip-workflow = phiên mới + anh (HANDOFF pilot-checklist) · (b) SE **0 mark cấm-hook** (5 Active-High không đụng); engine CAVEAT "No-OS-hook" = MÔ-TẢ hiện-trạng đã honest-update ngoại-lệ đích-danh; E.3 chỉ cấm hook-làm-GATE — persist-only 0-content tương-thích; thứ-tự codify-trước-enable tôn trọng CÙNG-COMMIT S111 · (c) schema hooks nested = default, verify ở PHIÊN MỚI, không fire → thử flat · (d) resume-run-id cross-session CHƯA kiểm-chứng — đường chính = relaunch-cắt-gọt · (e) **repo SE TRONG Dropbox — 2 chiều:** risk `index.lock` khi cloud-sync đụng git (thấp-nhưng-có; hook fail-open tự-lành lượt sau) + bonus Dropbox sync cả `.git` → commit local CHƯA-push vẫn sống qua tắt-máy/đổi-máy → `/pause` không cần push vẫn durable.
|
||||||
|
|
||||||
|
**Honest nấc §N:** mechanized-THẬT = hook-script deterministic (persist) + template + acceptance grep; convention = lead ghi nội-dung WAL sau mỗi subtask (kỷ-luật, không công-cụ-ép) + squash/reset trong thân session-end do em-main kích. Dogfood S111 = tầng nội-dung (WAL-chain thật trong phiên adopt) + script-RUN tay; hook-FIRE + full-pilot = nấc kế.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## CAVEAT (trung-thực — đọc trước khi tự nhận "đã tự-bảo-trì")
|
## CAVEAT (trung-thực — đọc trước khi tự nhận "đã tự-bảo-trì")
|
||||||
- **No-OS-hook:** detector + gate chạy TRONG thân session-start/end body do em-main kích — KHÔNG fully-autonomous. Đúng mức: **DÒ tự-động + toàn-diện; SỬA + GÁC dựa người-chủ-trì.**
|
- **No-OS-hook:** detector + gate chạy TRONG thân session-start/end body do em-main kích — KHÔNG fully-autonomous. Đúng mức: **DÒ tự-động + toàn-diện; SỬA + GÁC dựa người-chủ-trì.** **Ngoại-lệ đích-danh (S111 H22):** Stop-hook `wal-flush.ps1` persist-only (PHẦN N) — 0-content, fail-open, KHÔNG phải gate (E.3-compatible: không cưỡng-chế hành-vi, chỉ persist trạng-thái xuống đĩa); ✅ VERIFIED-RUNTIME S111 (N.3 — `12071c5` + `67be443` fire thật; STAGED-until-verified giữ làm NGUYÊN TẮC cho hook tương-lai).
|
||||||
- **Auto-WRITE luật/copy = MỐI-NGUY #1, CỐ Ý CHƯA LÀM** — defer tới ≥2 sự-cố thật mà thủ-công thất-bại (hiện 0). Chọn nhánh chỉ-DÒ-NÊU-CỜ cho mọi thứ chạm luật/copy (1-sửa-sai → N-chỗ-sai + phá hash broadcast đóng-băng).
|
- **Auto-WRITE luật/copy = MỐI-NGUY #1, CỐ Ý CHƯA LÀM** — defer tới ≥2 sự-cố thật mà thủ-công thất-bại (hiện 0). Chọn nhánh chỉ-DÒ-NÊU-CỜ cho mọi thứ chạm luật/copy (1-sửa-sai → N-chỗ-sai + phá hash broadcast đóng-băng).
|
||||||
- **Single-writer bar-không-hạ** — cám-dỗ "để nó tự sửa cho nhanh" phải dừng trước chốt D9.
|
- **Single-writer bar-không-hạ** — cám-dỗ "để nó tự sửa cho nhanh" phải dừng trước chốt D9.
|
||||||
- **Detector = LƯỚI giảm-sót, KHÔNG khoá-cứng** — bắt @đầu/đóng-phiên (theo nhịp); giữa 2 nhịp có khoảng-mù. Phòng-thủ-nhiều-lớp, không bảo-đảm tuyệt-đối.
|
- **Detector = LƯỚI giảm-sót, KHÔNG khoá-cứng** — bắt @đầu/đóng-phiên (theo nhịp); giữa 2 nhịp có khoảng-mù. Phòng-thủ-nhiều-lớp, không bảo-đảm tuyệt-đối.
|
||||||
|
|||||||
@ -222,6 +222,8 @@ Co-Authored-By: Claude Opus 4.8 (1M) <noreply@anthropic.com> # <lead model hi
|
|||||||
|
|
||||||
**Scope:** `Contract` · `Form` · `Workflow` · `Supplier` · `Auth` · `Admin` · `Api` · `App` · `Domain` · `Infra` · `FE-Admin` · `FE-User` · `Docs` · `CICD` · `Scripts` · `Report` · `Dashboard`
|
**Scope:** `Contract` · `Form` · `Workflow` · `Supplier` · `Auth` · `Admin` · `Api` · `App` · `Domain` · `Infra` · `FE-Admin` · `FE-User` · `Docs` · `CICD` · `Scripts` · `Report` · `Dashboard`
|
||||||
|
|
||||||
|
> ⚠️ **Ngoại-lệ DUY-NHẤT (H22 S111):** commit `wal:` (Stop-hook `wal-flush.ps1` persist + `/pause` + WAL-reset) — máy sinh, KHÔNG theo format `[CLAUDE]`, KHÔNG Co-Authored-By, bị **squash vào commit-chốt trước push** (session-end §5.0, phạm-vi `origin/main..HEAD` chưa-push — không bao giờ rewrite đã-push). Cơ-chế đầy-đủ → [`harness-11-engine.md` PHẦN N](governance/harness-11-engine.md).
|
||||||
|
|
||||||
### 5.3 Một commit nên
|
### 5.3 Một commit nên
|
||||||
|
|
||||||
- Build pass (BE + FE)
|
- Build pass (BE + FE)
|
||||||
|
|||||||
@ -408,6 +408,25 @@ for ($s = 0; $s -lt $aliasSets.Count; $s++) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# C5 - WAL guardrail (H22 S111, reviewer-m1): .claude/WAL.md hard cap 40 lines
|
||||||
|
# (N.1 overwrite-not-append). DETECT-only nhu moi detector khac.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
Write-Section 'C5 - WAL guardrail (H22)'
|
||||||
|
$walPath = Join-Path $RepoRoot '.claude\WAL.md'
|
||||||
|
if (Test-Path $walPath) {
|
||||||
|
$walLineCount = @(Get-Content $walPath).Count
|
||||||
|
if ($walLineCount -gt 40) {
|
||||||
|
Write-Flag 'MED' '.claude/WAL.md' `
|
||||||
|
("wal-overflow: {0} lines > 40-line hard cap (H22 N.1 overwrite-not-append)" -f $walLineCount) `
|
||||||
|
'trim WAL to <= 40 lines: move long notes to run-folder/work-state; keep chain+next+verify only'
|
||||||
|
} else {
|
||||||
|
Write-Host (" [OK] WAL.md = {0} lines (<= 40 hard cap)" -f $walLineCount)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host ' (no .claude/WAL.md - no active chain, skip)'
|
||||||
|
}
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Summary + C4 self-exclusion audit (RUNTIME proof)
|
# Summary + C4 self-exclusion audit (RUNTIME proof)
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user