# S135 adap khung-nhịp-năm-vòng — sub-reviewer-0 (review SPEC v1)

- run: `2026-07-17-S135-adap-khung-nhip-nam-vong`
- vai: reviewer — ENGINE fable-real lệnh-A (single deep-pass adversarial)
- ngày: 2026-07-17
- target: `spec-adap-khung-nhip-17-07-2026.md` (v1, 90 dòng) — review TRƯỚC khi hmw implement
- evidence nền: `sub-investigator-codebase-0.md` (13 trục, lead verify V1-V8) + 7 broadcast inbox (đọc TRỌN cả 7) + tự spot-check đĩa bằng lệnh
- nguyên tắc: mọi issue = file:line + vì-sao + đề-xuất; C/M/n; KHÔNG tin spec/invest — tự đo

STATUS: writing (R1→R7 rồi FIX table)

---

## R2 — KHỚP-ĐĨA (đặt trước vì R1/R3 tựa lên số này; 8 spot-check + 6 bonus, TẤT CẢ tự chạy)

| # | Claim spec/invest | Lệnh tự chạy | Kết quả | Verdict |
|---|---|---|---|---|
| i | `_contract.tick` json:6 wording | Read `.claude/governance/.session-counter.json` | :6 đúng nguyên văn "if head == last_ticked_head -> NO-OP … Else counter+1, last_ticked_session = session…"; :13-16 counter=8/S133; history :26-36 2×FAIL-LOUD S127/S133 | ✅ KHỚP |
| ii | draft-cụm = budget :65+:90 | `grep -n "draft 2026-07-15" memory-budget.json` | :65 + :90 (đúng 2 dòng) | ✅ KHỚP |
| iii | session-start:206 + §2.1.8 :181-206 | Read :170-219 | :181 header §2.1.8; :185-190 pseudo-code inline; :192 khai-thật "đếm phiên-có-làm-HEAD-đổi"; :206 nguyên văn honest-caveat đúng như invest trích | ✅ KHỚP |
| iv | hmw.js:97-98 + fable-real.md:31 | Read cả 2 | :97 comment S4b + :98 normalize + :101 throw-msg; fable-real.md:31 = "spec bơm QUA ARGS/prompt (worker KHÔNG tự Read file)" | ✅ KHỚP |
| v | tiep/pause/session-end 0-tick | `grep -c -i "tick"` 3 file | 0 / 0 / 0 | ✅ KHỚP (baseline AC-A(1) đúng) |
| vi | 7 `wal: pause` cửa-sổ | `git log --format=%s e9124fc..HEAD \| grep -c '^wal: pause'` | **7** | ✅ KHỚP |
| vii | sleep cmd điểm chèn Phase 2/3a | Read trọn 125 dòng | Phase 2 :72-82 (reflection 3-5 KHÔNG buộc đặt đầu tệp — gap thật); Phase 3a :88-91 (5 token-class, KHÔNG có cross-file bleed — gap thật). 2 chốt mới chèn ĐÚNG chỗ | ✅ KHỚP |
| viii | detectors.ps1 convention | Read :810-844 + :900-926 | H24-2 fail-loud key-missing :819-841 (Write-Flag MED, no-default) ✓ self-match :905-914 ✓ exit 0 LUÔN :925 + "FLAGs are advisory" :923 ✓ | ✅ KHỚP (cite :819-839/:905-914 của spec chính xác) |
| + | crystallized-backfill CHƯA TỪNG chứa cụm | `grep` (exit 1) + `git log -S 'draft 2026-07-15' --` (RỖNG) + sed :25/:117/:227 | 0 hit; -S rỗng toàn lịch-sử; :117 honest-RANGE neo 58f5afd8 đúng nguyên văn | ✅ NO-CHANGE + errata mis-site ĐỨNG VỮNG (spec dám trái chỉ-thị đích-danh hub — bằng-chứng đủ cứng) |
| + | orphan = 1 | chạy loop DUAL-ACCEPT tiep.md:41-53 | đúng 1: `2026-07-17-S135-…` (self-open) | ✅ AC-B(3) "1 run-chua-gom" đúng |
| + | roster 14 + 0 over-cap | `ls agents/*.md \| wc -l` = 15 (14+README); `find MEMORY.md -size +25600c` = 0 | ✅ AC-B(3) "0 over-cap" đúng |
| + | e0bb5bbf baseline | `grep -c` budget.json | **0** → post-wave 2 = AC-C(2) có răng | ✅ |
| + | reviewer.md:46 + adap-report :17/:19/:60/:80 | sed + Read trọn adap-report | :46 = measured-label gate đúng; adap-report :17 "executed → verified-pending", :60 + :80(a) điều-kiện "restart + 1 spawn-test reviewer thực-tế chạy qua nó"; :19 chứa cụm draft (dòng lịch-sử — AC-C(1) GIỮ đúng) | ✅ |

