# sub-invest-hoi-tu — S149 hội-tụ bookend (invest deep-pass /fable-real)

> Đề-bài anh (verbatim): "xem nó làm đến đâu rồi và vá lỗi thế nào luôn để chạy đc VIPIX, AI_INFRA".
> Agent: investigator-codebase · run: 2026-07-24-S149-hoi-tu-bookend · ghi-đĩa-sớm (khung rỗng lượt 1, append dần).

## ① PHẦN A — SE làm đến đâu (KẾ THỪA từ 5 file đo hôm nay, không re-đo)

> Nguồn: `sub-invest-5-se-do-B.md` (bảng 25 dòng) · `sub-invest-4-se-do-A.md` · `sub-invest-1-vong-def.md` (định nghĩa F3 canonical) · `sub-h24-audit-S149.md` · `spec-owner-gated-3-khoan-24-07-2026.md`. Verify thêm @lượt này: `memory-budget.json:9-19` (hmw_width cap=20 ratified 2026-07-24) · `governance-detectors.ps1:1518,:1577` (C9+C10 NEW @S149) · `.session-counter.json` (counter 23, JUMP dải 3-4 treo).

| Vòng | Đã có gì (evidence) | Còn hở gì | Lỗi tay đã xảy ra |
|---|---|---|---|
| **V1 tooling/harvest** | Cặp ĐO + vai KIỂM đủ file; call-site 2 đầu (`session-start.md:170-176` tuỳ-nghi · `session-end.md:77/:79/:129` bắt buộc per `:64` · `:130-132` KIỂM AUTO fail-safe NO-OP); ĐO chạy thật tới 2026-07-22 14:24 | ĐO **DORMANT 3 closeout** (S146/S147/S148) **0 vết skip** mọi bề mặt; KIỂM NEVER-FIRED (vacuous hợp-lệ vì pin missing); dir `tooling-harvest-audit/` RỖNG | "(a)→(k) đủ HẾT, KHÔNG skip" (`session-end.md:64`) = chữ, không máy enforce → im lặng 3 phiên (đúng F3:27 c7 "lead tự nhớ = quy-ước") |
| **V2 soi-lead H24** | Cặp ĐO + h24-audit AUTO 3 cửa (`session-end.md:114/:118/:126` + `session-start.md:264`); **máy nhịp THẬT**: `h24_cadence{light 6·deep 15·jump 3}` + `.session-counter.json` tick content-addressed idempotent (chống hook-commit inflate); ĐO ×6, KIỂM ×2; S149 KIỂM: 7 ĐẠT/0 TRƯỢT/2 KHÔNG-CHẤM-ĐƯỢC | **JUMP treo owner dải 3-4** (3 class chắc ≥3 + `view-residual-asym`∈{0,3} bất-định + `view-stale-status` 2/3); 2 FLAG lead-view **mất vĩnh viễn** (run-folder S148 0 sub-file); diary h24-audit RỖNG (GAP-3 lần 4); garble S148 ×2 chưa vào sổ bền; lũy kế ×27 sai (thật 33) | Chuỗi "**đo rồi như chưa đo**": S146 audit chạy 0 ai ghi số → S147/S148 đọc số cũ kết luận "không jump" SAI (backfill @S148); S148 tally `view-*` bị bỏ (vai không gán class → lead không có số chép); lead trình "3 trần" trước khi có vai KIỂM |
| **V3 trio** | 3 agent + call-site 2 đầu (`session-start.md:270-284` §2.1.9 · `session-end.md:147/:151/:174`); chạy thật ×1 @S144 (3 return 10.9-14.3KB); **CONSENT-GATED cố ý** (`:274`) | GAP-1: diary 3 vai KHÔNG cập nhật sau chạy (mtime = seed 07-20; phép-4 ⇒ TRƯỢT); GAP-2: vết-skip WAL [M4] **ghost-wire** (0 dòng `trio:` toàn lịch sử dù skip S145→S148); synthesis hồi tố @S146 | Đề-xuất consent sống trong hội thoại → 0 artifact → không chứng minh được "có đề-xuất"; **2-đích-1-người-ghi** (run-folder ⟂ diary vai, luật chỉ nhắc 1) |
| **V4 nén-ngủ** | Command 17.4KB (KHÔNG phải skill — lệch danh xưng); `distill-shard-probe.ps1` WIRED, live `pending=15\|nguong=15 => IM` (`-gt`); trigger shard-count O-6 owner-ratified; call-site ×2 (`session-start.md:182`+`session-end.md:68`); sleep-audit KIỂM AUTO Phase 4.5 | sleep-audit dir MISSING (vacuous hợp-lệ — vai land 07-22 > nén cuối 07-18); pending 15/15 SÁT ngưỡng | Chưa có — vòng sạch nhất trong 5 |
| **V5 sàn-sự-thật** | Floor-không-vai (by design, hub verbatim); điểm chặn `reviewer.md:46`; nấc G-011 + honest-caveat; răng THẬT (retire `measured_token_estimate` + hạ nhãn calibrated→heuristic) | **Row-18: 0 máy đếm** "1 nhãn bị chặn/cho qua trong phiên" → vòng dễ ĐẠT-ảo nhất; O-3(a) chốt: yếu ở COUNTER, không phải ROLE | Không phân biệt được "không có ca" ⟂ "có mà không đếm" — chính vì thiếu máy |
| **Session-model** | Direction S140 (phiên-LOGIC xuyên cửa sổ); S148 port form hub + `/check-email` 4 cửa + `_end` đầu tiên (commit `2448393`/`932d607`); hook wal-flush 4th path `.claude/sessions/` @S146; **C10 detector logic-session** (`governance-detectors.ps1:1577-1648`, INFORM-only NEW @S149) | Scaffold/label/đóng-`_end` toàn **TAY** — 0 script tương đương `session_scaffold.py`; C10 tự khai "no reliable source" cho ritual-ran-on-time | Chính đề-bài anh: "**ép làm mấy turn mà cứ sai mã**" = lỗi tay lặp khi hand-run nghi thức; orphan run-folder S148 |
| **Eval-use-side** | `applied-eval-nokey.ps1` CÓ RĂNG (3 cổng fail-closed, selftest 3/3 PASS live @S149); `mfe-eval.ps1` WIRED opt-in `eval` + GOODHART-WARN + `.mfe-state.json` strikes 23 | applied-eval **GHOST-WIRE** (0 call-site `.claude/commands/`); nhãn APPLIED/DORMANT/chờ-judge 0 trong luật sống (DEFER tự khai `C14-disposition:26`); 2-agent probe/judge DOCUMENTED-ONLY; scorer SCAFFOLD `meaningful=FALSE` | DEFER ghi ở run-folder S144 = nơi không ai đọc lại phiên sau |

