[CLAUDE] Docs: S146 closeout — session-model 3 owner-decision + hook 4-path + H24 auto
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m25s

Ap spec-apply-hub-s145-v2 (5 axis, governance-only: 0 prod-code, 0 migration).
Workflow S145 chet giua chung -> /tiep §4 relaunch-cat-gon wf_3d803740-41d 3/3 DONE.

Owner-decision @S146:
- session_ctx_kb = 64 TUONG-MINH (giu nguyen caveat ghost-wire: 0 reader)
- session-model: scaffold IDEMPOTENT (tach cap-SO vs tao-THU-MUC) · closed.md WIRE
  (session-end §6.3-bis) · V2 AUTO (go cong NGUOI, GIU cong NHIP 6/15/3)

Landed: C7 §N.8 predicate 4-ve · hook wal-flush.ps1 4 path (+.claude/sessions/)
· San-3 tin-hieu ⑤ + ORPHAN-L · D2 KIEM end-only · §L.c completeness-gate co RANG.
LIVE-VERIFY hook 4-path PASS repo THAT (da7ee8a). Session-model chay TRON VONG dau
tien: pause-S146 -> resume-S146 -> ORPHAN-L can so.

H24 force-fire (P=8 pause >= 1, luat auto moi): 2 vai + h24-audit -> 7 FLAG, va het:
- sweep-consent sot 6 site (h24-audit.md:4 = frontmatter description)
- closed.md wired-but-declared-unwired (ghost-wire CHIEU NGUOC)
- owner-decision [7] BI GHI DE do tai-dung slot-index -> mat uy-quyen push
3/3 vai lane-H24 garble #53: ghi-dia-SOM cuu tron, ghi-MUON mat trang.

So: orphan run-folder 3->0 · carry 14->20 (co tag [carry:*]) · +E-013 +E-014
error-ledger · +memory feedback_absence_looks_like_clean · .gitignore +lock file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-23 00:16:37 +07:00
parent a1e2416f37
commit 8b6df0a396
86 changed files with 5683 additions and 113 deletions

View File

@ -1,6 +1,6 @@
---
description: /fable-clone <vai> <đề-bài> — ENGINE-ĐẮT LỆNH-B per-invocation (H21): vai anh GÁN chạy ENSEMBLE tier-2-mạnh-nhất (N lane đa-lăng-kính CÙNG 1 VAI qua hmw.js parallel + em-main refute+synthesize) cho đề-bài đó — KHÔNG marker, KHÔNG mode persist. Thiếu/sai vai → em main hỏi lại anh 1 dòng, KHÔNG tự chọn. Cặp /fable-real.
argument-hint: <vai roster 17> <đề-bài phán-quyết> — vd "reviewer rà commit X" · "investigator-codebase truy bug Y"
argument-hint: <vai roster> <đề-bài phán-quyết> — vd "reviewer rà commit X" · "investigator-codebase truy bug Y"
---
# /fable-clone — ENGINE-ĐẮT LỆNH-B: 1 vai × ENSEMBLE tier-2 (per-invocation, H21)
@ -15,10 +15,10 @@ argument-hint: <vai ∈ roster 17> <đề-bài phán-quyết> — vd "reviewer r
- **`/fable-clone <vai> <đề-bài>`** = vai anh gán chạy **ENSEMBLE tier-2-mạnh-nhất** = **N lane đa-lăng-kính CÙNG 1 VAI** (qua HMW `parallel`) + em-main **refute + synthesize** (P3/P4) = "bản sao Fable". Rẻ quota top-model, giữ tầng phản-biện chống-đồng-thuận-sai.
- **Hiệu-lực CHỈ lượt đó** — **KHÔNG còn "về mặc-định"**, KHÔNG marker, KHÔNG persist (H19 mode thật/ảo đã retired H21). Lượt sau muốn ensemble = gõ lại lệnh.
## 🔴 Vai BẮT BUỘC ∈ roster 17 (H21 ②)
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`**.
## 🔴 Vai BẮT BUỘC ∈ roster (canonical → STATUS §Sub-agents; B1 — KHÔNG hardcode số) (H21 ②)
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`** · **`tooling-harvest-audit` · `h24-audit` · `sleep-audit`** (round-KIỂM ×3 S145).
- **Thiếu `<vai>` HOẶC vai ngoài roster** → em main **hỏi lại anh 1 dòng**, **KHÔNG tự chọn vai**.
-**VALID_ROLES đủ roster** — canonical đếm ở [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical; **KHÔNG chép số ở đây khi roster đổi** — đó chính là class `view-stale-role-desc``lead-view-auditor` soi). Lịch-sử: 10→12 (S110, +2 monitor `tooling-auditor`/`harvest-curator`) → 12→14 (S121 W2, +2 monitor H24 `lead-view-auditor`/`lead-omission-auditor`) → **14→17 (S141, +3 trio-memory `harness-eval`/`harness-refine`/`harness-audit` — read-only INFORM-only, TUẦN TỰ eval→refine→audit)**. *(🧊 limitation cũ 10-vai + H6-design "monitor ngoài workflow" superseded; monitor vẫn INFORM-only, lane RETURN-only.)*
-**VALID_ROLES đủ roster** — canonical đếm ở [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical; **KHÔNG chép số ở đây khi roster đổi** — đó chính là class `view-stale-role-desc``lead-view-auditor` soi). Lịch-sử: 10→12 (S110, +2 monitor `tooling-auditor`/`harvest-curator`) → 12→14 (S121 W2, +2 monitor H24 `lead-view-auditor`/`lead-omission-auditor`) → **14→17 (S141, +3 trio-memory `harness-eval`/`harness-refine`/`harness-audit` — read-only INFORM-only, TUẦN TỰ eval→refine→audit)****17→20 (S145, +3 round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` — C4/C4b TÁCH mỗi-vòng-1-con, AUTO fire-after-measure)**. *(🧊 limitation cũ 10-vai + H6-design "monitor ngoài workflow" superseded; monitor vẫn INFORM-only, lane RETURN-only.)*
- 🔒 **Honest-note (a/b):** bảo-đảm = **owner-gated tầng lệnh + kỷ-luật lead**, **KHÔNG code-enforced**; lệnh/alias = cách anh **gán vai nhanh**, hệ **KHÔNG tự chọn vai**.
## 🔴 Spec-file 3-mục BẮT BUỘC mỗi run (H21 ①)
@ -39,6 +39,45 @@ Trước khi gọi Workflow `hmw`, lead **PHẢI** @P1:
**Thiếu cờ + ≥3 task ⇒ `hmw.js` THROW (STOP-HARD), KHÔNG fail-soft.** Vì sao gate: script chạy JS-sandbox **KHÔNG filesystem** ⇒ tự nó không tạo được folder ⇒ trước S121 sàn này chỉ là **kỷ-luật người** (đo thật @S119: `git grep args.run .claude/commands/` = **0 hit** ⇒ 4/4 wrapper KHÔNG cờ ⇒ sàn danh-nghĩa). Hậu-quả thật khi thiếu: chết giữa run ⇒ **per-turn returns mất theo phiên, chỉ file trên đĩa sống sót**`/tiep` §4 không có vật-liệu cắt-gọt ⇒ chạy lại TỪ ĐẦU (S118 raw-Agent 7-spawn ⇒ 0 run-folder).
🔸 **Khai thật:** gate chỉ phủ đường `hmw.js`. Ngưỡng *"hoặc ước >5 phút"* **KHÔNG cơ-khí-hoá được** (script không đo trước thời-lượng) ⇒ phần đó vẫn là kỷ-luật lead. **raw `Workflow`/`Agent` tool = kẽ CÒN-LẠI**, đi thẳng không qua file này ⇒ mất writeGuard + run-trace.
## 🔴 ĐÓNG GÓI LANE THEO TRẦN LƯỢT (C2 — adap đợt-11 S144, có repro)
**Sự cố gốc `wf_491c05a8-6dc` (2026-07-22):** 5 lane `investigator-codebase` (`maxTurns: 20`) — **3 CHẾT, ~490K token đốt, 0 sản phẩm**.
Đo từ transcript: lane **sống** dùng 21/23 tool-use · lane **chết** dùng 28/34/35 ⇒ cháy lượt **khi vẫn đang đọc**, chưa tới bước ghi.
🔴 **Cơ chế phạt NGƯỢC ĐỜI:** lane càng cẩn thận càng chắc chết. Lỗi ở **LỆNH của lead**, không ở lane — lead giao lane-5 **mười file** với trần 20 lượt.
**3 luật đóng gói (áp mọi `/fable-clone` từ nay):**
1. **≤3 file/lane.** Lane phải đọc nhiều hơn ⇒ **tách lane**, đừng nới việc.
🔸 Số 3 = **AI tự đặt, đảo được** (không phải số owner).
2. 🔴 **ÉP GHI KHUNG RỖNG Ở LƯỢT 1-2** — trước khi đọc bất cứ gì. Rồi append dần.
*Vì sao "dặn ghi sớm" KHÔNG đủ:* prompt run-hỏng **đã** ghi *"ghi NGAY khi tìm ra từng cái"*, lane vẫn tự xếp việc ghi **sau** việc đọc ⇒ "ngay" của lead rơi **sau** vạch chết.
**Bằng chứng đối chứng:** run review `wf_301d3943-144` đổi đúng chỗ này (ép khung rỗng lượt 1-2, `maxTurns: 25`) ⇒ **3/3 lane sạch, 0 chết**. Cùng harness, cùng model, khác **thứ tự ghi**.
3. **Nêu trần lượt NGAY ĐẦU prompt** + phân bổ gợi ý (đọc → verify → chốt), để lane tự lượng sức.
**Acceptance (đã siết theo R3 — bỏ đếm-chữ):**
-**KHÔNG** dùng `grep -c 'trần lượt'` làm tiêu chí (gõ đúng cụm chữ là đạt = Goodhart thuần).
- ✅ Đo ở **run KẾ**: 0 lane chết.
- 🔸 **Khai hạn chế thật:** `hmw.js` C1 chỉ biết lane trả `null`, **KHÔNG phân biệt được NGUYÊN NHÂN** ⇒ mệnh đề *"chết vì cháy lượt"* hiện **chưa đo được bằng máy**, phải mở transcript đếm tool-use.
## 🔴 KHUÔN LABEL 4 THÀNH-PHẦN (C3 — `spawn-label:22-27`, BINDING)
Mọi spawn (Agent-tool `description` · `hmw` `label` · monitor · cổng review) mang đủ **4 thành-phần**:
```
{nhóm|Vòng-N|Core|Gate|WF} {vai} {pha/wave} s{N}
```
Ví dụ đang chạy: `Gate reviewer anchor s144` (24 ký tự) · `Vòng-3 harness-eval w1 @start s144`.
- **Vừa panel** ~≤40 ký tự; xung đột thì **đủ-thành-phần thắng ngắn-gọn** (`:25`).
- **Một khuôn duy nhất** toàn repo (`:26`).
- **Áp từ phiên kế** (`:51`) — spawn trước đó **giữ nguyên làm vết, KHÔNG sửa lùi** (khuôn hub `:43`).
**Acceptance (siết theo R3 — thêm control + neo artifact):**
-**Negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc-lại **PHẢI TRƯỢT**. Không trượt = thước mù.
-**Neo artifact**: label phải xuất hiện trong `runs/<id>/run.md` — panel là **ephemeral**, `grep` không truy được ⇒ không neo thì không tái lập, không audit được.
- ❌ Bỏ tiêu chí "chọn 3 task nói được {ai·gì·nhịp·phiên}" **đứng một mình** — đó là **tự chấm chính label mình vừa viết**, n=3, không artifact.
## 🔴 Guard ensemble (§K engine — 3 floor-fidelity)
- **ảo-ensemble = N lane CÙNG 1 vai phán-quyết** (multi-lens trên 1 vai), **KHÔNG** mixed-roster fan-out (`hmw.js` VALID_ROLES = **roster đầy-đủ**, canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents; KHÔNG gate vai — worker-tier-pin S124 **che** leak qua frontmatter `opus` (xem :57), hết thời all-inherit ăn-theo-lead).
- **N lane RETURN-only**; em-main **single-writer** (B3) ghi **1 MEMORY entry** đúng vai đó + **gắn nhãn engine đã dùng** (hmw SCHEMA `memoryDelta` KHÔNG field engine → em-main stamp @P3 harvest).

View File

@ -1,6 +1,6 @@
---
description: /fable-real <vai> <đề-bài> — ENGINE-ĐẮT LỆNH-A per-invocation (H21): vai anh GÁN chạy 1 LẦN SINGLE top-model THẬT (Fable 5; outage → single-Opus-1M/run) deep-pass cho ĐÚNG đề-bài đó, hiệu-lực CHỈ lượt đó — KHÔNG marker, KHÔNG mode persist. Thiếu/sai vai → em main hỏi lại anh 1 dòng, KHÔNG tự chọn. Cặp /fable-clone.
argument-hint: <vai roster 17> <đề-bài phán-quyết> — vd "reviewer rà-soát commit X" · "investigator-codebase truy nguồn bug Y"
argument-hint: <vai roster> <đề-bài phán-quyết> — vd "reviewer rà-soát commit X" · "investigator-codebase truy nguồn bug Y"
---
# /fable-real — ENGINE-ĐẮT LỆNH-A: 1 vai × SINGLE top-model deep-pass (per-invocation, H21)
@ -16,9 +16,9 @@ argument-hint: <vai ∈ roster 17> <đề-bài phán-quyết> — vd "reviewer r
- **`/fable-real <vai> <đề-bài>`** = vai anh gán chạy **1 LẦN top-model THẬT** (sâu nhất, đắt nhất) cho ĐÚNG đề-bài đó. Fable up = single-Fable; Fable **outage** (H5, lỗi `"Model isn't available"`) = single-**Opus-1M** fallback **theo từng lần chạy** (KHÔNG mode toàn-cục).
- **Hiệu-lực CHỈ lượt đó** — hết lượt là hết. KHÔNG marker, KHÔNG persist. Lượt sau muốn engine-đắt = gõ lại lệnh.
## 🔴 Vai BẮT BUỘC ∈ roster 17 (H21 ②)
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`**.
> Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical). +2 @S121 W2 = 2 monitor H24 lead-self-audit · **+3 @S141 = bộ-ba đồng-kiểm memory (trio-memory, read-only INFORM-only; TUẦN TỰ eval→refine→audit)**.
## 🔴 Vai BẮT BUỘC ∈ roster (canonical → STATUS §Sub-agents; B1 — KHÔNG hardcode số) (H21 ②)
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`** · **`tooling-harvest-audit` · `h24-audit` · `sleep-audit`** (round-KIỂM ×3 S145).
> Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical). +2 @S121 W2 = 2 monitor H24 lead-self-audit · **+3 @S141 = bộ-ba đồng-kiểm memory (trio-memory, read-only INFORM-only; TUẦN TỰ eval→refine→audit)** · **+3 @S145 = `tooling-harvest-audit`/`h24-audit`/`sleep-audit` (round-KIỂM ×3, C4/C4b TÁCH mỗi-vòng-1-con)**.
- **Thiếu `<vai>` HOẶC vai ngoài roster** → em main **hỏi lại anh 1 dòng** ("engine-đắt cần vai đích-danh — vai nào?"), **KHÔNG tự chọn vai**.
- 🔒 **Honest-note (a):** "không tự chọn vai" = tầng **KỶ-LUẬT owner-gated** (anh phải gõ vai) — **KHÔNG claim code-enforced**.
- 🔒 **Honest-note (b):** lệnh/alias = cách anh **GÁN VAI NHANH**, vẫn phải anh gõ — hệ **KHÔNG tự chọn vai**.

View File

@ -20,6 +20,17 @@ Thực-hiện **tuần-tự 5 bước** sau; trong lúc chạy **KHÔNG nhận v
- Đẩ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".
## 2.6 Ghi context-block vào thư-mục phiên-LOGIC (S146 — lane CỘNG-DỒN, cặp với `/tiep §2.6`)
- **Append MỘT khối mới** vào `.claude/sessions/session-<N>/pause-S<nn>-<yyyyMMddTHHmm>.md` (`<N>` = phiên-LOGIC **đang mở** — xem [`session-start.md`](session-start.md) BƯỚC 0.8).
- 🔴 **Scaffold idempotent (owner chốt @S146 "giống hub"):** thư-mục chưa có ⇒ **TẠO**; đã có ⇒ **DÙNG LẠI, CẤM đè**. Chạy lại nhiều lần vô hại.
- 🔴 **NHƯNG `/pause` KHÔNG BAO GIỜ tự tăng `<N>`** — cấp-số là **độc-quyền `/session-start`** (BƯỚC 0.8, canonical; B1 — mục này chỉ TRỎ). `/pause` chỉ tạo thư-mục cho số **đang mở**. Không có số nào đang mở (vào thẳng bằng `/tiep` rồi `/pause`, chưa từng `/session-start`) ⇒ dùng `max+1` **và ghi 1 dòng khai** trong khối: `N-cap-ngoai-session-start: <N> (ly-do: <...>)` — để `<N>` không bao giờ xuất-hiện mà không ai biết nó ở đâu ra.
- 🔴 **ACCUMULATE — CẤM ghi đè, CẤM sửa khối cũ.** Mỗi `/pause` = **một file mới**. (Ghi đè = mất chính thứ mà lane này sinh ra để giữ.)
- **3 trường** (đúng khuôn VC-3 draft): **(1) quyết-định đã CHỐT trong cửa này** · **(2) delta còn SỐNG** (việc/nghi-vấn mang sang cửa sau) · **(3) con-trỏ** run-folder / commit / file.
- 🔴 **Ranh với WAL — KHÔNG nhập một:** WAL = **mạch-sống, ghi-đè, cứng ≤40 dòng** (liếc-một-cái-là-biết, bước 3 dưới). Context-map = **bối-cảnh tích-luỹ, không cap 40 dòng**. Ghi-chú-dở DÀI thuộc **về đây**, KHÔNG nhồi vào WAL.
- **CẤM secret** (thư-mục này sẽ được commit — cùng kỷ-luật WAL bước 3).
- 🔸 Hook `wal-flush.ps1` đã phủ `.claude/sessions/` (path thứ-4, S146) ⇒ khối này **tự vào `wal:` commit** ở turn-boundary. Vẫn **PHẢI add đích-danh** ở bước 4 (đừng dựa vào hook để chốt điểm dừng — hook là lưới, không phải nghi-thức).
## 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.
@ -28,10 +39,10 @@ Thực-hiện **tuần-tự 5 bước** sau; trong lúc chạy **KHÔNG nhận v
## 3.5 TICK counter (H24 — TRƯỚC commit bước 4; Item 1(c) 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).
- 🔴 **TRƯỚC commit bước 4** ⇒ delta counter được gộp vào commit `wal: pause` (file NGOÀI hook-3-path nên PHẢI add đích-danh ở bước 4).
- 🔴 **TRƯỚC commit bước 4** ⇒ delta counter được gộp vào commit `wal: pause` (file NGOÀI hook-4-path nên PHẢI add đích-danh ở bước 4).
## 4. Commit ĐÍCH-DANH — message `wal: pause`
- `git add` **đích-danh** đúng các path: **WAL + path persist** (agent-memory / run-folder) **+ `.claude/governance/.session-counter.json`** (🔴 M-7: tick bước 3.5 nằm TRONG commit `wal: pause` — file ngoài hook-3-path nên PHẢI add đích-danh; thiếu dòng này thì claim "tick nằm trong wal: pause" SAI) **+ file dở**, rồi `git commit -m "wal: pause"`.
- `git add` **đích-danh** đúng các path: **WAL + path persist** (agent-memory / run-folder / **`.claude/sessions/session-<N>/` — context-block bước 2.6, S146**) **+ `.claude/governance/.session-counter.json`** (🔴 M-7: tick bước 3.5 nằm TRONG commit `wal: pause` — file ngoài hook-4-path nên PHẢI add đích-danh; thiếu dòng này thì claim "tick nằm trong wal: pause" SAI) **+ 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.)
@ -42,6 +53,7 @@ Báo đúng sáu ý:
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**".
5. **dòng-nợ (Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` in dòng-nợ 4-vế (nhịp-kiểm đọc post-tick bước 3.5). 🔴 **probe KHÔNG chặn điểm dừng**: lỗi → in `probe-loi (khong chan)` → đi tiếp, VẪN tuyên-bố "an-toàn để thoát".
> 🔗 **Predicate C7 đầy-đủ (probe nào đượ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.**
6. **🧾 MASTER-CHECKLIST rút-gọn (S138):** derive từ WAL vừa ghi (bước 3) + HANDOFF — in **Tầng-1** mỗi arc 1 dòng `{đóng · đang · chưa}` + **đếm 4-nhóm** (`xong` / `đang-dở` / `chờ-anh` / `chưa-làm`) + **liệt nhóm 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).**
Rồi **DỪNG HẲN**, KHÔNG nhận việc mới.

