Files
solution-erp/.claude/commands/tiep.md
pqhuy1987 dfa3daef05 [CLAUDE] Infra: W3 file 1-3 - San-3 canonical @tiep §0 (TRI-ACCEPT) + session-start 0.6b/0.7 + session-end push-guard
FILE 1 tiep.md -- §0 = NHA CANONICAL cua San-3 "so trong != sach" (moi, truoc day khong co):
- 3 bac: MANH (4 tin-hieu hook-independent) / TRUNG-BINH / YEU
- TRI-ACCEPT: dang-1 flat + dang-2 C8 harvest/ + dang-3 "## synthesis" trong run.md
- Va bug NGAY TRONG chinh file nay: §1 cu suy thang "chain rong => dung sach"
  (v1:17 chi dich danh cap tiep.md:15 + session-start.md:51 -- lead mac that)
- Fault-inject cay tam 9/9 PASS. 2 ca ANTI-GOODHART: file 0-byte => FLAG;
  chu "synthesis" giua cau van (khong phai heading) => FLAG (regex khong over-match).

FILE 2 session-start.md:
- 0.6b registry-probe MOI (0.6 la MODEL-probe, KHAC hoan toan). Khai chat: probe phu
  duong Agent-tool registry; duong hmw.js VALID_ROLES->agentType la BE-MAT KHAC, chua phu.
- 0.7 RUT logic -> chi TRO tiep.md §0 (B1). ACCEPTANCE: grep -c "chain rong" = 0. DAT.
- §2.1.8 H24 counter-tick content-addressed (khong blind++: hook auto-commit moi
  turn-boundary => counter++ mu se tick nhieu lan/phien). Khai gioi-han: dem "phien co
  lam HEAD doi", khong phai "phien".
- H23 note: LO CHUA-TEST precedence spawn-param vs frontmatter. Lead=Opus KHONG phan-biet
  duoc => DEFER toi phien lead=Fable. Khai thang CHUA test.
- +2 vai H24, sweep roster-12 = 0.