**Bệnh gốc xuyên vòng (3 class):** (i) "**đo rồi như chưa đo**" — vai chạy mà sổ đứng yên (GAP-3 ×4 · backfill S146 · tally view-* · trio diary); (ii) "**skip im lặng**" — luật bắt vết mà 0 máy sinh vết (trio WAL M4 · V1 3-closeout); (iii) "**2-đích-1-người-ghi**" — run-folder ⟂ diary, phép-4 soi đích không ai được giao ghi. Cả 3 đều là việc TAY mà hub đã cơ-khí-hoá (probe/tick script + bookend + scaffold).

**Delta @S149 (spec owner-gated vừa đóng):** O-7 ký `hmw_width{cap:20, loud-skip, ratified 2026-07-24}` (`memory-budget.json:11-13`) + C9 width-drift detector (`governance-detectors.ps1:1518`) + C10 logic-session (`:1577`) — cả 2 INFORM-only NOT-in-TOTAL. ⚠️ 2 vết nhỏ: `memory-budget.json:17` `_drift_check` còn ghi "⏳ CHUA CO" (stale — C9 đã land cùng phiên); `_fault_inject:18` yêu cầu re-run 2-chiều trên số MỚI 20 (16→20 đổi số) — chưa thấy vết chạy.

## ② PHẦN B — khuôn THẬT của 2 repo (file:dòng + trích verbatim load-bearing)

### B.1 AI_INFRA (`D:/Dropbox/CONG_VIEC/AI_INFRA/`) — FULL-BOOKEND, lịch RETIRED

**`.claude/commands/session-start.md` §2.3i BOOKEND-@start (:110-121):**
- `:112` — *"Bookend = 3 sub H-17 chạy FULL MỖI phiên ở CẢ 2 đầu … 'Phiên' = phiên-LOGIC (SESSION-MODEL s102 …). **Lịch cadence LIGHT/FULL = RETIRED D3** — hết khái-niệm 'đến-hạn'/'OVERDUE'/bộ-đếm; không còn lịch thì không còn gì để lập. Anh: 'bỏ hẳn luôn, design lại là đi mỗi session-end/session-start' + '**đồng ý tăng token**'."*
- `:114` — (a) probe TRƯỚC 0-mutation `h17_cadence.py --probe --sid <N>` → 4 dòng ledger/window/tally/status; *"Probe **KHÔNG tick** (tick CHỈ @end §4.6) — chỉ ĐỌC."*
- `:115-117` — (b) 3-wave **TUẦN-TỰ** eval→refine→audit propose-only single-writer; CARVE-OUT *"Bắn song song ⇒ harness-audit đọc output STALE của lượt TRƯỚC … nó **báo PASS**"*; audit-input **PIN ĐÍCH-DANH**, *"CẤM glob-latest"*.
- `:118` — (b2) **D-1 SUBSTRATE-FREEZE**: từ spawn wave-1 tới verdict wave-3 em-main KHÔNG Write/Edit substrate, QUEUE ghi sau; ngoại-lệ WAL.
- `:119` — (c) degraded-path: *"Bookend **không tích-lũy nợ** (hết OVERDUE-counter để defer vào) ⇒ bỏ mà im = **mất luôn**, nên phải nêu."*

**§2.3j SESSION-MODEL scaffold (:122-125):**
- `:123` — *"`python scripts/session_scaffold.py --session <N>` … **idempotent** (KHÔNG đè `_context` tồn tại), tạo `.claude/sessions/session-<N>/_context-s-<N>.md` 3-block {STOCK-map · FLOW · STOCK-touched} từ `.claude/templates/session-context-template.md`."*
- `:124` — *"Folder tồn tại → toàn chuỗi session-model ACTIVE … các guard skip-êm tự hết hiệu-lực."*

