From ca6f0b7414ba931dbc94772e090d15cf3777f9aa Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Fri, 17 Jul 2026 16:17:18 +0700 Subject: [PATCH] wal: flush 20260717T1617 --- .claude/WAL.md | 6 +- .../investigator-codebase/MEMORY.md | 3 +- .../run.md | 6 +- .../spec-adap-khung-nhip-17-07-2026.md | 89 ++++++ .../sub-investigator-codebase-0.md | 254 +++++++++++++++++- 5 files changed, 350 insertions(+), 8 deletions(-) create mode 100644 .claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/spec-adap-khung-nhip-17-07-2026.md diff --git a/.claude/WAL.md b/.claude/WAL.md index 8e93a9c..30ef29c 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -5,9 +5,9 @@ goal: Adap wave 7-item AI_INFRA 17-07 (2 reply hub + khung-nhịp-năm-vòng CHU chain: [x] 1. /tiep re-verify S134 — 4/4 PASS (test 8/8 · bundle BVCukFP5 · prod Mig 20260717032812 · origin sync) + sửa lệch 2 evidence-pointer (WAL S134 items 5/7 + errata run.md/close-synthesis + tick hồi-tố /pause) [x] 2. check-email AI_INFRA STAGE-1 — 7 file copy verbatim + verify 2-tuyến (whole-file + body-canonical stamp_verify.py) 7/7 OK + _index 7 row pending + commit 55ef8f6 -[!] 3. fable-real invest (investigator-codebase, model=fable spawn-param) — ground-truth 13 trục T1-T13 + propose spec · 🔴 sub-file ghi-đĩa-trong-lúc-làm: runs/2026-07-17-S135-adap-khung-nhip-nam-vong/sub-investigator-codebase-0.md · chạy BACKGROUND -[ ] 4. lead verify claims + ghi spec-adap-khung-nhip-17-07-2026.md (3-heading, plan-chi-tiết-checklist) -[ ] 5. fable-real review (reviewer, model=fable) soi spec → lead áp fixes → spec v2 +[x] 3. fable-real invest — COMPLETE 48.6KB/17-section (return #53-garble lần ×3, sub-file CỨU) · ⭐ lật tiền-đề T7: residual hub mis-site (ps1 sạch, 2 site thật = budget:65/:90) · baseline phép-1 FAIL (+3 tick/9 nhãn/7 pause) · evidence: sub-investigator-codebase-0.md +[x] 4. lead verify V1-V8 8/8 KHỚP đĩa + chốt 6 DP default (⚑ anh flip được) + ghi spec v1 + tự-bắt file-collision LANE-A/C session-start.md → ownership trọn LANE-A · evidence: spec-adap-khung-nhip-17-07-2026.md +[!] 5. fable-real review (reviewer, model=fable) soi spec v1 → lead áp fixes → spec v2 · 🔴 sub-file: sub-reviewer-0.md · BACKGROUND [ ] 6. hmw implement Opus 4.8 MAX (anh chỉ định; args.run bắt buộc) — worker theo spec v2 [ ] 7. reviewer pre-commit → commit/push (CI có thể trigger vì scripts/*.ps1 — cicd verify nếu chạy) [ ] 8. adap-reports ×5 + report email hub (nấc + số đo + run-id) + STAGE-2 move 7 file → inbox/ai_infra/ + _index processed diff --git a/.claude/agent-memory/investigator-codebase/MEMORY.md b/.claude/agent-memory/investigator-codebase/MEMORY.md index 64a0904..7346cba 100644 --- a/.claude/agent-memory/investigator-codebase/MEMORY.md +++ b/.claude/agent-memory/investigator-codebase/MEMORY.md @@ -20,7 +20,8 @@ Read-only INTERNAL audit SOLUTION_ERP codebase. Tools: Read, Grep, Glob, Bash + --- ## 🆕 Recent invest (S112-S114 stubs — verbatim → git history + `archive/2026-07.md`) -- **S134 (07-17) PE lũy-kế TẠM-TÍNH invest+spec [fable-real-single; ghi-đĩa-trong-lúc-làm 8 phần → return sạch]:** ⭐ LỆCH-TIỀN-ĐỀ: "lũy kế chỉ bắt DaDuyet" SAI một nửa — `PeBudgetAccumulator.cs:42-48` PrevSubmitted (row1) ĐÃ gồm ChoDuyet=10 từ trước; DaDuyet-only CHỈ ở PrevSelected (row2, :50-60) ⇒ feature thu hẹp = delta row2/row6 (+row1 cho TraLai/nháp tuỳ tập). Predicate runtime 1 BẢN duy nhất (helper) — Features `:962` + WorkflowService `:1018` đều GỌI, Mig67 SQL = bản dịch one-time; "3-4 bản phải khớp" thực tế = 2 sống. FE matrix: row5=1+3 per-cột `PeDetailTabs:1325`, row6=2+4 `:1318`; PeDetailTabs+PeWorkflowPanel 2-app SHA IDENTICAL, types KHÁC (re-confirm S117). Final-approver predicate tái dụng được: `shouldPickPrice` PeWorkflowPanel:510. Dev DB còn phase legacy 3/6 SỐNG → predicate tạm-tính viết loại-trừ `NOT IN (7,99)`. Gotcha mới: SSH prod password extraction 2-step fail ×2 (ConvertFrom-Json null-method) — prod ground UNVERIFIED không chặn spec. Spec 3-mục + 5 decision-points (nháp S89-privacy list-only) → `runs/2026-07-17-S134-pe-luyke-tam-tinh/sub-investigator-codebase-0.md`. Tag `[s134, pe-luyke-tamtinh, lech-tien-de-row1, no-mig]` +- **S135 (07-17) adap khung-nhịp 13-trục + spec [fable-real; ghi-đĩa 12-phần → sạch; detail TRỌN ở sub-file]:** ⭐ LỆCH-1 lần 2: hub bảo "crystallized-backfill.ps1 mang `draft 2026-07-15`" — `git log -S` = chưa-TỪNG-có; sống ở `memory-budget.json:65+:90` ⇒ claim thư PHẢI re-đo đĩa. ⭐ Tick H24 single-entry `session-start:181-206`; tiep/pause/session-end 0-tick; tick S133 UNCOMMITTED (counter ngoài 3-path hook). Bẫy +1: tick cả pause+tiep = +2/cycle FAIL phép-7 → OR-guard `session==last_ticked_session`. ⭐ Detector closeout đo UNION-window per-label (delta sổ nằm ở wal-flush trước closeout — per-commit = 2/3 FAIL oan). H1/H2 0-vết @S133/S134 (E-011 tái diễn); việc-2 hub (seed 2 diary H24) ĐÃ XONG @`72f68d1`. Phép-1 FAIL +3tick/9nhãn/7pause · phép-3 union 3/3 · phép-4 14/14. Sleep 7d = ngày-lịch LỆCH khung. → `runs/2026-07-17-S135-adap-khung-nhip-nam-vong/sub-investigator-codebase-0.md`. Tag `[s135, lech-1-missite-lan2, union-window]` +- **S134 (07-17) PE lũy-kế TẠM-TÍNH invest+spec [fable-real-single; #53 garble → sub-file 8-phần 20.7KB CỨU TRỌN (lần 3); 2 errata lead bắt: path thiếu `Dtos/` + hash stale `47c97df1` vs `5534addb` (kết luận identical vẫn ĐÚNG); phase-set: PriorPes NOT IN {7,99} · delta2 NOT IN {1,7,99}+winner · delta1 NOT IN {1,7,10,99}]:** ⭐ LỆCH-TIỀN-ĐỀ: "lũy kế chỉ bắt DaDuyet" SAI một nửa — `PeBudgetAccumulator.cs:42-48` PrevSubmitted (row1) ĐÃ gồm ChoDuyet=10 từ trước; DaDuyet-only CHỈ ở PrevSelected (row2, :50-60) ⇒ feature thu hẹp = delta row2/row6 (+row1 cho TraLai/nháp tuỳ tập). Predicate runtime 1 BẢN duy nhất (helper) — Features `:962` + WorkflowService `:1018` đều GỌI, Mig67 SQL = bản dịch one-time; "3-4 bản phải khớp" thực tế = 2 sống. FE matrix: row5=1+3 per-cột `PeDetailTabs:1325`, row6=2+4 `:1318`; PeDetailTabs+PeWorkflowPanel 2-app SHA IDENTICAL, types KHÁC (re-confirm S117). Final-approver predicate tái dụng được: `shouldPickPrice` PeWorkflowPanel:510. Dev DB còn phase legacy 3/6 SỐNG → predicate tạm-tính viết loại-trừ `NOT IN (7,99)`. Gotcha mới: SSH prod password extraction 2-step fail ×2 (ConvertFrom-Json null-method) — prod ground UNVERIFIED không chặn spec. Spec 3-mục + 5 decision-points (nháp S89-privacy list-only) → `runs/2026-07-17-S134-pe-luyke-tam-tinh/sub-investigator-codebase-0.md`. Tag `[s134, pe-luyke-tamtinh, lech-tien-de-row1, no-mig]` - **S133 (07-17) PE budget FREEZE-at-DaDuyet invest [engine: fable-real-single `wf_348f6155-167`; #53 return-fail (no StructuredOutput) → sub-file 22.5KB cứu trọn, lead ghi entry on-behalf sau verify-đĩa 7/7]:** retro-change 2 đường: BE detail-bundle load pair LIVE `PurchaseEvaluationFeatures.cs:911-912` (DTO :964 — 1 construction site duy nhất) + FE fallback `?? bs.proInitialAmount`/`?? bs.initialAmount` (`PeDetailTabs.tsx:1511/:1526` — draft cite :1288 lệch dòng = class cite-drift S108, bản chất đúng). Finalize = ĐÚNG 4 assignment DaDuyet ALL `PurchaseEvaluationWorkflowService.cs:861/:899/:931/:1053`; `ApplyApprovedPriceOnFinalize` (def :955 static) chỉ 3-call V2 — V1 :1053 KHÔNG gọi ⇒ choke-point = helper MỚI 4-call, KHÔNG tái dụng hook giá-chốt. Vector per-slip: `SetPeCcmBudgetPeriod` NO-phase-guard (:228-242) · `AdjustBudget` admin-bypass (:419-422). Lũy kế row1/2 peer-derived (:917-943) = drift-vector thứ 2 → chụp luôn. Design: 11 cột `ApprovedBudget*` trên PE + display-gate `BudgetFrozen` + 2 terminal-guard + backfill=live-now (Changelogs CÓ log value NHƯNG attribution-gap: log gắn phiếu-đang-mở-lúc-sửa → không tái dựng số lúc duyệt). PeDetailTabs 2-app hash IDENTICAL `931025f2` · types 2-app KHÁC (S117). Tag `[s133, pe-budget-freeze, fable-real, ghi-dia-cuu-2/2, attribution-gap-changelog]` - **[→ archive/2026-07.md @S134] S129 (07-16) adap errata EOL 3-lane:** key giữ — 13 dương-giả do filter erratum thiếu docx/xlsx (tailor-per-class) · `git log|tail -1`=first-touch KHÔNG phải policy-landing · BOM-in-blob `mfe-eval.ps1:204` · meta-count class "40=+1 agent" bịa. - **[→ archive/2026-07.md @S134] S112/S113/S114 (07-12) Supplier-import-v2 + PE multi-winner per-hạng-mục:** key giữ — `Quote.IsSelected` per hạng-mục LIVE (Mig65, cardinality-change #2) · winnerQuoteTotal=SUM IsSelected `PeFeatures.cs:1188` · Mã NCC=Code · IsPublic fail-closed · PE bypass `ApplyDrafterBypassOnSubmitAsync`. diff --git a/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/run.md b/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/run.md index cba2dfb..0b0cdb0 100644 --- a/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/run.md +++ b/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/run.md @@ -21,9 +21,9 @@ ## Stages - [x] 0. check-email STAGE-1 — 7 file copy verbatim + verify whole-file & body-canonical 7/7 OK + `_index` 7 row pending + commit `55ef8f6` -- [!] 1. fable-real invest — ground-truth 13 trục + propose spec (sub-investigator-codebase-0.md) -- [ ] 2. lead verify claims + ghi `spec-adap-khung-nhip-17-07-2026.md` 3-heading -- [ ] 3. fable-real review spec → lead áp fixes → spec v2 +- [x] 1. fable-real invest — COMPLETE 48.6KB/17-section, 264 dòng (return #53-garble → sub-file cứu, lần ×3 liên tiếp cho fable-real) · ⭐ T7 lật tiền-đề: hub residual #1 mis-site (`git log -S` chứng ps1 CHƯA TỪNG chứa cụm draft; 2 site thật = memory-budget.json:65/:90) · baseline 8-phép: phép-1 FAIL sống (+3 tick/9 nhãn-phiên/7 wal-pause) · phép-3 PASS 3/3 union · phép-4 PASS 14/14 · vòng-1 tự-verify FAIL (S133/S134 closeout 0 spawn H1/H2) · 6 DP +- [x] 2. lead verify V1-V8 — 8/8 KHỚP (tick/counter 0-match tiep+pause · draft-2026-07-15 đúng 2 site sống · ps1:25/:117 honest-RANGE · 7 pause · 0 vết H1/H2 sau 08:39 · budget :65/:90/:121 + start:206 + hmw.js:97-98 nguyên văn) + chốt 6 DP default + tự-bắt file-collision LANE-A/C (session-start.md ownership → trọn LANE-A) → spec v1 +- [!] 3. fable-real review spec v1 → lead áp fixes → spec v2 (sub-reviewer-0.md) - [ ] 4. hmw implement (Opus 4.8 MAX per anh, args.run bắt buộc) - [ ] 5. reviewer pre-commit → commit/push - [ ] 6. adap-reports ×5 + report email hub + STAGE-2 move 7 file → `inbox/ai_infra/` + `_index` processed diff --git a/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/spec-adap-khung-nhip-17-07-2026.md b/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/spec-adap-khung-nhip-17-07-2026.md new file mode 100644 index 0000000..7bd96ef --- /dev/null +++ b/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/spec-adap-khung-nhip-17-07-2026.md @@ -0,0 +1,89 @@ +# spec — adap wave khung-nhịp-năm-vòng (17-07-2026, S135) — v1 + +> H21 pipeline: fable-real invest propose (sub-investigator-codebase-0.md, 13 trục, 48.6KB) → **lead verify V1-V8 disk-confirmed 8/8** → spec này → fable-real reviewer soi → hmw **Opus 4.8 MAX** (anh chỉ định) implement. Nguồn: 7 broadcast hash-verified 2-tuyến (commit `55ef8f6`): B1 `3daf5ee4` khung-nhịp · B2 `f71c5b65` checklist-5-vòng · B3 `e50a4bd0` reply-adap · B4 `0b581ae7` reply-3-gap · B5 `89e4d818` giấc-ngủ · B6 `6c2eb2b1` non-JSON-args · B7 `dacfcb11` notify. + +## ① Tính-năng / đề-bài + +Áp khung owner-chốt hub **"đo rải · làm dồn · nợ hiển thị"** (B1: tick đa-điểm-vào + force-fire bù + dòng-nợ 3-vế + 2 detector răng-máy) + checklist 5-vòng/8-phép (B2) + đóng residual do-token & `_owner_ratified` (B3, đích-danh SE) + luật non-JSON-args (B6) + nâng khuôn giấc-ngủ SKILL-only (B5) — rồi adap-report ×5 + email hub + STAGE-2 archive. + +**Mục tiêu ĐO ĐƯỢC:** completeness-gate B2 §C từ *2/4 phép sàn + vòng-3 PARTIAL + vòng-1 tự-verify FAIL* → **4/4 phép sàn PASS-able + 5/5 vòng chức-năng** (phép 1/7 đo SAU restart — nấc trung thực = executed, verified-pending-restart); `grep "draft 2026-07-15"` site sống 2 → 0; counter hết cửa câm (S134/S135 vào `/tiep` 0-tick = bằng-chứng sống GAP-1). + +## ② Cách implement + +### Item 1 — Tick đa-điểm-vào (LANE-A) — floor B1 §3.1 +- (a) `.claude/governance/.session-counter.json` `_contract.tick` (dòng 6): mở rộng thành `if (head == last_ticked_head) OR (session == last_ticked_session) -> NO-OP; else counter+1 …` (OR-guard dùng field CÓ SẴN — giải bẫy +2: /pause commit làm HEAD đổi, thiếu session-guard thì pause+tiep = +2/cycle → FAIL phép 7 "+1"). +- (b) `tiep.md`: chèn bước **§2.5 TICK** (sau đối-chứng §2, trước nối chain §3): tick theo contract — **CON-TRỎ về session-start §2.1.8, CẤM chép logic** (B1 canonical). +- (c) `pause.md`: bước **3.5 TICK** (TRƯỚC commit bước 4 — tick nằm TRONG commit `wal: pause`), cùng con-trỏ. +- (d) `session-end.md` (j): thêm **(v) tick-at-close** idempotent, cùng con-trỏ. +- (e) `session-start.md` §2.1.8: thêm 1 dòng đơn-vị: counter đếm **nhãn-phiên S** (phiên thường — SE chưa adopt session-logic `9234a7aa`; khi nào adopt thì đọc lại = phiên-LOGIC, caveat B1 §7). + +### Item 2 — Dòng-nợ 3-vế (LANE-B script + LANE-A wire) — floor B1 §3.3 +- Script MỚI `scripts/nhip-no-probe.ps1` — PS 5.1, **pure-ASCII** (gotcha #30), NO-API, **0-mutation, `exit 0` LUÔN**: + - Vế 1 nhịp-kiểm: đọc `.session-counter.json` (counter, last_audit) + `memory-budget.json` `h24_cadence` (light_every/deep_every — **fail-loud nếu key thiếu**, pattern H24-2 `:819-839`) → `light / deep / [OVERDUE:…|ok]`. + - Vế 2 trần-bộ-nhớ: byte `agent-memory/*/MEMORY.md` vs `archive_gate.autoinject_cap_bytes` (25600, đọc từ key — không hardcode) → ` over-cap`. Đo TƯƠI byte-on-disk (KHÔNG đọc `measured` snapshot stale). + - Vế 3 run-chưa-gom: port orphan DUAL-ACCEPT đúng `tiep.md:40-53` (2 dạng: flat `*-synthesis.md` + C8 `harvest/*-synthesis.md`, `-s` non-empty; dạng-3 RETIRED) → ` run-chua-gom`. + - Output **ĐÚNG 1 dòng**: `NHIP-NO: kiem light a/e deep b/f | tran-bo-nho x over-cap | run-chua-gom y`. MỌI exception → in `probe-loi (khong chan)` + exit 0. +- Wire 4 điểm (LANE-A): `/pause` bước 5 (+ý 5 = dòng-nợ) · `/tiep` cuối §2 · `session-start.md` §2.1.8(e) (nâng dòng H24 hiện có thành dòng-nợ 3-vế) · `session-end.md` (j)(i) (tương tự). Command chỉ GỌI script. **LUẬT: probe KHÔNG BAO GIỜ chặn điểm dừng.** + +### Item 3 — Force-fire bù khi closeout gộp sổ (LANE-A) — floor B1 §3.2 +- `session-end.md` (j) thêm **(vi)**: đếm `P = git log --format=%s ..HEAD | grep -c '^wal: pause'` (**so SÁNH SỐ, không dùng exit-code** — bẫy đã ghi `session-end.md:175`-class); nếu `P >= 1` HOẶC label đóng dạng `S-S`: coi như `OVERDUE(light)` → in dòng-nợ + **INFORM-BẮT-BUỘC + đề-xuất spawn cặp H24 (lead-view + lead-omission) NGAY closeout này, bất kể counter**. +- ⚑DP-3 (đã chốt default): **GIỮ consent-gate** — force-fire = force-INFORM-bắt-buộc + default-đề-xuất-chạy; anh gật thì chạy trong closeout. Lý do: luật cứng hiện hành `session-end.md:94` "KHÔNG auto-run — anh consent" + SE đã hẹn hub nguyên văn "light-run **owner-triggered**". Khai carve-out này với hub trong report (khung nói "chạy lượt kiểm" — SE chạy qua cổng consent). + +### Item 4 — Detector `H25-closeout-ritual` (LANE-B) — khung B1 §6.1, đóng GAP-2 +- Append `scripts/governance-detectors.ps1` (giữ convention: banner + Write-Flag + advisory + `exit 0` + tránh self-match): commit gần nhất match `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` → cửa-sổ `(closeout-liền-trước .. commit]` → **UNION** `git log --name-only` toàn cửa-sổ (⭐ phát-hiện thiết-kế T4a: delta sổ KHÔNG nằm trọn trong closeout-commit — hook `wal: flush` mang delta agent-memory đi TRƯỚC; đo per-commit sẽ 2/3 FAIL oan trên dữ liệu lành) → check ≥1 delta mỗi sổ nghi-thức: {`docs/STATUS.md`, `docs/HANDOFF.md`, `docs/changelog/sessions/*` file MỚI, `.claude/agent-memory/**`} → thiếu sổ nào FLAG `MED` kể tên. +- Fault-inject 3 ca (S95 proves-teeth, cây tạm `-RepoRoot`): (i) commit giả subject-closeout chạm 1 file lạ → PHẢI FLAG đủ 4 sổ; (ii) control tái tạo shape `99fc373` → PASS; (iii) boundary closeout-tail thiếu HANDOFF nhưng union-window có → KHÔNG FLAG. Output matrix ghi vào sub-file lane. + +### Item 5 — Detector `H25-role-notebook` (LANE-B) — khung B1 §6.2, đóng GAP-3 máy +- Cùng file: roster = `.claude/agents/*.md` trừ README (hiện 14); evidence-đã-chạy = `runs/*/sub--*.md` khớp prefix-map vai chuẩn **OR** diary đã tồn tại; prefix KHÔNG map được (`invest-A`, `w1-task`, `review-r1`…) → in danh-sách `UNMAPPED`, **KHÔNG FLAG bừa** (bài S122: đo TÊN ≠ đo NỘI-DUNG). Vai đã-chạy thiếu `agent-memory//MEMORY.md` byte>0 → FLAG MED. +- Fault-inject: cây tạm xoá 1 diary → FLAG; control 14/14 → PASS; boundary prefix lạ → UNMAPPED không FLAG. + +### Item 6 — Residual do-token + `_owner_ratified` (LANE-C) — B3 mục 2c/2d/3 +🔴 File `memory-budget.json` = ASCII-VN-không-dấu → mọi chuỗi ghi vào GIỮ ASCII không dấu. +- `:65` `token_estimate`: thay đoạn `real-N when it matters = harness Read-truncation notice per hub 'do token that' method, draft 2026-07-15, adopt-on-broadcast` → `khi can so that: notice cat-ngan cua Read = CAN-TREN bao-toan (heuristic ky-tu/2, dem-thua ~1.4-2x KHONG co-dinh -- KHONG phai real-N/da-do) -> bao DAI [san bytes/4 -- tran notice], token that nam trong dai; per ban published 2026-07-15-Governance-phuong-phap-dem-token-tien-de-vong4 (content_sha256 e0bb5bbf)`. GIỮ nguyên phần RANGE `[bytes/4 .. bytes/3.0]` + FIT bytes/3.0 (đã đúng). +- `:90` `_owner_override_note`: thay đoạn `MEASURE FRESH via harness Read-truncation notice N (hub 'do token that khong can API key' method, draft 2026-07-15, adopt-on-broadcast)` → `lay DAI TUOI [san char/4 -- tran notice-cat-ngan (can-tren ~1.4-2x khong co-dinh)] per ban published 2026-07-15-Governance-phuong-phap-dem-token-tien-de-vong4 (e0bb5bbf); CAM dan nhan real/da-do cho mot dau dai`. Phần còn lại note GIỮ nguyên. +- `:121` `_owner_ratified` thay TRỌN giá trị → `owner-decisions-15-07-2026 Q2 (anh chot 6/15/3 cho SE) + hub H0-LEAD-AUDIT-DECISION-CAPTURE-2026-07-14.md:105 (6/15/3/3, 'doi = anh', 2026-07-14); ratified = anh mark cong reply 2026-07-16-ai_infra-to-se-reply-adap-dot-16-07 (e50a4bd0), ngay 2026-07-17. 6/15/3 = moc khoi-dau CO Y anh chon -- KHONG phai muon so song cua hub: hub-counter DA GO per 85bf89ca, khong con moc so song. Re-tune sau chu-ky-2 CUA SE (deep-audit lan 2, xem .session-counter.json last_audit).` +- `session-start.md:206`: **append 1 vế cuối** (additive): `✅ Ratified 2026-07-17: anh mark cổng reply e50a4bd0; canonical = memory-budget.json h24_cadence._owner_ratified (B1 — wording sống ở đó, đừng chép lại đây).` — ⚠️ **THỰC-THI BỞI LANE-A** (file-ownership: `session-start.md` thuộc trọn LANE-A để 2 lane không ghi song song 1 file; nội dung vẫn thuộc Item 6). +- `scripts/crystallized-backfill.ps1` = **NO-CHANGE** (⭐ T7i verify V2/V3: chưa từng chứa cụm draft — `git log -S` rỗng toàn lịch-sử; đuôi `:117` đã honest-RANGE neo `58f5afd8` published). Errata blameless gửi hub trong report: residual #1 mis-site, 2 site thật = budget `:65/:90` (đã vá). +- `docs/governance/adap-reports/2026-07-16-Governance-vong-tu-bao-tri-thu-nam-san-su-that-nhan-da-do.md`: **2 append additive** (KHÔNG rewrite): (i) đóng-ask do-token — method published `e0bb5bbf`, ask khép per B3 mục 2a (dòng `:19` "giữ MỞ" = trạng-thái đã LẬT, note đính-chính kèm ngày); (ii) flip-note 4c — điều-kiện restart + spawn-test ĐÃ XẢY RA (S129 commit 23:16 → app-launch mới + reviewer spawned ≥2 lần S133/S134 fable-real + precommit `wf_8bb5abee`) ⇒ persona `reviewer.md:46` chắc chắn được NẠP; caveat trung thực: "được EXERCISE trong verdict" chưa chứng riêng; nấc `verified` vẫn của AI_INFRA /adap-audit. + +### Item 7 — Luật non-JSON-args (LANE-C) — B6 3 chốt +- `hmw.js:97` (comment) + `fable-real.md` (block `args.run`): thêm câu LUẬT: `args LUÔN là object JSON thật — normalize :98 là LƯỚI-CUỐI cho ca tầng-máy tự stringify, KHÔNG phải giấy phép tự stringify (per 6c2eb2b1)`. +- ⚑DP-4 (đã chốt default): **reconcile `fable-real.md:31`** → `4. **Worker thực-thi THEO spec** — spec bơm qua args = **CON-TRỎ** file spec (runs//spec-*.md, bản lead-đã-verify) + digest ngắn/AC-ids; worker Read **ĐÚNG file con-trỏ** (B6 chốt-2 args-mỏng); CẤM tự lục file NGOÀI con-trỏ.` — giữ intent gốc (worker không tự đoán nguồn), thoả floor B6. **Dogfood NGAY trong hmw wave này** (lane prompt = role + path spec + lane-id + AC-ids, KHÔNG nhét trọn spec). +- Honest-residual (ghi adap-report, KHÔNG làm đợt này): memory-pack hiện inject qua args (`hmw.js` args-shape) — vẫn object-thật + parse-guard; đánh giá chuyển pointer-based = đề-xuất riêng. +- Sổ SE 0 ca chết-non B6-class (grep RỖNG — T9iv): 3 chốt = phòng-ngừa forward, KHÔNG có nợ hồi tố. + +### Item 8 — Nâng khuôn giấc-ngủ SKILL-only (LANE-C) — B5 (KHÔNG chạy nén trong wave) +- `sleep-recovery-memory-l2.md`: (i) Phase 3a + luật **cross-file bleed**: "nén NHIỀU tệp cùng lượt → grep TỪNG token trích-dẫn về ĐÚNG verbatim CỦA TỆP ĐÓ"; (ii) Phase 2 + "**TỔNG-HỢP 3-5 ý đặt ĐẦU tệp, viết TRƯỚC chi-tiết** + **grep-ngược** mọi số/mốc trong tổng-hợp về phụ-lục/nguyên-bản" (hub lesson: tổng-hợp = lớp trôi nhanh nhất mà nạp-nóng đầu tiên). +- ⚑DP-5 (đã chốt default): **GIỮ trigger INFORM 7-ngày** (owner-era choice — khung B1 §3.4 cho phép ngày-lịch cục bộ = quyền owner) + probe/INFORM in THÊM **byte verbatim-chưa-gist tích lũy** (đo theo PREFIX kỳ; baseline 17-07: kỳ 2026-07 ≈ 183KB/5 file) → anh nhìn số rồi ĐẶT ngưỡng byte khi muốn chuyển hẳn (KHÔNG bịa số thay anh). + +### Item 9 — Báo-lại hub + STAGE-2 (LEAD sau merge — không thuộc lane) +Adap-report mới (wave) + cập nhật/append các adap-report liên quan + email hub: nấc từng khoản + baseline T6 + errata mis-site + việc-2 đã-hẹn done @S131-S132 (`72f68d1` seed 2 diary H24) + carve-out DP-3 + số đo phép 1/3/4. STAGE-2: move 7 file inbox root → `inbox/ai_infra/` + `_index` 7 row → processed. + +### DP đã chốt (lead-default — ⚑ anh flip được, flip-path 1 chỗ) +| DP | Default đã chọn | Vì sao | Flip | +|---|---|---|---| +| ⚑DP-1 | OR-guard session-label vào `_contract.tick` | thoả floor "mọi cửa" + phép 7 "+1"; dùng field sẵn | bỏ OR-guard, tick chỉ tiep+close | +| ⚑DP-2 | dangling-head candidate-fix **KHÔNG gom wave** | ngoài scope 7 broadcast; hub/anh đang treo | gom = sửa `_contract` thêm 1 nhánh | +| ⚑DP-3 | force-fire qua **consent-gate** (INFORM bắt buộc + đề-xuất) | luật cứng `:94` + hẹn hub "owner-triggered" | đổi 1 câu (vi) thành auto-run | +| ⚑DP-4 | reconcile `fable-real.md:31` spec-pointer + dogfood wave này | B6 chốt-2 = function-floor BẮT BUỘC | revert 1 dòng, quay prompt-embed | +| ⚑DP-5 | giữ INFORM 7d + in thêm byte tích lũy; anh đặt ngưỡng sau | đổi số/policy = quyền anh; không bịa ngưỡng | anh cho số → đổi 1 điều-kiện INFORM | +| T13iii | light-run-now KHÔNG chạy (moot: OVERDUE tự fire @counter 9 sau wire+restart) | tick S136 → 9 ≥ 3+6 | anh gật → spawn cặp H24 ngay | + +## ③ Checklist (vai + deliverable + acceptance ĐO ĐƯỢC) + +**Phân-rã hmw:** 3 lane **role-less + `tier:'opus'`** (worker Opus 4.8 MAX per anh; governance `.md/.ps1/.json` không khớp boundary implementer-backend/-frontend) · **0 overlap file giữa lane** (parallel-safe, không cần worktree) · `args.run` BẮT BUỘC (Sàn-1 H22) · mỗi lane GHI-ĐĨA-TRONG-LÚC-LÀM vào `sub-lane--.md` + prompt = con-trỏ spec này (DP-4 dogfood). + +**LANE-A — commands + contract (Items 1 + 2-wire + 3 + Item-6-phần-`:206`):** sửa `tiep.md` `pause.md` `session-end.md` `session-start.md` (cả §2.1.8 lẫn `:206` — file-ownership trọn) `.claude/governance/.session-counter.json`. +AC-A (đo bằng grep/so-sánh, baseline hiện tại 0/0/0-tick): (1) `grep -c "tick" tiep.md pause.md session-end.md` ≥1 mỗi file; (2) contract chứa OR-guard `last_ticked_session`; (3) 4 điểm gọi `nhip-no-probe.ps1` (grep tên script = 4 file); (4) KHÔNG chép logic tick — mỗi điểm ≤4 dòng + con-trỏ §2.1.8; (5) session-end (vi) so-sánh SỐ `grep -c` (không exit-code); (6) dòng-nợ KHÔNG chặn: mọi lời gọi bọc probe-lỗi-đi-tiếp; (7) `session-start.md:206`-vùng có `Ratified 2026-07-17` + con-trỏ key canonical (nội dung Item 6). + +**LANE-B — scripts (Items 2-script + 4 + 5):** tạo `scripts/nhip-no-probe.ps1` + append 2 detector vào `scripts/governance-detectors.ps1`. +AC-B: (1) probe chạy 2 lần → output byte-y-hệt (phép 5) + 0-mutation (git status trước/sau y hệt); (2) `-RepoRoot` không tồn tại → in `probe-loi (khong chan)` + exit 0 (phép 6); (3) số 3 vế khớp đối-chứng đo-tay độc-lập tại thời-điểm chạy (17-07 kỳ vọng: `light 5/6 deep 5/15 ok | 0 over-cap | 1 run-chua-gom` — run 1 = chính S135 self-open, đúng); (4) 2 detector: fault-inject matrix 6 ca (3+3, mục Item 4/5) PASS/FLAG đúng chiều — output ghi vào sub-file lane; (5) repo thật: 0 FLAG-mới ngoài expected (H25-closeout-ritual trên 3 closeout gần nhất = PASS union; H25-role-notebook = 14/14 + UNMAPPED list); (6) script `exit 0` + pure-ASCII + 0 self-match. + +**LANE-C — residual + doc + sleep (Items 6 + 7 + 8, TRỪ phần `:206` đã sang LANE-A):** sửa `memory-budget.json` (:65 :90 :121) + append 2 note adap-report san-su-that + `hmw.js:97` comment + `fable-real.md` (:31 reconcile + câu luật) + `sleep-recovery-memory-l2.md` 2 chốt + INFORM-byte. **0 file trùng LANE-A/B.** +AC-C: (1) `grep -rn "draft 2026-07-15"` ngoài {runs/, broadcasts/, docs/governance/adap-reports (dòng lịch-sử :19 GIỮ + note đính-chính mới)} = **0 site sống** (baseline 2); (2) `grep -c "e0bb5bbf" memory-budget.json` = 2 và `:121` chứa `e50a4bd0`; (3) *(chuyển sang AC-A(7) — file-ownership)*; (4) adap-report san-su-that có 2 append (đóng-ask + flip-4c) additive; (5) `hmw.js` + `fable-real.md` mỗi file có câu luật object-thật; (6) `fable-real.md:31`-vùng = bản reconcile spec-pointer; (7) sleep cmd chứa `cross-file bleed` + `grep-ngược`/`grep nguoc` + hiển-thị byte tích lũy; (8) JSON valid sau sửa (`ConvertFrom-Json` pass) + budget.json giữ ASCII-không-dấu. + +**Post-merge (LEAD, không lane):** fable-real… không — reviewer **pre-commit** (vai `reviewer`, mặc định worker-tier opus+max) → commit `[CLAUDE] Scripts+Skill: adap khung-nhip…` → **RESTART Claude Code bắt buộc** (command `.md` no-hot-reload, `pause.md:9`) → phiên kế: đo phép 7 (1 chu-kỳ pause–tiep → counter +1 = 9) + phép 1 cửa-sổ mới + light-OVERDUE fire @9 (consent-gate) → Item 9 báo hub kèm số + STAGE-2. + +**Baseline mốc so (T6 đo 17-07, lead verify):** counter=8/S133 (tick S133 uncommitted — governance-drift ghi nhận) · phép-1 FAIL: +3 tick / 9 nhãn-phiên / 7 `wal: pause` cửa-sổ `(e9124fc..a6cd0a2]` · phép-3 PASS 3/3 union-per-label · phép-4 PASS 14/14 · orphan=1 (S135 self-open) · H1/H2 last-vết `72f68d1` (S133/S134 closeout KHÔNG spawn cặp = vòng-1 tự-verify FAIL sống) · un-gisted 2026-07 ≈183KB/5 file · `last_sleep_at=2026-07-10`. + +**CAVEAT:** không chép số hub (n=2); số trên = SE tự đo, cửa-sổ khai tại chỗ. Nấc sau wave: executed + verified-pending-restart cho tick/phép-7; `verified` formal = vòng chấm cross-repo hub. diff --git a/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/sub-investigator-codebase-0.md b/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/sub-investigator-codebase-0.md index f7dcb10..3203dd8 100644 --- a/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/sub-investigator-codebase-0.md +++ b/.claude/workflows/runs/2026-07-17-S135-adap-khung-nhip-nam-vong/sub-investigator-codebase-0.md @@ -8,4 +8,256 @@ STATUS: IN-PROGRESS (ghi từng phần — chống #53) - +## PHẦN 0 — Input digest (7 broadcast, cite 8-hex từ frontmatter content_sha256) + +| # | File | 8-hex | Nội dung lõi cho wave | +|---|---|---|---| +| B1 | khung-nhip-nam-vong (17-07, CHUẨN) | `3daf5ee4` | 4 khoản floor mục 3 (tick đa-điểm · force-fire bù · dòng-nợ 3-vế · cadence ngày-lịch KHÔNG chuẩn) + event-gate 2-điều-kiện mục 4 + van TREO mục 5 + 2 detector mục 6 (closeout-thiếu-nghi-thức · per-ROLE) + SELF-CHECK 5 ô + đơn-vị phiên-LOGIC mục 7 | +| B2 | checklist-nam-vong (17-07) | `f71c5b65` | bảng A 5-vòng 7-cột · B 8-phép $0 (nhóm chỉ-đọc 1/3/4/5/8 · quan-sát/diễn-tập 2/6/7) · C completeness-gate = 5 vòng chức-năng + phép 1-4 | +| B3 | reply-adap-dot-16-07 (16-07, đích-danh SE) | `e50a4bd0` | do-token: method published `e0bb5bbf` → adap NGAY + đóng ask; 2 residual (crystallized-backfill.ps1 đuôi provenance + memory-budget.json:90 anchor NO-GO); đính-chính ngữ-nghĩa (số-cắt-ngắn ≠ real-N, = cận-trên ~1.4–2× KHÔNG cố-định → báo DẢI); mục 3 `_owner_ratified` wording note :121 ("tương-tự Hub" → "mốc khởi-đầu cố-ý; hub-counter đã gỡ per `85bf89ca`") + ratification = anh mark cổng reply + re-sync session-start.md:206 | +| B4 | reply-h24-cadence-3-gap (17-07, đích-danh SE) | `0b581ae7` | CONFIRM 3 gap (GAP-2 nặng nhất); khung SE "đo rải · làm dồn · nợ hiển thị" VÀO CHUẨN; câu-2 = nguyên tắc số 1 reword "nhịp vô-điều-kiện"; verdict: tick/dòng-nợ/eval-gộp/2-vai-vô-điều-kiện = nhận, event-gate = dè dặt 2-điều-kiện; 4 việc SE tự hẹn "đúng thẩm quyền, không cần chờ hub" | +| B5 | vong-bon giấc-ngủ (16-07) | `89e4d818` | khuôn 4-vai nén L2 {máy đề-xuất → đầu-tàu chưng-cất → cổng đối-chiếu tất-định grep-token → cửa-duyệt độc-lập fidelity}; additive; marker chống-nén-2-lần; 3 câu hỏi mục 4 (tầng thoát? cổng tất-định? vai độc-lập chấm?) | +| B6 | loi-phong-workflow chết-non (16-07) | `6c2eb2b1` | chữ-ký: chết-non ms, 0 agent 0 token, `JSON Parse error`/`Unexpected identifier` tầng máy; root-cause args = CHUỖI stringify; 3 chốt: object-thật · args-MỎNG (nội-dung dày → FILE, args = path+cờ) · giữ normalize = lưới-cuối | +| B7 | notify 2-bản + kênh hỏi-đáp (16-07) | `dacfcb11` | kênh Q&A qua hub (owner-chốt 16-07); nhịp phát xong-cái-nào-phát-cái-đó; 2 bản mới `eb12b9b8` (EOL errata — SE ĐÃ xử S129) + `0db707e4` (7 lớp lỗi) | + +## T1 — TICK ĐA-ĐIỂM-VÀO + +### (a) Hiện trạng đĩa + +**Counter file `.claude/governance/.session-counter.json` (đọc trọn 38 dòng):** +- `:13-16` — `counter: 8`, `last_ticked_session: "S133"`, `last_ticked_head: a721989b…`, `last_ticked_at: 2026-07-17`. +- `:6` `_contract.tick` — **idempotent same-HEAD có sẵn**: "if head == last_ticked_head -> NO-OP … Else counter+1". ⇒ điểm chèn tick mới KHÔNG cần logic mới, chỉ cần GỌI cùng contract. +- `:7` `fail_loud_on_regress` + `:8` `overdue` formula `(counter - last_audit.light_at_counter) >= light_every` + `:9` jump_on_class_repeat + `:10` **writer = lead single-writer, "Wired at /session-start"** (duy nhất). +- `:17-21` `last_audit`: light_at_counter=3, deep_at_counter=3 (S124 credited both) → next light ~9, next deep ~18. +- `:26-36` history 2 entry FAIL-LOUD ancestor-check (S127, S133) — class "closeout squash làm head lúc tick thành dangling"; candidate-fix treo (chấp nhận dangling-object-exists làm bằng-chứng yếu khi counter không lùi). +- **Bằng-chứng sống GAP-1:** `last_ticked_session=S133` trong khi phiên hiện tại = S135 (S134 + S135 vào bằng `/tiep`, không qua `/session-start`) — 2 cửa "câm". git status đầu phiên cũng thấy `.session-counter.json` modified (tick S135 chưa commit? — sẽ đối chiếu ở T6 phép 1). + +**Vị trí bước tick (đo grep 4 command file):** +- `session-start.md:181-206` §2.1.8 = NƠI DUY NHẤT có nghi-thức tick. `:185-190` = pseudo-code **inline** (không phải script .ps1 — lead tự chạy `git rev-parse HEAD` + Edit file). Trích `:188-189`: "nếu head == last_ticked_head → NO-OP (idempotent) / ngược lại → counter += 1 ; last_ticked_session = S ; …". +- `tiep.md` — grep `tick|counter|session-counter` = **0 match** ⇒ KHÔNG tick. Cấu trúc: §0 sàn-3 → §1 WAL → §2 đối-chứng → §3 ground-truth → §4 wf-recovery. +- `pause.md` — **0 match** ⇒ KHÔNG tick. 5 bước: ngừng-spawn → flush → WAL → commit `wal: pause` (bước 4, đích-danh path) → báo + DỪNG. +- `session-end.md:92-94` bước (j) H24 — CHỈ **ĐỌC** counter + in 1 dòng OVERDUE + INFORM; KHÔNG tick (chỉ update `last_audit` SAU khi vai H24 chạy). + +**Bằng-chứng sống bổ sung (git diff + log):** +- `git diff .session-counter.json` = tick S133 (counter 7→8 + history entry FAIL-LOUD lần 2) **CHƯA COMMIT** — commit cuối chạm file = `72f68d1` (07-17 08:38, S131-S132 session-end). File nằm NGOÀI 3 path hook (by design `:4`) ⇒ cần git-add đích-danh lúc closeout, mà closeout S133 (`e53a693`) + S134 (`99fc373`) đều KHÔNG add ⇒ **governance-state uncommitted drift** (surprise — liên đới T3/T4). +- History `:26-36`: 2× FAIL-LOUD ancestor-check (S127, S133) class "closeout SQUASH làm head-lúc-tick thành dangling" — **candidate-fix treo** (chấp nhận dangling-object-exists làm bằng-chứng yếu khi counter không lùi) chờ anh/hub. + +### (b) GAP so floor B1 mục 3.1 (`3daf5ee4`) +Floor: "Mọi cửa vào phiên VÀ mọi điểm dừng đều tăng bộ đếm". Hiện trạng: **1/4 điểm có tick** (session-start). /tiep (cửa vào) + /pause (điểm dừng) + session-end (điểm hội tụ) = **3 điểm câm**. Sống: S134+S135 vào bằng /tiep → counter đứng 8/S133. + +### (c) Đề xuất cách làm +**Bẫy +1 phải giải trước:** SELF-CHECK B1 + phép 7 checklist đòi "dừng–nối 1 lần → counter **+1**" (không phải +2). Contract hiện chỉ dedup **same-HEAD** — mà /pause commit `wal: pause` làm HEAD đổi ⇒ tick ở CẢ pause lẫn tiep = **+2/cycle → FAIL phép 7**. +**Giải đề xuất (contract mở rộng 1 OR-guard):** `NO-OP nếu (head == last_ticked_head) HOẶC (session == last_ticked_session)` — dùng field `last_ticked_session` CÓ SẴN. Hệ quả: +- tick tại CẢ 4 điểm (session-start có sẵn + tiep + pause + session-end-close) — "không cửa nào câm" đúng nghĩa đen; +- 1 phiên-logic S = đúng 1 tick bất kể qua mấy cửa (pause trong S135 sau khi session-start đã tick S135 → NO-OP session-guard; /tiep mở S136 → +1) ⇒ phép 7 PASS; +- 2× /session-start cùng HEAD = +1 (HEAD-guard giữ nguyên). +**Điểm chèn cụ thể:** `tiep.md` sau §2 (đối-chứng xong, trước nối chain) + `pause.md` bước 3.5 (trước commit bước 4 — để tick nằm TRONG commit `wal: pause`) + `session-end.md` bước (j) thêm "(iii) tick-at-close". Mỗi chỗ 3-4 dòng TRỎ về contract §2.1.8 (B1 con-trỏ-canonical, KHÔNG chép logic). +**Alternative rẻ hơn (nếu anh không muốn đổi contract):** tick CHỈ tại /tiep + session-end-close (2 điểm), /pause không tick — phép 7 vẫn PASS nhưng "điểm dừng tăng đếm" chỉ đạt gián-tiếp. Decision-point cho anh/lead. +**Lưu ý restart:** command `.md` = NO hot-reload — `pause.md:9` ghi rõ "🔴 restart Claude Code sau khi tạo/sửa command .md". Tiền lệ S124 restart-lesson (project-memory harness4). ⇒ wave này sửa 4 command file ⇒ **restart bắt buộc trước khi đo phép 7**. +**Decision-point phụ:** candidate-fix dangling-head (history :30/:35) — gom vào wave này hay để riêng chờ hub (nó fire MỌI phiên-đầu-sau-closeout-squash, sẽ ồn hơn khi tick dày lên). + +## T2 — DÒNG-NỢ 3-VẾ (floor B1 mục 3.3: nhịp-kiểm · cờ-trần-bộ-nhớ · run-chưa-gom, 1 dòng chỉ-đọc ~0) + +### (a) Nguyên liệu sẵn có trên đĩa — CẢ 3 VẾ ĐỀU CÓ SẴN, chưa ai gom thành 1 dòng +- **Vế 1 nhịp-kiểm:** `.session-counter.json` (counter=8, last_audit light/deep@3) + `memory-budget.json:119-125` `h24_cadence` (light_every=6 `:122`, deep_every=15 `:123`, jump=3 `:124`). Tính sống: light 5/6 (due @counter 9 — CHƯA overdue), deep 5/15 (@18). Công thức OVERDUE đã chuẩn ở counter-contract `:8`. +- **Vế 2 cờ-trần-bộ-nhớ:** cap = `memory-budget.json:34` `archive_gate.autoinject_cap_bytes 25600`; đo = so byte `agent-memory/*/MEMORY.md` vs cap (logic có sẵn trong `scripts/memory-archive-gate.ps1` A1 `:48-50`). ⚠️ KHÔNG tái dụng nguyên con memory-archive-gate làm probe: (i) output multi-line PLAN, không phải 1 dòng; (ii) cờ `-Apply` ghi strikes (`:26` — mutation); default DRY read-only nhưng vẫn ồn. `measured` block `:142-156` là SNAPSHOT S107 (stale by-design) — probe phải đo TƯƠI byte-on-disk. +- **Vế 3 run-chưa-gom:** orphan-detector DUAL-ACCEPT canonical `tiep.md:40-53` (bash: run.md tồn tại ∧ thiếu `*-synthesis.md` phẳng ∧ thiếu `harvest/*-synthesis.md` non-empty). Đếm dòng ORPHAN = số run chưa gom. + +### (b) GAP +Chưa có script nào in 3 vế thành 1 dòng; chưa điểm dừng nào in nợ. `/pause` bước 5 báo 4 ý (goal/[!]-đầu/wf/an-toàn) — KHÔNG có vế nợ nào; `/tiep` cũng không; session-start §2.1.8(e) + session-end (j)(i) mới in vế-1 (H24) đơn lẻ ở HAI ĐẦU, không phải mọi điểm dừng. + +### (c) Đề xuất +**Script mới `scripts/nhip-no-probe.ps1`** (PS 5.1, pure-ASCII gotcha #30, NO-API, 0-mutation, `exit 0` LUÔN — noi gương `agent-frontmatter-eol-check.ps1` nấc INFORM session-end.md:211): +- I: đọc `.session-counter.json` + `memory-budget.json` (h24_cadence + archive_gate.cap) + scan `agent-memory/*/MEMORY.md` byte + port vòng orphan DUAL-ACCEPT (giữ đúng 2 dạng, dạng-3 retired). +- O: **đúng 1 dòng**: `NO-LINE: kiem light / deep / | tran-bo-nho sub over-cap | run-chua-gom `; MỌI exception → in `probe-loi (khong chan)` + exit 0. +- Chỗ in (4 điểm — khớp tick T1): `/pause` bước 5 (thêm ý 5) · `/tiep` cuối §2 · session-start §2.1.8(e) (nâng dòng H24 hiện có thành dòng-nợ 3-vế) · session-end (j)(i) (tương tự). B1: command chỉ GỌI script, không chép logic. +- Phép 5 checklist (chạy-lại-được): script không ghi file nào (không strikes, không state) ⇒ 2 lần chạy output y hệt. Phép 6 (giết probe): lệnh gọi trong command bọc "lỗi → in probe-loi (khong chan), đi tiếp" — fault-inject: gọi với `-RepoRoot` không tồn tại → phải in probe-loi + điểm dừng vẫn hoàn tất. +- LUẬT: dòng-nợ KHÔNG BAO GIỜ chặn /pause / /tiep (floor B1 mục 3.3 nguyên văn). + +## T3 — FORCE-FIRE BÙ khi closeout gộp sổ + +### (a) Hiện trạng +- `session-end.md` đọc TRỌN (253 dòng): **KHÔNG có bước nào** phát hiện "closeout gộp sổ ≥2 phiên-dừng". Bước (j) `:92-94` chỉ check OVERDUE theo counter — mà counter đang đứng khi vào bằng /tiep (GAP-1) ⇒ gộp sổ càng nhiều, OVERDUE càng KHÔNG kêu = đúng vòng tự-che B4 mô tả. +- Bằng-chứng gộp-sổ THẬT (git log): `72f68d1` "S131-S132 session-end — … E-011/AS-15 **nghi-thức-chạy-tắt** + dồn H1/H2 **S127→S131**" (1 closeout gộp 6 nhãn-phiên S127-S132); `e9124fc` "S125-S126 closeout GOP". Đếm cửa-sổ (e9124fc → HEAD]: **7 commit `wal: pause`** + 18 `wal: flush` + 9 nhãn-phiên (S127→S135). +- Cách đếm phiên-dừng-trong-kỳ ĐO ĐƯỢC: `git log --format=%s ..HEAD | grep -c '^wal: pause'` (số điểm dừng chủ-động) + đếm nhãn `S` mới trong session-log/subject kỳ đó. Cả 2 đều $0 chỉ-đọc. + +### (b) GAP so floor B1 mục 3.2: floor đòi "closeout gộp ≥2 phiên-dừng → chạy lượt kiểm ngay closeout đó, bất kể counter". SE = 0 wire. + +### (c) Đề xuất wire (session-end.md, chèn vào (j) thành mục (v)): +- **Điều kiện:** `P = grep -c '^wal: pause'` trên `..HEAD` (last-closeout = commit gần nhất match closeout-pattern T4); NẾU `P >= 1` (tức kỳ này chứa ≥1 điểm dừng = closeout đang gộp ≥2 phiên-dừng) HOẶC nhãn đóng dạng `S-S` (b>a) → **force-fire bù**. +- **Hành động:** coi như `OVERDUE(light)` — in dòng-nợ + INFORM anh đề-xuất spawn cặp H24 light (lead-view + lead-omission) NGAY closeout này, bất kể counter. ⚠️ **Điểm lệch khung phải khai:** khung nói "chạy lượt kiểm"; SE có luật cứng "🔴 KHÔNG auto-run — anh consent mới chạy" (`session-end.md:94`, `session-start.md:203`) + việc SE tự hẹn hub = "light-run **owner-triggered**" ⇒ đề xuất giữ consent-gate: force-fire = force-INFORM-bắt-buộc + default-đề-xuất-chạy, anh gật thì chạy trong closeout. **Decision-point cho anh:** consent-gate (SE-specific, khai với hub) vs auto-run đúng chữ khung. +- Chạy trên trạng-thái nghỉ ✓ (closeout = điểm hội tụ, nguyên tắc 2 khung). + +## T4 — DETECTOR closeout-thiếu-nghi-thức (khung `3daf5ee4` mục 6.1) + +### (a) Hiện trạng +- **Detector hiện có trong `scripts/governance-detectors.ps1`** (grep banner + Write-Flag): derived-staleness counts vs STATUS canonical (`:172-237`) · H18-A derived-doc scan-range/stale-total (`:266-308`) · C1-wikilink resolve (`:380-415`) · WAL overwrite-not-append N.1 (`:484-491`) · **H24-1 title-freshness** (`:502+`) · Test-Quoted use⟂mention helper (`:596`) · **H24-3 session-label-lag** (`:664+`, NEW S123) · **H24-2 carry-age INFORM** (`:781+`, đọc `h24_cadence` fail-loud `:819-839`) · HANDOFF:5 mega-line (`:864-889`) · self-match check (`:905-914`). `exit 0` LUÔN, FLAG advisory (`:922-923`). ⇒ **0 detector nào nhìn commit-delta closeout** — GAP-2 đúng là "không detector nào hiện sở hữu" (khớp B4). +- **Closeout-pattern ĐO từ git log** (6 commit gần nhất match): `[CLAUDE] Docs: S[-S] {closeout|session-end|closeout-tail|closeout GOP} — …` ⇒ regex đề xuất: `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)`. +- **"Sổ nghi-thức bắt buộc" theo `session-end.md`:** STATUS.md Recently-Done (§L.b(a) `:54` + Phase 2.1 `:107`) · HANDOFF.md (Phase 2.1 `:107`) · session-log `docs/changelog/sessions/` (Phase 1 `:44`) · agent-memory flush mọi sub đã spawn (§L.b(d) `:57`) · WAL reset (§6.4 `:244-248`) · error-ledger (§L.a `:50` — CONDITIONAL khi có AS-hit) · run `*-synthesis.md` (§L.b(f)). +- **⭐ Phát hiện thiết kế (đo 4 closeout bằng `git show --name-only`):** delta sổ KHÔNG nằm trọn trong chính closeout-commit — hook `wal: flush` đã mang delta agent-memory đi TRƯỚC (vd diary S133 nằm ở `9f404d3` wal-flush 09:58, KHÔNG ở `e53a693`); closeout-tail `9e874ca` thiếu HANDOFF nhưng `72f68d1` cùng label S131-S132 có ⇒ **detector PHẢI đo UNION delta trên CỬA SỔ kỳ** `(closeout-trước .. closeout-này]` **theo session-label**, KHÔNG per-commit — nếu không sẽ 2/3 FAIL oan ngay trên dữ liệu lành. + +### (b) GAP: 0 wire. (c) Đề xuất +Detector mới trong `governance-detectors.ps1` (tên: `H25-closeout-ritual` — tránh chữ trần "GAP"/"stale" per `_vocab_guard` memory-budget.json:128): input = commit gần nhất match closeout-regex → xác định label + cửa-sổ `(closeout-liền-trước .. commit]` → union `git log --name-only` cửa-sổ → check ≥1 delta mỗi sổ {STATUS, HANDOFF, session-log-mới, agent-memory/**} → thiếu sổ nào FLAG `MED` kể tên sổ. Advisory exit-0 (nhất quán script). **Fault-inject (S95 proves-teeth):** cây tạm `-RepoRoot` + commit giả subject closeout chỉ chạm 1 file lạ → PHẢI FLAG 4 sổ thiếu; control = tái tạo shape 99fc373 → PASS; boundary = closeout-tail thiếu HANDOFF nhưng union-window có → KHÔNG FLAG (chống dương-giả oan). + +## T5 — DETECTOR per-ROLE (khung mục 6.2, GAP-3) + đo NGAY + +### Số thật đo 2026-07-17 +- Roster: **14 vai** = `.claude/agents/*.md` trừ README (cicd-monitor · database-agent · frontend-designer · harvest-curator · implementer-backend · implementer-frontend · investigator-api · investigator-codebase · lead-omission-auditor · lead-view-auditor · office-document · reviewer · test-specialist · tooling-auditor). +- Sổ: `.claude/agent-memory//MEMORY.md` tồn tại + byte>0 = **14/14** (min office-document 3323B; max cicd 22607B). +- **2 vai H24 (chạy S124):** lead-omission-auditor 3691B + lead-view-auditor 3332B — seed commit `72f68d1` (S131-S132, 07-17 08:38, subject có "seed 2 diary H24"). ⇒ **"harvest hồi tố sổ 2 vai" SE hẹn hub = ĐÃ XONG @S131-S132**, KHÔNG còn là việc wave này (chỉ còn báo-lại hub trong report). +- Vai đã-chạy-thiếu-sổ hiện tại = **0**. GAP-3 data-side ĐÓNG; cái THIẾU là **máy** (detector tự soi từ nay về sau). +- ⚠️ Bẫy mapping đo được: prefix sub-file trong `runs/` KHÔNG canonical — ngoài tên vai chuẩn còn `invest-A/B/C` · `w1/w2/w3-task` · `task` · `impl-runsreadme` · `impl-sleepcmd` · `review-r1/r2/r3` · `investigator-2-spec-draft`… ⇒ detector map-được-thì-map, **UNMAPPABLE → in danh-sách riêng, KHÔNG đoán** (bài S122: đo TÊN ≠ đo NỘI-DUNG, 32% dương-giả). + +### Đề xuất +Detector `H25-role-notebook` cùng script: evidence-đã-chạy = (`runs/*/sub--*.md` khớp prefix-map) **OR** vai có mặt trong spawn-record session-log; mỗi vai đã-chạy PHẢI có `agent-memory//MEMORY.md` byte>0 → thiếu FLAG MED. Fault-inject: cây tạm xoá `lead-view-auditor/MEMORY.md` → FLAG; control 14/14 → PASS; boundary: sub-file prefix lạ → dòng "UNMAPPED" chứ không FLAG bừa. + +## T6 — BASELINE 8-PHÉP (bảng B `f71c5b65`) — chạy phép 1/3/4 NGAY, số THẬT + +**Khai đơn-vị + cửa-sổ (bẫy S130):** cửa-sổ = `(e9124fc 07-16T15:19 .. a6cd0a2 07-17T15:40]` (từ closeout S125-S126 tới HEAD lúc đo); "nhãn-phiên" = S-label xuất hiện trong commit-subject/session-log (proxy 2-nguồn); "tick" = increment `counter` trong `.session-counter.json`; đếm bằng `git log --format=%s --since=… | grep -c` (occurrence trên subject-line đơn, không mega-line ⇒ `-c` an toàn ở đây). + +| Phép | Kết quả | Số + lệnh | +|---|---|---| +| **1 — tick vs cửa** | **FAIL (kẽ sống, đúng GAP-1)** | Nhãn-phiên trong cửa-sổ: **9** (S127…S135). Điểm dừng `wal: pause`: **7**. Tổng cửa+dừng ≈ 16. Tick cùng kỳ: **+3** (5→8: S127, S131, S133 — đọc history+diff counter). ⇒ ~13 cửa "câm". Riêng bằng-chứng tối-thiểu: S134+S135 vào /tiep, 0 tick. | +| **3 — closeout thiếu nghi-thức** | **PASS 3/3 theo UNION-per-label** (caveat bên dưới) | S134 `99fc373`: STATUS✓ HANDOFF✓ session-log✓ agent-memory✓(4 diary). S133 `e53a693`: STATUS✓ HANDOFF✓ session-log✓ + agent-memory qua `9f404d3` wal-flush cùng kỳ (per-commit-naive thì FAIL oan). S131-S132 `72f68d1`+tail `9e874ca`: đủ 4 sổ (union). ⚠️ Caveat: PASS này là SAU vá E-011/AS-15 @S131; kỳ S127-S130 trước đó chính là ca FAIL (GAP-2 đã báo hub — "dồn H1/H2 S127→S131"). Proxy mtime+commit-log không phân biệt "không chạy" vs "chạy không ghi sổ" (B2 ghi-chú (v)) — cả hai đều lỗi nên vẫn bắt đúng. | +| **4 — per-ROLE có sổ** | **PASS 14/14** | Xem T5 — 0 vai đã-chạy thiếu sổ (2 sổ H24 seeded 72f68d1). | +| 2 — dòng-nợ tại cửa | CHỜ IMPLEMENT (T2) — PASS-able sau wave | n/a | +| 5 — probe chạy-lại-được | CHỜ IMPLEMENT (nhip-no-probe.ps1 0-mutation) | n/a | +| 6 — giết probe điểm dừng sống | CHỜ IMPLEMENT (fault-inject case T2) | n/a | +| 7 — dừng–nối +1 | CHỜ IMPLEMENT (T1) + **cần restart** trước khi đo (command .md no hot-reload) | n/a | +| 8 — đối chiếu đóng-sổ vs khối-lượng | CHỜ IMPLEMENT (T3 force-fire chưa wire; phép 8 hub cũng CHƯA dogfood — khai thẳng) | n/a | + +## T7 — RESIDUAL DO-TOKEN (reply `e50a4bd0` mục 2c/2d/3) + +### (i) crystallized-backfill.ps1 — ⭐ LỆCH-TIỀN-ĐỀ (đo đĩa + git-history) +- Grep TRỌN file cho `token|draft|do-token|NO-GO|calibrat|method|provenance|e0bb5bbf`: cụm **"draft 2026-07-15" KHÔNG TỒN TẠI** trong file hiện tại. Đuôi provenance thật `:117` (TRÍCH NGUYÊN VĂN): `# heuristic RANGE (invariant 4): divisors = convention char/4 + VN ~3.0-3.5 byte/tok -- CHUA do tokenizer that tai SE (see dinh-chinh letter 58f5afd8 2026-07-16). tok_low = optimistic (bytes/4), tok_high = worst (bytes/3.0)` + `:25` `(4) HEURISTIC RANGE (convention, NOT measured)` + `:227` `char/4 is NOT a real token count`. +- `git log -S 'draft 2026-07-15' -- scripts/crystallized-backfill.ps1` = **RỖNG** ⇒ file **CHƯA TỪNG** chứa cụm đó trong toàn lịch sử. Anchor sống của ps1 = `58f5afd8` (đính-chính letter ĐÃ PUBLISHED) — hợp lệ, ngữ-nghĩa honest-RANGE sạch. +- ⇒ **Residual #1 của hub đặt SAI landing-site.** Cụm "draft 2026-07-15" thật sự sống ở 2 chỗ (grep repo-wide, loại history/letters): `memory-budget.json:65` + `memory-budget.json:90` — cả hai do commit `949ec33` (S129 disposition (iv)/(ii)) thêm vào. ⇒ ps1 = **NO-CHANGE**; errata-note blameless gửi hub trong adap-report. (Cùng class S134 hash-stale + S129 dương-giả-erratum: claim thư phải re-đo đĩa.) + +### (ii) memory-budget.json — dòng THẬT hiện tại +- **`:65`** (mfe `honest_caveats.token_estimate`) — TRÍCH đoạn mang bệnh: `…real-N when it matters = harness Read-truncation notice per hub 'do token that' method, draft 2026-07-15, adopt-on-broadcast…` → mang CẢ 2 bệnh: anchor NO-GO + đánh-đồng notice = "real-N". +- **`:90`** (harness_floor `_owner_override_note`) — TRÍCH đoạn mang bệnh: `…when a real figure is needed, MEASURE FRESH via harness Read-truncation notice N (hub 'do token that khong can API key' method, draft 2026-07-15, adopt-on-broadcast), do NOT store-and-trust…` → anchor NO-GO + "MEASURE FRESH via notice" ngầm coi notice = phép đo. +- **Note "tương-tự Hub": dòng THẬT = `:121`** (`_owner_ratified` trong `h24_cadence`) — hub nói :121 ĐÚNG, thư SE ghi :123 lệch 2 dòng. TRÍCH: `"_owner_ratified": "owner-decisions-15-07-2026 Q2 -- anh chot 6/15/3, 'tuong tu Hub'. HONEST-CAVEAT…hub explicitly said 'your numbers = your config…'. SE picked the same 6/15/3 as a DELIBERATE STARTING POINT…Re-tune after cycle-2…"`. + +### (iii) Sweep ngữ-nghĩa quanh đó (grep `real|measured|token` 2 file + liên quan) +Chỗ đánh-đồng số-cắt-ngắn = real-N/đã-đo: **CHỈ 2 site sống** = budget `:65` + `:90` (như trên). Các site khác sạch: ps1 `:25/:117/:227` honest-RANGE; `mfe-eval.ps1` honest-RANGE không-nhãn (S128 đã sweep); các file mang cụm còn lại = lịch-sử/thư đóng băng (`runs/2026-07-16-S127-…/owner-gated-proposals:44` · `broadcasts/outbox/…disposition…:17` · inbox reply chính nó) — KHÔNG sửa history; riêng `docs/governance/adap-reports/2026-07-16-…-san-su-that-nhan-da-do.md:19` ghi "ask do-token giữ MỞ" = trạng-thái NAY ĐÃ LẬT → cần **append** 1 dòng đính-chính (additive, không rewrite). + +### (iv) Dòng thay ĐỀ XUẤT (theo reply, để hmw áp) +- `:65` thay đoạn bệnh → `…khi cần số thật: dùng notice cắt-ngắn của Read làm CẬN-TRÊN bảo-toàn (heuristic ký-tự/2, đếm-thừa ~1.4-2x KHÔNG cố-định — KHÔNG phải real-N/đã-đo) → báo DẢI [sàn bytes/4 — trần tín-hiệu-cắt-ngắn], token thật nằm trong dải; per bản published 2026-07-15-Governance-phuong-phap-dem-token-tien-de-vong4 (content_sha256 e0bb5bbf)…` (giữ phần RANGE [bytes/4 .. bytes/3.0] + FIT bytes/3.0 nguyên vẹn — đã đúng). +- `:90` thay `MEASURE FRESH via harness Read-truncation notice N (hub…draft 2026-07-15, adopt-on-broadcast)` → `lấy DẢI TƯƠI [sàn char/4 — trần notice-cắt-ngắn (cận-trên ~1.4-2x không cố-định)] per bản published …tien-de-vong4 (e0bb5bbf); CẤM dán nhãn real/đã-đo cho một đầu dải`. +- `:121` `_owner_ratified` thay trọn → giữ 2 chốt-gốc + ratification + sửa cụm "tuong tu Hub": `owner-decisions-15-07-2026 Q2 (anh chot 6/15/3 cho SE) + hub H0-LEAD-AUDIT-DECISION-CAPTURE-2026-07-14.md:105 (6/15/3/3, 'doi = anh', 2026-07-14); ratified = anh mark cong reply 2026-07-16-ai_infra-to-se-reply-adap-dot-16-07 (e50a4bd0) ngay 2026-07-17. 6/15/3 = moc khoi-dau CO Y anh chon — KHONG phai muon so song cua hub: hub-counter DA GO per 85bf89ca, khong con moc so song. Re-tune sau chu-ky-2 CUA SE (deep-audit lan 2).` (ASCII-safe trong JSON — file này đang toàn ASCII-VN-không-dấu, giữ nhất quán.) + +## T8 — SESSION-START.MD:206 (F10 re-sync) + +- Vùng `:195-215` đã trích ở T1. **`:206` NGUYÊN VĂN hiện tại** = honest-caveat 6/15/3: `> 🟡 Honest-caveat mang theo khi báo hub: hub nói rõ "số của các em = config của các em; ĐỪNG chép 3 số này". SE chọn cùng 6/15/3 là điểm khởi-đầu anh CỐ Ý chọn, KHÔNG phải chép vô-thức. Chỉnh lại sau chu-kỳ-2 CỦA SE (deep-audit lần 2, xem .session-counter.json last_audit). Hub đã GỠ counter (bookend 07-15, sha 85bf89ca) → ví-dụ 6/15/3 "ở nguồn" = lịch-sử, KHÔNG còn mốc hub để so; delta hub hứa từ run-2 KHÔNG BAO GIỜ có (hub gỡ trước run-2) — chưa ai được bán câu "đã chứng minh hiệu-quả".` +- Grep toàn file `do-token|ratified|owner_ratified|e0bb5bbf|85bf89ca|reply`: **:206 là chỗ DUY NHẤT** nhắc chuyện này (match khác = generic: :76 chờ-anh-chọn, :148 marks, :158/:167 pending-decisions bucket). ⇒ KHÔNG có câu "CHỜ HUB pending" riêng trong session-start.md; trạng-thái treo sống ở HANDOFF carry + adap-report :19 (T7-iii/T13). +- **Re-sync đề xuất (additive 1 vế cuối :206):** `…— chưa ai được bán câu "đã chứng minh hiệu-quả". ✅ Ratified 2026-07-17: anh mark cổng reply e50a4bd0; canonical = memory-budget.json h24_cadence._owner_ratified (B1 — đọc wording sống ở đó, đừng chép lại đây).` — con-trỏ về key canonical, không nhân bản wording. + +## T9 — NON-JSON-ARGS 3 CHỐT (broadcast `6c2eb2b1`) + +### (i) Parse-guard hiện tại — TRÍCH `hmw.js:97-98,101` +- `:97` `// S4b — args có thể tới OBJECT hoặc JSON-STRING (harness đôi khi stringify object args) → normalize defensive` +- `:98` `const A = (typeof args === 'string') ? JSON.parse(args) : (args || {})` +- `:101` throw msg `…(đã thử JSON.parse nếu args bị stringify.)` +⇒ **Chốt-3 ĐÃ ĐÚNG VAI sẵn**: comment tự khai "harness đôi khi stringify" = lưới-cuối cho ca tầng-máy, khớp nguyên văn B6 mục 4.3. (Vị trí cũ :38 S110 → nay :97, file đã lớn thêm.) + +### (ii) Args hiện mang gì (tiền lệ S134 đo `runs/2026-07-17-S134-pe-luyke-tam-tinh/run.md`) +- Spec bơm qua **`args.taskList[].prompt`** (string DÀY nhét trong JSON args) — run.md `## taskList snapshot` giữ bản mirror trên đĩa; spec-v2 file cũng nằm sẵn `runs//spec-*.md` (lead ghi @H21①3). S134 hmw INV-2 `wf_58302bd5` + INV-3 `wf_97d6a582` chạy **0-garble 2/2 + 1/1** với prompt-embed ⇒ đường hiện tại CHẠY ĐƯỢC (n=3 lane gần nhất), nhưng args phình theo spec = đúng vector B6 mục 4.2 cảnh báo. +- `hmw.js:14-19` shape args {taskList, run, checkpointApproved…}; memory-pack cũng inject qua args (memory-budget.json:103 "hmw.js:124 args inject"). + +### (iii) Đánh giá 3 chốt +| Chốt B6 | Hiện trạng SE | Verdict | +|---|---|---| +| 1. args = object-thật | Lead practice truyền object (Workflow tool); **CHƯA có câu LUẬT tường minh "CẤM tự stringify"** trong fable-real.md/hmw.js — chỉ có comment mô tả | GAP nhỏ: thêm 1 dòng luật (điểm chèn: `hmw.js:97` comment + `fable-real.md` block args.run) | +| 2. args-MỎNG (dày → FILE) | **CONFLICT THẬT với H21:** `fable-real.md:31` nguyên văn: `4. **Worker thực-thi THEO spec** — spec bơm **QUA ARGS/prompt** (worker KHÔNG tự Read file).` — trong khi B6 4.2: "nội-dung dày để trong FILE; args chỉ mang đường-dẫn + vài cờ — worker tự Read tệp đó" | Use⟂mention: (a) engine-đắt lệnh-A/B = **Agent-tool prompt string** — KHÔNG đi qua tầng parse JSON-args của Workflow ⇒ B6-class không áp, prompt-embed GIỮ; (b) hmw fan-out = Workflow args JSON ⇒ B6 áp. **Reconcile đề xuất:** sửa `fable-real.md:31` → "spec bơm qua args = **CON-TRỎ** `runs//spec-*.md` (bản lead-đã-verify) + digest ngắn/AC-ids; worker Read **ĐÚNG file con-trỏ** (được phép per B6 chốt-2); CẤM tự lục file NGOÀI con-trỏ" — giữ nguyên intent gốc (worker không tự đoán nguồn), bỏ đúng phần xung đột. **Decision-point anh/lead** (đổi luật H21). | +| 3. giữ normalize = lưới-cuối | `:98` giữ nguyên, đúng vai | KHỚP — 0 việc | + +### (iv) Sổ SE — ca chết-non parse +`grep -rn "JSON Parse error|Unexpected identifier" docs/gotchas.md docs/changelog/sessions/ .claude/agent-memory/` = **RỖNG** ⇒ SE **CHƯA TỪNG ghi sổ** ca chết-non B6-class. Phân loại 3 ca cũ: S65/S73 = args-đến-dạng-STRING từ harness (guard `:98` cứu — KHÔNG chết-non) · S108 + #53×20 = return-garble (class KHÁC hẳn — sau khi agent đã chạy). ⇒ 3 chốt = phòng-ngừa forward + 1 luật thiếu + 1 reconcile; KHÔNG có nợ hồi tố. + +## T10 — VÒNG 4 GIẤC-NGỦ (broadcast `89e4d818`) + +### Khuôn SE hiện tại (`.claude/commands/sleep-recovery-memory-l2.md`, 125 dòng) +Map 1-1 với khuôn 4-vai hub B5 mục 2: +| Vai hub | SE (đã có TRƯỚC broadcast) | Cite | +|---|---|---| +| Máy đề-xuất (propose-only) | `harvest-curator` PROPOSE-ONLY, charter cấm-ghi | `:63-70` Phase 1 | +| Đầu-tàu chưng-cất | lead distill 4-field {VIỆC·KẾT-LUẬN·BÀI-HỌC·BẤT-NGỜ} + GỘP + reflection 3-5 | `:72-82` Phase 2 | +| Cổng đối-chiếu tất-định | coverage-diff DETERMINISTIC 5 token-class {surprise·guard·file:line·root-cause·gotcha#} LUÔN chạy + G-009 byte-scan mojibake | `:88-91` Phase 3a + `:101` Phase 4.3 | +| Cửa-duyệt độc-lập fidelity | `reviewer` gate keep-vs-drop, G-001 lead KHÔNG tự chấm | `:93-95` Phase 3b | +Marker chống-nén-2-lần: `distill-gen: N` refuse pass-2 (`:60` Phase 0.3 + `:118`) ✓ additive file-MỚI không đè (`:116`) ✓. ⇒ **3 câu hỏi B5 mục 4 = CÓ/CÓ/CÓ** — chi tiết số dưới. + +### Số đo đĩa 2026-07-17 +- 10/14 role có `archive/`; **29 verbatim + 13 gist**, tổng archive **946,133B (~924KB)**; L1 tổng 14 role ≈ 203KB. Gist phủ kỳ 2026-05 + 2026-06; **2026-07 verbatim CHƯA nén (còn tươi — đúng nguyên tắc tuổi)**. investigator-api archive rỗng (133B). +- `distill-gen` marker sống trong gist thật (cicd/impl-be/fe-designer/harvest…: gen-1; inv-cb 2026-06 = gen-2 tiền lệ guard). +- Mốc nén gần nhất: `last_sleep_at = "2026-07-10"` (`memory-budget.json:4`) — hôm nay 17-07 = **đúng 7 ngày → INFORM-7d đã fire** (S132 closeout subject có "sleep-INFORM-7d"). +- (a) Tầng thoát: CÓ, không phình một chiều (curate L1→L2 nhiều đợt S70/S80/S125 + sleep ≥2 đợt). (b) Cổng tất-định: CÓ nhưng **mức thủ-tục Grep-do-lead**, chưa script-hoá (hub = script grep 58-token + byte-scan). (c) Vai độc-lập chấm: CÓ (reviewer). + +### GAP so B5 (3 nâng-khuôn + 1 lệch-nguyên-tắc) +1. **Cross-file bleed** (bài hub trả giá 1 token thật): SE chưa có luật "khi nén NHIỀU tệp cùng lượt → grep TỪNG token trích-dẫn về ĐÚNG verbatim CỦA TỆP ĐÓ". Chèn Phase 3a. +2. **Tổng-hợp đầu tệp + grep-ngược:** SE `:77` reflection 3-5 entry nhưng KHÔNG buộc đặt ĐẦU tệp (hub: tổng-hợp = lớp nạp-nóng, viết TRƯỚC chi-tiết — owner-3-chốt) + KHÔNG có bước grep-ngược số/mốc trong tổng-hợp về phụ-lục/nguyên-bản (hub lesson 3: tổng-hợp = lớp trôi nhanh nhất). Chèn Phase 2 + 3a. +3. (optional) Script-hoá cổng 3a → nâng "cơ-chế" cột-7 checklist A. +4. ⭐ **Trigger 7-ngày = ngày-lịch — LỆCH khung mới** (B1 mục 3.4 cadence ngày-lịch KHÔNG vào chuẩn + row-4 bảng: "NÉN theo ngưỡng tích lũy, KHÔNG theo phiên"). Đề xuất: đổi INFORM-trigger `last_sleep_at ≥ 7d` → **ngưỡng tích lũy byte verbatim-chưa-gist** (đo được: tổng byte `.md` không có `.gist.md` tương ứng). Số ngưỡng = **owner đặt** (KHÔNG bịa); baseline đo hôm nay in kèm để anh chọn. +**Timing wave:** chỉ NÂNG SKILL (sửa command .md + trigger) — KHÔNG chạy nén trong wave (2026-07 còn tươi; chạy khi chạm ngưỡng anh đặt). + +## T11 — MAPPING 5-VÒNG (bảng A `f71c5b65`) + +| Vòng | Vai/cơ-chế SE thật | Nấc THẬT | Tự-verify cột-5 | +|---|---|---|---| +| 1. tooling+harvest | H1 `tooling-auditor` + H2 `harvest-curator`: MỞ `session-start.md:109-110,:123-124` (diff vs last) · ĐÓNG `session-end.md:100` (g) + `:57,:59` (d)(f) | runtime (nhiều lượt thật; gần nhất DỒN S127→S131 @`72f68d1`) | **FAIL hiện hành:** `git log --since 08:39 -- agent-memory/{tooling-auditor,harvest-curator}` = **0 vết** ⇒ 2 closeout gần nhất (S133 `e53a693` + S134 `99fc373`) KHÔNG spawn cặp — class E-011 "chạy tắt khi dồn/feature-session" TÁI DIỄN ngay sau vá. (d)-harvest lead tự làm ✓ nhưng (f)(g) monitor-gate skip. ⇒ đúng chỗ force-fire T3 + detector T4 cắn. | +| 2. soi-lead (view+omission) | 2 vai H24 + counter + `h24_cadence` 6/15/3 (`memory-budget.json:122-124`) — reply B4 câu-2: "thưa-số hợp lệ, chỉ cần vá GAP-1" | runtime (first-run S124 owner-triggered, 0-garble; 9+4 flag + 1 escalate) | Tính: counter=8, last light@3 → 5/6 **chưa OVERDUE; fire @counter 9** (deep 5/15 @18). Sau wire T1 + restart: phiên kế /tiep tick →9 ⇒ light OVERDUE fire NGAY ⇒ đề-xuất-2 S131 (light-run-now) gần-moot. | +| 3. bộ-ba đo→đề-xuất→kiểm trí nhớ | Mảnh CÓ: đo = `measure-agent-memory.ps1` + bảng-số `crystallized-backfill.ps1` @(c) · đề-xuất = `memory-archive-gate.ps1` DRY-PLAN + `memory-selfimprove-audit.ps1` (eval) · kiểm = `mfe-eval.ps1` coverage + reviewer/H2 gate · lead single-writer D9 ✓ | **PARTIAL — GAP THẬT, không gượng-map:** 3 mảnh chạy RỜI trong §L.b(c), KHÔNG có run-record 3-stage tuần-tự (cột-5 "mtime tăng dần" KHÔNG chạy được as-is); vai kiểm độc-lập chỉ có ở sleep (reviewer) — daily flush dựa H2 5-trục vốn đang bị skip (vòng-1) | Đề xuất rẻ: gói 3 script thành block "memory-triple đo→đề-xuất→kiểm" 3 dòng ghi session-log mỗi closeout chạy (c) — artifact-hoá tuần-tự, 0 vai mới | +| 4. giấc-ngủ distill | T10 — khuôn 4-vai ĐỦ + marker + additive | executed-file + runtime (13 gist 2 kỳ; last 2026-07-10) | Mốc nén đọc được (`budget.json:4`) + verbatim nguyên vẹn per-file (additive by-construction; hash-assert per-file = nâng-cấp đề xuất T10) | +| 5. sàn-sự-thật "đã-đo" | adap-report `…san-su-that-nhan-da-do.md` | executed (LUẬT + 2 site budget.json + câu cửa-duyệt) | **verified-pending DUY NHẤT = 4c** `reviewer.md:46` (`:17,:60,:80`: cần restart + 1 spawn-test) — **ĐO WAVE NÀY: điều kiện ĐÃ XẢY RA** — S129 commit 23:16 → S130+ = app-launch mới (restart implied) + reviewer spawned ≥2 lần S133/S134 (fable-real reviewer + precommit `wf_8bb5abee` PASS) ⇒ persona nạp lại chắc chắn. Caveat trung thực: câu `:46` được NẠP, việc nó được EXERCISE trong verdict chưa chứng riêng; nấc `verified` vẫn của AI_INFRA /adap-audit. Wave: append note flip vào adap-report. | + +## T12 — COMPLETENESS-GATE C + +- 5 vòng mức chức-năng: **4 CÓ + 1 PARTIAL** (vòng-3; vòng-1 CÓ-chức-năng nhưng kỷ-luật đứt khi dồn — tự-verify FAIL). Phép sàn 1-4: **2/4 PASS** (phép 3 union ✓, phép 4 ✓; phép 1 FAIL sống; phép 2 chưa-wire). +- **Kết luận: CHƯA ĐẠT hiện tại — "đạt-sau-wave" dự kiến 5/5 vòng + 4/4 phép sàn**, trong đó: phép 2 PASS ngay khi probe wire; phép 1 PASS-able sau restart + 1 chu-kỳ dừng–nối đo thật (KHÔNG khai trước khi đo); vòng-3 lên CÓ khi block memory-triple artifact-hoá; vòng-1 tự-verify về PASS nhờ force-fire T3 + detector T4 (cơ-chế thay trí-nhớ). n/a hợp lệ: KHÔNG có — SE đã adopt cadence + soi-lead nên gate ÁP ĐỦ (B2 §C). + +## T13 — CARRIES ĐÓNG ĐƯỢC + VIỆC ĐÃ HẸN + +**(i) Carry đóng nhờ 2 reply** (HANDOFF nay 332 dòng — mega-line ĐÃ TÁCH @S130 `cdb6279`, cảnh báo đề-bài stale; grep thẳng được): +| Carry (HANDOFF:7/:11/:15/:19) | Mục reply đóng | +|---|---| +| "CHỜ HUB reply-batch (i) `_owner_ratified`" | B3 mục 3 (2 chốt-gốc + wording + ratification tại cổng) → wave áp `:121`+`:206` xong là ĐÓNG | +| "do-token errata/ask" | B3 mục 2a: method published `e0bb5bbf` → **adap NGAY + đóng ask** (giữ pending = chờ nhầm bản); residual `:65/:90` vá wave | +| "(iii) seal-verify" | B3 mục 1 cặp-hai: tự-khớp (defer theo hub) — ĐÓNG, 0 việc mới | +| "phản-hồi closure-cadence/3-gap" | B4 trọn thư: CONFIRM 3 gap + khung SE vào chuẩn — ĐÓNG (việc còn lại = thực-thi wave) | +| "chữ-ký bản owner-sign 07-14" | B3 mục 4: git-anchor `e597497`, KHÔNG re-stamp — ĐÓNG | +| "carry-age — bằng-chứng S130 đủ đóng?" | KHÔNG thuộc 2 reply — để anh chốt riêng (ngoài wave) | + +**(ii) 4 việc SE hẹn hub — NGUYÊN VĂN `broadcasts/outbox/ai_infra/2026-07-17-se-to-ai_infra-h24-h22-van-hanh-3-gap.md:40-42`:** `1. Wire tick vào /tiep (+ cân nhắc tick-at-close idempotent) — vá trong repo SE, sẽ báo kết quả đo sau.` · `2. Spawn dồn H1+H2 re-report phủ S127→S131 + harvest hồi tố diary 2 vai H24 từ run S124 (VERIFY→APPEND) + ghi error-ledger cho 3 closeout chạy tắt.` · `3. H24 light-run owner-triggered ngay thay vì chờ counter 9.` (B4:24 đọc gộp thành 4 việc — tách harvest khỏi 2.) +- Việc 1 → **VÀO SPEC wave** (T1). Việc 2 → **ĐÃ XONG @S131-S132** `72f68d1` (dồn H1/H2 GAPS→CLOSED + seed 2 diary 3332B/3691B + E-011/AS-15) — wave chỉ còn BÁO-LẠI hub kèm số. Việc 3 → riêng, chờ anh (phân tích moot ở T11 vòng-2). + +**(iii) 2 đề-xuất S131 "CHỜ GẬT" — đã đủ tính là gật chưa?** HANDOFF:15 ghi CHỜ GẬT của ANH (không phải hub; outbox:38 "đã trình owner, chờ gật từng mục"). Phân tích để anh/lead chốt: đề-xuất-1 (wire tick) nay = khoản floor 3.1 của bản CHUẨN hub + anh gõ /adap-apply wave này ⇒ **gật-implied qua lệnh áp chuẩn** (defensible); đề-xuất-2 (light-run NGAY) = one-shot action KHÔNG nằm trong broadcast nào ⇒ /adap-apply KHÔNG tự cover — cần anh gật riêng HOẶC để OVERDUE @counter-9 tự kích phiên kế (gần-moot sau wire). **Không tự quyết — flag 2 dòng này trong spec cho anh.** + +--- + +# SPEC PROPOSE 3-MỤC (để lead verify + ghi `spec-*.md`, fable-real reviewer soi, hmw Opus 4.8 MAX implement) + +## ① Đề-bài gộp wave +Áp khung owner-chốt "đo rải · làm dồn · nợ hiển thị" (`3daf5ee4` 4-khoản floor + 2 detector) + checklist 5-vòng/8-phép (`f71c5b65`) + đóng residual do-token & `_owner_ratified` (`e50a4bd0`) + 3 chốt non-JSON-args (`6c2eb2b1`) + nâng khuôn giấc-ngủ (`89e4d818`) — mục tiêu đo được: SE qua completeness-gate C (hiện 2/4 phép sàn + 1 vòng PARTIAL → 4/4 + 5/5 sau wave, phép 1/7 đo sau restart). + +## ② Cách làm per-item (file đích + thay đổi cụ thể) +1. **Tick đa-điểm-vào** — (a) `.claude/governance/.session-counter.json` `_contract.tick` (:6): thêm OR-guard `if head==last_ticked_head OR session==last_ticked_session -> NO-OP`; (b) `tiep.md` chèn bước mới cuối §2 "TICK counter (contract §2.1.8 session-start — con-trỏ, không chép logic)"; (c) `pause.md` bước 3.5 (TRƯỚC commit bước 4 để tick nằm trong `wal: pause`); (d) `session-end.md` (j) thêm "(v) tick-at-close"; (e) `session-start.md` §2.1.8 thêm 1 dòng đơn-vị: "counter đếm nhãn-phiên S (phiên thường — SE chưa adopt session-logic `9234a7aa`; nếu adopt, đọc lại = phiên-LOGIC)". **DP-1 (anh):** OR-guard session-label (khuyên — 4 điểm tick, phép 7 vẫn +1) vs tick-chỉ-tiep+close (không đổi contract). **DP-2:** candidate-fix dangling-head (counter history :30/:35) gom wave này? (fire mỗi phiên-đầu-sau-squash). +2. **Dòng-nợ** — script MỚI `scripts/nhip-no-probe.ps1` (PS5.1 ASCII #30, NO-API, 0-mutation, exit-0-LUÔN): đọc counter+cadence → `light a/e deep b/f OVERDUE?`; scan `agent-memory/*/MEMORY.md` vs cap 25600 → `x over-cap`; port orphan DUAL-ACCEPT (2 dạng, port đúng `tiep.md:40-53`) → `y run-chua-gom`; in ĐÚNG 1 dòng; exception → `probe-loi (khong chan)`. Gọi tại 4 điểm: `/pause` bước 5 (+ý 5) · `/tiep` cuối §2 · session-start §2.1.8(e) · session-end (j)(i) — nâng dòng H24 hiện có thành dòng-nợ 3-vế. +3. **Force-fire bù** — `session-end.md` (j) "(vi)": `P=git log --format=%s ..HEAD | grep -c '^wal: pause'` (LUÔN so-sánh SỐ, né bẫy exit-code :175); `P>=1` HOẶC label `S-S` → coi như OVERDUE(light): in dòng-nợ + **INFORM-bắt-buộc + đề-xuất spawn cặp H24 ngay closeout**. **DP-3 (anh):** consent-gate (khớp luật `:94` + hẹn "owner-triggered", khai carve-out với hub) vs auto-run đúng chữ khung. +4. **Detector `H25-closeout-ritual`** — append `scripts/governance-detectors.ps1`: commit gần nhất match `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` → cửa-sổ `(closeout-liền-trước..commit]` → **union** `git log --name-only` → thiếu 1 trong {`docs/STATUS.md`, `docs/HANDOFF.md`, `docs/changelog/sessions/*` mới, `.claude/agent-memory/**`} → FLAG MED kể tên sổ. Fault-inject 3 ca (T4c): giả-closeout-1-file → FLAG · shape-99fc373 → PASS · tail-thiếu-HANDOFF-nhưng-union-có → KHÔNG FLAG. +5. **Detector `H25-role-notebook`** — cùng file: roster từ `.claude/agents/*.md` (trừ README); evidence-đã-chạy = `runs/*/sub--*.md` (prefix-map, UNMAPPED → in danh-sách không FLAG) OR diary đã tồn tại; vai đã-chạy thiếu `agent-memory//MEMORY.md` (byte>0) → FLAG MED. Fault-inject: cây tạm xoá 1 diary → FLAG; 14/14 → PASS. +6. **Residual do-token + ratified** — dòng thay GHI SẴN tại T7(iv)/T8: `memory-budget.json:65` + `:90` (re-anchor `e0bb5bbf` + ngữ-nghĩa DẢI cận-trên ~1.4–2×) + `:121` `_owner_ratified` bản mới (2 chốt-gốc + ratified cổng reply + bỏ "tuong tu Hub") + `session-start.md:206` vế additive trỏ key canonical. `crystallized-backfill.ps1` = **NO-CHANGE** (T7i: chưa từng chứa cụm — errata-note blameless cho hub). `docs/governance/adap-reports/2026-07-16-…-san-su-that…md` — 2 append additive: đóng-ask do-token (per `e0bb5bbf` published) + flip-note 4c (restart+spawn-test đã xảy S133/S134, nấc verified vẫn của hub). +7. **Non-JSON-args** — `hmw.js:97` comment + `fable-real.md` (block args.run): thêm câu LUẬT "args LUÔN object-thật — normalize `:98` = lưới-cuối, KHÔNG phải giấy phép stringify (per `6c2eb2b1`)". **DP-4 (anh):** `fable-real.md:31` reconcile → "spec bơm qua args = CON-TRỎ `runs//spec-*.md` + digest/AC-ids; worker Read ĐÚNG file con-trỏ; CẤM lục ngoài con-trỏ" (B6 chốt-2) — hay GIỮ prompt-embed (S134 tiền lệ 3/3 lane 0-garble, chưa từng chết-non — T9iv)? +8. **Sleep khuôn nâng (SKILL-only, KHÔNG chạy nén)** — `sleep-recovery-memory-l2.md`: Phase 3a + "cross-file bleed check: nén nhiều tệp cùng lượt → grep TỪNG token trích-dẫn về ĐÚNG verbatim CỦA TỆP ĐÓ"; Phase 2 + "TỔNG-HỢP 3-5 ý đặt ĐẦU tệp, viết TRƯỚC chi-tiết + grep-ngược mọi số/mốc trong tổng-hợp về phụ-lục/nguyên-bản"; **DP-5 (anh đặt số):** trigger INFORM 7-ngày (`:52` — ngày-lịch, LỆCH khung 3.4) → ngưỡng tích-lũy byte verbatim-chưa-gist (match theo PREFIX kỳ, không exact-filename); baseline đo 17-07: kỳ 2026-07 chưa nén ≈ **183KB/5 file** (tooling 46.1K · harvest 42.9K · reviewer 39.8K · inv-cb 31.0K · cicd 23.4K), raw un-gisted toàn kho ~374KB (caveat naming q-file). +9. **Báo-lại hub** — adap-report wave mới + email: nấc từng khoản + baseline T6 + errata mis-site crystallized-backfill + việc-2 done @S131-S132 + carve-out DP-3 nếu chọn consent. + +## ③ Checklist phân-rã hmw (worker Opus 4.8 MAX — anh chỉ định) + acceptance ĐO ĐƯỢC +**Vai:** governance `.md/.ps1/.json` KHÔNG khớp boundary implementer-backend (.NET-only)/implementer-frontend (FE-only) ⇒ 3 lane **role-less `model:'opus'`** (tiền-lệ feedback_workflow_fanout_reliability; hmw `tier:` hmw-only). ≥3 task ⇒ `args.run` BẮT BUỘC (Sàn-1). +- **LANE-A commands (items 1+2-wire+3):** đổi 5 file command + contract JSON. AC-A: `grep -c "tick" tiep.md pause.md session-end.md` ≥1 mỗi file (baseline 0/0/0-tick) · contract chứa OR-guard session · 4 điểm gọi `nhip-no-probe` · KHÔNG chép logic tick (chỉ con-trỏ §2.1.8, fault-check B1). +- **LANE-B scripts (items 2-script+4+5):** AC-B: `nhip-no-probe.ps1` chạy 2 lần output byte-y-hệt (phép 5) + `-RepoRoot` sai → in `probe-loi (khong chan)` exit-0 (phép 6) + baseline in `light 5/6 deep 5/15 | 0 over-cap | 1 run-chua-gom` (khớp số T6/T2 hôm nay) · 2 detector: inject-matrix 5 ca PASS/FLAG đúng chiều (ghi output vào sub-file lane) + happy-path repo thật 0 FLAG-mới ngoài expected + `exit 0` + 0 self-match. +- **LANE-C residual+doc+sleep (items 6+7+8):** AC-C: `grep -rn "draft 2026-07-15"` ngoài {runs/, broadcasts/, adap-reports history} = **0** (baseline 2 site sống) · `grep -c "e0bb5bbf" memory-budget.json` = 2 + `:121` chứa "e50a4bd0" · `:206` có vế Ratified-con-trỏ · adap-report 2 append · hmw.js+fable-real câu luật · sleep 2 chốt mới + trigger theo DP-5. +- **Sau merge (lead, KHÔNG lane):** RESTART Claude Code (pause.md:9 no-hot-reload) → phiên kế đo phép 7 (1 pause–tiep → counter 9, +1 đúng) + phép 1 re-đếm cửa-sổ mới + light-OVERDUE fire @9 (T11 vòng-2) → báo số cho hub (việc-1 đã hẹn "báo kết quả đo sau"). +**Mốc so baseline (T6, đo 17-07):** counter=8/S133-uncommitted · tick +3/9-nhãn/7-pause cửa-sổ (e9124fc..a6cd0a2] · orphan=1 (self-open S135) · sổ-vai 14/14 · closeout-union 3/3 · H1/H2 last-vết `72f68d1` · un-gisted-2026-07 ≈183KB. + +**CAVEAT chung:** KHÔNG chép số hub (n=2, ví-dụ 6-mã→4-tick); mọi số trên = SE tự đo, đơn-vị + cửa-sổ khai tại chỗ. "Đắt/rẻ" tương đối. 6 decision-point (DP-1..DP-5 + T13iii gật-implied) = anh/lead chốt, spec không tự quyết. + +STATUS: COMPLETE +