Files
solution-erp/.claude/commands/tiep.md
pqhuy1987 398d343403
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m48s
[CLAUDE] Docs: S149-S150 closeout — bookend lượt đầu end-to-end (hình B) + 2 arc đóng + tally #53 chốt 45
- Arc-1 hội-tụ-bookend (rename 5 vai + 4 máy PS1 + C9-C12) + arc-2 adap-backlog 23/23 + probe Opus-5 khép (S149)
- Bookend @close S150: wave 6 vai (4 đo + 2 KIỂM) → 20 FLAG disposition từng-dòng; ring1 31/34-ĐẠT, ring2 10/10 + M-1 view-stale-role-desc
- Khoá _frozen_until_owner CẮM trước h24-signal-write (frozen-held in thật); 9 class FIRE; JUMP dải {5,4,4,3}+asym{1,4} chờ anh #21
- STATUS bump CURRENT S149-S150 + 2 khối Recently Done; HANDOFF segment mới + re-stamp đủ-slug + (17)(18)(19) lật + (14) viết lại + 6 slot #21-#26
- K2 posture-A @engine PHẦN K + K5 luật TÁCH vòng-đo-mới @session-end (O-2/O-3 OWNER-DELEGATED execute)
- sleep-doc derive-monitor-set (bỏ hardcode 4-tên); spawn-model-audit desc/comment fix; h24-signal-write param-default fix (first-live bug)
- M9 on-behalf ×3 (tooling + inv-cb F3 + reviewer F4); ring1/ring4 nhà seed; ring2 3 cite-dead vá
- Sổ garble #53 derive-from-body chốt 45 + sub-class ngược-#53/skeleton-ruột-rỗng (ghi-đĩa CẦN-KHÔNG-ĐỦ)
- Session-log S149-S150 (Sàn-5 đăng-ký 6 run=) + closeout-synthesis dạng-1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 12:17:05 +07:00

25 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 + DUAL-ACCEPT orphan, dạng-3 retired S123; 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ó 4 điểm mù

.claude/hooks/wal-flush.ps1:13 tự-commit 4 path ở turn-boundary: .claude/WAL.md · .claude/agent-memory/ · .claude/workflows/runs/ · .claude/sessions/. ⇒ Hai tín-hiệu trực-giác nhất — "cây bẩn""có commit chưa đẩy" — đều MÙ đúng 4 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.

🔴 Path thứ-4 .claude/sessions/ thêm @S146 (cùng gói session-model, hook 4-path). Nới hook = ĐẺ THÊM một điểm mù ⇒ bắt buộc đẻ kèm tín-hiệu dưới đây trong CÙNG một lần sửa — nới path mà quên sàn = tái mở đúng bug "sổ trống ≠ sạch" mà Sàn-3 sinh ra để chặn. Luật gốc hook (danh-sách path) = canonical harness-11-engine.md PHẦN N (N.2), mục này KHÔNG chép luật, chỉ khai hệ-quả lên khả-năng phát-hiện.

🔴 BẬC MẠNH — thấy 1 trong 5HỎ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 DUAL-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/'
wal:-commit chưa đẩy có đụng .claude/sessions/ 🔴 MIRROR ④ cho path thứ-4 (S146): /pause ghi context-map cộng-dồn vào sessions/session-<N>/ ⇒ hook nuốt nó thành wal: commit trông như nhiễu. Không có ⑤ thì phiên chết còn nguyên context-map mà sàn vẫn báo "sạch" = tái mở đúng bug Sàn-3 sinh ra để chặn. Đây cũng là cửa vào orphan-L (xem block ⑤ dưới) git log --name-only --format='%s' origin/main..HEAD | grep -q '.claude/sessions/'

① DUAL-ACCEPT — 2 dạng bản-ghi-kết-quả TÍNH LÀ ĐÓNG (dạng-3 RETIRED @S123 — xem dưới)

🔴 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 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
  echo "ORPHAN: $d"
done