**`.claude/commands/session-end.md` §4.6 bookend-@end (:167-191):**
- `:170` — *"**RETIRED cùng lịch:** 2 key cadence · fire-decision LIGHT-vs-FULL · `--fire-ack` · OVERDUE/deferred-fire … Sống-sót = **ledger** (`sid_last_tick` + history) + **signal-tally sliding-window**."*
- `:174` — (a4) *"**mfe_judge cross-session (s105 — eval-use-side vòng-3, mảnh cuối):** `python tests/eval/mfe_judge.py --cross-session` SAU bookend-@end → report {applied · dormant · applied_evidenced_pct-FLOOR + caveat DORMANT≠MISS} … Judge-layer … optional on-demand."*
- `:182` — (c) tick idempotent (`N==sid_last_tick`=no-op · `N<last`=fail-loud · tick **prune** window) → `--signal <class> --sid <N>` per-flag-class **max 1/class/phiên**.
- `:183` — `--fire-ack` GỠ KHỎI argparse, *"exit 2 fail-loud có chủ-đích"*; wipe tally = **chính bug M-1** (bookend mỗi phiên ⇒ wipe mỗi phiên ⇒ k_jump *"prose-ma"*) → thay **prune-on-tick**.
- `:184` — *"**KHÔNG còn fire-decision:** hết LIGHT-vs-FULL, hết 'trùng-nhịp', hết OVERDUE. Bookend (a) chạy **vô-điều-kiện**."*
- `:188-191` — (e) M-6 2 khoản: **VERDICT-SCOPE** (@end mọi verdict = PROVISIONAL *"đúng tại §4.6, TRƯỚC squash/push"*; CẤM verb-durable; carve-out OWNER-DECISION-RELAY cần attribution-token cạnh verb) + **PUSH-GATE máy-only** extensible-per-class.

**`scripts/h17_cadence.py` (601 dòng) — probe/tick tách 2 pha, state gì:**
- `:4-13` LINEAGE — *"this module **WAS a cadence SCHEDULER** — LIGHT (every-6) / FULL (every-15) … Anh RETIRED the schedule … What survives = SESSION-LEDGER + SIGNAL-TALLY sliding window … The name says 'cadence'; **the job is 'ledger'**."*
- `:36-39` — k_jump KEPT: *"Its old scheduling effect … is **DORMANT by construction** … but the **DETECTION it thresholds is exactly what a bookend reads**. Anh kept it explicitly: sessions may shorten again, and it is **the only reactive lever**."*
- `:48-55` — config-coherence fail-loud (`2<=tally_window` · `k_jump<=tally_window`); `k_jump==tally_window` (3==3) ⇒ **strict-consecutive**.
- `:57-62` — sID cross-check 2 tầng: WAL sentinel (HARD cho mutation) + SUMMARY-INDEX (warn-only).
- `:263-282` `apply_tick` — RESUME pure-no-op · backward ValueError · gap>1: *"the skipped session's tick is **lost forever** (the ledger auto-recedes; intentional)"* nhưng prune dùng sid THẬT.
- `:285-296` `apply_signal` — tally = list **distinct sids** ⇒ max-1/class/sID **structural**.
- `:174-184` `_save_atomic` — temp + `os.replace` + LF-native (E-030).
- `:379-390` selftest — *"used to build its OWN in-memory cfg … **STRUCTURALLY INCAPABLE** of noticing a config/schema divergence … Now it goes through `_load()` — the same door"*; 0 hard-code số (derive từ live config).

**`.claude/governance/h17-cadence.json` — shape sau RETIRED:**
- `config` = `{k_jump: 3, m_carry: 3, tally_window: 3, token_est: {light/full: "N/A — bookend unconditional, 0 token-instrument (honest-label s107)"}}`.
- `_lineage.k_jump` — *"**NGỦ, KHÔNG xoá** … Vai SCHEDULER = DORMANT by construction … **Vai DETECTOR = SỐNG** … Giữ vì phiên có thể ngắn lại — đây là **cơ-chế phản-ứng DUY NHẤT**."*
- `_lineage.retired_s96` — light_every/full_every + 4 state-counter + `--fire-ack` *"GỠ HẲN, không tombstone: caller cũ nhận argparse 'unrecognized arguments' + exit 2 = fail-loud"*.
- `_lineage._unit_phien_logic_s102` — đơn-vị = phiên-LOGIC; điểm dừng (`/pause`·`/tiep`·`/snapshot`) = *"DÒNG NHỊP-NỢ $0 chỉ-đọc … probe KHÔNG tick, KHÔNG spawn, KHÔNG fire"*.
- `_signal_classes` 12 (11 + `other` không-alert-eligible). `state.sid_last_tick=109`, tally per-class list-sid, history có **prune audit-trail** (entry `dropped` ghi đúng cái aged-out).

**`scripts/session_scaffold.py` (169 dòng) — cái SE đang làm TAY:**
- `:10-16` — ⚑1 path HARD-PIN `.claude/sessions/session-<N>/` *"(KHONG configurable — UNIFORM 6-sister)"* · **ts-moc = `git log -1 --format=%cI`** (committer HEAD), *"KHONG datetime.now tuy-tien"*, fallback tag rõ FALLBACK · idempotent *"folder ton tai → bao + KHONG de `_context`"* · wired @2.3j s101, standalone được.
- `:74-82` — render bằng `str.replace` (không `str.format`) để `{}` trong template sống. `:156` — LF + no-BOM.
- Template `session-context-template.md`: 3 block **(a) STOCK-map** reference-not-copy · **(b) FLOW append-only @pause-only** (`:8` *"CẤM rewrite … TUYỆT ĐỐI KHÔNG sửa entry verbatim"*; ENTRY-SCHEMA `### PAUSE-<k>` + *"tin-nhan anh VERBATIM"*; parser match `^### PAUSE-\d+` — placeholder `<k>` không false-match) · **(c) STOCK-touched máy-derive** từ `git diff --name-only`.

