[CLAUDE] Docs: closeout OUTWARD wave adap đợt-9/10 + vá drift skill-matrix H24
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m43s

Closeout 4 mục OUTWARD của wave S141-S142 (anh gật @S143):
- adap-report 7/7 thư, đủ 5 trường REPORT-FORMAT LOCK, evidence đo thật
- email hub báo-nấc (sha 6c94873f72e0, selftest_verify exit 0, log _index cùng lượt)
- STAGE-2: 7 thư -> inbox/ai_infra/, _index 0 pending, cross-check 7/7
- squash K=8 wal: -> commit chốt

Ngoài wave: agents/README skill-matrix thiếu 2 row H24 (drift S121) -> 15/17 thành 17/17.

Nấc cao nhất khai được = executed-file/verified-pending-restart (trio CHƯA spawn).
2 phát hiện khai thẳng theo G-015 (chi tiết trong report + email):
- whitelist `tools:` KHÔNG chặn ghi ở runtime: 6 vai read-only bị append Write+Edit
- pull-lag do "watch broadcasts/inbox" canh nhầm chỗ

TICK H24: counter 16->17 (S143), 3-điều-kiện OK-reachable, không fail-loud.
Detector TOTAL 46 == baseline 46, 0 flag mới.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-22 12:32:27 +07:00
parent b146e2bb4b
commit 2757e418a1
56 changed files with 2318 additions and 58 deletions

View File