View File

@ -37,6 +37,10 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
-**harvest-curator** (monitor H2) — GATE harvest-integrity 5-trục + close-gate run-trace `runs/<id>/` (**DUAL-ACCEPT** — xem §L.b(f)) (chạy ở §L.b(d)(f))
- 🔷 **lead-view-auditor** (monitor **H24**) — view LỆCH source của cái LEAD surface (chạy theo NHỊP §L.b(j), KHÔNG mỗi phiên)
- 🔶 **lead-omission-auditor** (monitor **H24**) — cái BỊ THIẾU trong cái LEAD surface (chạy theo NHỊP §L.b(j), KHÔNG mỗi phiên)
- 🔬 **tooling-harvest-audit** (monitor **KIỂM-vòng**, C4 S145) — verify OUTPUT H1+H2 vòng tooling/harvest (AUTO sau đo §L.b(g-bis)) · vai #1/3 round-KIỂM
- 🔬 **h24-audit** (monitor **KIỂM-vòng**, C4 S145) — verify OUTPUT lead-view+lead-omission vòng soi-lead (AUTO sau cặp H24 — @§L.b(j)(ii-bis) nếu cặp nổ ở close, @[`session-start`](session-start.md) §2.1.8 nếu cặp nổ ở open; *wherever it fires*) · vai #2/3
- 🔬 **sleep-audit** (monitor **KIỂM-vòng**, C4 S145) — verify OUTPUT /sleep-recovery gist+Fidelity vòng nén-ngủ (AUTO sau **mỗi lượt nén** `/sleep-recovery-memory-l2` — post-step của skill, *wherever it fires*: consent @[`session-start`](session-start.md) §2.1.2 HOẶC @§L.b(c) dưới) · vai #3/3
> 🧊 **Vá con-trỏ chết @S146:** bản trước trỏ *"Phase 4.5"* — heading đó **KHÔNG tồn-tại** trong file này (chỉ có Phase 1 · 1.5 · 2 · 3 · 4 · 5 · 6). Trigger THẬT = lượt nén, không phải một phase cố-định.
2. Synthesize cross-agent learnings → integrate vào:
- User auto-memory `MEMORY.md` (index — append entry mới, KHÔNG rewrite)
@ -99,21 +103,41 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
- **(j) 🔷🔶 H24 lead-self-audit — counter + spawn theo NHỊP (adopt S122; đối-xứng `session-start §2.1.8`):**
- **(i) BÁO dòng-nợ 4-vế (nâng dòng H24 cũ — Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` → in **1 dòng** `NHIP-NO: kiem light a/e deep b/f <ok|OVERDUE:> | tran-bo-nho x over-cap | run-chua-gom y` (vế-1 nhịp-kiểm THAY dòng `counter=… light … deep … OVERDUE` cũ, đọc `.session-counter.json` + `h24_cadence`). 🔴 **probe KHÔNG chặn**: lỗi → in `probe-loi (khong chan)` → đi tiếp. 🔴 **Nhịp ĐỌC từ config, CẤM hardcode ở đây** (detector `governance-detectors.ps1` H24-2 **fail-loud** nếu key thiếu — **không** giả-định default).
- **(ii) OVERDUE****INFORM anh** + đề-xuất spawn vai H24 tương-ứng. 🔴 **KHÔNG auto-run** (anh consent mới chạy, giống sleep-check (c)). Chạy xong → cập-nhật `last_audit.{light,deep}_at_counter` = counter hiện-tại. **Lead = single-writer.**
- **(ii) OVERDUE → 🔴 SPAWN AUTO, KHÔNG consent (owner chốt @S146: "3 → auto"; THAY luật consent-gate era-S122):** tới nhịp ⇒ spawn cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) **NGAY**, KHÔNG in dòng xin phép, KHÔNG chờ gật. Chạy xong → cập-nhật `last_audit.{light,deep}_at_counter` = counter hiện-tại. **Lead = single-writer.**
- 🔴 **PHẠM-VI CHÍNH-XÁC của "auto" (đọc kỹ — đừng nới):** gỡ **CỔNG NGƯỜI** (consent), **GIỮ NGUYÊN CỔNG NHỊP** (`h24_cadence` 6/15/3 vẫn đọc từ `memory-budget.json`). ⇒ H24 **KHÔNG** chạy mỗi phiên; nó chạy **tự-động KHI TỚI NHỊP**. Đây **KHÁC** bookend-của-hub (hub **gỡ hẳn counter**, rà đủ 2 đầu **mỗi** phiên) — SE **chưa** theo nhánh đó (lý-do giữ counter: `adap-reports/2026-07-15-…-bookend.md` §(2) — phiên ngắn-nhiều, cả 2 điều-kiện §4 của hub đều KHÔNG áp SE).
- 🔸 **Nếu anh muốn ĐÚNG bookend hub** (bỏ counter, 2 đầu mỗi phiên) thì đó là **quyết-định KHÁC** với "auto" — nói 1 chữ, em gỡ `h24_cadence` khỏi đường quyết-định (KHÔNG xoá key, chuyển sang INFORM).
- ⚖️ **Đánh-đổi khai thẳng:** auto-fire làm phiên tới-nhịp **nặng thêm** (2 sub) mà anh **không được hỏi trước** — đó chính là cái anh vừa đổi lấy tính **không-bỏ-sót**. Nợ nhịp từ nay **không thể trôi vì quên gật**.
- **(ii-bis) 🔬 h24-audit AUTO sau cặp H24 (vai-KIỂM vòng soi-lead, C4/C4b vai #2/3, land S145):** cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) CHẠY xong ⇒ spawn `h24-audit` NGAY — **AUTO, KHÔNG consent** (owner S145; 🧊 *vế tương-phản cũ "KHÁC (ii) consent-gate của chính H24" ĐÃ SỤP @S146 — (ii) nay cũng AUTO, xem `:106`*). Đọc FLAG-list + class 2 vai → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count / `class_repeat`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót). 🔴 no-self-exempt ≠ lead-view/omission (m-3). 🔴 Fail-safe: H24 KHÔNG chạy phiên này (**chỉ còn: chưa tới nhịp** — nhánh "không consent" chết @S146) ⇒ h24-audit **NO-OP im-lặng**. Tuần-tự C4b (SAU cặp H24, mtime chứng). Propose-only → em main VERIFY→APPEND (git-diff backstop). Contract canonical `.claude/agents/h24-audit.md` (B1).
- **(iii) Flag → class:** mỗi FLAG của 2 vai **PHẢI** thuộc **enum ĐÓNG** `lead_self_audit.flag_classes`. Vai **KHÔNG tự chế class** — finding không phân-loại được ⇒ báo **verbatim** + **escalate anh** để mở rộng enum. Cập-nhật `class_repeat.counts`; class nào lặp **≥ `jump_on_class_repeat`** ⇒ **kéo audit tới sớm**.
- **(iv) 🔴 Nghi-thức RE-STAMP carry (GAP THẬT, vá @S122):** khi ghi segment `HANDOFF` mới, **ĐÓNG DẤU LẠI `[carry:<slug>]` cho MỌI carry còn mở** — không chỉ lần đầu.
**Vì sao bắt buộc:** carry-age detector đo **streak** = số segment LIÊN-TỤC mang cùng slug. Đo thật @S121: **45 logic-segment nhưng `carry-lines=1`** ⇒ streak **luôn ≡ 1** ⇒ **0 fire VĨNH VIỄN, kể cả sau W2**. Bằng-chứng: `tra-bui-relogin` chỉ đóng dấu **seg#0 (S119)**, trong khi **seg#2 (S118)** nhắc **đúng việc đó** mà **không có dấu** ⇒ **tuổi thật ≥2, máy đọc 1**. ⇒ detector **vacuous về CẤU-TRÚC**, không phải sai ngưỡng.
🔴 **Không retrofit dấu vào segment CŨ** (§Q3 no-retrofit) ⇒ **đường DUY NHẤT còn lại** = re-stamp từ nay về sau; tuổi sẽ đo đúng **từ S122 trở đi**, và **khai thẳng** rằng carry mở trước S122 có tuổi **đo-thiếu**.
**Định-nghĩa "dòng-carry" (owner O3):** = **đoạn LOGIC** `NEXT anh` / `NEXT em` trong mega-line — KHÔNG phải dòng vật-lý. ⚠️ Bẫy đếm: `grep -c` đếm **DÒNG** (=1 trên mega-line), `grep -o | wc -l` đếm **occurrence** (=n). Dùng đúng cái thứ hai.
🔢 **Luật đánh-số chờ-anh (điểm sàn #5 master-checklist `cadd24ae`, S138 — rename S139 tránh trùng token "Sàn-5" H22 ở trên, quyết anh + L3 nit-1):** khối **chờ-anh** trong `HANDOFF` LUÔN **đánh số** (anh trả lời bằng số) — khớp nhóm-3 MASTER-CHECKLIST + nghi-thức re-stamp carry ở trên; số cố-định giúp anh trả lời gọn.
- **(v) 🔷 TICK-at-close (Item 1(d) S135 — idempotent):** tick `.claude/governance/.session-counter.json` **theo contract** — 🔴 **CON-TRỎ `session-start §2.1.8`, CẤM chép logic tick** (B1). Idempotent: cùng nhãn-phiên phiên này ⇒ **NO-OP** (nếu `/session-start` hoặc `/tiep` đã tick nhãn này). Có delta → **§5.1 add đích-danh counter-file** (file ngoài hook-3-path; bằng-chứng sống: tick S133 nằm uncommitted qua 2 closeout liên tiếp — M-7).
- **(vi) 🔥 Force-fire bù khi closeout gộp sổ (Item 3 S135 — floor B1 §3.2):** đếm `P` = số `wal: pause` gộp vào closeout này: `P=$(git log --format=%s "<closeout-liền-trước>..HEAD" | grep -c '^wal: pause' || true)` — `<closeout-liền-trước>` = commit gần nhất match **regex closeout DÙNG CHUNG Item 4** `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` (1 regex, đừng chép 2 bản). 🔴 **so-sánh SỐ, KHÔNG dùng exit-code** (`grep -c` trả exit 1 khi đếm 0 — §5.0 (a)): `[ "$P" -ge 1 ]`. Nếu **`P >= 1` HOẶC** nhãn đóng dạng `S<a>-S<b>` (closeout gộp nhiều phiên) ⇒ coi như **`OVERDUE(light)` bất-kể counter** → in dòng-nợ (qua (i)) + **INFORM-BẮT-BUỘC** anh + **đề-xuất spawn cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) NGAY closeout này**. 🔴 **DP-3 consent-gate GIỮ** (luật owner-era §L.b(j)(ii) + `session-start §2.1.8(e)` "KHÔNG auto-run — anh consent" + hẹn hub "light-run owner-triggered"): force-fire = INFORM-bắt-buộc + đề-xuất-chạy mặc-định, **anh gật mới chạy trong closeout**. Báo hub SELF-CHECK ô3 = **"PASS-với-carve-out (consent)"**, KHÔNG PASS trần.
- **(v) 🔷 TICK-at-close (Item 1(d) S135 — idempotent):** tick `.claude/governance/.session-counter.json` **theo contract** — 🔴 **CON-TRỎ `session-start §2.1.8`, CẤM chép logic tick** (B1). Idempotent: cùng nhãn-phiên phiên này ⇒ **NO-OP** (nếu `/session-start` hoặc `/tiep` đã tick nhãn này). Có delta → **§5.1 add đích-danh counter-file** (file ngoài hook-4-path; bằng-chứng sống: tick S133 nằm uncommitted qua 2 closeout liên tiếp — M-7).
- **(vi) 🔥 Force-fire bù khi closeout gộp sổ (Item 3 S135 — floor B1 §3.2):** đếm `P` = số `wal: pause` gộp vào closeout này: `P=$(git log --format=%s "<closeout-liền-trước>..HEAD" | grep -c '^wal: pause' || true)` — `<closeout-liền-trước>` = commit gần nhất match **regex closeout DÙNG CHUNG Item 4** `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` (1 regex, đừng chép 2 bản). 🔴 **so-sánh SỐ, KHÔNG dùng exit-code** (`grep -c` trả exit 1 khi đếm 0 — §5.0 (a)): `[ "$P" -ge 1 ]`. Nếu **`P >= 1` HOẶC** nhãn đóng dạng `S<a>-S<b>` (closeout gộp nhiều phiên) ⇒ coi như **`OVERDUE(light)` bất-kể counter** → in dòng-nợ (qua (i)) + **INFORM-BẮT-BUỘC** anh + **đề-xuất spawn cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) NGAY closeout này**. 🔴 **DP-3 consent-gate ĐÃ GỠ @S146 (owner "3 → auto")** — force-fire nay **CHẠY THẲNG**: in dòng-nợ (qua (i)) + **spawn cặp H24 NGAY trong closeout**, KHÔNG chờ gật. Đồng-bộ (ii) ở trên (B1 — luật sống ở (ii), mục này chỉ áp).
🧊 *(Luật cũ era-S122: "INFORM-bắt-buộc + đề-xuất, anh gật mới chạy" — **RETIRED**. Hệ-quả kèm theo: báo hub SELF-CHECK ô3 nay là **PASS trần**, KHÔNG còn carve-out "(consent)" — carve-out đó sinh ra CHỈ vì cổng người, gỡ cổng thì gỡ luôn carve-out.)*
*baseline-ghi-bù (phép-8 annex `dede7ec5`, khai-1-lần): cơ-chế force-fire bù closeout-gộp tồn tại từ 2026-07-17 (`da349fc`, S135 — re-đo 19:12:41+07). Phép-8 CHỈ tính FAIL cho closeout SINH SAU mốc; closeout trước = baseline hợp-lệ ghi n/a, KHÔNG đếm FAIL. Không lặp mỗi lần chạy.*
- **(g) 🔌 tooling-freshness CHỐT (🟫 tooling-auditor H1 — Harness 1):** spawn → chốt 4-mặt (skill·sub-role·plugin·docs) đổi gì session này + **new-alloc audit** (skill/plugin MỚI chưa phân-bổ → đề-xuất gán em main + sub phù-hợp vai) + flag doc-drift/roster-lệch/count-stale. Propose → em main APPEND/sửa doc (single-writer). 🔴 G-015: 2 monitor = propose-only, em main VERIFY trước APPEND (Bash residual → KHÔNG "read-only enforced").
- **(g-bis) 🔬 tooling-harvest-audit — vai-KIỂM vòng tooling/harvest (C4/C4b adap dot-11 `harness-dong-du-vong:51`, owner-decision [2] TÁCH, land S145; đối-xứng (k) trio nhưng AUTO):** đóng lỗ "vòng tooling/harvest **0 con soi**" — vai-KIỂM độc-lập đọc OUTPUT H1 (g) + H2 (d)(f), KHÔNG re-chạy đo. Contract = canonical `.claude/agents/tooling-harvest-audit.md` (B1 — KHÔNG chép vào đây).
- **(i) 🔴 AUTO sau đo — KHÔNG consent-gate (owner-chốt S145, KHÁC (j) H24 + (k) trio):** H1 (g) + H2 (d)(f) chốt xong ⇒ spawn NGAY, KHÔNG in dòng đề-xuất, KHÔNG chờ gật.
- **(ii) 🔴 Fail-safe NO-OP:** H1/H2 KHÔNG chạy phiên này ⇒ pin input missing ⇒ vai in `tooling/harvest round: no measure → NO-OP` + DỪNG. **Auto ≠ chạy-mù**, CẤM ĐẠT-ảo.
- **(iii) 🔴 Tuần-tự (C4b):** spawn ở invocation **SAU** (g)/(f); bằng-chứng `mtime(return) > mtime(output H1/H2)`. KHÔNG song song.
- **(iv) Propose-only, lead single-writer:** return verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + tự tái-dựng ≥1 số CÓ-THỂ-SAI + **thách-CLEAN** → em main VERIFY → APPEND (B3). Backstop = git-diff (G-015 — Bash residual → KHÔNG "read-only enforced").
- **(v) no-self-exempt (m-3 S139):** vai ≠ H1/H2.
- **(vi) 🔴 D2 — KIỂM end-only (COMMIT DEFER, owner-option (b) S145 · landing @S146): CHỦ-ĐÍCH, KHÔNG phải bỏ sót.**
**Luật 1 dòng (chép ĐÚNG câu này vào cả 3 contract vai-KIỂM):** *"KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close."*
**Vì sao DEFER — 3 vế đo được (không phải "chưa kịp làm"):**
1. Nhịp **"hai đầu"** của khung 5-vòng buộc **tầng ĐO** có mặt 2 đầu (H1/H2 **báo-diff** @`session-start` — wired 2-đầu THẬT); nó **KHÔNG** buộc **tầng KIỂM** cũng 2 đầu.
2. Cột self-verify của V1/V2/V4 trong checklist 5-vòng canonical = **CLOSE-time**: thứ bị chấm (spawn-record 4-field · freshness-verdict 4-mặt · harvest 5-trục · gist+Fidelity) **chỉ SINH ra ở close**.
3. @open output là **diff-report nhẹ**, đã em-main verify tại chỗ ⇒ **KHÔNG có artifact authoritative nào để audit**. Ép KIỂM chạy @open = chấm một bản **chưa tồn-tại** ⇒ đúng cái **ĐẠT-ảo** mà fail-safe NO-OP của cả 3 contract đang cấm.
**Đánh-đổi khai thẳng:** sai-sót phát sinh @open chỉ bị soi ở close **cùng phiên** (trễ, KHÔNG mất). 🔁 **Điều-kiện huỷ-defer:** ngày nào @open sinh ra artifact **authoritative** (không còn chỉ diff-report) thì DEFER này **PHẢI** xét lại — defer **có điều-kiện huỷ**, không phải đóng vĩnh-viễn.
🔗 **H24-coupling — ngoại-lệ CÓ CHỦ-ĐÍCH, khai rõ (KHÔNG mâu-thuẫn "end-only"):** `h24-audit` **bám cặp H24 *wherever it fires*** — cặp chạy @§L.b(j)(ii) ⇒ nó chạy ở **close**; cặp chạy @[`session-start`](session-start.md) §2.1.8 (OVERDUE ⇒ **AUTO**, KHÔNG còn cửa consent @S146) ⇒ nó chạy **NGAY tại open, ngay sau cặp**. Lý-do: pin của nó = **FLAG-list H24 tươi**, artifact đó **authoritative NGAY khi cặp trả**, không đợi close. `sleep-audit` cùng khuôn (bám **lượt nén** wherever it fires: consent @§2.1.2 hoặc @§L.b(c)). **Chỉ `tooling-harvest-audit` end-only TUYỆT-ĐỐI** (pin = H1-chốt + H2-5-trục, chỉ sinh ở close). ⇒ "end-only" nghĩa là **KHÔNG mở nhịp KIỂM RIÊNG @open**; vai vẫn **đi theo con-đo của nó** bất kể con-đo nổ ở đâu.
- 🔸 **Trạng-thái adopt (owner S145 — đo lại đĩa @S146):** **cả 3 vai-KIỂM đã BUILT + WIRED S145** — `tooling-harvest-audit` (g-bis) · `h24-audit` (j)(ii-bis) · `sleep-audit` (post-step lượt nén). Mỗi vai **chạy audit-round khi vòng tương-ứng chạy**, độc-lập, KHÔNG chờ nhau. 🧊 Bản trước xếp `h24-audit` + `sleep-audit` vào diện **chờ-land về sau** (đợi vai #1 chạy-thử-1-phiên) = **STALE @S146**: mâu-thuẫn chính danh-sách roster Phase 1 (3 dòng 🔬 đã wire AUTO) **và** mâu-thuẫn đĩa (`.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md` tồn-tại CẢ 3). Số vai roster canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 — KHÔNG chép số).
- **(h) 🔏 User-Mark CHỐT cuối phiên (H-12/13 canonical §P/P7, S79 — `harness-11-engine.md §E`):** đọc [`.claude/governance/ACTIVE-MARKS.md`](../governance/ACTIVE-MARKS.md) → (i) **hiển-thị** status-filtered (Active-High/Active hiện · Medium tóm-tắt · Disable ẩn) cho anh đọc lại (đối-xứng `session-start §2.1.4`); (ii) nếu session này có **quyết-định cấp-governance MỚI** (scope-check P6: đổi CANONICAL §-rule/authority) → chạy `/user-mark-<cấp>` DACI: adjust-gov → double-check → **report-trước-đóng-dấu 3-7 tiêu-chí khách-quan (P4)** → anh confirm → stamp `RC-pqhuy1987-dd-mm-yyyy-hh-mm-ss`; (iii) supersede/disable mark cũ (P5) → con-trỏ-xuôi + Active-High cần anh-confirm RIÊNG. 🔴 **KHÔNG tự đóng dấu / đổi cấp trước khi báo (P4/P8).** 0 quyết-định-mới → "n-a, chỉ hiển-thị".
- **(i) 🎯 H18-D(a) outcome spot-check (S100 — [`harness-11-engine.md §J`](../../docs/governance/harness-11-engine.md)):** session governance/review-heavy → chọn **35 artifact đã tự-động-qua-cổng** trước đó (cicd GO verdict · detector verdict · monitor verdict · adap-report claim) → **kiểm-lại TƯƠI bằng ground-truth** (tính lại giá-trị đối-chứng · mở định-nghĩa gốc xem claim có thật-cover · đối-chiếu nguyên-văn nguồn). Gấp vào review sẵn có (chi-phí ~0). Sàn-vai trượt-THẬT khỏi nhật-ký → reinject-on-real-miss qua [`reinject-ledger.md`](../governance/reinject-ledger.md) CG-1 (≤1 lần/N=3 phiên, vẫn trượt → escalate anh — REUSE H17 §I B2, KHÔNG sổ mới). Light/hỏi-đáp → skip. (Nấc honest: dogfood n=1 S100 = mẫu hiệu-chỉnh, CHƯA "proven" — caveat 1 broadcast H18.)
- **(k) 🧪🧭🧮 Bộ-ba đồng-kiểm memory @ĐÓNG-PHIÊN (adopt S141 — đối-xứng `session-start §2.1.9`; khuôn hub 5-câu `58e28bae` khối B):** đầu-thứ-2 của nhịp 2-đầu-phiên. Trục = **CHÍNH-HỆ-MEMORY**, KHÁC (g) H1 tooling / (d)(f) H2 harvest / (j) H24 lead / reviewer chấm-diff. Contract từng vai = canonical ở `.claude/agents/harness-{eval,refine,audit}.md` (B1 — KHÔNG chép contract vai vào đây).
- **(i) 🔴 CONSENT-GATED, KHÔNG auto-run** (cùng khuôn sleep-check (c) + H24 (j)(ii)): in **đề-xuất 1 dòng** `trio-memory: de-xuat chay eval->refine->audit @S<nn> (consent?)` → **anh gật mới chạy**.
- **(i) 🔴 CONSENT-GATED, KHÔNG auto-run** (cùng khuôn **sleep-check (c)** — 🧊 **@S146 GỠ vế "+ H24 (j)(ii)"**: H24 nay **AUTO**, viện nó làm khuôn consent là **SAI**): in **đề-xuất 1 dòng** `trio-memory: de-xuat chay eval->refine->audit @S<nn> (consent?)` → **anh gật mới chạy**.
- **(ii) 🔴 TUẦN TỰ, CẤM song song:** **3 spawn RIÊNG** eval → refine → audit. **KHÔNG dùng `parallel()` của `hmw.js`** — refine đọc output eval, audit chấm cả 2; song song ⇒ chấm **bản cũ** ⇒ verdict vô-nghĩa.
- **(iii) Lead scribe NGAY (single-writer):** return từng con → ghi `.claude/workflows/runs/<run-id>/harness-{eval,refine,audit}-return.md` **ngay khi con đó trả**, KHÔNG đợi đủ 3 (3 vai **không có Write/Edit** ⇒ tự-ghi-đĩa bất-khả; phiên chết ⇒ mất return — bài-học vòng-1 S141).
- **(iv) PIN đích-danh (fail-closed):** refine nhận **path** `…/harness-eval-return.md`; audit nhận **path run-folder** đang chấm. 🔴 Pin missing/rỗng ⇒ **TỪ-CHỐI / TRƯỢT**; CẤM tự tìm "run mới nhất" (⇒ **ĐẠT-ảo**).
@ -122,6 +146,71 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
- **(vii) [M4] Vết 2 lớp:** proposal-line ở (i) **IN CẢ khi Light/hỏi-đáp** (Light ⇒ skip CHẠY hợp-lệ, **CẤM skip IM-LẶNG**); khi skip ⇒ ghi **1 dòng vết** vào `.claude/WAL.md`: `trio: skipped S<nn> (<ly-do: light | khong-gat | ...>)`.
- **(viii) Đơn-vị nhịp:** "phiên-LOGIC" hub map **TẠM** = nhãn-phiên `S<nn>` (SE chưa adopt session-logic). 🔴 **KHÔNG cadence-key** trong `memory-budget.json`, **KHÔNG tick** counter cho bộ-ba (nhịp bộ-ba ≠ nhịp H24 — trộn 2 đồng-hồ = hỏng cả hai).
### §L.c — completeness-gate 5-vòng (D1, land S146 — 🔴 CÓ RĂNG: CẤM bare-PASS)
> Chạy **SAU** khi §L.b (a)→(k) xong, **TRƯỚC** Phase 2. Toàn-bộ gate **read-only** ⇒ không phá đóng-băng bề-mặt-đo (c).
> Khung canonical = checklist 5-vòng/8-phép của hub (`f71c5b65`); gate ở đây = **5 vòng chức-năng + 4 phép sàn** (phép 14).
>
> 🔴 **LUẬT ĐỌC KẾT-QUẢ = RĂNG của gate.** Mỗi phép chỉ được mang **1 trong 3 nhãn**:
> **`ĐẠT`** — *bắt buộc kèm bằng-chứng đĩa DÁN VÀO* · **`TRƯỢT`** — *kèm số/path LỆCH* · **`vacuous`** — *không có input, kèm folder-state*.
> **Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT.** Bằng-chứng = **output của lệnh vừa chạy**; "đã verify" / "khớp rồi" / trí-nhớ ⇒ **KHÔNG tính** (luật soi-được thay trí-nhớ — S122 §5.0 ghi-chú, S119).
> 🔴 **Chống meta-count blind-spot (S119):** báo dạng **`phép: ĐẠT a / TRƯỢT b / vacuous c`** với **a+b+c = 4**. **CẤM** gộp thành "4/4 PASS" khi còn `vacuous` — `vacuous` **KHÔNG** cộng vào tử-số ĐẠT.
> 🔸 **Nấc của gate = evidence-mandate, KHÔNG phải cổng chặn** (không chặn đóng phiên). Chính vì informational nên nó **an-toàn để sai** — và vì thế **cấm tô hồng**: một `ĐẠT` rỗng bằng-chứng rẻ hơn nhiều so với một `TRƯỢT` có số, nên chỉ luật-soi-được mới giữ được nó thật.
**(1) 5 vòng — mức CHỨC-NĂNG** (mỗi vòng = 1 con-ĐO + ≥1 con-KIỂM độc-lập; ô dưới là **con-trỏ**, KHÔNG chép logic — B1):
| Vòng | Con-ĐO (chạy ở) | Con-KIỂM độc-lập | Bằng-chứng tối-thiểu phải dán |
|---|---|---|---|
| V1 tooling + harvest | H1 `tooling-auditor` (g) · H2 `harvest-curator` (d)(f) | `tooling-harvest-audit` (g-bis) | path sổ/return H1+H2 phiên này |
| V2 soi-lead | cặp H24 (j)(ii) *hoặc* [`session-start`](session-start.md) §2.1.8 | `h24-audit` (j)(ii-bis) | FLAG-list + class (enum ĐÓNG) |
| V3 bộ-ba memory | `harness-eval` → `harness-refine` (k) | `harness-audit` (k) | 3 path `runs/<id>/harness-*-return.md` |
| V4 nén-ngủ | `/sleep-recovery-memory-l2` (INFORM @(c) hoặc @§2.1.2) | `sleep-audit` (post-step lượt nén) | path `.gist.md` mới + Fidelity verdict |
| V5 sàn-sự-thật "đã-đo" | measured-label-gate (**floor** — không vai riêng) | — (floor tự-soi ở MỌI verdict) | 1 nhãn `đã-đo` bị chặn / được cho qua trong phiên |
🔴 Vòng **không chạy** phiên này ⇒ ghi **`không-nhịp`** + lý-do (chưa tới cadence · anh không consent · không có input). **KHÔNG** ghi ✓, **KHÔNG** tính TRƯỢT — nhưng cũng **KHÔNG** được im-lặng bỏ khỏi bảng.
**(2) 4 phép sàn — mỗi phép PHẢI SHOW bằng-chứng đĩa:**
**🔎 phép-1 — tick vs cửa** · bằng-chứng = **3 SỐ thật** (không phải chữ "khớp"):
```bash
# cửa-sổ = (closeout-liền-trước .. HEAD]. 🔴 regex closeout DÙNG CHUNG §L.b(j)(vi) — KHÔNG chép bản thứ 2 (B1).
LAST=$(git log --format='%H %s' | grep -m1 -E '<regex closeout — lấy ở (j)(vi)>' | cut -d' ' -f1)
P=$(git log --format=%s "$LAST..HEAD" | grep -c '^wal: pause' || true) # điểm dừng
L=$(git log --format=%s "$LAST..HEAD" | grep -oE 'S[0-9]+' | sort -u | wc -l) # nhãn-phiên (proxy)
grep -oE '"counter": *[0-9]+|"last_ticked_session": *"[^"]*"' .claude/governance/.session-counter.json
```
Dán vào gate: **`cửa = L nhãn + P dừng`** · **`counter-delta = <trước><sau>`**. Lệch ⇒ **TRƯỢT + IN DANH-SÁCH cửa CÂM** (cửa nào không có tick). 🔴 Viết "tick đủ" mà thiếu 3 số ⇒ **TRƯỢT**. 🔸 `L` là **proxy** (S-label trên commit-subject); đối-chứng nguồn-2 = `docs/changelog/sessions/` khi nghi ngờ.
**🔎 phép-2 — dòng-nợ tại cửa** · bằng-chứng = **DÁN NGUYÊN VĂN dòng máy in**:
Copy **y nguyên** dòng `NHIP-NO: …` mà §L.b(j)(i) vừa in (kể cả khi nó là `probe-loi (khong chan)`) vào gate. 🔴 **Tóm-tắt / diễn-giải / "đã in rồi" ⇒ TRƯỢT** — phải là chuỗi do máy in.
🔸 **Vế-set canonical = `scripts/nhip-no-probe.ps1`** (B1 — KHÔNG chốt số vế ở đây): checklist hub gốc gọi *"dòng-nợ 3-vế"*, script SE hiện in **4 đoạn** (`kiem | tran-bo-nho | run-chua-gom | pull-cach`) và 4 command đều gọi "4-vế". Gate đo **nguyên-văn dòng in** ⇒ script đổi vế thì gate **không stale**.
**🔎 phép-3 — closeout đủ nghi-thức** · bằng-chứng = **PATH THẬT** (không phải ✓):
**3 closeout gần nhất**, mỗi kỳ phải chạm đủ **4 sổ**: `docs/STATUS.md` · `docs/HANDOFF.md` · `docs/changelog/sessions/**` · `.claude/agent-memory/**` — đo **UNION-per-label**.
🔴 **KHÔNG per-commit-naive:** `agent-memory/` thường vào qua `wal:` commit **cùng kỳ** ⇒ đếm theo từng commit sẽ **FAIL oan** (đo thật S135: S133 `e53a693` chỉ đủ sổ khi tính union với `9f404d3`).
```bash
# C1 C2 C3 = 3 closeout gần nhất (regex DÙNG CHUNG (j)(vi)) → union file-set từng kỳ:
git log --name-only --format='' "C2..C1" | sort -u \
| grep -E 'docs/STATUS\.md|docs/HANDOFF\.md|docs/changelog/sessions/|\.claude/agent-memory/'
```
Dán vào gate: **bảng 3 dòng × 4 cột, mỗi ô = path thật** matched. Ô rỗng ⇒ **TRƯỢT + tên sổ thiếu + kỳ nào**. 🔸 Proxy này không phân-biệt *"không chạy"* vs *"chạy mà không ghi sổ"* — **cả hai đều lỗi** nên vẫn bắt đúng (khai thẳng, S135 ghi-chú (v)).
**🔎 phép-4 — vai ĐÃ-CHẠY phải có sổ** · bằng-chứng = **roles-ran list + path sổ**:
1. Liệt **danh-sách vai ĐÃ CHẠY phiên này** (nguồn = spawn-record (d); 0 spawn ⇒ ghi `n-a`, **không** để trống).
2. Với **TỪNG** vai trong list: dán path `.claude/agent-memory/<role>/MEMORY.md` + **byte > 0** + mtime phiên này (`ls -la`). Vai chạy mà **thiếu sổ** hoặc **sổ 0-byte** ⇒ **TRƯỢT** (AS-8 — 0-byte memory là ca đã xảy ra thật, S45).
3. 🔴 **Vai WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state**, **KHÔNG TRƯỢT** và **KHÔNG ĐẠT**:
```bash
ls -la .claude/agent-memory/tooling-harvest-audit/ .claude/agent-memory/h24-audit/ .claude/agent-memory/sleep-audit/ 2>&1
```
📌 **Baseline đo tại lúc land gate (@S146 — mốc 1 lần, KHÔNG lặp mỗi phiên):** `tooling-harvest-audit/` **tồn-tại nhưng RỖNG** (0 `MEMORY.md`) · `h24-audit/` + `sleep-audit/` **MISSING** ⇒ cả 3 = **WIRED nhưng CHƯA chạy audit-round THẬT** ⇒ đúng ca `vacuous` (`tooling-harvest-audit` @S145 chỉ spawn-PROBE, cố-ý 0-ghi).
🔴 **Vacuous KHÔNG phải giấy phép vĩnh-viễn:** một khi vòng tương-ứng CHẠY (H1/H2 chốt · cặp H24 chạy · lượt nén chạy) mà vai-KIỂM vẫn **không có sổ** ⇒ **TRƯỢT thật**, hết cửa vacuous. Đây là chỗ dễ **ĐẠT-ảo** nhất của cả gate: *"folder trống"* đọc giống *"chưa tới lượt"* y hệt *"chạy rồi mà nuốt sổ"* ⇒ **phải kèm bằng-chứng vòng đó có/không chạy**, không chỉ kèm `ls`.
**(3) Dòng báo gate** (1 dòng, ghi cạnh khối `memory-triple` trong session-log):
```
completeness-gate S<nn>: vong <x>/5 chuc-nang (khong-nhip: <ds>) | phep DAT a / TRUOT b / vacuous c
```
🔴 Có `TRƯỢT` ⇒ **NÊU ở report Phase 4** + **đổ vào sổ đích** (carry-slug `HANDOFF` / `WAL`-line / `STATUS`-row) — không mục nào rơi khỏi sổ.
## Phase 2 — WRITE (update MD/RAG)
### 2.1 UPDATE/Re-rank MD/RAG đã thay đổi
@ -149,7 +238,7 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
- Phase 9 UAT mode: feature test-after (có thể skip per chunk), vẫn `npm run build` × 2 app. Nếu chỉ docs/infra → ghi "N/A".
### 3.2 Sub-agent state
- Kiểm tra trạng thái spawn sub-agent (**10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
- Kiểm tra trạng thái spawn sub-agent (**10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory · 3×round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` S145)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
- Task bất kỳ phải phân việc đầy đủ đúng vai trò split boundary (BE→backend, FE→frontend, test→test-specialist)
### 3.3 RAG + MCP state
@ -208,7 +297,7 @@ K=0; while read -r s; do case "$s" in wal:*) K=$((K+1));; *) break;; esac
### 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.
- 🔴 **M-7 — add đích-danh `.claude/governance/.session-counter.json` khi tick-at-close (§L.b(j)(v)) tạo delta:** file NGOÀI hook-3-path ⇒ KHÔNG tự vào `wal:` commit ⇒ PHẢI `git add` đích-danh ở commit closeout, nếu không counter-delta nằm uncommitted (bằng-chứng sống: tick S133 uncommitted qua 2 closeout liên tiếp).
- 🔴 **M-7 — add đích-danh `.claude/governance/.session-counter.json` khi tick-at-close (§L.b(j)(v)) tạo delta:** file NGOÀI hook-4-path ⇒ KHÔNG tự vào `wal:` commit ⇒ PHẢI `git add` đích-danh ở commit closeout, nếu không counter-delta nằm uncommitted (bằng-chứng sống: tick S133 uncommitted qua 2 closeout liên tiếp).
- 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)
- Scope: `Contract · PurchaseEvaluation · Budget · Form · Workflow · Supplier · Auth · Admin · Api · App · Domain · Infra · FE-Admin · FE-User · Tests · Docs · CICD · Scripts · Skill`
@ -269,6 +358,18 @@ git push origin main # → git.baocaogiaoduc.vn/vietrep
- Surface report cho anh main relay AI_INFRA (1 lần báo = ACK+executed+evidence). Em main `/session-start` kế watch + double-check → cơ chế 2 chiều tự duy trì.
- Session KHÔNG adopt infra gì → ghi "N/A (no infra adoption this session)".
### 6.3-bis 🔒 Chốt-kết `_end` — đóng băng phiên-LOGIC (owner chốt @S146 "giống hub")
> Floor manifest `101e69d6` §1: dấu-mốc thứ-4 = **"Chốt-kết (`_end`) — dấu đóng băng khi phiên-LOGIC thực sự khép lại"**. SE form = `closed.md`. Chân này **trước S146 CHƯA wire** ⇒ cân-sổ ORPHAN-L chỉ có nửa vào, không có nửa khoá (kêu oan ca *"pause rồi đóng thẳng không qua `/tiep`"*). Nay đóng.
- **Ghi `.claude/sessions/session-<N>/closed.md`** cho `<N>` đang mở — **FROZEN, ghi MỘT lần, CẤM sửa về sau**. Nội dung tối-thiểu **4 trường**:
`phien-logic: L<N>` · `cua-so: S<a>..S<b>` (các nhãn vật-lý thuộc phiên-logic này) · `closeout-commit: <sha>` · `ket-qua: <1-3 dòng arc đã đóng>`.
- **Cân-sổ (khoá vòng ORPHAN-L):** sau khi ghi, **mọi `pause-*.md` trong thư-mục coi như ĐÃ ĐỐI-ỨNG** — `closed.md` đóng vai đối-ứng cho khối `pause` cuối chưa có `resume-*`. ⇒ [`tiep.md §0`](tiep.md) block **⑤ ORPHAN-L** hết kêu oan.
- 🔴 **Idempotent:** `closed.md` đã tồn-tại ⇒ **NO-OP, CẤM ghi đè** (phiên-logic đã khép; closeout chạy lại không được "mở lại rồi khép lại").
- 🔴 **Thư-mục `session-<N>/` KHÔNG tồn-tại ⇒ NO-OP im-lặng** — phiên này không mở phiên-logic nào (vd vào thẳng bằng `/tiep`, chưa từng `/session-start`). **CẤM tự tạo thư-mục chỉ để ghi `closed.md`** — tạo-rồi-đóng-ngay là **sổ rỗng giả**, đúng loại ĐẠT-ảo mà fail-safe NO-OP khắp harness đang cấm.
- **Add đích-danh** ở §5.1 (thư-mục phiên nằm trong hook-4-path nên hook cũng nuốt, nhưng **đừng dựa hook để chốt** — cùng lý-lẽ `pause.md §2.6`).
🔸 **Meld-forward (floor hub, miếng nền thứ-3) — CHƯA kiểm tại SE:** hub ràng *"commit mang thư-mục phiên được **nhập-tiến về trước** khi squash, KHÔNG bị bỏ rơi"*. §5.0/§5.2 của SE squash `wal:`-trailing bằng `reset --soft` ⇒ nội-dung **ở lại INDEX** nên **về lý là không mất**; nhưng **chưa có phép đo riêng** cho `.claude/sessions/`. ⇒ khai **CHƯA-ĐO**, không claim kín.
### 6.4 Reset WAL (H22 — bước CUỐI) + **XOÁ sentinel Sàn-2**
- 🔴 **XOÁ dòng `closing:`** (Sàn-2 — đặt ở BƯỚC 0). Bước này **vốn LUÔN chạy** ⇒ thêm việc xoá = **net-zero**. Xoá-dấu-không-tồn-tại = no-op vô-hạ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)`.

View File

@ -72,10 +72,36 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
🔴 **Sàn-3 = định-nghĩa CANONICAL ở [`tiep.md`](tiep.md) §0** — bước này **CHỈ TRỎ**, CẤM chép logic (B1). ⚠️ **Bản trước S122 tự suy *"sổ trống ⇒ sạch"* — ĐÓ LÀ BUG**, và Sàn-3 sinh ra để vá đúng nó (cùng cặp với `tiep.md:15` cũ; lead mắc thật, không phải giả-định).
- **(a) SẠCH** = WAL không còn mục dở **VÀ** cả **4 tín-hiệu BẬC MẠNH** Sàn-3 đều im → báo **1 dòng** "WAL sạch — Sàn-3 4/4 im" rồi tiếp **Phase 1** (no-wait).
- **(a) SẠCH** = WAL không còn mục dở **VÀ** **TOÀN BỘ tín-hiệu BẬC MẠNH** Sàn-3 đều im → báo **1 dòng** "WAL sạch — Sàn-3 im toàn-bộ bậc MẠNH (`k/k`)" rồi tiếp **Phase 1** (no-wait).
> 🔴 **`k` = số tín-hiệu MẠNH, ĐỌC SỐNG từ [`tiep.md`](tiep.md) §0 — B1, CẤM chép số vào đây.** Bản trước chép cứng "4" và **đã stale ngay** khi Sàn-3 lên **5** @S146 (tín-hiệu ⑤ `.claude/sessions/` đẻ cùng hook path thứ-4). Chép số = tự đẻ drift đúng lần nới kế tiếp.
- **(b) CÓ mạch dở** = WAL có `[!]`/`[ ]` **HOẶC** 🔴 **Sàn-3 bắt ≥1 tín-hiệu MẠNH — KỂ CẢ KHI SỔ TRỐNG** → BÁO **goal** + **mục `[!]` đầu-tiên** (hoặc **tín-hiệu Sàn-3 nào kêu** + đường-dẫ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**. 🔴 **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).
> 🧭 Toàn-bộ Sàn-3 (3 bậc + **DUAL-ACCEPT** orphan [dạng-3 retired S123] + 2 kẽ khai thật) **và** quy-trình recovery (verify-trước-next · ground-truth-thắng · relaunch-cắt-gọt cho `wf:`) viết Ở **MỘT CHỖ** = [`tiep.md`](tiep.md) §0§4. 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).
> 🧭 Toàn-bộ Sàn-3 (3 bậc + **DUAL-ACCEPT** orphan [dạng-3 retired S123] + **ORPHAN-L ⑤** [S146] + 2 kẽ khai thật) **và** quy-trình recovery (verify-trước-next · ground-truth-thắng · relaunch-cắt-gọt cho `wf:`) viết Ở **MỘT CHỖ** = [`tiep.md`](tiep.md) §0§4. 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).
## 📋 BƯỚC 0.8 — Thư-mục phiên-LOGIC `.claude/sessions/session-<N>/` (S146 — session-model, **FORM chốt / NGHI-THỨC còn gated**)
> Nền: [`session-model-se-draft.md`](../../docs/governance/session-model-se-draft.md). Một **phiên-LOGIC** = khởi-động nặng 1 lần → N **cửa-sổ vật-lý** nối bằng `/pause`→`/tiep` → chốt nặng 1 lần.
**(a) FORM — đã chốt (theo hub-form, K4 form-conflict giải @S146):**
- Thư-mục: `.claude/sessions/session-<N>/` · **regex `^session-\d+$`** (KHÔNG `L<mm>`, KHÔNG hậu-tố mô-tả — máy phải quét được).
- `<N>` = **ID phiên-LOGIC, nguyên tăng** (`max(<N> hiện có) + 1`). 🔴 **Nhãn 2 tầng (VC-1):** `S<nn>` = **cửa-sổ vật-lý** (mọi cơ-chế tick/counter/H24 GIỮ NGUYÊN đơn-vị này) · `L<N>` = **phiên-logic**, dùng **CÙNG con số** với `session-<N>` — hai cách viết của **một ID**, **KHÔNG phải hai bộ đếm**.
- **Ai tạo thư-mục — 🔴 SCAFFOLD IDEMPOTENT (owner chốt @S146 "giống hub"; floor manifest `101e69d6` §1 "Cộng ba miếng nền"):** *"thư-mục phiên **tự tạo ở đầu phiên**; **chạy lại nhiều lần vô hại** (không đè cái đã có)"*. ⇒ **BẤT-KỲ điểm-vào nào** (`/session-start` · `/pause` · `/tiep`) gặp `session-<N>/` chưa tồn-tại thì **TẠO**; đã có thì **DÙNG LẠI, CẤM đè**.
- 🔴 **Ai cấp `<N>` (khác "ai tạo thư-mục" — đừng lẫn):** **CHỈ `/session-start`** mới **MỞ SỐ MỚI** (`max(<N> hiện có) + 1`). `/pause` · `/tiep` **KHÔNG BAO GIỜ tự tăng `<N>`** — chúng chỉ **tạo thư-mục cho `<N>` ĐANG MỞ** nếu nó chưa có trên đĩa (ca "cửa đầu chưa kịp scaffold"). Không có `<N>` nào đang mở ⇒ dùng `<N> = max+1` **và ghi 1 dòng khai** trong khối đó là số được cấp ngoài `/session-start`.
- 🧊 **Vá mâu-thuẫn @S146:** bản trước ghi *"Ai mở `<N>` mới: **CHỈ** `/session-start`"* trong khi [`pause.md §2.6`](pause.md) ghi *"chưa có thì đây là cửa đầu ⇒ **tạo** `session-<N>/`"* ⇒ **hai file nói ngược nhau về quyền tạo**. Gốc lỗi = **gộp hai khái niệm khác nhau** (*cấp SỐ* ⟂ *tạo THƯ-MỤC*) vào một câu. Nay tách đôi: **cấp số = độc-quyền `/session-start`** · **tạo thư-mục = idempotent, ai gặp trước thì tạo**. Hub chỉ ràng vế thứ hai.
**(b) Đo TRƯỚC khi tin — `.gitignore` (đo @S146, KHÔNG suy):**
```bash
git check-ignore -q .claude/sessions/session-1 ; echo "exit=$?" # → exit=1
```
`exit=1` = **KHÔNG bị ignore** ⇒ thư-mục phiên **được commit** (negation `.gitignore:82-83` `!.claude/` + `!.claude/**` thắng; không pattern nào sau đó loại `sessions/`). ⇒ hợp-lệ để `/pause` ghi context-map vào đây và hook nuốt.
**(c) Hook đã phủ:** `.claude/sessions/`**path thứ-4** của `wal-flush.ps1` (S146) ⇒ context-map tự vào `wal:` commit; **và** Sàn-3 có tín-hiệu **⑤ + ORPHAN-L** canh đúng vùng đó ([`tiep.md`](tiep.md) §0). Hai thứ này **đẻ cùng lúc** — path không có tín-hiệu = điểm mù không người canh.
**(d) 🔴 KHAI RANH — cái gì ĐÃ bật, cái gì CHƯA (chống đọc thành "đã adopt session-model"):**
-**Đã wire @S146:** form thư-mục · hook path thứ-4 · `/pause` ghi context-block (`pause.md §2.6`) · `/tiep` đọc + ghi biên-nhận (`tiep.md §2.6`) · tín-hiệu ⑤/ORPHAN-L.
-**CHƯA — chờ anh duyệt bảng VC (draft §3 + §4(c)):** **KHÔNG** nghi-thức nào được chuyển sang per-L trong lượt này. Phase 1 READ · monitor re-report · H24 tick · governance-detectors · closeout **VẪN chạy per-cửa `S<nn>`** y như cũ. Bước 0.8 = **hạ-tầng + đo**, KHÔNG phải công-tắc.
-**`session_ctx_kb` (trần ngân-sách context-phiên) = 64 — OWNER CHỐT TƯỜNG-MINH @S146.** Canonical = [`memory-budget.json`](../agent-memory/memory-budget.json) → `session_ctx_kb` (+ `_session_ctx_kb_owner_set`); **B1 — KHÔNG chép số ra đây**, dòng này chỉ TRỎ. Đơn-vị **KB**, code đọc **nhân 1024**.
🔴 **Vẫn là GHOST-WIRE, đừng đọc thành "đã wire":** đo @S146 **0 script đọc khoá** (hit duy-nhất trong `scripts/`**comment** `nhip-no-probe.ps1:42`; đối-chứng `pull_warn_days` **có** reader thật `:190`). Có số ≠ có hành-vi. Ai wire sau phải **đọc khoá**, không hardcode.
## Phase 1 — READ (load context)
@ -94,7 +120,7 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
## Phase 2 — AUDIT (state check)
### 2.1 Sub-agent state (topology — **10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
### 2.1 Sub-agent state (topology — **10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory · 3×round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` S145)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
- Check TOÀN roster đã spawn chưa:
- 🟦 **investigator-codebase** — internal SQL/EF/grep/reference mirror audit
- 🟦 **investigator-api** — external docs/CVE/lib/cross-project reference
@ -132,7 +158,10 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
> Read-side "vật-chất-tối": archive `agent-memory/<sub>/archive/*.md` KHÔNG vào RAG. Inject **mục-lục** (`archive/_INDEX.md`), nội dung verbatim + `.gist.md` đọc-theo-nhu-cầu. "Inject tấm bản-đồ, KHÔNG inject lãnh-thổ."
- **🌙 Sleep-check (Harness-10b, S72):** trong lúc đọc `memory-budget.json` (cùng file budget-audit), lấy `last_sleep_at` → nếu `null` HOẶC `today last_sleep_at ≥ 7 ngày`**INFORM gợi-ý** chạy `/sleep-recovery-memory-l2 <agent|all>` (nén L2 verbatim→gist additive). 🔴 **KHÔNG auto-run** — anh consent mới chạy. **+ Byte-display (Item 8/M-10 S135):** khi INFORM fire → in kèm **tổng byte `agent-memory/*/archive/<period>.md` CHƯA có `.gist.md`** (match PREFIX kỳ; đo TƯƠI `(Get-Item).Length` — 🔴 CẤM `Get-Content`-đếm, bẫy encoding E-010; baseline 17-07 kỳ `2026-07` ≈183KB/5 file [ví-dụ-lịch-sử — kỳ 2026-07 đã gist @S140→chưa-gist ~0]) → anh nhìn số rồi **tự ĐẶT ngưỡng byte** nếu muốn chuyển hẳn sang trigger-theo-byte; 🔴 **KHÔNG bịa số** (giữ INFORM 7-ngày — DP-5 quyền owner cục-bộ B1 §3.4).
- **🌙 Sleep-check — 🔄 ĐỔI TRIGGER @S144 (adap đợt-11, owner chốt O-6 + số):** chạy `powershell.exe -ExecutionPolicy Bypass -File scripts/distill-shard-probe.ps1` → in `SHARD-PROBE: pending=<n> | nguong=<m> => KEU|IM`. **KÊU → INFORM gợi-ý** chạy `/sleep-recovery-memory-l2 <agent|all>`. 🔴 **KHÔNG auto-run** — anh consent mới chạy.
- 🔴 **Trigger = ĐẾM VẬT THẬT** (số shard `archive/<period>.md` chưa có `.gist.md` cặp đôi), **KHÔNG còn ngày-lịch**. Ngưỡng đọc LIVE từ `memory-budget.json → distill_trigger.min_pending_shards` (**B1 — CẤM chép số vào đây**).
- 🔴 **SHARD loại trừ `_INDEX.md` + `*.gist.md`** — bộ đếm đầu tiên của lead ra 20, trong đó **5 là `_INDEX.md`** ⇒ 25% dương-giả; số thật 15. Fault-inject 6/6 2-chiều (0/6/7-biên/8 + 2 ca anti-dương-giả).
- 🧊 **Dòng cũ `today last_sleep_at ≥ 7 ngày` = GHI-CHÚ PHỤ, KHÔNG còn là trigger.** Đảo có chủ đích @S144 2026-07-22, chữ-ký = anh (owner), qua 2 cửa tường minh: O-6 chọn cơ-chế + trả lời sau chốt SỐ. Lý do: ngày-lịch = proxy-giả (`auto-toan-vong:21-27`), và trái chính mark Active-High `RC-pqhuy1987-20-06-2026-10-29-11` (age = false-proxy). `last_sleep_at` **giữ lại** làm dấu-thời-gian tham chiếu, không dùng để quyết. **+ Byte-display (Item 8/M-10 S135):** khi INFORM fire → in kèm **tổng byte `agent-memory/*/archive/<period>.md` CHƯA có `.gist.md`** (match PREFIX kỳ; đo TƯƠI `(Get-Item).Length` — 🔴 CẤM `Get-Content`-đếm, bẫy encoding E-010; baseline 17-07 kỳ `2026-07` ≈183KB/5 file [ví-dụ-lịch-sử — kỳ 2026-07 đã gist @S140→chưa-gist ~0]) → anh nhìn số rồi **tự ĐẶT ngưỡng byte** nếu muốn chuyển hẳn sang trigger-theo-byte; 🔴 **KHÔNG bịa số** (giữ INFORM 7-ngày — DP-5 quyền owner cục-bộ B1 §3.4).
- Đọc `.claude/agent-memory/memory-budget.json` → so kích-thước THẬT `_INDEX.md` mỗi sub vs cap. Nếu cắt-cho-vừa-ngân-sách đang rớt dấu-mốc quan trọng → **bump budget** (chốt-chặn chống "quên chỉnh ngân sách"). Đo lại bằng `scripts/measure-agent-memory.ps1` (seed-by-measure — KHÔNG đặt cap bằng số tưởng tượng).
- L1 over-cap → curate L1→L2 (byte-exact additive) + build/refresh `_INDEX.md` (con-trỏ **substring** sha-keyed, fallback Ctrl-F) + `<period>.gist.md` (nén 4-field, `distill-gen` counter, verbatim FROZEN). Rollout đầu: 4 over-cap sub (S70).
@ -210,7 +239,9 @@ ngược lại → counter += 1 ; last_ticked_session = S<nn> ; last_ticked_head
**(d) JUMP:** một class trong `lead_self_audit.flag_classes` lặp ** `jump_on_class_repeat`** lần **kéo audit tới sớm**, bất-kể counter.
**(e) BÁO dòng-nợ 4-vế (nâng dòng H24 Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` in **1 dòng** `NHIP-NO: kiem light a/e deep b/f <ok|OVERDUE:…> | tran-bo-nho x over-cap | run-chua-gom y` (vế-1 nhịp-kiểm = `counter/light/deep/OVERDUE` thay dòng H24 ). 🔴 **probe KHÔNG chặn**: lỗi in `probe-loi (khong chan)` đi tiếp. OVERDUE(light|deep) **INFORM anh** + đề-xuất spawn vai H24 tương-ứng. 🔴 **KHÔNG auto-run** anh consent mới chạy (giống sleep-check §2.1.2).
**(e) BÁO dòng-nợ 4-vế (nâng dòng H24 Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` in **1 dòng** `NHIP-NO: kiem light a/e deep b/f <ok|OVERDUE:…> | tran-bo-nho x over-cap | run-chua-gom y` (vế-1 nhịp-kiểm = `counter/light/deep/OVERDUE` thay dòng H24 ). 🔴 **probe KHÔNG chặn**: lỗi in `probe-loi (khong chan)` đi tiếp. OVERDUE(light|deep) 🔴 **SPAWN AUTO cặp H24 NGAY, KHÔNG consent (owner chốt @S146 "3 → auto"; THAY luật era-S122 "anh gật mới chạy")**. Luật sống canonical [`session-end`](session-end.md) §L.b(j)(ii) **B1, mục này chỉ ÁP, không chép phạm-vi**.
🔸 **Phạm-vi 1 dòng (chống đọc nới):** gỡ **cổng NGƯỜI**, **giữ cổng NHỊP** (`h24_cadence`) auto **khi tới nhịp**, KHÔNG phải mỗi phiên. Khác bookend-hub (hub bỏ counter) SE chưa theo nhánh đó.
**KHÁC sleep-check §2.1.2** (vẫn CONSENT) **KHÁC trio §2.1.9** (vẫn CONSENT) 3 cổng nay **không còn cùng khuôn**, đừng suy một ra ba.
🔴 **Số nhịp = quyền anh.** Bước này **ĐỌC** `h24_cadence`, **KHÔNG** ghi. **CẤM hardcode nhịp ở đây** copy số vào doc dẫn-xuất chính drift single-source sinh ra để chặn (detector `governance-detectors.ps1` H24-2 **fail-loud** nếu key thiếu, **không** giả-định default).
> 🟡 **Honest-caveat mang theo khi báo hub:** hub nói rõ *"số của các em = config của các em; ĐỪNG chép 3 số này"*. SE chọn **cùng 6/15/3** là **điểm khởi-đầu anh CỐ Ý chọn**, KHÔNG phải chép vô-thức. **Chỉnh lại sau chu-kỳ-2 CỦA SE** (deep-audit lần 2, xem .session-counter.json last_audit). Hub đã GỠ counter (bookend 07-15, sha 85bf89ca) → ví-dụ 6/15/3 "ở nguồn" = lịch-sử, KHÔNG còn mốc hub để so; delta hub hứa từ run-2 KHÔNG BAO GIỜ có (hub gỡ trước run-2) — **chưa ai được bán câu "đã chứng minh hiệu-quả"**. ✅ **Ratified 2026-07-17:** anh mark cổng reply `e50a4bd0` (2026-07-16-ai_infra-to-se-reply-adap); canonical = `memory-budget.json → h24_cadence._owner_ratified` (B1 — wording sống ở đó, đừng chép lại đây).
@ -219,7 +250,7 @@ ngược lại → counter += 1 ; last_ticked_session = S<nn> ; last_ticked_head
> Trục = **CHÍNH HỆ MEMORY** (độ-giữ · hành-động · đúng-spec) — **KHÁC** H1 tooling-freshness · H2 harvest-integrity · H24 soi-LEAD · reviewer chấm-diff. 3 vai read-only INFORM-only propose-only, chạy **TUẦN TỰ**: `harness-eval` (con ĐO) → `harness-refine` (con ĐỀ-XUẤT) → `harness-audit` (con KIỂM). Contract từng vai = canonical ở [`.claude/agents/harness-{eval,refine,audit}.md`](../agents/harness-eval.md) (B1 — **KHÔNG chép contract vai vào đây**).
- **(a) 🔴 CONSENT-GATED KHÔNG auto-run** (cùng khuôn sleep-check §2.1.2 + H24 §2.1.8(e)): em-main **IN đề-xuất 1 dòng** dạng `trio-memory: de-xuat chay eval->refine->audit @S<nn> (consent?)` **anh gật mới chạy**. Không gật KHÔNG chạy (KHÔNG hỏi vòng 2, KHÔNG "chạy thử cho nhanh").
- **(a) 🔴 CONSENT-GATED KHÔNG auto-run** (cùng khuôn **sleep-check §2.1.2** 🧊 **@S146 GỠ vế "+ H24 §2.1.8(e)"**: H24 nay **AUTO khi tới nhịp**, viện làm khuôn consent **SAI**): em-main **IN đề-xuất 1 dòng** dạng `trio-memory: de-xuat chay eval->refine->audit @S<nn> (consent?)` **anh gật mới chạy**. Không gật KHÔNG chạy (KHÔNG hỏi vòng 2, KHÔNG "chạy thử cho nhanh").
- **(b) 🔴 TUẦN TỰ, CẤM song song:** **3 spawn RIÊNG** đúng thứ-tự eval refine audit. **KHÔNG dùng `parallel()` của `hmw.js` cho bộ-ba** refine đọc output eval, audit chấm output của cả 2; chạy song song chấm **bản cũ** verdict vô-nghĩa.
- **(c) Lead scribe NGAY (single-writer):** return từng con lead ghi `.claude/workflows/runs/<run-id>/harness-{eval,refine,audit}-return.md` **ngay khi con đó trả**, **KHÔNG đợi đủ 3**. Lý-do: 3 vai **không có Write/Edit** (chặn-bằng-thiếu-tool) nên tự-ghi-đĩa bất-khả; phiên chết giữa chừng mất return (bài-học vòng-1 S141).
- **(d) PIN đích-danh (fail-closed):** `harness-refine` nhận **path** `…/harness-eval-return.md`; `harness-audit` nhận **path run-folder** đang chấm. 🔴 Pin **missing/rỗng ⇒ vai TỪ-CHỐI / TRƯỢT** **CẤM** để vai tự đi tìm "run mới nhất" (vớ bản **ĐẠT-ảo**).

View File

@ -49,7 +49,7 @@ Hiện-hành = `investigator-codebase · investigator-api · implementer-backend
| Đường | Cơ chế |
|---|---|
| **Tay** | Anh gõ `/sleep-recovery-memory-l2 <agent\|all>` bất kỳ lúc nào |
| **Auto-check (INFORM-only)** | `/session-start` + `/session-end` đọc `last_sleep_at` trong `.claude/agent-memory/memory-budget.json`nếu `today last_sleep_at ≥ 7` (ngày)**gợi-ý** chạy command (INFORM anh, **KHÔNG tự-chạy autonomous**). Anh consent → chạy. 🔸 **Kèm hiển-thị byte (M-10 / DP-5):** khi INFORM fire, 2 site runtime (`/session-start §2.1.2` + `/session-end §L.b(c)`) in kèm **tổng byte `archive/<period>.md` chưa có `.gist.md`** (match PREFIX kỳ; baseline 17-07: kỳ `2026-07` ≈ 183KB/5 file [ví-dụ-lịch-sử — đã gist @S140→~0]) để anh nhìn số **rồi tự đặt ngưỡng byte** nếu muốn chuyển hẳn (không bịa số) — **INFORM 7-ngày GIỮ** (quyền owner cục-bộ, B1 §3.4; cấm-là-cấm-hub-phát-chuẩn). ⚠️ Việc **WIRE** byte nằm ở 2 site đó (**LANE-A**), **KHÔNG** ở command này — dòng này chỉ là **MÔ-TẢ** (tránh ghost-wire "defined-but-unread", H18). |
| **Auto-check (INFORM-only)** | 🔄 **ĐỔI @S144** `/session-start §2.1.2` + `/session-end §L.b(c)` chạy `scripts/distill-shard-probe.ps1` → đếm **shard chưa-gist** (loại trừ `_INDEX.md` + `*.gist.md`), so ngưỡng đọc-live `memory-budget.json → distill_trigger.min_pending_shards`. KÊU**gợi-ý** chạy command (INFORM anh, **KHÔNG tự-chạy autonomous**). Anh consent → chạy. 🧊 **Dòng cũ `today last_sleep_at ≥ 7 (ngày)` nay là GHI-CHÚ PHỤ, KHÔNG còn quyết-định** — owner đảo có chủ đích @S144 2026-07-22 (O-6 cơ-chế + chốt số 7 shard); trước đó `:52` giữ 7-ngày là **quyền owner cục-bộ DP-5**, và chính owner gỡ, không phải AI. 🔸 **Kèm hiển-thị byte (M-10 / DP-5):** khi INFORM fire, 2 site runtime (`/session-start §2.1.2` + `/session-end §L.b(c)`) in kèm **tổng byte `archive/<period>.md` chưa có `.gist.md`** (match PREFIX kỳ; baseline 17-07: kỳ `2026-07` ≈ 183KB/5 file [ví-dụ-lịch-sử — đã gist @S140→~0]) để anh nhìn số **rồi tự đặt ngưỡng byte** nếu muốn chuyển hẳn (không bịa số) — **INFORM 7-ngày GIỮ** (quyền owner cục-bộ, B1 §3.4; cấm-là-cấm-hub-phát-chuẩn). ⚠️ Việc **WIRE** byte nằm ở 2 site đó (**LANE-A**), **KHÔNG** ở command này — dòng này chỉ là **MÔ-TẢ** (tránh ghost-wire "defined-but-unread", H18). |
> 🔴 **State-file `last_sleep_at` có 1 home DUY NHẤT:** `.claude/agent-memory/memory-budget.json` (root-key `last_sleep_at`, cạnh `tiers`/`measured`). KHÔNG ghi ở `_INDEX.md` / nơi khác. *(SE đặt budget-file trong `agent-memory/`, KHÁC AI_INFRA gốc đặt `.claude/memory-budget.json` — đây là tailor path SE.)* Field `last_sleep_at` **đã thêm** (null baseline, S72) vào budget-file SE — auto-check **đã wired** ở `/session-start §2.1.2` + `/session-end §L.b(c)` (đọc field → INFORM gợi-ý nếu null/≥7d). Lần sleep đầu lead set `= today` (Phase 4.4). Lead = single-writer field này (B3).
@ -103,6 +103,10 @@ Lead distill proposal thành gist theo 4 bước:
3. **G-009 post-scan (BẮT BUỘC sau ghi):** Grep mojibake (`§` · `â†` · `ðŸ` · `KHÃ` — seq cụ-thể, né bare-`Ã`) + dollar-expansion (`/usr/bin/bash`) trên file vừa ghi → **phải sạch**. Bẩn → de-corrupt qua Write tool.
4. Cập-nhật `.claude/agent-memory/memory-budget.json` field `last_sleep_at = <today>` (root-key; **thêm mới nếu chưa có**). B3 single-writer, Write/Edit. 🔴 KHÔNG hand-edit `measured_bytes` (chỉ script `scripts/measure-agent-memory.ps1` được sửa số đo) — chỉ chạm `last_sleep_at`.
## Phase 4.5 — 🔬 sleep-audit AUTO (KIỂM vòng nén-ngủ, C4/C4b vai #3/3, land S145)
Gist + Fidelity-gate xong (Phase 3+4) ⇒ spawn `sleep-audit` NGAY — **AUTO, KHÔNG consent** (owner S145). Đọc `.gist.md` mới + Fidelity verdict + claim giảm-byte → verdict per-claim + **tự đo lại byte** archive gốc vs gist (đối-chứng claim) + **thách-CLEAN** (Fidelity 5P/0F ⇒ mở 1 gist đối-chứng `<period>.md` gốc xem trung-thực, không mất 4-field load-bearing). 🔴 no-self-exempt độc-lập lượt nén (m-3). 🔴 Fail-safe: 0 `.gist.md` tươi phiên này ⇒ **NO-OP im-lặng**. Verdict gộp vào Phase 5 report. Propose-only → em main VERIFY→APPEND (git-diff backstop). Contract canonical `.claude/agents/sleep-audit.md` (B1).
## Phase 5 — REPORT + COMMIT
1. **Report:** mỗi agent xử-lý → `{verbatim-file · gist-file MỚI · #entry trước→sau · ratio (báo-cáo) · importance-drop thấp=N · coverage-diff PASS/FAIL · Fidelity PASS/self-gate}`.

View File

@ -18,13 +18,15 @@ Thực-hiện **tuần-tự**: §0 (sàn) → §1 → §2 → §3 → §4.
>
> **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ó **3 điểm mù**
### Vì sao WAL trống không đủ: hook có **4 đ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"** và **"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.
`.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**.
### 🔴 BẬC MẠNH — thấy **1 trong 4** ⇒ **HỎI LẠI ANH**, KHÔNG tự kết-luận sạch
> 🔴 **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 |
|---|---|---|---|
@ -32,6 +34,7 @@ Thực-hiện **tuần-tự**: §0 (sàn) → §1 → §2 → §3 → §4.
| **②** | `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)*
@ -72,10 +75,37 @@ done
> 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**.
### 🟡 BẬC TRUNG-BÌNHnhiều file bẩn **NGOÀI** 3 path hook persist
#### ⑤ ORPHAN-Lphiê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 (`resume-*` do /tiep ghi, hoặc closed.md do đóng-L).
for d in .claude/sessions/session-*/; do
[ -d "$d" ] || continue
p=$(ls "$d"pause-*.md 2>/dev/null | wc -l); [ "$p" -eq 0 ] && continue
r=$(ls "$d"resume-*.md 2>/dev/null | wc -l)
c=0; [ -f "$d/closed.md" ] && c=1
[ "$p" -gt $((r + c)) ] && echo "ORPHAN-L: $d (pause=$p resume=$r closed=$c)"
done
```
-**Đối-ứng `resume-*` 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.
-**`closed.md` ĐÃ WIRE @S146** (owner chốt *"giống hub"*`_end` chốt-kết của manifest `101e69d6`): nghi-thức ghi nằm ở [`session-end.md`](session-end.md) **§6.3-bis** (FROZEN · 4 trường · idempotent NO-OP · NO-OP im-lặng nếu 0 thư-mục). ⇒ **cân-sổ nay ĐỦ CẢ HAI vế**: `pause` đối-ứng bằng `resume-*` (`/tiep §2.6`) **hoặc** `closed.md` (đóng-L) ⇒ ca *"pause rồi đóng thẳng không qua `/tiep`"* **hết kêu oan**.
🧊 *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-view-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 `resume-*` ⇒ 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 3 path + không phải EOL-only ⇒ **NÊU**, hỏi lại nếu nhiều.
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)
@ -84,13 +114,14 @@ Tín-hiệu **YẾU NHẤT**, dùng cuối. 🔴 **`porcelain` rỗng KHÔNG ph
### 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ả 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**.
- **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 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).
- **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**.
---
@ -99,7 +130,7 @@ Tín-hiệu **YẾU NHẤT**, dùng cuối. 🔴 **`porcelain` rỗng KHÔNG ph
- Đọ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.
- **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
@ -110,6 +141,14 @@ Tín-hiệu **YẾU NHẤT**, dùng cuối. 🔴 **`porcelain` rỗng KHÔNG ph
## 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.6 Đọc context-map phiên-LOGIC + ghi biên-nhận `resume-*` (S146 — cặp với `/pause` bước 2.6)
- **Đọc:** nếu có `.claude/sessions/session-<N>/` → đọc **TẤT CẢ** `pause-*.md` theo thứ-tự thời-gian = **bối-cảnh cộng-dồn** của phiên-logic (quyết-định đã chốt · delta còn sống · con-trỏ run/commit). 🔴 **Đâ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 `.claude/sessions/session-<N>/resume-S<nn>-<yyyyMMddTHHmm>.md`**1 khối ngắn**: nối từ `pause-*` nào · lệch gì so `chain:` (nếu có) · `next:` đang thực-thi.
- 🔴 **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.