Chu du an chot 6 cau @S181; so quyet-dinh o runs/2026-08-07-S180-adap-upgrade-pack-phased/owner-decisions-07-08-2026-dot-2.md - P2=PB-2 sua luat da ratify du 2 SITE (tiep.md §3-bis canonical + pause.md b6 chi TRO). Cau cam san-3 GIU NGUYEN, chi them ranh REQUEST ⟂ TASK. - W4: docs/governance/so-yeu-cau-chu-du-an.md 3 khoi, ma YC/ST/PN vinh vien. Config: tiep_reload.sources 8->9 + owner_request_verbatim_char_cap. nhip-no-probe ve-5 "so-yc treo/nhac2+", fault-inject 5/5, phan biet chua-co-du-lieu ⟂ treo 0. Ky luat ghi-NGAY + A5 cam CLAUDE.md + rules.md §6.0. - P5: ACTIVE-MARKS §LT3 luat tu-tri 3 bac + mark RC-...-07-08-2026-20-57-48. - P7(i): docs/governance/expensive-runs-view.md derive-view 5 cot. - P3=B: niem phong _sealed_P3B_S181 (forward-only). Phep thu A10 da co rang (fault-inject: class tu che => exit 2; class hop le => exit 0). - Khoan 6: scripts/naming-baseline.json = NGUON, script chi doc. Fault-inject 6/6 hai chieu. 7/7 baseline xanh. 0 byte non-ASCII. - Khoan 5: broadcasts/_index.md +cot "ap" cuoi hang, backfill 42/4/23 = 69. - W3 acceptance 6/6 dong + va defect con-tro bang-19-cua (view-stale-status). Con treo: P8/W4b, W5, P7 ve (ii), VK-5, P3 hoi-to hay forward-only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
216 lines
29 KiB
Markdown
216 lines
29 KiB
Markdown
---
|
||
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"* là **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"** và **"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`](../../docs/governance/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 5** ⇒ **HỎ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>/` có `run.md` mà **khô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**.
|
||
|
||
```bash
|
||
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-2** ⇒ **5 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-id`… **khô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`](../../docs/governance/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:**
|
||
|
||
```bash
|
||
# (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`](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"* mà `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 **và** 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 **≥1** ⇒ **HỎ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 **VÀ** 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-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:`.
|
||
|
||
## 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`](../../docs/governance/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 ~200–500ms/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`](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):** có `.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-*.md` là **5 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).
|
||
- **Đọc lớp MỀM** *(adopt `0df10df4` @S153 — sàn khoản 3; 🔴 ăn từ phiên sau restart CLI)*: có `_mind-s-<N>.md` ⇒ đọc **TỪ TRÊN XUỐNG** (block trên cùng giàu nhất — chiều NGƯỢC `_context`) + chạy `python scripts/session_ctx.py mind-check --session <N>` (~140-300ms, KHÔNG chặn — lỗi thì khai rồi đi tiếp).
|
||
- **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`](pause.md)): `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).**
|
||
>
|
||
> 🔧 **SỬA LUẬT ĐÃ RATIFY — P2 = PB-2, chủ dự án chốt @S180, thi hành @S181 (2026-08-07). SITE 1/2.**
|
||
> *(Site 2/2 = [`pause.md`](pause.md) bước 6, câu y hệt. Cả hai phải sửa cùng lượt — sửa một nửa thì `/tiep` mở mà `/pause` vẫn chặn.)*
|
||
>
|
||
> **Câu cấm ở trên GIỮ NGUYÊN, nhưng nay đọc theo ranh REQUEST ⟂ TASK:**
|
||
>
|
||
> | Lớp | Là gì | Nhà | Được phép có file riêng? |
|
||
> |---|---|---|---|
|
||
> | **TASK** | *việc đang ở đâu* — trạng-thái thi-công, `[ ]`/`[!]`/`[x]` | `.claude/WAL.md` (**nguồn duy-nhất**) | 🔴 **KHÔNG.** Chép trạng-thái task sang file khác = đúng thứ câu cấm chặn |
|
||
> | **REQUEST** | *anh đã yêu-cầu gì, và đã được đáp chưa* — lời của chủ dự án | sổ yêu-cầu (W4 dựng) | ✅ **CÓ.** Đây **không phải** bản thứ hai của WAL: WAL **không hề** lưu lời anh |
|
||
>
|
||
> **Vì sao ranh này hợp-lệ chứ không phải lách luật:** câu cấm sinh ra để chặn **hai nguồn cùng trả lời một câu hỏi** ("việc tới đâu?"). Sổ REQUEST trả lời **câu khác** ("anh đã yêu-cầu gì?") — câu mà WAL **chưa bao giờ** trả lời được, vì WAL ghi-đè ≤40 dòng và **cố ý không** giữ lời anh (lời anh sống ở `_context` FLOW, append-only). Hai câu khác nhau ⇒ hai nguồn ⇒ **không phải nguồn-đôi**.
|
||
> 🔴 **Ranh CỨNG, đừng nới:** sổ REQUEST **CẤM** mang cột trạng-thái-thi-công của riêng nó. Cần hiện "việc tới đâu" thì **TRỎ** về WAL, không chép. Nới chỗ này là tái sinh đúng nguồn-đôi vừa được loại trừ — và đó là **rủi ro số 1 của cả gói** (`wave-plan §R`).
|
||
> 🧊 *Lineage: câu cấm ký @S122 (mark `RC-pqhuy1987-15-07-2026-15-32-20`, điều-khoản sàn-3). Xung đột với "sổ = đường-ghi-chính ĐÃ KÝ" phát hiện @S180 lane C §B.5 — xung đột THẬT chỉ ở **một cột trạng-thái**. Anh chọn **PB-2** (tách 2 tầng) thay vì PB-1 (sổ giữ lời, trạng-thái = view). Sổ quyết-định: `owner-decisions-07-08-2026-dot-2.md` + PAUSE-1 của `_context-s-12.md`.*
|
||
>
|
||
> **§3-ter — 🧠 BẢN NẠP-LẠI lớp mềm ≤15 dòng** *(adopt `0df10df4` @S153 — sàn khoản 3 CÓ BẰNG-CHỨNG NỘI-DUNG; 🔴 ăn từ phiên sau restart CLI; 🔄 OWNER-VETO @S153: 4-khoản đối-chiếu + bản-nạp-lại nay do VAI-2 `ctx-verifier` sản xuất — hub-form 3-vai anh chốt)*: **spawn `ctx-verifier`** (máy `mind-check` full chạy TRƯỚC ở §2.6; PIN {`_mind` · `_context` · WAL-đã-reconcile-§3}) → vai trả 4-khoản đối-chiếu (**B vs `next:` — LỆCH ⇒ TIN SỔ MÁY + cờ** · C vs bản-đồ · D-đã-định-đoạt-chưa-đổi-nhãn · con-trỏ theo verdict máy) + **BẢN NẠP-LẠI ≤15 dòng** kết bằng dòng `LEAD-PHAI-NHAC-LAI: <tên-ý-D> · <E-verdict>`. Lead **PHẢI NHẮC LẠI** đúng các chi tiết đó trong báo-cáo đầu (chi tiết chỉ-biết-nếu-đã-đọc — "đã nạp" suông KHÔNG tính, metadata ts/hash KHÔNG tính); verdict 1-dòng của vai ghi vào biên-nhận (vết). Vai vắng/SKIP ⇒ lead tự chạy 4-khoản (fallback, khai rõ). **+ nạp NỀN RÚT-GỌN theo khoá `tiep_reload`** (`memory-budget.json` — B1: CẤM chép danh-sách tệp vào đây; ước ~40-60K tok input cache-được, quyết (37)(b) — nạp NỀN vẫn là việc LEAD, vai-2 chỉ lo lớp mềm).
|
||
|
||
## 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).
|