🧊 dạng-3 RETIRED @S123 (anh chốt) — nhánh grep -qiE '^#+[[:space:]]*synthesis' "$d/run.md" đã GỠ. Đo trước khi gỡ, 2 phép độc-lập (harvest-curator + lead), khớp nhau: bỏ nhánh dạng-3 ⇒ 0 folder thành orphan. Lý do lộ ở đối-chứng: cả 6 folder từng dựa dạng-3 (S112×4 · S113 · S114) nay đều có flat *-synthesis.md sau retro-harvest 22ea8c5 ⇒ dạng-1 bắt hết, dạng-3 dư-thừa hoàn-toàn. 🔴 LUẬT retire (phát-biểu ĐÚNG — S123 review bắt bản đầu viết sai): gỡ một nhánh legacy khi tập di-sản của nó RỖNG; giữ khi CÒN người thụ-hưởng. dạng-3 → 0 folder ⇒ gỡ. dạng-2 → 5 folder ⇒ giữ. Miễn-trừ C8 (tha di-sản) hết hiệu-lực đúng lúc hết di-sản để tha, không sớm hơn. ⚠️ Bản đầu S123 viết lý-do là: "doc CẤM viết mới mà máy VẪN NHẬN ⇒ cấm-bằng-trí-nhớ ⇒ gỡ". Nghe xuôi nhưng SAI — reviewer áp thẳng nó cho dạng-2: workflows/README.md cũng ghi dạng-2 = "legacy C8 — nhận, cấm viết mới"cùng hình-dạng ⇒ theo lý-do đó thì phải gỡ luôn dạng-25 folder S71 thành orphan ⇒ ép rewrite history mà chính C8 cấm. ⇒ Lý-do viết ra ≠ lý-do thật đang vận-hành. Bài: áp luật vừa viết cho nhánh ANH EM — vỡ thì luật sai, không phải nhánh sai. 🔸 Hệ-quả phụ (thật, nhưng KHÔNG phải lý-do): sau khi gỡ, luật và máy nói cùng một câu về dạng-3 ⇒ hết cần trí-nhớ để NÊU. Đó là cái được, không phải cái biện-minh.

🧪 Block này ĐÃ fault-inject trên cây tạm — S122 9/9 PASS, RE-VERIFY @S123 sau khi gỡ dạng-3: 7/7 PASS, chứng có RĂNG cả 2 chiều: FLAG đúng → orphan-thật · flat 0-byte · C8 0-byte · 🔴 run.md có ## Synthesis mà KHÔNG có flat (ca này S122 IM, S123 FLAG — chính là hiệu-lực của việc retire). IM đúng → dạng-1 · dạng-2 · folder không có run.md. 🔴 Ca "0-byte" là ca anti-Goodhart — thiếu nó thì happy-path vẫn xanh mà sàn đã thủng. 🧊 2 ca S122 nay hết nghĩa (dạng-3 IM · "synthesis" giữa câu văn FLAG) — cả hai đo nhánh đã gỡ. Giữ lại làm chứng lịch-sử, KHÔNG phải test đang chạy.

⚠️ 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 — lập-luận CÒN ĐÚNG, ví-dụ ĐÃ LỖI-THỜI. 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 vẫn là kẽ CÒN LẠI. 🧊 Nhưng ví-dụ minh-hoạ thì đã chết — đính-chính @S123: bản S122 viết "pe-negative-quote ghi kết-quả rải trong ## Stages + ## wf run-idkhông phải chuyện đã xử". Đo lại: 22ea8c5@14:28 đã thêm implement-synthesis.md 8.249B cho đúng folder đó ⇒ nay nó là dạng-1, máy bắt được. Mà câu văn kia viết ở dfa3dae@14:48 — SAU 20 phút. ⇒ doc khai "chưa xử" cho đúng thứ chính tác-giả nó vừa xử xong (stale-at-birth). 🔴 Vì sao phải đính-chính chứ không xoá cả mục: người đọc grep pe-negative-quote → thấy flat-file → kết-luận "cảnh-báo này sai"vứt luôn cái caveat còn đúng. Ví-dụ chết kéo theo lập-luận sống. Đây là class acceptance literal tự-lão-hoá (S121): neo lập-luận vào một literal cụ-thể thì literal đổi là lập-luận mất uy-tín oan. Bài rút ra: neo vào TÍNH-CHẤT ("run.md kể kết-quả mà không có heading synthesis nào"), đừng neo vào TÊN FOLDER.
  2. Dual-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. @S123 khoảng-cách doc-vs-máy này ĐÃ ĐÓNG: trước đây doc cấm dạng-3 mà detector nhận ⇒ cấm bằng trí-nhớ. Nay gỡ nhánh dạng-3 ⇒ luật và máy nói cùng một câu. Di-sản không kêu oan (6 folder cũ đều đã có flat), mà tái-sinh thì máy bắt được ngay.