🔴 **PHÁT HIỆN MỚI R2 (spec + invest ĐỀU SÓT):** `grep -rn "draft 2026-07-15"` repo-wide ra **8 file**, trong đó **`.claude/agent-memory/investigator-codebase/MEMORY.md:23`** KHÔNG nằm trong exclusion-set AC-C(1) {runs/, broadcasts/, adap-reports} và cũng KHÔNG bị wave sửa (diary lịch-sử S129). ⇒ **AC-C(1) post-wave = 1 ≠ 0 → FAIL trên dữ liệu LÀNH**, hoặc tệ hơn: dụ hmw "sửa diary cho grep xanh" = rewrite-history + Goodhart rời-tập-đo. Root-cause đẹp: investigator sweep T7(iii) quét mọi nơi TRỪ **sổ của chính mình** — self-coverage blind-spot (đúng class `feedback_meta_count`). → **M-2**.

**Kết luận R2:** 8/8 spot-check KHỚP — evidence nền của invest + lead-verify V1-V8 vững; các issue dưới đây là lỗi HÌNH-THÀNH-SPEC (invest→spec drift + AC-literal), không phải lỗi số-liệu.

---

## R1 — KHỚP-FLOOR (spec vs 7 broadcast, đọc trọn B1-B7)

**B1 `3daf5ee4` — 4 khoản floor mục 3:**
- 3.1 tick đa-điểm ✅ Item 1 (4 điểm, OR-guard — xem R3 DP-1).
- 3.2 force-fire bù ✅ Item 3 — **DP-3 consent-gate: phán = CARVE-OUT HỢP LỆ, KHÔNG phải hạ-floor-lén**, vì hội đủ 3 chống-lưng: (a) KHAI tường minh với hub trong report (spec Item 3 + Item 9 ghi sẵn); (b) luật cứng owner-era có TRƯỚC broadcast (`session-end.md:94` + `session-start.md:203` "KHÔNG auto-run — anh consent") + SE đã hẹn hub nguyên văn "light-run **owner-triggered**" (outbox :40-42) — hub reply B4 xếp việc đó vào "đúng thẩm quyền"; (c) linh hồn khung = "**nợ hiển thị**" — consent-gate + force-INFORM-bắt-buộc + dòng-nợ giữ skip LUÔN VISIBLE + quy được về owner, khác hẳn class "im lặng trông y hệt sạch" mà khung đánh. Điều kiện đi kèm: SELF-CHECK ô3 khi báo hub PHẢI ghi "PASS-với-carve-out (consent)", KHÔNG ghi PASS trần (→ n-6).
- 3.3 dòng-nợ 3-vế ✅ Item 2 (đúng 3 vế floor; form 4-field hub = ví dụ, B2 phép-2 nói rõ "dự án tự chọn form, miễn đủ ba vế" — thêm/bớt field là quyền SE).
- 3.4 cadence ngày-lịch ✅ DP-5 — **phán: GIỮ 7d KHÔNG vi phạm §3.4**. Nguyên văn §3.4: "Dự án nào muốn dùng ngày-lịch cục bộ là quyền owner của dự án đó, nhưng hub không phát nó thành chuẩn" — cấm là cấm HUB phát chuẩn, không cấm SE giữ cục bộ. SE giữ + khai + in thêm byte để anh đặt ngưỡng sau (không bịa số) = đúng cả §3.4 lẫn B1 §5 "để phép đo trả lời". Thiếu mỗi: Item 9 chưa liệt kê khoản khai-cục-bộ này trong report (→ n-6).
- §4 event-gate: SE KHÔNG event-gate vòng-1 (giữ vô-điều-kiện) ⇒ 2-điều-kiện = **n/a-by-not-gating** — spec KHÔNG khai dòng n/a này ở đâu (→ n-6, SELF-CHECK ô4).
- §6 hai detector ✅ Item 4+5. §7 đơn-vị ✅ Item 1(e). SELF-CHECK 5 ô: ô1=phép7 post-restart ✓ · ô2=AC-B(2) ✓ · ô3=carve-out (ghi đúng nhãn) · ô4=n/a phải khai · ô5=Item 1(e) ✓.

