# S135 adap khung-nhịp-năm-vòng — sub-investigator-codebase-0

- run: `2026-07-17-S135-adap-khung-nhip-nam-vong`
- vai: investigator-codebase — ENGINE fable-real lệnh-A (single deep-pass)
- ngày đo: 2026-07-17
- đề-bài: ground-truth wave adap 7-item AI_INFRA 17-07 (13 trục T1-T13) + propose spec 3-mục
- nguyên tắc: mọi claim = đo trên đĩa (file:line + lệnh + output); doc stale → tin đĩa; không đo được → khai "CHƯA ĐO". KHÔNG chép số hub.

STATUS: IN-PROGRESS (ghi từng phần — chống #53)

## PHẦN 0 — Input digest (7 broadcast, cite 8-hex từ frontmatter content_sha256)

| # | File | 8-hex | Nội dung lõi cho wave |
|---|---|---|---|
| B1 | khung-nhip-nam-vong (17-07, CHUẨN) | `3daf5ee4` | 4 khoản floor mục 3 (tick đa-điểm · force-fire bù · dòng-nợ 3-vế · cadence ngày-lịch KHÔNG chuẩn) + event-gate 2-điều-kiện mục 4 + van TREO mục 5 + 2 detector mục 6 (closeout-thiếu-nghi-thức · per-ROLE) + SELF-CHECK 5 ô + đơn-vị phiên-LOGIC mục 7 |
| B2 | checklist-nam-vong (17-07) | `f71c5b65` | bảng A 5-vòng 7-cột · B 8-phép $0 (nhóm chỉ-đọc 1/3/4/5/8 · quan-sát/diễn-tập 2/6/7) · C completeness-gate = 5 vòng chức-năng + phép 1-4 |
| B3 | reply-adap-dot-16-07 (16-07, đích-danh SE) | `e50a4bd0` | do-token: method published `e0bb5bbf` → adap NGAY + đóng ask; 2 residual (crystallized-backfill.ps1 đuôi provenance + memory-budget.json:90 anchor NO-GO); đính-chính ngữ-nghĩa (số-cắt-ngắn ≠ real-N, = cận-trên ~1.4–2× KHÔNG cố-định → báo DẢI); mục 3 `_owner_ratified` wording note :121 ("tương-tự Hub" → "mốc khởi-đầu cố-ý; hub-counter đã gỡ per `85bf89ca`") + ratification = anh mark cổng reply + re-sync session-start.md:206 |
| B4 | reply-h24-cadence-3-gap (17-07, đích-danh SE) | `0b581ae7` | CONFIRM 3 gap (GAP-2 nặng nhất); khung SE "đo rải · làm dồn · nợ hiển thị" VÀO CHUẨN; câu-2 = nguyên tắc số 1 reword "nhịp vô-điều-kiện"; verdict: tick/dòng-nợ/eval-gộp/2-vai-vô-điều-kiện = nhận, event-gate = dè dặt 2-điều-kiện; 4 việc SE tự hẹn "đúng thẩm quyền, không cần chờ hub" |
| B5 | vong-bon giấc-ngủ (16-07) | `89e4d818` | khuôn 4-vai nén L2 {máy đề-xuất → đầu-tàu chưng-cất → cổng đối-chiếu tất-định grep-token → cửa-duyệt độc-lập fidelity}; additive; marker chống-nén-2-lần; 3 câu hỏi mục 4 (tầng thoát? cổng tất-định? vai độc-lập chấm?) |
| B6 | loi-phong-workflow chết-non (16-07) | `6c2eb2b1` | chữ-ký: chết-non ms, 0 agent 0 token, `JSON Parse error`/`Unexpected identifier` tầng máy; root-cause args = CHUỖI stringify; 3 chốt: object-thật · args-MỎNG (nội-dung dày → FILE, args = path+cờ) · giữ normalize = lưới-cuối |
| B7 | notify 2-bản + kênh hỏi-đáp (16-07) | `dacfcb11` | kênh Q&A qua hub (owner-chốt 16-07); nhịp phát xong-cái-nào-phát-cái-đó; 2 bản mới `eb12b9b8` (EOL errata — SE ĐÃ xử S129) + `0db707e4` (7 lớp lỗi) |

## T1 — TICK ĐA-ĐIỂM-VÀO

### (a) Hiện trạng đĩa

**Counter file `.claude/governance/.session-counter.json` (đọc trọn 38 dòng):**
- `:13-16` — `counter: 8`, `last_ticked_session: "S133"`, `last_ticked_head: a721989b…`, `last_ticked_at: 2026-07-17`.
- `:6` `_contract.tick` — **idempotent same-HEAD có sẵn**: "if head == last_ticked_head -> NO-OP … Else counter+1". ⇒ điểm chèn tick mới KHÔNG cần logic mới, chỉ cần GỌI cùng contract.
- `:7` `fail_loud_on_regress` + `:8` `overdue` formula `(counter - last_audit.light_at_counter) >= light_every` + `:9` jump_on_class_repeat + `:10` **writer = lead single-writer, "Wired at /session-start"** (duy nhất).
- `:17-21` `last_audit`: light_at_counter=3, deep_at_counter=3 (S124 credited both) → next light ~9, next deep ~18.
- `:26-36` history 2 entry FAIL-LOUD ancestor-check (S127, S133) — class "closeout squash làm head lúc tick thành dangling"; candidate-fix treo (chấp nhận dangling-object-exists làm bằng-chứng yếu khi counter không lùi).
- **Bằng-chứng sống GAP-1:** `last_ticked_session=S133` trong khi phiên hiện tại = S135 (S134 + S135 vào bằng `/tiep`, không qua `/session-start`) — 2 cửa "câm". git status đầu phiên cũng thấy `.session-counter.json` modified (tick S135 chưa commit? — sẽ đối chiếu ở T6 phép 1).

**Vị trí bước tick (đo grep 4 command file):**
- `session-start.md:181-206` §2.1.8 = NƠI DUY NHẤT có nghi-thức tick. `:185-190` = pseudo-code **inline** (không phải script .ps1 — lead tự chạy `git rev-parse HEAD` + Edit file). Trích `:188-189`: "nếu head == last_ticked_head → NO-OP (idempotent) / ngược lại → counter += 1 ; last_ticked_session = S<nn> ; …".
- `tiep.md` — grep `tick|counter|session-counter` = **0 match** ⇒ KHÔNG tick. Cấu trúc: §0 sàn-3 → §1 WAL → §2 đối-chứng → §3 ground-truth → §4 wf-recovery.
- `pause.md` — **0 match** ⇒ KHÔNG tick. 5 bước: ngừng-spawn → flush → WAL → commit `wal: pause` (bước 4, đích-danh path) → báo + DỪNG.
- `session-end.md:92-94` bước (j) H24 — CHỈ **ĐỌC** counter + in 1 dòng OVERDUE + INFORM; KHÔNG tick (chỉ update `last_audit` SAU khi vai H24 chạy).

**Bằng-chứng sống bổ sung (git diff + log):**
- `git diff .session-counter.json` = tick S133 (counter 7→8 + history entry FAIL-LOUD lần 2) **CHƯA COMMIT** — commit cuối chạm file = `72f68d1` (07-17 08:38, S131-S132 session-end). File nằm NGOÀI 3 path hook (by design `:4`) ⇒ cần git-add đích-danh lúc closeout, mà closeout S133 (`e53a693`) + S134 (`99fc373`) đều KHÔNG add ⇒ **governance-state uncommitted drift** (surprise — liên đới T3/T4).
- History `:26-36`: 2× FAIL-LOUD ancestor-check (S127, S133) class "closeout SQUASH làm head-lúc-tick thành dangling" — **candidate-fix treo** (chấp nhận dangling-object-exists làm bằng-chứng yếu khi counter không lùi) chờ anh/hub.

### (b) GAP so floor B1 mục 3.1 (`3daf5ee4`)
Floor: "Mọi cửa vào phiên VÀ mọi điểm dừng đều tăng bộ đếm". Hiện trạng: **1/4 điểm có tick** (session-start). /tiep (cửa vào) + /pause (điểm dừng) + session-end (điểm hội tụ) = **3 điểm câm**. Sống: S134+S135 vào bằng /tiep → counter đứng 8/S133.

### (c) Đề xuất cách làm
**Bẫy +1 phải giải trước:** SELF-CHECK B1 + phép 7 checklist đòi "dừng–nối 1 lần → counter **+1**" (không phải +2). Contract hiện chỉ dedup **same-HEAD** — mà /pause commit `wal: pause` làm HEAD đổi ⇒ tick ở CẢ pause lẫn tiep = **+2/cycle → FAIL phép 7**.
**Giải đề xuất (contract mở rộng 1 OR-guard):** `NO-OP nếu (head == last_ticked_head) HOẶC (session == last_ticked_session)` — dùng field `last_ticked_session` CÓ SẴN. Hệ quả:
- tick tại CẢ 4 điểm (session-start có sẵn + tiep + pause + session-end-close) — "không cửa nào câm" đúng nghĩa đen;
- 1 phiên-logic S<nn> = đúng 1 tick bất kể qua mấy cửa (pause trong S135 sau khi session-start đã tick S135 → NO-OP session-guard; /tiep mở S136 → +1) ⇒ phép 7 PASS;
- 2× /session-start cùng HEAD = +1 (HEAD-guard giữ nguyên).
**Điểm chèn cụ thể:** `tiep.md` sau §2 (đối-chứng xong, trước nối chain) + `pause.md` bước 3.5 (trước commit bước 4 — để tick nằm TRONG commit `wal: pause`) + `session-end.md` bước (j) thêm "(iii) tick-at-close". Mỗi chỗ 3-4 dòng TRỎ về contract §2.1.8 (B1 con-trỏ-canonical, KHÔNG chép logic).
**Alternative rẻ hơn (nếu anh không muốn đổi contract):** tick CHỈ tại /tiep + session-end-close (2 điểm), /pause không tick — phép 7 vẫn PASS nhưng "điểm dừng tăng đếm" chỉ đạt gián-tiếp. Decision-point cho anh/lead.
**Lưu ý restart:** command `.md` = NO hot-reload — `pause.md:9` ghi rõ "🔴 restart Claude Code sau khi tạo/sửa command .md". Tiền lệ S124 restart-lesson (project-memory harness4). ⇒ wave này sửa 4 command file ⇒ **restart bắt buộc trước khi đo phép 7**.
**Decision-point phụ:** candidate-fix dangling-head (history :30/:35) — gom vào wave này hay để riêng chờ hub (nó fire MỌI phiên-đầu-sau-closeout-squash, sẽ ồn hơn khi tick dày lên).

## T2 — DÒNG-NỢ 3-VẾ (floor B1 mục 3.3: nhịp-kiểm · cờ-trần-bộ-nhớ · run-chưa-gom, 1 dòng chỉ-đọc ~0)

### (a) Nguyên liệu sẵn có trên đĩa — CẢ 3 VẾ ĐỀU CÓ SẴN, chưa ai gom thành 1 dòng
- **Vế 1 nhịp-kiểm:** `.session-counter.json` (counter=8, last_audit light/deep@3) + `memory-budget.json:119-125` `h24_cadence` (light_every=6 `:122`, deep_every=15 `:123`, jump=3 `:124`). Tính sống: light 5/6 (due @counter 9 — CHƯA overdue), deep 5/15 (@18). Công thức OVERDUE đã chuẩn ở counter-contract `:8`.
- **Vế 2 cờ-trần-bộ-nhớ:** cap = `memory-budget.json:34` `archive_gate.autoinject_cap_bytes 25600`; đo = so byte `agent-memory/*/MEMORY.md` vs cap (logic có sẵn trong `scripts/memory-archive-gate.ps1` A1 `:48-50`). ⚠️ KHÔNG tái dụng nguyên con memory-archive-gate làm probe: (i) output multi-line PLAN, không phải 1 dòng; (ii) cờ `-Apply` ghi strikes (`:26` — mutation); default DRY read-only nhưng vẫn ồn. `measured` block `:142-156` là SNAPSHOT S107 (stale by-design) — probe phải đo TƯƠI byte-on-disk.
- **Vế 3 run-chưa-gom:** orphan-detector DUAL-ACCEPT canonical `tiep.md:40-53` (bash: run.md tồn tại ∧ thiếu `*-synthesis.md` phẳng ∧ thiếu `harvest/*-synthesis.md` non-empty). Đếm dòng ORPHAN = số run chưa gom.

### (b) GAP
Chưa có script nào in 3 vế thành 1 dòng; chưa điểm dừng nào in nợ. `/pause` bước 5 báo 4 ý (goal/[!]-đầu/wf/an-toàn) — KHÔNG có vế nợ nào; `/tiep` cũng không; session-start §2.1.8(e) + session-end (j)(i) mới in vế-1 (H24) đơn lẻ ở HAI ĐẦU, không phải mọi điểm dừng.

### (c) Đề xuất
**Script mới `scripts/nhip-no-probe.ps1`** (PS 5.1, pure-ASCII gotcha #30, NO-API, 0-mutation, `exit 0` LUÔN — noi gương `agent-frontmatter-eol-check.ps1` nấc INFORM session-end.md:211):
- I: đọc `.session-counter.json` + `memory-budget.json` (h24_cadence + archive_gate.cap) + scan `agent-memory/*/MEMORY.md` byte + port vòng orphan DUAL-ACCEPT (giữ đúng 2 dạng, dạng-3 retired).
- O: **đúng 1 dòng**: `NO-LINE: kiem light <a>/<e> deep <b>/<f> <OVERDUE:...|ok> | tran-bo-nho <x> sub over-cap | run-chua-gom <y>`; MỌI exception → in `probe-loi (khong chan)` + exit 0.
- Chỗ in (4 điểm — khớp tick T1): `/pause` bước 5 (thêm ý 5) · `/tiep` cuối §2 · session-start §2.1.8(e) (nâng dòng H24 hiện có thành dòng-nợ 3-vế) · session-end (j)(i) (tương tự). B1: command chỉ GỌI script, không chép logic.
- Phép 5 checklist (chạy-lại-được): script không ghi file nào (không strikes, không state) ⇒ 2 lần chạy output y hệt. Phép 6 (giết probe): lệnh gọi trong command bọc "lỗi → in probe-loi (khong chan), đi tiếp" — fault-inject: gọi với `-RepoRoot` không tồn tại → phải in probe-loi + điểm dừng vẫn hoàn tất.
- LUẬT: dòng-nợ KHÔNG BAO GIỜ chặn /pause / /tiep (floor B1 mục 3.3 nguyên văn).

## T3 — FORCE-FIRE BÙ khi closeout gộp sổ

### (a) Hiện trạng
- `session-end.md` đọc TRỌN (253 dòng): **KHÔNG có bước nào** phát hiện "closeout gộp sổ ≥2 phiên-dừng". Bước (j) `:92-94` chỉ check OVERDUE theo counter — mà counter đang đứng khi vào bằng /tiep (GAP-1) ⇒ gộp sổ càng nhiều, OVERDUE càng KHÔNG kêu = đúng vòng tự-che B4 mô tả.
- Bằng-chứng gộp-sổ THẬT (git log): `72f68d1` "S131-S132 session-end — … E-011/AS-15 **nghi-thức-chạy-tắt** + dồn H1/H2 **S127→S131**" (1 closeout gộp 6 nhãn-phiên S127-S132); `e9124fc` "S125-S126 closeout GOP". Đếm cửa-sổ (e9124fc → HEAD]: **7 commit `wal: pause`** + 18 `wal: flush` + 9 nhãn-phiên (S127→S135).
- Cách đếm phiên-dừng-trong-kỳ ĐO ĐƯỢC: `git log --format=%s <closeout-trước>..HEAD | grep -c '^wal: pause'` (số điểm dừng chủ-động) + đếm nhãn `S<nn>` mới trong session-log/subject kỳ đó. Cả 2 đều $0 chỉ-đọc.

### (b) GAP so floor B1 mục 3.2: floor đòi "closeout gộp ≥2 phiên-dừng → chạy lượt kiểm ngay closeout đó, bất kể counter". SE = 0 wire.

### (c) Đề xuất wire (session-end.md, chèn vào (j) thành mục (v)):
- **Điều kiện:** `P = grep -c '^wal: pause'` trên `<last-closeout>..HEAD` (last-closeout = commit gần nhất match closeout-pattern T4); NẾU `P >= 1` (tức kỳ này chứa ≥1 điểm dừng = closeout đang gộp ≥2 phiên-dừng) HOẶC nhãn đóng dạng `S<a>-S<b>` (b>a) → **force-fire bù**.
- **Hành động:** coi như `OVERDUE(light)` — in dòng-nợ + INFORM anh đề-xuất spawn cặp H24 light (lead-view + lead-omission) NGAY closeout này, bất kể counter. ⚠️ **Điểm lệch khung phải khai:** khung nói "chạy lượt kiểm"; SE có luật cứng "🔴 KHÔNG auto-run — anh consent mới chạy" (`session-end.md:94`, `session-start.md:203`) + việc SE tự hẹn hub = "light-run **owner-triggered**" ⇒ đề xuất giữ consent-gate: force-fire = force-INFORM-bắt-buộc + default-đề-xuất-chạy, anh gật thì chạy trong closeout. **Decision-point cho anh:** consent-gate (SE-specific, khai với hub) vs auto-run đúng chữ khung.
- Chạy trên trạng-thái nghỉ ✓ (closeout = điểm hội tụ, nguyên tắc 2 khung).

## T4 — DETECTOR closeout-thiếu-nghi-thức (khung `3daf5ee4` mục 6.1)

### (a) Hiện trạng
- **Detector hiện có trong `scripts/governance-detectors.ps1`** (grep banner + Write-Flag): derived-staleness counts vs STATUS canonical (`:172-237`) · H18-A derived-doc scan-range/stale-total (`:266-308`) · C1-wikilink resolve (`:380-415`) · WAL overwrite-not-append N.1 (`:484-491`) · **H24-1 title-freshness** (`:502+`) · Test-Quoted use⟂mention helper (`:596`) · **H24-3 session-label-lag** (`:664+`, NEW S123) · **H24-2 carry-age INFORM** (`:781+`, đọc `h24_cadence` fail-loud `:819-839`) · HANDOFF:5 mega-line (`:864-889`) · self-match check (`:905-914`). `exit 0` LUÔN, FLAG advisory (`:922-923`). ⇒ **0 detector nào nhìn commit-delta closeout** — GAP-2 đúng là "không detector nào hiện sở hữu" (khớp B4).
- **Closeout-pattern ĐO từ git log** (6 commit gần nhất match): `[CLAUDE] Docs: S<nn>[-S<mm>] {closeout|session-end|closeout-tail|closeout GOP} — …` ⇒ regex đề xuất: `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)`.
- **"Sổ nghi-thức bắt buộc" theo `session-end.md`:** STATUS.md Recently-Done (§L.b(a) `:54` + Phase 2.1 `:107`) · HANDOFF.md (Phase 2.1 `:107`) · session-log `docs/changelog/sessions/` (Phase 1 `:44`) · agent-memory flush mọi sub đã spawn (§L.b(d) `:57`) · WAL reset (§6.4 `:244-248`) · error-ledger (§L.a `:50` — CONDITIONAL khi có AS-hit) · run `*-synthesis.md` (§L.b(f)).
- **⭐ Phát hiện thiết kế (đo 4 closeout bằng `git show --name-only`):** delta sổ KHÔNG nằm trọn trong chính closeout-commit — hook `wal: flush` đã mang delta agent-memory đi TRƯỚC (vd diary S133 nằm ở `9f404d3` wal-flush 09:58, KHÔNG ở `e53a693`); closeout-tail `9e874ca` thiếu HANDOFF nhưng `72f68d1` cùng label S131-S132 có ⇒ **detector PHẢI đo UNION delta trên CỬA SỔ kỳ** `(closeout-trước .. closeout-này]` **theo session-label**, KHÔNG per-commit — nếu không sẽ 2/3 FAIL oan ngay trên dữ liệu lành.

### (b) GAP: 0 wire. (c) Đề xuất
Detector mới trong `governance-detectors.ps1` (tên: `H25-closeout-ritual` — tránh chữ trần "GAP"/"stale" per `_vocab_guard` memory-budget.json:128): input = commit gần nhất match closeout-regex → xác định label + cửa-sổ `(closeout-liền-trước .. commit]` → union `git log --name-only` cửa-sổ → check ≥1 delta mỗi sổ {STATUS, HANDOFF, session-log-mới, agent-memory/**} → thiếu sổ nào FLAG `MED` kể tên sổ. Advisory exit-0 (nhất quán script). **Fault-inject (S95 proves-teeth):** cây tạm `-RepoRoot` + commit giả subject closeout chỉ chạm 1 file lạ → PHẢI FLAG 4 sổ thiếu; control = tái tạo shape 99fc373 → PASS; boundary = closeout-tail thiếu HANDOFF nhưng union-window có → KHÔNG FLAG (chống dương-giả oan).

## T5 — DETECTOR per-ROLE (khung mục 6.2, GAP-3) + đo NGAY

### Số thật đo 2026-07-17
- Roster: **14 vai** = `.claude/agents/*.md` trừ README (cicd-monitor · database-agent · frontend-designer · harvest-curator · implementer-backend · implementer-frontend · investigator-api · investigator-codebase · lead-omission-auditor · lead-view-auditor · office-document · reviewer · test-specialist · tooling-auditor).
- Sổ: `.claude/agent-memory/<role>/MEMORY.md` tồn tại + byte>0 = **14/14** (min office-document 3323B; max cicd 22607B).
- **2 vai H24 (chạy S124):** lead-omission-auditor 3691B + lead-view-auditor 3332B — seed commit `72f68d1` (S131-S132, 07-17 08:38, subject có "seed 2 diary H24"). ⇒ **"harvest hồi tố sổ 2 vai" SE hẹn hub = ĐÃ XONG @S131-S132**, KHÔNG còn là việc wave này (chỉ còn báo-lại hub trong report).
- Vai đã-chạy-thiếu-sổ hiện tại = **0**. GAP-3 data-side ĐÓNG; cái THIẾU là **máy** (detector tự soi từ nay về sau).
- ⚠️ Bẫy mapping đo được: prefix sub-file trong `runs/` KHÔNG canonical — ngoài tên vai chuẩn còn `invest-A/B/C` · `w1/w2/w3-task` · `task` · `impl-runsreadme` · `impl-sleepcmd` · `review-r1/r2/r3` · `investigator-2-spec-draft`… ⇒ detector map-được-thì-map, **UNMAPPABLE → in danh-sách riêng, KHÔNG đoán** (bài S122: đo TÊN ≠ đo NỘI-DUNG, 32% dương-giả).

### Đề xuất
Detector `H25-role-notebook` cùng script: evidence-đã-chạy = (`runs/*/sub-<role>-*.md` khớp prefix-map) **OR** vai có mặt trong spawn-record session-log; mỗi vai đã-chạy PHẢI có `agent-memory/<role>/MEMORY.md` byte>0 → thiếu FLAG MED. Fault-inject: cây tạm xoá `lead-view-auditor/MEMORY.md` → FLAG; control 14/14 → PASS; boundary: sub-file prefix lạ → dòng "UNMAPPED" chứ không FLAG bừa.

## T6 — BASELINE 8-PHÉP (bảng B `f71c5b65`) — chạy phép 1/3/4 NGAY, số THẬT

**Khai đơn-vị + cửa-sổ (bẫy S130):** cửa-sổ = `(e9124fc 07-16T15:19 .. a6cd0a2 07-17T15:40]` (từ closeout S125-S126 tới HEAD lúc đo); "nhãn-phiên" = S-label xuất hiện trong commit-subject/session-log (proxy 2-nguồn); "tick" = increment `counter` trong `.session-counter.json`; đếm bằng `git log --format=%s --since=… | grep -c` (occurrence trên subject-line đơn, không mega-line ⇒ `-c` an toàn ở đây).

| Phép | Kết quả | Số + lệnh |
|---|---|---|
| **1 — tick vs cửa** | **FAIL (kẽ sống, đúng GAP-1)** | Nhãn-phiên trong cửa-sổ: **9** (S127…S135). Điểm dừng `wal: pause`: **7**. Tổng cửa+dừng ≈ 16. Tick cùng kỳ: **+3** (5→8: S127, S131, S133 — đọc history+diff counter). ⇒ ~13 cửa "câm". Riêng bằng-chứng tối-thiểu: S134+S135 vào /tiep, 0 tick. |
| **3 — closeout thiếu nghi-thức** | **PASS 3/3 theo UNION-per-label** (caveat bên dưới) | S134 `99fc373`: STATUS✓ HANDOFF✓ session-log✓ agent-memory✓(4 diary). S133 `e53a693`: STATUS✓ HANDOFF✓ session-log✓ + agent-memory qua `9f404d3` wal-flush cùng kỳ (per-commit-naive thì FAIL oan). S131-S132 `72f68d1`+tail `9e874ca`: đủ 4 sổ (union). ⚠️ Caveat: PASS này là SAU vá E-011/AS-15 @S131; kỳ S127-S130 trước đó chính là ca FAIL (GAP-2 đã báo hub — "dồn H1/H2 S127→S131"). Proxy mtime+commit-log không phân biệt "không chạy" vs "chạy không ghi sổ" (B2 ghi-chú (v)) — cả hai đều lỗi nên vẫn bắt đúng. |
| **4 — per-ROLE có sổ** | **PASS 14/14** | Xem T5 — 0 vai đã-chạy thiếu sổ (2 sổ H24 seeded 72f68d1). |
| 2 — dòng-nợ tại cửa | CHỜ IMPLEMENT (T2) — PASS-able sau wave | n/a |
| 5 — probe chạy-lại-được | CHỜ IMPLEMENT (nhip-no-probe.ps1 0-mutation) | n/a |
| 6 — giết probe điểm dừng sống | CHỜ IMPLEMENT (fault-inject case T2) | n/a |
| 7 — dừng–nối +1 | CHỜ IMPLEMENT (T1) + **cần restart** trước khi đo (command .md no hot-reload) | n/a |
| 8 — đối chiếu đóng-sổ vs khối-lượng | CHỜ IMPLEMENT (T3 force-fire chưa wire; phép 8 hub cũng CHƯA dogfood — khai thẳng) | n/a |

## T7 — RESIDUAL DO-TOKEN (reply `e50a4bd0` mục 2c/2d/3)

### (i) crystallized-backfill.ps1 — ⭐ LỆCH-TIỀN-ĐỀ (đo đĩa + git-history)
- Grep TRỌN file cho `token|draft|do-token|NO-GO|calibrat|method|provenance|e0bb5bbf`: cụm **"draft 2026-07-15" KHÔNG TỒN TẠI** trong file hiện tại. Đuôi provenance thật `:117` (TRÍCH NGUYÊN VĂN): `# heuristic RANGE (invariant 4): divisors = convention char/4 + VN ~3.0-3.5 byte/tok -- CHUA do tokenizer that tai SE (see dinh-chinh letter 58f5afd8 2026-07-16). tok_low = optimistic (bytes/4), tok_high = worst (bytes/3.0)` + `:25` `(4) HEURISTIC RANGE (convention, NOT measured)` + `:227` `char/4 is NOT a real token count`.
- `git log -S 'draft 2026-07-15' -- scripts/crystallized-backfill.ps1` = **RỖNG** ⇒ file **CHƯA TỪNG** chứa cụm đó trong toàn lịch sử. Anchor sống của ps1 = `58f5afd8` (đính-chính letter ĐÃ PUBLISHED) — hợp lệ, ngữ-nghĩa honest-RANGE sạch.
- ⇒ **Residual #1 của hub đặt SAI landing-site.** Cụm "draft 2026-07-15" thật sự sống ở 2 chỗ (grep repo-wide, loại history/letters): `memory-budget.json:65` + `memory-budget.json:90` — cả hai do commit `949ec33` (S129 disposition (iv)/(ii)) thêm vào. ⇒ ps1 = **NO-CHANGE**; errata-note blameless gửi hub trong adap-report. (Cùng class S134 hash-stale + S129 dương-giả-erratum: claim thư phải re-đo đĩa.)

### (ii) memory-budget.json — dòng THẬT hiện tại
- **`:65`** (mfe `honest_caveats.token_estimate`) — TRÍCH đoạn mang bệnh: `…real-N when it matters = harness Read-truncation notice per hub 'do token that' method, draft 2026-07-15, adopt-on-broadcast…` → mang CẢ 2 bệnh: anchor NO-GO + đánh-đồng notice = "real-N".
- **`:90`** (harness_floor `_owner_override_note`) — TRÍCH đoạn mang bệnh: `…when a real figure is needed, MEASURE FRESH via harness Read-truncation notice N (hub 'do token that khong can API key' method, draft 2026-07-15, adopt-on-broadcast), do NOT store-and-trust…` → anchor NO-GO + "MEASURE FRESH via notice" ngầm coi notice = phép đo.
- **Note "tương-tự Hub": dòng THẬT = `:121`** (`_owner_ratified` trong `h24_cadence`) — hub nói :121 ĐÚNG, thư SE ghi :123 lệch 2 dòng. TRÍCH: `"_owner_ratified": "owner-decisions-15-07-2026 Q2 -- anh chot 6/15/3, 'tuong tu Hub'. HONEST-CAVEAT…hub explicitly said 'your numbers = your config…'. SE picked the same 6/15/3 as a DELIBERATE STARTING POINT…Re-tune after cycle-2…"`.

### (iii) Sweep ngữ-nghĩa quanh đó (grep `real|measured|token` 2 file + liên quan)
Chỗ đánh-đồng số-cắt-ngắn = real-N/đã-đo: **CHỈ 2 site sống** = budget `:65` + `:90` (như trên). Các site khác sạch: ps1 `:25/:117/:227` honest-RANGE; `mfe-eval.ps1` honest-RANGE không-nhãn (S128 đã sweep); các file mang cụm còn lại = lịch-sử/thư đóng băng (`runs/2026-07-16-S127-…/owner-gated-proposals:44` · `broadcasts/outbox/…disposition…:17` · inbox reply chính nó) — KHÔNG sửa history; riêng `docs/governance/adap-reports/2026-07-16-…-san-su-that-nhan-da-do.md:19` ghi "ask do-token giữ MỞ" = trạng-thái NAY ĐÃ LẬT → cần **append** 1 dòng đính-chính (additive, không rewrite).

### (iv) Dòng thay ĐỀ XUẤT (theo reply, để hmw áp)
- `:65` thay đoạn bệnh → `…khi cần số thật: dùng notice cắt-ngắn của Read làm CẬN-TRÊN bảo-toàn (heuristic ký-tự/2, đếm-thừa ~1.4-2x KHÔNG cố-định — KHÔNG phải real-N/đã-đo) → báo DẢI [sàn bytes/4 — trần tín-hiệu-cắt-ngắn], token thật nằm trong dải; per bản published 2026-07-15-Governance-phuong-phap-dem-token-tien-de-vong4 (content_sha256 e0bb5bbf)…` (giữ phần RANGE [bytes/4 .. bytes/3.0] + FIT bytes/3.0 nguyên vẹn — đã đúng).
- `:90` thay `MEASURE FRESH via harness Read-truncation notice N (hub…draft 2026-07-15, adopt-on-broadcast)` → `lấy DẢI TƯƠI [sàn char/4 — trần notice-cắt-ngắn (cận-trên ~1.4-2x không cố-định)] per bản published …tien-de-vong4 (e0bb5bbf); CẤM dán nhãn real/đã-đo cho một đầu dải`.
- `:121` `_owner_ratified` thay trọn → giữ 2 chốt-gốc + ratification + sửa cụm "tuong tu Hub": `owner-decisions-15-07-2026 Q2 (anh chot 6/15/3 cho SE) + hub H0-LEAD-AUDIT-DECISION-CAPTURE-2026-07-14.md:105 (6/15/3/3, 'doi = anh', 2026-07-14); ratified = anh mark cong reply 2026-07-16-ai_infra-to-se-reply-adap-dot-16-07 (e50a4bd0) ngay 2026-07-17. 6/15/3 = moc khoi-dau CO Y anh chon — KHONG phai muon so song cua hub: hub-counter DA GO per 85bf89ca, khong con moc so song. Re-tune sau chu-ky-2 CUA SE (deep-audit lan 2).` (ASCII-safe trong JSON — file này đang toàn ASCII-VN-không-dấu, giữ nhất quán.)

## T8 — SESSION-START.MD:206 (F10 re-sync)

- Vùng `:195-215` đã trích ở T1. **`:206` NGUYÊN VĂN hiện tại** = honest-caveat 6/15/3: `> 🟡 Honest-caveat mang theo khi báo hub: hub nói rõ "số của các em = config của các em; ĐỪNG chép 3 số này". SE chọn cùng 6/15/3 là điểm khởi-đầu anh CỐ Ý chọn, KHÔNG phải chép vô-thức. Chỉnh lại sau chu-kỳ-2 CỦA SE (deep-audit lần 2, xem .session-counter.json last_audit). Hub đã GỠ counter (bookend 07-15, sha 85bf89ca) → ví-dụ 6/15/3 "ở nguồn" = lịch-sử, KHÔNG còn mốc hub để so; delta hub hứa từ run-2 KHÔNG BAO GIỜ có (hub gỡ trước run-2) — chưa ai được bán câu "đã chứng minh hiệu-quả".`
- Grep toàn file `do-token|ratified|owner_ratified|e0bb5bbf|85bf89ca|reply`: **:206 là chỗ DUY NHẤT** nhắc chuyện này (match khác = generic: :76 chờ-anh-chọn, :148 marks, :158/:167 pending-decisions bucket). ⇒ KHÔNG có câu "CHỜ HUB pending" riêng trong session-start.md; trạng-thái treo sống ở HANDOFF carry + adap-report :19 (T7-iii/T13).
- **Re-sync đề xuất (additive 1 vế cuối :206):** `…— chưa ai được bán câu "đã chứng minh hiệu-quả". ✅ Ratified 2026-07-17: anh mark cổng reply e50a4bd0; canonical = memory-budget.json h24_cadence._owner_ratified (B1 — đọc wording sống ở đó, đừng chép lại đây).` — con-trỏ về key canonical, không nhân bản wording.

## T9 — NON-JSON-ARGS 3 CHỐT (broadcast `6c2eb2b1`)

### (i) Parse-guard hiện tại — TRÍCH `hmw.js:97-98,101`
- `:97` `// S4b — args có thể tới OBJECT hoặc JSON-STRING (harness đôi khi stringify object args) → normalize defensive`
- `:98` `const A = (typeof args === 'string') ? JSON.parse(args) : (args || {})`
- `:101` throw msg `…(đã thử JSON.parse nếu args bị stringify.)`
⇒ **Chốt-3 ĐÃ ĐÚNG VAI sẵn**: comment tự khai "harness đôi khi stringify" = lưới-cuối cho ca tầng-máy, khớp nguyên văn B6 mục 4.3. (Vị trí cũ :38 S110 → nay :97, file đã lớn thêm.)

### (ii) Args hiện mang gì (tiền lệ S134 đo `runs/2026-07-17-S134-pe-luyke-tam-tinh/run.md`)
- Spec bơm qua **`args.taskList[].prompt`** (string DÀY nhét trong JSON args) — run.md `## taskList snapshot` giữ bản mirror trên đĩa; spec-v2 file cũng nằm sẵn `runs/<id>/spec-*.md` (lead ghi @H21①3). S134 hmw INV-2 `wf_58302bd5` + INV-3 `wf_97d6a582` chạy **0-garble 2/2 + 1/1** với prompt-embed ⇒ đường hiện tại CHẠY ĐƯỢC (n=3 lane gần nhất), nhưng args phình theo spec = đúng vector B6 mục 4.2 cảnh báo.
- `hmw.js:14-19` shape args {taskList, run, checkpointApproved…}; memory-pack cũng inject qua args (memory-budget.json:103 "hmw.js:124 args inject").

### (iii) Đánh giá 3 chốt
| Chốt B6 | Hiện trạng SE | Verdict |
|---|---|---|
| 1. args = object-thật | Lead practice truyền object (Workflow tool); **CHƯA có câu LUẬT tường minh "CẤM tự stringify"** trong fable-real.md/hmw.js — chỉ có comment mô tả | GAP nhỏ: thêm 1 dòng luật (điểm chèn: `hmw.js:97` comment + `fable-real.md` block args.run) |
| 2. args-MỎNG (dày → FILE) | **CONFLICT THẬT với H21:** `fable-real.md:31` nguyên văn: `4. **Worker thực-thi THEO spec** — spec bơm **QUA ARGS/prompt** (worker KHÔNG tự Read file).` — trong khi B6 4.2: "nội-dung dày để trong FILE; args chỉ mang đường-dẫn + vài cờ — worker tự Read tệp đó" | Use⟂mention: (a) engine-đắt lệnh-A/B = **Agent-tool prompt string** — KHÔNG đi qua tầng parse JSON-args của Workflow ⇒ B6-class không áp, prompt-embed GIỮ; (b) hmw fan-out = Workflow args JSON ⇒ B6 áp. **Reconcile đề xuất:** sửa `fable-real.md:31` → "spec bơm qua args = **CON-TRỎ** `runs/<id>/spec-*.md` (bản lead-đã-verify) + digest ngắn/AC-ids; worker Read **ĐÚNG file con-trỏ** (được phép per B6 chốt-2); CẤM tự lục file NGOÀI con-trỏ" — giữ nguyên intent gốc (worker không tự đoán nguồn), bỏ đúng phần xung đột. **Decision-point anh/lead** (đổi luật H21). |
| 3. giữ normalize = lưới-cuối | `:98` giữ nguyên, đúng vai | KHỚP — 0 việc |

### (iv) Sổ SE — ca chết-non parse
`grep -rn "JSON Parse error|Unexpected identifier" docs/gotchas.md docs/changelog/sessions/ .claude/agent-memory/` = **RỖNG** ⇒ SE **CHƯA TỪNG ghi sổ** ca chết-non B6-class. Phân loại 3 ca cũ: S65/S73 = args-đến-dạng-STRING từ harness (guard `:98` cứu — KHÔNG chết-non) · S108 + #53×20 = return-garble (class KHÁC hẳn — sau khi agent đã chạy). ⇒ 3 chốt = phòng-ngừa forward + 1 luật thiếu + 1 reconcile; KHÔNG có nợ hồi tố.

## T10 — VÒNG 4 GIẤC-NGỦ (broadcast `89e4d818`)

### Khuôn SE hiện tại (`.claude/commands/sleep-recovery-memory-l2.md`, 125 dòng)
Map 1-1 với khuôn 4-vai hub B5 mục 2:
| Vai hub | SE (đã có TRƯỚC broadcast) | Cite |
|---|---|---|
| Máy đề-xuất (propose-only) | `harvest-curator` PROPOSE-ONLY, charter cấm-ghi | `:63-70` Phase 1 |
| Đầu-tàu chưng-cất | lead distill 4-field {VIỆC·KẾT-LUẬN·BÀI-HỌC·BẤT-NGỜ} + GỘP + reflection 3-5 | `:72-82` Phase 2 |
| Cổng đối-chiếu tất-định | coverage-diff DETERMINISTIC 5 token-class {surprise·guard·file:line·root-cause·gotcha#} LUÔN chạy + G-009 byte-scan mojibake | `:88-91` Phase 3a + `:101` Phase 4.3 |
| Cửa-duyệt độc-lập fidelity | `reviewer` gate keep-vs-drop, G-001 lead KHÔNG tự chấm | `:93-95` Phase 3b |
Marker chống-nén-2-lần: `distill-gen: N` refuse pass-2 (`:60` Phase 0.3 + `:118`) ✓ additive file-MỚI không đè (`:116`) ✓. ⇒ **3 câu hỏi B5 mục 4 = CÓ/CÓ/CÓ** — chi tiết số dưới.

### Số đo đĩa 2026-07-17
- 10/14 role có `archive/`; **29 verbatim + 13 gist**, tổng archive **946,133B (~924KB)**; L1 tổng 14 role ≈ 203KB. Gist phủ kỳ 2026-05 + 2026-06; **2026-07 verbatim CHƯA nén (còn tươi — đúng nguyên tắc tuổi)**. investigator-api archive rỗng (133B).
- `distill-gen` marker sống trong gist thật (cicd/impl-be/fe-designer/harvest…: gen-1; inv-cb 2026-06 = gen-2 tiền lệ guard).
- Mốc nén gần nhất: `last_sleep_at = "2026-07-10"` (`memory-budget.json:4`) — hôm nay 17-07 = **đúng 7 ngày → INFORM-7d đã fire** (S132 closeout subject có "sleep-INFORM-7d").
- (a) Tầng thoát: CÓ, không phình một chiều (curate L1→L2 nhiều đợt S70/S80/S125 + sleep ≥2 đợt). (b) Cổng tất-định: CÓ nhưng **mức thủ-tục Grep-do-lead**, chưa script-hoá (hub = script grep 58-token + byte-scan). (c) Vai độc-lập chấm: CÓ (reviewer).

### GAP so B5 (3 nâng-khuôn + 1 lệch-nguyên-tắc)
1. **Cross-file bleed** (bài hub trả giá 1 token thật): SE chưa có luật "khi nén NHIỀU tệp cùng lượt → grep TỪNG token trích-dẫn về ĐÚNG verbatim CỦA TỆP ĐÓ". Chèn Phase 3a.
2. **Tổng-hợp đầu tệp + grep-ngược:** SE `:77` reflection 3-5 entry nhưng KHÔNG buộc đặt ĐẦU tệp (hub: tổng-hợp = lớp nạp-nóng, viết TRƯỚC chi-tiết — owner-3-chốt) + KHÔNG có bước grep-ngược số/mốc trong tổng-hợp về phụ-lục/nguyên-bản (hub lesson 3: tổng-hợp = lớp trôi nhanh nhất). Chèn Phase 2 + 3a.
3. (optional) Script-hoá cổng 3a → nâng "cơ-chế" cột-7 checklist A.
4. ⭐ **Trigger 7-ngày = ngày-lịch — LỆCH khung mới** (B1 mục 3.4 cadence ngày-lịch KHÔNG vào chuẩn + row-4 bảng: "NÉN theo ngưỡng tích lũy, KHÔNG theo phiên"). Đề xuất: đổi INFORM-trigger `last_sleep_at ≥ 7d` → **ngưỡng tích lũy byte verbatim-chưa-gist** (đo được: tổng byte `<period>.md` không có `.gist.md` tương ứng). Số ngưỡng = **owner đặt** (KHÔNG bịa); baseline đo hôm nay in kèm để anh chọn.
**Timing wave:** chỉ NÂNG SKILL (sửa command .md + trigger) — KHÔNG chạy nén trong wave (2026-07 còn tươi; chạy khi chạm ngưỡng anh đặt).

## T11 — MAPPING 5-VÒNG (bảng A `f71c5b65`)

| Vòng | Vai/cơ-chế SE thật | Nấc THẬT | Tự-verify cột-5 |
|---|---|---|---|
| 1. tooling+harvest | H1 `tooling-auditor` + H2 `harvest-curator`: MỞ `session-start.md:109-110,:123-124` (diff vs last) · ĐÓNG `session-end.md:100` (g) + `:57,:59` (d)(f) | runtime (nhiều lượt thật; gần nhất DỒN S127→S131 @`72f68d1`) | **FAIL hiện hành:** `git log --since 08:39 -- agent-memory/{tooling-auditor,harvest-curator}` = **0 vết** ⇒ 2 closeout gần nhất (S133 `e53a693` + S134 `99fc373`) KHÔNG spawn cặp — class E-011 "chạy tắt khi dồn/feature-session" TÁI DIỄN ngay sau vá. (d)-harvest lead tự làm ✓ nhưng (f)(g) monitor-gate skip. ⇒ đúng chỗ force-fire T3 + detector T4 cắn. |
| 2. soi-lead (view+omission) | 2 vai H24 + counter + `h24_cadence` 6/15/3 (`memory-budget.json:122-124`) — reply B4 câu-2: "thưa-số hợp lệ, chỉ cần vá GAP-1" | runtime (first-run S124 owner-triggered, 0-garble; 9+4 flag + 1 escalate) | Tính: counter=8, last light@3 → 5/6 **chưa OVERDUE; fire @counter 9** (deep 5/15 @18). Sau wire T1 + restart: phiên kế /tiep tick →9 ⇒ light OVERDUE fire NGAY ⇒ đề-xuất-2 S131 (light-run-now) gần-moot. |
| 3. bộ-ba đo→đề-xuất→kiểm trí nhớ | Mảnh CÓ: đo = `measure-agent-memory.ps1` + bảng-số `crystallized-backfill.ps1` @(c) · đề-xuất = `memory-archive-gate.ps1` DRY-PLAN + `memory-selfimprove-audit.ps1` (eval) · kiểm = `mfe-eval.ps1` coverage + reviewer/H2 gate · lead single-writer D9 ✓ | **PARTIAL — GAP THẬT, không gượng-map:** 3 mảnh chạy RỜI trong §L.b(c), KHÔNG có run-record 3-stage tuần-tự (cột-5 "mtime tăng dần" KHÔNG chạy được as-is); vai kiểm độc-lập chỉ có ở sleep (reviewer) — daily flush dựa H2 5-trục vốn đang bị skip (vòng-1) | Đề xuất rẻ: gói 3 script thành block "memory-triple đo→đề-xuất→kiểm" 3 dòng ghi session-log mỗi closeout chạy (c) — artifact-hoá tuần-tự, 0 vai mới |
| 4. giấc-ngủ distill | T10 — khuôn 4-vai ĐỦ + marker + additive | executed-file + runtime (13 gist 2 kỳ; last 2026-07-10) | Mốc nén đọc được (`budget.json:4`) + verbatim nguyên vẹn per-file (additive by-construction; hash-assert per-file = nâng-cấp đề xuất T10) |
| 5. sàn-sự-thật "đã-đo" | adap-report `…san-su-that-nhan-da-do.md` | executed (LUẬT + 2 site budget.json + câu cửa-duyệt) | **verified-pending DUY NHẤT = 4c** `reviewer.md:46` (`:17,:60,:80`: cần restart + 1 spawn-test) — **ĐO WAVE NÀY: điều kiện ĐÃ XẢY RA** — S129 commit 23:16 → S130+ = app-launch mới (restart implied) + reviewer spawned ≥2 lần S133/S134 (fable-real reviewer + precommit `wf_8bb5abee` PASS) ⇒ persona nạp lại chắc chắn. Caveat trung thực: câu `:46` được NẠP, việc nó được EXERCISE trong verdict chưa chứng riêng; nấc `verified` vẫn của AI_INFRA /adap-audit. Wave: append note flip vào adap-report. |

## T12 — COMPLETENESS-GATE C

- 5 vòng mức chức-năng: **4 CÓ + 1 PARTIAL** (vòng-3; vòng-1 CÓ-chức-năng nhưng kỷ-luật đứt khi dồn — tự-verify FAIL). Phép sàn 1-4: **2/4 PASS** (phép 3 union ✓, phép 4 ✓; phép 1 FAIL sống; phép 2 chưa-wire).
- **Kết luận: CHƯA ĐẠT hiện tại — "đạt-sau-wave" dự kiến 5/5 vòng + 4/4 phép sàn**, trong đó: phép 2 PASS ngay khi probe wire; phép 1 PASS-able sau restart + 1 chu-kỳ dừng–nối đo thật (KHÔNG khai trước khi đo); vòng-3 lên CÓ khi block memory-triple artifact-hoá; vòng-1 tự-verify về PASS nhờ force-fire T3 + detector T4 (cơ-chế thay trí-nhớ). n/a hợp lệ: KHÔNG có — SE đã adopt cadence + soi-lead nên gate ÁP ĐỦ (B2 §C).

## T13 — CARRIES ĐÓNG ĐƯỢC + VIỆC ĐÃ HẸN

**(i) Carry đóng nhờ 2 reply** (HANDOFF nay 332 dòng — mega-line ĐÃ TÁCH @S130 `cdb6279`, cảnh báo đề-bài stale; grep thẳng được):
| Carry (HANDOFF:7/:11/:15/:19) | Mục reply đóng |
|---|---|
| "CHỜ HUB reply-batch (i) `_owner_ratified`" | B3 mục 3 (2 chốt-gốc + wording + ratification tại cổng) → wave áp `:121`+`:206` xong là ĐÓNG |
| "do-token errata/ask" | B3 mục 2a: method published `e0bb5bbf` → **adap NGAY + đóng ask** (giữ pending = chờ nhầm bản); residual `:65/:90` vá wave |
| "(iii) seal-verify" | B3 mục 1 cặp-hai: tự-khớp (defer theo hub) — ĐÓNG, 0 việc mới |
| "phản-hồi closure-cadence/3-gap" | B4 trọn thư: CONFIRM 3 gap + khung SE vào chuẩn — ĐÓNG (việc còn lại = thực-thi wave) |
| "chữ-ký bản owner-sign 07-14" | B3 mục 4: git-anchor `e597497`, KHÔNG re-stamp — ĐÓNG |
| "carry-age — bằng-chứng S130 đủ đóng?" | KHÔNG thuộc 2 reply — để anh chốt riêng (ngoài wave) |

**(ii) 4 việc SE hẹn hub — NGUYÊN VĂN `broadcasts/outbox/ai_infra/2026-07-17-se-to-ai_infra-h24-h22-van-hanh-3-gap.md:40-42`:** `1. Wire tick vào /tiep (+ cân nhắc tick-at-close idempotent) — vá trong repo SE, sẽ báo kết quả đo sau.` · `2. Spawn dồn H1+H2 re-report phủ S127→S131 + harvest hồi tố diary 2 vai H24 từ run S124 (VERIFY→APPEND) + ghi error-ledger cho 3 closeout chạy tắt.` · `3. H24 light-run owner-triggered ngay thay vì chờ counter 9.` (B4:24 đọc gộp thành 4 việc — tách harvest khỏi 2.)
- Việc 1 → **VÀO SPEC wave** (T1). Việc 2 → **ĐÃ XONG @S131-S132** `72f68d1` (dồn H1/H2 GAPS→CLOSED + seed 2 diary 3332B/3691B + E-011/AS-15) — wave chỉ còn BÁO-LẠI hub kèm số. Việc 3 → riêng, chờ anh (phân tích moot ở T11 vòng-2).

**(iii) 2 đề-xuất S131 "CHỜ GẬT" — đã đủ tính là gật chưa?** HANDOFF:15 ghi CHỜ GẬT của ANH (không phải hub; outbox:38 "đã trình owner, chờ gật từng mục"). Phân tích để anh/lead chốt: đề-xuất-1 (wire tick) nay = khoản floor 3.1 của bản CHUẨN hub + anh gõ /adap-apply wave này ⇒ **gật-implied qua lệnh áp chuẩn** (defensible); đề-xuất-2 (light-run NGAY) = one-shot action KHÔNG nằm trong broadcast nào ⇒ /adap-apply KHÔNG tự cover — cần anh gật riêng HOẶC để OVERDUE @counter-9 tự kích phiên kế (gần-moot sau wire). **Không tự quyết — flag 2 dòng này trong spec cho anh.**

---

# SPEC PROPOSE 3-MỤC (để lead verify + ghi `spec-*.md`, fable-real reviewer soi, hmw Opus 4.8 MAX implement)

## ① Đề-bài gộp wave
Áp khung owner-chốt "đo rải · làm dồn · nợ hiển thị" (`3daf5ee4` 4-khoản floor + 2 detector) + checklist 5-vòng/8-phép (`f71c5b65`) + đóng residual do-token & `_owner_ratified` (`e50a4bd0`) + 3 chốt non-JSON-args (`6c2eb2b1`) + nâng khuôn giấc-ngủ (`89e4d818`) — mục tiêu đo được: SE qua completeness-gate C (hiện 2/4 phép sàn + 1 vòng PARTIAL → 4/4 + 5/5 sau wave, phép 1/7 đo sau restart).

## ② Cách làm per-item (file đích + thay đổi cụ thể)
1. **Tick đa-điểm-vào** — (a) `.claude/governance/.session-counter.json` `_contract.tick` (:6): thêm OR-guard `if head==last_ticked_head OR session==last_ticked_session -> NO-OP`; (b) `tiep.md` chèn bước mới cuối §2 "TICK counter (contract §2.1.8 session-start — con-trỏ, không chép logic)"; (c) `pause.md` bước 3.5 (TRƯỚC commit bước 4 để tick nằm trong `wal: pause`); (d) `session-end.md` (j) thêm "(v) tick-at-close"; (e) `session-start.md` §2.1.8 thêm 1 dòng đơn-vị: "counter đếm nhãn-phiên S<nn> (phiên thường — SE chưa adopt session-logic `9234a7aa`; nếu adopt, đọc lại = phiên-LOGIC)". **DP-1 (anh):** OR-guard session-label (khuyên — 4 điểm tick, phép 7 vẫn +1) vs tick-chỉ-tiep+close (không đổi contract). **DP-2:** candidate-fix dangling-head (counter history :30/:35) gom wave này? (fire mỗi phiên-đầu-sau-squash).
2. **Dòng-nợ** — script MỚI `scripts/nhip-no-probe.ps1` (PS5.1 ASCII #30, NO-API, 0-mutation, exit-0-LUÔN): đọc counter+cadence → `light a/e deep b/f OVERDUE?`; scan `agent-memory/*/MEMORY.md` vs cap 25600 → `x over-cap`; port orphan DUAL-ACCEPT (2 dạng, port đúng `tiep.md:40-53`) → `y run-chua-gom`; in ĐÚNG 1 dòng; exception → `probe-loi (khong chan)`. Gọi tại 4 điểm: `/pause` bước 5 (+ý 5) · `/tiep` cuối §2 · session-start §2.1.8(e) · session-end (j)(i) — nâng dòng H24 hiện có thành dòng-nợ 3-vế.
3. **Force-fire bù** — `session-end.md` (j) "(vi)": `P=git log --format=%s <closeout-trước>..HEAD | grep -c '^wal: pause'` (LUÔN so-sánh SỐ, né bẫy exit-code :175); `P>=1` HOẶC label `S<a>-S<b>` → coi như OVERDUE(light): in dòng-nợ + **INFORM-bắt-buộc + đề-xuất spawn cặp H24 ngay closeout**. **DP-3 (anh):** consent-gate (khớp luật `:94` + hẹn "owner-triggered", khai carve-out với hub) vs auto-run đúng chữ khung.
4. **Detector `H25-closeout-ritual`** — append `scripts/governance-detectors.ps1`: commit gần nhất match `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` → cửa-sổ `(closeout-liền-trước..commit]` → **union** `git log --name-only` → thiếu 1 trong {`docs/STATUS.md`, `docs/HANDOFF.md`, `docs/changelog/sessions/*` mới, `.claude/agent-memory/**`} → FLAG MED kể tên sổ. Fault-inject 3 ca (T4c): giả-closeout-1-file → FLAG · shape-99fc373 → PASS · tail-thiếu-HANDOFF-nhưng-union-có → KHÔNG FLAG.
5. **Detector `H25-role-notebook`** — cùng file: roster từ `.claude/agents/*.md` (trừ README); evidence-đã-chạy = `runs/*/sub-<role>-*.md` (prefix-map, UNMAPPED → in danh-sách không FLAG) OR diary đã tồn tại; vai đã-chạy thiếu `agent-memory/<role>/MEMORY.md` (byte>0) → FLAG MED. Fault-inject: cây tạm xoá 1 diary → FLAG; 14/14 → PASS.
6. **Residual do-token + ratified** — dòng thay GHI SẴN tại T7(iv)/T8: `memory-budget.json:65` + `:90` (re-anchor `e0bb5bbf` + ngữ-nghĩa DẢI cận-trên ~1.4–2×) + `:121` `_owner_ratified` bản mới (2 chốt-gốc + ratified cổng reply + bỏ "tuong tu Hub") + `session-start.md:206` vế additive trỏ key canonical. `crystallized-backfill.ps1` = **NO-CHANGE** (T7i: chưa từng chứa cụm — errata-note blameless cho hub). `docs/governance/adap-reports/2026-07-16-…-san-su-that…md` — 2 append additive: đóng-ask do-token (per `e0bb5bbf` published) + flip-note 4c (restart+spawn-test đã xảy S133/S134, nấc verified vẫn của hub).
7. **Non-JSON-args** — `hmw.js:97` comment + `fable-real.md` (block args.run): thêm câu LUẬT "args LUÔN object-thật — normalize `:98` = lưới-cuối, KHÔNG phải giấy phép stringify (per `6c2eb2b1`)". **DP-4 (anh):** `fable-real.md:31` reconcile → "spec bơm qua args = CON-TRỎ `runs/<id>/spec-*.md` + digest/AC-ids; worker Read ĐÚNG file con-trỏ; CẤM lục ngoài con-trỏ" (B6 chốt-2) — hay GIỮ prompt-embed (S134 tiền lệ 3/3 lane 0-garble, chưa từng chết-non — T9iv)?
8. **Sleep khuôn nâng (SKILL-only, KHÔNG chạy nén)** — `sleep-recovery-memory-l2.md`: Phase 3a + "cross-file bleed check: nén nhiều tệp cùng lượt → grep TỪNG token trích-dẫn về ĐÚNG verbatim CỦA TỆP ĐÓ"; Phase 2 + "TỔNG-HỢP 3-5 ý đặt ĐẦU tệp, viết TRƯỚC chi-tiết + grep-ngược mọi số/mốc trong tổng-hợp về phụ-lục/nguyên-bản"; **DP-5 (anh đặt số):** trigger INFORM 7-ngày (`:52` — ngày-lịch, LỆCH khung 3.4) → ngưỡng tích-lũy byte verbatim-chưa-gist (match theo PREFIX kỳ, không exact-filename); baseline đo 17-07: kỳ 2026-07 chưa nén ≈ **183KB/5 file** (tooling 46.1K · harvest 42.9K · reviewer 39.8K · inv-cb 31.0K · cicd 23.4K), raw un-gisted toàn kho ~374KB (caveat naming q-file).
9. **Báo-lại hub** — adap-report wave mới + email: nấc từng khoản + baseline T6 + errata mis-site crystallized-backfill + việc-2 done @S131-S132 + carve-out DP-3 nếu chọn consent.

## ③ Checklist phân-rã hmw (worker Opus 4.8 MAX — anh chỉ định) + acceptance ĐO ĐƯỢC
**Vai:** governance `.md/.ps1/.json` KHÔNG khớp boundary implementer-backend (.NET-only)/implementer-frontend (FE-only) ⇒ 3 lane **role-less `model:'opus'`** (tiền-lệ feedback_workflow_fanout_reliability; hmw `tier:` hmw-only). ≥3 task ⇒ `args.run` BẮT BUỘC (Sàn-1).
- **LANE-A commands (items 1+2-wire+3):** đổi 5 file command + contract JSON. AC-A: `grep -c "tick" tiep.md pause.md session-end.md` ≥1 mỗi file (baseline 0/0/0-tick) · contract chứa OR-guard session · 4 điểm gọi `nhip-no-probe` · KHÔNG chép logic tick (chỉ con-trỏ §2.1.8, fault-check B1).
- **LANE-B scripts (items 2-script+4+5):** AC-B: `nhip-no-probe.ps1` chạy 2 lần output byte-y-hệt (phép 5) + `-RepoRoot` sai → in `probe-loi (khong chan)` exit-0 (phép 6) + baseline in `light 5/6 deep 5/15 | 0 over-cap | 1 run-chua-gom` (khớp số T6/T2 hôm nay) · 2 detector: inject-matrix 5 ca PASS/FLAG đúng chiều (ghi output vào sub-file lane) + happy-path repo thật 0 FLAG-mới ngoài expected + `exit 0` + 0 self-match.
- **LANE-C residual+doc+sleep (items 6+7+8):** AC-C: `grep -rn "draft 2026-07-15"` ngoài {runs/, broadcasts/, adap-reports history} = **0** (baseline 2 site sống) · `grep -c "e0bb5bbf" memory-budget.json` = 2 + `:121` chứa "e50a4bd0" · `:206` có vế Ratified-con-trỏ · adap-report 2 append · hmw.js+fable-real câu luật · sleep 2 chốt mới + trigger theo DP-5.
- **Sau merge (lead, KHÔNG lane):** RESTART Claude Code (pause.md:9 no-hot-reload) → phiên kế đo phép 7 (1 pause–tiep → counter 9, +1 đúng) + phép 1 re-đếm cửa-sổ mới + light-OVERDUE fire @9 (T11 vòng-2) → báo số cho hub (việc-1 đã hẹn "báo kết quả đo sau").
**Mốc so baseline (T6, đo 17-07):** counter=8/S133-uncommitted · tick +3/9-nhãn/7-pause cửa-sổ (e9124fc..a6cd0a2] · orphan=1 (self-open S135) · sổ-vai 14/14 · closeout-union 3/3 · H1/H2 last-vết `72f68d1` · un-gisted-2026-07 ≈183KB.

**CAVEAT chung:** KHÔNG chép số hub (n=2, ví-dụ 6-mã→4-tick); mọi số trên = SE tự đo, đơn-vị + cửa-sổ khai tại chỗ. "Đắt/rẻ" tương đối. 6 decision-point (DP-1..DP-5 + T13iii gật-implied) = anh/lead chốt, spec không tự quyết.

STATUS: COMPLETE