⑤ ORPHAN-L — phiên-LOGIC mồ-côi (S146 — đẻ CÙNG hook 4-path, KHÔNG tách)

Là gì: một phiên-LOGIC (.claude/sessions/session-<N>/ — form hub, xem session-model-se-draft.md) đã mở + đã tích context-map nhưng chưa được nối lại và chưa đóng ⇒ cửa-sổ vật-lý chết giữa phiên-logic. Cùng class với orphan run-folder ①: vật trên đĩa tố-giác việc dở, khác vật.

DUAL — 2 cửa ĐỘC-LẬP, kêu 1 cửa là đủ để NÊU:

# (a) cửa GIT = đúng tín-hiệu ⑤ bảng trên — bắt được CẢ KHI thư-mục đã bị dọn khỏi cây làm việc
git log --name-only --format='%s' origin/main..HEAD | grep -q '.claude/sessions/'

# (b) cửa ĐĨA — git-independent, miễn-nhiễm hook (mirror ①: đọc đĩa, KHÔNG đọc git)
#     Cân-bằng-sổ: mỗi pause phải có ĐÚNG một đối-ứng (tiep do /tiep ghi, hoặc chốt-kết do đóng-L).
#     🔴 DUAL-ACCEPT 2 FORM (S148) — cùng khuôn dual-accept của ① ở trên:
#        HUB (chuẩn từ S148, owner chốt "đối ứng đúng chính xác"): _pause-<i>.md · _tiep-<i>.md · _end (KHÔNG đuôi)
#        LEGACY (di-sản ≤S147):                                     pause-*.md  · resume-*.md · closed.md
#     🔴 TÍNH-CHẤT CỨU MẠNG: glob `pause-*` KHÔNG khớp `_pause-1.md` (tên bắt đầu bằng `_`)
#        ⇒ 2 form KHÔNG đè nhau ⇒ cộng thẳng là an-toàn, không đếm đôi. Đã fault-inject 2 chiều @S148.
for d in .claude/sessions/session-*/; do
  [ -d "$d" ] || continue
  # 🔴 CHỐT-KẾT ĐÓNG TRỌN THƯ-MỤC, không phải "+1" (vá @S148 — fault-inject bắt).
  #    session-end.md §6.3-bis nói rõ: sau khi ghi chốt-kết thì MỌI pause "coi như ĐÃ ĐỐI-ỨNG".
  #    Bản cũ viết `c=1` rồi `p > r + c` ⇒ chỉ tha ĐÚNG MỘT pause chưa khớp ⇒ phiên đã đóng mà
  #    có ≥2 pause dư vẫn KÊU OAN. Doc và máy lệch nhau từ S146; dữ-liệu SE quá nhỏ (p=1) nên chưa lộ.
  { [ -f "$d/_end" ] || [ -f "$d/closed.md" ]; } && continue
  p=$(( $(ls "$d"_pause-*.md 2>/dev/null | wc -l) + $(ls "$d"pause-*.md  2>/dev/null | wc -l) ))
  [ "$p" -eq 0 ] && continue
  r=$(( $(ls "$d"_tiep-*.md  2>/dev/null | wc -l) + $(ls "$d"resume-*.md 2>/dev/null | wc -l) ))
  [ "$p" -gt "$r" ] && echo "ORPHAN-L: $d (pause=$p tiep=$r, chua chot-ket)"