### B.2 VIPIX (`D:/Dropbox/CONG_VIEC/VIPIX_MULTISITE_PROJECT/`) — HYBRID: light bookend-hoá, deep GIỮ counter

**`.claude/commands/session-start.md`:**
- `:73` (§2.1ter vòng-2) — *"🔴 **Spawn `lead-stale` + `lead-gap` MỖI đầu phiên-LOGIC** — **VÔ-ĐIỀU-KIỆN (KHÔNG chờ cadence / counter / trigger)**. Đây là **bookend-hóa light-sweep** vào 2 đầu phiên theo khung nhịp năm-vòng row-2."*
- `:74` — 2 vai *"ĐỌC OUTPUT `h24-lead-audit.js` làm nền — **KHÔNG chạy lại máy** (máy chạy 1 lần …)"*.
- `:76` — *"🔴 '2 đầu' = 2 đầu **phiên-LOGIC** … — **`/pause` + `/tiep` KHÔNG spawn vòng** (điểm dừng phải RẺ, khung nhịp năm-vòng §2 nguyên-tắc-3)."*
- `:77` — *"light-sweep cadence … nay bookend-hóa vào đây … **`light_sweep_every_n_sessions` GIỮ làm stats/record — owner-authority, KHÔNG xóa**; rà-SÂU (deep-sweep) **vẫn theo counter deep**."*
- `:79-85` — vòng-3 trio cũng **VÔ-ĐIỀU-KIỆN @start, TUẦN-TỰ**; *"0-signal → return '0 đề-xuất' (vòng đã CHẠY — vô-điều-kiện ≠ trigger-gate)"*. `:87-90` — RING-AUDIT @start (ring1/ring2/ring4-conditional, *"TUẦN-TỰ trong-vòng · SONG-SONG giữa-vòng"*).
- `:151-157` (§2.3quater-ter) — `:152` `h24-cadence.js --tick s<NN>` idempotent, số LIVE `h24-config.json`. `:153` **`closeout-sentinel.js --nghi-thuc`** = kiểm **BA commit đóng-phiên gần nhất**, mỗi cái PHẢI có delta CẢ `tooling-auditor/MEMORY.md` LẪN `harvest-curator/MEMORY.md`; *"ĐỌC dòng `verdict:` — KHÔNG đọc exit-code"*; *"FLAG đỏ = **CANDIDATE**, lead ground-truth"* (FP đã biết: Stop-hook tách obs-pair sang commit `wal:` rời). `:155` **ERA-NOTE s124** — *"Nhãn `--fired light` **RETIRE** (light hết là cadence-fire → không còn 'sự-kiện fire' để ghi; chọn 'retire nhãn' = **ÍT đổi state-schema nhất**) ; display 'light đến hạn' của `--tick` nay **chỉ còn STATS**."* `:156` — *"Nhịp **RÀ-SÂU** đến hạn ⇒ **LEAD tự mở runbook chạy** — máy KHÔNG chạy giùm … (theo counter `deep_sweep_every_n_sessions`, TRỎ key) … → `--fired deep`."* `:157` — bất-biến s114: *"`>=` KHÔNG `=`"* (bỏ 1 phiên → phiên kế tự OVERDUE) · fail-loud khi lùi · fire-guard chống bắn-trùng · cap lịch-sử.
- `:39` — **scaffold CÓ THẬT**: *"chạy `node scripts/session-scaffold.js <N>` … tạo `.claude/sessions/session-<N>/_context.md` (§Stock … §Flow …). Chạy lại VÔ-HẠI (KHÔNG đè `_context.md` có sẵn)"* — manifest 4-khoản kiểm s125; trần context default 64KB (khoá `session_ctx_kb` vắng — owner set, *"lead KHÔNG tự thêm"*).
- `ls scripts/` — `session-scaffold.js` tồn tại (cùng `stamp-verify.js`, `adap-coverage-check.js`, …).

### B.3 Đối chiếu nhanh SE (đo thêm @lượt này — cho C)
- **0 script** chạm `.session-counter.json` ngoài đọc (`governance-detectors.ps1` + `nhip-no-probe.ps1` chỉ READ; `grep -ril session-counter scripts/` không ra script tick/signal nào) ⇒ **tick + history-entry + squash-benign classify 3-lệnh-git = TAY 100%** (history entries = văn xuôi dài tay-viết).
- SE `session-start.md:81-116` BƯỚC 0.8 = luật scaffold ĐÚNG-Ý-hub (idempotent, `^session-\d+$`, cấp-số ⟂ tạo-thư-mục tách đôi @S146) nhưng **thuần PROSE, 0 script**; `:116` — nghi-thức VẪN per-cửa `S<nn>`, bảng VC chờ anh duyệt.
- SE `session-end.md:369-380` §6.3-bis `_end` = form hub chốt @S148, FROZEN write-once, **NO-OP im-lặng khi folder vắng** (*"CẤM tạo-rồi-đóng-ngay = sổ rỗng giả"*) — cũng thuần PROSE.
- `.claude/sessions/` hiện: `session-1` (closed.md legacy + pause/resume-S146) · `session-2` (`_context-s-2.md`+`_end`+`_pause-1`+`_snapshot-1`+`_tiep-1`) · `session-3` (`_context-s-3.md`, ĐANG MỞ) — khớp shape C10 nhận (legacy `pause-*.md` accepted `governance-detectors.ps1:1624-1625`).