**B2 `f71c5b65` — bảng A + 8 phép + gate C:**
- 🔴 **Vòng 3 (bộ-ba đo→đề-xuất→kiểm) = LỖ TO NHẤT CỦA SPEC.** T11 chấm "PARTIAL — GAP THẬT" (3 mảnh chạy RỜI, không run-record 3-stage, cột-5 mtime-tăng-dần không chạy được); T12 ghi rõ đường lên CÓ = "block memory-triple artifact-hoá"; invest-propose ②... để nó RỚT khi kết tinh spec v1 — **không Item nào giao việc này**, trong khi mục tiêu ①:9 vẫn tuyên "**5/5 vòng chức-năng**". Như viết: mục tiêu KHÔNG THỂ ĐẠT với item-list hiện có, và nếu cứ báo hub 5/5 = overclaim outward. → **M-1** (fix rẻ: 1 câu vào session-end §L.b(c) — LANE-A; hoặc hạ goal thành 4/5 + khai PARTIAL).
- Vòng 1/2/4/5 ✅ map đủ (vòng-1 tự-verify FAIL hiện hành → cơ-chế force-fire + detector thay trí-nhớ ✓ đúng thuốc). Vòng-4 cột-5 đòi per-file byte/hash assert (chuẩn 291550ff "bảo-toàn ≠ niêm-phong") — Item 8 chưa thêm 1 câu assert này (→ n-9, optional).
- 8 phép: 1/7 post-restart khai đúng ✓ · 2/5/6 = AC-B ✓ · 3/4 detector + số thật ✓ · **phép 8**: hub tự khai chưa dogfood; SE cũng chưa đo — report phải khai (→ n-6).
- Gate C: "ĐẠT = 5 vòng chức-năng + phép 1-4" — phụ thuộc M-1 + phép-1 đo sau restart (spec đã hedge "PASS-able" ✓ đúng nấc).

**B3 `e50a4bd0` — soi TỪNG CHỮ dòng thay (mục 2c/2d/3):**
- :90 replacement ✅ đúng ngữ-nghĩa reply: DẢI 2 đầu + "san char/4" + cận-trên ~1.4-2x không cố-định + CẤM nhãn real/đã-đo + anchor published e0bb5bbf.
- 🔴 :65 replacement viết "**bao DAI [san bytes/4** -- tran notice]" — B3(d) nguyên văn: "DẢI [**sàn = char4** (đếm thiếu) — trần = tín-hiệu-cắt-ngắn]". bytes/4 ≠ char/4 trên text VN-diacritic (~2-3 byte/char → lệch cỡ 2×, sàn bị đôn lên gần trần → dải méo). Chính spec tự mâu thuẫn: :90-replacement dùng char/4 đúng. → **M-4** (RANGE FIT [bytes/4..bytes/3.0] có sẵn là band KHÁC, giữ nguyên như spec dặn — không đụng).
- :121 replacement: 2 chốt-gốc ✓ + bỏ "tuong tu Hub" đúng hướng-dẫn ✓ + ratified cổng reply ngày 17-07 (khớp reviewer_gate B3 "anh-Mark ratified 17-07") ✓ + ASCII ✓. 🔴 NHƯNG "thay TRỌN giá trị" làm **RỚT caveat cuối đang sống ở :121**: "…nobody may sell 'proven effective' yet" (= "chưa ai được bán câu 'đã chứng minh hiệu-quả'"). Hub chỉ dặn thay CỤM "tương-tự Hub"; spec rewrite trọn và đánh rơi caveat — trong khi :206 được sửa thành CON-TRỎ về :121 làm "wording sống" ⇒ caveat mất nhà canonical (S119: giữ kết-luận phải giữ caveat). → **M-3**.
- 2a đóng-ask ✅ Item 6(i) (:19 giữ làm lịch-sử + note đính-chính — đúng additive). 2c residual#1 mis-site: NO-CHANGE + errata ✅ (R2 chứng vững). Mục 3 re-sync :206 ✅ (LANE-A ownership — lead tự bắt collision từ trước, đúng).
- Mục 4 owner-sign khép / mục 5 cross-verify / mục 6 Q&A-routing: 0 việc mới ✓ n/a hợp lệ.

**B5 `89e4d818`:** khuôn 4-vai SE đã map đủ (T10, tự đối chiếu sleep cmd ✓: harvest-curator PROPOSE :63-70 · lead distill :72-82 · gate 3a :88-91 · reviewer 3b :93-95 · distill-gen :60/:82/:118 · additive :100/:116); 2 bài học mới (cross-file bleed + tổng-hợp-đầu-tệp+grep-ngược) = Item 8 chèn đúng Phase 3a/Phase 2 ✅. "Chép câu hỏi đừng chép số" ✓ (3 câu mục 4 SE trả lời CÓ/CÓ/CÓ từ đĩa).

**B6 `6c2eb2b1`:** chốt-1 câu luật ✅ Item 7 · chốt-2 args-mỏng ✅ DP-4 reconcile + dogfood wave này (use⟂mention tách Agent-prompt vs Workflow-args của invest = đúng — chính prompt spawn TÔI lượt này đã là pointer-style, dogfood sống) · chốt-3 normalize giữ ✅ 0 việc · phép-thử-nhanh mục 5 = n/a (0 ca chết-non, grep rỗng T9iv — spec khai ✓).