done
  • Đối-ứng _tiep-<i>.md CÓ người ghi thật/tiep §2.6 dưới (cùng file này) ⇒ vòng pause ↔ tiep tự đóng, không phải cơ-chế treo. (legacy resume-* vẫn được đếm — dual-accept ở máy trên.)
  • Chốt-kết _end ĐÃ WIRE (owner chốt @S146 "giống hub", đổi tên closed.md_end @S148 cho khớp form hub — manifest 101e69d6): nghi-thức ghi ở session-end.md §6.3-bis (FROZEN · idempotent NO-OP · NO-OP im-lặng nếu 0 thư-mục). ⇒ cân-sổ đủ CẢ HAI vế: pause đối-ứng bằng _tiep-<i> (/tiep §2.6) hoặc _end (đóng-L) ⇒ ca "pause rồi đóng thẳng không qua /tiep" hết kêu oan. 🔴 @S148 mạnh thêm một nấc: _end nay ĐÓNG TRỌN thư-mục (detector continue hẳn), không còn là "+1". Fault-inject bắt: phiên đã đóng mà dư ≥2 pause thì bản cũ vẫn KÊU OAN — lệch đúng câu "MỌI pause coi như đã đối-ứng"session-end §6.3-bis vẫn luôn nói. Doc đúng, máy sai, sống từ S146. 🧊 Nấc cũ (tới S145): "closed.md CHƯA wire — VC-2 còn chờ anh duyệt", kèm hệ-quả "chỉ ca pause-rồi-đóng-thẳng mới thiếu đối-ứng". Cả hai nay SAI — giữ 1 dòng làm vết. 🔴 Bài học lấy từ chính chỗ này (H24 lead-stale-auditor bắt @S146): MÁY ở ngay trên (:89 :94 :95) đã đọc closed.md thật từ lúc block này ra đời, mà PROSE vẫn khai "chưa wire" ⇒ đây là lật-ngược của ghost-wire: wired-but-declared-unwired — và nó nằm đúng dưới nhãn "chống ghost-wire H18". ⇒ Ghost-wire soi được 2 CHIỀU: khai-có-mà-không-chạy chạy-thật-mà-khai-chưa.
  • 🟢 Hướng hỏng = AN-TOÀN: quên ghi _tiep-<i>.md ⇒ sổ lệch ⇒ KÊU ⇒ HỎI LẠI ANH. Sai về phía hỏi thừa, không về phía im lặng bỏ việc — đúng thiên-hướng của Sàn-3.

🟡 BẬC TRUNG-BÌNH — nhiều file bẩn NGOÀI 4 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 4 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ả 5 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.

    🔴 Số tín-hiệu = 5 kể từ S146 (⑤ đẻ cùng hook path thứ-4). Luật bất-biến khi nới hook về sau: mỗi path mới thêm vào wal-flush.ps1 ⇒ mỗi tín-hiệu MẠNH mới ở đây, CÙNG một lần sửa. Nới path mà không đẻ tín-hiệu = đẻ điểm mù không người canh; đó là toàn bộ lý do Sàn-3 tồn-tại.

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 CÒN LẠI đều im (= 5 trừ chính ③ closing:; số cập-nhật @S146 cùng tín-hiệu ⑤) + 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).
    • 5/5 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:.

2.5 TICK counter + dòng-nợ (H24 — TICK TRƯỚC, dòng-nợ SAU; Item 1(b)+2 S135)

  • TICK .claude/governance/.session-counter.json theo contract (idempotent — NO-OP nếu cùng nhãn-phiên/cùng HEAD) — 🔴 CON-TRỎ session-start.md §2.1.8, CẤM chép logic tick (B1 canonical). Nhãn /tiep = nhãn-phiên MỚI (label-convention §2.1.8) ⇒ tick fire NGAY cửa vào, OVERDUE @9 hiện tại đây thay vì đợi cuối phiên.
  • Dòng-nợ (SAU tick — n-3): gọi powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1 in dòng-nợ 4-vế (vế-1 nhịp-kiểm đọc post-tick). 🔴 probe KHÔNG chặn điểm dừng: lỗi → in probe-loi (khong chan) → đi tiếp.

    🔗 Predicate C7 đầy-đủ (probe được phép chạy ở điểm dừng) = canonical harness-11-engine.md §N.8. 🔴 B1 — dòng này CHỈ TRỎ, CẤM chép predicate sang đây (chép 2 nơi = 2 nguồn sự-thật, đúng thứ B1 sinh ra để chặn).

2.5b Kéo thư cross-project (cửa VÀO 2/2 — owner chốt S148)