## ③ PHẦN C — GAP-LIST SE vs khuôn

| Vòng | SE lệch gì | Thiếu máy gì (port-tailor từ đâu) |
|---|---|---|
| **V1** | Luật "bắt buộc, KHÔNG skip" (`session-end.md:64`) nhưng thực-thi = **quy-ước** (lead tự nhớ) → dormant 3 closeout **0 vết**. Đúng vế xấu của F3:27 c7: *"gắn spawn vào lệnh hai đầu = cơ-chế; lead tự nhớ = quy-ước"* | (1) spawn H1/H2 **vô-điều-kiện 2 đầu phiên-LOGIC** (khuôn VIPIX `:73`, `/pause`+`/tiep` không spawn `:76`); (2) **closeout-sentinel** kiểm 3 commit đóng-phiên gần nhất có delta CẢ 2 MEMORY H1/H2 (VIPIX `:153`) — SE có sẵn **positive-control lịch-sử THẬT** (S146/S147/S148 phải FLAG, S140/S143 phải PASS) |
| **V2** | Máy nhịp **NỬA VỜI**: counter content-addressed tốt, nhưng tick + classify-squash-benign (3 lệnh git) + history-entry (văn xuôi) + ghi-số-sau-audit = **TAY 100%** (0 script ghi `.session-counter.json`) → sinh nguyên chuỗi "đo rồi như chưa đo" (backfill S146 · tally view-* · ×27≠33 · "2<3 không jump" đọc số cũ 2 phiên) | (1) **tick-CLI idempotent** + squash-benign classifier tự-động (khuôn `h17_cadence.py:263-282` apply_tick + `_contract` SE đã viết sẵn — chỉ cơ-khí-hoá); (2) **signal-CLI** per-class structural max-1/class/phiên (`h17_cadence.py:285-296`); (3) **FLAG-khuôn** `## FLAG-N — \`class\` — SEV` bắt buộc trong sub-MD + detector đọc (S148 bỏ khuôn → mất 2 FLAG vĩnh viễn); (4) luật diary-seed on-behalf sau VERIFY (GAP-3 ×4) |
| **V3** | **CONSENT-GATED** ⟂ cả 2 repo **VÔ-ĐIỀU-KIỆN** (AI_INFRA 2 đầu `:112` · VIPIX @start `:80`). Đề-xuất-consent sống trong hội-thoại = 0 artifact; vết-skip [M4] ghost-wire. SE cũng chưa có **D-1 substrate-freeze** + **M-6 PROVISIONAL-verdict** | Bookend-hoá trio (owner-LUẬT — đảo quyết-định consent @S146) sẽ **xoá cả class "skip im lặng"** by construction (không còn quyết-định skip để ghi vết). Port thêm: D-1 freeze (`session-start.md:118` AI_INFRA) · audit-input PIN đích-danh + carve-out tuần-tự (`:116-117`) · M-6 VERDICT-SCOPE (`session-end.md:188-190`) |
| **V4** | **GẦN khuôn NHẤT** — probe rẻ 2 đầu + trigger ngưỡng vật-thật = đúng F3:30 c3. sleep-audit vacuous hợp-lệ | Không cần port gì lớn. Theo dõi: pending 15/15 sát ngưỡng → lượt nén tới là lần đầu sleep-audit có input |
| **V5** | Không lệch chuẩn — cả 2 repo cũng **floor + máy-presence, 0 vai đếm**. SE thiếu tầng M-6 (CẤM verb-durable @end) mà AI_INFRA đã có | (optional) detector nhỏ đếm nhãn-đo mới trong diff phiên (đóng "row-18 ĐẠT-ảo"); M-6 port theo gói V3 |
| **Session-model** | RULES đầy đủ (form hub, owner chốt @S146/S148) + probe nhịp-nợ ĐÃ máy (`nhip-no-probe.ps1`) + C10 absence-only. Nhưng **0/3 máy thực-thi** {scaffold · tick · signal} — mọi bước tạo-folder/đánh-số/label-2-tầng/`_end`/classify đều tay qua nhiều turn | `session_scaffold.py` (AI_INFRA, 169 dòng) / `session-scaffold.js` (VIPIX) — tailor sang SE; tick-CLI + signal-CLI (V2 ở trên — chung máy); C10 giữ làm lưới hậu-kỳ |
| **Eval-use-side** | SE DEFER *"cần máy mới"* (`C14-disposition:26`) trong khi hub **ĐÃ có mảnh cuối chạy thật**: `mfe_judge.py --cross-session` wired @bookend-@end (`session-end.md:174`) với đúng shape SE cần {applied · dormant · pct-FLOOR · DORMANT≠MISS} | Wire `applied-eval-nokey.ps1` (đang ghost-wire, có răng selftest 3/3) vào closeout; tailor-port shape mfe_judge; nhãn APPLIED/DORMANT vào luật sống |

