Files
solution-erp/.claude/commands/session-start.md
2026-07-31 21:47:23 +07:00

60 KiB
Raw Blame History

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

Trigger đầu session. Em main chủ trì, spawn sub-agent khi task match delegate criteria. ⚠️ Harness note (F2 re-verified S100): SendMessage KHẢ DỤNG lại (deferred tool — load qua ToolSearch; resume agent đã spawn TRONG-session, context giữ). Cross-session vẫn = fresh spawn (MEMORY on-disk auto-inject giữ context). agentId chỉ valid trong-session.

📋 BƯỚC 0 — Show command body (visibility, no wait)

Em main PHẢI echo TOÀN BỘ nội dung command body này (đầy đủ Phase 1-3 + sub-section + guard rule) trong response đầu tiên ĐỂ ANH USER ĐỌC LẠI.

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 → 3 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)

📋 BƯỚC 0.5 — HMW-mode marker check (T3 — broadcast ultracode-hmw-mem-governance)

Em main đọc .claude/hmw-mode.onBÁO ngay đầu response (anh khỏi quên đang ở mode đốt-token):

  • Marker TỒN TẠI🔥 HMW-mode = ON — task LỚN sẽ chạy Workflow hmw fan-out theo /ultra-on (đốt-token cao). Gõ /ultra-off để tắt.
  • Marker KHÔNG cóHMW-mode = OFF — vận hành thường (Agent-tool spawn lẻ / solo theo agents/README.md). Workflow fan-out chỉ chạy sau /ultra-on.

🚦 T4 + H6.1 (governed-ultracode, adopt S63): keyword "workflow"/"ultracode" = QUYỀN hỏi khi mode-OFF (+ "chạy workflow" → em TỪ CHỐI + nhắc gõ /ultra-on). 🟢 Mode-ON (H6.1): task SUBSTANTIVE (≥2 bước độc-lập · multi-file · sweep/audit/review/migration/research/verify-heavy) → em TỰ author+chạy Workflow HMW (KHÔNG cần gõ "workflow"; marker-ON = consent); TRIVIAL (<2-3' · 1-file · hỏi-đáp · governance-authoring single-writer) → solo. CẤM native /effort ultracode (mất guard).

📋 BƯỚC 0.5b — Engine-đắt per-invocation (H21 — adopt S110, supersede H19 marker)

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 (số vai canonical → 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). Chi-tiết → harness-11-engine.md §K + 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.

📋 BƯỚC 0.6 — Model-availability check (H5 — adopt S63 · MTv3 reword S110)

🔄 VALUE-update @S149 2026-07-25 (broadcast model-default-opus-5-max sha published 9c909007 — re-stamp G-024a @07-25, pre 59ce1d0f, hub-owner "làm gấp" + anh cùng ngày "đám Opus 5 MAX"): Default = Opus 5 MAX ở MỌI vị trí, KỂ CẢ ghế lead (Khoản 5 — lối "owner-choice per-session cho lead" THÔI DÙNG). Model cao hơn default = gọi bằng LỆNH từng phát: /fable-real <vai> <đề-bài> HOẶC anh gõ /model trực tiếp (quyền tuyệt đối, không bị rào — ghi 1 dòng "chủ dự án đổi", 0 caveat). CẤM lớp thấp (Sonnet/Haiku) ngồi lead (§A1 giữ). Báo đầu phiên RÚT GỌN: lead đúng default ⇒ im, không nêu; chỉ nêu khi anh chủ động đổi hoặc model không resolve. 🧊 Lineage: MTv3 owner-choice {Fable 5 | Opus 4.8} per-session (S110→S149) = superseded-VALUE bởi broadcast trên; CẤU TRÚC (floor §A1 · outage-reflex · per-invocation engine-đắt) GIỮ NGUYÊN.

Outage-path (H5, GIỮ — value-update): Opus 5 KHÔNG resolve (lỗi "Model isn't available") → GIỮ /model claude-opus-4-8[1m] + BÁO HUB NGAY (caveat Khoản 3 broadcast — đừng đổi mù để agent chết im; blameless per-env). KHÔNG sửa frontmatter agent — sub pin ALIAS opus+effort:max (worker-tier-pin S124) ⇒ alias family tự resolve, outage lead KHÔNG chạm sub. Phản-xạ THỦ-CÔNG (không hook tự-switch).

Outage đóng: phiên ĐẦU TIÊN sau đó em main hỏi anh ĐÚNG 1 DÒNG ("model hạng-nhất resolve lại — giữ hạng-hai hay đổi?"), hỏi 1 lần, không lặp (thay auto-revert cũ). Flip-record từ nay gắn nhãn {owner-choice | outage} khi ghi: owner-chọn-hạng-hai ≠ outage → 0 caveat / 0 nghĩa-vụ revert; chỉ outage-fallback mới mang caveat tạm-thời.

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

H23 note — ĐÃ ĐO S126 2026-07-16 (khai theo H23 §2(2); flip từ "LỖ CHƯA-TEST"). Broadcast từng đòi khai: "thứ-tự ưu-tiên giữa 'tham-số tại spawn''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" — nay ĐÃ có phép đo. Kết-quả (phiên đầu sau restart, run wf_f960dae2-fa0, đọc bằng spawn-model-audit.ps1 — KHÔNG tin lane tự khai): lane reviewer (frontmatter opus) + tier:'fable' → resolved claude-fable-5SPAWN-PARAM THẮNG hard-pin/fable-real·/fable-clone SỐNG, KHÔNG NO-OP, không cần re-pin. Control: lane no-tier → claude-opus-4-8 DÙ lead=Fable ⇒ pin ăn runtime (loại giả-thuyết inherit-lead). Evidence: runs/2026-07-16-S126-adap-spec-execute/runtime-verify-synthesis.md + báo hub 2026-07-16-se-to-ai_infra-h23-precedence-test-result. Caveat GIỮ (không bán quá nấc): retrospective — không hứa spawn TƯƠNG-LAI (đúng PA-2b) · đo trên ALIAS-pin (hub full-id-pin KHÔNG covered — ENV-DEPENDENT) · fix #8a vẫn mở (param có từ-chối full-id không — chưa ai thử). PA-2 (anh chốt O1) = 2 lớp GIÁN-TIẾP bổ-trợ: PA-2a hằng-số TIER2_EXPECTED_FULL_ID trong hmw.js + PA-2b scripts/spawn-model-audit.ps1 so resolved-vs-expected (retrospective per-session).

📋 BƯỚC 0.6b — Registry-probe: RESTART rồi VERIFY danh-sách agent (broadcast ③(d) — adopt S122)

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

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: toàn-roster-khi-đó ALIVE (N=14 tại thời-điểm S122), 0 error, 0 garble; 2 vai mới lean nhất (~26K tok). 🔴 Đây là MỐC ĐO LỊCH-SỬ (S122), KHÔNG phải roster hiện-tại: +3 vai trio-memory (S141) CHƯA probe lần nào — lần probe đầu = phiên SAU restart (đừng đọc con số cũ thành "đủ roster hôm nay").

🔸 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_ROLESagentTypeBỀ-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 §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ở 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 §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] + ORPHAN-L ⑤ [S146] + 2 kẽ khai thật) 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 §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. 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 đè.
    • 🔄 @S149 CHẠY BẰNG MÁY (M1 — gốc "cứ sai mã" chết tại đây): /session-start gọi powershell.exe -ExecutionPolicy Bypass -File scripts/session-scaffold.ps1 -New (cấp <N>=max+1; collision → exit 4 không ghi) · /pause+/tiep gọi … -Ensure (idempotent exit-0 no-op; khuôn hub :144-151). ts-mốc = git-committer TỰ ĐỘNG. Template = .claude/templates/session-context-template.md. Prose khối này = luật để hiểu; máy = đường thi hành (fault-inject 4/4+6/6 @S149 — chính phiên mà lead ĐÃ ĐỌC luật này rồi VẪN quên tạo session-3, anh phải bắt: "đấy là lý do mà nghi thức này bắt buộc").
    • 🔴 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 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.