FILE 3 session-end.md:
- San-2 sentinel: SET @BUOC 0 (truoc moi flush) + CLEAR @6.4 (net-zero, 6.4 luon chay).
- §5.0 = PRE-PASS (khong phai cong; hook fire turn-boundary NAM SAU).
- §5.2 = squash -> count -> push CHAINED 1 LUOT. Fault-inject cay git THAT 10/10 PASS:
  * ca(2) base+wal+[CLAUDE] => K=0 => PUSH DUOC, KHONG deadlock
    (chinh shape FIX#3-bis du-bao deadlock -- trailing-K khong dinh)
  * ca(1) HEAD~K == origin/main => trailing-K TU trung FIX#3(c), nhanh rieng la THUA
  * ca(3) sau reset --soft: day [CLAUDE] nguyen ven + noi-dung con o INDEX
  * bay (a) grep -c dem 0 => exit 1 : TAI HIEN DUOC
  * bay (b) dem toan lich-su=1 vs trailing=0 : TAI HIEN DUOC (chan push vinh vien)
- §L.b(f) TRI-ACCEPT + San-5 hau-kiem (scope git %cI, KHONG mtime -- v1:120 ghi mtime
  la ban TRUOC khi mtime bi bac; FIX#4 da bo mtime khoi W0.5 dung ly-do do).
- §L.b(j) H24 counter + JUMP + NGHI-THUC RE-STAMP carry (GAP THAT thay claim-orphan sai):
  carry-age vacuous CAU-TRUC -- 45 logic-segment nhung carry-lines=1 => streak≡1 =>
  0 fire VINH VIEN. §Q3 no-retrofit => re-stamp tu nay; khai carry mo truoc S122 do-thieu.
- ④b EOL-check = INFORM, KHONG chan. Lead tu bat: da viet exit 1 chan push cho van-de
  VE-SINH, trong khi script co y exit 0 always + W0.6 da BAC BO CRLF-fatal.
- Nhan "8-step" -> (a)->(j): view-stale-count dien-hinh, nam ngay trong file dinh nghia no.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 14:48:54 +07:00

11 KiB
Raw Blame History

description: /tiep — recovery MỘT đường cho MỌI kiểu gián-đoạn (Harness-22 WAL session-continuity). §0 = NHÀ CANONICAL của Sàn-3 "sổ trống ≠ sạch" (3 bậc + TRI-ACCEPT; session-start BƯỚC 0.7 chỉ TRỎ vào đây, không chép). Rồi đọ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ự: §0 (sàn) → §1 → §2 → §3 → §4.


0. 🔴 Sàn-3 canonical — "sổ trống ≠ sạch" (ĐỊNH-NGHĨA MỘT CHỖ DUY-NHẤT)

🔴 Đây là định-nghĩa DUY-NHẤT của "còn việc dở không?". /session-start BƯỚC 0.7 chỉ TRỎ vào đây, CẤM chép logic sang (B1 con-trỏ-canonical). Hai điểm-vào (/tiep + 0.7) PHẢI gọi cùng một định-nghĩa — nếu không, hai đường sẽ trả lời khác nhau về cùng một sự thật.

Vì sao sàn này tồn-tại: WAL trống KHÔNG hàm ý sạch. Suy thẳng "chain rỗng ⇒ không có mạch dở ⇒ dừng"BUG, và nó đã từng sống ngay trong chính file này (tiep.md:15 cũ) + session-start.md:51 — lead mắc thật, không phải giả-định.

Vì sao WAL trống không đủ: hook có 3 điểm mù

.claude/hooks/wal-flush.ps1:7 tự-commit 3 path ở turn-boundary: .claude/WAL.md · .claude/agent-memory/ · .claude/workflows/runs/. ⇒ Hai tín-hiệu trực-giác nhất — "cây bẩn""có commit chưa đẩy" — đều MÙ đúng 3 vùng đó: hook vừa dọn sạch cây, vừa biến việc-dở thành wal: commit trông như nhiễu. ⇒ Nên phải soi bằng tín-hiệu hook KHÔNG chạm tới được.

🔴 BẬC MẠNH — thấy 1 trong 4HỎI LẠI ANH, KHÔNG tự kết-luận sạch

# Tín-hiệu Vì sao đáng tin Lệnh
Orphan run-folder: runs/<id>/run.mdkhông có bản-ghi-kết-quả (xem TRI-ACCEPT dưới) git-independent — miễn-nhiễm hook hoàn-toàn (đọc đĩa, không đọc git) xem block dưới
origin/main..HEAD có commit KHÔNG phải wal: hook không bao giờ sinh loại commit này ⇒ có = người làm thật ⇒ không mù git log --format='%s' origin/main..HEAD | grep -qv '^wal:'
closing: treo trong WAL = Sàn-2 sentinel (xem §0.b) grep -q '^closing:' .claude/WAL.md
wal:-commit chưa đẩy có đụng .claude/workflows/runs/ 🔴 thu-hồi một phần điểm mù: dù WAL.md bị xoá trắng, commit của chính hook vẫn tố-giác rằng một run đã được dựng git log --name-only --format='%s' origin/main..HEAD | grep -q 'workflows/runs/'

① TRI-ACCEPT — 3 dạng bản-ghi-kết-quả đều TÍNH LÀ ĐÓNG

🔴 Nấc chuẩn (S122): câu hỏi là "đã harvest chưa" — một câu hỏi về NỘI DUNG. Nếu chỉ đo TÊN FILE thì detector đo cái dễ đo, không phải cái cần đo. Đo thật @S122: 8 dương-giả / 25 run = 32%, trong đó folder ghi chép đầy-đủ nhất (pe-negative-quote: có cicd PASS + bundle-hash + smoke 200 + 6 stage [x]) vẫn bị xếp orphan. ⇒ nhận dạng-2/dạng-3 là làm detector ĐÚNG, KHÔNG phải làm nó dễ dãi.

for d in .claude/workflows/runs/*/; do
  [ -f "$d/run.md" ] || continue          # không có run.md ⇒ không phải run ⇒ bỏ qua
  found=0
  # dạng-1 — file PHẲNG (hiện-hành, h10-refine). `-s` = tồn-tại VÀ khác 0-byte.
  for f in "$d"/*-synthesis.md;         do [ -s "$f" ] && found=1 && break; done
  [ $found -eq 1 ] && continue
  # dạng-2 — C8 legacy. VERBATIM `workflows/README.md:19`:
  #   "C8: 5 run cũ S71 (h10-invest…h910-curate) giữ sub-md/+harvest/ (đừng rewrite
  #    history); close-gate chấp nhận CẢ HAI dạng."
  for f in "$d"/harvest/*-synthesis.md; do [ -s "$f" ] && found=1 && break; done
  [ $found -eq 1 ] && continue
  # dạng-3 — synthesis ghi trong THÂN run.md (S112S114; phát-hiện + chuẩn-hoá @S122).
  #   `^#+[[:space:]]*synthesis` = PHẢI là heading. Chữ "synthesis" giữa câu văn KHÔNG tính
  #   (chống nhận bừa — nếu lỏng, mọi run.md nhắc chữ đó đều được tha ⇒ detector im vĩnh-viễn).
  grep -qiE '^#+[[:space:]]*synthesis' "$d/run.md" && continue
  echo "ORPHAN: $d"
done

🧪 Block này ĐÃ fault-inject trên cây tạm (S122) — 9/9 PASS, chứng có RĂNG cả 2 chiều: FLAG đúng → orphan-thật · flat 0-byte · C8 0-byte · chữ "synthesis" không phải heading. IM đúng → dạng-1 · dạng-2 · dạng-3 · ## Synthesis (hoa + thừa space) · folder không có run.md. 🔴 Ca "0-byte" và ca "synthesis giữa câu văn" là 2 ca anti-Goodhart — thiếu chúng thì happy-path vẫn xanh mà sàn đã thủng.

⚠️ KHAI THẲNG 2 giới-hạn (đừng đọc thành "đã kín"):

  1. Dạng-4 KHÔNG máy nào bắt được. pe-negative-quote ghi kết-quả rải trong ## Stages + ## wf run-id (không có heading "synthesis"). Nhận dạng-4 = phải chấp-nhận "bất-kỳ run.md nào có vẻ nói về kết-quả" ⇒ quá lỏng, thành vô-nghĩa. ⇒ dạng-4 để nguyên cho người phán, KHÔNG cơ-khí-hoá. Đây là kẽ còn lại, không phải chuyện đã xử.
  2. Tri-accept = lưới PHÁT-HIỆN cho bản CŨ, KHÔNG phải giấy phép VIẾT bản MỚI. Đúng khuôn C8 đã dùng sẵn (tha di-sản, cấm viết mới kiểu cũ). 🔴 Run MỚI BẮT BUỘC ghi dạng-1 (<stage>-synthesis.md phẳng) — workflows/README.md:17 thiết-kế tên file mang nghĩa (RAW sub- ⟂ VERIFIED -synthesis.md); dạng-3 phá đúng thiết-kế đó. Đo @S122: cùng ngày 07-12, h22-wal-adopt ghi dạng-1 còn S112-* ghi dạng-3 ⇒ thói-quen không nhất-quán, KHÔNG phải migration — nhận dạng-3 để không kêu oan, cấm dạng-3 để không tái sinh.

🟡 BẬC TRUNG-BÌNH — nhiều file bẩn NGOÀI 3 path hook persist

🔴 PHẢI loại nhiễu EOL TRƯỚC khi đếm — repo có ~188 file dính EOL-only diff; không loại thì bậc này LUÔN KÊU ⇒ tự vô-hiệu-hoá. Bẩn ngoài 3 path + không phải EOL-only ⇒ NÊU, hỏi lại nếu nhiều.

BẬC YẾU — bẩn thô (git status --porcelain khác rỗng)

Tín-hiệu YẾU NHẤT, dùng cuối. 🔴 porcelain rỗng KHÔNG phải bằng-chứng sạch — đo thật @S122: git MÙ hoàn-toàn với thư-mục RỖNG, nên 2 probe-dir tồn-tại trên đĩa suốt mà porcelain vẫn rỗng ⇒ dương-giả. Công-cụ quét-đĩa thấy, git không thấy.

Kết-luận sàn

  • Bậc MẠNH thấy ≥1HỎI LẠI ANH (nêu rõ tín-hiệu nào, đường-dẫn nào). CẤM tự kết-luận "sạch".
  • Cả 4 tín-hiệu MẠNH đều im + WAL chain rỗng/toàn [x]mới được báo "không có mạch dở" và DỪNG SẠCH.

0.b Sàn-2 — đọc sentinel closing: (self-heal)

  • session-end ghi closing: S<nn> @<ts> vào WAL ở BƯỚC 0 (trước mọi flush); xoá ở §6.4.
  • Thấy closing: treo = phiên trước bị cắt GIỮA lúc đóng sổ (không phải đóng xong).
  • Self-heal: closing: treo NHƯNG cả 4 tín-hiệu MẠNH khác đều im + ground-truth sạch ⇒ dọn dấu 1 lần, đi tiếp (không bắt anh xử tay).
  • closing: treo có tín-hiệu MẠNH khác ⇒ HỎI LẠI.

1. Đọc .claude/WAL.md

  • Đọc file .claude/WAL.md.
  • Chain rỗng / toàn [x] / file không tồn-tại ⇒ 🔴 CHƯA ĐƯỢC KẾT-LUẬN GÌ. Bắt buộc chạy §0 bậc MẠNH trước:
    • Có tín-hiệu MẠNH ⇒ HỎI LẠI ANH (sổ trống nhưng đĩa nói còn việc — đúng ca sàn này sinh ra để bắt).
    • 4/4 tín-hiệu MẠNH im ⇒ báo "không có mạch dở" và DỪNG SẠCH. KHÔNG bịa việc.
  • (🧊 Bản trước S122 suy thẳng "chain rỗng ⇒ dừng sạch" — đó là bug, chính là thứ Sàn-3 vá.)

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-quanper-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).