Files
solution-erp/.claude/commands/session-end.md
pqhuy1987 384292876e [CLAUDE] Docs: dong W5 + W4b — het wave chay duoc ma khong can chu du an phan
Tiep chuoi adap 7-GD. Sau luot nay: 7/10 wave DONG.

W5 (GD-5):
- Va spawn-model-audit.ps1 4 ve. Bug that nang hon spec ta: 5 phien gan
  nhat deu wf=0 => may thay 0 lane ma van in "TOTAL FLAGS: 0". Sau va:
  phien S180 = 24/24 lane, co mau so, co dong KHAI khi phien do != moi nhat.
  Fault-inject 2 chieu tren cay tam (workflow-only + flat-only).
- D-3: hmw.js sentinel MODEL_INHERIT, het nhanh undefined-im-lang.
- D-10 + D-12: harness-11-engine PHAN O. D-11 nay 4/5 (manh 5 = P7 ve ii).
- §6 tracking: khai lam-KHAC/manh-hon 5 dong, khong tu phong "da kiem chung".

W4b (GD-4, P8 + P4):
- Luat cham diem = harness-11-engine PHAN P, 5 khoan BAT BIEN.
- Khoi cham wire 2 cua phien + rao KHONG DO DUOC + INFORM-only >=3 phien
  + tach do-day-du-khi-chay (cong may) voi tan-suat (quyen chu du an,
  CAM tich no) theo thu hub 2026-08-07.
- P4: cap 20->30 du 2 mirror => slot (75) DONG (28 vai <= 30, het LOUD-skip).
- 2 vai moi score-counter (tang-2) + score-count-auditor (tang-3), ranh cung
  viet thang vao persona. Seed measured{} VA thu muc nhat ky - may soi ten
  bat lead seed nua voi (thieu nhat ky => mfe-eval loai vai khoi phep do).

Khai thang: acceptance W4 o-1 grep '^ST-' = 0 vi so dang BANG (dem dung dang
= 2, dat ve chat); khong be bang de chieu regex. 2 vai moi + khoi cham chi an
tu RESTART ke.

Con lai: W3b (cho soak >=1 phien), W5b (cho P7 ve ii), W6 (moc ky cua anh).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 21:45:06 +07:00

73 KiB
Raw Blame History

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

Trigger cuối session. Em main chủ trì, gọi lại sub-agent đã spawn. ⚠️ Harness note (F2 re-verified S100): SendMessage khả dụng lại, NHƯNG flush-flow GIỮ NGUYÊN — agent đã tự update MEMORY khi return (BẮT BUỘC trong agent frontmatter) → em main đọc MEMORY on-disk để synthesize, KHÔNG cần re-spawn/SendMessage chỉ để flush.

📋 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-6 + 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. 🔴 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.

📋 BƯỚC 0.5 — Kéo thư cross-project (cửa RA 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) — TRƯỚC Phase 1 FLUSH.

🔗 Luật nhịp đầy-đủ = canonical check-email.md §"Nhịp chạy — 4 CỬA PHIÊN". 🔴 B1 — CHỈ TRỎ + GỌI, CẤM chép luật. 🔴 Vì sao TRƯỚC flush, không sau: closeout ghi sổ (STATUS · HANDOFF · session-log · carry). Thư về sau khi sổ đã ghi thì lỡ mất kỳ này và nằm chờ tới cửa vào kế. Kéo trước ⇒ thư mới kịp vào đúng bản ghi của phiên. 🔴 KHÔNG chặn closeout: lỗi ⇒ check-email loi (khong chan) → đi tiếp Phase 1. Sàn-2 sentinel ở BƯỚC 0 đã đặt TRƯỚC bước này ⇒ cắt giữa chừng vẫn phát-hiện được.

Phase 1 — FLUSH (sub-agent memory)

Điều kiện: Chỉ xử lý con đã spawn trong session. KHÔNG spawn mới chỉ để flush (agent đã update MEMORY khi return).

  1. Đọc MEMORY.md update của sub-agent đã spawn (Tiered L1 HOT):

    • 🟦 investigator-codebase — research findings + audit results + schema/count grounding
    • 🟦 investigator-api — external docs/CVE/lib eval + cross-project port + RAG fleet
    • 🟨 implementer-backend — BE patterns applied + scope refusals (ACCEPT vs REFUSE)
    • 🟧 implementer-frontend — FE mirror SHA256 + Pattern 16-bis 4-place + KIND_CONFIG
    • 🟪 test-specialist — test bundle added + coverage gap + spec drift detected
    • 🟥 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>/ (DUAL-ACCEPT — xem §L.b(f)) (chạy ở §L.b(d)(f))
    • 🔷 lead-stale-auditor (monitor H24) — view LỆCH source của cái LEAD surface (🔴 VÔ-ĐIỀU-KIỆN mỗi bookend §L.b(j)(ii); chỉ deep theo nhịp — vá FLAG-1 @S159)
    • 🔶 lead-gap-auditor (monitor H24) — cái BỊ THIẾU trong cái LEAD surface (🔴 VÔ-ĐIỀU-KIỆN mỗi bookend §L.b(j)(ii); chỉ deep theo nhịp — vá FLAG-1 @S159)
    • 🔬 ring1-audit (monitor KIỂM-vòng, C4 S145) — verify OUTPUT H1+H2 vòng tooling/harvest (AUTO sau đo §L.b(g-bis)) · vai #1/3 round-KIỂM
    • 🔬 ring2-audit (monitor KIỂM-vòng, C4 S145) — verify OUTPUT lead-stale+lead-gap vòng soi-lead (AUTO sau cặp H24 — @§L.b(j)(ii-bis) nếu cặp nổ ở close, @session-start §2.1.8 nếu cặp nổ ở open; wherever it fires) · vai #2/3
    • 🔬 ring4-audit (monitor KIỂM-vòng, C4 S145) — verify OUTPUT /sleep-recovery gist+Fidelity vòng nén-ngủ (AUTO sau mỗi lượt nén /sleep-recovery-memory-l2 — post-step của skill, wherever it fires: AUTO-khi-KÊU @session-start §2.1.2 HOẶC @§L.b(c) dưới — owner @S152 "vòng 1→5 auto", 🧊 consent retired) · vai #3/3

      🧊 Vá con-trỏ chết @S146: bản trước trỏ "Phase 4.5" — heading đó KHÔNG tồn-tại trong file này (chỉ có Phase 1 · 1.5 · 2 · 3 · 4 · 5 · 6). Trigger THẬT = lượt nén, không phải một phase cố-định.

  2. Synthesize cross-agent learnings → integrate vào:

    • User auto-memory MEMORY.md (index — append entry mới, KHÔNG rewrite)
    • docs/rules.md, docs/architecture.md, docs/gotchas.md, docs/database/, docs/flows/
    • rules, architecture, gotcha, skill, daily, hand-off (docs/HANDOFF.md), DB, luồng DB, session log (docs/changelog/sessions/)

Phase 1.5 — §L AUTO-MAINTAIN (Gov-v2 keystone — deterministic, KHÔNG daemon)

Artifact home = docs/governance/error-ledger.md (RCA + Active-Guards index + 3-ledger triad mapping). G-015: đây là step lead chạy ở session-end, KHÔNG phải daemon tự-động-vô-điều-kiện.

§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á guard/eval-case). List AS mở — gặp class mới thì thêm.

§L.b — auto-maintain (a)→(k) (đủ 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) · (k) = bộ-ba đồng-kiểm memory (S141):

