# sub-fable-invest-S153 — /fable-real investigator-codebase deep-pass: adopt TRỌN thư `0df10df4` (ctx soft-memory)

> ĐANG GHI TRONG LÚC LÀM (chống #53). Trạng thái: ĐANG ĐỌC (progress-log dưới). Spec chính = PHẦN A/B sẽ append từng phần.
> Phiên S153 (phiên-logic 6) · 2026-07-26 · engine /fable-real 1 lượt.

## Progress-log (append-only)

- [x] Đọc thư ② full 8 mục (`broadcasts/inbox/2026-07-25-Governance-pause-tiep-upgrade-vong-ctx.md` 148 dòng) — 4 nhịp / FORM hub §3 / F-1 3-trạng-thái §4 / bảng 13 hàng §5 / SÀN 7 + 3 phép §6 / nấc trung thực §7.
- [x] Đọc draft lead `docs/governance/ctx-soft-memory-se-draft.md` — bảng đối chiếu 7-khoản (6+7 đạt sẵn), SE-form `_mind-s-<N>.md` + `### MIND-<k>`, 4 câu (35)(36)(37)(38) + đề xuất 32KB/(b)/(b)/(a).
- [x] Đọc adap-report `docs/governance/adap-reports/2026-07-25-…-vong-ctx.md` — nấc agreed; nền SE đo tươi 596.316B ≈ 149-199K tok.
- [x] Đọc `pause.md` (5 bước; §2.6 A-D marker⟂narrative + machine-block ~140ms + auto-snap ròng ~64ms; §1 NGỪNG-spawn; §3.5 tick; §4 commit đích-danh).
- [x] Đọc `tiep.md` (§0 Sàn-3 5 tín-hiệu + ORPHAN-L dual-accept; §2.5 tick; §2.5b thư; §2.6 đọc `_context` + ghi `_tiep-<i>` SAU §3).
- [x] Đọc `session-start.md` BƯỚC 0.5b (engine-đắt) / 0.8 (scaffold máy `session-scaffold.ps1 -New/-Ensure`; a-bis bảng 5 file; ghost-wire `session_ctx_kb` 0-reader) / §2.1.8 tick máy / §2.1.9 trio AUTO giữa 2 bookend (scribe lead ghi return ngay; PIN đích-danh fail-closed; TUẦN TỰ CẤM song song; post-wave git-status assertion).
- [x] Đọc `session-end.md` §6.3-bis (`_end` FROZEN idempotent NO-OP; `markers:` = chụp cân-sổ; NO-OP im lặng nếu 0 thư-mục).
- [x] Đọc `snapshot.md` (guard skip-êm; `_snapshot-<k>` essence ≤3 dòng + machine-block; secrets-sweep gate exit-1 chặn commit; K đọc LIVE `snapshot_trigger_k` default-if-absent 6).
- [x] template + `_context-s-6.md` — FLOW mới-nhất-ở-CUỐI (NGƯỢC chiều `_mind` mới-nhất-ở-TRÊN — bẫy adopt-verbatim phải khai to). Session-6 FLOW còn trống (0 PAUSE).
- [x] `session_ctx.py` — secrets-sweep rglob TRỌN session-dir ⇒ `_mind` TỰ vào tầm quét Category-5 @snapshot §3; SECRET_PATTERNS 4 mẫu + `_SECRET_RES` compiled sẵn (rào-3 tái dụng 1-nguồn); machine-block anchor {subject,ts} non-wal; module tự ràng "add subcommand ONLY when a ritual needs it" ⇒ thêm `mind-check` là HỢP luật module.
- [x] `session-scaffold.ps1` — 2-mode New/Ensure, exit {0,2,3,4,5}, REFUSE-OVERWRITE, -RepoRoot fault-seam, pure-ASCII, template render {{N}}/{{TS}}/{{HEAD}}. KHÔNG cần sửa cho _mind (lead Write block-0 @cuối bootstrap — content thật, scaffold-rỗng không đạt "nội dung thật").
- [x] `governance-detectors.ps1` C10 :1594-1665 (soi session-folder ABSENCE not LATENESS; C10 tự khai cần ts-compare mà "no reliable source" ⇒ rào-2 SE = phòng-thủ cho reader tương-lai) + C11 :1760-1810 (filter `sub-*.md` + `^sub-<role>[-.]` ⇒ đặt tên artifact vai mới `sub-ctx-audit-*.md` để LỌT LƯỚI C11(b) diary-delta — trio `harness-*-return.md` là kẽ đã biết).
- [x] **Máy đọc ts của SE (truy theo rào-2):** grep scripts/ = **0 reader nội-dung `^ts:`** (session_ctx.py đọc mtime FS + git-ts; C10 không parse ts; scaffold GHI ts). ⇒ SE hiện KHÔNG có bộ-đọc-mốc kiểu hub; rào-2 vẫn giữ (marker `_pause/_tiep/_snapshot` ĐỀU có `ts:` đầu dòng by-design — reader tương-lai cho C10-LATENESS sẽ quét `_*`); canonical regex đặt 1 chỗ trong session_ctx.py (`_TS_KEY_RE`), mind-check DÙNG nó, reader tương-lai BẮT BUỘC import cùng hằng.
- [x] `memory-budget.json` — khuôn khoá owner (`"key": val` + `"_key_..._note"` lineage; tiền lệ OWNER-DELEGATED→LEAD-DECIDED = `hmw_width._ratified_by` @S149); `session_ctx_kb=64` ghost-wire honest_caveat tự dặn "(a) đọc khoá (b) ×1024 (c) gỡ dòng khi có reader" ⇒ wire reader trong cùng máy = đóng ghost-wire $0.
- [x] session-end.md §L.b(j)(ii) hình-B + (g-bis) ring1 khuôn AUTO/fail-safe/tuần-tự + (k) trio + §L.c gate 3-nhãn {ĐẠT-kèm-chứng/TRƯỢT/vacuous}.
- [x] hmw.js — VALID_ROLES đếm tay = 20; writeGuard :233 liệt danh read-only theo TÊN (thêm vai = sửa cả 2 chỗ); WIDTH_CAP 20 mirror-hardcode (canonical hmw_width.cap); STOP-HARD role ∉ whitelist; SÀN-1 ≥3 task đòi args.run; C1 lane-chết-phải-kêu; sửa hmw.js = re-invoke ăn ngay (script đọc per-invoke), KHÁC agent-file-mới cần RESTART CLI (SE đo S120/S121 — hub §7 quan sát ngược, tin số SE).
- [x] wal-flush.ps1:13 — 4 path gồm `.claude/sessions/` ⇒ `_mind` (nằm TRONG path 4 sẵn) tự vào hook + tín-hiệu ⑤ sẵn phủ ⇒ **KHÔNG cần tín-hiệu Sàn-3 mới** (không thêm path hook nào).
- [x] bookend-open-synthesis S153 — #53 8/9 garble lượt-1 (6 vai ghi-đĩa-trong-lúc-làm vớt được; 2 return-only resume; trio hết miễn nhiễm); M-1 persona stale-cadence (vai mới PHẢI hình-B từ lúc sinh); queue #8 @closeout ĐÃ nhận fix C11(b) filter `(sub|harness)-*` — spec KHÔNG trùng việc, chỉ đặt tên artifact vai mới khớp cả filter cũ lẫn mới; owner-gated (35)-(38) nay được anh ủy quyền qua lệnh pipeline này.
- [x] h24-signal-write.ps1 header — khuôn máy nhà: exit {0,2,3}, enum đọc LIVE cấm hardcode, atomic temp+move, -RepoRoot fault-seam, pure-ASCII. (session-counter-tick.ps1 SKIP đọc — khuôn đã nắm từ 3 máy cùng họ; khai.)
- [x] **Truy vấn đề bài "máy đọc ts của SE là script nào":** grep scripts/ = **KHÔNG có reader nội-dung `^ts:` nào đang sống** (session_ctx.py dùng git-ts + FS-mtime `_snapshot-*`; C10 tự khai thiếu nguồn ts để đo LATENESS). Marker `_pause/_tiep/_snapshot` đều mang `ts:` đầu dòng by-design ⇒ reader "mốc gần nhất" TƯƠNG LAI (C10-LATENESS gap) sẽ quét `_*` ⇒ rào-2 giữ, canonical regex `_TS_KEY_RE` đặt MỘT chỗ trong session_ctx.py, mind-check dùng nó, reader tương-lai bắt buộc dùng cùng hằng.
- [x] PHẦN A (spec 3-mục) — dưới
- [x] PHẦN B (check-list 24 phép) — dưới

---

# PHẦN A — PROPOSED-SPEC 3-mục (khuôn H21) — adopt TRỌN thư `0df10df4`

## Mục 1 — Mục-tiêu + 4 quyết định RESOLVED

**Mục-tiêu:** cứu 4 lớp trí-nhớ MỀM (gói-turn · hướng-tiếp · kế-hoạch-suy-nghĩ · đang-thảo-luận) qua mỗi `/pause`→`/tiep` bằng: tệp `_mind-s-<N>.md` trong `.claude/sessions/session-<N>/` (block `## MIND-<k>` 5 mục A-E, **mới-nhất-ở-TRÊN**, block cũ bất biến) + 4 nhịp ghi-ra-đĩa (block-0 @cuối bootstrap · refresh @pause · đối-chiếu+nạp-lại-rút-gọn @tiep · mục E gom dòng-sống MỌI spawn/engine-run) + máy-$0 `mind-check` (extend `session_ctx.py`) + 1 vai `ctx-audit` @2 bookend + trần trỏ-khoá `mind_ctx_kb`. Sàn 7-khoản: khoản 6+7 SE đạt sẵn (hook 4-path :13 + single-writer⟂monitor); khoản 1-5 = spec này. BINDING "điểm dừng phải RẺ" giữ nguyên: pause/tiep thêm ~0.3-0.6s máy + 0 spawn.

**Nhãn ủy quyền chung (ghi vết bắt buộc — tiền lệ `hmw_width._ratified_by`):** 4 quyết định dưới = **OWNER-DELEGATED → ENGINE-PROPOSED → LEAD-DECIDED @S153** (lời anh: "Cho /fable-real đọc kỹ và invest sau đó ra spec… Sau đó cho hwm Opus 5 MAX xử lý" = ủy quyền pipeline; KHÔNG PHẢI "owner chốt từng số"). **Anh veto 1 edit bất cứ lúc nào.** CẤM về sau tự nâng thành "owner chốt" (bài C8b @S149).

- **(35) RESOLVED: `mind_ctx_kb = 32` (KB).** Đo được: 1 block A-E ước 1-2KB; SE 1 phiên-logic p=1-3 pause (S147-S152) ⇒ file điển hình <10KB ⇒ 32KB = ≥3× headroom; khớp hub O-4 (so-fleet được; hub tự khai 32 không rút từ dữ liệu — SE cũng khai vậy, đổi sau khi có số đo dogfood). `_context` giữ cap RIÊNG 64. Khoá đặt `memory-budget.json` cạnh `session_ctx_kb`, kèm `_mind_ctx_kb_set` vết ủy quyền. Lệnh CHỈ trỏ khoá (B1).
- **(36) RESOLVED: (b) — máy-$0 chạy MỖI pause (draft + full), vai kiểm CHỈ spawn @2 bookend.** Lý do đo được: 1 spawn = floor 100K tok (`harness_floor.rounded_up_tokens=100000`) + phút-cấp, còn pause hiện = dò 5ms + machine-block 140ms + sweep 64ms — spawn-mỗi-pause làm điểm dừng đắt lên bậc-độ-lớn = vi phạm BINDING `goi-chot §3` (ràng hub đặt riêng SE); hub-owner chọn (a-nguyên) cho NHÀ HUB nhưng chính thư §7 dặn "chuẩn bị sẵn núm hạ tần suất phóng vai phụ, vì đó là chỗ tốn nhất". **Hệ quả đẹp: KHÔNG cần carve-out O-1** — `pause.md §1 "NGỪNG spawn"` giữ NGUYÊN VẸN (hub phải carve-out (a) vì họ spawn mỗi pause; SE không spawn ở pause thì không có gì phải carve). O-2-ARM (đo per-layer $0) giữ làm phép-KIỂM trong dogfood đúng ghi chú hub.
- **(37) RESOLVED: (b) — nạp-lại NỀN RÚT-GỌN mặc định @tiep, danh sách trỏ khoá MỚI `tiep_reload`.** Số: nền-full SE đo tươi @S153 = **596.316B ≈ 149-199K tok** (`instrument-backfill.txt`) — nặng hơn nền hub (439.328B ≈ ~110K) 1.36×; ràng mềm hub-owner = ~150K/cửa ⇒ full-reload nuốt trọn budget một cửa chỉ để nạp. Rút gọn = {STATUS đoạn CURRENT · HANDOFF segment mới nhất · WAL ≤40 dòng · `_mind-s-<N>.md` · `_context-s-<N>.md`} ≈ 40-60K tok (input one-shot, cache-được). Khai lệch-hub-có-lý-do trong thư hồi đáp (hub §8 xin đúng số này). Phạm-vi từng mục khoanh trong `_note` của khoá (khuôn hub "đo theo phạm-vi từng mục đã khoanh trong cấu-hình").
- **(38) RESOLVED: (a) — 1 vai `ctx-audit` gộp 3 nhịp hub thành 2 lượt chạy (@open + @close, kiểm HỒI-TỐ mọi block/cửa của phiên).** Sàn khoản 7 chỉ đòi GHI ≠ KIỂM: GHI = lead (single-writer `_mind`) ⟂ KIỂM = ctx-audit (+ máy $0 mỗi cửa). Sàn khoản 5 đạt: vòng soi độc lập 2 đầu phiên, quyền phán TRƯỢT (verdict trong return; KHÔNG tự bắn cờ hệ-thống — lead hợp nhất, mirror hub vai-3). 3-vai hub = FORM (thư §6 liệt "số vai" vào phần tự-quyết). Roster 20→21: **hmw_width.cap=20 ⇒ full-roster sweep tương lai sẽ LOUD-skip 1 lane — NÊU OWNER như câu hỏi riêng, KHÔNG tự đổi số** (O-7 là điểm ký của owner).

**Khoá/số mới (đặt ở `memory-budget.json`):**
1. `"mind_ctx_kb": 32` + `"_mind_ctx_kb_set"`: vết OWNER-DELEGATED @S153 + nguồn số (hub O-4) + đơn vị KB reader ×1024 + "anh veto 1 dòng thì đổi".
2. `"tiep_reload": { "mode": "rut-gon", "sources": [ "docs/STATUS.md :: đoạn CURRENT STATE", "docs/HANDOFF.md :: segment mới nhất", ".claude/WAL.md", ".claude/sessions/session-<N>/_mind-s-<N>.md", ".claude/sessions/session-<N>/_context-s-<N>.md" ], "_note": <lý-do + số 596KB vs ~40-60K + reader = nghi-thức /tiep (AI) — khai thẳng chưa có script-consumer, khác class ghost-wire vì hành-vi tiêu thụ mỗi tiep + dogfood đo> }`.
3. SỬA `"_session_ctx_kb_honest_caveat"` → `"_session_ctx_kb_reader"`: reader THẬT đầu tiên = `mind-check` phép-phụ-8 (stat `_context` vs 64×1024, cờ khi vượt) — làm đúng 3 điều note cũ tự dặn {(a) đọc khoá (b) ×1024 (c) gỡ dòng khi có reader}. Số 64 KHÔNG đổi (owner-set @S146).

## Mục 2 — SPEC-LIST từng file (task chia cho hmw + lead)

> **Ranh cứng:** T1-T5 = wave hmw (worker). **T6-T7-T8 = LEAD-SOLO** — command `.md` + `memory-budget.json` + docs canonical là governance-authoring single-writer (`session-start.md` BƯỚC 0.5 H6.1; hub §7 "lời lệnh là quản-trị, chỉ một người ghi"). Wave vẫn 1 run-folder chung; lead làm T6-T8 song song lane. **Restart chia 2 đợt:** phiên này land FILE; nghi-thức mới + vai mới ĂN từ phiên sau restart CLI (command no-hot-reload + agent-file-mới cần restart — SE đo S120/S121; hmw.js thì re-invoke ăn ngay). T9 = phiên sau.

### T1 — MÁY `mind-check` (extend `scripts/session_ctx.py`) — role: implementer-backend · effort M · depends: —
**Vì sao extend python thay vì .ps1 mới (trả lời đề bài "tái dụng được không?": ĐƯỢC, và NÊN):** (i) rào-3 tái dụng ĐÚNG `_SECRET_RES` compiled sẵn — máy .ps1 mới phải cài bản regex thứ 2 = 2-sự-thật, đúng thứ rào-2 cấm; (ii) hằng `_TS_KEY_RE` đặt cùng module với mọi parser session-file hiện có ⇒ reader-mốc tương-lai (C10-LATENESS) buộc dùng chung; (iii) session-dir resolution + khuôn CLI có sẵn; (iv) module header tự cho phép "add one ONLY when a ritual actually needs it" — 3 nghi-thức sắp gọi thật; (v) cùng runtime đã trả 140ms machine-block ⇒ ước wall-clock tin được. `.ps1` #30 không áp (không sinh .ps1); python giữ ASCII-only-source (unicode qua `\uXXXX` escape cho nhãn "[đã che …]").
**Nội dung:** module-level `_TS_KEY_RE = re.compile(r'^[ \t]*ts[ \t]*:', re.I | re.M)` (+comment canonical-single-truth); subcommand `mind-check --session N [--draft FILE] [--closed] [--root PATH]`:
- **7 phép chuẩn:** (1) rào-1 `^[ \t]*>[ \t]*anh[ \t]*:` trong vùng nội-dung ⇒ TRƯỢT (verbatim lời anh chỉ sống ở `_context` FLOW) · (2) rào-2 `_TS_KEY_RE` ⇒ TRƯỢT · (3) rào-3 `_SECRET_RES` ⇒ TRƯỢT, ngoại lệ nhãn che `[đã che <8-hex>]` ⇒ ĐẠT · (4) con-trỏ E block TRÊN CÙNG 3-trạng-thái {giải-được=đạt · đang-chờ (cha có)=CỜ khi mở / TRƯỢT khi đóng · hỏng (cha không)=TRƯỢT mọi chế-độ}; kẽ chép nguyên văn thư §4: TÊN-TỆP-SAI-trong-thư-mục-thật đọc thành đang-chờ, tới closed mới siết — KHAI, không tả thành tính năng · (5) số-hiệu: duy nhất + block top ≥ mọi số dưới (KHÔNG neo công-thức đếm — nhà đổi công-thức vẫn kiểm được, đúng hub §3) · (6) bất-biến |block| ∈ {p, p+1}, p = ĐẾM ĐĨA `_pause-*.md` + `pause-*.md` (dual-accept mirror ORPHAN-L); CẤM lấy p từ `markers:`/`mind-blocks:` tự khai — dòng tự khai CHỈ để cross-check ⇒ lệch = cờ-INFO (hub đo khai-THIẾU thật; đĩa là nguồn duy nhất) · (7) trần/nén: `size(_mind)` vs `mind_ctx_kb`×1024 đọc LIVE từ memory-budget.json (thiếu khoá ⇒ **exit 3 fail-loud**, khuôn H24-2 cấm default); vượt ⇒ CỜ + in hướng dẫn "nén block CŨ NHẤT trừ block-0 + top; <3 block ⇒ TỪ-CHỐI nén, giương cờ vượt trần".
- **2 phép phụ (khai riêng, không tính vào 7):** (8) `size(_context-s-<N>.md)` vs `session_ctx_kb`×1024 ⇒ cờ — reader THẬT đóng ghost-wire H18 · (9) cấu trúc block: 5 mục A-E hiện diện hoặc `(trống — khai)`; mục D mỗi ý mang nhãn `{mới-nêu|đang-cãi|gần-chốt|treo-chờ-anh}` ⇒ thiếu = trượt-cấu-trúc.
- **Enclosure use⟂mention:** chỉ quét DƯỚI `<!-- MIND-RULES-END -->` (khối luật đầu tệp CHỨA chuỗi cấm để giải thích — grep trần tự đỏ oan, thư §3 + feedback citation-trap).
- **4 mức {đạt·trượt·cờ·bỏ-qua-có-khai}** per-phép; exit 0 = 0 trượt · 1 = ≥1 trượt · 3 = config/state. **Chế-độ:** draft (kiểm nháp TRƯỚC chèn: rào 1-3 + số-hiệu-draft PHẢI == count-on-disk; bỏ phép 6/7) · closed AUTO khi `_end` tồn tại (`--closed` chỉ để fault-inject) · `--session` BẮT BUỘC KHÔNG default-latest (thư §3 "input chỉ đích danh — 2 cửa sổ song song sẽ đua") · `--root` = seam fault-inject (mirror `-RepoRoot`). **Tên-sai-phải-NÊU-tên:** `_mind-s-<N>.md` vắng ⇒ glob `*mind*`; có ứng viên ⇒ in đúng tên sai trong lý-do bỏ-qua; closed-mode ⇒ TRƯỢT.
- Ước wall-clock ~140-300ms/lượt (cùng runtime machine-block 140ms đã đo; T4 đo thật).

### T2 — TEMPLATE MỚI `.claude/templates/session-mind-template.md` — role: implementer-frontend · effort S · depends: —
Ruột: header sID + `<!-- MIND-RULES-START -->` khối luật {3 rào MỖI RÀO KÈM LÝ-DO ĐO ĐƯỢC (rào-1: lời anh = nguồn-duy-nhất ở `_context` FLOW, tệp mềm chỉ trỏ `PAUSE-<k>` · rào-2: marker SE `_pause/_tiep/_snapshot` mang `ts:` đầu dòng by-design, reader-mốc tương-lai quét `_*` không lọc tên — regex canonical = `session_ctx.py:_TS_KEY_RE`, cấm cài bản 2 · rào-3: block bất biến ⇒ secret lọt là vĩnh viễn; ngoại lệ duy nhất `[đã che <8-hex>]`; quét nháp TRƯỚC chèn) + luật mới-nhất-ở-TRÊN chèn dưới `<!-- MIND-TOP -->` (🔴 khai to: NGƯỢC chiều `_context` FLOW mới-nhất-ở-CUỐI — đừng chép khuôn bên kia) + số-hiệu = ĐẾM block hiện có TRƯỚC khi chèn, block-0 chiếm số 0 + block cũ BẤT BIẾN, ngoại lệ DUY NHẤT nén-vượt-trần (block giữa, verbatim còn trong git) + việc-ĐÃ-CHỐT chỉ con-trỏ WAL/HANDOFF CẤM chép + mục trống ghi `(trống — khai)`}` + <!-- MIND-RULES-END -->` + `<!-- MIND-TOP -->` + skeleton block-0 (`## MIND-0 — {{TS}} @ {{HEAD}} (window 1)` + 5 heading A-E). Schema block trong khối luật dùng placeholder `<k>` để parser `^## MIND-\d+` không false-match (mirror trick template `_context` :32). Header block CHỨA ts trong dòng heading (sau em-dash) — KHÔNG phải key `ts:` ⇒ không phạm rào-2.

### T3 — PERSONA MỚI `.claude/agents/ctx-audit.md` — role: implementer-backend · effort M · depends: —
INFORM-only · propose-only · **read-only đúng khuôn monitor nhà (KHÔNG Write/Edit — chặn-bằng-thiếu-tool)**; frontmatter `model: opus` + `effort: max` (worker-tier-pin S124). **Hình-B từ lúc sinh** (datum M-1 ring2 @S153: persona lead-*-auditor còn dạy cadence cũ — CẤM chép các khuôn retired: consent-gate / OVERDUE-per-phiên / "không chạy mỗi phiên"). Nhiệm-vụ: **@open** {block-0 tồn tại + content-thật (≥1 nội-dung máy-khuôn-không-tự-sinh: tên 1 ý D / 1 E-verdict — metadata ts/hash KHÔNG tính, thư §6) + carry: block D của `_mind` phiên trước có ý `treo-chờ-anh`/`gần-chốt` nào bị rơi? + đọc output `mind-check` (KHÔNG re-implement máy) + gieo MỒI-NGẦM: chọn 1 ý chưa-chốt, trả trong return để lead scribe ra đĩa TRƯỚC pause đầu (khai kẽ: single-lead ⇒ tính mù chỉ đạt xuyên-cửa-sổ)} / **@close** {kiểm HỒI-TỐ 5-khoản MỌI block (mục đủ/trống-có-khai · mục E phủ đủ mọi spawn/run của phiên — đối chiếu `runs/` + WAL `wf:` · đã-chốt-chỉ-con-trỏ · 3 rào sạch · nhãn D đủ) + 4-khoản đối-chiếu (hướng-tiếp khớp WAL `next:`? lệch ⇒ TIN SỔ MÁY + cờ · kế-hoạch khớp bản-đồ việc? · ý D nào đã định-đoạt mà chưa đổi nhãn? · con-trỏ giải được?) + bất-biến chuỗi (tự đếm đĩa, so với output máy) + chấm mồi-ngầm}. **Quyền phán TRƯỢT** (VERDICT dòng-1 return: `CTX-AUDIT: DAT|TRUOT|SKIP-CO-KHAI …`; schema-nhỏ 3-field chống #53); KHÔNG tự bắn cờ hệ-thống — lead hợp nhất (hub vai-3). **PIN đích danh fail-closed:** nhận path `_mind` + run-folder; pin missing ⇒ TỪ-CHỐI (CẤM tự tìm "mới nhất"). Fail-safe NO-OP khi phiên không có `_mind` (in 1 dòng, cấm ĐẠT-ảo). Lead scribe return → `sub-ctx-audit-open.md` / `sub-ctx-audit-close.md` trong run-folder bookend NGAY khi trả (khuôn §2.1.9(c)) — tên `sub-ctx-audit-*` khớp lưới C11(b) `sub-*.md` hiện hành (và filter `(sub|harness)-*` queue #8) ⇒ vai mới NẰM TRONG lưới diary-delta ngay từ đầu, không lặp kẽ trio.

### T4 — FAULT-INJECT máy (scratch-tree) — role: test-specialist · effort M · depends: T1+T2
Dựng cây tạm ở scratchpad (`--root` seam): render template THẬT (mẫu sạch = "đúng cái lời-lệnh THẬT sinh ra", thư §6 — CẤM tự chế mẫu dễ-xanh) + fixtures hỏng từng phép + đột-biến + mồi-ngầm-đĩa (`markers:` giả). Chạy trọn PHẦN B #1-#17 + #21; ghi bảng PASS/FAIL vào sub-file lane; số wall-clock thật (Measure-Command ×3) trả cho T6a điền vào pause.md.

### T5 — ENGINE `.claude/workflows/hmw.js` — role: implementer-frontend · effort XS · depends: T3 (tên vai chốt)
+`'ctx-audit'` vào VALID_ROLES (comment 1 dòng: `+S153 ctx soft-memory 0df10df4 — vai KIỂM lớp mềm, INFORM-only, @2 bookend`) + thêm `ctx-audit` vào danh-sách read-only trong writeGuard (:233). KHÔNG đụng WIDTH_CAP (owner-số — chỉ NÊU câu hỏi roster-21 trong report).

### T6 — LEAD-SOLO: wire 4 lệnh (governance single-writer) · effort M · depends: T1 (lệnh gọi máy phải có máy)
- **a. `pause.md` +§2.6-bis** (đặt SAU (C) machine-derive, TRƯỚC (D) auto-snapshot — để secrets-sweep của (D) quét luôn block vừa chèn = lưới-2 sau máy-draft lưới-1): *"Refresh lớp MỀM `_mind-s-<N>.md`: (1) soạn NHÁP block A-E {A gói-turn · B hướng-tiếp + nhánh-đã-loại · C kế-hoạch delta-suy-nghĩ KHÔNG chép checklist · D đang-thảo-luận + nhãn · E 1 dòng/spawn {verdict + con-trỏ}}; mục trống ghi `(trống — khai)`; việc ĐÃ-CHỐT = con-trỏ WAL/HANDOFF, CẤM chép. (2) `python scripts/session_ctx.py mind-check --session <N> --draft <file-nháp-scratchpad>` — TRƯỢT ⇒ sửa nháp, CẤM chèn (rào quét dịch-trái). (3) Chèn TOP dưới `<!-- MIND-TOP -->`, số hiệu = ĐẾM block TRƯỚC chèn. (4) mind-check full. Trần = khoá `mind_ctx_kb` (B1 — CẤM chép số vào đây); vượt ⇒ nén block CŨ NHẤT trừ block-0+top, <3 block ⇒ TỪ-CHỐI nén + cờ. File `_mind` chưa có (ca vào giữa) ⇒ tạo từ template + khai trễ. **Chi phí đo/ước: +~0.3-0.6s máy (2 lượt ~140-300ms, cùng cỡ machine-block 140ms) + 1 Edit + ~1-3K tok soạn — 0 spawn (giữ §1 NGỪNG-spawn nguyên vẹn).**"*
- **b. `tiep.md`** §2.6 +bullet đọc: *"Có `_mind-s-<N>.md` ⇒ đọc TỪ TRÊN XUỐNG (block trên cùng giàu nhất) + `mind-check --session <N>` (~140-300ms)"*; §3-bis +khối: *"**Bản NẠP-LẠI ≤15 dòng** trong báo-cáo đầu — BẮT BUỘC nhắc ≥1 TÊN ý-D + ≥1 E-verdict từ block trên cùng (bằng-chứng NỘI DUNG — sàn khoản 3; câu 'đã nạp' suông KHÔNG tính); đối-chiếu 4-khoản: hướng-tiếp vs `next:` (LỆCH ⇒ TIN SỔ MÁY + giương cờ) · kế-hoạch vs bản-đồ · ý D đã định-đoạt mà chưa đổi nhãn ⇒ cờ (đổi nhãn = việc lead, ghi ở block kế) · con-trỏ (máy đã chấm); + nạp NỀN RÚT-GỌN theo khoá `tiep_reload` (B1 — CẤM chép danh sách tệp vào đây; ước ~40-60K tok input cache-được)."*
- **c. `session-start.md`**: BƯỚC 0.8 (a-bis) +1 row `_mind-s-<N>.md` | lớp MỀM 4-tầng, block MIND-<k> mới-nhất-ở-TRÊN | ghi block-0 @Phase 3.5 (lead) · refresh @`pause.md §2.6-bis` · đọc @`tiep.md §2.6`; +section **"Phase 3.5 — Ctx soft-memory (adopt `0df10df4` @S153)"** sau Phase 3: *"(i) Lead Write `_mind-s-<N>.md` từ template — block-0 nội dung THẬT {A bootstrap-findings · B hướng phiên + vì-sao · C delta bản-đồ · D carry ý-treo từ `_mind` phiên trước + ý mới anh vừa nêu · E dòng-sống wave @open}; 'trước tiên' = trước pause đầu (hub §2: đặt CUỐI nghi-thức mở vì nội dung giàu nhất chỉ có sau các vòng kiểm). (ii) mind-check. (iii) Spawn `ctx-audit` @open (AUTO, 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ả + M9 diary-seed on-behalf."* + §2.1 roster list +1 dòng 🔎 ctx-audit.
- **d. `session-end.md`**: §L.b **+(l)**: *"🔎 ctx-audit @close (AUTO, sau các vòng đo, trước §L.c): PIN `_mind` + run-folder bookend-close; kiểm hồi-tố 5-khoản + đối-chiếu 4-khoản + bất-biến chuỗi + chấm mồi-ngầm; lead scribe `sub-ctx-audit-close.md` + diary-seed."*; §6.3-bis +2 ý: `markers:` thêm `mind-blocks=<n>` (chụp cân-sổ — máy KHÔNG BAO GIỜ đọc nó làm nguồn đếm, đĩa thắng) + *"SAU khi ghi `_end` ⇒ `mind-check --session <N>` (closed-mode tự siết: con-trỏ đang-chờ → TRƯỢT) — TRƯỢT ⇒ xử lý TRƯỚC commit chốt."*
- Restart-note in đậm ở cả 4 chỗ sửa: nghi-thức ăn từ PHIÊN SAU restart CLI.

### T7 — LEAD-SOLO: `memory-budget.json` 3 khoản (Mục 1) · effort S · depends: T1 land (reader có thật rồi mới gỡ caveat)

### T8 — LEAD: docs + hậu-cần · effort S-M · depends: T1-T7
`docs/STATUS.md` §Sub-agents 20→21 (+1 dòng ctx-audit — canonical count); `.claude/agents/README.md` +row (INFORM-only, @2 bookend, decision-tree "không delegate việc ghi `_mind`"); `docs/governance/ctx-soft-memory-se-draft.md` — append khối "RESOLVED @S153 qua pipeline /fable-real→hmw (vết ủy quyền); 4 câu chốt (35)32 · (36)b · (37)b · (38)a" GIỮ draft làm vết; `docs/governance/adap-reports/2026-07-25-…-vong-ctx.md` — nấc agreed→**executed** (điều kiện: T1-T7 land + acceptance PASS; ghi rõ **kiểm-chứng = CHƯA, chờ dogfood T9** — thư §7 cấm khai quá nấc); thư outbox → hub (khuôn §8): số nền SE 596.316B ≈ 149-199K + form SE (1-vai/2-bookend + máy-mỗi-pause, lệch hub-form có lý do BINDING) + 2 datum #53 (return-only hết miễn nhiễm ×2 @S153 · C11(b) trio-blind + fix filter) + kẽ T4 lòi thêm (nếu có) — gộp thư queue #10 bookend S153 được.

### T9 — PHIÊN SAU (sau restart): registry-probe `ctx-audit` (BƯỚC 0.6b spawn-probe ALIVE) + dogfood 1 vòng THẬT 4 cửa + mồi-ngầm + đo wall-clock pause thật → điền số đo vào pause.md §2.6-bis nếu lệch ước >2× + báo hub kết quả dogfood (đóng vòng "lỗi gửi về hub").

## Mục 3 — ACCEPTANCE per-task (lệnh chạy được + kỳ vọng)

| Task | Lệnh | Kỳ vọng |
|---|---|---|
| T1 | `python scripts/session_ctx.py mind-check --session 6` | session-6 chưa có `_mind` ⇒ `bỏ-qua-có-khai` + exit 0 (KHÔNG xanh-im: in lý-do + kết quả glob `*mind*`) |
| T1 | `python scripts/session_ctx.py mind-check --session 6 --root <cây-tạm-thiếu-khoá-mind_ctx_kb>` | exit 3 fail-loud "missing key" (CẤM default) |
| T1 | `python -c "open('scripts/session_ctx.py','rb').read().decode('ascii')"` | không exception (ASCII-source giữ) |
| T2 | `grep -c 'MIND-RULES-START\|MIND-RULES-END\|MIND-TOP' .claude/templates/session-mind-template.md` | 3 marker đủ; khối luật chứa đủ 3 rào + lý-do |
| T3 | `grep -n 'INFORM-only\|effort: max\|model: opus' .claude/agents/ctx-audit.md` + grep khuôn-retired (`consent`, `OVERDUE.*mỗi phiên`) | 3 hit đầu; 0 hit khuôn-retired trong phần nhiệm-vụ |
| T4 | bảng PHẦN B #1-#17+#21 trong sub-file lane | từng phép PASS, fixture-hỏng TRƯỢT thật, đột-biến ĐỎ thật |
| T5 | `grep -n "ctx-audit" .claude/workflows/hmw.js` | ≥2 hit (VALID_ROLES + writeGuard read-only list) |
| T6 | `grep -n "mind-check" .claude/commands/{pause,tiep,session-start,session-end}.md` | 4/4 file có call-site; pause có "§2.6-bis" + số wall-clock; tiep có `tiep_reload` + "≤15 dòng"; session-end có `mind-blocks=` |
| T7 | `python -c "import json;d=json.load(open('.claude/agent-memory/memory-budget.json',encoding='utf-8'));print(d['mind_ctx_kb'],d['tiep_reload']['mode'])"` | `32 rut-gon`; grep `_session_ctx_kb_honest_caveat` = 0 hit (đã thay `_session_ctx_kb_reader`) |
| T8 | grep STATUS §Sub-agents "21"; adap-report chứa "executed" + "chờ dogfood" | đúng nấc, không khai quá |
| T9 | spawn-probe + dogfood + Measure-Command | ALIVE; vòng 4-cửa exit 0; mốc wall-clock ghi lại |

---

# PHẦN B — CHECK-LIST KIỂM-TRA-LẠI (lead + anh chạy SAU khi hmw xong)

> Mỗi phép = {lệnh · kỳ-vọng · loại}. Cây tạm = scratchpad qua `--root` (fault-inject seam, mirror `-RepoRoot`). #1-#17+#21 chạy được NGAY sau wave (T4 đã chạy 1 lượt — lead re-chạy chọn mẫu); #18-#20+#22-#23 cần restart/phiên-sau.

1. **[happy]** Fixture SẠCH sinh từ template THẬT (render `session-mind-template.md` + block-0 + 1 refresh đúng số) → `mind-check --session <N> --root <cây-tạm>` → exit 0, 0 trượt 0 cờ. (Mẫu sạch PHẢI từ lời-lệnh-thật sinh ra — thư §6, cấm mẫu dễ-xanh tự chế.)
2. **[fault-inject]** Rào-1: block dưới RULES-END chứa dòng `> anh: ...` → TRƯỢT exit 1 + in đúng file:line.
3. **[anti-Goodhart]** Rào-1 enclosure: chuỗi `> anh:` CHỈ nằm TRONG khối luật START/END → KHÔNG trượt (use⟂mention — chính khối luật chứa chuỗi cấm để giải thích).
4. **[fault-inject + anti-Goodhart]** Rào-2 biến-thể: 4 fixture {`ts:` · `  TS :` · `Ts:` · tab-thụt} → 4/4 TRƯỢT; đối-chứng heading `## MIND-1 — 2026-07-26T...` → KHÔNG trượt (ts trong heading ≠ key đầu dòng).
5. **[đột-biến]** Rào-2 single-truth: sửa `_TS_KEY_RE` trong session_ctx.py (vd bỏ nhánh khoảng-trắng) → chạy lại #4 → hành-vi đổi THEO (chứng mind-check import chính hằng, không cài regex bản 2); grep đếm định-nghĩa regex ts trong scripts/ = đúng 1 nơi.
6. **[fault-inject 2-chiều]** Rào-3: fixture chứa `sk-test123...` → TRƯỢT; fixture chứa `[đã che a1b2c3d4]` → ĐẠT (ngoại-lệ nhãn che 8-hex).
7. **[anti-Goodhart]** 2-lưới độc lập: inject `sk-` vào `_mind` cây tạm → `session_ctx.py secrets-sweep --session <N>` CŨNG exit 1 (mind-check KHÔNG thay sweep; sweep rglob trọn dir vốn đã phủ `_mind` — 2 net cùng kêu).
8. **[fault-inject + F-1]** Con-trỏ 3-trạng-thái ma trận: {path tồn tại → đạt} · {cha có, file chưa → CỜ (open) / TRƯỢT (closed)} · {cha không có → TRƯỢT cả 2 mode} · {TÊN-TỆP-SAI trong thư-mục thật → đang-chờ (open — kẽ khai nguyên văn thư §4) → TRƯỢT (closed)}. 4 ca × 2 mode đúng bảng.
9. **[anti-Goodhart]** F-1 anti-xoá-con-trỏ: ca đang-chờ ở open-mode — đọc message máy: PHẢI nói "chờ file sinh ở cửa đóng" chứ KHÔNG gợi ý xoá con-trỏ (đường-rẻ-nhất-để-xanh phải là đường đúng).
10. **[fault-inject + anti-đóng-cứng]** Số-hiệu: {MIND-2 xuất hiện ×2 → TRƯỢT} · {top nhỏ hơn số dưới → TRƯỢT} · {dãy 0,1,5 với 5 ở top → ĐẠT} (chỉ đòi duy-nhất + mới-hơn — không neo công-thức, đúng hub §3).
11. **[fault-inject + mồi-ngầm-đĩa]** Bất-biến chuỗi: {p=2, blocks=3}→đạt · {p=2, blocks=2}→đạt · {p=2, blocks=4}→TRƯỢT · {p=2, blocks=1}→TRƯỢT; rồi thêm dòng `markers: _pause=9` GIẢ vào `_end` → kết quả KHÔNG ĐỔI (máy đếm đĩa, tự-khai chỉ sinh cờ-INFO lệch — chống đúng bẫy khai-THIẾU hub đo được).
12. **[đột-biến ×2]** Trần/nén: fixture 33KB → CỜ vượt trần + hướng dẫn nén (KHÔNG trượt — nợ hiển thị); fixture 2-block 33KB → CỜ "TỪ-CHỐI nén"; đặt `mind_ctx_kb=1` ở cây tạm → mọi fixture CỜ (chứng đọc khoá LIVE); XOÁ khoá → exit 3 fail-loud.
13. **[fault-inject + đóng-nợ H18]** Phép-phụ-8: `_context` 65KB cây tạm → CỜ vượt `session_ctx_kb`; đối chứng 10KB → im. Sau T7: grep `_session_ctx_kb_honest_caveat` trong memory-budget.json = 0 hit (caveat đã thay bằng note reader — đúng 3 điều note cũ tự dặn).
14. **[fault-inject]** Draft-mode dịch-trái: draft số-hiệu ≠ count-on-disk → TRƯỢT trước-chèn; draft chứa `ts:` → TRƯỢT trước-chèn (lỗi KHÔNG BAO GIỜ vào tệp); draft sạch → đạt.
15. **[fault-inject — kẽ tên-sai]** Xanh-im: dir có `_mind-s6.md` (thiếu `-` trước 6), canonical vắng → output PHẢI NÊU đúng chuỗi `_mind-s6.md` trong lý-do bỏ-qua (pipe grep tên sai → hit); closed-mode → TRƯỢT. (Không nêu tên = lỗi chính tả đi qua cửa dưới vỏ "chưa có gì để kiểm".)
16. **[happy — đo BINDING]** Wall-clock: `Measure-Command { python scripts/session_ctx.py mind-check --session 6 }` ×3 → tb ≤ ~0.5s; tổng pause-thêm (draft + chèn + full) ước ≤ ~1 phút wall / 0 spawn — so mốc pause hiện hành (dò 5ms + machine-block 140ms + sweep 64ms). Lệch ước >2× ⇒ điền số THẬT vào pause.md §2.6-bis (T9).
17. **[đột-biến + khai]** Immutability: sửa 1 byte block cũ trong `_mind` đã commit → `git diff` HIỆN đúng dòng. KHAI: máy KHÔNG canh bất-biến per-run (cần git-history diff — ngoài tầm $0); lưới = luật + git + ctx-audit @close so-git khi nghi.
18. **[happy end-to-end — T9]** Dogfood 1 vòng THẬT: session-start ghi block-0 (≥1 nội-dung máy-khuôn-không-tự-sinh — TÊN 1 ý D thật; metadata KHÔNG tính) → /pause refresh (MIND-1) → /tiep: báo-cáo có bản nạp-lại ≤15 dòng nhắc ≥1 tên-ý-D + 1 E-verdict → /session-end: closed-check exit 0 + `_end` có `mind-blocks=<n>` khớp đĩa.
19. **[mồi-ngầm — T9]** ctx-audit @open gieo 1 ý CHƯA-chốt (vết trên đĩa `sub-ctx-audit-open.md` TRƯỚC pause) → cửa-sổ SAU (/tiep) nêu lại đúng ý → ĐẠT. KHAI kẽ: single-lead ⇒ "bên bị chấm không biết" chỉ đạt xuyên-cửa-sổ (fresh window không nhớ ý nào là mồi) — chép vào phần khai, không tả thành tính năng.
20. **[happy + đối-chứng dương — T9]** Restart-verify: TRƯỚC restart spawn `ctx-audit` phải FAIL/absent (chứng no-hot-reload agent-file-mới — số đo SE S120/S121 thắng quan-sát hub §7); SAU restart spawn-probe trả `ALIVE|ctx-audit` (BƯỚC 0.6b).
21. **[happy — verify claim đề bài]** Sàn-3 ⑤ không cần tín-hiệu mới: commit `_mind` qua hook → `git log --name-only --format='%s' origin/main..HEAD | grep -q '.claude/sessions/'` → hit (⑤ sẵn phủ — `_mind` nằm TRONG path-4 hiện có, KHÔNG path hook mới ⇒ đúng luật "path mới = tín-hiệu mới" mà không kích hoạt nó).
22. **[fault-inject 2-chiều — sau wave]** Lưới C11(b): lead scribe `sub-ctx-audit-open.md` mà CHƯA seed diary `agent-memory/ctx-audit/` → `governance-detectors.ps1` C11(b) FLAG diary-0-delta (vai mới NẰM TRONG lưới `sub-*.md` — không lặp kẽ trio `harness-*-return.md`); seed xong → im.
23. **[đột-biến + owner-note]** hmw STOP-HARD: wave thử `role:'ctx-audit'` TRƯỚC T5 → throw STOP-HARD (đối-chứng dương); SAU T5 → chạy. NÊU OWNER (không tự đổi): roster 21 > `hmw_width.cap` 20 ⇒ full-roster sweep sẽ LOUD-skip 1 lane — quyết định số là của anh (O-7).
24. **[khai KHÔNG-KIỂM-ĐƯỢC — chép vào adap-report + thư hub]** (i) bằng-chứng-nội-dung @tiep không máy-kiểm được (transcript ngoài tầm máy — mirror hub §7(iii); lưới thay = #18 dogfood + #19 mồi-ngầm); (ii) 2-cửa-sổ-song-song = kẽ chấp nhận, chưa bịt (mirror hub §7(iv); PIN đích-danh `--session` giảm đua nhưng không đóng); (iii) máy không canh bất-biến-block per-run (#17 lưới git).

---

## Điểm lead PHẢI verify kỹ (trước khi ghi spec-file chính thức)

1. **Ranh LEAD-SOLO T6/T7/T8** — command .md + memory-budget.json + docs canonical = governance single-writer (H6.1 + hub §7 "lời lệnh là quản-trị, chỉ một người ghi"). Wave CHỈ giao T1-T5. Nếu lead muốn wave đụng command ⇒ phải tự bác luật nhà đã viết — đề nghị KHÔNG.
2. **Máy = extend session_ctx.py, KHÔNG .ps1 mới** — lý-do 1-nguồn (`_SECRET_RES` + `_TS_KEY_RE`); .ps1 mới = cài regex bản 2 = 2-sự-thật (đúng thứ rào-2 cấm). Nếu lead nghiêng PS1-khuôn ⇒ phải trả lời được "secret-patterns sống ở đâu, 1 hay 2 chỗ?". (Đây là điểm em ĐỀ KHÁC draft lead `ctx-mind-check.ps1` — lý-do mạnh hơn ghi rõ tại T1.)
3. **(36)(b) ⇒ O-1 carve-out KHÔNG cần** — pause.md §1 "NGỪNG spawn" giữ nguyên. Đừng ai "adopt verbatim" carve-out (a) của hub vào pause SE (bài S138 chép-khuôn-kế-thừa-lỗi).
4. **Vết ủy quyền (35)-(38)** = OWNER-DELEGATED→LEAD-DECIDED, anh veto 1 edit — CẤM ghi "owner chốt" (tái phạm C8b S149 nếu ghi sai).
5. **Chiều chèn NGƯỢC nhau:** `_mind` mới-nhất-ở-TRÊN ⟂ `_context` FLOW mới-nhất-ở-CUỐI — T2/T6 phải khai to ở cả 2 chỗ.
6. **Restart 2-đợt:** wave land FILE; nghi-thức + vai ĂN từ phiên sau restart (T9). hmw.js là ngoại lệ ăn-ngay (re-invoke).
7. **Đừng trùng việc queue @closeout S153:** C11(b) filter fix = queue #8 (lane tooling) — spec này KHÔNG làm lại, chỉ đặt tên artifact khớp cả 2 đời filter.

**Token cost estimate (lượt invest này):** ~90-110K in / ~14-16K out.

<!-- END sub-fable-invest-S153 · TOTAL=9 task -->