**Gốc của "cứ sai mã" (trả lời nghi chính — XÁC NHẬN):** SE làm TAY đúng 3 việc hub đã script-hoá:
1. **Scaffold session** — BƯỚC 0.8 = prose; C10 WHY-block ghi first-person: *"the lead ECHOED that very rule verbatim … and then skipped it anyway — the folder was created ~1.5h late … only because the OWNER noticed"* (`governance-detectors.ps1:1580-1584`). *"A rule that lives only in lead memory is not a rule; it is a hope."*
2. **Tick + classify + history** — 0 script; lead tay chạy 3 lệnh git + viết entry văn xuôi mỗi phiên → lỗi đọc-số-cũ S147/S148, +2/cycle trap phải vá bằng LUẬT thay bằng máy.
3. **Ghi số sau audit (signal)** — tay chép từ return của vai → rơi nửa `view-*` @S148, backfill S146.
Luật đánh-số/label 2-tầng/form-file (`S<nn>` ⟂ `L<N>` · `_end` không đuôi · `_context-s-<N>.md`) đủ rắc rối để tay-thực-thi-nhiều-turn sinh lỗi lặp — đúng chữ anh "ép làm mấy turn mà cứ sai mã".

## ④ PHẦN D — PROPOSE kế hoạch vá (propose-only — lead verify rồi mới ghi spec; số mới = owner-SỐ)

### ① Đề-bài
Hội tụ SE về khuôn bookend 2-repo + cơ-khí-hoá session-model: diệt 3 bệnh gốc (**đo-rồi-như-chưa-đo · skip-im-lặng · 2-đích-1-người-ghi**) bằng MÁY, không bằng "nhớ kỹ hơn".

### ② Cách implement — per-hạng-mục (port = TAILOR về SE, KHÔNG copy nguyên)