🔸 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: 🔒 Đóng-băng bề-mặt-đo (C1 — 2 câu, S138): "Từ lúc chạy script đo đầu-tiên của khối (c) tới verdict cuối: KHÔNG ghi vào bề-mặt-đo = .claude/agent-memory/** + .claude/governance/{.session-counter.json, ACTIVE-MARKS.md} + docs/{STATUS,HANDOFF,gotchas}.md + docs/governance/error-ledger.md + docs/changelog/migration-todos.md + .claude/agents/*.md + runs/*/run.md; việc ghi phát sinh giữa chừng → xếp hàng SAU verdict. Ngoại-lệ: .claude/WAL.md (ngoài vùng đọc cả 5 script đo) + state-write của chính bộ-đo (.mfe-state.json)." · agent L1 >~30KB → archive L2 · error-ledger open-entry quá ngưỡng · 0-byte memory check (AS-8) · 🌙 sleep-check (Harness-10b, S72): trigger chuẩn = shard-count @S144 (distill-shard-probe.ps1; vế 7d/last_sleep_at = ghi-chú phụ) → KÊU ⇒ 🔄 AUTO chạy /sleep-recovery-memory-l2 (owner @S152 "vòng 1→5 auto" — 🧊 INFORM-consent superseded; vết M4: in dòng + WAL nếu skip) + 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 đặt ngưỡng byte sau, 🔴 KHÔNG bịa số (giữ INFORM 7-ngày — DP-5 quyền owner cục-bộ) · 🗜️ 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. 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): 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 — 🔄 AUTO MỖI CLOSEOUT (Harness-16 §H; owner slot (72) @S172 "OK đồng ý" — 🧊 opt-in-qua-từ-khoá eval RETIRED): chạy powershell.exe -ExecutionPolicy Bypass -File scripts/mfe-eval.ps1 vô-điều-kiện 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.

    🔴 Vì sao gỡ opt-in — tiền-đề SAI đã ăn cả một nhánh lập-luận (harness-audit @S172): harness-eval khai trục MFE N/A — không chạyharness-refine fail-closed toàn bộ lớp-① reinject = 0 + E3 "vì MFE trắng 2 kỳ". harness-audit tự chạy thì mfe-eval.ps1 exit 0, bảng đủ 23 role — tức nó CHẠY ĐƯỢC suốt, chỉ là không ai gọi. Datum bị chôn theo: implementer-frontend 11/13 = 85%, role duy nhất dưới 100%. ⇒ một trục tắt vì cổng-từ-khoá đọc y hệt một trục lành, và nó im lặng vô-hiệu-hoá cả nấc ĐỀ-XUẤT ở dưới. Cùng lớp feedback_absence_looks_like_clean. 🔴 Hệ-quả bắt buộc cho (k)(v): khi MFE nay LUÔN có số, con ĐO KHÔNG được khai trục #18 là N/A nữa — thiếu số thì phải khai không đo được + lý do, không phải N/A. · 🔁 H17 loop-REFINE (§I, S95 — harness-11-engine.md §I): 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 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.

    • 🧬 memory-triple artifact (Item 3-bis S135 — B2 vòng-3 lên CHỨC-NĂNG; 0 vai mới, 0 script mới): khi chạy khối (c) memory-maintenance ở trên, ghi các dòng artifact tuần-tự (prefix memory-triple — đếm từ khối dưới, KHÔNG chép số vào nhãn per B1 dòng-đầu §L.b) vào session-log (docs/changelog/sessions/) — run-record: 3-stage đo→đề-xuất→kiểm + do-record (governance-detectors TOTAL · nhịp-nợ 4-vế, +S138):
      memory-triple: do=<scripts/measure-agent-memory.ps1 · exit N>
      memory-triple: de-xuat=<scripts/memory-archive-gate.ps1 DRY · exit N>
      memory-triple: kiem=<scripts/mfe-eval.ps1 | reviewer · verdict>
      memory-triple: do-record=<governance-detectors TOTAL=n>
      memory-triple: do-record=<nhip-no 4-vế>
      
  • (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):

    🔓 UỶ-QUYỀN THƯỜNG-TRỰC (owner slot (71) @S172, nguyên văn: "gom và sleep thì auto nhé, tự quyết"): GOM (harvest / retro-harvest) và NÉN-NGỦ (/sleep-recovery-memory-l2) từ nay là AUTO — lead TỰ QUYẾT, KHÔNG hỏi từng lần. Áp cho cả nợ tồn phiên trước. CẤM để nợ harvest nằm lại chỉ vì chưa hỏi được owner. 🔴 Hai rào KHÔNG được nới theo: (1) đo NỘI DUNG trước khi gom, không đo TÊN FILE — @S172 detector-theo-tên vu oan S159-bookend-open (10/10 vai đã landed, ring1 chứng 4/4 byte-exact) trong khi bỏ sót 2 nợ thật; gom nhầm một folder dương-giả = đẻ entry TRÙNG trên 10 sổ, hại hơn không gom. (2) nén vẫn theo trigger máy (distill-shard-probe.ps1), auto không có nghĩa nén sớm — @S172 probe pending=1/nguong=15 ⇒ IM nên không nén, và đó là quyết định đúng. 🧾 Vết đã trả @S172: gom trọn 11 vai / ~306 KB — S168-bookend-close 6 vai (162.916 B) · S171-khkk-ui-mirror-pe 4 vai + reviewer×3 lens (143.682 B) · cicd-monitor 2 sha a2bbcb9+b5799fc (nợ mở 3 phiên từ chính finding S162 của H2). Sau gom: 0/23 vượt soft-cap. 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 DUAL-ACCEPT, xem dưới) HOẶC chưa đủ 5-trục thì CHƯA đóng.

    • 🔴 DUAL-ACCEPT (S123) — định-nghĩa CANONICAL ở 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). ⚠️ 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.

    • 🧊 dạng-3 (## synthesis trong THÂN run.md) RETIRED @S123 (anh chốt) — KHÔNG còn nhận. 🔴 LUẬT retire: gỡ nhánh legacy khi tập di-sản RỖNG; giữ khi CÒN người thụ-hưởng. Đo trước khi gỡ (2 phép độc-lập, khớp): dạng-3 → 0 folder (cả 6 folder từng dựa nay đều có flat sau 22ea8c5) ⇒ gỡ; dạng-2 → 5 folder S71GIỮ. (Bản đầu S123 viết lý-do là "doc cấm mà máy vẫn nhận ⇒ gỡ" — SAI: áp cho dạng-2 thì cũng phải gỡ ⇒ 5 folder thành orphan ⇒ ép rewrite history mà C8 cấm. Reviewer bắt.)

    • 🔴 Nhận ≠ cho phép: DUAL-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-1workflows/README.md:17 thiết-kế tên file mang nghĩa (RAW sub- ⟂ VERIFIED -synthesis.md). @S123 hết cần nhớ để NÊU: run mới ghi dạng-3 ⇒ máy FLAG orphan ngay (luật và máy nói cùng một câu).

    • 🔸 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 HOẶC 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).

      # SINH = commit ĐẦU-TIÊN chạm folder (KHÔNG phải commit cuối)
      for d in .claude/workflows/runs/*/; do
        id=$(basename "$d"); [ -f "$d/run.md" ] || continue
        born=$(git log --format=%cI -- "$d" | tail -1)          # 🔴 tail -1 = ĐẦU-TIÊN
        [ -z "$born" ] && born="9999"                            # chưa commit ⇒ sinh phiên này
        [[ "$born" > "$SESSION_START" ]] || continue
        # 🔴 `|| true` KHÔNG `|| echo 0`: grep -c đếm 0 vẫn IN "0" rồi exit 1
        #    ⇒ `|| echo 0` bắn THÊM một "0" ⇒ output "0\n0" ⇒ vỡ số-học. Xem bug-3 dưới.
        w=$(grep -c "run=$id" .claude/WAL.md 2>/dev/null || true)
        s=$(grep -rho "run=$id" docs/changelog/sessions/ 2>/dev/null | wc -l)
        hit=$(( ${w:-0} + ${s:-0} ))
        [ "$hit" -eq 0 ] && echo "SÀN-5 LỆCH: run=$id sinh $born nhưng 0 marker (WAL+session-log)"
      done
      

      🔴 2 BUG lead tự mắc khi viết Sàn-5 @W3, Sàn-5 TỰ BẮT ở lần chạy THẬT ĐẦU TIÊN @S122 — ghi lại vì chúng là lý-do 2 luật dưới tồn-tại:

      1. Đo sai CỘT: bản đầu dùng git log -1 --format=%cI = commit CUỐI chạm folder ⇒ bắt "folder bị SỬA phiên này" thay vì "folder được TẠO phiên này". Đo thật: folder S112-pe-signoff-close-review (tạo 07-12) trả về 07-15 vì W3.0 vừa thêm synthesis vào nó ⇒ 9 dương-giả / 9. ⇒ PHẢI | tail -1 (commit đầu-tiên = lúc sinh).
      2. 🔴 BẪY grep -c — lead dính LẦN THỨ BA trong CÙNG MỘT PHIÊN: bản vá đầu viết $(grep -c … || echo 0). grep -c đếm 0 thì IN "0" trả exit 1|| echo 0 bắn THÊM ⇒ output "0\n0"$(( … )) syntax error. 🔴 Lead đã ghi chính bẫy này vào §5.0 ghi-chú (a) gửi hub trong adap-request R2(β)cùng phiên — rồi vẫn viết || echo 0. ⇒ Bằng-chứng thứ ba trong ngày cho: bài-học viết ra / nạp vào context KHÔNG tự chặn được gì; chỉ LUẬT SOI-ĐƯỢC mới chặn. Đúng: n=$(grep -c … || true) (grep vẫn in "0", || true chỉ nuốt exit-code).
      3. 🔴 Soi sai CHỖ (nặng hơn — lỗi CẤU-TRÚC): bản đầu chỉ grep WAL. Nhưng WAL là sổ ghi-đè ≤40 dòng, và marker wf: bị xoá NGAY khi việc xong ([!] wf: run=…[x] … XONG). Sàn-5 chạy cuối phiên ⇒ lúc đó marker đã biến mất từ lâusoi một cái sổ tạm đang co lại, để tìm dấu vốn được thiết-kế để xoá điKHÔNG THỂ đúng. Spec v1:120 đã ghi "WAL/session-log" — lead rớt mất nửa sau ngay khi viết chính mục này. ⇒ session-log = append-only, vĩnh-viễn ⇒ đó mới là chỗ dấu BỀN nằm.

      Hệ-quả BẮT BUỘC: run RUN-TRACE PHẢI được ghi 1 dòng wf: … run=<id> vào session-log (docs/changelog/sessions/), không chỉ vào WAL. WAL = sổ tạm cho /tiep; session-log = sổ cái cho hậu-kiểm.

      🔴 Scope theo git %cI, 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. 🔸 Sàn-5 là informational — chính vì thế nó an-toàn để sai, và cái sai đó đã trả giá bằng việc tự lộ 2 bug ở lần chạy đầu. Nếu nó là cổng-chặn thì 9 dương-giả kia đã chặn cả phiên.

  • (j) 🔷🔶 H24 lead-self-audit — counter luôn tick · cặp light spawn VÔ-ĐIỀU-KIỆN mỗi bookend · chỉ deep theo NHỊP (adopt S122 · hình B S149 · vá FLAG-1 S159; đối-xứng session-start §2.1.8):

    • (i) BÁO dòng-nợ 4-vế (nâng dòng H24 cũ — Item 2 S135): gọi powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1 → in 1 dòng NHIP-NO: kiem light a/e deep b/f <ok|OVERDUE:…> | tran-bo-nho x over-cap | run-chua-gom y (vế-1 nhịp-kiểm THAY dòng counter=… light … deep … OVERDUE cũ, đọc .session-counter.json + h24_cadence). 🔴 probe KHÔNG chặn: lỗi → in probe-loi (khong chan) → đi tiếp. 🔴 Nhịp ĐỌC từ config, CẤM hardcode ở đây (detector governance-detectors.ps1 H24-2 fail-loud nếu key thiếu — không giả-định default).
    • (ii) 🔄 HÌNH B — cặp soi-lead BOOKEND VÔ-ĐIỀU-KIỆN @close (đảo @S149; spec runs/2026-07-24-S149-hoi-tu-bookend/spec-…md qua gate W2 GO-WITH-FIXES): spawn cặp (lead-stale-auditor + lead-gap-auditor) MỌI closeout, KHÔNG cổng nhịp light, KHÔNG consent. Cặp trả FLAG-list (khuôn ## FLAG-N — \class` — SEVbắt buộc — M4/C11 soi) → ghi số bằng **MÁY**:powershell.exe -ExecutionPolicy Bypass -File scripts/h24-signal-write.ps1 -Session S -Flags '<class,class,…>' -AuditKind light(procedural max-1/class/phiên · enum-đóng · atomic · 🔴 tôn trọng_frozen_until_owner` — dải JUMP treo {4,3,3} KHÔNG bị máy reset, nợ của owner).
      • 🔴 Đơn-vị tally = phiên-LOGIC (FIX-1 W2): 2 lượt bookend (@open+@close) cùng phiên = MỘT quyết định/class — fire nếu fire ở ≥1 đầu; reset chỉ khi clean CẢ HAI đầu, ≤1 lần/phiên (script thi hành, không phải trí nhớ).
      • Deep GIỮ CỔNG NHỊP (deep_every đọc memory-budget.json, OVERDUE(deep) → deep-sweep như cũ). light_every hạ thành stats-only — GIỮ SỐ (owner-ratified e50a4bd0), đổi VAI TRÒ (cadence→stats, khuôn era-note VIPIX :155). ⚖️ Anh veto ⇒ light quay lại counter-gate, 1 edit.
      • 🧊 LINEAGE (đảo có chủ đích, giữ vết — khuôn auto-toan-vong:35): bản trước (S146→S149) = "auto KHI TỚI NHỊP, KHÁC bookend-hub, SE chưa theo" + câu mời "anh muốn ĐÚNG bookend thì nói 1 chữ". Chữ đó = direction @S149 ("vá lỗi… để chạy đc VIPIX, AI_INFRA") → hình B (VIPIX hybrid) qua invest-Fable + gate reviewer-Fable; lý-do-giữ-counter cũ (adap-report 07-15 §(2)) superseded cho light, còn ĐÚNG cho deep.
      • ⚖️ Đánh-đổi khai thẳng: mỗi closeout nặng thêm 2 sub (~50-80K token/con) — đổi lấy cả lớp bug đọc-số-cũ chết by-construction (backfill S146 · tally-rơi S148 · JUMP-chìm — cả ba là ca THẬT phiên này).
    • (ii-ter) 🩺 sentinel + eval-use + diary-seed (M5/M7/M9 @S149 — chạy SAU (ii), TRƯỚC commit chốt):
      1. M5 sentinel: sau commit closeout → powershell.exe -ExecutionPolicy Bypass -File scripts/closeout-sentinel.ps1 -Commit <sha-closeout> -AuditRan — FLAG "audit đo rồi như chưa đo" nếu closeout thiếu delta role-dir/counter (positive-control 5/5 lịch sử @S149).
      2. M7 eval-USE-side (đóng DEFER C14-2.4): powershell.exe -ExecutionPolicy Bypass -File scripts/applied-eval-nokey.ps1 -Selftest → selftest 3/3 rồi đọc output nhãn {APPLIED · DORMANT(≠MISS) · chờ-judge}; caveat "% = FLOOR không ceiling" nằm TRONG payload — chép nguyên, cấm rút gọn. Ghost-wire 18-ngày (0 call-site) chết tại dòng này.
      3. M9 diary-seed on-behalf (GAP-3 ×4): vai INFORM-only nào CHẠY trong phiên (có sub-MD/return VERIFY được) ⇒ lead APPEND diary vai đó TRONG CÙNG closeout (B3; tiền lệ retro-harvest S132 + seed ring2-audit S149). Detector C11(b) soi sót. 3-bis. C2 checklist artifact-vs-entry (wire @S164 — quyết-định lead @S163 PAUSE-1; nguồn = H2 P5 + chuỗi seed-rớt ~1 vai/lượt S153·S158·S162): M9 tồn tại từ S149 mà vẫn rớt 3 lần vì chạy bằng TRÍ-NHỚ — thay bằng PHÉP ĐẾM 2 cột TRƯỚC commit chốt: cột-A = tập VAI có artifact phiên này (ls runs/<run-của-phiên>/sub-*.md → rút tên vai) · cột-B = tập vai có entry mới trong agent-memory/<vai>/MEMORY.md (grep nhãn ## S<nn> phiên này). 🔴 AB ≠ ∅ ⇒ seed on-behalf NGAY (quay lại M9), CẤM commit closeout khi hiệu còn phần-tử. H2 3-phân-loại-lại: 11/23 vai bị luật CẤM tự-ghi ⇒ lead-seed là ĐÚNG thiết kế, bệnh ở bước seed thiếu phép đếm ép — KHÔNG sửa bằng "bắt vai tự ghi". 🔸 Vế "luật END-line" của H2-P5 CỐ Ý KHÔNG wire ở đây — đó là slot (44) chờ anh (chưa từng được hỏi, xem HANDOFF).
    • (ii-bis) 🔬 ring2-audit AUTO sau cặp H24 (vai-KIỂM vòng soi-lead, C4/C4b vai #2/3, land S145): cặp H24 (lead-stale-auditor + lead-gap-auditor) CHẠY xong ⇒ spawn ring2-audit NGAY — AUTO, KHÔNG consent (owner S145; 🧊 vế tương-phản cũ "KHÁC (ii) consent-gate của chính H24" ĐÃ SỤP @S146 — (ii) nay cũng AUTO, xem :106). Đọc FLAG-list + class 2 vai → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count / class_repeat) + thách-CLEAN (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót). 🔴 no-self-exempt ≠ lead-stale/lead-gap (m-3). 🔴 Fail-safe: H24 KHÔNG chạy phiên này (chỉ còn: chưa tới nhịp — nhánh "không consent" chết @S146) ⇒ ring2-audit NO-OP im-lặng. Tuần-tự C4b (SAU cặp H24, mtime chứng). Propose-only → em main VERIFY→APPEND (git-diff backstop). Contract canonical .claude/agents/ring2-audit.md (B1).
    • (iii) Flag → class: mỗi FLAG của 2 vai PHẢI thuộc enum ĐÓNG lead_self_audit.flag_classes. Vai KHÔNG tự chế class — finding không phân-loại được ⇒ báo verbatim + escalate anh để mở rộng enum. Cập-nhật class_repeat.counts; class nào lặp jump_on_class_repeatké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 ≡ 10 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ấutuổi thật ≥2, máy đọc 1. ⇒ detector vacuous về CẤU-TRÚC, không phải sai ngưỡng. 🔴 Không retrofit dấu vào segment CŨ (§Q3 no-retrofit) ⇒ đường DUY NHẤT còn lại = re-stamp từ nay về sau; tuổi sẽ đo đúng từ S122 trở đi, và khai thẳng rằng carry mở trước S122 có tuổi đo-thiếu. Định-nghĩa "dòng-carry" (owner O3): = đoạn LOGIC NEXT anh / NEXT em trong mega-line — KHÔNG phải dòng vật-lý. ⚠️ Bẫy đếm: grep -c đếm DÒNG (=1 trên mega-line), grep -o | wc -l đếm occurrence (=n). Dùng đúng cái thứ hai. 🔢 Luật đánh-số chờ-anh (điểm sàn #5 master-checklist cadd24ae, S138 — rename S139 tránh trùng token "Sàn-5" H22 ở trên, quyết anh + L3 nit-1): khối chờ-anh trong HANDOFF LUÔN đánh số (anh trả lời bằng số) — khớp nhóm-3 MASTER-CHECKLIST + nghi-thức re-stamp carry ở trên; số cố-định giúp anh trả lời gọn.
    • (v) 🔷 TICK-at-close (Item 1(d) S135 — idempotent): tick .claude/governance/.session-counter.json theo contract🔴 CON-TRỎ session-start §2.1.8, CẤM chép logic tick (B1). Idempotent: cùng nhãn-phiên phiên này ⇒ NO-OP (nếu /session-start hoặc /tiep đã tick nhãn này). Có delta → §5.1 add đích-danh counter-file (file ngoài hook-4-path; bằng-chứng sống: tick S133 nằm uncommitted qua 2 closeout liên tiếp — M-7).
    • (vi) 🔥 Force-fire bù khi closeout gộp sổ (Item 3 S135 — floor B1 §3.2): đếm P = số wal: pause gộp vào closeout này: P=$(git log --format=%s "<closeout-liền-trước>..HEAD" | grep -c '^wal: pause' || true)<closeout-liền-trước> = commit gần nhất match regex closeout DÙNG CHUNG Item 4 ^\[CLAUDE\] Docs: S\d+.*(closeout|session-end) (1 regex, đừng chép 2 bản). 🔴 so-sánh SỐ, KHÔNG dùng exit-code (grep -c trả exit 1 khi đếm 0 — §5.0 (a)): [ "$P" -ge 1 ]. Nếu P >= 1 HOẶC nhãn đóng dạng S<a>-S<b> (closeout gộp nhiều phiên) ⇒ coi như OVERDUE(light) bất-kể counter → in dòng-nợ (qua (i)) + INFORM-BẮT-BUỘC anh + đề-xuất spawn cặp H24 (lead-stale-auditor + lead-gap-auditor) NGAY closeout này. 🔴 DP-3 consent-gate ĐÃ GỠ @S146 (owner "3 → auto") — force-fire nay CHẠY THẲNG: in dòng-nợ (qua (i)) + spawn cặp H24 NGAY trong closeout, KHÔNG chờ gật. Đồng-bộ (ii) ở trên (B1 — luật sống ở (ii), mục này chỉ áp). 🧊 (Luật cũ era-S122: "INFORM-bắt-buộc + đề-xuất, anh gật mới chạy" — RETIRED. Hệ-quả kèm theo: báo hub SELF-CHECK ô3 nay là PASS trần, KHÔNG còn carve-out "(consent)" — carve-out đó sinh ra CHỈ vì cổng người, gỡ cổng thì gỡ luôn carve-out.) baseline-ghi-bù (phép-8 annex dede7ec5, khai-1-lần): cơ-chế force-fire bù closeout-gộp tồn tại từ 2026-07-17 (da349fc, S135 — re-đo 19:12:41+07). Phép-8 CHỈ tính FAIL cho closeout SINH SAU mốc; closeout trước = baseline hợp-lệ ghi n/a, KHÔNG đếm FAIL. Không lặp mỗi lần chạy.
  • (g) 🔌 tooling-freshness CHỐT (🟫 tooling-auditor H1 — Harness 1): spawn → chốt 4-mặt (skill·sub-role·plugin·docs) đổi gì session này + new-alloc audit (skill/plugin MỚI chưa phân-bổ → đề-xuất gán em main + sub phù-hợp vai) + flag doc-drift/roster-lệch/count-stale. Propose → em main APPEND/sửa doc (single-writer). 🔴 G-015: 2 monitor = propose-only, em main VERIFY trước APPEND (Bash residual → KHÔNG "read-only enforced").

  • (g-bis) 🔬 ring1-audit — vai-KIỂM vòng tooling/harvest (C4/C4b adap dot-11 harness-dong-du-vong:51, owner-decision [2] TÁCH, land S145; đối-xứng (k) trio nhưng AUTO): đóng lỗ "vòng tooling/harvest 0 con soi" — vai-KIỂM độc-lập đọc OUTPUT H1 (g) + H2 (d)(f), KHÔNG re-chạy đo. Contract = canonical .claude/agents/ring1-audit.md (B1 — KHÔNG chép vào đây).

    • (i) 🔴 AUTO sau đo — KHÔNG consent-gate (owner-chốt S145; 🧊 vế tương-phản cũ "KHÁC (j) H24 + (k) trio" hết nghĩa: H24 AUTO @S146, trio AUTO @S151 — nay cả 3 vòng cùng AUTO): H1 (g) + H2 (d)(f) chốt xong ⇒ spawn NGAY, KHÔNG in dòng đề-xuất, KHÔNG chờ gật.
    • (ii) 🔴 Fail-safe NO-OP: H1/H2 KHÔNG chạy phiên này ⇒ pin input missing ⇒ vai in tooling/harvest round: no measure → NO-OP + DỪNG. Auto ≠ chạy-mù, CẤM ĐẠT-ảo.
    • (iii) 🔴 Tuần-tự (C4b): spawn ở invocation SAU (g)/(f); bằng-chứng mtime(return) > mtime(output H1/H2). KHÔNG song song.
    • (iv) Propose-only, lead single-writer: return verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + tự tái-dựng ≥1 số CÓ-THỂ-SAI + thách-CLEAN → em main VERIFY → APPEND (B3). Backstop = git-diff (G-015 — Bash residual → KHÔNG "read-only enforced").
    • (v) no-self-exempt (m-3 S139): vai ≠ H1/H2.
    • (vi) 🔴 D2 — KIỂM end-only (COMMIT DEFER, owner-option (b) S145 · landing @S146): CHỦ-ĐÍCH, KHÔNG phải bỏ sót. Luật 1 dòng (chép ĐÚNG câu này vào cả 3 contract vai-KIỂM): "KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close." Vì sao DEFER — 3 vế đo được (không phải "chưa kịp làm"):
      1. Nhịp "hai đầu" của khung 5-vòng buộc tầng ĐO có mặt 2 đầu (H1/H2 báo-diff @session-start — wired 2-đầu THẬT); nó KHÔNG buộc tầng KIỂM cũng 2 đầu.
      2. Cột self-verify của V1/V2/V4 trong checklist 5-vòng canonical = CLOSE-time: thứ bị chấm (spawn-record 4-field · freshness-verdict 4-mặt · harvest 5-trục · gist+Fidelity) chỉ SINH ra ở close.
      3. @open output là diff-report nhẹ, đã em-main verify tại chỗ ⇒ KHÔNG có artifact authoritative nào để audit. Ép KIỂM chạy @open = chấm một bản chưa tồn-tại ⇒ đúng cái ĐẠT-ảo mà fail-safe NO-OP của cả 3 contract đang cấm. Đánh-đổi khai thẳng: sai-sót phát sinh @open chỉ bị soi ở close cùng phiên (trễ, KHÔNG mất). 🔁 Điều-kiện huỷ-defer: ngày nào @open sinh ra artifact authoritative (không còn chỉ diff-report) thì DEFER này PHẢI xét lại — defer có điều-kiện huỷ, không phải đóng vĩnh-viễn. 🔗 H24-coupling — ngoại-lệ CÓ CHỦ-ĐÍCH, khai rõ (KHÔNG mâu-thuẫn "end-only"): ring2-audit bám cặp H24 wherever it fires — cặp chạy @§L.b(j)(ii) ⇒ nó chạy ở close; cặp chạy @session-start §2.1.8 (OVERDUE ⇒ AUTO, KHÔNG còn cửa consent @S146) ⇒ nó chạy NGAY tại open, ngay sau cặp. Lý-do: pin của nó = FLAG-list H24 tươi, artifact đó authoritative NGAY khi cặp trả, không đợi close. ring4-audit cùng khuôn (bám lượt nén wherever it fires: AUTO-khi-KÊU @§2.1.2 hoặc @§L.b(c) — 🧊 vế "consent" retired @S152 owner "vòng 1→5 auto"). Chỉ ring1-audit end-only TUYỆT-ĐỐI (pin = H1-chốt + H2-5-trục, chỉ sinh ở close). ⇒ "end-only" nghĩa là KHÔNG mở nhịp KIỂM RIÊNG @open; vai vẫn đi theo con-đo của nó bất kể con-đo nổ ở đâu.
    • 🔸 Luật vai-KIỂM cho vòng-đo MỚI (O-3 — OWNER-DELEGATED → lead-decided @S149; K5 land @S150; HOME DUY-NHẤT của luật này): 【1】 mặc-định TÁCH — vòng-đo MỚI sinh ra thì vai-KIỂM riêng của nó land CÙNG đợt (KHÔNG gộp vào con KIỂM có sẵn); tập vòng-thiếu tại S149 = RỖNG (3 vòng đầu đã TÁCH @S145, owner-decision [2] — dòng dưới). Anh veto = 1 edit (HANDOFF #25).
    • 🔸 Trạng-thái adopt (owner S145 — đo lại đĩa @S146): cả 3 vai-KIỂM đã BUILT + WIRED S145ring1-audit (g-bis) · ring2-audit (j)(ii-bis) · ring4-audit (post-step lượt nén). Mỗi vai chạy audit-round khi vòng tương-ứng chạy, độc-lập, KHÔNG chờ nhau. 🧊 Bản trước xếp ring2-audit + ring4-audit vào diện chờ-land về sau (đợi vai #1 chạy-thử-1-phiên) = STALE @S146: mâu-thuẫn chính danh-sách roster Phase 1 (3 dòng 🔬 đã wire AUTO) mâu-thuẫn đĩa (.claude/agents/{ring1-audit,ring2-audit,ring4-audit}.md tồn-tại CẢ 3). Số vai roster canonical → docs/STATUS.md §Sub-agents (B1 — KHÔNG chép số).
  • (k-bis) 🧮 KHỐI CHẤM đáp-ứng-yêu-cầu — IN ở cửa ĐÓNG (P8, W4b/S181; đối-xứng session-start §2.1.10): luật đầy-đủ = canonical harness-11-engine.md PHẦN PB1: chỉ TRỎ + THI HÀNH, CẤM chép công thức / 4 tầng / 3 mốc sang đây.

    • Nguồn đếm = docs/governance/so-yeu-cau-chu-du-an.md cột số lần đã nhắc (số sống: scripts/nhip-no-probe.ps1 vế so-yc).
    • 🔴 Sổ còn thưa ⇒ in đúng chữ KHÔNG ĐO ĐƯỢC, CẤM in điểm (luat:65-66: nguồn thưa ⇒ máy luôn cho 10/10 ⇒ in số đó là vi phạm chính luật vừa adopt). 🔴 INFORM-only ≥3 phiên, chưa được đụng cổng nào.
    • 🔴 Thiếu mốc-3 first_owner_msg_ts ⇒ in chờ niêm phong, KHÔNG đẩy sang hàng-chờ-anh (PHẦN P.4) — chưa có phản hồi thì điểm chưa chốt.
    • 🔴 Chấm sai ⇒ ghi error-ledger.md kèm TẦNG NÀO SAI. CẤM nhét nhãn chấm sai vào lead_self_audit.flag_classes — tập ĐÃ NIÊM PHONG (P3=B, _sealed_P3B_S181); máy từ chối bằng exit 2.
    • 🔴 Tần suất nghi-thức = quyền chủ dự án, KHÔNG máy nào cưỡng chế, CẤM tích luỹ nợ vì "chưa tới lượt chạy"; độ đầy đủ khi chạy mới là phần đội chịu và có cổng máy (chủ dự án chốt @S181).
  • (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 → (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): 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 CG-1 (≤1 lần/N=3 phiên, vẫn trượt → escalate anh — REUSE H17 §I B2, KHÔNG sổ mới). Light/hỏi-đáp → skip. (Nấc honest: dogfood n=1 S100 = mẫu hiệu-chỉnh, CHƯA "proven" — caveat 1 broadcast H18.)

  • (k) 🧪🧭🧮 Bộ-ba đồng-kiểm memory @ĐÓNG-PHIÊN (adopt S141 — đối-xứng session-start §2.1.9; khuôn hub 5-câu 58e28bae khối B): đầu-thứ-2 của nhịp 2-đầu-phiên. Trục = CHÍNH-HỆ-MEMORY, KHÁC (g) H1 tooling / (d)(f) H2 harvest / (j) H24 lead / reviewer chấm-diff. Contract từng vai = canonical ở .claude/agents/harness-{eval,refine,audit}.md (B1 — KHÔNG chép contract vai vào đây).

    • (i) 🔄 AUTO 1 vòng/phiên GIỮA 2 bookend (owner chốt @S151 2026-07-25 — supersede consent-gate S141; nhà canonical = session-start §2.1.9(a), mục này chỉ TRỎ): trio KHÔNG còn consent-per-run. Vòng auto chạy SAU bookend @open (điểm chạy chính). @close CHỈ kiểm: vòng đã chạy chưa — chạy rồi ⇒ ghi 1 dòng tham-chiếu run-folder (KHÔNG chạy lần 2 — đúng 1 vòng/phiên); CHƯA chạy (phiên vào bằng /tiep bỏ qua @open · lỗi) ⇒ chạy bù TẠI ĐÂY trước khi đóng, hoặc ghi vết skip WAL trio: skipped S<nn> (<ly-do>) nếu không chạy được.
    • (ii) 🔴 TUẦN TỰ, CẤM song song: 3 spawn RIÊNG eval → refine → audit. KHÔNG dùng parallel() của hmw.js — refine đọc output eval, audit chấm cả 2; song song ⇒ chấm bản cũ ⇒ verdict vô-nghĩa.
    • (iii) Lead scribe NGAY (single-writer): return từng con → ghi .claude/workflows/runs/<run-id>/harness-{eval,refine,audit}-return.md ngay khi con đó trả, KHÔNG đợi đủ 3 (3 vai không có Write/Edit ⇒ tự-ghi-đĩa bất-khả; phiên chết ⇒ mất return — bài-học vòng-1 S141).
    • (iv) PIN đích-danh (fail-closed): refine nhận path …/harness-eval-return.md; audit nhận path run-folder đang chấm. 🔴 Pin missing/rỗng ⇒ TỪ-CHỐI / TRƯỢT; CẤM tự tìm "run mới nhất" (⇒ ĐẠT-ảo).
    • (v) 🔴 ĐỌC số ĐÃ ĐO trong closeout, KHÔNG chạy lại instrument: khối (c) ở trên đã chạy measure-agent-memory.ps1 · memory-archive-gate.ps1 · crystallized-backfill.ps1 · nhip-no-probe.ps1 · mfe-eval.ps1 (nay AUTO mỗi closeout — owner slot 72 @S172, hết cổng từ-khoá eval) — con ĐO đọc output đó. Chạy lại = đo 2 lần lệch cửa-sổ + phá đóng-băng bề-mặt-đo (c). Ngoại-lệ DUY NHẤT = con KIỂM re-chạy ≥2 số load-bearing để đối-chứng byte-exact (đúng contract vai).
    • (vi) Post-wave assertion: xong 3 con → git status --shortkỳ vọng 0 tracked-change ngoài run-folder; có thay-đổi lạ ⇒ residual-write ⇒ báo anh + revert (G-015: propose-only KHÔNG code-enforced ở kênh Bash — git-diff = backstop THẬT).
    • (vii) [M4] Vết 2 lớp (giữ NGUYÊN sau khi bỏ consent @S151): dòng trạng-thái ở (i) IN CẢ khi Light/hỏi-đáp (Light ⇒ skip CHẠY hợp-lệ, CẤM skip IM-LẶNG); khi skip (Light HOẶC vòng không chạy được — 🧊 vế "khong-gat" 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 | ...>).
    • (viii) Đơn-vị nhịp: "phiên-LOGIC" hub map TẠM = nhãn-phiên S<nn> (SE chưa adopt session-logic). 🔴 KHÔNG cadence-key trong memory-budget.json, KHÔNG tick counter cho bộ-ba (nhịp bộ-ba ≠ nhịp H24 — trộn 2 đồng-hồ = hỏng cả hai).
  • (l) 🔎 ctx-audit @close — vai-3 vòng Ctx (SOI-CHUỖI) (adopt thư 0df10df4 @S153; 🔄 OWNER-VETO @S153: (38)(a) 1-vai → hub-form 3-vai anh chốt trực tiếp — vai-1 ctx-curator @mỗi-pause · vai-2 ctx-verifier @mỗi-tiep · vai-3 đây; 🔴 ăn từ phiên sau restart CLI): AUTO SAU các vòng đo (a)-(k), TRƯỚC §L.c — spawn vô-điều-kiện (hình-B), máy TRƯỚC vai (mind-check full + closed-check §6.3-bis). PIN đích-danh fail-closed: path _mind-s-<N>.md + run-folder bookend-close; _mind vắng ⇒ NO-OP 1 dòng có khai. Vai: bất-biến chuỗi (tự đếm ĐĨA) + chấm mồi-ngầm + KIỂM-VẾT vai-1/vai-2 (phiên có pause/tiep: đọc verdict chúng + đối-chứng chọn mẫu; phiên 0-pause/0-tiep: tự chạy hồi-tố 5-khoản + 4-khoản = fallback) — contract = canonical .claude/agents/ctx-audit.md (B1, KHÔNG chép). Lead scribe sub-ctx-audit-close.md NGAY khi trả + seed diary agent-memory/ctx-audit/ CÙNG lượt (kẻo C11(b) FLAG diary-0-delta — datum T3 @S153).

§L.c — completeness-gate 5-vòng (D1, land S146 — 🔴 CÓ RĂNG: CẤM bare-PASS)

Chạy SAU khi §L.b (a)→(k) xong, TRƯỚC Phase 2. Toàn-bộ gate read-only ⇒ không phá đóng-băng bề-mặt-đo (c). Khung canonical = checklist 5-vòng/8-phép của hub (f71c5b65); gate ở đây = 5 vòng chức-năng + 4 phép sàn (phép 14).

🔴 LUẬT ĐỌC KẾT-QUẢ = RĂNG của gate. Mỗi phép chỉ được mang 1 trong 3 nhãn: ĐẠTbắt buộc kèm bằng-chứng đĩa DÁN VÀO · TRƯỢTkèm số/path LỆCH · vacuouskhông có input, kèm folder-state. Ghi ĐẠT mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT. Bằng-chứng = output của lệnh vừa chạy; "đã verify" / "khớp rồi" / trí-nhớ ⇒ KHÔNG tính (luật soi-được thay trí-nhớ — S122 §5.0 ghi-chú, S119). 🔴 Chống meta-count blind-spot (S119): báo dạng phép: ĐẠT a / TRƯỢT b / vacuous c với a+b+c = 4. CẤM gộp thành "4/4 PASS" khi còn vacuousvacuous KHÔNG cộng vào tử-số ĐẠT. 🔸 Nấc của gate = evidence-mandate, KHÔNG phải cổng chặn (không chặn đóng phiên). Chính vì informational nên nó an-toàn để sai — và vì thế cấm tô hồng: một ĐẠT rỗng bằng-chứng rẻ hơn nhiều so với một TRƯỢT có số, nên chỉ luật-soi-được mới giữ được nó thật.

(1) 5 vòng — mức CHỨC-NĂNG (mỗi vòng = 1 con-ĐO + ≥1 con-KIỂM độc-lập; ô dưới là con-trỏ, KHÔNG chép logic — B1):

Vòng Con-ĐO (chạy ở) Con-KIỂM độc-lập Bằng-chứng tối-thiểu phải dán
V1 tooling + harvest H1 tooling-auditor (g) · H2 harvest-curator (d)(f) ring1-audit (g-bis) path sổ/return H1+H2 phiên này
V2 soi-lead cặp H24 (j)(ii) hoặc session-start §2.1.8 ring2-audit (j)(ii-bis) FLAG-list + class (enum ĐÓNG)
V3 bộ-ba memory harness-evalharness-refine (k) harness-audit (k) 3 path runs/<id>/harness-*-return.md
V4 nén-ngủ /sleep-recovery-memory-l2 (🔄 AUTO-khi-KÊU @(c) hoặc @§2.1.2 — owner @S152) ring4-audit (post-step lượt nén) path .gist.md mới + Fidelity verdict
V5 sàn-sự-thật "đã-đo" measured-label-gate (floor — không vai riêng) — (floor tự-soi ở MỌI verdict) 1 nhãn đã-đo bị chặn / được cho qua trong phiên

🔴 Vòng không chạy phiên này ⇒ ghi không-nhịp + lý-do (chưa tới cadence · không có input — 🧊 lý-do "anh không consent" retired @S152: cả 5 vòng AUTO). KHÔNG ghi ✓, KHÔNG tính TRƯỢT — nhưng cũng KHÔNG được im-lặng bỏ khỏi bảng.

(2) 4 phép sàn — mỗi phép PHẢI SHOW bằng-chứng đĩa:

🔎 phép-1 — tick vs cửa · bằng-chứng = 3 SỐ thật (không phải chữ "khớp"):

# cửa-sổ = (closeout-liền-trước .. HEAD]. 🔴 regex closeout DÙNG CHUNG §L.b(j)(vi) — KHÔNG chép bản thứ 2 (B1).
LAST=$(git log --format='%H %s' | grep -m1 -E '<regex closeout — lấy ở (j)(vi)>' | cut -d' ' -f1)
P=$(git log --format=%s "$LAST..HEAD" | grep -c '^wal: pause' || true)              # điểm dừng
L=$(git log --format=%s "$LAST..HEAD" | grep -oE 'S[0-9]+' | sort -u | wc -l)       # nhãn-phiên (proxy)
grep -oE '"counter": *[0-9]+|"last_ticked_session": *"[^"]*"' .claude/governance/.session-counter.json

Dán vào gate: cửa = L nhãn + P dừng · counter-delta = <trước> → <sau>. Lệch ⇒ TRƯỢT + IN DANH-SÁCH cửa CÂM (cửa nào không có tick). 🔴 Viết "tick đủ" mà thiếu 3 số ⇒ TRƯỢT. 🔸 Lproxy (S-label trên commit-subject); đối-chứng nguồn-2 = docs/changelog/sessions/ khi nghi ngờ.

🔎 phép-2 — dòng-nợ tại cửa · bằng-chứng = DÁN NGUYÊN VĂN dòng máy in: Copy y nguyên dòng NHIP-NO: … mà §L.b(j)(i) vừa in (kể cả khi nó là probe-loi (khong chan)) vào gate. 🔴 Tóm-tắt / diễn-giải / "đã in rồi" ⇒ TRƯỢT — phải là chuỗi do máy in. 🔸 Vế-set canonical = scripts/nhip-no-probe.ps1 (B1 — KHÔNG chốt số vế ở đây): checklist hub gốc gọi "dòng-nợ 3-vế", script SE hiện in 4 đoạn (kiem | tran-bo-nho | run-chua-gom | pull-cach) và 4 command đều gọi "4-vế". Gate đo nguyên-văn dòng in ⇒ script đổi vế thì gate không stale.

🔎 phép-3 — closeout đủ nghi-thức · bằng-chứng = PATH THẬT (không phải ✓): 3 closeout gần nhất, mỗi kỳ phải chạm đủ 4 sổ: docs/STATUS.md · docs/HANDOFF.md · docs/changelog/sessions/** · .claude/agent-memory/** — đo UNION-per-label. 🔴 KHÔNG per-commit-naive: agent-memory/ thường vào qua wal: commit cùng kỳ ⇒ đếm theo từng commit sẽ FAIL oan (đo thật S135: S133 e53a693 chỉ đủ sổ khi tính union với 9f404d3).

# C1 C2 C3 = 3 closeout gần nhất (regex DÙNG CHUNG (j)(vi)) → union file-set từng kỳ:
git log --name-only --format='' "C2..C1" | sort -u \
  | grep -E 'docs/STATUS\.md|docs/HANDOFF\.md|docs/changelog/sessions/|\.claude/agent-memory/'

Dán vào gate: bảng 3 dòng × 4 cột, mỗi ô = path thật matched. Ô rỗng ⇒ TRƯỢT + tên sổ thiếu + kỳ nào. 🔸 Proxy này không phân-biệt "không chạy" vs "chạy mà không ghi sổ"cả hai đều lỗi nên vẫn bắt đúng (khai thẳng, S135 ghi-chú (v)).

🔎 phép-4 — vai ĐÃ-CHẠY phải có sổ · bằng-chứng = roles-ran list + path sổ:

  1. Liệt danh-sách vai ĐÃ CHẠY phiên này (nguồn = spawn-record (d); 0 spawn ⇒ ghi n-a, không để trống).
  2. Với TỪNG vai trong list: dán path .claude/agent-memory/<role>/MEMORY.md + byte > 0 + mtime phiên này (ls -la). Vai chạy mà thiếu sổ hoặc sổ 0-byteTRƯỢT (AS-8 — 0-byte memory là ca đã xảy ra thật, S45).
  3. 🔴 Vai WIRED nhưng KHÔNG chạy phiên này ⇒ not-yet-run (vacuous) + DÁN folder-state, KHÔNG TRƯỢTKHÔNG ĐẠT:
ls -la .claude/agent-memory/ring1-audit/ .claude/agent-memory/ring2-audit/ .claude/agent-memory/ring4-audit/ 2>&1

📌 Baseline đo tại lúc land gate (@S146 — mốc 1 lần, KHÔNG lặp mỗi phiên): ring1-audit/ tồn-tại nhưng RỖNG (0 MEMORY.md) · ring2-audit/ + ring4-audit/ MISSING ⇒ cả 3 = WIRED nhưng CHƯA chạy audit-round THẬT ⇒ đúng ca vacuous (ring1-audit @S145 chỉ spawn-PROBE, cố-ý 0-ghi). 🔴 Vacuous KHÔNG phải giấy phép vĩnh-viễn: một khi vòng tương-ứng CHẠY (H1/H2 chốt · cặp H24 chạy · lượt nén chạy) mà vai-KIỂM vẫn không có sổTRƯỢT thật, hết cửa vacuous. Đây là chỗ dễ ĐẠT-ảo nhất của cả gate: "folder trống" đọc giống "chưa tới lượt" y hệt "chạy rồi mà nuốt sổ"phải kèm bằng-chứng vòng đó có/không chạy, không chỉ kèm ls.

(3) Dòng báo gate (1 dòng, ghi cạnh khối memory-triple trong session-log):

completeness-gate S<nn>: vong <x>/5 chuc-nang (khong-nhip: <ds>) | phep DAT a / TRUOT b / vacuous c

🔴TRƯỢTNÊU ở report Phase 4 + đổ vào sổ đích (carry-slug HANDOFF / WAL-line / STATUS-row) — không mục nào rơi khỏi sổ.

Phase 2 — WRITE (update MD/RAG)

2.1 UPDATE/Re-rank MD/RAG đã thay đổi

  • docs/STATUS.md (In Progress → Recently Done) + docs/HANDOFF.md (tiering: giữ current+2-3 session, archive cũ → session logs per feedback_status_handoff_tiering)
  • rules, architecture, gotcha, skill, hand-off, DB, luồng DB, session log

2.2 Skill registry

  • Liệt kê 6 skill. Dùng skill khi task khớp (KHÔNG tự suy luận lại)
  • Skill staleness audit chỉ chạy theo lịch định kỳ (cron monthly — lịch kế → docs/STATUS.md, B1)
  • Phân bổ skill mới phù hợp per agent (README matrix)

2.3 Memory entry mới

  • Add memory entry NẾU phát hiện rule/gotcha/decision quan trọng chưa có (vd feedback_*)
  • KHÔNG rewrite toàn bộ memory — chỉ append entry mới + update MEMORY.md index 1 dòng

2.4 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/RAG 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.

Phase 3 — VERIFY (test + state)

3.1 Unit test verify

  • dotnet test SolutionErp.slnx --nologo --verbosity minimal — verify count tăng đúng (vd 130 → 132 nếu thêm 2 test). Update STATUS Recently Done.
  • Phase 9 UAT mode: feature test-after (có thể skip per chunk), vẫn npm run build × 2 app. Nếu chỉ docs/infra → ghi "N/A".

3.2 Sub-agent state

  • Kiểm tra trạng thái spawn sub-agent (10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory · 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)
  • 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

  • RAG corpus health (chunk count delta, last_indexed_at). Re-index full = AI_INFRA op (charter v2).
  • MCP rag-unified stdio launch verify (5 tool)
  • Re-rank coverage: prompts đã store + đánh dấu re-rank đầy đủ chưa

Phase 4 — REPORT (plan status)

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

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

🧾 MASTER-CHECKLIST — "TỔNG-HỢP CHỐT" (VIEW derive tươi từ WAL · STATUS · HANDOFF · ACTIVE-MARKS; KHÔNG file nguồn):

  • Tầng-1 — mỗi arc/đầu-việc-lớn 1 dòng {đóng · đang · chưa}; nêu rõ arc nào ĐÓNG trong phiên này.
  • Tầng-2 — 4 nhóm: 1) xong (WAL [x] + Recently-Done) · 2) đang-dở + breakdown (đã-xong / đang-giữa / còn-gì) · 3) chờ-anh — 🔢 BẮT BUỘC ĐÁNH SỐ (HANDOFF NEXT-anh + ⚑ pending + mark treo) · 4) chưa-làm / hẹn-cuối-phiên (WAL [ ] + NEXT-em).
  • 🔻 MỌI mục chưa-đóng PHẢI chỉ đích nơi đổ: carry-slug HANDOFF / WAL-line / STATUS-row — không mục nào rơi khỏi sổ. 🔴 Checklist = VIEW derive tươi — CẤM tạo file checklist nguồn-đôi (sàn-3).

SOLUTION_ERP report (per-session)

  • Tóm tắt việc done + commit SHA + CI Run verdict + bundle hash rotate + plan progress
  • (SE KHÔNG copy phần "6 sister report" của AI_INFRA host)

Phase 5 — COMMIT (release)

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

# 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ệngrep -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).

5.1 Release + commit

  • Kiểm tra release, commit task vừa hoàn thành. ⚠️ Update SolutionErp.slnx nếu có .cs/.csproj mới.
  • 🔴 M-7 — add đích-danh .claude/governance/.session-counter.json khi tick-at-close (§L.b(j)(v)) tạo delta: file NGOÀI hook-4-path ⇒ KHÔNG tự vào wal: commit ⇒ PHẢI git add đích-danh ở commit closeout, nếu không counter-delta nằm uncommitted (bằng-chứng sống: tick S133 uncommitted qua 2 closeout liên tiếp).
  • Format: [CLAUDE] <scope>: <imperative message> + Co-Authored-By: <lead model hiện tại> <noreply@anthropic.com> (model = lead runtime phiên hiện-tại per BƯỚC 0.6 probe — KHÔNG hardcode; flip-chain canonical → docs/STATUS.md §Sub-agents)
  • Scope: Contract · PurchaseEvaluation · Budget · Form · Workflow · Supplier · Auth · Admin · Api · App · Domain · Infra · FE-Admin · FE-User · Tests · Docs · CICD · Scripts · Skill

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 đó.

# ── 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 ở INDEX0 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)

6.1 Chunk MD/RAG update

  • Cập nhật chunk MD/RAG content mới (Proposal/WorkflowApps/Phase 11...). SE-side: mcp__rag-unified__store_memory key facts (stopgap content-gap).

6.2 RAG eval

  • ⚠️ Charter v2: RAG eval + full re-index (bootstrap.py, golden set, recall@5) = AI_INFRA op (cần VOYAGE_API_KEY). SE KHÔNG tự chạy.
  • SE-side closeout: (a) verify store_memory chunk retrievable (1 search_memory rerank check); (b) flag drift/staleness lên AI_INFRA nếu last_indexed lag nhiều; (c) báo cáo broadcast nếu adopt infra change.

6.3 INFRA-ADOPTION report (cadence #4 — self-sustaining, AI_INFRA bundle 2026-06-01)

  • NẾU session này adopt bất kỳ infra/governance change từ AI_INFRA (RAG fix / session-cmd / hygiene / charter / Gov-v2) → tự-sinh adoption-report §E TRƯỚC khi đóng (KHÔNG cần anh nhắc):
    • SERVER-VERIFIABLE (Gitea url): chain N commit sha (origin synced, tree clean)
    • Per-§: §A RAG · §B Gov · §C Hygiene (X/7 agent-mem L1 ≤30KB · bloat>50KB=0 — đo byte thật) · §D session-cmd (KHUNG added <sha> / skip <đã-có>) · §E evidence (sha list + integrity moved-not-cut) · §F mirror ledger committed <sha>
    • NẤC: agreed / executed / VERIFIED-self. Caveat by-design: L2 gitignored · CANONICAL-pull = trust.
  • Surface report cho anh main relay AI_INFRA (1 lần báo = ACK+executed+evidence). Em main /session-start kế watch + double-check → cơ chế 2 chiều tự duy trì.
  • Session KHÔNG adopt infra gì → ghi "N/A (no infra adoption this session)".

6.3-bis 🔒 Chốt-kết _end — đóng băng phiên-LOGIC (owner chốt @S146 "giống hub")

Floor manifest 101e69d6 §1: dấu-mốc thứ-4 = "Chốt-kết (_end) — dấu đóng băng khi phiên-LOGIC thực sự khép lại". 🔴 SE form = _end kể từ S148 (owner chốt "đối ứng đúng chính xác như hub"); form cũ closed.md = LEGACY, CẤM viết mớisession-1 còn dùng nên Sàn-3 vẫn nhận. Chân này trước S146 CHƯA wire ⇒ cân-sổ ORPHAN-L chỉ có nửa vào, không có nửa khoá (kêu oan ca "pause rồi đóng thẳng không qua /tiep"). Nay đóng.

  • Ghi .claude/sessions/session-<N>/_end cho <N> đang mở — 🔴 TÊN _end, KHÔNG đuôi .md (form hub, owner chốt @S148 "đối ứng đúng chính xác"). FROZEN, ghi MỘT lần, CẤM sửa về sau. Khuôn key: value, tối-thiểu: summary-frozen-s<N>: (1 dòng arc đã đóng) · pointer: (session-log/SUMMARY) · carry: (a · b · c) · pending-anh: · pointers: (run-folder) · h24-tick: counter=<n> · markers: _pause=<p> · _tiep=<t> · _snapshot=<s> · mind-blocks=<n> (+mind-blocks @S153 adopt 0df10df4). 🔴 Trường markers: không phải trang-trí — nó là bản chụp cân-sổ tại lúc đóng; sau khi đóng, detector bỏ qua thư-mục nên đây là chứng duy nhất còn lại về số lần dừng/nối. 🔴 Riêng mind-blocks= : máy mind-check KHÔNG BAO GIỜ đọc nó làm nguồn đếm (đĩa thắng — phép-6 đếm _pause-*/pause-* trên đĩa; tự-khai chỉ sinh cờ-INFO khi lệch).
  • Closed-check lớp mềm (@S153 — sau khi ghi _end): python scripts/session_ctx.py mind-check --session <N> — closed-mode tự siết (con-trỏ E đang-chờ → TRƯỢT; tên-sai → TRƯỢT). TRƯỢT ⇒ xử lý TRƯỚC commit chốt (con-trỏ hứa-file-sẽ-sinh phải đã sinh khi phiên-logic khép — bài F-1 thư 0df10df4 §4). 🧊 Form SE cũ = closed.md (4 trường prose) — LEGACY, CẤM viết mới; session-1 còn dùng nên Sàn-3 vẫn nhận (dual-accept).
  • Cân-sổ (khoá vòng ORPHAN-L): ghi xong ⇒ thư-mục ĐÓNG TRỌN, MỌI pause coi như đã đối-ứngtiep.md §0bỏ qua hẳn thư-mục đã chốt-kết. 🔴 Vá @S148 (fault-inject bắt): bản cũ code c=1 rồi so p > r + c ⇒ chỉ tha ĐÚNG MỘT pause chưa khớp ⇒ phiên đã đóng mà có ≥2 pause dư vẫn KÊU OAN — lệch đúng câu doc này vẫn luôn nói ("mọi pause"). Lệch sống từ S146, không lộ vì SE mới có p=1.
  • 🔴 Idempotent: _end (hoặc closed.md legacy) đã tồn-tại ⇒ NO-OP, CẤM ghi đè (phiên-logic đã khép; closeout chạy lại không được "mở lại rồi khép lại").
  • 🔴 Thư-mục session-<N>/ KHÔNG tồn-tại ⇒ NO-OP im-lặng — phiên này không mở phiên-logic nào (vd vào thẳng bằng /tiep, chưa từng /session-start). CẤM tự tạo thư-mục chỉ để ghi _end — tạo-rồi-đóng-ngay là sổ rỗng giả, đúng loại ĐẠT-ảo mà fail-safe NO-OP khắp harness đang cấm.
  • Add đích-danh ở §5.1 (thư-mục phiên nằm trong hook-4-path nên hook cũng nuốt, nhưng đừng dựa hook để chốt — cùng lý-lẽ pause.md §2.6). 🔸 Meld-forward (floor hub, miếng nền thứ-3) — CHƯA kiểm tại SE: hub ràng "commit mang thư-mục phiên được nhập-tiến về trước khi squash, KHÔNG bị bỏ rơi". §5.0/§5.2 của SE squash wal:-trailing bằng reset --soft ⇒ nội-dung ở lại INDEX nên về lý là không mất; nhưng chưa có phép đo riêng cho .claude/sessions/. ⇒ khai CHƯA-ĐO, không claim kín.

6.4 Reset WAL (H22 — bước CUỐI) + XOÁ sentinel Sàn-2

  • 🔴 XOÁ dòng closing: (Sàn-2 — đặt ở BƯỚC 0). Bước này vốn LUÔN chạy ⇒ thêm việc xoá = net-zero. Xoá-dấu-không-tồn-tại = no-op vô-hại.
  • Ghi-đè .claude/WAL.md về template rỗng (mạch dở phiên này đã đóng): updated/session/branch = · goal = (trống — không có mạch dở) · chain = (rỗng) · next/verify = (trống).
  • 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 §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.)

Trigger sau Phase 6: Session đóng. Working memory có thể /clear an toàn (persistent memory đã flush + commit + push).