(a-bis) 🔴 DANH-MỤC FILE trong thư-mục — form HUB, owner chốt @S148 ("đối ứng đúng chính xác như này", ảnh session-109; đối-chứng đĩa hub AI_INFRA/.claude/sessions/session-102..109):

file vai ai ghi (canonical — B1, KHÔNG chép schema về đây)
_context-s-<N>.md narrative durable, 1 file/phiên-logic · §(a) STOCK-map pointer + §(b) FLOW append-only (### PAUSE-<k> + dòng > anh: VERBATIM) · 🔴 CẤM rewrite/tự-tóm append @pause.md §2.6 · đọc @tiep.md §2.6
_pause-<i>.md marker máy ~200B, 5 trường (ts·head-sha·window-ordinal·jsonl-hint·account-label) pause.md §2.6
_tiep-<i>.md marker máy, cùng 5 trường tiep.md §2.6
_snapshot-<i>.md chụp-nhanh không-dừng CHƯA CÓ ở SE — cần lệnh /snapshot [carry:snapshot-cmd] + [carry:pause-autosnap]
_end chốt-kết, KHÔNG đuôi .md · markers: chụp cân-sổ lúc đóng (+mind-blocks=<n> @S153) session-end.md §6.3-bis
_mind-s-<N>.md lớp trí-nhớ MỀM 4-tầng (gói-turn · hướng-tiếp · kế-hoạch-suy-nghĩ · đang-thảo-luận + dòng-sống E) — block ## MIND-<k> mới-nhất-ở-TRÊN (🔴 NGƯỢC chiều _context FLOW), block cũ bất-biến; adopt thư 0df10df4 @S153 ghi block-0 @Phase 3.5 (lead) · refresh @pause.md §2.6(C-bis) · đọc @tiep.md §2.6/§3-ter · máy = session_ctx.py mind-check · trần = khoá mind_ctx_kb (B1)
  • 🔴 <i> đánh số TUẦN TỰ trong thư-mục (max+1) — KHÔNG nhãn S<nn>, KHÔNG timestamp trong tên. Thứ-tự đọc được từ tên, ts nằm trong file.
  • 🔴 TÁCH marker ⟂ narrative là điểm khác lớn nhất so với form SE cũ (gộp cả hai vào pause-S<nn>-<ts>.md). Marker cho MÁY đọc, narrative cho NGƯỜI/phiên-sau đọc.
  • 🧊 Form cũ = LEGACY, CẤM viết mới; Sàn-3 ⑤ vẫn nhận (dual-accept, tiep.md §0) vì session-1 còn dùng — đúng luật retire "giữ khi CÒN người thụ-hưởng".

(b) Đo TRƯỚC khi tin — .gitignore (đo @S146, KHÔNG suy):

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; Sàn-3 có tín-hiệu ⑤ + ORPHAN-L canh đúng vùng đó (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.jsonsession_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 reader thật :190). Có số ≠ có hành-vi. Ai wire sau phải đọc khoá, không hardcode.

📋 BƯỚC 0.9 — Kéo thư cross-project (cửa VÀO 1/2 — owner chốt S148)

DÒ 2 kênh rồi KÉO đầy-đủ theo định-tuyến: se>0/check-email all · all>0/adap-apply.

🔗 Luật nhịp đầy-đủ (4 cửa · fail-soft · quan-hệ với pull-cach) = canonical check-email.md §"Nhịp chạy — 4 CỬA PHIÊN". 🔴 B1 — mục này CHỈ TRỎ + GỌI, CẤM chép luật sang đây. 🔴 KHÔNG chặn bootstrap: không có thư ⇒ 1 dòng đi tiếp; lỗi ⇒ check-email loi (khong chan) rồi đi tiếp. Kéo TRƯỚC Phase 1 READ là cố ý — thư mới có thể đổi chính kế-hoạch phiên mà Phase 1 sắp dựng.

Phase 1 — READ (load context)

Đọc theo thứ tự, KHÔNG skip:

  1. CLAUDE.md (root) — AI agent context + quick rules (BE Clean Arch + FE 2 app + DB conventions + commit scope)
  2. docs/STATUS.md — snapshot HIỆN TẠI (current state verified + recently done 3 session)
  3. docs/HANDOFF.md — brief 5 phút: session trước làm gì + next tasks
  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 — 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 (topology — 10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory · 3×round-KIỂM ring1-audit/ring2-audit/ring4-audit S145); số vai canonical → 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
    • 🟧 implementer-frontend — FE 2 app cookie-cutter SHA256 mirror
    • 🩷 frontend-designer — FE design/redesign visual-verification loop (FD1FD10)
    • 🔵 database-agent — read-advisory DB lens (DB1DB11: schema/migration-review/perf/concurrency)
    • 📄 office-document — Office document WRITE (docx·xlsx·pptx·pdf + form-engine — template/spec-extract/report/screenshot→docx, OD1OD10)
    • 🟪 test-specialist — tests/ xUnit dedicated
    • 🟥 reviewer — adversarial pre-commit + live curl prod
    • 🟩 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-stale-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-gap-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)
    • 🧪 harness-eval (monitor trio-memory, INFORM-only, +S141) — con ĐO: đọc output 5+1 instrument + memory-budget.json → TRẢ số nguyên-văn + so-baseline + verdict {HEALTHY|REGRESSION|MIXED}. 🔴 CẤM số-từ-trí-nhớ.
    • 🧭 harness-refine (monitor trio-memory, INFORM-only, +S141) — con ĐỀ-XUẤT: đọc harness-eval-return.md (PIN) → action 4-lớp {nạp-lại · thăng-hạng · lưu-kho L1→L2 · chưng-cất} + mục "đã cân-nhắc→BÁC". Chỉ acts AGENT-MEMORY corpus (lead hot-feed/carry ⇒ NHƯỜNG lead-gap-auditor).
    • 🧮 harness-audit (monitor trio-memory, INFORM-only, +S141) — con KIỂM: đọc run-folder PIN đích-danh → verdict ĐẠT/TRƯỢT per-claim + falsify-log + re-chạy ≥2 số load-bearing. 🔴 CẤM tự tìm "run mới nhất", CẤM ĐẠT-ảo.
    • 🔎 ctx-audit (monitor lớp trí-nhớ MỀM — vai-3 vòng Ctx, INFORM-only, +S153 adopt 0df10df4) — SOI-CHUỖI _mind-s-<N>.md @2 bookend (hình-B, máy TRƯỚC vai): @open block-0-nội-dung-thật + carry ý-treo + gieo mồi-ngầm · @close bất-biến-chuỗi-đếm-ĐĨA + chấm mồi + KIỂM-VẾT vai-1/vai-2 (hồi-tố đầy-đủ = fallback khi phiên 0-pause/0-tiep). PIN fail-closed; _mind vắng ⇒ NO-OP-có-khai. 🔴 KHÁC 2 vai H24 (chúng soi lead-SURFACE; bộ-ba Ctx soi TỆP lớp-mềm).
    • 🔎 ctx-curator (vai-1 vòng Ctx, INFORM-only, +S153 OWNER-VETO hub-form 3-vai) — KIỂM bản NHÁP block @MỖI /pause (5 khoản ngữ-nghĩa, SAU máy-draft; carve-out duy nhất của pause.md §1); trả CHỈ văn bản CTX-CURATOR: DAT|SUA|SKIP-CO-KHAI.
    • 🔎 ctx-verifier (vai-2 vòng Ctx, INFORM-only, +S153 OWNER-VETO) — ĐỐI-CHIẾU 4-khoản (B-vs-next: TIN-SỔ-MÁY · C-vs-bản-đồ · D-chưa-đổi-nhãn · con-trỏ) + BẢN NẠP-LẠI ≤15 dòng @MỖI /tiep, kết bằng LEAD-PHAI-NHAC-LAI: (bằng-chứng nội-dung sàn khoản 3).
  • 🔴 Bộ-ba trio-memory = trục CHÍNH-HỆ-MEMORY, KHÁC H1/H2/H24/reviewer — chạy TUẦN TỰ eval→refine→audit, AUTO 1 vòng/phiên giữa 2 bookend (owner @S151 — 🧊 consent-gated S141 superseded); nghi-thức đầy-đủ ở §2.1.9 (đầu phiên) / session-end §L.b(k) (cuối phiên).
  • 🔴 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: cặp light = VÔ-ĐIỀU-KIỆN mỗi bookend (hình B) · deep = theo h24_cadence.deep_every. (vá FLAG-1 @S159)
  • 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
  • Em main solo CHỈ khi: schema/UX/architecture decision · cross-stack tight · bug reasoning chain · gotcha #53/#54/#55 fallback (truncate/529)