DÒ 2 kênh (outbox/se + outbox/all × 6 repo) — NGAY SAU dòng-nợ (vế-4 pull-cach vừa in xong ⇒ đọc số rồi dò là đúng thứ-tự nhân-quả). In thu-moi: se=X all=Y. 🔴 CHỈ list + so id. KHÔNG copy · KHÔNG hash · KHÔNG python (đo @S148: dò ~5ms · kéo ~200500ms/thư). X|Y > 0 ⇒ nêu 1 dòng rồi đi tiếp §2.6; kéo thật để bookend làm (se/check-email · all/adap-apply).

🔗 Luật nhịp đầy-đủ = canonical check-email.md §"Nhịp chạy — 4 CỬA PHIÊN". 🔴 B1 — CHỈ TRỎ + GỌI, CẤM chép luật. 🔴 KHÔNG chặn recovery: lỗi ⇒ check-email loi (khong chan) → đi tiếp §2.6. Cửa này quan-trọng NHẤT trong 4"1 session kéo 2-3 phiên" nghĩa là các phiên GIỮA đều vào bằng /tiep, nên bỏ cửa này là bỏ phần lớn lưu-lượng.

2.6 Đọc _context-s-<N>.md + ghi marker _tiep-<i>.md (S146 · form hub @S148 — cặp với /pause §2.6)

  • Đọc (form HUB, chuẩn @S148):.claude/sessions/session-<N>/ → đọc _context-s-<N>.md — đó là bối-cảnh cộng-dồn (§(a) STOCK-map pointer + §(b) FLOW append-only: mọi entry ### PAUSE-<k> theo thứ-tự, kèm dòng > anh: verbatim). Marker _pause-*.md/_tiep-*.md5 trường máy, đọc để biết window-ordinal + head-sha, KHÔNG chứa narrative. 🧊 Legacy ≤S147: thư-mục không có _context-s-<N>.md ⇒ đọc TẤT CẢ pause-*.md theo thứ-tự thời-gian (form cũ gộp marker+narrative). Nhận-để-đọc, CẤM viết mới kiểu đó. 🔴 Đây là lane CỘNG-DỒN, khác WAL — WAL là sổ mạch-sống ghi-đè ≤40 dòng (liếc-một-cái-là-biết); context-map là tích-luỹ, không ghi đè. Đọc context-map KHÔNG thay việc chạy verify: — ground-truth vẫn thắng (§3).
  • Ghi biên-nhận — 🔴 THỰC-HIỆN SAU §3 (đọc ở đây, ghi sau khi reconcile xong; bắt buộc): tạo _tiep-<i>.md (<i> = max(_tiep-*)+1) — đúng 5 trường ~200B, y khuôn _pause-<i>.md (xem pause.md §2.6): ts · head-sha · window-ordinal · jsonl-hint · account-label. 🔴 Marker là MÁY, không phải bài luận — kết-quả reconcile (lệch gì so chain:, next: đang chạy) thuộc về _context-s-<N>.md, không nhồi vào marker. (Bản S148 đầu ghi resume-S<nn>-<ts>.md 2,5KB narrative — sai form, đã gỡ.)
  • 🔴 Vì sao bắt buộc: biên-nhận này là đối-ứng cân-sổ của tín-hiệu ORPHAN-L ⑤ (§0). Thiếu nó ⇒ sổ lệch ⇒ lần sau KÊU ⇒ hỏi lại anh. Hỏng về phía hỏi thừa = an-toàn; nhưng ghi đủ thì sàn mới im đúng.
  • 🔸 session-<N> KHÔNG mở mới ở /tiep/tiep nối phiên-logic đang mở. Mở <N> mới = việc của /session-start (xem session-start.md BƯỚC 0.8).

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 [!] / [ ].

§3-bis — 🧾 in MASTER-CHECKLIST (cập-nhật từ WAL đã reconcile ở §3; VIEW derive tươi, KHÔNG file nguồn): derive từ WAL (đã ground-truth-reconcile) + HANDOFF —

  • vừa-xong (mục vừa chuyển [!][x] khi reconcile) · vẫn-treo ([!] / [ ] còn lại) · chờ-anh — 🔢 BẮT BUỘC ĐÁNH SỐ (anh trả lời bằng số). 🔴 Checklist = VIEW derive tươi — CẤM tạo file checklist nguồn-đôi (sàn-3).

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