**B7 `dacfcb11`:** 2 bản relay đã xử trước (eb12b9b8 @S129 · 0db707e4) + kênh Q&A đã dùng thật ⇒ 0 việc, chỉ STAGE-2 — spec không có dòng disposition B4/B7 (→ n-6, 1 dòng là đủ).

---

## R3 — DP-DEFAULTS (6 DP)

**⚑DP-1 OR-guard — C-risk số 1 của đề: phán KỸ-THUẬT ĐỨNG, phép 7 KHÔNG FAIL, VỚI 1 ĐIỀU KIỆN CHƯA ĐƯỢC VIẾT RA.**
- Ngữ-nghĩa phép 7 (B2): "thực hiện đúng MỘT lần dừng rồi nối lại → +1" + B1 SELF-CHECK ô1 cùng câu ⇒ hub đếm 1 cặp dừng–nối = **+1, không phải +2** (tick-cả-2-đầu không session-guard = +2/cycle → FAIL — bẫy invest chỉ đúng).
- Chạy ca: pause trong S135 (đã tick lúc vào) → session-guard NO-OP ✓; /tiep mở phiên kế **nhãn S136 MỚI** → +1 ✓ ⇒ dừng–nối = +1, phép 7 PASS. Đo post-merge (:85) đi đúng đường này (pause S135 dùng pause.md CŨ chưa tick → restart → /tiep S136 tick 8→9 = chính phép đo).
- 🔴 NHƯNG toàn bộ đứng trên tiền-đề **"mỗi conversation mới = nhãn S<nn> MỚI, kể cả vào bằng /tiep"** — tiền-đề này ĐÚNG theo thực hành (S134, S135 đều /tiep-vào nhãn mới) + `tiep.md:130` ("Field session: khác phiên hiện-tại là BÌNH-THƯỜNG — đó chính là use-case của /tiep") NHƯNG **không được viết thành luật ở bất kỳ đâu**. Nếu một lead tương lai resume và GIỮ nhãn cũ ("vẫn S135 vì cùng mạch") → tiep-tick NO-OP → cửa câm → phép 7 +0 FAIL + phép 1 tái-thủng. → **M-9**: pin label-convention vào Item 1(e).
- Ca re-open cùng label (crash-resume giữ nhãn): NO-OP đúng nghĩa "1 nhãn-phiên = 1 tick", và phép-1 đếm theo nhãn cũng không thấy cửa mới ⇒ NHẤT QUÁN, không phải bug.
- Kẽ tồn-dư (có sẵn, OR không chữa): phiên mới KHÔNG commit gì (HEAD y nguyên) → head-guard NO-OP dù nhãn mới — :192 đã khai; nhưng Item 1(e) thêm "counter đếm nhãn-phiên" sẽ MÂU THUẪN chữ với :192 ("đếm phiên-có-làm-HEAD-đổi") trong CÙNG section → reconcile cùng lượt (gộp vào M-9 fix).
- Ca 2 phiên song song cùng label: đã bị cấm bởi luật vận hành riêng (feedback rag-mcp "KHÔNG 2 SE-session cùng repo") — không cần guard thêm.

**⚑DP-2 defer dangling-head:** ĐÚNG thẩm quyền (candidate-fix đang treo chờ anh/hub, counter history :30/:35 ghi rõ). NHƯNG bảng DP làm rơi caveat mà chính invest đã nêu: tick @/tiep thường ghi `last_ticked_head` = commit `wal: pause` — commit này CHỈ sống sót nếu bị kẹp dưới commit thường; phiên nào không có commit thường trước closeout → nó bị squash → **ancestor-check FAIL-LOUD tần suất TĂNG theo tick dày** (class S127/S133, mỗi lần = 1 báo-anh). Anh cần info này để flip. → **n-4** (ghi vào cột "Vì sao" DP-2 + report khai noise-expectation).

**⚑DP-3:** hợp lệ — phán đầy đủ ở R1/B1-3.2. **⚑DP-5:** hợp lệ — phán ở R1/B1-3.4; NHƯNG chỗ đặt byte-display mơ hồ → **M-10** (xem R6).

**⚑DP-4 reconcile fable-real.md:31:** đúng floor B6 chốt-2, giữ intent gốc ✓. Nit wording: "CẤM tự lục file NGOÀI con-trỏ" đọc literal sẽ cấm luôn việc worker Read FILE ĐÍCH nó phải sửa (tiep.md, budget.json…) — phải scope cấm vào NGUỒN-SPEC ("CẤM tự lục spec/nguồn ngoài con-trỏ; file làm-việc lane vẫn Read bình thường") → **n-2**.