@ -61,7 +61,7 @@ Phân biệt RAW (prefix `sub-`) vs VERIFIED (suffix `-synthesis.md`) bằng **T
## Agent-team (`.claude/agent-teams/<tên>/` — gitignored `.gitignore:94`)
- Cùng nguyên-lý isolation: teammate **KHÔNG có memory-dir built-in** (khác subagent) folder riêng cho teammate ghi MD-session (A1, tránh overwrite memory chuẩn).
- Team spawn TỪ **sub-agent chính có memory dự-án rõ-ràng** (A2 mang identity/skill sub thật trong 9 roster).
- Team spawn TỪ **sub-agent chính có memory dự-án rõ-ràng** (A2 mang identity/skill sub thật trong roster số vai canonical [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số đây).
- H2 harvest-curator gom `.claude/agent-teams/<tên>/` agent-memory tương-ứng (giống run-trace).
- **Caveat: Agent-Team experimental + Windows 11 in-process only** (no split-pane) SE **CHƯA dùng team thật** A = **convention-ready** (n-a runtime), cơ-chế isolation chung qua workflow.

View File

@ -33,12 +33,15 @@ const VALID_ROLES = [
// memory-budget.json → lead_self_audit.flag_classes (10 class: 5 view-* + 5 gap-*) — vai KHÔNG tự chế class.
// Từ-vựng "view"/"omission" chọn CÓ CHỦ-ĐÍCH tránh va-chạm: governance-detectors.ps1:15 đã sở-hữu
// "derived-staleness" ⇒ cấm tên *-stale-role; "GAP" quá-tải (session-end build-gap · memory-selfimprove CRITERIA+GAP).
'harness-eval', 'harness-refine', 'harness-audit', // +S141 bộ-ba đồng-kiểm memory-system (adopt AI_INFRA 2026-07-18 khuôn 5-câu) read-only INFORM-only propose-only;
// trục = CHÍNH HỆ MEMORY (độ-giữ·hành-động·đúng-spec) — KHÁC H1 tooling / H2 harvest / H24 lead / reviewer diff;
// TUẦN TỰ eval→refine→audit (CẤM song song — audit đọc bản cũ = verdict vô-nghĩa), lead scribe return từng con vào run-folder.
]
// ─── PA-2a — hằng-số kỳ-vọng model tier-2 (H23 model-at-spawn, owner-chốt O1 @S121 W2) ──
// 🔴 ĐÂY LÀ HẰNG-SỐ KHAI-BÁO, KHÔNG PHẢI CƠ-CHẾ NEO. Nó KHÔNG ép model lúc spawn.
// Vì sao chỉ là hằng-số: neo-model-tại-spawn BẤT-KHẢ-THI ở SE — param `model:` chỉ nhận ALIAS
// ('opus'/'fable'/...), không nhận full-id; SE nay pin ALIAS `opus` (KHÔNG full-id) ở 14/14 frontmatter.
// ('opus'/'fable'/...), không nhận full-id; SE nay pin ALIAS `opus` (KHÔNG full-id) ở 17/17 frontmatter.
// ⇒ owner chốt PA-2 = PA-2a (hằng-số này, để audit có thứ ĐỐI-CHIẾU) + PA-2b (scripts/spawn-model-audit.ps1
// so resolved-vs-expected). Đọc bởi: scripts/spawn-model-audit.ps1 (thiếu hằng-số ⇒ script FAIL-LOUD).
// 🔸 H23 precedence — ĐÃ ĐO S126 (2026-07-16, phiên đầu sau restart; run wf_f960dae2-fa0, đọc bằng
@ -52,7 +55,7 @@ const VALID_ROLES = [
const TIER2_EXPECTED_FULL_ID = 'claude-opus-4-8'
// ─── Worker-tier-pin opus (owner-decision S124 — thay thế H8 all-inherit; adopt erratum-h8 floor) ──
// MỌI sub-agent (14/14) → frontmatter `model: opus` + `effort: max` = worker-tier gán-cứng (KHÔNG còn
// MỌI sub-agent (17/17) → frontmatter `model: opus` + `effort: max` = worker-tier gán-cứng (KHÔNG còn
// inherit lead). Lead = frontier owner-choice per-session (BƯỚC 0.6 probe); Fable = owner gõ /fable-real
// HOẶC /model tay (owner "còn Fable tao sẽ chỉ định qua Fable-real hoặc tự chọn").
// KHÔNG hardcode model hiện-hành ở comment — lesson S108: comment stale làm 2/4 worker đọc sai runtime.
@ -184,7 +187,7 @@ const results = await parallel(A.taskList.map((t, i) => () => {
`## ✍️ RUN-TRACE ghi sub-<role>-<i>.md FLAT (Harness-10 h10-refine, supersedes subfolder sub-md/) — TOOL-AWARE (chống mojibake G-009):`,
`- Full-detail công-việc của mày → ĐÚNG 1 file: \`${subMd}\` (folder đã scaffold sẵn — KHÔNG tạo folder).`,
` • NẾU mày CÓ Write/Edit tool (implementer-backend/frontend, test-specialist, frontend-designer): GHI TRỰC TIẾP via Write/Edit. 🔴 KHÔNG Bash-write MD ($-expansion/mojibake).`,
` • NẾU mày CHỈ có Bash (read-only sub: investigator-codebase/api, reviewer, cicd-monitor — KHÔNG Write tool): 🔴 TUYỆT ĐỐI KHÔNG Bash-write MD → để full-detail trong "findings" + đặt subMdPath="${subMd}"; EM MAIN scribe @P3 (single-writer Write-tool, no-corruption).`,
` • NẾU mày CHỈ có Bash (read-only sub: investigator-codebase/api, reviewer, cicd-monitor, tooling-auditor, harvest-curator, lead-view-auditor, lead-omission-auditor, harness-eval, harness-refine, harness-audit — KHÔNG Write tool): 🔴 TUYỆT ĐỐI KHÔNG Bash-write MD → để full-detail trong "findings" + đặt subMdPath="${subMd}"; EM MAIN scribe @P3 (single-writer Write-tool, no-corruption).`,
`- 🔴 ISOLATION (B6→Harness-10, AUDIT): CHỈ ghi \`${subMd}\` (+ code-file-disjoint nếu task giao). TUYỆT ĐỐI KHÔNG ghi/sửa: agent-memory/* (MEMORY.md BẤT KỲ sub) · MD canonical (CLAUDE/README/STATUS/agents) · sub-MD agent khác. Em main git-status/diff audit sau P2 — tracked-file đổi NGOÀI run-folder (runs/<run-id>/) + code-disjoint = vi-phạm (run-folder TRACKED → HIỆN trong diff).`,
`- LUÔN return: findings (FULL) + checklistEvidence + memoryDelta (4-field) + subMdPath="${subMd}". Harvest per-turn primary (C4); H2 gom @session-end = backstop verify-idempotent → agent-memory/${role || 'sub'}.`,
`- 🔴 KHÔNG store_memory/RAG-write · KHÔNG Bash curl/HTTP Qdrant (:6333 = git-diff MÙ, chỉ chunk-count bắt) · KHÔNG ghi file NGOÀI repo/run-folder. RAG single-writer=em main; containment = git-diff(in-repo)+chunk-count(RAG) [G-015].`,

View File

@ -0,0 +1,31 @@
# implement — VÒNG-1 SYNTHESIS (⚠️ HARVEST PARTIAL-HONEST)
> 🔴 **ĐÂY KHÔNG PHẢI synthesis "đã xong".** Đây là bản-ghi-kết-quả **partial-honest** do **lead** viết @S142 `/tiep` (tiep.md §4.3 harvest-hồi-tố), cho một workflow **CHẾT GIỮA CHỪNG**. Nó đóng trạng-thái orphan của folder này bằng **sự thật một-phần**, KHÔNG bằng tuyên-bố hoàn-thành.
- **Run:** `2026-07-20-S141-adap-dot-9-10-bo-ba-sub` · vòng-1 `runId=wf_3e1ade40-704` · chết ~18:31 20-07-2026
- **Tiếp-nối:** vòng-2 CẮT-GỌT ở run-folder `2026-07-22-S142-adap-9-10-vong-2`
- **Nguồn sự-thật:** ĐĨA (`ls` + `git diff` + `grep`), **KHÔNG** phải agent-return (returns mất khi phiên chết — N9 per-turn ≠ per-task)
## Nấc trung-thực
**executed-file / verified-partial** — 5/13 hạng mục land; 8 hạng mục CHƯA chạm. Checklist ③ (14 mục) **CHƯA verify mục nào**. CẤM đọc file này thành "wave đã adopt".
## ĐÃ LAND vòng-1 (verified trên đĩa — CẤM làm lại vòng-2)
| Mã | Hạng mục | Bằng-chứng ĐĨA | Trạng-thái git |
|---|---|---|---|
| A1 | 3 persona `harness-{eval,refine,audit}.md` | 6261B · 6012B · 5135B (mtime 18:2918:31) | untracked |
| A2 | 3 seed `agent-memory/harness-*/MEMORY.md` | 1547B · 1616B · 1513B — non-empty | đã auto-commit (hook path) |
| A3 | `hmw.js` VALID_ROLES+3 · 14/14→17/17 ×2 · writeGuard enum +7 | `git diff` +6/3, `:36 :41 :58 :190` | dirty |
| B1 | `.session-counter.json` contract-v2 + `_tick_invariant_note` | grep `SQUASH-BENIGN`:7 · `transient`:12 · json parse exit 0 | **committed `a458102`** |
| B5(iii) | port `scripts/stamp_verify.py` | 2378B, header `mirror-of AI_INFRA … ported S141` | untracked |
## CHƯA LÀM (chuyển nguyên sang vòng-2)
`A4` session-start (§2.1.8(b) 3-điều-kiện · §2.1.9 mới · [M3] `:97`) · `A5` session-end ((a)→(k) · (k) mới · [M3] `:142` · annex `da349fc`) · `A6` sweep 6 site còn sống · `A7` budget 3 row (grep = **0** occurrence) · `B2` detector H24-5 (grep = **0** hit) · `B3` FI 3 ca · `B4` carve-out ô3 (grep = **0** hit) · `B5(i)(ii)` 2 command khoan-dung + verify 3-dạng · `B6` draft-fix (file còn mtime 18-07 nguyên bản S140)
## Bài rút ra (đã có trong trí-nhớ — đây là data-point mới)
1. **WRITE-lane chết ≠ mất code.** Cả 2 lane tick `[ ]` toàn-bộ nhưng 5 hạng mục nằm sẵn trên đĩa. Recover đúng = **đọc đĩa**, không đọc return/diary → `feedback_agent_return_garble_recover` (WRITE-lane → disk-truth).
2. **Diary "ghi-đĩa-trong-lúc-làm" vẫn thua chính nó khi lane chết giữa 2 lần tick.** W-B tick được B1 (ô đầu) rồi chết; W-A chưa tick ô nào dù làm xong 3. ⇒ diary là **cận-dưới** của sự-thật, không bao giờ là cận-trên. Đọc diary phải kèm **1 lệnh chạm đĩa**`feedback_resume_premise_reverify` (S121: "khẳng-định trạng-thái-đĩa = phải chạm đĩa 1 lệnh").
3. **Orphan-detector chạy ĐÚNG.** Folder này bị FLAG orphan; `nhip-no-probe.ps1` độc-lập cũng in `run-chua-gom 1`. Hai nguồn khớp — sàn-3 có răng thật, không phải nghi-thức.

View File

@ -0,0 +1,26 @@
# RUN 2026-07-20-S141-adap-dot-9-10-bo-ba-sub
**Goal:** Adap wave đợt-9 + đợt-10 hub (7 thư nhận 2026-07-20, verify 2-tuyến 7/7) — bộ-ba harness-sub {eval·refine·audit} (khuôn 5-câu `58e28bae`) + dangling-head contract-fix APPROVED (①a) + khuôn câu cửa-duyệt hứa-máy (④a) + stamp-decode 3-cách-đọc (`6239dd40`) + khung-nhịp wording/annex phép-8 (`dede7ec5`) + session-model manifest 4-khoản ĐO-đĩa (`101e69d6` — wire CHỜ anh duyệt VC, carry #13(c)) + precedence nhãn re-verify (`d68de5e7`).
**Pipeline (anh chỉ định):** check-email ✓ → `/fable-clone invest` 5-lane (thiết kế) → spec v1 (lead ghi 3-mục) → `/fable-real review` (Fable soát) → spec v2 → hmw Opus 4.8 MAX implement → closeout (verify + harvest + adap-report + email hub + STAGE-2).
**Input 7 thư (id · sha12):**
1. `2026-07-17-ai_infra-to-se-reply-adap-wave-carveout-dp2` · 9a35405b6433
2. `2026-07-18-ai_infra-to-se-nudge-pull-dot-9-10` · 9cd1a486af96
3. `2026-07-18-ai_infra-to-se-reply-tong-bo-ba-harness-sub-4-khoan` · 58e28baedf05
4. `2026-07-17-Governance-chuan-hoa-stamp-decode` · 6239dd403792
5. `2026-07-17-Governance-khung-nhip-dinh-chinh-wording-tick-annex-phep-8` · dede7ec56ccc
6. `2026-07-17-Governance-session-model-phien-logic-manifest` · 101e69d61675
7. `2026-07-18-Governance-model-tier-h23-precedence-tested-update` · d68de5e7b72d
## taskList snapshot (fable-clone invest — 5 lane investigator-codebase, tier-2 opus+max)
| # | label | lens |
|---|---|---|
| 0 | lens-1-bo-ba-sub | Thiết kế 3 agent harness-{eval,refine,audit} theo khuôn 5-câu + wire 2 bề mặt + nhịp + ranh-trục |
| 1 | lens-2-dangling-carveout | Contract-fix squash-benign 3-điều-kiện + 2 fault-inject + neo-mốc-thực-chất + điều-kiện-sống carve-out ô3 |
| 2 | lens-3-stamp-nhip-phep8 | Đầu-đọc hash khoan-dung 3-cách + grep site verify + khung-nhịp wording check + baseline phép-8 |
| 3 | lens-4-session-model-do | ĐO manifest 4-khoản trên đĩa SE + đối chiếu draft VC — báo-cáo trình anh, KHÔNG wire |
| 4 | lens-5-precedence-crosscut | Re-verify nhãn precedence + sweep site roster 14→17 + risk cross-cutting |
**Bằng chứng sống kèm wave:** em-main dính đúng lỗ stamp-decode HÔM NAY (regex quote-strict → `declared=(none)` 3/3, suýt oan — "nghi verifier trước" cứu) — vào adap-report.

View File

@ -0,0 +1,68 @@
# SPEC v2 — Adap wave đợt-9/10 (S141, 2026-07-20) — FINAL sau fable-real gate
> v1 = 5-lane fable-clone invest `wf_3b74219c-561` + lead synthesize. **v2 = v1 + fold TRỌN fable-real review `wf_25210715-f7d` GO-WITH-FIXES 0C/7M/9n** (M1-M7 + n1-n9 đều áp — disposition từng dòng ở sub-reviewer-fable-spec.md). Worker thực thi THEO spec bơm qua args.
## ① Đề-bài
Adopt 7 thư hub đợt-9/10 (verify 7/7): **(A)** tạo bộ-ba sub `harness-eval/refine/audit` theo khuôn canonical 5-câu (`58e28bae` khối B) + wire nhịp 2-đầu-phiên consent-gated có-vết; **(B)** contract-fix dangling-head khuôn ①a APPROVED (squash-benign 3-điều-kiện) + H24-5 INFORM-sink + fault-inject 2 ca × 2 biến-thể + carve-out ô3 note; **(C)** stamp-decode đầu-đọc khoan-dung + port stamp_verify.py; **(D)** annex baseline phép-8 + note gộp tick-invariant; **(E)** sweep roster 14→17 co-land (13 site) — REPO-WIDE acceptance; **(F)** session-model: CHỈ sửa draft prereq-stale (cả (a) và (b)) — KHÔNG wire (carry #13(c)); **(G)** process closeout em-main (adap-report 7-disposition + email + STAGE-2). Governance-only: 0 prod-code, 0 mig, test 528 không đụng.
## ② Cách implement
### Lane W-A — Trio + toàn bộ wiring roster
**A1. 3 persona `.claude/agents/harness-{eval,refine,audit}.md`** — cookie-cutter khớp `lead-view-auditor.md:5-10`: `model: opus` (ALIAS theo policy worker-tier-pin S124; **[n1] hedge:** doc harness nói param nhận enum-alias, full-id CHƯA AI THỬ (fix#8a mở) — alias = dạng ĐÃ-test per `d68de5e7`; đây là form-deviation có-chủ-đích vs câu-5a hub "ghim full-id" → khai trong adap-report) · `effort: max` · `tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects]` · `memory: project` · `maxTurns: 18` · KHÔNG skills. CẤM Write/Edit trong tools (chặn-bằng-thiếu-tool).
- **harness-eval (con ĐO):** đọc output 5+1 instrument (`measure-agent-memory.ps1` JSON `agents[].l1_hot_bytes…` · `mfe-eval.ps1` FIT/strikes/per-role-pct · `memory-archive-gate.ps1` strike+A7 · `crystallized-backfill.ps1` headroom · `nhip-no-probe.ps1` 1-dòng) + `memory-budget.json` + diary mình. TRẢ SỐ NGUYÊN-VĂN + so-baseline + verdict {HEALTHY|REGRESSION|MIXED} + đề-xuất-signal. 🔴 CẤM số-từ-trí-nhớ. KHÔNG hành-động/chấm/harvest-op/lead-view. Body §: role · contract bảng {instrument·số·baseline·delta·verdict} · file-đọc · ranh-trục (đụng harvest→NHƯỜNG harvest-curator; KHÔNG chấm diff=reviewer) · 2 caveat (Bash-kênh-ghi→lead git-status; registry→spawn-probe) · anti-pattern (❌số-trí-nhớ ❌re-implement máy ❌đề-xuất-action ❌PASS-cạnh-số-ngược).
- **harness-refine (con ĐỀ-XUẤT):** input = `harness-eval-return.md` **PIN đích-danh (lead truyền path; [n5] missing/rỗng → TỪ-CHỐI đề-xuất, mirror fail-closed audit)** + reinject-ledger + diary mình. TRẢ action 4-LỚP {nạp-lại · thăng-hạng lặp≥2 · lưu-kho L1→L2 · chưng-cất} — MỖI action {đối-tượng file:path · trigger=số-con-ĐO · CHỐT-DỪNG (đề-xuất 1 lần không đạt→leo-thang lead, CẤM lặp) · owner-gate} + mục "đã cân-nhắc→BÁC" **[n4] PHẢI HIỆN DIỆN — 0-item thì khai lý-do vì sao không có gì để bác** (chống nghi-thức rỗng). 🔴 RANH SẮC: LEAD hot-feed/carry/work-state = lead-omission-auditor → NHƯỜNG; refine CHỈ acts AGENT-MEMORY corpus. KHÔNG đo-lại/chấm/ghi.
- **harness-audit (con KIỂM):** đọc **ĐÚNG run-folder PIN đích-danh** (🔴 CẤM tự tìm "run mới nhất"; pin missing/rỗng → **TRƯỢT/TỪ-CHỐI, CẤM ĐẠT-ảo**) + spec/checker (memory-budget.json, scripts) + diary mình. TRẢ verdict ĐẠT/TRƯỢT per-claim + falsify-log HELD/BROKE + **re-chạy ≥2 số load-bearing** đối-chứng byte-exact. KHÔNG chấm diff-code (reviewer) · KHÔNG lead-view · đụng harvest→NHƯỜNG. Anti-pattern: ❌tự-tìm-run ❌ĐẠT-ảo ❌tin-số-không-re-run.
**A2. Seed 3 folder `agent-memory/harness-{eval,refine,audit}/MEMORY.md`** — non-empty (role baseline + boundary + "S141 seed, chưa chạy lần nào" — trung thực).
**A3. `hmw.js`:** chèn sau dòng 35: `'harness-eval', 'harness-refine', 'harness-audit',` + comment 3 dòng (trục CHÍNH-HỆ-MEMORY khác H1/H2/H24/reviewer · TUẦN TỰ eval→refine→audit CẤM song song · lead scribe return từng con). Comment `:41` "14/14"→"17/17" · `:55` "(14/14)"→"(17/17)". **[n9] writeGuard `:186-187` HOÀN THIỆN enum read-only:** thêm CẢ `tooling-auditor, harvest-curator, lead-view-auditor, lead-omission-auditor` (thiếu sẵn — drift cũ) + 3 trio vào nhóm "CHỈ có Bash".
**A4. `session-start.md`:** (i) **§2.1.8(b) REWRITE 3-điều-kiện** — counter-lùi → FAIL-LOUD báo anh; head not-reachable → phân loại TRƯỚC: object-exists (`git cat-file -t`=commit) ∧ counter-không-lùi → **squash-benign** ghi 1 dòng vết `history[]` event-class `squash-benign` đi tiếp KHÔNG báo anh (nhãn-phiên cũ intact = corroborate); object-MISSING counter-lùi → FAIL-LOUD như cũ. (ii) **THÊM §2.1.9 "Bộ-ba đồng-kiểm memory (2-đầu-phiên, consent-gated)"** sau §2.1.8: em-main IN đề-xuất-chạy 1 dòng → 🔴 KHÔNG auto-run (consent-form như sleep-check §2.1.2) → anh gật → chạy **TUẦN TỰ** eval→refine→audit (3 spawn RIÊNG — hmw `parallel()` KHÔNG dùng cho trio); lead scribe return từng con → `runs/<run-id>/harness-{eval,refine,audit}-return.md` NGAY; Mirror C1 đóng-băng trong cửa-sổ đo; refine+audit nhận **PIN đích-danh**; post-wave `git status` assertion; KHAI script-arm (§2.1.2/6/7) ⟂ sub-arm (trio); "phiên-LOGIC" map tạm = phiên `S<nn>`; KHÔNG cadence-key/KHÔNG tick. **[M4] Vết-2-lớp:** (a) **proposal-line IN CẢ khi Light-session** (không skip im); (b) khi skip (anh không gật / Light) → **ghi 1 dòng vết vào WAL** `trio: skipped S<nn> (lý-do)` — chuỗi skip nhìn thấy được. Light → skip hợp lệ NHƯNG proposal-line + vết vẫn in.
(iii) **[M3] §2.1 checklist roster `:97-113`:** thêm 3 bullet trio vào topology list + sửa dòng `:97` "10 product/quality + 4 monitor INFORM-only" → **BỎ-số dạng liệt-kê-nhóm:** "10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory — số vai canonical → docs/STATUS.md §Sub-agents)".
**A5. `session-end.md`:** (i) THÊM **§L.b(k) "Bộ-ba đồng-kiểm @đóng-phiên"** — mirror §2.1.9 (consent + tuần-tự + scribe + PIN + git-status + vết-skip; đọc số instrument ĐÃ chạy trong closeout thay chạy lại). **[M6] Sửa header `:52`** "(a)→(j)" → "(a)→(k)" (giữ nguyên ghi-chú :53 "đếm từ thân"). **[M3] Sửa `:142`** "10 product/quality + 4 monitor" → cùng dạng BỎ-số liệt-kê-nhóm như A4(iii). (ii) **Annex phép-8** 1 dòng tại §L.b(j)(vi): "*baseline-ghi-bù (phép-8 annex `dede7ec5`, khai-1-lần): cơ-chế force-fire bù closeout-gộp tồn tại từ 2026-07-17 (`da349fc`, S135 — re-đo 19:12:41+07). Phép-8 CHỈ tính FAIL cho closeout SINH SAU mốc; closeout trước = baseline hợp-lệ ghi n/a, KHÔNG đếm FAIL. Không lặp mỗi lần chạy.*"
**A6. Roster sweep 14→17 (CO-LAND cùng commit với A1 — R3-M2), 13 site:** `agents/README.md:5` → BỎ-số dạng liệt-kê-nhóm (**[n8]** theo chính README:3 "vá bằng BỎ số, không ĐỔI số") + `:222` "14 folder"→"17 folder" (+3 tên) + decision-tree nhánh trio + skill-matrix 3 row (ref-only instrument) · `fable-clone.md:3/:18/:19` + `fable-real.md:3/:19/:20` enum +3, "roster 14"→"roster 17" · `harness-11-engine.md:345` enum +3 + **[n6] sửa cite ":22-36" → bỏ line-range (ghi "hmw.js VALID_ROLES")** · `vocab-alias-map.md:51` "14/14"→"17/17" · `workflows/README.md:64` "9 roster" → con-trỏ canonical (KHÔNG chép số) · **[M3] `session-start.md:97` + `session-end.md:142`** (đã cover A4(iii)/A5(i)) · STATUS §Sub-agents cell 14→17 + narrative = em-main @closeout CÙNG COMMIT.
**A7. `memory-budget.json`:** thêm 3 row `measured`**chạy `measure-agent-memory.ps1` SAU seed A2, chép số THẬT script in ra** (hợp lệ no-hand-edit — tiền lệ S138 addendum), rollout-note "S141 seed — first-run pending restart+consent; re-measure @drift-audit 2026-08-01". **[n2] Cập nhật `measured._note`** thêm câu addendum kiểu S138: "+3 row trio S141 do tươi script". KHÔNG cadence-key · KHÔNG block harness_trio (skip-có-lý-do: sequential-rule sống ở §2.1.9 + persona).
### Lane W-B — Contract v2 + stamp + carve-out + draft-fix
**B1. `.session-counter.json`:** thay `_contract.fail_loud_on_regress` bằng wording v2 EN (2 trigger 2 verdict: counter-regress → FAIL-LOUD report-owner; not-reachable → classify: object-exists ∧ counter-monotonic → SQUASH-BENIGN append 1 history-entry event-class `squash-benign` CONTINUE no-alarm — prior session-label intact corroborates; object-missing regress → FAIL-LOUD; rationale: closeout squash lifts tick-head every cycle = expected drift). THÊM `_tick_invariant_note`: tick invariant verbatim hub (+1/cặp) · SE form tick-at-entry-gate NET +1/label ≡ hub +1/cặp **[n3] trên cặp ĐÃ-ĐÓNG; cặp đang-MỞ transient +0 (đóng cặp mới +1) — hub bless (`9a35405b` khối-1 phép dừngnối)** · guard sống-còn = label-convention · history[] append-unbounded by design; NẾU sau này cap FIFO PHẢI xử eviction tường-minh.
**B2. `governance-detectors.ps1` — detector MỚI H24-5 `counter-ancestor-classify`** (read-only, `-RepoRoot`, git-based mirror H25): đọc `.session-counter.json`; `merge-base --is-ancestor last_ticked_head HEAD` exit-0 → `OK-reachable`; else `cat-file -t`=commit → `SQUASH-BENIGN (trace)` 0-flag; else → flag `object-missing`. **[M1] Nhánh counter-regress DEFAULT-ON:** flag khi `counter < last_audit.light_at_counter` `counter < last_audit.deep_at_counter` (static read-only; repo thật 15≥14/3 → 0-flag). **[M2] Day-one = INFORM-sink:** MỌI flag H24-5 in dòng `INFORM-ONLY` RIÊNG cuối output (như C6/H24-4), **KHÔNG vào TOTAL** (luật `:65-68` brand-new net; promote = post-triage owner-gated; răng không mất — contract §2.1.8(b) runtime vẫn FAIL-LOUD độc lập detector).
**B3. Fault-inject cây tạm (`$env:TEMP`, cleanup sau):** ca-1 seed→wal-commit→tick-json→reset-soft-squash → `-RepoRoot $T` → KỲ VỌNG `SQUASH-BENIGN` 0-flag; **[M1] ca-2 CẢ 2 biến-thể:** (2a) fake-sha `000…0` → INFORM-flag `object-missing`; (2b) counter giảm dưới `light_at_counter` → INFORM-flag `counter-regress`. Evidence PASS/FAIL từng ca vào sub-file.
**B4. `error-ledger.md` Active-Guards** — note-block carve-out ô3: VALID chỉ khi CẢ 2 lưới sống {`nhip-no-probe.ps1` in mọi điểm dừng + H25-closeout detector wired}; 1 lưới chết → RE-EVAL nấc, tụt chạy-vô-điều-kiện; basis `9a35405b` khối-2; live-evidence S139→S140 (light 8/6 → gật → chạy → 0/6). **+1 câu:** trio-consent S141 cùng CLASS carve-out (đề-xuất-chạy + vết-skip WAL = lưới; khai nấc PASS-với-carve-out trong adap-report).
**B5. Stamp-decode:** `check-email.md` bước 4(b) — pin mẫu rút declared: khoan-dung `content_sha256:\s*"?([0-9a-fA-F]{8,64})"?` (3 dạng: có-ngoặc · không-ngoặc · rút-gọn ≥8-hex tiền-tố) + 🔴 CẤM quote-strict `([0-9a-fA-F]+)` (whiff hash-có-ngoặc → false-tamper, S141 suýt oan 3/3) + ƯU TIÊN `python scripts/stamp_verify.py <file>` · `send-email.md` 6c — align cùng mẫu + prefer script · **PORT `scripts/stamp_verify.py`** từ `AI_INFRA/scripts/stamp_verify.py` verbatim + header-note "mirror-of AI_INFRA — re-pull khi hub đổi §N canon". **[n7] Verify 3-dạng:** chạy trên thư quoted thật (6239dd40) exit 0 **+ tự tạo 1 file synthetic tạm (frontmatter hash KHÔNG-ngoặc + 1 file rút-gọn 8-hex) → cả 2 verify OK → xoá**; python vắng → khai + regex-pin làm chính.
**B6. `session-model-se-draft.md` §4 prereq:** **[M7] flip CẢ (a) VÀ (b):** (a) "mẫu-áp-dụng hub" → "✅ ĐÃ VỀ 2026-07-18 (`101e69d6` kit+manifest; Q4 van-ngưỡng CHƯA trả lời — hub cố-ý bỏ counter)"; (b) "khuôn bộ-ba SUB" → "✅ ĐÃ VỀ 2026-07-18 (`58e28bae` khối B — trio adopt S141)". +1 dòng: K4-form-conflict (hub `sessions/session-<N>` vs draft `logic-sessions/L<mm>`) + `session_ctx_kb` + meld-forward-gap (hook 3→4-path) = "chờ anh duyệt cùng bảng VC". Còn lại (c) anh duyệt VC = ĐIỀU KIỆN CUỐI. KHÔNG wire.
### ②G — Process closeout (EM-MAIN, sau verify) **[M5]**
Adap-report: bảng **disposition TỪNG thư 7/7** (nấc per-khoản theo thang 5; trio = executed-file/verified-pending-restart; annex/design-note = executed-doc/verified-pending-first-real-closeout-gộp; form-deviation n1 + Light-carve-out M4 khai thẳng) → update/new `docs/governance/adap-reports/` · email báo-nấc hub (selftest-stamp 6c) · STAGE-2 move 7 thư → `inbox/ai_infra/` + `_index` processed · STATUS/HANDOFF (cell 17 + carry #11 ĐÓNG + #12 ĐÓNG + #13 cập "chờ anh VC" + carry #2 data-point inv-cb 24.5K hook-fired) · commit + push theo §5.2 squash→count→push.
### KHÔNG làm wave này
Session-model wire · hướng (i) neo-mốc (defer — ghi adap-report) · liveness-detector carve-out (follow-up) · precedence re-sync (0 site sống — VERIFIED grep độc lập) · trio first-run (sau restart + consent).
## ③ Checklist (acceptance ĐO ĐƯỢC)
1. 3 persona: tồn tại, frontmatter khớp cookie-cutter (grep `model: opus`+`effort: max`, KHÔNG Write/Edit trong tools) · 3 MEMORY.md non-empty.
2. TRIPLE 17/17/17: `ls .claude/agents/*.md|grep -v README|wc -l`==17 == VALID_ROLES==17 == README enum==17. CẤM xoá README.
3. §2.1.9 + §L.b(k) + header "(a)→(k)" + §2.1.8(b) chứa "squash-benign"+giữ FAIL-LOUD + annex chứa "da349fc".
4. **[M3] Sweep REPO-WIDE:** `grep -rn "roster 14\|14/14\|14 folder\|14 vai" --include="*.md" --include="*.js"` TRỪ frozen-history (docs/_archive/ · docs/changelog/sessions/ · runs/ · broadcasts/ · agent-memory/ · adap-reports/ · outbox/) = **0 site SỐNG** · session-start:97 + session-end:142 hết "4 monitor" · workflows/README:64 hết "9 roster".
5. budget 3 row: số THẬT từ `measure-agent-memory.ps1` (fresh-run diff = 0-mismatch) + `_note` addendum.
6. Contract v2 + `_tick_invariant_note`: JSON parse OK (`ConvertFrom-Json` exit 0) + chứa "SQUASH-BENIGN" + "transient".
7. H24-5: repo thật `OK-reachable` 0-flag · **FI 3 ca PASS** (ca-1 SQUASH-BENIGN 0-flag · 2a object-missing INFORM-flag · 2b counter-regress INFORM-flag) · dòng INFORM-ONLY riêng, TOTAL không đổi vì H24-5.
8. Carve-out note present (error-ledger, 2 lưới đích danh + câu trio).
9. Stamp: mẫu khoan-dung trong 2 command + `stamp_verify.py` exit 0 trên {quoted thật + synthetic không-ngoặc + rút-gọn}.
10. Draft prereq (a)+(b) "ĐÃ VỀ", (c) giữ chờ-anh, 0 wire khác.
11. Detector suite exit 0; flag MỚI giải thích TỪNG cái (dự kiến: C2-class từ roster/STATUS edits trước khi STATUS cập nhật cell — phải về 0 sau closeout STATUS).
12. Spawn-probe trio 3/3 = PHIÊN SAU restart — nấc **executed-file / verified-pending-restart** (khai thật trong adap-report).
13. git-status: 0 tracked-change ngoài file-set giao + run-folder.
14. **[M5] Process:** adap-report 7-disposition + email selftest-PASS + STAGE-2 moved + _index processed — đủ 4.
**Chờ-anh (không block implement):** (1) ranh refine⟂lead-omission ratify · (2) 5 câu session-model (session_ctx_kb=64? · N=L map + folder-form? · VC từng dòng · hook 4-path? · prereq unblock) · (3) consent-form trio dài hạn (mỗi phiên gật hay luật đứng).

View File

@ -0,0 +1,111 @@
# sub-reviewer-fable-spec — REVIEW-GATE spec v1 adap wave đợt-9/10 (S141, 2026-07-20)
> Vai: reviewer (fable-real single-lane, engine-đắt lệnh-A). Đề-bài: adversarial deep-pass spec v1 (bản đĩa `spec-adap-dot-9-10-20-07-2026.md` 14 468B = authoritative; bản inline task = nén, nhất quán). 5 trục: FIDELITY khuôn hub · CONSISTENCY floor SE · OMISSION · ACCEPTANCE đo-được · RISK chưa khai. Ghi TRONG LÚC LÀM (anti-#53).
## VERDICT: GO-WITH-FIXES — 0 Critical / 7 Major / 9 minor
Spec đứng được: khuôn trio 5-câu + contract ①a + carve-out + stamp + annex đều bám thư hub sát (nhiều chỗ siết thêm đúng hướng: pin-missing→TRƯỢT, FI 2-chiều, TRIPLE-17 chống xoá-README). 7 Major đều fix-được bằng sửa spec ≤1 câu/điểm, không đổi kiến trúc.
## Evidence base (đã chạm đĩa, không tin trí nhớ)
- 7/7 thư inbox đọc trọn: `58e28bae` (trio 5-câu + 4-khoản C) · `9a35405b` (carveout-dp2 khối 1-6) · `6239dd40` (stamp-decode) · `dede7ec5` (đính-chính tick + annex + design-note) · `101e69d6` (session-model kit + manifest 4 khoản + thang 5 nấc) · `d68de5e7` (precedence delta) · `9cd1a486` (nudge).
- Floor đĩa: session-start.md §2.1.2/§2.1.8 (:127-208) · session-end.md §L.b (:52-113) + :142 · `.claude/governance/.session-counter.json` (counter=15, S141 đã tick, history 5 entry, 3 ca FAIL-LOUD S127/S133/S139) · memory-budget.json (measured 14 row + h24_cadence 6/15/3 + C1-list) · hmw.js :22-36/:41/:55/:178-195 · lead-view-auditor.md:1-11 (mẫu frontmatter khớp 100% A1) · check-email.md:17 · send-email.md:28-32 · error-ledger.md:38-42 · governance-detectors.ps1 (:38 RepoRoot · :65-68 INFORM-sink owner-set · H24-1/2/3 + H24-4 sink → tên H24-5 TRỐNG) · agents/README:3/:5/:222 · engine:345 · vocab:51 · workflows/README:64.
- Re-đo độc lập: `git log da349fc` = **2026-07-17 19:12:41 +0700**, label "S135-S136" (force-fire trong message) → mốc annex ĐÚNG ngày; "S135" = item-label đúng (§L.b(j)(vi) "Item 3 S135"). · Sweep roster: bắt 2 site sống NGOÀI spec (dưới, M3) · Sweep "9 roster": chỉ workflows/README:64 ✓ · Sweep precedence stale-label: **0 hit sống** ✓ spec claim đúng · `AI_INFRA/scripts/stamp_verify.py` TỒN TẠI (2 247B, Jul-3) — đọc trọn: regex tolerant `"?([0-9a-fA-F]{8,64})"?` :15 + 2-variant :38-39 + prefix-match :42 + exit-code ✓ đúng như thư mô tả → port verbatim khả thi.
---
## MAJOR (7) — fix trước khi implement
**M1 [B2↔B3↔khuôn ①a] Detector H24-5 thiếu nhánh counter-regress mà FI ca-2 lại kỳ vọng FLAG khi giảm-counter.**
B2 classify: is-ancestor→OK · cat-file=commit→SQUASH-BENIGN · else→FLAG object-missing; "Counter-regress check optional param" (spec:34) không formula, không nói FI bật param. B3 (spec:36): "ca-2 fake-sha 000…0 (+biến thể giảm counter) → KỲ VỌNG FLAG" — biến thể giảm-counter giữ sha reachable ⇒ đường B2 as-written ra OK-reachable 0-FLAG ⇒ **acceptance ③7 "FI 2/2 PASS" bất khả thi hoặc bị né bằng cách chỉ test fake-sha** (Goodhart: test biến-thể dễ đậu). Khuôn ①a: "counter-lùi ⇒ FAIL-LOUD như cũ" — lớp chống giả-mạo. Static-check khả thi read-only: FLAG khi `counter < last_audit.light_at_counter counter < last_audit.deep_at_counter` (đĩa hiện tại 15 ≥ 14/3 → repo thật vẫn 0-FLAG ✓ ③7 giữ được). **Fix:** quy định regress-branch DEFAULT-ON với formula trên (bỏ "optional param"), FI ca-2 chạy CẢ 2 biến-thể.
**M2 [B2 ↔ governance-detectors.ps1:65-68] FLAG-vào-TOTAL ngày-một mâu thuẫn luật owner-set "detector MỚI vào INFORM-sink".**
:65-68: "INFORM-only flag sink for NEW detectors (C6, H24-4)… a brand-new net whose LOW hits are read by judgement on day one must not move the audited TOTAL" (anti-Goodhart, owner-set). Spec:34 quyết ngược: "object-missing = FLAG thật vào TOTAL". Có đường biện hộ (H24-5 MED + deterministic ≠ "LOW hits read by judgement") nhưng spec KHÔNG reconcile với luật đó. **Fix (1 trong 2):** (a) day-one vào INFORM-sink, promote vào TOTAL sau lượt chạy sạch (răng không mất — contract §2.1.8(b) runtime vẫn FAIL-LOUD); (b) giữ TOTAL nhưng ghi rõ lý-do phân-biệt class + đưa vào Chờ-anh (luật owner-set → owner quyết override).
**M3 [A6 + acceptance ③4] Sweep sót 2 site sống + acceptance tự-giới-hạn "trên các file sửa" = Goodhart-able by construction.**
Grep độc lập bắt: `session-start.md:97` + `session-end.md:142` — cả hai mang "**10 product/quality + 4 monitor INFORM-only**" (đọc MỖI phiên, sống) — KHÔNG có trong danh-sách A6 (inline lẫn disk). ③4 đo "grep trên các file SỬA = 0" ⇒ site ở file CHƯA-sửa vô hình by construction (đúng bệnh "đo cái dễ đo" §L.b(f) đã tự ghi trong repo). **Fix:** +2 site vào A6; acceptance ③4 đổi thành grep REPO-WIDE trừ frozen-history (`archive/ runs/ sessions/ adap-reports/ broadcasts/ agent-memory/`) = 0 hit sống; cân nhắc +3 bullet trio vào khối topology session-start §2.1 (:98-113) + session-end Phase-1 (:36-39).
**M4 [A4/A5 — consent + Light-skip = carve-out chưa khai, 0 lưới]**
Hub câu-3 floor: "chạy ĐỦ CẢ HAI ĐẦU mỗi phiên-LOGIC" (consent-form nhóm được giữ). SE thêm: anh-gật-mới-chạy + "Light → skip hợp lệ" + KHÔNG cadence-key ⇒ chuỗi phiên anh không gật / Light liên tiếp → trio không chạy mà KHÔNG một dòng nợ nào hiện (nhip-no-probe không phủ trio — by design). Đây đúng CLASS carve-out ô3, mà ô3 được hub CONFIRM chỉ ở nấc "PASS-với-carve-out" NHỜ 2 lưới sống (9a35405b khối 2: rủi-ro mới = "chủ quên gật mà không ai kêu"); trio-carve-out hiện 0 lưới. **Fix rẻ:** (i) proposal-line in CẢ khi Light (skip = thấy-mà-không-gật, không phải im lặng); (ii) skip ghi 1 dòng vết session-log/WAL `trio: skipped <lý-do>` (hậu-kiểm đếm được, cùng họ phép-8); (iii) adap-report khai nấc "PASS-với-carve-out (consent + Light-exempt)", KHÔNG tự khai đủ-floor.
**M5 [Process — adap-report / email báo-nấc / STAGE-2 vắng khỏi spec + acceptance]**
Precedence d68de5e7 §5 đòi "tự-báo nấc kể cả 'đã re-verify, không đổi'"; manifest 101e69d6 có thang 5-nấc per-khoản; channel-contract SE (check-email.md STAGE-2 :20-22 + §J2) đòi move processed + `_index`. Spec chỉ nhắc adap-report 1 lần (defer-note hướng-(i), spec:46). Prior waves S137/S139 đều ship adap-reports + email hub. **Fix:** thêm bước "em-main @closeout: 7 disposition adap-report (kể cả SKIP/no-change) + email báo-nấc + STAGE-2 move + _index" + acceptance ③14 đếm được (7/7 disposition tồn tại).
**M6 [A5(i)] Thêm §L.b(k) mà không sửa header range "(a)→(j)".**
session-end.md:52 "auto-maintain **(a)→(j)** (đủ HẾT, KHÔNG skip…)" = range-token sống; :53 CHÍNH LÀ ghi-chú vá class này ("Nhãn cũ ghi 8-step trong khi thân (a)→(i)=9 — view-stale-count… KHÔNG chép số vào nhãn"). Giữ "(a)→(j)" thì (k) đọc thành ngoài-danh-sách-bắt-buộc → skip-able. **Fix:** header → "(a)→(k)" hoặc đúng tinh thần :53 bỏ range; tuỳ chọn thêm mapping "(k) = trio" cạnh "(j) = H24" ở :52.
**M7 [B6] Half-fix: prereq (a) "hub phát mẫu áp dụng" CŨNG đã về — chỉ flip (b) làm draft tự-mâu-thuẫn.**
Draft §4 (đọc đĩa): "không bật trước khi: (a) hub phát mẫu áp dụng, (b) khuôn bộ-ba SUB về, (c) anh duyệt VC". Kit 101e69d6 = "bộ kit + manifest" = mẫu áp dụng — về cùng đợt với 58e28bae; chính B6 trích K4/session_ctx_kb/meld-gap TỪ kit đó. Sau edit-(b), (a) vẫn treo "chờ hub" = stale đúng class spec đặt ra để vá. **Fix 1 dòng:** flip (a) "✅ ĐÃ VỀ 2026-07-18 (101e69d6 — kit + manifest 4 khoản; §5-Q4 van-ngưỡng CHƯA được trả lời)". (c) giữ treo ✓.
## minor (9)
- **n1** A1 "param SE từ chối full-id" = claim CHƯA-ĐO — hmw.js:51 tự khai "CHƯA AI THỬ THẬT (fix#8a)"; doc nói enum-alias. Deviation alias-vs-full-id vẫn ĐÚNG (policy S124 + alias = dạng ĐÃ-test per d68de5e7 caveat; full-id n=0) nhưng wording phải hedge + khai form-deviation trong adap-report.
- **n2** A7 thiếu cập-nhật `measured._note` addendum (tiền-lệ S138 "+2 row H24 đo TƯƠI" ghi trong _note) → thêm "S141 ADDENDUM +3 row trio".
- **n3** B1 "_tick_invariant_note: NET +1/label ≡ hub +1/cặp" — tương-đương chỉ trên cặp ĐÃ ĐÓNG; cặp đang-mở: hub-form +1 (chốt tại dừng) vs SE-form +0 (chờ nối) = lệch transient. Hub đã bless hành-vi (9a35405b khối 1: "chỉ cần re-sync câu-chữ, không phải đo lại") → thêm nửa câu khai transient để auditor sau không đọc thành tick-site-identical.
- **n4** refine "mục đã-BÁC (≥0 dòng)" — "≥0" cho phép luôn-rỗng = tự vô-hiệu mục-đích chống-nghi-thức-rỗng (58e28bae câu 1). Đổi: mục PHẢI hiện diện; 0-item → khai "không có ứng-viên bị bác".
- **n5** refine KHÔNG được pin run-folder đích-danh (audit có, refine không) + không fail-closed khi `harness-eval-return.md` vắng → spawn sai thứ-tự/sai folder = đọc bản cũ/bịa. Mirror rule audit: lead truyền path + input-missing → TỪ-CHỐI.
- **n6** engine:345 cite "hmw.js VALID_ROLES `:22-36`" — A3 chèn 3 dòng làm range stale (→ ~:39). Sửa hint hoặc bỏ line-hint (chuẩn "NO line-hints" đã có ở memory-budget pointer_style).
- **n7** B5 verify chỉ chạy biến-thể quoted (đúng incident-class S141) — thư mục-5 test 3 biến-thể; thêm 1 synthetic không-ngoặc/8-hex hoặc khai chỉ-test-quoted.
- **n8** agents/README:5 "đổi số" (+4→+7) trong khi README:3 tự ghi "Vá @S122 bằng BỎ số, không phải ĐỔI số — đổi số thì roster kế lại stale". Hoặc chuyển form bỏ-số, hoặc giữ đổi-số + 1 dòng lý-do (structural split có giá trị đọc) — hiện spec im lặng trước tension của chính file đích.
- **n9** writeGuard :187 + comment :180-181 enum read-only hiện ĐÃ thiếu lead-view/omission (drift sẵn có từ S121) — thêm trio mà không hoàn-thiện enum = bảo-tồn drift; nhân tiện thêm đủ 2 vai H24 hoặc degrade enum → mô-tả-class.
## Trục-5 RISK — các câu hỏi task đặt, trả lời có bằng chứng
| Câu hỏi | Trả lời | Evidence |
|---|---|---|
| B6 vi phạm carry #13(c) KHÔNG-wire? | **KHÔNG** — edit = truth-up prereq trong draft (doc-only), 0 cơ-chế wire; #13(c) cấm WIRE. Còn M7 half-fix | draft §4 + spec:42 "KHÔNG wire gì khác" + ③10 diff-scope |
| Consent-form trio | Carve-out chưa khai + 0 lưới → **M4** | 58e28bae câu-3 vs spec:22 |
| TUẦN TỰ = kỷ-luật-người? | Audit đã fail-closed (pin-missing→TRƯỢT) = chốt máy; refine chưa → **n5** | spec:16 vs :15 |
| H24-5 FLAG-vs-INFORM | **M2** (luật :65-68 owner-set) + **M1** (regress-branch) | detectors.ps1:65-68 |
| Mốc da349fc | ĐÚNG: 2026-07-17 19:12:41 +0700; label commit "S135-S136", item-label S135 đúng (§L.b(j)(vi)) — nano: có thể ghi "S135-S136 closeout" | git log da349fc |
| Ranh refine⟂lead-omission đủ sắc? | Đủ như spec (discriminator WHOSE-memory: LEAD hot-feed/carry = omission · AGENT corpus = refine); ratify pending đúng chỗ Chờ-anh-1; reinject-ledger dùng chung 2 phía là điểm cần ratify nêu rõ | spec:15 + session-start:112 |
| A7 vi phạm no-hand-edit? | **KHÔNG** — đo-bằng-script rồi chép số THẬT = đúng tiền-lệ S138 ADDENDUM (+2 row H24 "đo TƯƠI"); rule cấm sửa-không-đo. Còn n2 (_note) | memory-budget.json:2/:143 |
| Mirror C1 cấm ghi memory-budget/counter NGAY BÂY GIỜ? | **KHÔNG có cửa-sổ đo active** — C1 window mở "từ script đo đầu-tiên khối (c) closeout tới verdict cuối" (§L.b(c)); trio chưa từng chạy (first-run phiên sau ③12); wave edits land mid-session TRƯỚC closeout ⇒ hợp lệ. Ghi 1 dòng thứ-tự "A7/B1 land trước khối (c)" là đủ | session-end:56 + session-start:135 |
## Fidelity tally 7 thư (trục-1)
1. **58e28bae** khối B câu 1-5 → A1-A5: FAITHFUL (4-lớp refine, chốt-dừng, đã-BÁC, PIN đích-danh, ≥2 số re-run, scribe-ngay, 2-tầng máy-đo→sub-phán, ranh 4 vai, khuôn (a)-(d) + 2 caveat). 2 deviation có chủ-đích: model-alias (n1, justified) + Light-skip (M4, phải khai). Khối C① khuôn contract → B1/A4(i) khớp từng điều-kiện; ② edits-land-trước-review = đã là floor SE (feedback S139); ③ rename ACK n/a; ④a hứa-máy — spec này không thêm câu "máy sẽ quét" nào thiếu mã (H24-5 = mã thật kèm FI) ✓; ④b n/a.
2. **9a35405b** khối 2 → B4 FAITHFUL (2 lưới đúng danh: nhip-no-probe + H25; "nên tụt"→"tụt" = siết, hợp lệ; basis + live-evidence S139→S140 đúng hướng). Khối 3 → hướng (i) DEFER khai trong adap-report + (ii) đã được thay bằng khuôn ①a APPROVED (đến sau, thắng) ✓; carry-đặt-tên đã làm S137 ✓.
3. **6239dd40** → B5 FAITHFUL: regex verbatim thư :37; byte-safe SE đã có từ S125 (check-email:17); lỗ THẬT còn lại = extraction quote-strict (incident S141 suýt-oan 3/3, investigator-diary xác nhận) → pin mẫu + port script = đúng thuốc. n7.
4. **dede7ec5** → B1 note + A5(ii) annex FAITHFUL (baseline khai-1-lần, FAIL chỉ closeout sau mốc, n/a trước mốc, không lặp); design-note log-BOUNDED phản ánh đúng (history[] append-unbounded VERIFIED trên đĩa — 5 entry không cap). n3.
5. **101e69d6** → B6 đúng scope KHÔNG-wire (kit adopt chờ VC = hợp lệ manifest "đã-đồng-ý" pending); M7 prereq-(a).
6. **d68de5e7** → "0 site sống" VERIFIED bằng grep độc lập (0 hit); nghĩa vụ còn lại = record re-verify vào adap-report (M5).
7. **9cd1a486** nudge → ACK-only ✓.
## Acceptance ③ per-dòng (trục-4)
1 ✓ đo được (grep frontmatter + non-empty) · 2 ✓ TRIPLE 3-nguồn + anti-Goodhart cấm-xoá-README (bài #48 R2-C1) · 3 ✓ grep-able · **4 ✗ Goodhart-able (M3)** · 5 ✓ falsify = re-run script so JSON · 6 ✓ ConvertFrom-Json exit · **7 ✗ ca-2 giảm-counter bất khả thi as-spec'd (M1)**; vế repo-thật OK-reachable deterministic trong phiên (head 4c43d74 = ancestor tới khi closeout-squash) · 8 ✓ · 9 ✓ + fallback python-vắng khai thật · 10 ✓ (nửa "0 wire khác" đo bằng diff-scope file draft) · 11 ~ judgement-bounded (diff output trước/sau, flag mới từ roster/STATUS edits dự-kiến C2) · 12 ✓ nấc executed-file/verified-pending-restart = khai thật đúng G-011 · 13 ✓ E-006 backstop. Thiếu: ③14 process (M5).
## Disposition bảng TỪNG finding
| ID | Khối | Mức | Fix 1-dòng | Blocking? |
|---|---|---|---|---|
| M1 | B2/B3/③7 | MAJOR | regress-branch DEFAULT-ON formula `counter < last_audit.*_at_counter` + FI ca-2 chạy cả 2 biến-thể | CÓ (③7 bất khả thi nếu không) |
| M2 | B2 | MAJOR | day-one INFORM-sink HOẶC khai override + Chờ-anh-4 | CÓ (luật owner-set) |
| M3 | A6/③4 | MAJOR | +session-start:97 +session-end:142; ③4 grep repo-wide trừ frozen | CÓ (mục tiêu (E) vỡ nếu không) |
| M4 | A4/A5 | MAJOR | proposal-line in cả Light + vết-skip 1 dòng + adap-report khai carve-out | CÓ (floor-deviation phải khai trước khi báo hub) |
| M5 | ①/③ | MAJOR | +bước em-main @closeout: 7 disposition + email + STAGE-2 + _index; +③14 | CÓ (channel-contract) |
| M6 | A5(i) | MAJOR | header §L.b "(a)→(j)"→"(a)→(k)" hoặc bỏ range | CÓ (cùng commit với (k)) |
| M7 | B6 | MAJOR | flip prereq (a) ĐÃ VỀ (101e69d6) + note Q4 chưa trả lời | CÓ (cùng edit B6) |
| n1 | A1 | minor | hedge "chưa thử full-id (hmw.js:51)" + khai deviation adap-report | không |
| n2 | A7 | minor | +1 câu measured._note "S141 ADDENDUM +3 row" | không |
| n3 | B1 | minor | +nửa câu khai transient-lệch cặp-đang-mở | không |
| n4 | A1-refine | minor | "≥0 dòng" → "mục PHẢI hiện diện, 0-item khai lý-do" | không |
| n5 | A1-refine | minor | pin path cho refine + input-missing→TỪ-CHỐI | không |
| n6 | A6-engine | minor | sửa/bỏ line-hint ":22-36" | không |
| n7 | B5 | minor | +1 test synthetic không-ngoặc/8-hex hoặc khai scope | không |
| n8 | A6-README:5 | minor | chọn form bỏ-số hoặc ghi lý-do giữ đổi-số | không |
| n9 | A3 | minor | hoàn-thiện enum read-only (+2 vai H24) hoặc degrade | không |
*(Blocking "CÓ" = nên fold vào spec TRƯỚC khi phát lệnh worker — tất cả đều là sửa-spec ≤1 câu, không phải redesign. n1-n9 fold lúc implement được.)*
## Đã-thử-phá mà ĐỨNG (positive validation — để không chỉ toàn gạch)
- TRIPLE-17 + cấm-xoá-README: chống đúng catastrophic-Goodhart #48 (adap-report 2026-07-14 :48) ✓
- FI 2-chiều trên cây tạm -RepoRoot: đúng feedback_faultinjection (FLAG đúng ca lỗi + IM-có-vết đúng ca squash) — detector script đã có hạ-tầng -RepoRoot + bài-học slug :398-409 ✓
- Mirror C1 tái-dùng (0 cơ-chế mới): freeze-set canonical §L.b(c) đã phủ đủ mọi bề-mặt instrument đọc (agent-memory/** ⊇ memory-budget.json; counter; agents/*.md) ✓
- ③12 nấc executed-file/verified-pending-restart: đúng thang G-011 + registry-probe BƯỚC 0.6b có sẵn ✓
- KHÔNG cadence-key cho trio = FAITHFUL hub câu-3 "không counter đến-hạn nữa" (đây không phải lỗi — lỗi là thiếu vết-skip, M4) ✓
- "0 site sống precedence" + "K1 gitignore PASS" + nguồn port stamp_verify.py: cả 3 claim của invest-lane RE-VERIFY độc lập ĐỨNG ✓
— reviewer, S141 2026-07-20. Token-cost ước: ~120K in / ~12K out tới điểm ghi file này.

View File

@ -0,0 +1,24 @@
# sub-task-0 — LANE W-A (implementer-backend): TRIO persona + WIRING roster 14→17
**Vai:** implementer-backend (có Write/Edit → ghi trực-tiếp file này)
**Lane:** W-A — 3 persona harness-{eval,refine,audit} + seed 3 MEMORY.md + wire roster 14→17 (hmw.js · session-start · session-end · README · fable-clone · fable-real · harness-11-engine · vocab-alias-map · workflows/README · memory-budget.json)
**Khuôn:** cookie-cutter `.claude/agents/lead-view-auditor.md` (frontmatter shape + văn-phong description dài 'PHẢI dùng khi')
**Baseline đo:** 14 agent .md (grep -v README) hiện tại → +3 = 17. measure-agent-memory.ps1 auto-discover dir mới có MEMORY.md.
## Tiến-độ (ghi-đĩa-trong-lúc-làm, anti-#53)
> 🔴 **RECONCILED @S142 `/tiep` — ground-truth-từ-ĐĨA thắng diary.** Lane chết giữa chừng lúc 18:31 20-07 TRƯỚC khi tick được ô nào; 3 mục A1/A2/A3 thực-tế ĐÃ LAND trên đĩa. Diary dưới đây do **lead** reconcile, KHÔNG phải worker tự tick. Bài: WRITE-lane chết ≠ mất code (`feedback_agent_return_garble_recover`).
- [x] A1 — 3 persona ĐÃ LAND: `harness-audit.md` 5135B · `harness-eval.md` 6261B · `harness-refine.md` 6012B (untracked, mtime 18:29-18:31)
- [x] A2 — seed 3 MEMORY.md ĐÃ LAND non-empty: eval 1547B · refine 1616B · audit 1513B (đã auto-commit qua hook vì nằm trong `agent-memory/`)
- [x] A3 — hmw.js ĐÃ LAND (dirty, `git diff` +6/3): VALID_ROLES `:36` +3 role + comment 2 dòng trục · `:41` 14/14→17/17 · `:58` (14/14)→(17/17) · writeGuard `:190` enum read-only +7 tên (4 drift cũ + 3 trio) = trọn [n9]
- [ ] A4 — session-start.md §2.1.8(b) 3-điều-kiện + §2.1.9 mới + [M3] `:97` BỎ-số
- [ ] A5 — session-end.md §L.b (a)→(k) + (k) mục mới + [M3] `:142` BỎ-số + annex phép-8 `da349fc`
- [ ] A6 — sweep roster còn SỐNG: fable-clone(3) · fable-real(2) · harness-11-engine(1) · vocab-alias-map · workflows/README:64 · agents/README:222
- [ ] A7 — memory-budget.json +3 row measured (số THẬT từ `measure-agent-memory.ps1`) — grep hiện = 0 occurrence
- [ ] TỰ-VERIFY AC1-AC5, AC13
## Log chi-tiết
### Vòng-1 (S141, chết giữa chừng)
A1+A2+A3 land trên đĩa, worker chưa kịp ghi log-chi-tiết lẫn tick ô. Bằng-chứng = ĐĨA (ls + git diff), không phải return.
### Vòng-2 (S142) — xem `sub-wa-0.md`

View File

@ -0,0 +1,42 @@
# sub-task-1 — LANE W-B (CONTRACT v2 + H24-5 + STAMP + CARVE-OUT + DRAFT-FIX)
> Role: implementer (Write/Edit). Run: 2026-07-20-S141-adap-dot-9-10-bo-ba-sub. Self-writes directly (anti-#53, ghi-dia-trong-luc-lam).
## FILE-SET (chi cac file nay)
- `.claude/governance/.session-counter.json` (B1)
- `scripts/governance-detectors.ps1` (B2)
- `docs/governance/error-ledger.md` (B4)
- `.claude/commands/check-email.md` (B5 i)
- `.claude/commands/send-email.md` (B5 ii)
- `scripts/stamp_verify.py` (B5 iii — MOI port)
- `docs/governance/session-model-se-draft.md` (B6)
- cay tam $env:TEMP (B3 fault-inject, cleanup cuoi)
## PLAN / STATUS
> 🔴 **RECONCILED @S142 `/tiep` — ground-truth-tu-DIA.** Lane chet luc ~18:31 20-07. B1 da commit that (`a458102 wal: pause`); B5(iii) port da land (untracked). Cac o con lai do lead xac minh bang grep tren dia, KHONG tin diary.
- [x] B1 — .session-counter.json: contract v2 + _tick_invariant_note — PASS, **DA COMMIT** `a458102`; grep "SQUASH-BENIGN":7 + "transient":12 OK; ConvertFrom-Json/json.load exit 0
- [ ] B2 — governance-detectors.ps1: H24-5 counter-ancestor-classify (INFORM-only) — grep "H24-5|counter-ancestor" = **0 hit, CHUA LAM**
- [ ] B3 — Fault-inject 3 ca (CA-1 squash-benign · CA-2a object-missing · CA-2b counter-regress) — phu thuoc B2
- [ ] B4 — error-ledger.md: Carve-out o3 note-block — grep "carve-out" = **0 hit, CHUA LAM**
- [x] B5(iii) — PORT `scripts/stamp_verify.py` 2378B ĐÃ LAND (untracked, mtime 18:31), header-note "mirror-of AI_INFRA ... ported S141" co
- [ ] B5(i) — check-email.md 4(b) KHOAN-DUNG: file **CHUA sua** (van tro `AI_INFRA\scripts\stamp_verify.py` hub-path, chua co regex khoan-dung `"?...{8,64}"?`)
- [ ] B5(ii) — send-email.md 6c align + prefer script — **CHUA sua**
- [ ] B5 — verify 3-dang (quoted that + synthetic khong-ngoac + rut-gon 8-hex)
- [ ] B6 — session-model-se-draft.md: flip §4 (a)(b) + dong cuoi — file mtime **18-07 (nguyen ban S140), CHUA sua**
## Detector baseline (measure before/after B2 for AC7)
- TBD
---
## Work log (append per file)
### B1 — .session-counter.json — PASS
- Edit1: replaced `_contract.fail_loud_on_regress` value with contract-v2 "Two triggers, two verdicts" EN string (58e28bae C-1). Now .session-counter.json:7.
- Edit2: inserted top-level key `_tick_invariant_note` (dede7ec5 Delta-1 verbatim) right after `_contract` block, before `_seed_honesty`. Now .session-counter.json:12.
- Verify: `ConvertFrom-Json` PARSE-OK exit0. Fields intact: counter=15, last_ticked_head=4c43d747..., light_at_counter=14, deep_at_counter=3.
- grep `SQUASH-BENIGN` = match line 7 (fail_loud value). grep `transient` = match line 12 (_tick_invariant_note "transiently +0").
- Chars literal `<`,`>`,`=>` used (valid JSON, ConvertFrom-Json accepts); no `"`/`\` in new strings so no escaping needed.

View File

@ -0,0 +1,43 @@
# implement — VÒNG-2 SYNTHESIS (verified by lead, độc lập)
**Run:** `2026-07-22-S142-adap-9-10-vong-2` · `wf_1e936b16-30c` · 2/2 lane DONE · 0 error · 0 garble · 424.755 tok · 170 tool-use · ~21 phút.
**Tiền nhiệm:** vòng-1 `wf_3e1ade40-704` chết giữa chừng → `…S141-adap-dot-9-10-bo-ba-sub/implement-vong1-synthesis.md` (partial-honest, 5/13).
## Nấc trung-thực
🔴 **executed-file / verified-pending-restart.** Toàn bộ file + wiring + budget ĐÃ land và ĐÃ verify trên đĩa. Nhưng **3 vai trio CHƯA spawn lần nào** — cần restart CLI + anh consent. **CẤM đọc file này thành "verified-runtime".**
## Verify độc lập của LEAD (không tin return của lane)
| AC | Verdict | Bằng chứng lead tự chạy |
|---|---|---|
| 1 | ✅ | 3 persona + 3 MEMORY.md non-empty |
| 2 | ✅ | TRIPLE **17 / 17 / 17** (agents · VALID_ROLES · README) |
| 3 | ✅ | `§2.1.9`=1 · `squash-benign`=2 · `FAIL-LOUD`=4 (giữ) · `(a)→(k)`=1 · `(a)→(j)`=0 · `da349fc`=1 · `L.b(k)`=1 |
| 4 | ✅ | 0 site **SỐNG**; 4 residual có lý do (mục dưới) |
| 5 | ✅ | stored `1547/1616/1513` == fresh `measure-agent-memory.ps1`**0-mismatch** |
| 6 | ✅ | `SQUASH-BENIGN`=1 · `transient`=1 · JSON parse exit 0 |
| 7 | ✅ | **lead TỰ fault-inject lại**: cây tạm sha giả → FLAG `object-missing`, trục counter IM đúng, INFORM=1, TOTAL không đổi |
| 8 | ✅ | carve-out ×5 hit trong error-ledger |
| 9 | ✅ | regex `{8,64}` ở CẢ 2 command · trỏ `scripts/stamp_verify.py` LOCAL |
| 10 | ✅ | draft `ĐÃ VỀ` ×2 + sha `101e69d6`/`58e28bae` ×2 · 0 wire |
| 11 | ✅ | detector suite **TOTAL 46 == baseline 46** (wave thêm 0 flag) · exit 0 |
| 13 | ✅ | 0 tracked-change rò ngoài file-set giao + run-folder |
## 4 residual `14/14` — GIỮ CÓ LÝ DO
1. `ACTIVE-MARKS.md:23` ×2 — bản ghi **đã ký đóng băng** (`RC-pqhuy1987-15-07`), §Q3 no-retrofit ⇒ sửa = giả-mạo.
2. `STATUS.md:227` — "14/14 verbatim unchanged-since-gist" nói về **FILE** trong sleep-recovery, **không phải roster** ⇒ sửa là sai.
3. `WAL.md:3` — chính dòng mô-tả việc sweep (**mention ⟂ use**), tự tiêu khi flush.
Các site lịch-sử khác (S122/S124/S132) **giữ nguyên số đã đo**, chỉ gắn mốc `N=14 khi đó` — KHÔNG nâng thành 17 vì phép đo đó chưa hề chạy với 17 vai.
## 3 bài học có bằng chứng (data-point mới)
1. **Lane ĐO tốt nhưng ĐẾM-VỀ-MÌNH hụt.** W-A khai "4 file còn sống ngoài quyền lane" — thật là **5**, sót `scripts/spawn-model-audit.ps1`. Lead bắt được vì chạy grep repo-wide thay vì đọc danh-sách lane đưa ⇒ `feedback_meta_count_selfcoverage_blindspot` tái-hiện. **Bài: dò TỪNG DÒNG, đừng tin con số tổng của chính người làm.**
2. **Vá failure-mode A mở ra failure-mode B.** W-B tự bắt: `[Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes())` — cách đọc chuẩn để né bug ANSI (E-010) — **KHÔNG nuốt BOM**, `U+FEFF` sống sót ⇒ `ConvertFrom-Json` chết ⇒ detector FLAG `counter-unparseable` trên file JSON **hợp lệ**. Fix = `.TrimStart([char]0xFEFF)` (code-point ⇒ .ps1 vẫn thuần ASCII, gotcha #30). **Nếu chỉ chạy happy-path và thấy "có flag = có răng" thì đã ship một dương-giả.**
3. **Citation-trap gen-2 xảy ra THẬT trong chính diff.** Addendum W-A vừa viết vào `memory-budget.json` sinh site mới `roster 14` vì nó MÔ-TẢ việc sweep. Lane tự bắt + vá bằng **use⟂mention** (`(roster tang tu 14 len 17)`). Lead cũng chạy lại phép này trên diff của MÌNH → 0 site mới. **Bài: vá 1 class ⇒ grep lại 4 pattern trên CHÍNH DIFF của mình, không chỉ trên repo trước-khi-sửa.**
## Còn lại (ngoài run này)
Closeout outward chờ anh gật: adap-report 7-disposition · email hub selftest · STAGE-2 move 7 thư + `_index` · commit §5.2 push. Trio first-run = phiên sau restart. `agents/README` skill-matrix vẫn thiếu row 2 vai H24 (drift từ S121, ngoài scope wave).

View File

@ -0,0 +1,40 @@
# RUN 2026-07-22-S142-adap-9-10-vong-2 — RELAUNCH CẮT-GỌT
**Goal:** Hoàn-tất phần CÒN LẠI của wave adap đợt-9/10 (spec v2). Vòng-1 (`2026-07-20-S141-adap-dot-9-10-bo-ba-sub`, `wf_3e1ade40-704`) **chết giữa chừng** — 5/13 hạng mục đã land; run này chỉ làm **8 hạng mục còn lại**.
**Vào bằng:** `/tiep` @S142 (tiep.md §4 relaunch-đã-cắt-gọt). Ground-truth reconcile xong TRƯỚC khi phóng.
## Liên-kết ngược (KHÔNG đọc thiếu)
- **SPEC canonical (v2, bắt buộc đọc):** `.claude/workflows/runs/2026-07-20-S141-adap-dot-9-10-bo-ba-sub/spec-adap-dot-9-10-20-07-2026.md`
- **Bản-ghi vòng-1 (cái gì ĐÃ land):** `…/implement-vong1-synthesis.md` (partial-honest)
- **Diary vòng-1 đã reconcile:** `…/sub-task-0.md` (W-A) · `…/sub-task-1.md` (W-B)
## 🔴 ĐÃ LAND VÒNG-1 — CẤM ĐỤNG LẠI
`A1` 3 persona · `A2` 3 MEMORY.md seed · `A3` hmw.js (VALID_ROLES+3, 17/17 ×2, writeGuard enum+7) · `B1` .session-counter.json contract-v2 (**đã commit `a458102`**) · `B5(iii)` scripts/stamp_verify.py
## taskList snapshot (2 lane, role-less → inherit lead Opus 4.8 MAX)
| # | label | file-set ĐỘC-LẬP (disjoint) | hạng mục |
|---|---|---|---|
| 0 | W-A-wiring | `.claude/commands/session-start.md` · `.claude/commands/session-end.md` · `.claude/agents/README.md` · `.claude/commands/fable-clone.md` · `.claude/commands/fable-real.md` · `docs/governance/harness-11-engine.md` · `docs/governance/vocab-alias-map.md` · `.claude/workflows/README.md` · `.claude/agent-memory/memory-budget.json` | A4 · A5 · A6 · A7 |
| 1 | W-B-detector-stamp | `scripts/governance-detectors.ps1` · `docs/governance/error-ledger.md` · `.claude/commands/check-email.md` · `.claude/commands/send-email.md` · `docs/governance/session-model-se-draft.md` · cây tạm `$env:TEMP` | B2 · B3 · B4 · B5(i)(ii)+verify · B6 |
🔴 **File-set 2 lane KHÔNG giao nhau** ⇒ chạy song song an-toàn (khác trio harness-* vốn buộc TUẦN TỰ).
## Ràng buộc chung
- Governance-only: **0 prod-code · 0 migration · KHÔNG đụng `src/` `fe-admin/` `fe-user/` `tests/`**.
- `memory-budget.json` do W-A sở-hữu **độc-quyền** trong run này.
- STATUS.md / HANDOFF.md = **em-main @closeout**, sub KHÔNG đụng.
## wf run-id
- **Vòng-2:** `wf_1e936b16-30c` (phóng 2026-07-22, RUN-TRACE, 2 lane role-less inherit lead Opus 4.8 MAX)
- **Vòng-1 (chết):** `wf_3e1ade40-704`
## Stages
- [ ] P2 — 2 lane chạy
- [ ] P3 — lead verify checklist ③ (14 mục) + harvest

View File

@ -0,0 +1,158 @@
# sub-task-0 — LANE W-A (wiring nghi-thức + sweep roster + budget)
**Vòng-2 CẮT-GỌT** (vòng-1 chết @S141). Có Write/Edit → **ghi TRỰC TIẾP file này** (anti-#53).
**Hạng mục:** A4 · A5 · A6 · A7 (A1/A2/A3 ĐÃ LAND vòng-1 — CẤM đụng lại).
## Tiến-độ (🔴 TICK NGAY sau MỖI file — đừng đợi cuối; vòng-1 chết giữa 2 lần tick nên mất dấu 3 việc đã xong)
- [x] A4 — `session-start.md`: (i) §2.1.8(b) 3-điều-kiện · (ii) §2.1.9 MỚI (consent-gated, TUẦN TỰ, PIN, vết-2-lớp M4) · (iii) [M3] `:97` BỎ-số **+ EXTRA `:64` "14/14 ALIVE" (site AC4 ngoài spec — sửa dạng honest-historical)**
- [x] A5 — `session-end.md`: (i) §L.b(k) MỚI + header `:52` (a)→(k) + [M3] `:142` BỎ-số · (ii) annex phép-8 tại §L.b(j)(vi) chứa `da349fc`
- [x] A6 — sweep 6 site còn SỐNG: `fable-clone.md`(3) · `fable-real.md`(2) · `harness-11-engine.md:345`(+[n6] bỏ line-range) · `vocab-alias-map.md:51` · `workflows/README.md:64` · `agents/README.md:5`+`:222`+decision-tree+skill-matrix **+ EXTRA `harness-11-engine.md:298`** — file-set MÌNH = 0 residual
- [x] A7 — `memory-budget.json` +3 row `measured` (số THẬT từ script) + `_note` addendum [n2] — **fresh-run diff = 0-mismatch**
- [x] TỰ-VERIFY AC1·AC2·AC3·AC4·AC5·AC13 — xem §"Tự-verify" cuối file
## Log chi-tiết
(append sau MỖI file — ghi cả lệnh verify đã chạy + output thật)
### A4 — `.claude/commands/session-start.md` ✅ DONE
**(i) §2.1.8(b) REWRITE 3-điều-kiện** (thay 1 câu cũ "counter thấp hơn HOẶC not-reachable → BÁO ANH"):
- ĐK1 counter LÙI → FAIL-LOUD · ĐK2 not-reachable ∧ `git cat-file -t`=commit ∧ counter-không-lùi → `squash-benign` append 1 dòng `history[]` + ĐI TIẾP KHÔNG báo anh · ĐK3 object-MISSING counter-lùi → FAIL-LOUD như cũ.
- +1 dòng ranh 2 tầng: contract runtime = RĂNG THẬT, detector chỉ INFORM (KHÔNG vào TOTAL).
🔴 **Thứ-tự chống ghost-wire (làm 2 nhịp, CÓ CHỦ ĐÍCH):** viết lần đầu **KHÔNG nêu tên detector** (lúc đó lane W-B chưa land ⇒ cite = ghost-wire claim, `feedback_h18_ghostwire`). Cuối lane, **verify ĐĨA** `grep -c 'counter-ancestor-classify\|H24-5' scripts/governance-detectors.ps1`**5** (+ đọc `:1360 :1400 :1515 :1540` xác-nhận tên id + nhãn `INFORM-only, NOT folded into TOTAL`) ⇒ MỚI Edit thêm cite đích-danh `H24-5 counter-ancestor-classify`. **Cite chỉ được viết SAU khi vật tồn tại trên đĩa**, không viết theo kế-hoạch.
**(ii) §2.1.9 MỚI** chèn ngay trước `### 2.2 Skill registry` (heading ở `:218`). 9 khoản (a)→(i): consent-gated KHÔNG auto-run · TUẦN TỰ CẤM `parallel()` · lead scribe NGAY từng con vào `runs/<run-id>/harness-{eval,refine,audit}-return.md` · PIN đích-danh fail-closed · Mirror C1 đóng-băng · post-wave `git status --short` assertion · KHAI script-arm ⟂ sub-arm · phiên-LOGIC map tạm = `S<nn>` + KHÔNG cadence-key KHÔNG tick · **[M4] vết-2-lớp** (proposal-line in CẢ khi Light + vết WAL `trio: skipped S<nn> (ly-do)`).
**(iii) [M3] `:97`** → `**10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**` (BỎ-số, giữ con-trỏ canonical STATUS §Sub-agents) + **3 bullet trio** vào topology list + 1 dòng 🔴 ranh-trục trio.
**(iv) EXTRA ngoài spec — `:64`** `Đo S122: **14/14 ALIVE…**`. SPEC A6 KHÔNG liệt-kê site này nhưng **AC4 repo-wide** đòi 0 site sống. 🔴 KHÔNG đổi thành `17/17` (= **bịa số đo chưa hề chạy** — AC12 nói trio probe = phiên SAU restart). Sửa thành `toàn-roster-khi-đó ALIVE — 14 vai, 0 error, 0 garble` + 1 câu khai "MỐC ĐO LỊCH-SỬ S122, +3 trio CHƯA probe". Giữ nguyên số 14 đã đo, chỉ bỏ dạng `N/N` (dạng này khiến người đọc hiểu = roster hôm nay).
**Verify đã chạy (output THẬT):**
```
grep -o 'squash-benign' session-start.md | wc -l -> 2
grep -o 'FAIL-LOUD' session-start.md | wc -l -> 4
grep -o 'cat-file -t' session-start.md | wc -l -> 2
grep -n '^### 2.1.9' session-start.md -> 218:### 2.1.9 Bộ-ba đồng-kiểm memory …
grep -o '14/14' session-start.md | wc -l -> 0
grep -o '4 monitor' session-start.md | wc -l -> 0
grep -o 'trio-memory' session-start.md | wc -l -> 7
grep -o 'trio: skipped' session-start.md | wc -l -> 1
```
### A5 — `.claude/commands/session-end.md` ✅ DONE
**(i) §L.b(k) MỚI** chèn sau (i) H18-D(a) → heading ở `:115`. 8 khoản (i)→(viii) **mirror §2.1.9**: consent · tuần-tự CẤM `parallel()` · scribe NGAY · PIN fail-closed · **(v) ĐỌC số instrument ĐÃ chạy ở khối (c), CẤM chạy lại** (chạy lại = đo-2-lần lệch cửa-sổ + phá đóng-băng bề-mặt-đo; ngoại-lệ = con KIỂM re-chạy ≥2 số load-bearing đúng contract) · post-wave `git status --short` · [M4] vết-2-lớp · đơn-vị nhịp + KHÔNG cadence-key/KHÔNG tick.
- Header `:52` `**(a)→(j)**``**(a)→(k)**` + thêm map `(k) = bộ-ba đồng-kiểm memory (S141)`. **GIỮ NGUYÊN ghi-chú `:53`** ("đếm từ thân" — verify còn nguyên).
- [M3] `:142` (§3.2 Sub-agent state) → `**10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**` BỎ-số, giữ con-trỏ canonical.
**(ii) Annex phép-8** 1 dòng verbatim SPEC v2 A5(ii), đặt cuối §L.b(j)**(vi)** (ngay sau câu "PASS-với-carve-out (consent)"), thụt lề khớp cấp `(vi)`. Chứa `dede7ec5` + `da349fc` + "re-đo 19:12:41+07" + "closeout trước = baseline hợp-lệ ghi n/a".
**Verify đã chạy (output THẬT):**
```
grep -o '\*\*(a)→(k)\*\*' session-end.md | wc -l -> 1
grep -o '\*\*(a)→(j)\*\*' session-end.md | wc -l -> 0 (header cũ hết)
grep -o 'da349fc' session-end.md | wc -l -> 1
grep -o 'dede7ec5' session-end.md | wc -l -> 1
grep -o '4 monitor' session-end.md | wc -l -> 0
grep -n '^- \*\*(k)' session-end.md -> 115:- **(k) 🧪🧭🧮 Bộ-ba đồng-kiểm memory @ĐÓNG-PHIÊN …
grep -n 'đếm từ thân' session-end.md -> 53 (ghi-chú GIỮ nguyên)
```
### A6 — sweep roster (BỎ vs ĐỔI, per-site) ✅ DONE
🔴 **Đếm bằng `git grep -o … | wc -l` (occurrence), KHÔNG `grep -c` (dòng)** — repo này đầy mega-line. `git grep` cũng tránh treo do node_modules (lần đầu `grep -rn` timeout 120s).
🔴 **Exclusion citation-trap** áp đúng 7 nhánh: `docs/_archive/` · `docs/changelog/sessions/` · `.claude/workflows/runs/` · `broadcasts/` · `.claude/agent-memory/` · `docs/governance/adap-reports/` · `outbox/` (+ `.claude/auto-memory/` — memory-file, ISOLATION cấm ghi).
| Site | Loại vá | Làm gì |
|---|---|---|
| `fable-clone.md:3` `:18` | **ĐỔI** (SPEC v2 A6 chỉ đích danh) | `roster 14``roster 17` |
| `fable-clone.md:19` | enum | +3 tên trio |
| `fable-clone.md:21` | **BỎ số** | `VALID_ROLES đủ roster 14``…đủ roster` (chính dòng đó nói "KHÔNG chép số ở đây" ⇒ ĐỔI-số là tái-phạm) + nối chuỗi lịch-sử `14→17 (S141, +3 trio-memory)` |
| `fable-real.md:3` `:19` | **ĐỔI** | `roster 14``roster 17` |
| `fable-real.md:20` + dòng `>` dưới | enum + lineage | +3 tên trio · `+3 @S141 = bộ-ba đồng-kiểm memory` |
| `harness-11-engine.md:345` | enum + **[n6]** | +3 tên trio · cite `hmw.js VALID_ROLES` **bỏ line-range `:22-36`** (ghi rõ "tra bằng TÊN không bằng số dòng — line-range cũ đã lệch khi enum dài thêm") · lineage `+3 trio-memory S141 (14→17)` |
| `harness-11-engine.md:298` **(EXTRA — ngoài 13 site SPEC)** | **BỎ số** | `worker-tier-pin S124 (14/14 frontmatter opus+effort:max…)``(TOÀN-ROSTER frontmatter … — số vai canonical → STATUS §Sub-agents, B1)`. Verify tiền-đề TRƯỚC khi viết "toàn-roster": `grep -l '^model: opus' .claude/agents/*.md \| grep -v README \| wc -l`**17**; `^effort: max`**17**; tổng agent → **17** ⇒ phát-biểu ĐÚNG |
| `vocab-alias-map.md:51` | **ĐỔI** (SPEC chỉ đích danh) | `14/14``17/17` (đã verify 17/17 thật ở trên, KHÔNG bịa) |
| `workflows/README.md:64` | **BỎ số → con-trỏ** | `trong 9 roster``trong roster — số vai canonical → docs/STATUS.md §Sub-agents, B1 KHÔNG chép số` |
| `agents/README.md:5` | **BỎ số [n8]** | `**10 product/quality** … + **4 monitor INFORM-only** …``**nhóm product/quality** (…) + **nhóm monitor INFORM-only** (H1 · H2 · H24×2 · **trio-memory ×3 S141**)` + 1 câu 🔴 "Liệt-kê NHÓM, KHÔNG tổng-số" trỏ canonical (đúng luật `README:3` "vá bằng BỎ số, không ĐỔI số") |
| `agents/README.md:222` | **ĐỔI + enum** | `14 folder: …``17 folder: … · **harness-eval · harness-refine · harness-audit (+S141 trio-memory)**` |
| `agents/README.md` decision-tree | **THÊM nhánh** | nhánh trio đặt TRƯỚC "Quick task < 30 min": consent-gate **TUẦN TỰ 3 spawn RIÊNG** (CẤM `parallel()`) + 2 dòng ranh-trục (vs H1/H2/H24 · vs reviewer/harvest) + 1 dòng "3 vai KHÔNG Write/Edit lead scribe NGAY" |
| `agents/README.md` skill-matrix | **THÊM 3 row** | 3 row `ref-only` (eval: đọc output 5 script · refine: đọc `harness-eval-return.md` PIN + reinject-ledger · audit: đọc run-folder PIN + re-chạy 2 số) |
| `session-start.md:64` **(EXTRA)** | **BỎ dạng `N/N`, GIỮ số đo** | xem log A4(iv) |
**Verify AC4 (output THẬT, sau vá):**
```
git grep -n -o -E "roster 14|14/14|14 folder|14 vai" -- '*.md' '*.js' | grep -v <7 exclusions + auto-memory>
-> .claude/WAL.md:3 · .claude/governance/ACTIVE-MARKS.md:23 (×2) · docs/HANDOFF.md:22,54,76 · docs/STATUS.md:227,450(×2),512,552,578
git grep -n -o -E "roster 14|14/14|14 folder|14 vai" -- <9 file file-set W-A>
-> (rỗng) = 0 residual TRONG file-set được giao ✅
git grep -o -E "9 roster" -- '*.md' '*.js'
-> chỉ còn agent-memory/investigator-codebase + runs/ (đều thuộc nhánh EXCLUDED) ✅
```
🔴 **4 file CÒN SỐNG NẰM NGOÀI file-set W-A — KHÔNG tự ý sửa** (isolation B6): `docs/STATUS.md` + `docs/HANDOFF.md` = **em-main @closeout** (SPEC A6 đã giao) · `.claude/WAL.md` = sổ lead, dòng `:3` đang MÔ-TẢ chính việc "sweep roster 1417" (citation-trap, tự-tiêu khi WAL flush) · `.claude/governance/ACTIVE-MARKS.md:23` = **con dấu ĐÓNG-BĂNG** `RC-pqhuy1987-15-07-2026-15-32-23` ghi "roster14" tại thời-điểm §Q3 **no-retrofit**, sửa = giả-mạo bản-ghi đã . AC4 chỉ ĐÓNG được sau closeout em-main; W-A báo nấc **executed-file / verified-trong-file-set**.
### A7 — `.claude/agent-memory/memory-budget.json` ✅ DONE (số THẬT, 0 bịa)
**Tiền-đề trước khi đo:** 3 seed đã tồn tại từ vòng-1 `harness-eval` 1547B · `harness-refine` 1616B · `harness-audit` 1513B (`wc -c`).
**CHẠY THẬT** `powershell.exe -ExecutionPolicy Bypass -File scripts/measure-agent-memory.ps1` script in JSON 17 agent. Số 3 row trio script in ra:
```
harness-eval : l1_hot_bytes 1547 · l2_verbatim 0 · l2_index 0 · l2_gist 0
harness-refine : l1_hot_bytes 1616 · l2_verbatim 0 · l2_index 0 · l2_gist 0
harness-audit : l1_hot_bytes 1513 · l2_verbatim 0 · l2_index 0 · l2_gist 0
```
CHÉP NGUYÊN 3 số vào `measured` (KHÔNG ước-lượng, KHÔNG làm tròn) + `rollout` = "S141 seed - first-run pending restart+consent; re-measure @drift-audit 2026-08-01".
**[n2] `measured._note` addendum** (nối sau addendum S138, giữ style pure-ASCII của khối `_note`): khai (a) +3 row đo TƯƠI sau seed, roster 1417, cùng tiền-lệ S138; (b) 3 row = **SEED-STATE** nên `l1_hot ~1.5KB` + `l2_*=0` ĐÚNG, không phải under-fill; (c) các row KHÁC vẫn snapshot S107/S138 **đã trôi tiếp** ghi thẳng số S141 đo được (cicd 22607 · inv-cb 26624 · reviewer 24024 · harvest 14899 · impl-be 19449 · impl-fe 15951 · test-spec 22140 · tooling 15884 · lead-view 4920 · lead-omission 6665) nhưng **KHÔNG vá lẻ** chờ full re-sync @drift-audit 2026-08-01 đúng rule đầu file "never hand-edit measured_bytes"; (d) khai **KHÔNG cadence-key / KHÔNG block `harness_trio`** + lý-do (nhịp bộ-ba sống nghi-thức + persona; trộn với `h24_cadence` = 2 đồng-hồ lệch).
**Verify đã chạy (output THẬT):**
```
ConvertFrom-Json -> "JSON parse OK"
measured rows (trừ _note) -> 17
harness-eval/refine/audit trong json -> 1547/0/0/0 · 1616/0/0/0 · 1513/0/0/0
$j.harness_trio present? -> False (đúng: KHÔNG thêm block)
FRESH RE-RUN script rồi diff vs json -> match=True ×3 · MISMATCH COUNT = 0 · script agents total = 17
```
🔴 **TỰ BẮT CHÍNH MÌNH — citation-trap gen-2 (`feedback_citation_trap_selfreference`):** sweep cuối lane phát-hiện **chính addendum vừa viết** sinh site MỚI `memory-budget.json:143 "roster 14"` ( **MÔ-TẢ** việc sweep). Đây đúng lớp "doc định-nghĩa anti-pattern tất-yếu chứa mẫu đó". bằng **use⟂mention**: `(roster 14->17)` `(roster tang tu 14 len 17)` **giữ NGUYÊN sự-thật chuyển-đổi**, chỉ bỏ token bị quét. Re-parse JSON sau sửa: OK, 17 row, 1547/1616/1513 nguyên vẹn. Bài học áp ngay: **sau khi vá xong phải grep 4 pattern trên CHÍNH DIFF của mình**, không chỉ trên repo trước-khi-sửa.
---
## Tự-verify (AC1 · AC2 · AC3 · AC4 · AC5 · AC13) — lệnh + output THẬT
**AC1 — 3 persona + 3 MEMORY.md non-empty** (A1/A2 vòng-1, chỉ VERIFY không sửa):
```
harness-eval persona 6261B · model:opus 1 · effort:max 1 · Write/Edit trong tools = 0 · MEMORY.md 1547B
harness-refine persona 6012B · model:opus 1 · effort:max 1 · Write/Edit trong tools = 0 · MEMORY.md 1616B
harness-audit persona 5135B · model:opus 1 · effort:max 1 · Write/Edit trong tools = 0 · MEMORY.md 1513B
```
**AC2 — TRIPLE 17/17/17** (đo 3 nguồn ĐỘC-LẬP + cross-check TÊN, không chỉ đếm):
```
(1) ls -1 .claude/agents/*.md | grep -v README | wc -l -> 17
(2) VALID_ROLES parse từ hmw.js (node, regex khối hằng-số) -> 17
(3) README enum dòng :234 tách theo '·', bỏ ngoặc/bold -> 17
diff <ls-names sorted> <README-enum sorted> -> RỖNG (0 lệch)
diff <ls-names sorted> <VALID_ROLES sorted> -> RỖNG (0 lệch)
README.md CÒN NGUYÊN (không xoá để lách đếm — bẫy catastrophic-Goodhart R2-C1) -> YES
```
**AC3 — nghi-thức mới hiện diện:**
```
grep -c '^### 2.1.9 Bộ-ba đồng-kiểm memory' session-start.md -> 1 (heading :218)
grep -o 'squash-benign' session-start.md | wc -l -> 2
grep -o 'FAIL-LOUD' session-start.md | wc -l -> 4 (GIỮ, không mất răng)
grep -c '^- \*\*(k) 🧪🧭🧮' session-end.md -> 1 (:115)
grep -o '(a)→(k)' session-end.md | wc -l -> 1 ; '(a)→(j)' còn -> 0
grep -o 'da349fc' session-end.md | wc -l -> 1 (dòng 111)
sed -n '110p;111p;112p' session-end.md → (vi) / annex / (g) -> annex NẰM ĐÚNG trong §L.b(j)(vi)
grep -o 'H24-5 `counter-ancestor-classify`' session-start.md -> 1 (cite thêm SAU khi verify đĩa)
```
**AC4 — sweep:** xem bảng A6 trên. **File-set W-A = 0 residual** (lệnh grep in ra rỗng, exit 1). **4 file CÒN SỐNG nằm NGOÀI quyền lane** (STATUS · HANDOFF = em-main @closeout · WAL = sổ lead tự-tiêu · ACTIVE-MARKS = dấu đóng-băng no-retrofit) AC4 **CHƯA đóng repo-wide**, khai thật.
**AC5 — budget 3 row:** fresh-run diff **MISMATCH COUNT = 0**; `_note` addendum S141; **KHÔNG** `harness_trio` block; **KHÔNG** cadence-key.
**AC13 — git status:** thay-đổi thuộc lane W-A đúng **9 file-set + `sub-task-0.md`** (diffstat: budget 7 · agents/README 16 · fable-clone 8 · fable-real 8 · session-end 14 · session-start 30 · workflows/README 2 · engine 4 · vocab-alias 2 · diary 109 **175+/25**). Các file dirty KHÁC **KHÔNG phải của W-A**: (a) lane W-B disjoint = `check-email.md` · `send-email.md` · `error-ledger.md` · `session-model-se-draft.md` · `governance-detectors.ps1` · `sub-task-1.md`; (b) dirty TỪ TRƯỚC khi lane chạy ( trong `git status` lúc nhận task) = `hmw.js` · `.session-counter.json` · 3 persona untracked · `stamp_verify.py` · `scheduled_tasks.lock`. 🔸 `.claude/WAL.md` + 2 diary vòng-1 biến khỏi status **Stop-hook `wal-flush` auto-commit** (`b1d92b9 wal: flush 20260722T1104`) HEAD dời giữa lane bình-thường, không phải W-A ghi.

View File

@ -0,0 +1,351 @@
# sub-task-1 — LANE W-B (detector H24-5 + fault-inject + carve-out + stamp + draft-fix)
**Vong-2 CAT-GON** (vong-1 chet @S141). Co Write/Edit → **ghi TRUC TIEP file nay** (anti-#53).
**Hang muc:** B2 · B3 · B4 · B5(i)(ii)+verify · B6 (B1 + B5(iii) DA LAND vong-1 — CAM dung lai).
## Tien-do (🔴 TICK NGAY sau MOI file — dung doi cuoi)
- [x] B2 — `governance-detectors.ps1`: detector H24-5 `counter-ancestor-classify` (read-only, `-RepoRoot`, INFORM-sink KHONG vao TOTAL) + nhanh counter-regress DEFAULT-ON [M1]
- [x] B3 — Fault-inject cay tam `$env:TEMP` 3 ca: CA-1 squash-benign 0-flag · CA-2a object-missing INFORM-flag · CA-2b counter-regress INFORM-flag (cleanup sau)
- [x] B4 — `error-ledger.md` Active-Guards: note-block carve-out o3 (2 luoi dich danh + cau trio S141)
- [x] B5(i) — `check-email.md` 4(b): regex KHOAN-DUNG + CAM quote-strict + uu tien `python scripts/stamp_verify.py`
- [x] B5(ii) — `send-email.md` 6c: align cung mau + prefer script
- [x] B5-verify — 3 dang: thu quoted that (`6239dd40`) + synthetic khong-ngoac + synthetic rut-gon 8-hex → ca 3 exit 0 → xoa synthetic
- [x] B6 — `session-model-se-draft.md` §4: flip (a)+(b) → "DA VE 2026-07-18" + 1 dong K4-form-conflict; (c) GIU cho-anh; **0 wire**
- [x] TU-VERIFY AC6·AC7·AC8·AC9·AC10·AC11·AC13
## Log chi-tiet
(append sau MOI file — ghi ca lenh verify da chay + output that)
---
### B2 — H24-5 `counter-ancestor-classify` (DONE)
**Land:** `scripts/governance-detectors.ps1:1359-1476` (section moi, chen NGAY TRUOC `Write-Section 'Summary'`) + sua dong tong `:1516` them ten H24-5 vao enum "new nets".
**Thiet ke (khop SPEC v2 §B2):**
- read-only, dung `$RepoRoot` co san (param `:38`) → `git -C $RepoRoot` ⇒ fault-inject cay tam isolate duoc (mirror H25-closeout).
- truc-1 reachability: `git merge-base --is-ancestor <last_ticked_head> HEAD` exit-0 → `OK-reachable` (0 flag) · else `git cat-file -t` = `commit``SQUASH-BENIGN (trace)` **Write-Host, 0 flag** · else → `Write-InformFlag object-missing`.
- truc-2 [M1] counter-regress DEFAULT-ON, DOC-LAP truc-1: `counter < last_audit.light_at_counter` HOAC `< deep_at_counter``Write-InformFlag counter-regress`. Doc CA 2 khoa (khong dung 1).
- [M2] MOI flag di qua `Write-InformFlag` (`:74-82` co san) → dong `[DETECTOR] LOW` rieng + cong vao `$script:InformCount`, **KHONG** vao `$script:FlagCount` (=TOTAL).
- skip co LY-DO + `$h245Measured`: khi skip thi dong tong in them `-- MEASURED NOTHING ...; a 0 after a skip is not a green` (chong doc 0 = xanh).
**🔴 BUG TU-BAT trong lan chay dau (khong phai happy-path):** lan 1 detector FLAG `counter-unparseable` tren file JSON **HOAN TOAN HOP LE**.
Root-cause do bang lenh, khong doan:
```
first4bytes=EF BB BF 7B <- UTF-8 BOM
first char codepoint=65279 <- U+FEFF con nguyen trong string
raw parse=FAIL: Invalid JSON primitive: .
BOM-trimmed parse=OK
```
`[Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes())` **KHONG nuot BOM** (khac `Get-Content` / StreamReader detectEncodingFromByteOrderMarks). Tuc la: cach doc "an-toan-encoding" bat buoc dung de tranh bug E-010 (ANSI mis-decode) lai **mo ra failure-mode THU HAI**. Fix = doc bytes UTF-8 **VA** `.TrimStart([char]0xFEFF)` (viet bang code-point → .ps1 van thuan ASCII, gotcha #30). Comment `:1420-1428` ghi nguyen van bai hoc nay.
Neu chi chay happy-path va nhin "co flag = detector co rang" thi da ship 1 duong-gia.
**Verify (lenh + output THAT):**
```
# ASCII-purity + parse (gotcha #30)
file bytes=84812 ; non-ASCII bytes=0
parse errors=0
# chay lai toan suite tren repo THAT
exit=0
===== H24-5 - counter-ancestor-classify (INFORM-only) =====
[OK] OK-reachable: last_ticked_head 96ab2679 (session S142) is an ancestor of HEAD
[ok] counter=16 >= last_audit.light_at_counter=14
[ok] counter=16 >= last_audit.deep_at_counter=3
H24-5 counter-ancestor flags = 0 [INFORM-only, LOW, NOT folded into TOTAL baseline]
TOTAL FLAGS: 46
INFORM-ONLY (new nets C6 cite-2-tier + H24-4 pending-flip + H24-5 counter-ancestor-classify): 0
```
**TOTAL khong doi (anti-Goodhart, kiem 2 lop):** baseline TRUOC khi sua = `TOTAL FLAGS: 46`; sau khi sua = `46`. Khong chi so tong — so-sanh TUNG DONG:
```
baseline DETECTOR lines=46 ; after DETECTOR lines=46
DIFF: none - flag-line sets are IDENTICAL byte-for-byte (Compare-Object)
```
⇒ 0 flag MOI, 0 flag MAT. So doc file (`counter=16`, `S142`, head `96ab2679`), khong hardcode.
---
### B3 — Fault-inject 3 ca (DONE, 3/3 PASS)
Cay tam `$env:TEMP\h245-fi-{ca1,ca2a,ca2b}`, moi ca = 1 repo git THAT (`git init` + commit that), chay detector bang `-RepoRoot <cay tam>`.
🔴 MOI ca deu **kiem-chung TIEN-DE bang git TRUOC** khi chay detector — neu tien-de sai thi ket qua detector vo nghia.
#### CA-1 — squash-benign (KY VONG: trace, **0 flag**)
Dung ke-hoach: `base commit(A)``wal: flush(B)` → tick json tro vao B → `git reset --soft A` + `git commit "[CLAUDE] Docs: S142 closeout"` (=C) ⇒ B thanh dangling.
```
A=50217bb3619bc5bfeae41144befaef7f04472f09
B(wal, se bi squash)=8a369c4720a32cdade625febc81f72cac30953bc
C(closeout squash)=069dee539e7c23550b5d21cbc28ec3fd8eb41503
--- kiem chung tien-de cua ca-1 ---
is-ancestor(B)=1 NOT-reachable (dung tien-de)
cat-file -t B = commit
```
Detector:
```
[trace] SQUASH-BENIGN: last_ticked_head 8a369c47 (session S142) is NOT reachable from HEAD but the object EXISTS (cat-file -t = commit) - expected closeout-squash drift, 0 flag (contract v2)
[ok] counter=16 >= last_audit.light_at_counter=14
[ok] counter=16 >= last_audit.deep_at_counter=3
H24-5 counter-ancestor flags = 0
```
**PASS** — dung `SQUASH-BENIGN`, 0 flag.
#### CA-2a — object-missing (KY VONG: **INFORM-flag**)
`last_ticked_head = 000...0` (40 hex), counter=16 KHONG lui ⇒ chi truc-1 duoc phep flag.
```
--- tien-de ---
is-ancestor exit=128
cat-file exit=128 (object MISSING - dung tien-de)
```
Detector:
```
[DETECTOR] LOW | .claude/governance/.session-counter.json | object-missing: last_ticked_head 000...0 (session S142) is neither reachable from HEAD nor present as an object (cat-file -t failed) - NOT the benign squash class
[ok] counter=16 >= last_audit.light_at_counter=14
[ok] counter=16 >= last_audit.deep_at_counter=3
H24-5 counter-ancestor flags = 1
```
**PASS** — dung 1 flag, dung LOAI (`object-missing`), truc-2 im dung.
#### CA-2b — counter-regress (KY VONG: **INFORM-flag**)
`counter=5`, `light_at_counter=14`, `deep_at_counter=3`, head = HEAD that (reachable).
```
--- tien-de ---
is-ancestor=0 REACHABLE (dung tien-de) <- truc-1 PHAI im
```
Detector:
```
[OK] OK-reachable: last_ticked_head ef8ceda1 (session S142) is an ancestor of HEAD
[DETECTOR] LOW | ... | counter-regress: counter=5 sits BELOW last_audit.light_at_counter=14 - an audit already ran at a HIGHER counter, so this file was rolled back or hand-edited
[ok] counter=5 >= last_audit.deep_at_counter=3
H24-5 counter-ancestor flags = 1
```
**PASS** — dung 1 flag `counter-regress`. Bonus 2-chieu TRONG cung 1 ca: nhanh `light` (5<14) **KEU**, nhanh `deep` (5>=3) **IM**, truc-1 **IM** ⇒ khong phai "flag bua", no phan-biet dung tung khoa.
#### 2 CHIEU (bay #3) — chung ca FLAG-dung-khi-loi VA IM-dung-khi-khong-loi
| Tinh huong | Ky vong | Thuc te | Verdict |
|---|---|---|---|
| repo THAT, head reachable, counter 16>=14/3 | IM (0 flag) | 0 flag, `[OK] OK-reachable` | PASS (chieu IM) |
| CA-1 dangling-but-exists | IM (0 flag, co trace) | 0 flag + trace SQUASH-BENIGN | PASS (chieu IM, ca kho) |
| CA-2a object bien mat | KEU | 1 flag `object-missing` | PASS (chieu KEU) |
| CA-2b counter lui | KEU | 1 flag `counter-regress` | PASS (chieu KEU) |
| CA-2b nhanh `deep` (5>=3) | IM | im | PASS (chieu IM, cung ca) |
#### [M2] chung INFORM **KHONG** vao TOTAL — do bang so, khong bang loi hua
Ca 3 cay tam co cung cau-truc file ⇒ TOTAL cua cac detector khac la HANG SO:
```
CA-1 (H24-5 flags=0) -> TOTAL FLAGS: 2 ; INFORM-ONLY: 0
CA-2a (H24-5 flags=1) -> TOTAL FLAGS: 2 ; INFORM-ONLY: 1
CA-2b (H24-5 flags=1) -> TOTAL FLAGS: 2 ; INFORM-ONLY: 1
```
H24-5 di tu 0→1 flag ma **TOTAL dung yen o 2**, chi INFORM-ONLY nhuc nhich ⇒ sink tach that su, khong phai chi ghi trong comment.
#### Ghi chu them (khong phai ky vong, nhung do duoc)
JSON trong cay tam viet **no-BOM**, repo that **co BOM** ⇒ ca 2 duong doc deu parse OK sau fix `TrimStart([char]0xFEFF)` — phu ca 2 dang encoding, khong chi dang minh vua vap.
#### Cleanup
```
removed: h245-fi-ca1 / h245-fi-ca2a / h245-fi-ca2b
0 cay tam h245-fi-* con lai
```
---
### B4 — carve-out o3 note-block (DONE)
**Land:** `docs/governance/error-ledger.md:44-64` — note-block `> ### 🪤 Carve-out ô3 — điều-kiện SỐNG`, chen NGAY TRUOC bang Active-Guards (sau note K6.2), dung dang blockquote khop 2 note co san `:41-42`.
**Noi dung (khong doan — keo tu basis THAT):** doc `broadcasts/inbox/2026-07-17-ai_infra-to-se-reply-adap-wave-carveout-dp2.md` (`content_sha256: 9a35405b...` xac nhan o `:10`), khoi-2 nam `:25-36`. 2 luoi lay NGUYEN VAN hub `:31-32`:
```
- (a) dòng-nợ chỉ-đọc vẫn in công-khai ở mọi điểm dừng, và
- (b) cái dò "closeout-thiếu-nghi-thức" vẫn được nối.
```
→ dich sang ten-file DICH DANH cua SE: (a) `scripts/nhip-no-probe.ps1` · (b) section `H25-closeout-ritual (GAP-2)` trong `scripts/governance-detectors.ps1`.
Luat 1-luoi-chet lay tu hub `:34`: *"Một trong hai tắt → carve-out mất lớp tự-minh-bạch → phải đánh-giá-lại nấc (khi đó nên tụt về chạy vô-điều-kiện cho tới khi lưới sống lại)"*. Live-evidence S139→S140 lay tu hub `:36` (light 8/6 → gat → chay → cờ THAT → 0/6).
**Them (SPEC yeu cau 1 cau, em viet 1 doan cho du nghia):** trio-consent S141 = CUNG CLASS carve-out, chiu CHUNG luat; luoi cua no = proposal-line in CA khi Light + vet-skip WAL `trio: skipped S<nn>`.
**Kiem 2 luoi CON SONG tai S142 (khong khai suong — cham dia):**
```
-rw-r--r-- 1 pqhuy 197609 7253 Jul 17 17:02 scripts/nhip-no-probe.ps1 <- (a) song
948:Write-Section 'H25-closeout-ritual (GAP-2)' <- (b) wired
```
+ section H25 co chay ra output that trong moi lan chay suite o tren. ⇒ nac `PASS-với-carve-out` dung vung, CHUA phai re-eval. (Neu 1 trong 2 chet thi note nay tu no la lenh tut ve chay-vo-dieu-kien.)
**Verify khong sinh flag moi** (error-ledger.md NAM TRONG scope C6 cite-2-tier ⇒ phai kiem, khong duoc doan):
```
TOTAL FLAGS: 46 (baseline 46, KHONG DOI)
INFORM-ONLY: 0 (C6 khong bat cite nao trong note moi — moi path deu trong backtick = mention)
```
Compare-Object flag-lines vs baseline ra **DUNG 1 delta, KHONG PHAI cua em**:
```
=> .claude/commands/session-end.md:148 | derived-stale: writes 2 test but canonical=528
<= .claude/commands/session-end.md:138 | derived-stale: writes 2 test but canonical=528
```
= 1 flag CU (pre-existing) bi **doi so dong 138→148** do **Lane W-A dang sua `session-end.md` song song** (file-set cua ho, khong phai cua em). Noi dung flag y het, khong phai flag moi. 🔴 Khai ro de nguoi doc sau khong quy nham cho lane W-B.
---
### B5(i)(ii) — stamp-decode dau-doc KHOAN-DUNG (DONE)
**B5(i) `.claude/commands/check-email.md` buoc 4:** tach 4(b) thanh sub-block `**4(b) — đầu-đọc stamp KHOAN-DUNG (adopt S141, ghim S142)**` gom 5 bullet:
1. UU TIEN chay `python scripts/stamp_verify.py <file>`**ban port LOCAL**, khong tro `AI_INFRA/scripts/...` nua (hub-path chi con la nguon **re-pull** khi §N canon doi). Ghi ro exit 0 = OK / exit 1 = MISMATCH + script tach duoc `WRONG-METHOD` khoi `MISMATCH`.
2. PIN mau khoan-dung `content_sha256:\s*"?([0-9a-fA-F]{8,64})"?` + liet ke 3 dang (co-ngoac · khong-ngoac · rut-gon ≥8-hex so bang **tien-to**).
3. 🔴 CAM quote-strict `content_sha256:\s*([0-9a-fA-F]+)` + ly-do (whiff dau `"` → rut rong → doc thanh khong-khop → **false-tamper**) + ca that S141 suyt oan 3/3. Them 1 cau chong hieu-nham: *mau chat hon KHONG an-toan hon — no chi doi loi "bo sot" thanh loi "vu oan"*.
4. Body canonical giu NGUYEN (`ReadAllBytes`+UTF8, strip \r, split-3, strip-1-newline) + giu nguyen CAM `Get-Content -Raw` (S125).
5. Nhanh ✗ → nghi VERIFIER TRUOC, doi lenh doi-chung sang script LOCAL.
**B5(ii) `.claude/commands/send-email.md`:**
- **buoc 4**: `khớp \`stamp_verify.py\` hub` → `khớp \`scripts/stamp_verify.py\` **bản port LOCAL** — KHÔNG trỏ hub-path nữa`.
- **6c**: them 2 bullet — (a) uu tien `python scripts/stamp_verify.py broadcasts/outbox/<to>/<id>.md`, exit 0 = PASS, exit 1 doc verdict (`WRONG-METHOD` re-stamp ≠ `MISMATCH` nghi sua-sau-stamp — **2 lop loi khac cach xu, dung gop**); (b) CUNG mau khoan-dung nhu `/check-email` 4(b) + CAM quote-strict, kem ly-do doi-xung: dau gui whiff thi **ABORT oan chinh thu minh vua ghi dung**; *"dau-doc gui va dau-doc nhan PHAI cung mot mau, lech mau = hai ben cai nhau ve mot file lanh"*.
### B5-verify — 3 dang, ca 3 EXIT 0 (DONE)
Chay `python scripts/stamp_verify.py` (Python 3.11.3 co san — khong phai lay regex-pin lam chinh).
| # | Dang | File | declared | verdict | exit |
|---|---|---|---|---|---|
| 1 | **co-ngoac (THAT)** | `broadcasts/inbox/2026-07-17-Governance-chuan-hoa-stamp-decode.md:11` | `6239dd40...c72d19` (64 hex trong `"`) | `OK (canonical match)` | **0** |
| 2 | **khong-ngoac** (synthetic) | `$TEMP/synth-unquoted.md` | `9c8f557c...a20037` (64 hex tran) | `OK (canonical match)` | **0** |
| 3 | **rut-gon 8-hex** (synthetic) | `$TEMP/synth-short8.md` | `9c8f557c` | `OK (canonical match)` | **0** |
Output that (ca 3):
```
== 2026-07-17-Governance-chuan-hoa-stamp-decode.md
declared : 6239dd4037925d24feb5baa648aa586fecc6d104a54a66608fa7c6ed86c72d19
canonical: 6239dd4037925d24feb5baa648aa586fecc6d104a54a66608fa7c6ed86c72d19
verdict : OK (canonical match) EXIT=0
== synth-unquoted.md
declared : 9c8f557c4800d3db62c15b85b12b159f586827fa4308eca377fd0bf234a20037
canonical: 9c8f557c4800d3db62c15b85b12b159f586827fa4308eca377fd0bf234a20037
verdict : OK (canonical match) EXIT=0
== synth-short8.md
declared : 9c8f557c
canonical: 9c8f557c4800d3db62c15b85b12b159f586827fa4308eca377fd0bf234a20037
verdict : OK (canonical match) EXIT=0
```
**🔴 THEM (khong co trong SPEC nhung phai co): CHUNG mau CAM that su whiff — 2 chieu, khong noi suong.**
Em vua PIN vao 2 command cau *"quote-strict gay false-tamper"*. Neu chi khai ma khong do thi no la niem tin, khong phai bang chung. Do that:
```
dang KHOAN-DUNG (pin) quote-strict (CAM)
----------------------------------------------------------------------
QUOTED (that) 6239dd403792... *** WHIFF (None) ***
KHONG-NGOAC (synth) 9c8f557c4800... 9c8f557c4800...
RUT-GON 8hex (synth) 9c8f557c... 9c8f557c...
```
⇒ quote-strict **whiff DUNG o dang co-ngoac** — tuc dang cua thu THAT tu hub — trong khi 2 dang kia no van chay ngon. Day chinh la ly do no nguy hiem: **no khong hong deu, no chi hong dung cho thuc-te dang dung** ⇒ nhin qua tuong on. Mau khoan-dung bat 3/3.
**Cleanup:** `removed: synth-unquoted.md / synth-short8.md` + `0 file synthetic con lai`. 2 file synthetic dat o `$TEMP` (KHONG dat trong repo) ⇒ 0 rui ro ban git-status.
---
### B6 — draft §4 prereq flip (DONE, **0 WIRE**)
**Land:** `docs/governance/session-model-se-draft.md:45-56` (§4) — doi 1 doan van gach-ngang thanh **3 bullet (a)(b)(c) + 1 khoi 3 khoan cho-anh**. 🔴 **KHONG dong nao ra ngoai draft** — 0 file cau-hinh, 0 hook, 0 command, 0 wire.
**[M7] (a) FLIP ✅:** "hub phát mẫu áp dụng" → **DA VE (dot 2026-07-18)** `101e69d6` kit+manifest + caveat: **Q4 van-nguong CHUA tra loi** va **hub co-y bo counter**.
**[M7] (b) FLIP ✅:** "khuôn bộ-ba SUB" → **DA VE 2026-07-18** `58e28bae` khoi B → SE adopt trio @S141.
**(c) GIU nguyen:** "anh duyệt bảng VC-1/2/3" = **DIEU-KIEN CUOI**, them 1 cau *"gio la dieu-kien duy nhat con dung chan"*.
**Them khoi 3 khoan CHO-ANH-DUYET-CUNG-BANG-VC** (SPEC yeu cau 1 dong, em tach 3 y cho soi duoc tung cai):
1. **K4 form-conflict** — hub `.claude/sessions/session-<N>/` (thu-muc-per-phien) vs draft VC-3 `.claude/logic-sessions/L<mm>.md` (mot-tep-per-phien): khac CA ten LAN hinh.
2. **`session_ctx_kb`** — manifest ghi `64` (KB, nhan 1024); SE chua co khoa, **chua do** ⇒ muon so hub ma chua do = dung thu K6.2 cam.
3. **meld-forward-gap (hook 3→4 path)** — hub dua vao meld-forward de lich-su phien khong rot luc squash, nhung hook SE quet DUNG 3 path ⇒ thu-muc phien la path **thu 4** hien KHONG duoc quet.
**🔴 KHONG doan — moi khang dinh deu cham dia 1 lenh (bai hoc S121/S130):**
| Khang dinh viet vao draft | Lenh | Ket qua THAT |
|---|---|---|
| thu `101e69d6` co that | `grep -rln` broadcasts/ | `inbox/2026-07-17-Governance-session-model-phien-logic-manifest.md`, `content_sha256: "101e69d6..."` |
| thu `58e28bae` co that | `grep -rln` broadcasts/ | `inbox/2026-07-18-ai_infra-to-se-reply-tong-bo-ba-harness-sub-4-khoan.md` |
| Q4 van-nguong CHUA tra loi | grep `ngưỡng\|nguong` trong thu 101e69d6 | **0 hit** |
| hub co-y bo counter | grep `counter\|đếm` trong thu 101e69d6 | **0 hit** |
| hub dung `sessions/session-<N>` | grep | `:25` *"Một thư mục quy-ước chung cho mỗi phiên-LOGIC: `.claude/sessions/session-<N>/`"* |
| `session_ctx_kb: 64` | grep | `:73 session_ctx_kb: 64 # đơn vị KB (đọc code nhân 1024)` |
| meld-forward ton tai | grep | `:42` *"Meld-forward khi gộp sổ — các commit mang thư-mục phiên được nhập-tiến về trước khi squash"* |
| hook quet DUNG 3 path | grep `.claude/hooks/wal-flush.ps1` | `:13 $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/")` |
**⚠️ 1 diem em KHONG viet y nguyen SPEC — khai thang:** SPEC ghi *(a) "DA VE 2026-07-18"*, nhung thu `101e69d6` **tu de ngay 2026-07-17** (ten file cung 07-17); 07-18 la **dot pull**, con **ve repo** thi ca 2 thu deu o commit `a458102` **2026-07-20** (`git log --diff-filter=A`). Em giu y SPEC nhung viet *"DA VE (dot 2026-07-18) ... thu de ngay 2026-07-17, pull trong dot 07-18"* de khong ai doc nham ngay. Thu `58e28bae` de ngay 07-18 dung y SPEC, giu nguyen.
---
## TU-VERIFY — tung AC kem lenh + output THAT
### AC6 — contract v2 + `_tick_invariant_note` (B1 vong-1; em **CHI DOC**, KHONG sua)
```
ConvertFrom-Json = OK (exit 0)
chua 'SQUASH-BENIGN' : True
chua 'transient' : True
co khoa _tick_invariant_note : True
```
🔴 Doc bang `[IO.File]::ReadAllBytes` + UTF8 + `TrimStart([char]0xFEFF)` (file NAY co BOM — xem B2).
### AC7 — H24-5 (4 phan, PASS het)
| Phan | Ky vong | Do duoc |
|---|---|---|
| repo THAT | `OK-reachable`, 0 flag | `[OK] OK-reachable ... 96ab2679 (session S142)` + `counter=16 >= 14` + `>= 3`**0 flag** |
| FI 3 ca | 3/3 PASS | CA-1 SQUASH-BENIGN 0-flag · CA-2a object-missing 1-flag · CA-2b counter-regress 1-flag |
| dong INFORM-ONLY rieng | co | `H24-5 counter-ancestor flags = N [INFORM-only, LOW, NOT folded into TOTAL baseline]` + ten H24-5 vao dong tong cuoi |
| TOTAL khong doi | 46 = 46 | `baseline=46 final=46` + Compare-Object 0 delta noi-dung |
### AC8 — carve-out note (error-ledger)
```
'Carve-out' : True
'nhip-no-probe.ps1' : True <- luoi (a) dich danh
'H25-closeout-ritual' : True <- luoi (b) dich danh
'9a35405b' : True <- basis khoi-2
'RE-EVAL' : True <- luat 1-luoi-chet
'trio-consent' : True <- cau trio S141
'trio: skipped' : True <- vet-skip WAL
```
### AC9 — stamp
`stamp_verify.py` exit **0** tren ca 3 dang (quoted THAT `6239dd40` · synthetic khong-ngoac · synthetic 8-hex). Mau khoan-dung pin trong CA 2 command (`check-email.md` 4(b) + `send-email.md` 6c/buoc 4). Bang do 2-regex chung quote-strict whiff dung dang co-ngoac.
### AC10 — draft prereq + **0 WIRE**
```
'101e69d6' True · '58e28bae' True · 'session_ctx_kb' True · 'meld-forward-gap' True · 'K4 form-conflict' True
so lan 'ĐÃ VỀ' = 2 <- dung (a) va (b)
(c) con 'CHỜ ANH' : True
```
Chung 0-wire (khong chi noi suong):
```
.claude/hooks/wal-flush.ps1 -> KHONG DOI (boi lane W-B)
.claude/sessions/ CHUA tao
.claude/logic-sessions/ CHUA tao
```
### AC11 — suite exit 0 + giai thich TUNG flag moi
`suite exit=0`. **0 flag MOI.** Compare-Object baseline↔final ra dung 1 delta va **KHONG phai cua lane W-B**:
```
=> .claude/commands/session-end.md:148 | derived-stale: writes 2 test but canonical=528
<= .claude/commands/session-end.md:138 | derived-stale: writes 2 test but canonical=528
```
= 1 flag CU doi so dong (138→148) do **Lane W-A** sua `session-end.md` song song. Noi dung y het ⇒ khong phai flag moi, khong phai flag mat.
🔴 **Anti-Goodhart:** em KHONG "vá" bang cach lam flag bien mat. TOTAL giu **nguyen 46** ca truoc lan sau; thu duy nhat nhuc nhich la INFORM-ONLY (0 tren repo that, 1 khi co loi that trong cay tam). Khong co chung-nhan nao bi mat.
### AC13 — isolation git-status
6 file lane W-B doi (dung file-set duoc phep, khong hon):
```
M scripts/governance-detectors.ps1
M docs/governance/error-ledger.md
M .claude/commands/check-email.md
M .claude/commands/send-email.md
M docs/governance/session-model-se-draft.md
M .claude/workflows/runs/2026-07-22-S142-adap-9-10-vong-2/sub-task-1.md
```
Cac file khac trong `git status` (`agents/*`, `hmw.js`, `session-start/end.md`, `agents/README.md`, `workflows/README.md`, `harness-11-engine.md`, `vocab-alias-map.md`, `memory-budget.json`, `fable-*.md`, 3 persona `??`) = **Lane W-A**, em khong cham.
**🔴 2 canh-bao tu guard-check cua chinh em — DA TRUY, CA HAI KHONG PHAI EM:**
1. `.claude/governance/.session-counter.json` hien ` M``git diff` cho thay **dung 4 dong = 4 truong tick**:
`counter 15→16 · S141→S142 · 4c43d747→96ab2679 · 2026-07-20→2026-07-22`**tick cua /session-start phien nay** (chinh de-bai da bao truoc), KHONG phai em sua. `1 file changed, 4 insertions(+), 4 deletions(-)` — khong co dong nao khac.
2. `scripts/stamp_verify.py` hien `??` → mtime **2026-07-20 18:31:49** (= vong-1, TRUOC phien nay 2 ngay) va da nam trong git-status snapshot luc phien bat dau ⇒ pre-existing. Em chi `Read`, khong ghi.
⚠️ **PHAT HIEN PHU cho em-main @closeout:** file nay **da LAND nhung CHUA duoc commit** (`??` chu khong phai tracked). SPEC ghi B5(iii) "DA LAND vong-1" — dung ve DIA, nhung neu closeout khong `git add scripts/stamp_verify.py` thi **ban port mat**, va CA 2 command em vua sua deu tro vao no ⇒ 2 command se tro vao file khong ton tai tren remote. **Can add o commit toi.**
### Cleanup tong
```
0 cay tam h245-fi-* con lai
0 file synthetic con lai
0 file tam con lai trong $TEMP
```
(script phu `mk_synth.py` trong scratchpad cung da xoa.)