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

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

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

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

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

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

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

View File

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