**T13iii moot:** ✓ số đúng (8→9 ≥ 3+6 → OVERDUE(light) fire @entry phiên kế, consent-gate giữ). Lưu ý ordering n-3: Item 2 đặt probe "cuối §2" còn Item 1(b) đặt TICK "§2.5" (SAU probe) → dòng-nợ ở /tiep in trạng-thái TRƯỚC-tick (5/6 ok) rồi tick mới nhảy 9 → OVERDUE chỉ hiện ở (j) cuối phiên thay vì ngay cửa vào. Không thủng floor (nợ vẫn hiển thị trong phiên) nhưng lệch kỳ vọng "fire NGAY" T11 → swap thứ tự (tick trước, probe sau) = 0 chi phí → **n-3**.

---

## R4 — AC ĐO ĐƯỢC + RĂNG

- AC-A(1) grep "tick" 3 file — baseline 0/0/0 **tự verify ĐÚNG** ✓ (smoke yếu nhưng có AC-A(4) kèm).
- 🔴 AC-A(2) "contract chứa OR-guard `last_ticked_session`" — **VACUOUS-AT-BASELINE**: chuỗi `last_ticked_session` ĐÃ có sẵn trong :6 hiện hành (vế update "last_ticked_session = session"). Checker grep literal này sẽ PASS cả khi lane QUÊN OR-guard. → **M-11**: AC phải grep đúng chuỗi điều-kiện, vd `-c "session == last_ticked_session"` = 1 (baseline 0).
- AC-A(3)(4)(5)(6)(7) ✓ đo được, có baseline.
- AC-B(1)(2) = phép 5/6 ✓ chuẩn. AC-B(3) ✓ tự đối chứng hôm nay khớp (light 5/6 · deep 5/15 · 0 over-cap · orphan 1 — 4 số tôi tự đo lại đều đúng).
- 🔴 AC-B(5) vs Item 4 **LỆCH THIẾT KẾ**: Item 4 anchor "commit GẦN NHẤT match" (1 closeout) nhưng AC-B(5) đòi "H25-closeout-ritual trên **3 closeout gần nhất** = PASS union" — và phép 3 B2 cũng đòi 3. hmw sẽ phải đoán. → **M-5**: detector loop 3 closeout gần nhất (mỗi cái 1 cửa-sổ union riêng).
- 🔴 Fault-matrix 6 ca có đủ 2 chiều FLAG/IM cho happy-path nhưng **thiếu 3 ca răng**: (a) H25-role-notebook **diary tồn tại nhưng 0-BYTE → PHẢI FLAG** — đúng ca anti-Goodhart mà chính `tiep.md` dạy ("thiếu nó thì happy-path vẫn xanh mà sàn đã thủng"); check "byte>0" có trong design nhưng KHÔNG có ca chứng; (b) H25-closeout-ritual **cửa-sổ không có closeout-liền-trước** (closeout đầu tiên trong slice) → không crash, khai skip có lý do; (c) probe **h24_cadence key thiếu** → dòng vẫn in + exit 0 (xem n-7). → **M-6**: matrix 6→9 ca.
- Nit thiết kế Item 4: "session-log file MỚI" cần `--diff-filter=A` (sửa file cũ ≠ có session-log mới) — để hmw tự xử nhưng nên ghi 1 chữ (gộp M-6 fix).
- AC-C(2)(4)(5)(6)(7)(8) ✓ đo được (e0bb5bbf 0→2 có răng — tự verify baseline 0 ✓).
- 🔴 AC-C(1): exclusion-set thiếu diary → FAIL trên dữ liệu lành (chứng ở R2) → **M-2**.

---

## R5 — SCOPE-DRIFT

- **Drift ra ngoài: 0.** Items 1-8 đều truy được về B1/B2/B3/B5/B6; Item 9 = mandate H9 report; DP-2 để ngoài đúng; Item 6 flip-note 4c = bảo trì adap-report của chính SE (vòng-5 B2) — hợp lệ.
- **Bỏ sót (floor/khai n/a):** (1) 🔴 vòng-3 memory-triple — trong mandate B2 bảng A, T11/T12 đã chỉ đường, spec làm rơi → M-1; (2) SELF-CHECK B1 5-ô tally + ô4 n/a-not-gating + khai DP-5 cục-bộ + phép 5/6/2 đo in-wave + phép 8 chưa đo + 1 dòng disposition B4/B7 — đều thuộc Item 9 report → n-6; (3) vòng-4 per-file assert → n-9 optional.
- Lane-partition: 0 overlap file A/B/C ✓ (collision session-start.md lead đã tự bắt trước — đúng); M-10 nếu fix theo đề xuất vẫn giữ 0-overlap (đưa về LANE-A).

---

## R6 — BẪY KỸ THUẬT SE