2.1.1 Monitor RE-REPORT — H1 tooling-freshness + H2 harvest-integrity (2026-06-07 Harness 1)

Đầu session: 2 monitor sub BÁO LẠI trạng-thái + diff vs session trước (floor Harness 1 H1.2 + H2.2). INFORM-only — em main đọc + VERIFY→APPEND nếu có delta hợp-lệ (B3), KHÔNG sub tự sửa.

  • 🟫 tooling-auditor (H1): spawn → báo tooling-state 4-mặt (skill · sub-role · plugin · docs) + DIFF vs last-session (THÊM/ĐỔI/XÓA/stale). Bắt drift doc-vs-thực-tế ngay đầu session (vd roster/count lệch, skill stale, plugin pending).
  • harvest-curator (H2): spawn → báo harvest-MD mới (run-trace runs/<id>/ — file sub-*/*-synthesis.md phẳng h10-refine / sub-agent / agent-team kể từ last) + delta mồ-côi chưa-APPEND + scan runs/*/ tìm folder có run.md*-synthesis.md VẮNG/0-byte = orphan run (🧊 tiêu-chí ledger- retired H18-B S100; run cũ S71 dual-accept harvest/<stage>-synthesis.md) (C5 Layer2 post-exec rescan — bù khi C4 per-turn miss hoặc session trước chết giữa run). Bắt 0-byte memory (gotcha #53) + delta chưa thu-hoạch.
  • Cơ-chế = báo-lại-diff đầu session (FORM tự do trình bày). 2 monitor spawn parallel OK. Light session / hỏi-đáp → có thể skip; bug/feature/multi-agent/wave session → nên chạy.

2.1.2 Memory L2 budget-audit (Harness-9 — 2026-06-17)

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 — 🔄 ĐỔ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 → 🔄 AUTO chạy /sleep-recovery-memory-l2 all trong phiên (owner @S152 "các vòng 1→5 auto luôn"🧊 INFORM-consent S144 superseded; vết M4 giữ: in 1 dòng trạng-thái, KÊU-mà-không-chạy-được ⇒ ghi WAL sleep: skipped S<nn> (<lý-do>)); ring4-audit AUTO sau nén như cũ (Phase 4.5 skill).

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

  • 🔒 Mirror C1 — bề-mặt-đo đóng-băng (S138): trong CỬA-SỔ đo (từ script đo đầu-tiên tới verdict cuối) KHÔNG ghi bề-mặt-đo (agent-memory · .session-counter.json · ACTIVE-MARKS · STATUS · HANDOFF · gotchas · error-ledger · migration-todos · agents/*.md); ngoại-lệ .claude/WAL.md + .mfe-state.json. 🔴 Danh-sách VERBATIM đầy-đủ = canonical ở session-end.md §L.b(c) (B1 — bước này CHỈ mirror ngắn).

2.1.3 Harness-11 D1 — DÒ+BÁO governance-detectors (2026-06-18 S75)

Engine bộ-nhớ-và-governance tự-bảo-trì spec → docs/governance/harness-11-engine.md (canonical — KHÔNG copy luật ở đây, B1). DÒ tự-động; SỬA qua em-main single-writer (D6/D9).

  • Chạy powershell.exe -ExecutionPolicy Bypass -File scripts/governance-detectors.ps1 → báo cờ: C1 con-trỏ-gãy (gotcha#/wikilink) · C2/B3 derived-doc stale vs docs/STATUS.md canonical (mig#/test#/gotcha#/table#) · C3 vocab-fork (1-khái-niệm-nhiều-tên). NO-API, DÒ+NÊU-CỜ-only KHÔNG tự sửa (D6 tầng). Cờ → em-main soạn bản sửa (gated B4). + (S139) 2 net INFORM-only C6 cite-2-nấc + H24-4 pending-flip — đọc dòng INFORM-ONLY (…) RIÊNG cuối output, KHÔNG gộp TOTAL (count tách anti-Goodhart; fold + sev-raise = post-triage owner-gated).
  • Nấc: detector = LƯỚI giảm-sót (khoảng-mù giữa 2 nhịp), count-token soft-net có false-pos (sev LOW khi |lệch|<10) → đọc cờ bằng phán-đoán, KHÔNG auto-fix. Light/hỏi-đáp session → có thể skip; governance/doc-heavy session → nên chạy.

2.1.4 User-Mark display — hiển-thị sổ-cái mark ĐẦU phiên (H-12/13 canonical §P/P7, S79)

Floor User-Mark (🔴 P7 harness-11-engine.md §E.4): danh-sách quyết-định-mark hiển-thị đầu + cuối mỗi phiên cho anh đọc lại. Canonical sổ-cái → .claude/governance/ACTIVE-MARKS.md. INFORM-only.

  • Đọc .claude/governance/ACTIVE-MARKS.mdbáo status-filtered (P7): 🔴 Active-High + 🟢 Active HIỆN rõ (ID + what gọn) · 🟡 Medium tóm-tắt (1 dòng đếm) · 📦 Disable/superseded ẨN. Mục-đích: anh thấy lại các LỆNH governance đã ký ("vì quan-trọng").
  • Mark cấp Active-High = LỆNH (P3 binding); vi-phạm → error-ledger.md §L.a RCA (P9). KHÔNG tự đóng dấu / đổi cấp (P4/P8 — chờ anh confirm).
  • Light/hỏi-đáp session → có thể skip; governance session → nên chạy.

2.1.5 Work-state block — LEAD nạp + phát-biểu trạng-thái-công-việc ĐẦU phiên (Harness-15 B(c), S81)

Floor H15 B(c) (🔴 harness-11-engine.md §G.2): khoảng-trống quên-việc hay rơi đúng vào chính LEAD (em main tự-nạp kiến-trúc/luật nhưng bỏ quên trạng-thái-công-việc). Chốt-chặn = LEAD PHẢI nạp + phát-biểu rõ 4 thành-phần (ở Phase 3 REPORT). KHÔNG bỏ qua vì "tiết-kiệm token" — tiết-kiệm-token = quên-việc (rơi trạng-thái giữa phiên, làm-lại tốn HƠN).

  • 4 thành-phần work-state block (phát-biểu ở Phase 3 REPORT):
    1. Lộ-trình đang chạy (active-roadmap) — phase/plan hiện-tại (docs/STATUS.md Phase line).
    2. Việc đang-làm-dở (WIP)docs/STATUS.md §🔥 In Progress + HANDOFF last-session "🔴 NEXT (em)".
    3. Quyết-định đang-chờ (pending-decisions) — carry product/ops + AskUserQuestion chưa chốt + mark Medium (neo chưa-rõ).
    4. Lỗi-lặp-lại cần nhớ (recurring-bugs) — gotcha/anti-pattern liên-quan task (docs/gotchas.md; các mục này = value_protect §G.2(b), GIỮ-L1 bất-kể tuổi).
  • Nạp-đầy L1 (B(a)): dùng-đủ ngân-sách token (memory-budget.json:token_governor) bằng nội-dung-THẬT, KHÔNG dè-xẻn / KHÔNG nhồi-rác. Budget = sàn-tận-dụng, KHÔNG trần-tiết-kiệm.
  • Light/hỏi-đáp session → tóm-tắt gọn; feature/bug/governance → phát-biểu đủ 4 thành-phần.

2.1.6 Hot-feed %-print — LEAD báo composition Tầng-1 theo % ĐẦU phiên (Harness-15-v2 §6, S82)

Floor H15-v2 (🔴 harness-11-engine.md §G.4): Tầng-1 = HOT-FEED LỚN → cần "kính soi" để anh thấy phần luôn-nạp đang chứa gì, bucket nào mỏng, còn trống bao nhiêu → anh quyết điều-chỉnh. 🔴 Ranh-giới vai-trò: con-số = quyền anh (chủ-dự-án); em-main chỉ THỰC-THI-đúng-số + BÁO-% (KHÔNG tự-tinh-chỉnh con-số).

  • In ở Phase 3 REPORT (đầu phiên): ước-lượng composition Tầng-1 theo % / 4 bucket (tỉ-lệ đủ, KHÔNG cần đo chính-xác): (1) WIP work-state · (2) lỗi-lặp/anti-pattern/gotcha · (3) tồn-đọng · (4) quyết-định-chờ. + Headroom = phần còn-trống so cap role (memory-budget.json:token_governor.tier1_hotfeed_tokens — lead 380K (v4 S94 owner-override, SE-specific — fit full read-set ~368K; subs giữ parity) · mem-sub (agent-ký-ức) 60K · wf-sub (agent-workflow) 50K; canonical = budget.json → đọc số sống ở đó, đừng tin echo này khi anh đổi cap).
  • 📊 Bảng-số ngân-sách THẬT (M.B — Harness-20 adap S103, engine §M): chạy powershell.exe -ExecutionPolicy Bypass -File scripts/crystallized-backfill.ps1 → in BẢNG số live (cap / hotload-đo-bytes / tok-RANGE / measured_headroom / target / expected_backfill) BÊN CẠNH %-ước-lượng. Số đọc-sống budget.json 0-hardcode; backfill default 0=OFF (owner-authority, script READ-ONLY). 🟡 measured_headroom = UPPER-BOUND (file-floor 6-file; peak thêm task-context biến-thiên → real NHỎ HƠN). Light→skip.
  • 🔴 Headroom > 0 mà CÒN nội-dung giá-trị-cao chưa nạp = under-fill (SAI) → nạp tiếp tới khi đầy hoặc cạn nội-dung giá-trị-cao. Headroom = cờ-báo, KHÔNG phải đích-tiết-kiệm; nạp-đầy ≠ nhồi-rác (giá-trị-thấp KHÔNG vào Tầng-1).
  • Light/hỏi-đáp → gọn 1 dòng; feature/bug/governance → in đủ 4-bucket %. Đối-xứng session-end §L.b(c) (% cuối phiên + Headroom).
  • 🧪 MFE opt-in (Harness-16 §H — memory-fidelity-EVAL, KHÁC H6.7 memoryDelta-routing): lệnh kèm tham-số eval → chạy thêm baseline powershell.exe -ExecutionPolicy Bypass -File scripts/mfe-eval.ps1 = LEAD coverage-FIT (must-remember vs cap, token-RANGE) + age-band (flag-not-cut) + Goodhart-anchor (strikes/RCA) + SUB per-role coverage (đo-thật, prose-only→N/A). KHÔNG eval = bỏ qua (tương-thích-ngược). MFE READS budget single-source, KHÔNG ghi. Light → skip; governance/audit → nên chạy.

2.1.7 Harness-17 loop-DÒ — spec-audit + floor-rot check (Đo→Kiểm nhánh đầu-phiên, S95)

Floor H17 (🔴 harness-11-engine.md §I): vòng tự-cải-thiện bộ-nhớ — đầu-phiên chạy khâu Kiểm (spec-audit) + Đo (floor-rot) để BÁO cờ; khâu Tinh-chỉnh (reinject/promote/archive/distill) do em-main làm ở session-end §L.b(c). INFORM-only — loop = tầng D6 DÒ+NÊU-CỜ, em-main = D9 writer.

  • Chạy powershell.exe -ExecutionPolicy Bypass -File scripts/memory-selfimprove-audit.ps1 → báo CRITERIA+GAP set (KHÔNG frozen-tally): (a) write-gov D9 [tool-scope + hmw.js schema + propose-only] · (b) change-gov [COMPOSE governance-detectors] · (c) distillation-spectrum [over-cap agent có _INDEX/gist] + HCV proxy. GAP → em-main soạn bản sửa (gated).
  • reinject-ledger CG-1 check: đọc .claude/governance/reinject-ledger.md → nếu có 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-stale-auditor + lead-gap-auditor soi chính LEAD. 🔴 Cặp light chạy VÔ-ĐIỀU-KIỆN ở MỖI bookend (hình B @S149 — KHÔNG cổng nhịp, KHÔNG consent); chỉ deep còn cổng h24_cadence.deep_every. (vá FLAG-1 @S159: 6 site trong 2 file LỆNH từng ghi "theo NHỊP, KHÔNG mỗi phiên" — mâu thuẫn với chính :269 cùng file + 2 persona, và trái hành-vi đo được [S154 counter≈28, S158 counter=32, đều < light_every=6 mà cặp VẪN chạy]. Lớp persona + STATUS đã vá @S153; lớp LỆNH — nơi thật sự điều-khiển spawn — sót tới S159.) 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 — 🔄 @S149 CHẠY BẰNG MÁY: powershell.exe -ExecutionPolicy Bypass -File scripts/session-counter-tick.ps1 -Session S<nn> (M2 — thi hành ĐÚNG _contract trong counter-file: OR-guard idempotent · 3-nhánh classify · atomic temp+move · fail-loud exit≠0; fault-inject 5/5 @S149). Prose dưới = MÔ TẢ contract để người đọc hiểu, KHÔNG phải quy trình tay nữa — tay chỉ khi script exit≠0 (fail-loud → báo anh):

head = git rev-parse HEAD
nếu head == last_ticked_head  HOẶC  session == last_ticked_session  → NO-OP (idempotent per HEAD + per nhãn-phiên)
ngược lại → counter += 1 ; last_ticked_session = S<nn> ; last_ticked_head = head ; last_ticked_at = <date>

🔴 Vì sao OR-guard (content-addressed + session-label): Stop-hook wal-flush.ps1 auto-commit ở MỌI turn-boundary ⇒ HEAD dời giữa phiên thật ⇒ head-guard ĐƠN sẽ để tick fire nhiều lần trong một phiên (mỗi điểm tick sau khi HEAD dời lại +1) ⇒ nhịp vô-nghĩa. Session-clause (session == last_ticked_session) giữ mỗi nhãn-phiên = đúng +1: 2 lần /session-start cùng HEAD, HOẶC session-start rồi /pause (HEAD đã dời do hook) — đều NO-OP sau lần đầu. Đây là bẫy +2/cycle mà OR-guard vá (/pause commit dời HEAD; thiếu session-guard thì pause+tiep = +2). 🔴 Label-convention (PIN THÀNH LUẬT — S135): mỗi conversation MỚI = một nhãn-phiên S<nn> MỚI, kể cả khi vào bằng /tiep (nối qua phiên/đổi acc — tiep.md:130 "session: khác phiên hiện-tại là BÌNH-THƯỜNG" = use-case chuẩn; thực-hành S134/S135). 🔴 CẤM reuse nhãn cũ khi nối — thiếu luật này thì session-clause khớp nhãn cũ ⇒ OR-guard NO-OP nhầm ngay cửa /tiep ⇒ tiep KHÔNG tick ⇒ phép-7 +0.

🔸 Đơn-vị đếm + khai thật giới-hạn (reconcile gốc "đếm phiên-có-làm-HEAD-đổi"): counter đếm nhãn-phiên S<nn> — phiên thường (SE chưa adopt session-logic 9234a7aa; khi adopt thì đọc lại = phiên-LOGIC, caveat B1 §7). OR-guard cho mỗi nhãn-phiên +1 ở điểm tick ĐẦU. 🔸 Ca hiếm giữ khai: một nhãn-phiên MỚI mà không commit gì (Q&A thuần, không chạm WAL) ⇒ HEAD trùng last_ticked_head ⇒ head-clause NO-OP ⇒ +0 (đúng gốc "phiên-có-làm-HEAD-đổi", giữ khai). Thực-tế hook chạm WAL gần như mọi phiên nên hiếm; đừng đọc counter thành "số phiên tuyệt-đối".

(b) 3-ĐIỀU-KIỆN — FAIL-LOUD vs SQUASH-BENIGN (v2 @S141, khuôn ①a hub APPROVED; canonical wording = .claude/governance/.session-counter.json → _contract.fail_loud_on_regress, B1 — bước này mô-tả nghi-thức, đừng chép ngược): 🔴 KHÔNG còn luật cũ "not-reachable ⇒ báo ngay". PHÂN-LOẠI TRƯỚC, rồi mới quyết:

  1. 🔴 counter LÙI (giá-trị đọc được THẤP HƠN giá-trị đã lưu) → FAIL-LOUD BÁO ANH, KHÔNG silent-reset, CẤM tự chữa. Counter lùi = file bị rollback/sửa tay; reset lặng sẽ giấu mất khoảng nhịp đã trôi.
  2. last_ticked_head không reachable từ HEAD (git merge-base --is-ancestor <last_ticked_head> HEAD exit ≠ 0) NHƯNG object VẪN TỒN-TẠI (git cat-file -t <last_ticked_head> in ra commit) counter KHÔNG lùisquash-benign: append 1 dòng vết vào history[] với event-class squash-benignĐI TIẾP, KHÔNG báo anh. Vì sao hợp-lệ: closeout squash nhấc đầu-tick mỗi chu-kỳ ⇒ drift KỲ-VỌNG, không phải mất dữ-liệu; nhãn-phiên cũ còn nguyên = corroborate (2 nguồn khớp mới cho đi tiếp).
  3. 🔴 object MISSING (cat-file -t fail — sha không còn trong repo) HOẶC counter lùi → FAIL-LOUD như cũ (báo anh, KHÔNG silent-reset). 🔴 Ranh 2 tầng (đừng gộp): contract runtime (b) này = RĂNG THẬT, chạy trong nghi-thức, độc-lập detector. Lưới governance-detectors.ps1 H24-5 counter-ancestor-classify (co-land S141) soi CÙNG 3 nhánh trên nhưng INFORM-only, KHÔNG vào TOTALKHÔNG được coi là thay thế (b); detector chết vẫn KHÔNG làm mất FAIL-LOUD.

(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 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 = counter/light/deep/OVERDUE thay dòng H24 cũ). 🔴 probe KHÔNG chặn: lỗi → in probe-loi (khong chan) → đi tiếp. 🔄 HÌNH B @S149 (bookend-hoá light — spec qua gate W2): cặp soi-lead (lead-stale-auditor + lead-gap-auditor) spawn VÔ-ĐIỀU-KIỆN mỗi đầu phiên — KHÔNG còn cổng OVERDUE(light); OVERDUE(deep) GIỮ (deep-sweep theo deep_every). Cặp trả → ghi số bằng máy scripts/h24-signal-write.ps1 (đơn-vị tally = phiên-LOGIC: @open+@close gộp 1 quyết-định/class — FIX-1). ring2-audit AUTO sau cặp, PIN đích-danh run-folder tươi (cấm glob-latest — carve-out §A1). Luật sống canonical ở session-end §L.b(j)(ii) — B1, mục này chỉ ÁP, không chép phạm-vi. 🧊 Bản S146→S149 = "auto khi tới nhịp"; đảo @S149 theo direction anh "chạy đc VIPIX, AI_INFRA" (lineage đầy đủ ở §L.b(j)(ii)). 🔸 Phạm-vi 1 dòng (chống đọc nới): gỡ cổng NGƯỜI, giữ cổng NHỊP (h24_cadence) ⇒ gỡ CẢ HAI cổng cho cặp lightauto MỖI bookend, không chờ nhịp. Cổng NHỊP chỉ còn cho deep (deep_every). (vá FLAG-1 @S159 — bản trước ghi "giữ cổng NHỊP ⇒ auto khi tới nhịp, KHÔNG phải mỗi phiên", trái :269 cùng file và trái hành-vi đo được.) Khác bookend-hub (hub bỏ counter hẳn) — SE giữ counter để đo deep. ⚠️ 🧊 Vế "KHÁC sleep-check §2.1.2 (vẫn CONSENT)" hết hiệu lực @S152 — owner chốt "các vòng 1→5 auto luôn" ⇒ sleep-check CŨNG AUTO-khi-KÊU. Từ S152: cả 5 vòng (V1 tooling/harvest+ring1 · V2 soi-lead+ring2 · V3 trio · V4 nén-ngủ+ring4 · V5 floor/detector) đều AUTO, 0 cổng consent — vết M4 (in dòng trạng-thái + WAL khi skip) giữ cho MỌI vòng; auto ≠ chạy-chìm, auto ≠ chạy-mù (fail-safe NO-OP khi thiếu input giữ nguyên). (Lineage cổng-consent: trio gỡ @S151 · sleep gỡ @S152 — đây là cổng consent CUỐI CÙNG của 5 vòng.)

🔴 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 là drift mà 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đ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).

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 (B1 — KHÔNG chép contract vai vào đây).

  • (a) 🔄 AUTO 1 VÒNG/PHIÊN — vị trí GIỮA 2 bookend (owner chốt @S151 2026-07-25, supersede consent-gate S141; ĐÂY = nhà canonical, session-end §L.b(k)(i) chỉ TRỎ): anh: "OK đồng ý, cứ đúng luật là tự làm, tao muốn có 1 vòng auto giữa 2 phiên bookend" ⇒ trio chạy TỰ ĐỘNG đúng 1 vòng mỗi phiên, vị trí = SAU bookend @open, TRƯỚC bookend @close — KHÔNG cần anh gật từng lần (HANDOFF #12 resolve theo hướng này; vòng auto đầu tiên = chính S151). Em-main vẫn IN 1 dòng trạng-thái trio-memory: auto-vong @S<nn> (giua 2 bookend) khi khởi chạy — hết consent nhưng KHÔNG chạy chìm. Đã chạy @giữa rồi ⇒ @close KHÔNG chạy lần 2 (đúng 1 vòng/phiên). 🧊 Lineage: consent-gated per-run (S141, khuôn 5-câu 58e28bae) → AUTO @S151 owner-direction. Vế cũ "sleep-check §2.1.2 VẪN CONSENT — 3 cổng không cùng khuôn" hết hiệu-lực @S152 (owner "vòng 1→5 auto"): nay cả 3 cổng cùng AUTO.
  • (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ƯỢTCẤM để vai tự đi tìm "run mới nhất" (vớ bản cũ ⇒ ĐẠT-ảo).
  • (e) Đóng-băng bề-mặt-đo: cửa-sổ chạy bộ-ba nằm TRONG Mirror C1 (§2.1.2) — KHÔNG ghi bề-mặt-đo giữa chừng; việc ghi phát sinh xếp hàng SAU verdict.
  • (f) Post-wave assertion: chạy xong 3 con → git status --shortkỳ vọng 0 tracked-change ngoài run-folder. Có thay-đổi lạ ⇒ vai đã ghi (residual-write) ⇒ báo anh + revert. (G-015: propose-only KHÔNG code-enforced ở kênh Bash — git-diff là backstop THẬT.) 🔴 TIMING quyết định răng (vá @S164 — harness-audit ESCALATE, xảy ra thật commit 7f55b4f): phép soát này PHẢI chạy TRONG CÙNG TURN với wave — Stop-hook wal-flush.ps1 fire ở turn-boundary và auto-commit 4 path (trong đó agent-memory/) ⇒ soát ở turn SAU = soát sổ đã bị hook nuốt thành wal: commit, backstop rỗng-hoá. Nếu lỡ boundary: soát bằng git log --name-only trên các wal: commit vừa sinh thay vì git status.
  • (g) KHAI ranh 2 cánh-tay (chống đọc nhầm thành "đo 2 lần"): script-arm = §2.1.2/§2.1.6/§2.1.7 (các script deterministic in SỐ) ⟂ sub-arm = bộ-ba (ĐỌC output script-arm rồi ĐO-lại/ĐỀ-XUẤT/CHẤM). Bộ-ba KHÔNG thay script-arm và KHÔNG re-implement máy đo.
  • (h) Đơn-vị nhịp: "phiên-LOGIC" của hub map TẠM = nhãn-phiên S<nn> của SE (SE chưa adopt session-logic — cùng caveat đơn-vị với counter §2.1.8). 🔴 KHÔNG thêm cadence-key vào memory-budget.jsonKHÔNG tick counter cho bộ-ba (nhịp bộ-ba ≠ nhịp H24 — trộn 2 đồng-hồ = hỏng cả hai).
  • (i) [M4] Vết 2 lớp — chuỗi skip PHẢI nhìn thấy được (giữ NGUYÊN sau khi bỏ consent @S151 — auto không có nghĩa là được im):
    • (1) dòng trạng-thái ở (a) IN CẢ khi Light/hỏi-đáp session. Light ⇒ skip CHẠY là hợp-lệ, nhưng CẤM skip IM-LẶNG.
    • (2) khi skip (Light HOẶC vòng không chạy được — 🧊 vế "anh không gật" retired @S151 cùng consent-gate) ⇒ ghi 1 dòng vết vào .claude/WAL.md: trio: skipped S<nn> (<ly-do: light | loi | ...>). Chuỗi skip dài ⇒ nhìn ra ngay ở WAL thay vì biến mất.

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.
  • Skill staleness audit: chỉ chạy theo lịch định kỳ (xem 2.4)

2.3 RAG + MCP health

  • mcp__rag-unified__list_projects — verify collection proj_solution_erp còn sống (chunk-count so LIVE với row "RAG chunks" trong docs/STATUS.md §CURRENT STATE — B1, KHÔNG chép số ở đây; 🧊 mốc cứng "~3076" cũ = thước hỏng, gỡ @S151 per stale FLAG-2/H1 F-7)
  • Chunk count + last_indexed_at delta (drift > 20% → flag AI_INFRA). ⚠️ Re-index = AI_INFRA op (charter v2, cần VOYAGE_API_KEY) — KHÔNG tự chạy bootstrap.py; SE stopgap = store_memory key facts.
  • Voyage rerank quota OK (verify 1 query có rerank_score)
  • Kiểm tra RAG chủ trì + sub: prompts đã store + đánh dấu re-rank đầy đủ chưa

2.4 Audit cadence

  • Monthly (ngày 1): skill + doc drift audit — thủ-công em-main session đầu-tháng (🧊 ghost-wire cron gỡ S100, CronList=0 — frontier P2 honest-retire). Next → docs/STATUS.md Maintenance backlog (canonical — B1, KHÔNG hard-date ở đây).
  • KHÔNG tự chạy audit ngoài cadence, trừ khi user yêu cầu hoặc drift nghiêm trọng
  • Check trạng thái audit định kỳ (đã audit chưa? kết quả ra sao)

2.5 Quy tắc consolidate MD/RAG (CRITICAL — đọc kỹ) [GENERIC — GIỮ NGUYÊN]

  • Thứ 1: Rất quan trọng, đọc kỹ lại quy tắc consolidate đúng cách, những thứ quan trọng KHÔNG đc cắt, chỉ phân tầng cho gọn lại, và xóa double. Phân tầng để các session sau đọc lại đúng chính xác context, không bị over context, rất quan trọng đấy.
  • Thứ 2: Nếu MD không có gì cần điều chỉnh thì KHÔNG cần phải cố gắng điều chỉnh, điều này cũng rất quan trọng.

2.6 Unit test check

  • dotnet test SolutionErp.slnx --nologo --verbosity minimal — verify count cho tính năng mới + bug fix gần đây.
  • Baseline hiện tại → docs/STATUS.md Tests row (canonical — B1, KHÔNG hard-count ở đây; H1 F-class fix S100). Phase 9 UAT mode: test-after feature (skip per chunk per feedback_uat_skip_verify), test-before BẮT BUỘC cho bug fix + critical algo. test-specialist owns; coverage gap backlog xem STATUS.

2.7 Cross-agent synthesis (post-audit) [GENERIC — GIỮ NGUYÊN]

  • Audit MD/RAG của sub-agent đã spawn, synthesize cross-agent learnings
  • Integrate vào: rules, architecture, gotcha, skill, daily, hand-off, DB, luồng DB, session log

Phase 3 — REPORT (plan status)

Đặt tên + tô màu cho Plan hiện tại đang chạy, kèm tiến độ + agent assignment:

Plan cha: [tên]
  Plan con 1: [tên]
    Task 1.1 — STATUS: 🟢 done | 🟡 in-progress | ⚪ pending
      - 🟦 investigator-codebase — phụ trách [a]
      - 🟦 investigator-api — phụ trách [b]
      - 🟨 implementer-backend — phụ trách [c]
      - 🟧 implementer-frontend — phụ trách [d]
      - 🟪 test-specialist — phụ trách [e]
      - 🟥 reviewer — phụ trách [f]
      - 🟩 cicd-monitor — phụ trách [g]
      - 👤 chủ trì — phụ trách [h]

🧾 MASTER-CHECKLIST (khuôn CHUNG — VIEW derive tươi từ WAL · STATUS · HANDOFF · ACTIVE-MARKS; KHÔNG file nguồn): in KÈM work-state §2.1.5 (GIỮ NGUYÊN làm NGUỒN — REPORT trỏ nó, KHÔNG nhân-bản).

  • Tầng-1 — mỗi arc/đầu-việc-lớn 1 dòng {đóng · đang · chưa} (nguồn: STATUS.md Phase-line + Plan cha/con + WAL goal).
  • Tầng-2 — 4 nhóm:
    1. xong — WAL [x] + Recently-Done phiên này.
    2. đang-dở + breakdown (đã-xong-gì / đang-giữa-gì / còn-gì) — WAL [!] + chain evidence.
    3. chờ-anh — 🔢 BẮT BUỘC ĐÁNH SỐ (anh trả lời bằng số) — HANDOFF NEXT-anh + ⚑ pending-decisions + mark treo.
    4. chưa-làm / hẹn-cuối-phiên (tách từng khoản) — WAL [ ] + NEXT-em. 🔴 Checklist = VIEW derive tươi — CẤM tạo file checklist nguồn-đôi (sàn-3).

SOLUTION_ERP report

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

Phase 3.5 — Ctx soft-memory @open (adopt thư 0df10df4 @S153 — sàn khoản 1 "ghi tươi ở cửa mở phiên"; 🔴 ăn từ phiên sau restart CLI)

"Trước tiên" = trước lần dừng đầu tiên (hub §2: đặt CUỐI nghi-thức mở — nội dung giàu nhất chỉ tồn tại SAU khi các vòng kiểm đã báo xong). Vết ủy quyền 4 quyết (35)(36)(37)(38): OWNER-DELEGATED → ENGINE-PROPOSED → LEAD-DECIDED @S153 (memory-budget.json → _mind_ctx_kb_set); anh veto = 1 edit.

  1. Lead Write _mind-s-<N>.md từ session-mind-template.md — block-0 nội-dung THẬT (≥1 thứ máy-khuôn-không-tự-sinh: tên 1 ý D / 1 E-verdict — metadata ts/hash KHÔNG tính): A findings bootstrap · B hướng phiên + vì-sao + nhánh-đã-loại · C delta bản-đồ suy-nghĩ · D carry ý-treo từ _mind phiên trước + ý mới anh vừa nêu (+nhãn) · E dòng-sống wave @open.
  2. python scripts/session_ctx.py mind-check --session <N> (~140-300ms; TRƯỢT ⇒ sửa trước khi đi tiếp).
  3. Spawn ctx-audit @open (vai-3 vòng Ctx — AUTO hình-B, INFORM-only — máy TRƯỚC vai: bắt lỗi rẻ trước, đốt tiền sau) — PIN path _mind + run-folder bookend; lead scribe sub-ctx-audit-open.md NGAY khi trả + seed diary agent-memory/ctx-audit/ CÙNG lượt (C11(b) sẽ FLAG diary-0-delta nếu quên — datum T3 @S153).

🔄 OWNER-VETO @S153 — hub-form 3-vai (anh bác (38)(a), chốt "Build đủ 3 vai như hub"): vòng Ctx = ctx-curator (vai-1, KIỂM nháp @MỖI /pause — carve-out pause.md §1, wire @pause.md §2.6(C-bis)-2bis) · ctx-verifier (vai-2, ĐỐI-CHIẾU+NẠP @MỖI /tiep — wire @tiep.md §3-ter) · ctx-audit (vai-3, SOI-CHUỖI 2 đầu — đây). Núm hạ tần suất vai-1/vai-2 = quyền anh (1 câu).

Trigger sau Phase 3: Em main đợi user input task cụ thể. Sub-agent spawn theo decision tree khi ACCEPT criteria match.