[CLAUDE] Infra: W3 file 1-3 - San-3 canonical @tiep §0 (TRI-ACCEPT) + session-start 0.6b/0.7 + session-end push-guard

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

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

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

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-15 14:48:54 +07:00
parent 47aa930e2d
commit dfa3daef05
3 changed files with 242 additions and 27 deletions

View File

@ -1,5 +1,5 @@
---
description: Đóng session SOLUTION_ERP — flush 12-agent memory + H2 harvest-gate (5-trục) + H1 tooling-chốt, sync MD/RAG, commit + push, eval. Run cuối mỗi session.
description: Đóng session SOLUTION_ERP — flush memory TOÀN roster + H2 harvest-gate (5-trục) + H1 tooling-chốt + H24 counter, sync MD/RAG, commit + push (squash→count→push 1 LƯỢT), eval. Run cuối mỗi session.
---
# /session-end — Session closeout (FLUSH + WRITE + VERIFY + REPORT + COMMIT + EVAL)
@ -13,8 +13,13 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
**Quy trình (KHÔNG wait confirm):**
1. Em echo full content command (raw markdown, KHÔNG tóm tắt, KHÔNG cắt)
2. Em proceed execute Phase 1 → 6 sequential ngay
3. Anh user điều chỉnh **cuối session** nếu cần thay đổi nội dung command (KHÔNG mid-flow interrupt)
2. 🔴 **Sàn-2 — ĐẶT SENTINEL NGAY (TRƯỚC mọi flush):** ghi `closing: S<nn> @<ts>` vào `.claude/WAL.md`.
3. Em proceed execute Phase 1 → 6 sequential ngay
4. Anh user điều chỉnh **cuối session** nếu cần thay đổi nội dung command (KHÔNG mid-flow interrupt)
> 🔴 **Sàn-2 sentinel (H22 — adopt S122).** ĐẶT ở **BƯỚC 0**, XOÁ ở **§6.4**. Ý-nghĩa: giữa 2 mốc đó = **đang đóng sổ dở**.
> **Vì sao ở BƯỚC 0, không muộn hơn:** phiên bị cắt **giữa lúc đóng** là ca nguy-hiểm nhất — WAL đã flush một phần, chưa push, trông như sạch. Đặt dấu TRƯỚC mọi flush ⇒ phiên kế **thấy `closing:` treo** và biết là bị cắt (Sàn-3 bậc-MẠNH ③, `tiep.md` §0.b).
> **Net-zero:** §6.4 vốn **LUÔN chạy** ⇒ thêm 1 dòng xoá = 0 chi-phí. Acceptance: chạy no-op trọn-vẹn ⇒ `grep -c '^closing:' .claude/WAL.md` = **0**; cắt giữa chừng ⇒ phiên kế **thấy** dấu.
## Phase 1 — FLUSH (sub-agent memory)
@ -29,7 +34,9 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
- 🟥 **reviewer** — anti-patterns observed + Smart Friend catches + claim verification
- 🟢 **cicd-monitor** — Run verdict + bundle hash rotate + Mig prod + corpus drift
- 🟫 **tooling-auditor** (monitor H1) — CHỐT tooling/docs-freshness 4-mặt + new-alloc audit (chạy ở §L.b(g))
-**harvest-curator** (monitor H2) — GATE harvest-integrity 5-trục + close-gate run-trace `runs/<id>/` (`*-synthesis.md` phẳng h10-refine; run cũ S71 `harvest/`) (chạy ở §L.b(d)(f))
-**harvest-curator** (monitor H2) — GATE harvest-integrity 5-trục + close-gate run-trace `runs/<id>/` (**TRI-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)
2. Synthesize cross-agent learnings → integrate vào:
- User auto-memory `MEMORY.md` (index — append entry mới, KHÔNG rewrite)
@ -42,13 +49,29 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
**§L.a — Deterministic detect (scan action-signature, KHÔNG để AI tự-phán):** quét session theo bảng **AS-1..AS-9** trong error-ledger. Mỗi hit → 1 RCA entry blameless (5-why + fix + guard). **Bug-production = lỗi KÉP → 2 fix** (vá code **VÀ** vá guard/eval-case). List AS mở — gặp class mới thì thêm.
**§L.b — 8-step auto-maintain (đủ 8, KHÔNG skip — thiếu = ledger thối). (d)(f) = H2 harvest-curator · (g) = H1 tooling-auditor (2026-06-07 Harness 1) · (h) = User-Mark H-12/13 (S79):**
**§L.b — auto-maintain **(a)→(j)** (đủ HẾT, KHÔNG skip — thiếu = ledger thối). (d)(f) = H2 harvest-curator · (g) = H1 tooling-auditor (2026-06-07 Harness 1) · (h) = User-Mark H-12/13 (S79) · (i) = H18-D(a) (S100) · (j) = H24 lead-self-audit (S122):**
> 🔸 *Nhãn cũ ghi "8-step" trong khi thân đã có (a)→(i) = 9 — `view-stale-count` điển-hình, vá @S122 khi thêm (j). Từ nay **KHÔNG chép số** vào nhãn: đếm từ thân (B1).*
- **(a) summary-index** += 1 dòng/session vào `STATUS.md` Recently Done (pointer, KHÔNG full-log).
- **(b) Active-Guards** (error-ledger): promote guard **2-strike** (episodic→procedural) · mark `verified` nếu held qua session · retire theo **net-effect** (hại>lợi → gỡ).
- **(c) chore-flag:** agent L1 >~30KB → archive L2 · error-ledger open-entry quá ngưỡng · **0-byte memory check (AS-8)** · **🌙 sleep-check (Harness-10b, S72):** `last_sleep_at` null hoặc ≥7d (`memory-budget.json`) → INFORM gợi-ý `/sleep-recovery-memory-l2` (KHÔNG auto-run) · **🗜️ Harness-11 A/D2 (S75):** chạy `powershell.exe -ExecutionPolicy Bypass -File scripts/memory-archive-gate.ps1` (DRY-RUN) → đề-xuất dồn-archive sub over-cap (A4 hysteresis 0.85 + A5 keep-floor 5 + A6 2-strike) + A7 NO-API L1-eval (pointer-resolve + byte-0-loss). Engine → [`docs/governance/harness-11-engine.md`](../../docs/governance/harness-11-engine.md). DRY-RUN báo kế-hoạch; MOVE thật do em-main (D5 AUTO semantic-null sau khi xem). · **📊 Hot-feed %-print CUỐI phiên (Harness-15-v2 §G.4, S82):** in composition Tầng-1 theo **%/4-bucket** SAU khi đã nạp/tăng trong phiên + **Headroom còn-trống** so cap role (`token_governor.tier1_hotfeed_tokens`). Đối-xứng `session-start §2.1.6` (đầu phiên). Mục-đích: anh thấy Tầng-1 phình/teo ra sao + còn trống bao nhiêu → quyết chỉnh cap. 🔴 con-số = quyền anh (chủ-dự-án); em-main chỉ báo-%, KHÔNG tự-chỉnh. · **📊 Bảng-số ngân-sách + run-loop 2-tầng (M.B/M.C — Harness-20 adap S103, [`engine §M`](../../docs/governance/harness-11-engine.md)):** chạy `powershell.exe -ExecutionPolicy Bypass -File scripts/crystallized-backfill.ps1` → in BẢNG số THẬT (cap/hotload-bytes/tok-RANGE/headroom/target/backfill, live 0-hardcode) cạnh %-print. **Tầng-1 ĐO** (deterministic scripts) mỗi end = khối-số tươi (chống "khai-chạy-mà-không-chạy"); **Tầng-2 TINH-CHỈNH on-signal** (gap-mới/drift-vs-last/orphan-TĂNG/coverage-tụt → **cảnh-báo ĐỎ** + refine-in-session HOẶC carry-hi-prio nếu đứt-phiên) — KHÔNG nuốt tín-hiệu; weekly full-refine backstop. backfill default 0=OFF (owner). 🟡 M.C largely-already-met (H17-loop + %-print đã có ở dưới), khối-số = formalize. · **🧪 MFE retention opt-in (Harness-16 §H):** lệnh kèm `eval` → chạy `scripts/mfe-eval.ps1` cuối-phiên (retention; chênh vs baseline §2.1.6 = rot trong-phiên) → quyết-định 2-ca: **thiếu-chỗ→TĂNG budget** (anh quyết) / **rot→SẮP-XẾP-LẠI** (ưu-tiên-giá-trị). READS budget, KHÔNG ghi/auto-tune. · **🔁 H17 loop-REFINE (§I, S95 — [`harness-11-engine.md §I`](../../docs/governance/harness-11-engine.md)):** lệnh kèm `eval` → chạy thêm `scripts/memory-selfimprove-audit.ps1` (spec-audit CRITERIA+GAP) → áp bảng B1 **tín-hiệu→hành-động**: floor-rot→**reinject-verbatim** (ghi [`reinject-ledger.md`](../governance/reinject-ledger.md) CG-1 ≤1/N=3; đo-lại vẫn thiếu→**escalate anh** KHÔNG tự-reinject-lần-2) · repeat≥2→promote · old+valueless→archive-gate · raw→distill (`/sleep-recovery-memory-l2`). Phân-loại B3 (build-gap vs floor-rot) TRƯỚC reinject. em-main single-writer D9; loop CHỈ đề-xuất (D6). Light→skip.
- **(d) flush agent-memory** mỗi sub đã spawn session này — **spawn-record 4-field** `{agent · task · nấc(agreed/executed/verified) · evidence}`. (0 sub spawn → "n-a".) → **⬜ harvest-curator (H2) HỖ TRỢ:** spawn → propose spawn-record cho mọi sub đã chạy → em main single-writer VERIFY → APPEND (B3 no-overwrite-unverified).
- **(e) pending-request audit:** request anh CHƯA-thực-thi đã log SPECIFICS chưa (KHÔNG placeholder).
- **(f) 🌾 harvest-integrity GATE (⬜ harvest-curator H2 — 5-trục, Harness 1+2):** verify spawn-record (d) đủ+đúng mọi sub TRƯỚC khi đóng — **Coverage** (0 silent-miss) · **Completeness** (đủ 4-field) · **Placement** (delta đúng `agent-memory/X`) · **Corruption** (moved-not-cut, no-mojibake/shell-baked) · **Fidelity-FLAG** (nghi bịa/on-behalf → escalate 🟥 reviewer, KHÔNG tự phán). + **🌊 close-gate C5 Layer3 (Harness-10, thay B5 wave-gom):** với MỌI `runs/<run-id>/` của session → **VERIFY per-turn harvest đã xong** (em-main đã viết `runs/<run-id>/<stage>-synthesis.md` phẳng h10-refine — run cũ S71: `harvest/*.md` — NGAY sau mỗi fan-out turn = C4 Layer1) + mọi `runs/<run-id>/` của session có `*-synthesis.md` present (folder-scan — 🧊 tiêu-chí ledger CLOSE-beat retired H18-B S100). 🔴 **IDEMPOTENT — close-gate chỉ VERIFY, KHÔNG re-APPEND** (per-turn đã APPEND rồi → re-APPEND = DUPLICATE-HARVEST). 5-trục GATE giữ làm **backstop**. GATE = run còn `*-synthesis.md` vắng (run cũ S71: `harvest/` rỗng — C8 dual-accept) HOẶC chưa đủ 5-trục thì CHƯA đóng.
- **(f) 🌾 harvest-integrity GATE (⬜ harvest-curator H2 — 5-trục, Harness 1+2):** verify spawn-record (d) đủ+đúng mọi sub TRƯỚC khi đóng — **Coverage** (0 silent-miss) · **Completeness** (đủ 4-field) · **Placement** (delta đúng `agent-memory/X`) · **Corruption** (moved-not-cut, no-mojibake/shell-baked) · **Fidelity-FLAG** (nghi bịa/on-behalf → escalate 🟥 reviewer, KHÔNG tự phán). + **🌊 close-gate C5 Layer3 (Harness-10, thay B5 wave-gom):** với MỌI `runs/<run-id>/` của session → **VERIFY per-turn harvest đã xong** (em-main đã viết `runs/<run-id>/<stage>-synthesis.md` phẳng h10-refine — run cũ S71: `harvest/*.md` — NGAY sau mỗi fan-out turn = C4 Layer1) + mọi `runs/<run-id>/` của session có `*-synthesis.md` present (folder-scan — 🧊 tiêu-chí ledger CLOSE-beat retired H18-B S100). 🔴 **IDEMPOTENT — close-gate chỉ VERIFY, KHÔNG re-APPEND** (per-turn đã APPEND rồi → re-APPEND = DUPLICATE-HARVEST). 5-trục GATE giữ làm **backstop**. GATE = run còn **thiếu bản-ghi-kết-quả** (theo **TRI-ACCEPT**, xem dưới) HOẶC chưa đủ 5-trục thì CHƯA đóng.
- 🔴 **TRI-ACCEPT (S122) — định-nghĩa CANONICAL ở [`tiep.md`](tiep.md) §0, bước này CHỈ TRỎ (B1):** ĐÓNG = **dạng-1** `<stage>-synthesis.md` phẳng · **dạng-2** `harvest/<stage>-synthesis.md` (C8 legacy S71) · **dạng-3** heading `## synthesis` trong THÂN `run.md`. ⚠️ **Bản trước S122 chỉ nhận dạng-1** ⇒ đo thật: **8 dương-giả / 25 run = 32%**, trong đó folder **ghi chép đầy-đủ nhất** (có cả cicd PASS + bundle-hash + smoke) **vẫn** bị xếp orphan. Gốc: gate hỏi *"đã harvest chưa"* (câu hỏi về **NỘI DUNG**) nhưng đo **TÊN FILE** ⇒ đo cái **dễ đo**, không phải cái **cần đo**.
- 🔴 **Nhận ≠ cho phép:** TRI-ACCEPT = **lưới PHÁT-HIỆN cho bản CŨ** (đúng khuôn C8: *tha di-sản, cấm viết mới kiểu cũ*). **Run MỚI BẮT BUỘC ghi dạng-1**`workflows/README.md:17` thiết-kế **tên file mang nghĩa** (RAW `sub-` ⟂ VERIFIED `-synthesis.md`). Thấy run MỚI ghi dạng-3 ⇒ **NÊU** (drift), đừng im.
- 🔸 **Kẽ khai thật:** **dạng-4** (kết-quả rải dưới heading tuỳ-ý, vd `## Stages` + `## wf run-id`) **KHÔNG máy nào bắt được** — nhận nó = 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. ⇒ **để người phán**. Đây là **kẽ CÒN LẠI**, KHÔNG phải chuyện đã xử.
- **🚩 Sàn-5 — hậu-kiểm CỜ vs NỘI-DUNG (H22, adopt S122; informational, KHÔNG chặn):** mọi `runs/<id>/` **sinh trong phiên này** có dòng `wf: … run=<id>` tương-ứng trong WAL / session-log không? Lệch ⇒ **NÊU** + in danh-sách. Bắt ca *"run dựng xong nhưng marker không ai đăng-ký"* = **vi-phạm Sàn-1 lộ ra SAU** (`hmw.js` chỉ gate được đường của nó; raw Workflow/Agent đi thẳng — kẽ F2).
🔴 **Scope theo `git log -1 --format=%cI -- <folder>`, KHÔNG theo `mtime`** — mtime **không bền** (Dropbox resync ghi đè; R3-m5 chứng, FIX#4 đã bỏ mtime khỏi W0.5 vì đúng lý-do này). *(v1:120 nguyên-bản ghi "mtime-trong-phiên" — đó là bản TRƯỚC khi mtime bị bác; đừng bê nguyên.)*
**Acceptance:** chênh-lệch **0**, HOẶC in được danh-sách lệch.
- **(j) 🔷🔶 H24 lead-self-audit — counter + spawn theo NHỊP (adopt S122; đối-xứng `session-start §2.1.8`):**
- **(i) Đọc** `.claude/governance/.session-counter.json` + `h24_cadence` (`memory-budget.json`) → in **1 dòng**: `counter=<n> · light <a>/<light_every> · deep <b>/<deep_every> · OVERDUE: <none|light|deep>`. 🔴 **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.**
- **(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 đó****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.
- **(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").
- **(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.)
@ -80,7 +103,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 (12-agent — 10 product/quality + 2 monitor INFORM-only)
- Kiểm tra trạng thái spawn sub-agent (**10 product/quality + 4 monitor INFORM-only**; 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
@ -108,8 +131,25 @@ Plan cha: [tên]
## Phase 5 — COMMIT (release)
### 5.0 Squash wal:-trailing chưa-push (H22 — TRƯỚC commit-chốt)
- Chạy `git log --format=%s origin/main..HEAD` → đếm **K** = số subject **LIÊN-TỤC** bắt đầu `wal:` tính từ HEAD xuống (DỪNG ngay khi gặp subject KHÁC). **K=0 → skip**; **K>0 → `git reset --soft HEAD~K`** gộp các wal-commit staged vào commit-chốt §5.1 (nội-dung đã ở index, chỉ gom lịch-sử — file không đổi).
### 5.0 Squash wal:-trailing chưa-push (H22 — TRƯỚC commit-chốt) — **PRE-PASS**
> 🔴 **§5.0 = PRE-PASS, KHÔNG phải cổng.** Cổng thật nằm ở **§5.2** (chained với push). Lý-do: hook fire ở **turn-boundary NẰM SAU** §5.0/§5.1 ⇒ đặt phép đếm ở đây là **KHÔNG ĐỦ** — đóng-sổ chắc-chắn còn làm bẩn path hook (§L.b ghi `closing:`, spawn sub → `agent-memory/`, ghi `runs/`) ⇒ mỗi turn-boundary +1 `wal:`.
```bash
# K = số subject LIÊN-TỤC '^wal:' tính TỪ HEAD XUỐNG, DỪNG ngay khi gặp subject KHÁC.
# 🔴 KHÔNG phải `grep -c '^wal:'` trên cả range — đó là phép đếm KHÁC (xem ghi-chú (b)).
K=0; while read -r s; do case "$s" in wal:*) K=$((K+1));; *) break;; esac
done < <(git log --format=%s origin/main..HEAD)
[ "$K" -eq 0 ] && echo "K=0 → skip" || {
# assert an-toàn: reset KHÔNG được tụt xuống DƯỚI remote
[ "$(git rev-parse "HEAD~$K")" = "$(git rev-parse origin/main)" ] || \
git merge-base --is-ancestor origin/main "HEAD~$K" || { echo "ABORT: HEAD~K tụt dưới origin/main"; exit 1; }
git reset --soft "HEAD~$K" # gộp wal-commit staged vào commit-chốt §5.1 (nội-dung đã ở index — file KHÔNG đổi)
}
```
> **(a) 🔴 CẤM dùng exit-code của `grep -c` làm điều-kiện** — `grep -c` trả **exit 1 khi đếm ra 0** ⇒ ca **SẠCH** bị hiểu thành lỗi. Luôn **so-sánh SỐ**: `n=$(…); [ "$n" -eq 0 ]`.
> **(b) 🔴 CẤM đếm TOÀN lịch-sử** (`git log --format='%s' HEAD | grep -c '^wal:'`) — đó là **MÌN NGỦ**: đếm ra hàng chục (đo S119: **57**) ⇒ `-eq 0` không bao giờ đúng ⇒ **chặn push VĨNH VIỄN** ⇒ người sẽ bypass ⇒ **cổng tự xoá chính nó**. Phạm-vi đếm **LUÔN** = `origin/main..HEAD`.
> **(c) 4 ca của FIX#3-bis KHÔNG cần ở đây.** Chúng thuộc **W0.3** (ca mổ một-lần, đã land `92de58f`) nơi phải chọn *rebase vs reset*. §5.0 **không bao giờ rebase** ⇒ không có nhánh để chọn. Và trailing-K **tự đúng cả 4 ca**: đáy toàn `wal:` ⇒ `HEAD~K` **chính là** `origin/main` (≡ `reset --soft origin/main` của FIX#3(c)); đáy = commit-thường ⇒ chỉ gộp phần `wal:` phía trên, **đáy không bị chạm**; `K=0` ⇒ skip.
- 🔒 **Phạm-vi = CHỈ commit CHƯA-push** (khoảng ahead-of-remote) → **KHÔNG BAO GIỜ rewrite commit đã-push**. wal: kẹp sâu hơn (sandwiched DƯỚI commit thường chưa-push) → **GIỮ NGUYÊN**, chấp-nhận noise (hard-safety đổi lấy không-rewrite-lịch-sử-đã-đẩy).
- **Biên push-chết-giữa-phiên-trước:** HEAD = commit-chốt cũ chưa-push → đếm DỪNG tại đó = chốt cũ KHÔNG bị fold, được push lần này (an-toàn, không mất commit).
- Squash xong = **điểm review-diff wal-paths** (AS-10 backstop dời về đây — hook đã commit local các residual-write nếu có; review diff các path WAL/agent-memory/runs TẠI ĐÂY trước khi chốt §5.1; push vẫn gated em-main).
@ -119,8 +159,44 @@ Plan cha: [tên]
- 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`
### 5.2 Push remote
- `git push origin main``git.baocaogiaoduc.vn/vietreport-admin/solution-erp`
### 5.2 Push remote — 🔴 **squash → count → push CHAINED TRONG 1 LƯỢT**
> 🔴 **SÀN push-guard (H22 · R3-C3 · adopt S122). BẮT BUỘC: KHÔNG được có turn-boundary giữa lần squash cuối và `git push`.** Mỗi turn-boundary = hook fire = +1 `wal:` ⇒ tách ra là **tự sinh lại đúng thứ mình vừa dọn**.
> ⚠️ §5.0 chỉ là **pre-pass** — §5.2 **RE-EXECUTE** phép tính, vì §L.b/§5.1 đã làm bẩn path hook sau đó.
```bash
# ── CHẠY TRỌN KHỐI NÀY TRONG MỘT LƯỢT. KHÔNG tách turn. ──
recount() { local n=0 s; while read -r s; do case "$s" in wal:*) n=$((n+1));; *) break;; esac
done < <(git log --format=%s origin/main..HEAD); echo "$n"; }
n=$(recount)
if [ "$n" -gt 0 ]; then # re-squash ĐÚNG 1 LẦN
[ "$(git rev-parse "HEAD~$n")" = "$(git rev-parse origin/main)" ] || \
git merge-base --is-ancestor origin/main "HEAD~$n" || { echo "ABORT: tụt dưới origin/main"; exit 1; }
git reset --soft "HEAD~$n" && git commit -q --no-edit -C ORIG_HEAD 2>/dev/null || git commit -q -F .git/COMMIT_EDITMSG
n=$(recount)
fi
[ "$n" -eq 0 ] || { echo "STOP: còn $n wal: trailing sau re-squash → BÁO ANH, KHÔNG bypass"; exit 1; }
# ④b EOL-check SCOPED (cạnh push — fix #9(i)). 🔴 INFORM, KHÔNG chặn (xem nấc dưới).
powershell.exe -ExecutionPolicy Bypass -File scripts/agent-frontmatter-eol-check.ps1 # exit 0 ALWAYS
git push origin main # → git.baocaogiaoduc.vn/vietreport-admin/solution-erp
```
> 🔴 **④b — nấc ĐÚNG của EOL-check (đừng nâng cấp nhầm):** script **`exit 0` LUÔN LUÔN**, cố-ý. Nó **KHÔNG được phép chặn push**.
> **Vì sao:** W0.6 spawn-probe @S121 **BÁC BỎ** giả-thuyết CRLF-fatal — một agent **CRLF hoàn-toàn** vẫn spawn qua **cả 4 tầng** (discovery→parse→spawn→exec). ⇒ check này chỉ enforce chính-sách `.gitattributes eol=lf`, **KHÔNG mạnh hơn**. Biến nó thành cổng chặn = **overclaim đúng cái vừa bị bác**, và là công-thức quen thuộc: **báo-động-giả ⇒ người bypass ⇒ cổng tự xoá chính nó**.
> **Đừng tự viết lại bằng tay:** script đếm scoped-set **bằng glob** (đo S122: **39 file** = `agents/` + `commands/` + `skills/`), có **synthetic control** để chứng bản-thân reader còn chạy, và **tự khai "GREEN-BUT-VACUOUS"** khi 0 CR — tức nó **tự từ-chối** được ghi công cho một lần xanh rỗng. Một check `grep CRLF` chép tay mất sạch cả 3 tính-chất đó.
> **Giá-trị thật = bắt REGRESSION về sau**, không phải lần chạy xanh hôm nay.
> **Luật đọc kết-quả:** `n>0` sau **1 lần** re-squash ⇒ **STOP + BÁO ANH**. 🔴 **CẤM lặp re-squash** — lặp cùng logic ra cùng kết-quả = **vòng chết**; `n` không về 0 nghĩa là có thứ **§5.0 cố-ý không đụng** (vd `wal:` kẹp dưới commit thường, §5.0 mục 🔒) ⇒ đó là **tin cần người xem**, không phải thứ để máy cố thêm lần nữa.
> 🔴 **CẤM else-branch precheck ref** đếm toàn lịch-sử (mìn ngủ 57 — §5.0 ghi-chú (b)). `origin/main` **EXISTS, đã verify** ⇒ không cần precheck; nếu ref thật sự biến mất thì **fail-loud báo anh**, đừng đếm bù.
> **Acceptance:** (i) phiên có ≥2 commit thường xen `wal:` ⇒ `n=0`; (ii) phép đếm cuối và `git push` nằm **CÙNG một transcript-turn**; (iii) sau push, `wal:` trong 20 commit gần nhất **không tăng** so baseline.
>
> 🧪 **ĐÃ fault-inject trên CÂY GIT THẬT (S122) — 10/10 PASS**, không phải suy từ đọc spec:
> - **ca(2) `base + wal + [CLAUDE]` ⇒ K=0 ⇒ PUSH ĐƯỢC** — 🔴 đây **chính là shape FIX#3-bis dự-báo DEADLOCK**; trailing-K **KHÔNG** deadlock (vì `wal:` kẹp dưới không nằm trong dải trailing ⇒ không bị đếm ⇒ không có gì để kẹt).
> - **ca(1) `HEAD~K == origin/main`** — chứng trailing-K **tự trùng** `reset --soft origin/main` của FIX#3(c) khi đáy toàn `wal:` ⇒ nhánh riêng là **thừa**.
> - **ca(3)** sau `reset --soft`: đáy `[CLAUDE]` **không bị chạm** + nội-dung `wal:` **vẫn ở INDEX** ⇒ **0 mất việc**.
> - **Bẫy (a) tái-hiện được:** `grep -c` đếm 0 → **exit 1**. **Bẫy (b) tái-hiện được:** đếm-toàn-lịch-sử=1 vs trailing=0 ⇒ đếm tổng **chặn push vĩnh-viễn**. Cả hai là **sự-thật đo được**, không phải cảnh-báo lý-thuyết.
- Docs-only commit → CI skip per gotcha #41 (paths-ignore `docs/**` + `**/*.md` + `.claude/skills/**`). Code commit → spawn 🟩 cicd-monitor verify deploy.
## Phase 6 — EVAL (chunk + RAG)
@ -140,8 +216,10 @@ Plan cha: [tên]
- Surface report cho anh main relay AI_INFRA (1 lần báo = ACK+executed+evidence). Em main `/session-start` kế watch + double-check → cơ chế 2 chiều tự duy trì.
- Session KHÔNG adopt infra gì → ghi "N/A (no infra adoption this session)".
### 6.4 Reset WAL (H22 — bước CUỐI)
### 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)`.
- **Acceptance Sàn-2:** phiên chạy trọn-vẹn ⇒ `grep -c '^closing:' .claude/WAL.md` = **0**. Phiên bị cắt giữa chừng ⇒ phiên kế **THẤY** `closing:` treo (Sàn-3 bậc-MẠNH ③ ở [`tiep.md`](tiep.md) §0.b) ⇒ tự-chữa nếu 3 tín-hiệu kia im, HỎI LẠI nếu không.
- 📝 Note: Stop-hook sẽ commit lần reset này thành **wal-commit trailing** sau turn cuối — **vô-hại**; phiên sau squash nó ở **§5.0**. (Đây là bước CUỐI, sau khi §5 đã commit/push xong — để WAL sạch cho `/session-start §0.7` phiên kế đọc.)
---

View File

@ -1,5 +1,5 @@
---
description: Bootstrap session SOLUTION_ERP — load context, audit state (12-agent + RAG + tests + monitor RE-REPORT), report plan. Run đầu mỗi session.
description: Bootstrap session SOLUTION_ERP — load context, audit state (roster ĐẦY-ĐỦ + RAG + tests + monitor RE-REPORT), report plan. Run đầu mỗi session.
---
# /session-start — Session bootstrap (READ + AUDIT + REPORT)
@ -29,10 +29,12 @@ Em main đọc `.claude/hmw-mode.on` → **BÁO ngay đầu response** (anh kh
**KHÔNG còn mode/marker để đọc**`.claude/fable-real-mode.on` **retired S110** (H19 marker-toggle nghỉ). Engine-đắt (nâng 1 vai lên hạng-nhất) **CHỈ chạy trong lượt anh gõ lệnh**, KHÔNG persist qua session/compact:
- **`/fable-real <vai> <đề-bài>`** → lệnh-A: vai anh gán chạy **SINGLE top-model THẬT** deep-pass, 1 lượt.
- **`/fable-clone <vai> <đề-bài>`** → lệnh-B: vai anh gán chạy **ENSEMBLE tier-2** (N lane CÙNG vai + em-main synthesize), 1 lượt.
- **Vai anh gán đích-danh ∈ roster 12**; **thiếu/sai vai → em main hỏi anh, KHÔNG tự chọn**.
- **Vai anh gán đích-danh ∈ roster** (số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents — B1, KHÔNG chép số ở đây); **thiếu/sai vai → em main hỏi anh, KHÔNG tự chọn**.
- **Mỗi run sinh spec-file 3-mục** (engine propose → **lead verify + ghi** `.claude/workflows/runs/<run-id>/spec-<tên>-<dd-mm-yyyy>.md` → worker thực-thi THEO spec bơm qua args). ⚠️ **Lead KHÔNG tự ý gọi** engine-đắt (kể cả HMW-mode ON).
> 🧊 **Lịch-sử:** H19 marker-toggle + 2-vai-cố-định (reviewer + investigator-codebase), S101→S110 → **retired H21**; 2 lệnh chuyển **per-invocation** (vai anh gán bất-kỳ ∈ roster 12). Chi-tiết → [`harness-11-engine.md`](../../docs/governance/harness-11-engine.md) §K + [`fable-real-runbook.md`](../../docs/governance/fable-real-runbook.md).
> 🧊 **Lịch-sử:** H19 marker-toggle + 2-vai-cố-định (reviewer + investigator-codebase), S101→S110 → **retired H21**; 2 lệnh chuyển **per-invocation** (vai anh gán **bất-kỳ ∈ roster**). Chi-tiết → [`harness-11-engine.md`](../../docs/governance/harness-11-engine.md) §K + [`fable-real-runbook.md`](../../docs/governance/fable-real-runbook.md).
>
> 📌 **Mark `RC-pqhuy1987-11-07-2026-20-42-01` (Active-High)** neo con-số roster của **thời-điểm ký (2026-07-11)** — đó là **ảnh chụp, KHÔNG phải giới-hạn**. Anh chốt @S122: **ý-định điều-khoản = "∈ roster"** (bất-kỳ vai nào trong roster **hiện-hành**) ⇒ 2 lệnh engine-đắt **hợp-lệ với TOÀN roster**. Bản ký **giữ nguyên** (P4/P8) + chú-thích tại [`ACTIVE-MARKS.md`](../governance/ACTIVE-MARKS.md).
## 📋 BƯỚC 0.6 — Model-availability check (H5 — adopt S63 · MTv3 reword S110)
@ -44,14 +46,37 @@ Em main xác nhận **lead model resolve được** đầu session. **Lead = fro
**Lịch-sử flip-chain đầy-đủ (S98→nay) = canonical [`docs/STATUS.md` §Sub-agents]** (🔴 S106 gộp 1-chain per anh-confirm — reader này KHÔNG enumerate/cập-nhật mỗi flip; chống churn 4-file/flip). **BƯỚC 0.6 probe MỖI phiên** xác-định runtime SỐNG (per-session — KHÔNG tin note phiên trước, KHÔNG steady-state).
## 📋 BƯỚC 0.7 — WAL-check mạch-việc-dở (H22 — adopt S111)
> 🔴 **H23 note — LỖ CHƯA-TEST (khai bắt-buộc theo H23 §2(2), adopt S122).** Nguyên-văn broadcast đòi khai: *"thứ-tự ưu-tiên giữa **'tham-số tại spawn'** và **'pin ở tệp định-nghĩa'** khi **CẢ HAI cùng hiện-diện** — rất có thể **chưa từng được test**"*.
> **Ở SE, cả hai ĐANG cùng hiện-diện:** `hmw.js` trả alias → `agent(…, {model:…})` **trong khi** frontmatter toàn roster = `inherit` (H8 all-inherit). 🔴 **Chưa ai test bên nào THẮNG.**
> **Vì sao nghiêm-trọng:** nếu **frontmatter thắng** ⇒ mọi `tier:'opus'` per-task **= NO-OP** ⇒ floor-2 vẫn thủng khi Fable UP — đúng lỗi reviewer đã bắt @S108.
> **Phép thử ĐÚNG (H23 §6 phép-thử-phá #3):** chạy 1 lane `tier:'opus'` **KHI lead=Fable** → đọc **model THỰC-TẾ resolve** → lệch ⇒ báo anh. ⚠️ **Lead=Opus thì KHÔNG phân-biệt được** (cả hai đường đều ra Opus) ⇒ **DEFER tới phiên lead=Fable**. 🔴 Khai thẳng: **CHƯA test**, KHÔNG giả-vờ đã test.
> **Đang có (PA-2, anh chốt O1) = 2 lớp GIÁN-TIẾP, KHÔNG phải phép thử trên:** PA-2a hằng-số `TIER2_EXPECTED_FULL_ID` trong `hmw.js` + PA-2b `scripts/spawn-model-audit.ps1` so resolved-vs-expected. 🔸 Neo-tại-spawn = **bất-khả-thi** (param chỉ nhận enum alias `sonnet|opus|haiku|fable`) — và **chính mệnh-đề "chỉ nhận alias" đó cũng CHƯA thử truyền full-id để xem có bị từ-chối không** (fix #8a, anh đã ack hình-thức PA-2a+PA-2b).
Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40 dòng, tầng persist = Stop-hook) → 2 nhánh:
## 📋 BƯỚC 0.6b — Registry-probe: RESTART rồi **VERIFY danh-sách agent** (broadcast ③(d) — adopt S122)
- **(a) File KHÔNG tồn-tại HOẶC chain rỗng / toàn `[x]`** → báo **1 dòng** "WAL sạch — không có mạch dở" rồi tiếp **Phase 1 bình-thường** (no-wait).
- **(b) Chain CÓ `[!]` hoặc `[ ]`** → BÁO **goal** + **mục `[!]` đầu-tiên** + câu "có mạch dở — gõ `/tiep` để nối, hoặc bảo em bootstrap tiếp bỏ mạch" rồi **CHỜ anh chọn**. 🔴 Đây là **NGOẠI-LỆ CHỜ DUY-NHẤT** của quy-trình no-wait (BƯỚC 0 GIỮ no-wait — echo body rồi chạy thẳng).
🔴 **0.6 ở trên là MODEL-probe, KHÔNG phải REGISTRY-probe.** Hai thứ khác nhau — trước S122 chỉ có cái đầu, nên "restart xong" không ai kiểm vai có sống thật không.
> 🧭 Bước này **CHỈ LÀ CON-TRỎ** — toàn-bộ quy-trình recovery (verify-trước-next · ground-truth-thắng · relaunch-cắt-gọt cho `wf:`) viết Ở MỘT CHỖ = [`.claude/commands/tiep.md`](tiep.md) (KHÔNG copy logic vào đây — B1 con-trỏ-canonical). Chặn **TRƯỚC Phase 1 READ** = tiết-kiệm read-set ~368K khi anh chọn `/tiep` (khi nạp full context rồi mới nối).
Registry sub-agent = **ảnh-chụp lúc khởi phiên** (đo 2 lần S120 + S121: file agent **MỚI** không hot-reload). Sau khi roster đổi:
- **Vai có trên đĩa + có tên trong `VALID_ROLES` = 2 điều-kiện CẦN, KHÔNG ĐỦ.** File `.md` đúng chuẩn vẫn có thể **liệt-kê được tên mà chết lúc instantiate** (vd frontmatter block-scalar parse ra rỗng).
- 🔴 **Bằng-chứng falsifiable DUY-NHẤT = spawn-probe THẬT** → spawn vai đó, nhận return. Static-check (`ls` + grep `VALID_ROLES`) **KHÔNG đủ** — đúng nguyên-văn broadcast ③(d): *"RESTART rồi VERIFY danh-sách agent"*.
**Khi nào chạy:** phiên **ĐẦU TIÊN sau khi roster đổi** (thêm/xoá/sửa vai), hoặc khi nghi registry lệch đĩa. Roster ổn-định → **skip** (không cần mỗi phiên).
**Cách:** spawn từng vai với task PROBE tối-thiểu (trả đúng `ALIVE|<role>`, cấm gọi tool) → đếm **N/N sống**. Đo S122: **14/14 ALIVE, 0 error, 0 garble**; 2 vai mới lean nhất (~26K tok).
> 🔸 **Khai chặt phạm-vi (S122) — đừng đọc thành "đã phủ hết":** probe này phủ đường **Agent-tool registry**. Đường **`hmw.js VALID_ROLES` → `agentType`** là **BỀ-MẶT KHÁC**, chỉ chứng được khi có workflow THẬT gọi vai đó. Đổi roster = đổi **CẢ HAI bề-mặt** — 1 probe KHÔNG phủ cả 2.
> 🔸 `tool_uses=0` ở probe = **ĐÚNG THEO LỆNH** (mình cấm gọi tool, câu hỏi không cần tool) — **KHÔNG** phải chữ-ký #53 (= `tool_uses=0` **CỘNG VỚI** bịa đã-làm-việc). Đừng nhìn cột đó rồi tưởng dính garble.
## 📋 BƯỚC 0.7 — WAL-check mạch-việc-dở (H22 — adopt S111 · **Sàn-3 wire S122**)
Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40 dòng, tầng persist = Stop-hook) → **chạy Sàn-3** → 2 nhánh:
🔴 **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).
- **(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 + **TRI-ACCEPT** + 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).
## Phase 1 — READ (load context)
@ -63,15 +88,15 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
4. **`docs/PROJECT-MAP.md`** — bản đồ tổng quan module
5. **`docs/changelog/migration-todos.md`** — atomic tasks theo phase (Phase 11 polish hiện tại)
6. **`docs/workflow-contract.md`** — state machine 9 phase HĐ (base pattern cho PE/Proposal workflow V2)
7. **`.claude/agents/README.md`** — 12-agent decision tree + skill matrix + split boundary
7. **`.claude/agents/README.md`** — decision tree + skill matrix + split boundary (roster ĐẦY-ĐỦ; số vai canonical → `docs/STATUS.md` §Sub-agents)
8. **`.claude/agent-memory/{spawned-agent}/MEMORY.md`** — L1 HOT auto-inject (Tiered Memory v1 ~30KB) + L2 `archive/` Read-on-demand + L3 RAG `search_memory` just-in-time
9. **User auto-memory `MEMORY.md`** — auto-loaded bởi harness (index feedback_* entries)
10. **Liên quan task hiện tại:** `docs/rules.md`, `docs/architecture.md`, `docs/gotchas.md` (số hiện tại → `docs/STATUS.md`), `docs/database/schema-diagram.md`, `docs/flows/`
## Phase 2 — AUDIT (state check)
### 2.1 Sub-agent state (12-agent topology — 10 product/quality + 2 monitor INFORM-only)
- Check 12 sub-agent đã spawn chưa:
### 2.1 Sub-agent state (topology — **10 product/quality + 4 monitor INFORM-only**; 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
- 🟨 **implementer-backend** — .NET Domain+App+Infra+Api scaffold
@ -84,6 +109,9 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
- 🟩 **cicd-monitor** — post-deploy Gitea + bundle hash + smoke
- 🟫 **tooling-auditor** (monitor H1, INFORM-only) — tooling/docs-freshness 4-mặt (skill·sub-role·plugin·docs)
-**harvest-curator** (monitor H2, INFORM-only) — harvest-integrity 5-trục (Coverage/Completeness/Fidelity/Placement/Corruption)
- 🔷 **lead-view-auditor** (monitor **H24**, INFORM-only, **+S121 W2**) — soi **VIEW LỆCH SOURCE** của chính cái LEAD surface (bản-tóm-tắt trỏ số cũ · tiêu-đề chưa bump · chú-thích-trạng-thái chưa lật · số trong mô-tả một VAI lệch · dư-lượng bất-đối-xứng)
- 🔶 **lead-omission-auditor** (monitor **H24**, INFORM-only, **+S121 W2**) — soi **CÁI BỊ THIẾU** trong cái LEAD surface (việc rớt khỏi work-state · carry rớt/quá-già · yêu-cầu owner ghi chung-chung mất specifics · quyết-định-treo chìm · memory nạp dưới hạn-mức)
- 🔴 **2 vai H24 = trục KHÁC H1/H2, KHÔNG gộp:** H1 = tooling-freshness · H2 = harvest-integrity · **H24 = soi chính LEAD**. Class-flag lấy từ **enum ĐÓNG** `lead_self_audit.flag_classes` (`.claude/agent-memory/memory-budget.json`) — **vai KHÔNG tự chế class**. Nhịp = `h24_cadence` (cùng file), **KHÔNG chạy mỗi phiên**.
- Task match delegate criteria (ACCEPT) → BẮT BUỘC delegate (xem `.claude/agents/README.md` decision tree)
- Con cũ rảnh TRONG-session → resume qua SendMessage (khả dụng lại — F2 S100) HOẶC fresh spawn re-inject MEMORY; cross-session luôn fresh spawn
- Nạp full context project cho sub-agent spawn, giữ context sống đến cuối session
@ -151,6 +179,33 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
- **reinject-ledger CG-1 check:** đọc [`.claude/governance/reinject-ledger.md`](../governance/reinject-ledger.md) nếu dòng `status=escalated` chưa xử nhắc anh (build-gap? tăng-budget?). floor-rot (MFE age-band) phân-loại B3 (build-gap vs floor-rot) trước khi reinject.
- 🔴 con-số budget = quyền anh; spec-audit READS `token_governor`, KHÔNG ghi. **Light/hỏi-đáp → skip; governance/audit/memory-heavy → nên chạy** (đối-xứng `session-end §L.b(c)` loop-REFINE).
### 2.1.8 H24 lead-self-audit — TICK counter + OVERDUE check (adopt S122 W3; file+shape = W2)
> Floor H24: 2 vai `lead-view-auditor` + `lead-omission-auditor` soi **chính LEAD**, chạy **theo NHỊP** chứ KHÔNG mỗi phiên. Nhịp đọc từ `h24_cadence`; trạng-thái đếm ở `.claude/governance/.session-counter.json`. 🔴 **Lead = single-writer** của counter. **W2 sở-hữu file + hình-dạng; W3 (đây) sở-hữu NGHI-THỨC tick.**
**(a) TICK content-addressed, KHÔNG blind-increment:**
```
head = git rev-parse HEAD
nếu head == last_ticked_head → NO-OP (idempotent)
ngược lại → counter += 1 ; last_ticked_session = S<nn> ; last_ticked_head = head ; last_ticked_at = <date>
```
🔴 **Vì sao content-addressed:** Stop-hook `wal-flush.ps1` auto-commit **MỌI turn-boundary** `counter++` sẽ tick **nhiều lần trong một phiên thật** nhịp thành vô-nghĩa. Neo vào HEAD làm 2 lần `/session-start` **cùng HEAD** = **+1, KHÔNG +2**.
> 🔸 **Khai thật giới-hạn:** counter đếm **"phiên có làm HEAD đổi"**, không phải "phiên". Hai phiên liên-tiếp mà **không commit gì** (Q&A thuần, không chạm WAL) ⇒ cùng HEAD ⇒ **chỉ 1 tick**. Thực-tế hook chạm WAL gần như mọi phiên nên hiếm; nhưng **đừng đọc counter thành "số phiên tuyệt-đối"**.
**(b) FAIL-LOUD, CẤM tự chữa:** counter đến **THẤP HƠN** giá-trị đã lưu, HOẶC `last_ticked_head` trỏ commit **không reachable từ HEAD** 🔴 **BÁO ANH**, **KHÔNG silent-reset**. Counter lùi = file bị rollback/sửa tay; reset lặng sẽ **giấu mất khoảng nhịp đã trôi**.
**(c) OVERDUE:**
- `OVERDUE(light)` khi `counter last_audit.light_at_counter >= h24_cadence.light_every`
- `OVERDUE(deep)` khi `counter last_audit.deep_at_counter >= h24_cadence.deep_every`
- **Bỏ phiên KHÔNG xoá nợ** khoảng đo từ **counter**, không từ đồng-hồ phiên nhỡ hiện ra thành **OVERDUE**, không biến mất.
**(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:** in **1 dòng** `counter=<n> · light <a>/<light_every> · deep <b>/<deep_every> · OVERDUE: <none|light|deep>`. 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 §2.1.2).
🔴 **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** — n=1 ở hub là mocc-0, **chưa ai được bán câu "đã chứng minh hiệu-quả"**.
### 2.2 Skill registry (6 skill)
- Liệt kê: `contract-workflow` · `form-engine` · `permission-matrix` · `dependency-audit-erp` · `ef-core-migration` · `iis-deploy-runbook`
- Dùng skill khi task khớp (KHÔNG tự suy luận lại). Phân bổ per agent: xem README skill matrix.
@ -199,7 +254,7 @@ Plan cha: [tên]
```
### SOLUTION_ERP report
- Trạng thái spawn 12 sub-agent (idle/working) + agentId reuse-able trong session
- Trạng thái spawn TOÀN roster (idle/working) + agentId reuse-able trong session · **+ 1 dòng H24 cadence** (§2.1.8)
- Plan progress: ✅ Phase 10 COMPLETE 11/11 · ⬜ Phase 11 polish (wire ApproveV2 skeleton) · 🚫 Phase 9 Ops (anh main coordinate)
- Critical signal: state counts (mig/table/endpoint/page/menu/test/gotcha) + bundle hash prod + RAG health
- (SE KHÔNG copy phần "6 sister report" của AI_INFRA — đó là vai trò host)

View File

@ -1,5 +1,5 @@
---
description: /tiep — recovery MỘT đường cho MỌI kiểu gián-đoạn (Harness-22 WAL session-continuity). Đọc .claude/WAL.md → chạy verify + git status → ground-truth thắng → nối chain từ next; mục wf: → relaunch workflow ĐÃ-CẮT-GỌT. Cặp với /pause.
description: /tiep — recovery MỘT đường cho MỌI kiểu gián-đoạn (Harness-22 WAL session-continuity). §0 = NHÀ CANONICAL của Sàn-3 "sổ trống ≠ sạch" (3 bậc + TRI-ACCEPT; session-start BƯỚC 0.7 chỉ TRỎ vào đây, không chép). Rồi đọc .claude/WAL.md → chạy verify + git status → ground-truth thắng → nối chain từ next; mục wf: → relaunch workflow ĐÃ-CẮT-GỌT. Cặp với /pause.
argument-hint: (không tham số)
---
@ -8,11 +8,93 @@ argument-hint: (không tham số)
> Đây là **đường recovery DUY-NHẤT** để nối lại mạch việc dở sau **bất-kỳ kiểu gián-đoạn nào** — hết giới-hạn, crash, tắt máy, đổi tài-khoản, hay chết giữa một workflow. Gõ `/tiep` (kể cả khi user chỉ nói "làm tiếp" bằng text thường).
> Cặp với **`/pause`**. Đặt tên `/tiep` để tránh đè lệnh dựng-sẵn (`/resume`, `/continue`).
Thực-hiện **tuần-tự 4 bước**:
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ó **3 điểm mù**
`.claude/hooks/wal-flush.ps1:7` tự-commit **3 path** ở turn-boundary: `.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/`.
⇒ Hai tín-hiệu trực-giác nhất — **"cây bẩn"** 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.
⇒ 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
| # | Tín-hiệu | Vì sao đáng tin | Lệnh |
|---|---|---|---|
| **①** | **Orphan run-folder**: `runs/<id>/``run.md`**không có bản-ghi-kết-quả** (xem TRI-ACCEPT dưới) | **git-independent — miễn-nhiễm hook hoàn-toàn** (đọc đĩa, không đọc git) | xem block dưới |
| **②** | `origin/main..HEAD` có commit **KHÔNG** phải `wal:` | hook **không bao giờ sinh** loại commit này ⇒ có = người làm thật ⇒ không mù | `git log --format='%s' origin/main..HEAD \| grep -qv '^wal:'` |
| **③** | `closing:` treo trong WAL | = Sàn-2 sentinel (xem §0.b) | `grep -q '^closing:' .claude/WAL.md` |
| **④** | `wal:`-commit **chưa đẩy** có đụng `.claude/workflows/runs/` | 🔴 **thu-hồi một phần điểm mù**: dù `WAL.md` bị **xoá trắng**, **commit của chính hook vẫn tố-giác** rằng một run đã được dựng | `git log --name-only --format='%s' origin/main..HEAD \| grep -q 'workflows/runs/'` |
#### ① TRI-ACCEPT — 3 dạng bản-ghi-kết-quả đều TÍNH LÀ ĐÓNG
> 🔴 **Nấc chuẩn (S122):** câu hỏi là **"đã harvest chưa"** — một câu hỏi về **NỘI DUNG**. Nếu chỉ đo **TÊN FILE** thì detector đo *cái dễ đo*, không phải *cái cần đo*. Đo thật @S122: **8 dương-giả / 25 run = 32%**, trong đó folder **ghi chép đầy-đủ nhất** (`pe-negative-quote`: có cicd PASS + bundle-hash + smoke 200 + 6 stage `[x]`) **vẫn** bị xếp orphan. ⇒ nhận dạng-2/dạng-3 là làm detector **ĐÚNG**, KHÔNG phải làm nó **dễ dãi**.
```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
# dạng-3 — synthesis ghi trong THÂN run.md (S112S114; phát-hiện + chuẩn-hoá @S122).
# `^#+[[:space:]]*synthesis` = PHẢI là heading. Chữ "synthesis" giữa câu văn KHÔNG tính
# (chống nhận bừa — nếu lỏng, mọi run.md nhắc chữ đó đều được tha ⇒ detector im vĩnh-viễn).
grep -qiE '^#+[[:space:]]*synthesis' "$d/run.md" && continue
echo "ORPHAN: $d"
done
```
> 🧪 **Block này ĐÃ fault-inject trên cây tạm (S122) — 9/9 PASS, chứng có RĂNG cả 2 chiều:**
> **FLAG đúng** → orphan-thật · flat 0-byte · C8 0-byte · chữ "synthesis" **không phải heading**.
> **IM đúng** → dạng-1 · dạng-2 · dạng-3 · `## Synthesis` (hoa + thừa space) · folder không có `run.md`.
> 🔴 Ca *"0-byte"* và ca *"synthesis giữa câu văn"* là 2 ca **anti-Goodhart** — thiếu chúng thì happy-path vẫn xanh mà sàn đã thủng.
> ⚠️ **KHAI THẲNG 2 giới-hạn (đừng đọc thành "đã kín"):**
> 1. **Dạng-4 KHÔNG máy nào bắt được.** `pe-negative-quote` ghi kết-quả rải trong `## Stages` + `## wf run-id` (không có heading "synthesis"). Nhận dạng-4 = phải chấp-nhận "bất-kỳ run.md nào có vẻ nói về kết-quả" ⇒ **quá lỏng, thành vô-nghĩa**. ⇒ dạng-4 **để nguyên cho người phán**, KHÔNG cơ-khí-hoá. Đây là **kẽ còn lại**, không phải chuyện đã xử.
> 2. **Tri-accept = lưới PHÁT-HIỆN cho bản CŨ, KHÔNG phải giấy phép VIẾT bản MỚI.** Đúng khuôn C8 đã dùng sẵn (*tha di-sản, cấm viết mới kiểu cũ*). 🔴 **Run MỚI BẮT BUỘC ghi dạng-1** (`<stage>-synthesis.md` phẳng) — `workflows/README.md:17` thiết-kế **tên file mang nghĩa** (RAW `sub-` ⟂ VERIFIED `-synthesis.md`); dạng-3 phá đúng thiết-kế đó. Đo @S122: cùng ngày 07-12, `h22-wal-adopt` ghi dạng-1 còn `S112-*` ghi dạng-3 ⇒ **thói-quen không nhất-quán, KHÔNG phải migration** — nhận dạng-3 để không kêu oan, cấm dạng-3 để không tái sinh.
### 🟡 BẬC TRUNG-BÌNH — nhiều file bẩn **NGOÀI** 3 path hook persist
🔴 **PHẢI loại nhiễu EOL TRƯỚC khi đếm** — repo có ~188 file dính EOL-only diff; không loại thì bậc này **LUÔN KÊU** ⇒ tự vô-hiệu-hoá.
Bẩn ngoài 3 path + không phải EOL-only ⇒ **NÊU**, hỏi lại nếu nhiều.
### ⚪ BẬC YẾU — bẩn thô (`git status --porcelain` khác rỗng)
Tín-hiệu **YẾU NHẤT**, dùng cuối. 🔴 **`porcelain` rỗng KHÔNG phải bằng-chứng sạch** — đo thật @S122: **git MÙ hoàn-toàn với thư-mục RỖNG**, nên 2 probe-dir tồn-tại trên đĩa suốt mà `porcelain` vẫn rỗng ⇒ **dương-giả**. Công-cụ quét-đĩa thấy, git không thấy.
### Kết-luận sàn
- Bậc MẠNH thấy **≥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**.
## 0.b Sàn-2 — đọc sentinel `closing:` (self-heal)
- `session-end` ghi `closing: S<nn> @<ts>` vào WAL ở **BƯỚC 0** (trước mọi flush); xoá ở **`§6.4`**.
-**Thấy `closing:` treo = phiên trước bị cắt GIỮA lúc đóng sổ** (không phải đóng xong).
- **Self-heal:** `closing:` treo **NHƯNG** cả 4 tín-hiệu MẠNH khác đều im + ground-truth sạch ⇒ **dọn dấu 1 lần, đi tiếp** (không bắt anh xử tay).
- `closing:` treo **VÀ** có tín-hiệu MẠNH khác ⇒ **HỎI LẠI**.
---
## 1. Đọc `.claude/WAL.md`
- Đọc file `.claude/WAL.md`.
- Nếu **KHÔNG tồn-tại**, HOẶC **chain rỗng / toàn `[x]`** (không còn mục dở) → báo "**không có mạch dở**" và **DỪNG SẠCH**. KHÔNG bịa việc.
- **Chain rỗng / toàn `[x]` / file không tồn-tại ⇒ 🔴 CHƯA ĐƯỢC KẾT-LUẬN GÌ.** Bắt buộc chạy **§0 bậc MẠNH** trước:
- Có tín-hiệu MẠNH ⇒ **HỎI LẠI ANH** (sổ trống nhưng đĩa nói còn việc — đúng ca sàn này sinh ra để bắt).
- 4/4 tín-hiệu MẠNH im ⇒ báo "**không có mạch dở**" và **DỪNG SẠCH**. KHÔNG bịa việc.
- *(🧊 Bản trước S122 suy thẳng "chain rỗng ⇒ dừng sạch" — **đó là bug**, chính là thứ Sàn-3 vá.)*
## 2. Đối-chứng ground-truth
- Chạy **TOÀN BỘ** lệnh trong `verify:`.