- **PS 5.1:** probe đọc 2 JSON qua `ConvertFrom-Json` dot-notation OK (không cần -AsHashtable); cả 2 file ASCII ✓. 🔴 Vế-2 đo byte PHẢI dùng `(Get-Item).Length`/`ReadAllBytes` — CẤM `Get-Content` đếm (bẫy E-010/S130 ANSI ×2-3, spec chưa dặn) → **n-8**.
- **Fail-loud vs không-chặn:** Item 2 vừa đòi "fail-loud nếu key thiếu" (pattern H24-2) vừa "MỌI exception → probe-loi + exit 0" — hmw có thể hiểu fail-loud = exit≠0 (vỡ floor) hoặc nuốt key-missing vào probe-loi generic (mất tín-hiệu no-default). Chốt: key thiếu → in `CONFIG-THIEU(h24_cadence)` NGAY TRONG dòng-nợ + exit 0 → **n-7**.
- **Hook 3-path / git-add đích-danh:** 🔴 lỗ thật 2 tầng. (a) RUNTIME: Item 1(c) claim "tick nằm TRONG commit `wal: pause`" chỉ đúng nếu pause.md **bước 4 add-list** (hiện: "WAL + path persist + file dở") được mở rộng thêm `.claude/governance/.session-counter.json` — spec không nói; tương tự session-end §5.1 closeout — **bằng-chứng sống: tick S133 nằm uncommitted qua 2 closeout liên tiếp** (chính git-status đầu phiên này còn thấy). (b) WAVE-COMMIT: files wave sửa hầu hết NGOÀI hook-3-path (`.claude/commands/*.md` ×5-6, `scripts/*.ps1` ×2, `.claude/workflows/hmw.js`, `.claude/governance/.session-counter.json`, `docs/governance/adap-reports/*`; budget.json trong agent-memory thì hook cover) — post-merge :85 không có add-list. → **M-7**.
- **No-hot-reload:** RESTART bắt buộc đã ghi ✓ (:85). **Edit-anchor:** session-end 253 dòng — điểm chèn (v)/(vi) sau :99 trước "(g)" :100 = anchor duy nhất ✓; budget.json:90 mega-line — spec cho sẵn đoạn old_string đích-danh duy nhất ✓.
- **hmw.js luật câu cite ":98":** chèn dòng mới phía trên làm normalize trượt xuống :99 → luật tự-cite số dòng chết-non ngay lúc sinh (class "acceptance literal tự-lão-hoá" S121). Viết relative "dòng normalize NGAY DƯỚI" → **n-1**.
- 🔴 **DP-5 byte-display = ghost-wire risk:** "probe/INFORM in THÊM byte" không nói WHERE. Probe = LANE-B với output-contract 3-vế đã đóng (Item 2); sleep cmd = LANE-C; nhưng sleep-INFORM **runtime** sống ở `session-start §2.1.2` + `session-end §L.b(c)` = file LANE-A. Ghi mỗi sleep-cmd doc → INFORM thật không bao giờ in byte (đúng class ghost-wire H18 "defined-but-unread"); LANE-C tự sửa session-start/end → vỡ 0-overlap. → **M-10**: giao LANE-A thêm 1 câu tại 2 site INFORM (đo tổng byte `<period>.md` chưa có `.gist.md` theo PREFIX kỳ), sleep cmd :52 chỉ cập nhật mô tả, probe GIỮ 3-vế.
- Dirty-baseline: `.session-counter.json` đang modified (tick S133 uncommitted) — LANE-A sẽ Edit đè lên delta này; wave-commit sẽ mang cả 2 (spec :87 đã ghi nhận drift ✓ — chỉ cần reviewer pre-commit nhìn diff có ý thức).

---

## R7 — HONEST-NẤC

- Hedge đúng: "PASS-able", "phép 1/7 đo SAU restart", CAVEAT :89 executed/verified-pending-restart, "không chép số hub" ✓.
- 🔴 **Flip-note 4c OVERCLAIM "chắc chắn được NẠP"** (Item 6(ii)): adap-report :17/:60/:80 đặt điều kiện "restart Claude Code + 1 spawn-test reviewer **thực-tế chạy qua nó**". Vế restart trong chứng cứ spec = "S129 commit 23:16 → app-launch mới" — chính T11 tự ghi "**restart implied**" = SUY-LUẬN lịch (qua đêm chắc relaunch), KHÔNG đo trực-tiếp. "Chắc chắn" nâng implied→certain trong artifact OUTWARD (adap-report) = đúng class S131 morning-gate. Có sẵn corroboration mạnh hơn mà spec chưa dùng: reviewer S135 (lượt này) tự-quan-sát persona CÓ câu :46 — nhưng self-obs phải hedge (S126). → **M-8**: bỏ "chắc chắn", ghi "NẠP theo suy-luận đủ-điều-kiện (restart-implied + ≥2 spawn thật) + corroborate S135 self-obs [hedge]"; giữ nguyên 2 caveat spec đã có (EXERCISE chưa chứng riêng · verified của hub).
- Còn lại sạch: "5/5 vòng" là claim-mục-tiêu sai vì thiếu item (M-1 — lỗi cấu trúc, không phải lỗi nấc); AC-B(3) expected-values có khai "tại thời-điểm chạy" ✓; post-merge "light-OVERDUE fire @9 (consent-gate)" ✓ trung thực.