**M1 — scaffold-CLI (session-model, ưu tiên 1).** File mới `scripts/session-scaffold.ps1` (SE convention `.ps1` pure-ASCII #30; nếu anh muốn đồng-bộ VIPIX thì node `.js` — owner chọn). Tailor từ `session_scaffold.py`: ts-moc = `git log -1 --format=%cI` (KHÔNG wall-clock) ghi vào SCAFFOLD-META · idempotent CẤM đè `_context` · regex `^session-\d+$` · 2 mode `-New` (cấp số max+1 — CHỈ `/session-start` gọi) ⟂ `-Ensure <N>` (tạo folder cho N đang mở — `/pause`·`/tiep` gọi, đúng tách-đôi cấp-số⟂tạo-thư-mục @S146) · template mới `.claude/templates/session-context-se.md` khớp form S148 (mẫu sống = `session-2/_context-s-2.md`). Sửa `session-start.md` BƯỚC 0.8 + `pause.md`/`tiep.md`: thay "lead tự tạo" → "chạy script". SCAFFOLD-META ts cho C10 nguồn so-sánh LATENESS về sau (siết hay không = owner).
**M2 — tick-CLI (V2 + session-model).** File mới `scripts/session-tick.ps1`: đọc/ghi `.claude/governance/.session-counter.json` atomic (temp+move) · idempotent per-label + per-HEAD (cơ-khí-hoá `_contract.tick` SE đã viết) · tự chạy 3-lệnh-git classify → in verdict `{CLEAN | SQUASH-BENIGN | FAIL-LOUD}` + append history entry **schema-hoá ngắn** (máy) thay văn xuôi tay. 🔴 TAILOR, KHÔNG port nguyên `h17_cadence.py`: GIỮ schema + semantics `class_repeat` hiện tại (consecutive-audit) — đổi semantics giữa lúc JUMP dải 3-4 đang treo = đổi thước giữa phép đo.
**M3 — signal-CLI (V2, đóng "đo rồi như chưa đo").** `scripts/session-signal.ps1 -Class <c> -Session S<nn>`: class ∈ enum `memory-budget.json lead_self_audit.flag_classes` fail-loud · idempotent max-1/class/phiên · cập nhật `class_repeat.counts` + 1 dòng history. Nghi-thức (j)(ii) đổi thành: vai trả FLAG → lead VERIFY → **gọi lệnh NGAY** (không đợi closeout).
**M4 — FLAG-khuôn + detector.** Luật 1 dòng ở home vai H24/trio: mỗi FLAG ghi `## FLAG-N — \`class\` — SEV` vào sub-MD ngay khi có (khuôn `sub-lead-view-S146.md` đã dùng tốt; h24-audit §9d.5 đã đề nghị). Detector mới (C11, INFORM-only) trong `governance-detectors.ps1`: sub-MD vai H24 mới nhất có `FLAG-` thiếu class-tag → FLAG.
**M5 — closeout-sentinel (V1).** `scripts/closeout-sentinel.ps1` tailor từ VIPIX (`:153`): kiểm 3 commit đóng-phiên gần nhất có delta CẢ `tooling-auditor/MEMORY.md` LẪN `harvest-curator/MEMORY.md`; in `verdict:` line (advisory exit-0); FLAG = CANDIDATE (Stop-hook `wal:` tách commit = FP đã biết — SE có cùng hook). Wire @session-start (soi phiên VỪA đóng).
**M6 — bookend-hoá call-site (owner-LUẬT, sau M1-M5).** Sửa `session-start.md` + `session-end.md`: cặp soi-lead (+ obs-pair V1) spawn **vô-điều-kiện 2 đầu phiên-LOGIC**; `/pause`·`/tiep` KHÔNG spawn (VIPIX `:76`); trio theo hình A/B anh chọn (dưới); port kèm D-1 freeze + PIN đích-danh + M-6 VERDICT-SCOPE.
**M7 — eval-use-side.** Wire `applied-eval-nokey.ps1` vào `session-end.md` §L.b (opt-in như `eval` của mfe trước, nâng dần); thêm nhãn `APPLIED/DORMANT/chờ-judge` vào luật sống (từ DEFER C14-2.4); shape report theo `mfe_judge --cross-session` (`AI_INFRA session-end:174`).
**M8 (optional) — V5 row-18 counter.** Detector INFORM đếm nhãn-đo (measured/calibrated/đã-đo) MỚI trong diff closeout — chú ý citation-trap: discriminator use⟂mention, loại dòng trích-dẫn.

### 🔴 RANH — 2 hình trình anh chọn (KHÔNG tự chốt)

| | **Hình A — AI_INFRA full-bookend** | **Hình B — VIPIX hybrid** |
|---|---|---|
| Nội dung | Trio + cặp soi-lead + obs chạy FULL 2 đầu MỌI phiên-logic; **RETIRE lịch** `light_every/deep_every` + OVERDUE + fire-decision; sống-sót = counter-ledger + tally | Cặp soi-lead + obs **bookend vô-điều-kiện 2 đầu**; **DEEP GIỮ counter** (`deep_every=15`, `>=` OVERDUE, fire-guard); nhãn light-fire retire, key GIỮ làm stats (owner-authority) |
| Ưu | Đơn giản nhất: cả LỚP bug "đọc-số-cũ/backfill/OVERDUE-nợ" biến mất **by definition**; khoảng-mù ngắn nhất | Đóng đủ 3 bệnh gốc đã thấy với giá rẻ hơn; **ÍT đổi state-schema nhất** (chính lý-do VIPIX chọn, `:155`); trio giữ quyền anh (consent S146 không bị đảo ngầm) |
| Nhược | Token đắt nhất (trio ×2 đầu mỗi phiên — hub anh đã chốt riêng *"đồng ý tăng token"*, SE **chưa có consent đó**; `token_est` hub = honest-N/A ⇒ cam kết A = cam kết mù về giá); đổi schema lớn; đảo consent-trio @S146 | Còn 1 lịch (deep) → lớp "đọc-số-cũ" còn đất sống (M2/M3 thu hẹp nhưng không diệt); 2 chế-độ song song = khó giải thích hơn |
| **Khuyến nghị (lý lẽ, không chốt)** | **B trước — A là đích nếu-token-cho-phép.** Vì: (i) mọi ca hỏng S144→S149 đều thuộc light/vết-sổ, **0 ca do "deep chưa tới hạn"**; (ii) SE = product-repo phiên ngắn nhiều product-work, chưa có số token thật (M2 sẽ cho số sau vài phiên → lúc đó quyết A có dữ liệu); (iii) VIPIX đã dogfood B sạch | |

**Câu JUMP-arm 3-4 class đang treo — bookend-hoá có tự RETIRE không? → KHÔNG, ở CẢ 2 hình.** Bằng chứng khuôn: AI_INFRA GIỮ `k_jump` — *"Vai SCHEDULER = DORMANT by construction … **Vai DETECTOR = SỐNG** … cơ-chế phản-ứng DUY NHẤT"* (`h17-cadence.json _lineage.k_jump`); VIPIX giữ nguyên jump-kéo-deep (deep còn counter). Áp SE: **Hình B** — jump giữ NGUYÊN nghĩa (kéo audit/deep sớm) ⇒ dải 3-4 treo vẫn là câu anh phải trả lời. **Hình A** — vế "kéo lịch" moot (audit đã mỗi phiên) nhưng vế ALERT sống: dải 3-4 chuyển thành RECURRENCE-ALERT trình owner để root-cause — **nợ không biến mất, chỉ mất cái cửa kéo-lịch**. Kèm bài M-1 bắt buộc nếu A: CẤM mọi cơ-chế wipe-tally-khi-audit-chạy (audit mỗi phiên ⇒ wipe mỗi phiên ⇒ jump thành prose-ma — `h17_cadence.py:15-22`).

### ③ Checklist {vai · deliverable · acceptance ĐO ĐƯỢC}

| # | Vai | Deliverable | Acceptance (lệnh chạy được) |
|---|---|---|---|
| K1 | 🔒 owner | Chọn hình A/B + consent token (nếu A) + trio consent→vô-điều-kiện? | vết chữ owner ≥1 bề-mặt (`grep -c 'hoi-tu-bookend' <session-log\|ACTIVE-MARKS>` ≥1) |
| K2 | implementer | M1 `session-scaffold.ps1` + template SE | chạy `-Ensure 3` ×2 → lần 2 in idempotent + `git status --porcelain .claude/sessions/` rỗng; `-DryRun` in kế-hoạch + 0 ghi; C10 sau đó 0 flag mới |
| K3 | implementer | M2 `session-tick.ps1` | cùng label ×2 → counter +1 không +2; sid lùi → exit≠0; fault-inject dangling-head trên cây tạm (`-RepoRoot`) → in `SQUASH-BENIGN` + entry máy |
| K4 | implementer | M3 `session-signal.ps1` | cùng (class,phiên) ×2 → no-op; class lạ → exit≠0 named; sau gọi → `git diff .session-counter.json` đúng 1 count đổi |
| K5 | em-main | M4 luật FLAG-khuôn + detector C11 | fault-inject sub-MD giả FLAG-thiếu-class trên cây tạm → FLAG; đủ class → 0-flag (khuôn S95 2-chiều) |
| K6 | implementer | M5 `closeout-sentinel.ps1` | chạy trên lịch-sử THẬT: S146/S147/S148 → FLAG (positive-control) · S140/S143 → PASS; đọc `verdict:` line, exit-code luôn 0 |
| K7 | em-main | M6 sửa 2 command call-site theo hình anh chọn | `grep -n 'vô-điều-kiện' session-start.md session-end.md` ra đúng khối mới; restart-lesson: hiệu-lực phiên SAU |
| K8 | em-main | M7 wire applied-eval + nhãn APPLIED/DORMANT vào luật sống | `grep -rn 'applied-eval' .claude/commands/` ≥1 (nay = 0); selftest vẫn 3/3 PASS exit 0 |
| K9 | em-main | Sửa 2 vết nhỏ @S149: `memory-budget.json:17` `_drift_check` stale "CHUA CO" (C9 đã land) + chạy fault-inject 2-chiều trên cap **20** (`_fault_inject:18` yêu cầu khi 16→20) | `taskList=21` → 4 dòng 🔴 + results≤20 · `taskList=20` → 0 dòng 🔴 |

Thứ tự: K1 (chỉ cần cho M6) ⟂ K2-K6 làm được NGAY không chờ (máy trung lập với hình A/B) → K7 sau K1 → K8-K9 độc lập.

## KHÔNG CHẮC
1. **Token-cost bookend cho SE chưa có số** — hub `token_est` = honest-N/A (0 instrument), SE cũng 0 instrument. Ước cũ hub {light ~60-100K · full ~250-500K/bookend} chỉ là "ước thô thiết-kế" (lineage). Con số nếu cần chốt = owner-SỐ, đề nghị đo bằng M2 vài phiên trước khi quyết A.
2. **VIPIX session-end đối-xứng (§1.5b-ter · §2.6c-tri) CHƯA đọc trực-tiếp** (task chỉ định session-start) — kết luận "VIPIX bookend 2 đầu" dựa era-note + cross-ref trong session-start (`:76`, `:85`). Độ tin cao, chưa nhìn thẳng file @end.
3. **"Sai mã" tôi đọc = lỗi tay session-model** (mã/nhãn phiên, form file, số N) — khớp C10 first-person + BƯỚC 0.8 phức tạp. Nếu ý anh là "code sản phẩm sai khi ép nhiều turn" thì gói M1-M3 không đủ, cần anh xác nhận nghĩa.
4. **SE trio §2.1.9 đã có tuần-tự/PIN chưa** — lane-B chỉ ghi "9 khoản (a)…(i) đầy đủ", tôi KHÔNG đọc lại nội dung từng khoản lượt này (kế thừa, không re-đo) ⇒ M6 phần "port carve-out tuần-tự + PIN" có thể trùng cái đã có (nếu trùng = no-op, không hại).
5. **`view-residual-asym` ∈ {0,3}** giữ nguyên bất-định (h24-audit chốt CẤM đoán) — mọi propose ở đây không phụ thuộc giá trị đó, nhưng câu trình owner về jump phải kèm dải, không số trần.

## ĐÃ CÂN NHẮC RỒI BÁC (≥3)
1. **Port nguyên `h17_cadence.py` (đổi luôn schema sliding-window)** — BÁC: đổi semantics `class_repeat` (consecutive-audit → distinct-sid-in-window) NGAY LÚC con số đang làm bằng-chứng trình owner (dải 3-4) = đổi thước giữa phép đo; và vứt lịch-sử tally SE. Tailor giữ schema (M2/M3), đổi semantics = quyết riêng của anh sau khi jump-treo xử xong.
2. **RETIRE `jump_on_class_repeat` khi bookend-hoá** — BÁC: cả 2 repo GIỮ nó; AI_INFRA lineage nói thẳng *"cơ-chế phản-ứng DUY NHẤT"* khi phiên ngắn lại; retire = vứt lớp phản-ứng mà không được gì (key rẻ).
3. **Fold C9/C10/C11-mới vào TOTAL detector ngay** — BÁC: INFORM-only NOT-in-TOTAL là owner-set anti-Goodhart (`governance-detectors.ps1:1673` ghi rõ *"fold+sev-raise is post-triage"*); tự fold = lấn owner + làm nhiễu baseline đang so-với-chính-nó.
4. **Sửa `.session-counter.json` bằng script NGAY trong lượt này** — BÁC: tôi là invest read-only + propose-only (H21: engine propose → lead verify → lead ghi); và JUMP đang treo, mọi mutation vào sổ lúc này phải qua lead.
5. **"Session-model = thêm câu nhắc đậm hơn vào command"** — BÁC bằng chứng cứng: C10 WHY-block — lead ECHO nguyên văn luật rồi VẪN skip (`governance-detectors.ps1:1580-1584`); + `feedback_root_cause_over_symptom` S122: *"bài-học nằm-trong-context KHÔNG tự bật … chặn được = LUẬT soi-được"* — ở đây còn mạnh hơn: chặn được = MÁY chạy thay tay.
6. **Chờ hub phát bản "session-model engine" chung rồi adopt một thể** — BÁC: 2 sister đã có máy chạy thật (py + js), SE đang chảy máu lỗi tay mỗi phiên; canonical-spec-over-broadcast cho phép pull thẳng từ repo canonical khi anh đã trỏ đích ("chạy đc VIPIX, AI_INFRA" = trỏ đích rồi).