---

## BẢNG FIX ĐỀ-XUẤT (lead áp thẳng ra spec v2)

| # | Loại | Vị trí spec v1 | Dòng thay / thêm |
|---|---|---|---|
| M-1 | Major | ② thêm Item 3-bis (LANE-A) + ①:9 | Item 3-bis: "session-end §L.b(c): khi chạy khối (c), ghi 3 dòng `memory-triple: do=<script·exit> -> de-xuat=<script·exit> -> kiem=<mfe/reviewer·verdict>` vào session-log (artifact 3-stage tuần tự — B2 vòng-3 cột-5)." + AC-A(8): "session-log phiên wave chứa `memory-triple:`". NẾU không thêm: ①:9 sửa "5/5 vòng chức-năng" → "4/5 + vòng-3 PARTIAL (khai với hub)" |
| M-2 | Major | AC-C(1) :83 | "…ngoài {runs/, broadcasts/, docs/governance/adap-reports (dòng lịch-sử :19 GIỮ + note mới), **`.claude/agent-memory/**` (diary lịch-sử — CẤM sửa để làm xanh grep)**} = 0 site sống (baseline 2 site sống + 1 diary-mention)" |
| M-3 | Major | Item 6 :44 (giá trị :121 mới) | append trước dấu chấm cuối: `; chua ai duoc ban cau 'da chung minh hieu qua' (delta hub tu run-2 khong bao gio co -- hub go counter truoc run-2)` |
| M-4 | Major | Item 6 :42 (giá trị :65 mới) | `bao DAI [san bytes/4 -- tran notice]` → `bao DAI [san char/4 -- tran notice]` (khớp B3(d) "sàn = char4" + tự nhất quán với :90-replacement; RANGE FIT [bytes/4..bytes/3.0] có sẵn GIỮ nguyên — band khác, đúng như spec đã dặn) |
| M-5 | Major | Item 4 :33 câu 1 | "commit gần nhất match `^\[CLAUDE\] Docs: …`" → "**3 commit gần nhất** match … (loop, mỗi closeout 1 cửa-sổ union riêng `(closeout-trước-nó .. nó]`)" — khớp phép 3 B2 + AC-B(5) |
| M-6 | Major | Item 4 :34 · Item 5 :38 · Item 2 · AC-B(4) :80 | Item 4 +(iv): "slice không có closeout-liền-trước → KHÔNG crash, in skip-lý-do"; +1 chữ: session-log-mới đo bằng `--diff-filter=A`. Item 5 +(iv): "cây tạm truncate 1 diary về **0-byte** → PHẢI FLAG (anti-Goodhart)". Item 2 +ca: "h24_cadence thiếu → dòng vẫn in `CONFIG-THIEU` + exit 0". AC-B(4): "matrix 6 ca (3+3)" → "matrix **9 ca (4+4+1)**" |
| M-7 | Major | Item 1(c) :16 · Item 1(d) :17 · post-merge :85 | (c) append: "+ mở rộng add-list pause.md bước 4: thêm đích-danh `.claude/governance/.session-counter.json`"; (d) append: "+ session-end §5.1 add đích-danh counter-file khi có delta (bằng-chứng sống: tick S133 uncommitted qua 2 closeout)"; :85 append: "commit wave = `git add` đích-danh {5-6 command .md · 2 scripts · hmw.js · .session-counter.json · budget.json · adap-report · run-folder} — đa số NGOÀI hook-3-path; acceptance: sau commit, `git status --porcelain` các path này RỖNG" |
| M-8 | Major | Item 6(ii) :47 | "…spawn-test ĐÃ XẢY RA (…) ⇒ persona `reviewer.md:46` chắc chắn được NẠP" → "…spawn-test ĐÃ HỘI ĐỦ THEO SUY-LUẬN (S129 commit 23:16 → S130+ app-launch mới [**restart-IMPLIED, không đo trực-tiếp**] + reviewer spawn thật ≥2 lần S133/S134 `wf_8bb5abee`; corroborate S135: fable-real reviewer tự-quan-sát persona chứa :46 — self-report, hedge) ⇒ nấc NẠP = **executed-inferred**" (giữ nguyên 2 caveat sau) |
| M-9 | Major | Item 1(e) :18 | append: "+ vế label-convention: **mỗi conversation mới = nhãn-phiên S<nn> MỚI, kể cả vào bằng /tiep** (`tiep.md:130` 'session: khác phiên hiện-tại là BÌNH-THƯỜNG' = use-case chuẩn; thực hành S134/S135); CẤM reuse nhãn khi nối — thiếu vế này, OR-guard NO-OP nhầm cửa /tiep → phép 7 +0. Cùng lượt reconcile khai-thật `:192` ('phiên có làm HEAD đổi') với đơn-vị nhãn-phiên (ca không-commit cùng-HEAD vẫn NO-OP — hiếm, giữ khai)" |
| M-10 | Major | DP-5 row :69 + Item 8 :57 + LANE-A :76-77 | Chốt WHERE: "byte-display do **LANE-A** wire tại 2 site sleep-INFORM runtime (`session-start §2.1.2` + `session-end §L.b(c)`): khi INFORM fire → in kèm tổng byte `archive/<period>.md` chưa có `.gist.md` (match PREFIX kỳ). Sleep cmd :52 (LANE-C) chỉ cập nhật bảng Trigger mô tả. Probe (LANE-B) GIỮ 3-vế, KHÔNG chở byte-sleep." + AC-A(9): grep byte-note tại 2 site |
| M-11 | Major | AC-A(2) :77 | "(2) contract chứa OR-guard `last_ticked_session`" → "(2) `grep -c \"session == last_ticked_session\"` (hoặc chuỗi OR-condition chính xác đã chọn) trong `.session-counter.json` = 1 — **baseline 0**; CẤM dùng chuỗi trần `last_ticked_session` làm bằng chứng (đã có sẵn ở vế update :6 → vacuous)" |
| n-1 | nit | Item 7 :50 | câu luật hmw.js viết relative: "normalize **NGAY DƯỚI** là LƯỚI-CUỐI…" (không hardcode `:98` — chèn dòng làm số trượt, class literal-tự-lão-hoá S121) |
| n-2 | nit | DP-4 :51 | "CẤM tự lục file NGOÀI con-trỏ" → "CẤM tự lục **spec/nguồn** ngoài con-trỏ (file làm-việc của lane vẫn Read bình thường)" |
| n-3 | nit | Item 1(b) :15 + Item 2 :26 | swap thứ tự tại /tiep: TICK (§2.5) TRƯỚC, dòng-nợ SAU — để vế-1 in trạng-thái sau-tick (OVERDUE @9 hiện ngay cửa vào như T11 kỳ vọng, thay vì đợi (j) cuối phiên) |
| n-4 | nit | DP-2 row :66 | cột "Vì sao" append: "hệ-quả chấp nhận: tick @/tiep đặt head lên wal:-commit → phiên không-commit-thường sẽ squash nó → ancestor-check FAIL-LOUD tăng tần suất (class S127/S133, mỗi lần = 1 báo-anh, có vết)" |
| n-5 | nit | Item 3 :29 | định nghĩa `<closeout-liền-trước>` = "commit gần nhất match regex closeout của Item 4 (dùng CHUNG 1 regex — đừng chép 2 bản)" |
| n-6 | nit | Item 9 :60 | append: "+ SELF-CHECK B1 5-ô tally (ô3 = PASS-với-carve-out consent · ô4 = n/a không event-gate) + phép 5/6/2 đo in-wave, phép 8 CHƯA đo (khai) + khai DP-5 giữ ngày-lịch cục-bộ (quyền owner per B1 §3.4) + 1 dòng disposition B4 (confirm-reply, việc gộp Items) / B7 (đã xử trước, STAGE-2 only)" |
| n-7 | nit | Item 2 :22 | "fail-loud nếu key thiếu" ghi rõ: "= in `CONFIG-THIEU(h24_cadence)` NGAY TRONG dòng-nợ (không giả-định default, không nuốt vào probe-loi generic), VẪN exit 0" |
| n-8 | nit | Item 2 :23 | vế-2 đo byte bằng `(Get-Item).Length` — CẤM `Get-Content`-đếm (bẫy E-010/S130 encoding ×2-3) |
| n-9 | nit | Item 8 :56 | optional: +1 câu Phase 4 sleep cmd: "assert additive per-file: mọi verbatim nguồn byte-identical trước/sau (`git diff --stat` verbatim RỖNG)" — đóng B2 vòng-4 cột-5 (chuẩn 291550ff hai-assert) |
| n-10 | nit | ①:9 | nếu áp M-1 đường thêm-item: thêm chữ "vòng-3 lên CÓ nhờ Item 3-bis" vào mục tiêu để tally 5/5 truy được về item cụ thể |

**Điểm mạnh đáng giữ (positive):** NO-CHANGE crystallized-backfill trái chỉ-thị hub nhưng chứng đủ cứng (git log -S + grep — tôi re-run, đứng vững) + errata blameless = đúng bài "claim thư phải re-đo đĩa"; lead tự bắt file-collision LANE-A/C trước reviewer; số baseline T6 4/4 khớp khi tôi đo lại độc lập; (v)/(vi) numbering khớp đĩa (j)(i)-(iv); DP nào cũng có flip-path 1 chỗ.

VERDICT: GO_WITH_FIXES — 0C/11M/10n
STATUS: COMPLETE
