[CLAUDE] Docs: S146 closeout — session-model 3 owner-decision + hook 4-path + H24 auto
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m25s

Ap spec-apply-hub-s145-v2 (5 axis, governance-only: 0 prod-code, 0 migration).
Workflow S145 chet giua chung -> /tiep §4 relaunch-cat-gon wf_3d803740-41d 3/3 DONE.

Owner-decision @S146:
- session_ctx_kb = 64 TUONG-MINH (giu nguyen caveat ghost-wire: 0 reader)
- session-model: scaffold IDEMPOTENT (tach cap-SO vs tao-THU-MUC) · closed.md WIRE
  (session-end §6.3-bis) · V2 AUTO (go cong NGUOI, GIU cong NHIP 6/15/3)

Landed: C7 §N.8 predicate 4-ve · hook wal-flush.ps1 4 path (+.claude/sessions/)
· San-3 tin-hieu ⑤ + ORPHAN-L · D2 KIEM end-only · §L.c completeness-gate co RANG.
LIVE-VERIFY hook 4-path PASS repo THAT (da7ee8a). Session-model chay TRON VONG dau
tien: pause-S146 -> resume-S146 -> ORPHAN-L can so.

H24 force-fire (P=8 pause >= 1, luat auto moi): 2 vai + h24-audit -> 7 FLAG, va het:
- sweep-consent sot 6 site (h24-audit.md:4 = frontmatter description)
- closed.md wired-but-declared-unwired (ghost-wire CHIEU NGUOC)
- owner-decision [7] BI GHI DE do tai-dung slot-index -> mat uy-quyen push
3/3 vai lane-H24 garble #53: ghi-dia-SOM cuu tron, ghi-MUON mat trang.

So: orphan run-folder 3->0 · carry 14->20 (co tag [carry:*]) · +E-013 +E-014
error-ledger · +memory feedback_absence_looks_like_clean · .gitignore +lock file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-23 00:16:37 +07:00
parent a1e2416f37
commit 8b6df0a396
86 changed files with 5683 additions and 113 deletions

View File

@ -36,6 +36,8 @@ const VALID_ROLES = [
'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.
'tooling-harvest-audit', // +S145 C4/C4b (adap dot-11, owner-decision [2] TÁCH) — vai-KIỂM ĐỘC-LẬP vòng tooling/harvest: đọc OUTPUT H1(tooling-auditor)+H2(harvest-curator), no-self-exempt ≠ H1/H2. AUTO fire-after-measure @session-end §L.b(g-bis) (KHÁC trio/H24 consent-gated). Vai #1/3 round-KIỂM (h24-audit + sleep-audit land dần incremental).
'h24-audit', 'sleep-audit', // +S145 C4/C4b vai #2/3 + #3/3 round-KIỂM (owner-decision [2] TÁCH mỗi-vòng-1-con). h24-audit = KIỂM vòng soi-lead (đọc OUTPUT lead-view+lead-omission, no-self-exempt ≠ chúng, KHÔNG soi lead trực-tiếp) · sleep-audit = KIỂM vòng nén-ngủ (đọc /sleep-recovery gist+Fidelity, tự đo byte). AUTO fire-after-measure, propose-only, NO-OP nếu vòng không đo.
]
// ─── PA-2a — hằng-số kỳ-vọng model tier-2 (H23 model-at-spawn, owner-chốt O1 @S121 W2) ──
@ -111,9 +113,24 @@ if (!A || !Array.isArray(A.taskList) || A.taskList.length === 0) {
if (A.checkpointApproved !== true) {
throw new Error('hmw: checkpointApproved chưa set — em-main BÁO {số agent·vai·task} @inform rồi set args.checkpointApproved=true (guard = anti-accidental-fire).')
}
// S4 — số task THOẢI MÁI: harness chạy theo slot, dư tự queue, KHÔNG cap cứng (soft notice only).
if (A.taskList.length > 16) {
log(`hmw: taskList=${A.taskList.length} (>16) → harness queue theo slot (thoải mái, không cap cứng).`)
// ─── C8b LOUD-skip trần WIDTH (S144, adap đợt-11 · owner chốt O-7 2026-07-22) ──────────────
// LINEAGE (giữ vết, KHÔNG xoá — khuôn `auto-toan-vong:35` "đảo có chủ đích, chủ-ký, ngày, lý do"):
// BẢN CŨ: `if (len > 16) log(...)` + comment "số task THOẢI MÁI … KHÔNG cap cứng (soft notice only)".
// VÌ SAO ĐẢO: broadcast `depth-axis:40` đòi "clamp trần cứng + assert tổng-lượt ≤ trần";
// soft-notice = chạm trần vẫn chạy hết ⇒ không phải clamp. Owner chốt O-7 = **LOUD-skip**.
// VÌ SAO KHÔNG THROW: `depth-axis:43` nguyên văn "BỎ đào + báo RÕ (KHÔNG văng lỗi, không
// lặng-thầm bỏ)"; và :124-125 dưới đã tự khai throw per-lane có thể bị nuốt thành null =
// STOP-SILENT, tệ hơn. Reviewer R2 bắt bản spec v1 đòi THROW = tự mâu thuẫn → đã sửa.
// 🔸 Trần 16 = GIÁ TRỊ CŨ ĐÃ CÓ, không phải số mới AI đặt. Đổi số = quyền owner (O-7).
const WIDTH_CAP = 16
if (A.taskList.length > WIDTH_CAP) {
const dropped = A.taskList.slice(WIDTH_CAP)
const keptN = WIDTH_CAP
log(`hmw: 🔴 VƯỢT TRẦN WIDTH — taskList=${A.taskList.length} > trần=${WIDTH_CAP}.`)
log(`hmw: 🔴 CHẠY ${keptN} lane ĐẦU, BỎ ${dropped.length} lane CUỐI (LOUD-skip, KHÔNG throw — depth-axis:43).`)
log(`hmw: 🔴 LANE BỊ BỎ: ${dropped.map((t, k) => `[${WIDTH_CAP + k}]${(t && t.label) || (t && t.role) || '(no-label)'}`).join(' · ')}`)
log(`hmw: 🔴 Đây KHÔNG phải "đã chạy hết" — em-main PHẢI khai số bỏ trong report @P4.`)
A.taskList = A.taskList.slice(0, WIDTH_CAP)
}
// ─── STOP-HARD role-whitelist (DIRECTED 6c32df89 REC-3, 2026-07-13 · S115) ────
@ -220,6 +237,25 @@ const results = await parallel(A.taskList.map((t, i) => () => {
})
}))
// trả mảng kết quả (lọc null nếu agent lỗi/null — invalid-role đã STOP-HARD up-front; .filter(Boolean) chỉ lọc null-lane do agent lỗi runtime)
// về em main → P3 VERIFY + harvest + P4 checklist
// ─── C1 LANE-CHẾT-PHẢI-KÊU (S144, adap đợt-11 · repro NGAY trong run sinh ra nó) ───────────
// LINEAGE (giữ vết): BẢN CŨ = `return results.filter(Boolean)` + comment "lọc null nếu agent
// lỗi/null … .filter(Boolean) chỉ lọc null-lane do agent lỗi runtime" — tức code TỰ KHAI nó
// nuốt lane chết, mà KHÔNG phát tín hiệu nào ra ngoài.
// VÌ SAO SỬA — bằng chứng ngôi-thứ-nhất `wf_491c05a8-6dc` (2026-07-22): 3/5 lane chết vì cháy
// maxTurns; em-main nhận mảng 2 phần tử KHÔNG tín hiệu "chết", chỉ biết nhờ khối <failures> của
// HARNESS chứ không nhờ file này. Đúng `depth-cost:53` "Thử-rồi-chết ≠ chạy-rồi-sạch … tầng
// tổng-hợp sẽ viết 'tầng-2 không thêm gì' = củng-cố verdict bằng một tầng-2 không tồn tại".
// Falsifier hub `depth-cost:59` hỏi "tầng chết thì tầng sau thấy 'chết' hay 'sạch'?" — trước
// bản vá này SE trả lời: thấy SẠCH.
// 🔴 CỐ Ý KHÔNG throw: :124-125 đã khai per-lane throw bị nuốt thành null = STOP-SILENT.
// Fix = THÊM TÍN HIỆU, KHÔNG đổi shape trả về (P3 downstream giữ nguyên hợp đồng).
const deadIdx = results.map((r, i) => (r ? -1 : i)).filter(i => i >= 0)
if (deadIdx.length > 0) {
const nameOf = i => (A.taskList[i] && (A.taskList[i].label || A.taskList[i].role)) || '(no-label)'
log(`hmw: 🔴 ${deadIdx.length}/${results.length} lane CHẾT (null) — KHÔNG phải "sạch".`)
log(`hmw: 🔴 LANE CHẾT: ${deadIdx.map(i => `[${i}]${nameOf(i)}`).join(' · ')}`)
log(`hmw: 🔴 Lane chết = 0 findings, KHÔNG phải "không tìm thấy gì". Em-main @P3 PHẢI khai số chết trong report, và CẤM đọc mảng ngắn thành "đã phủ đủ".`)
log(`hmw: 🔴 Recovery: đọc ĐĨA trước (runs/<id>/sub-*.md) — lane có thể đã ghi xong mà return hỏng.`)
}
// về em main → P3 VERIFY + harvest + P4 checklist (shape GIỮ NGUYÊN: chỉ lane sống)
return results.filter(Boolean)

View File

@ -0,0 +1,82 @@
# C14 — Disposition TỪNG KHOẢN của 4 thư BINDING
> Vá O-3 (R2): v1 tuyên *"BINDING-floor 4 khoản"* rồi triển khai 2, **im 2** — đúng bệnh `meta-count` mà chính v1 dặn tránh ở `:169`.
> 🔴 **Đính chính ngay tiêu đề C14 trong spec v2:** spec ghi *"4 thư × 4 khoản = **16 dòng**"*. Sai — `goi-chot` có **5** khoản ⇒ đúng là **17 dòng**. Ép cho tròn số là đúng thứ mục này sinh ra để chặn.
**Trạng thái:** `ADOPT` (đã làm phiên này) · `ĐÃ-CÓ` (có sẵn + neo) · `BLOCKED` (chờ owner) · `DEFER` (có ngày/điều kiện) · `N-A` (+ lý do)
---
## Thư 1 — `spawn-label` (4 khoản)
| # | Khoản | Disposition | Neo / lý do |
|---|---|---|---|
| 1.1 | Đủ 4 thành-phần `{nhóm}{vai}{pha}{mã-phiên}` | **ADOPT** | Dogfood ngay phiên này: 3 lane review mang `Gate reviewer anchor s144` / `…scope…` / `…teeth…` |
| 1.2 | Vừa khung panel (~≤40 ký tự) | **ADOPT** | 3 label trên = 2425 ký tự, 0 bị cắt |
| 1.3 | Một khuôn nhất quán toàn repo | **DEFER — có điều kiện** | Áp *"từ phiên kế"* (`:51`); spawn TRƯỚC lúc chốt giữ nguyên làm vết, **không sửa lùi** (khuôn hub `:43`). 5 lane invest + 3 probe phiên này mang label cũ = **cố ý giữ** |
| 1.4 | Phủ MỌI loại spawn | **DEFER — cùng điều kiện 1.3** | Phiên này mới phủ 1/4 loại (cổng review). Còn: nhịp 2-đầu-phiên · việc-thường · workflow-task |
## Thư 2 — `harness-dong-du-vong` (4 khoản)
| # | Khoản | Disposition | Neo / lý do |
|---|---|---|---|
| 2.1 | Mỗi vòng-ĐO có ≥1 vai-KIỂM độc lập + **thách-CLEAN** | **BLOCKED-by-O-3** | Hiện chỉ vòng-3 (trio) có con KIỂM. Vòng tooling/harvest · soi-lead · nén-ngủ = **0 con soi**. `:51` cho phép **1 con kiểm nhiều vòng** ⇒ không phải đẻ vai mới, nhưng gộp-hay-tách = quyền anh |
| 2.2 | Audit = **propose-only**, lead single-writer | **ĐÃ-CÓ** | `hmw.js:185` `writeGuard` + G-015 + luật single-writer B3. 🔸 Caveat thật: whitelist `tools:` **KHÔNG** chặn ghi ở runtime (đo S143, nhân-chứng `reviewer` đã Write thật) ⇒ backstop THẬT = git-diff commit-gate, không phải thiếu-tool |
| 2.3 | **Tuần-tự trong-vòng**, song-song giữa-vòng | **ADOPT (luật) + BLOCKED (thực thi)** | 🔴 v1 **bỏ sót hoàn toàn** (R2 O-1). Luật nay ghi ở spec v2 P1-6/C4b: audit vòng X ở **invocation hmw SAU** con-đo vòng X, vì `hmw.js:175` `parallel()` không tuần-tự-hoá trong 1 invocation. Thực thi chờ 2.1 |
| 2.4 | Eval 2 phía (presence + **use**), DORMANT≠MISS, negative-control | **DEFER — cần máy mới** | SE hiện chỉ đo presence (MFE). Phía *use* cần script cross-session evidence-based. Theo **chính khoản 4 `goi-chot:52`**: mục này viết dạng **DỰ-ĐỊNH**, CHƯA có máy |
## Thư 3 — `depth-axis` (4 khoản F1F4)
| # | Khoản | Disposition | Neo / lý do |
|---|---|---|---|
| 3.1 | F1 owner-gated + posture + **clamp trần cứng** + assert tổng-lượt ≤ trần | **ADOPT phần WIDTH · BLOCKED phần SÂU** | Width: `hmw.js` C8b LOUD-skip + clamp thật, fault-inject 7/7. Trục SÂU (`assert tổng-lượt`) = **BLOCKED-by-O-2** (chưa có trục sâu để assert) |
| 3.2 | F2 đào điểm-nóng KHÔNG đào-tất; worker tầng-2 KHÔNG tổng-hợp | **N-A hiện tại** | SE **chưa có trục sâu** (grep `tầng-2\|deepen\|đào-vào-điểm` = 0 hit). Khoản này áp khi dựng trục sâu — BLOCKED-by-O-2 |
| 3.3 | F3 con **TƯƠI** + prompt-floor chống mỏ-neo | **N-A hiện tại + 🔴 NỢ ĐÃ LỘ** | Cùng lý do 3.2. 🔴 Nhưng bệnh mỏ-neo **đã fire thật** ở trục khác: refute của SE do **em-main** làm (đã đọc tầng-1) ⇒ không phải con tươi. Xem O-4a §⓪ spec v2 |
| 3.4 | F4 **cận-ngân-sách LOUD** | **ADOPT** | C8b: LOUD-skip, **không throw** (`:43` *"không văng lỗi"*), nêu đích danh lane bị bỏ |
## Thư 4 — `goi-chot-nam-khoan` (**5** khoản — không phải 4)
| # | Khoản | Hạng | Disposition | Neo / lý do |
|---|---|---|---|---|
| 4.1 | Lead default Opus; Fable qua **2 cửa owner-chủ-động** | quyết-định nội-bộ hub + *floor chuyển được* | **ĐÃ-CÓ (thực-tế) · BLOCKED (nhãn)** | `~/.claude/settings.json:11` đã pin `claude-opus-4-8[1m]` từ 07-20 ⇒ SE **đã ở trạng thái này**. Nhưng ô canonical `STATUS §Sub-agents` còn ghi "Fable 5" ⇒ **BLOCKED-by-O-5** (nhãn = quyền anh) |
| 4.2 | RETIRE resume cho mục-đích **giữ-model/giữ-context** | *floor chuyển được* | **ADOPT có phạm vi + KHẢO SÁT xong** | Đọc đúng: retire **chỉ** cho mục-đích đó; path-2 cứu #53 (in-session) **KHÔNG** bị retire (`:37`). Nghĩa vụ kèm (`:38/:66/:73`) → **C15 đã khảo sát**: Agent-tool resume an toàn; **lane workflow có `tier:` override thì PHƠI NHIỄM, chưa đo** |
| 4.3 | Điểm-dừng phải **RẺ** (ràng-buộc thiết-kế CỨNG) | **BINDING** | **ADOPT (luật) · DEFER (đo)** | Luật vào spec v2 P1-5 + luật-chung #5. 🔴 Đã lộ 1 vi phạm tiềm tàng: `pause.md:44` gọi `powershell.exe nhip-no-probe.ps1` **trong đường dừng**. Ngưỡng "rẻ" = **owner-SỐ**, chưa đặt ⇒ chưa chấm được |
| 4.4 | **Cửa-duyệt lời-hứa-máy** (hub chấm *"áp cho MỌI dự-án"*) | **BINDING** | **ADOPT** | C6: cổng-người đã cài + acceptance mới (positive-control bắt buộc, use⟂mention, đo-gate-không-đo-quét). Phần **máy quét tự động** = **DỰ-ĐỊNH, CHƯA có** — khai đúng theo chính khoản này |
| 4.5 | available-in-pool ≠ mandate | *floor chuyển được* | **ĐÃ-CÓ** | Khớp sẵn worker-tier-pin S124 + mark Active-High `RC-…20-42-01` (engine-đắt owner-gated). *"Agent ghi-nhận và báo, không tự adopt"* = đúng luật SE đang chạy |
---
## Tổng kết TỪNG DÒNG (17 khoản — **không** báo số tổng thay bảng)
🔴 **BẢN ĐẦU CỦA MỤC NÀY SAI, GIỮ VẾT — lead tự bắt trong vòng 1 phút sau khi ghi.**
Bản đầu liệt: ADOPT 6 · ĐÃ-CÓ 3 · ADOPT-luật/DEFER 2 · BLOCKED 3 · N-A 2 · DEFER 3 = **cộng ra 19**, rồi viết ngay dưới *"**17/17** có dòng"*.
**Nguyên nhân:** `3.1` bị đếm 2 lần (width ADOPT + sâu BLOCKED), `4.1` bị đếm 2 lần (thực-tế ĐÃ-CÓ + nhãn BLOCKED). 17 khoản → 19 lượt đếm.
**Vì sao đáng giữ vết:** đây là **`meta-count` fire ngay bên trong artifact dựng ra để chặn `meta-count`** — ca thứ 3 cùng lớp trong một phiên. Xoá đi là mất chứng nhân.
### Bảng đúng — đếm theo **KHOẢN**, khoản tách đôi ghi **trạng-thái kép** trên MỘT dòng
| # | Khoản | Disposition |
|---|---|---|
| 1.1 | label 4 thành-phần | ADOPT |
| 1.2 | vừa khung panel | ADOPT |
| 1.3 | khuôn nhất quán | DEFER (từ phiên kế) |
| 1.4 | phủ mọi loại spawn | DEFER (từ phiên kế) |
| 2.1 | vai-KIỂM mỗi vòng | BLOCKED (O-3) |
| 2.2 | propose-only | ĐÃ-CÓ |
| 2.3 | tuần-tự trong-vòng | **KÉP**: ADOPT-luật + BLOCKED-thực-thi (chờ 2.1) |
| 2.4 | eval 2 phía | DEFER (chưa có máy — khai dạng dự-định) |
| 3.1 | clamp trần | **KÉP**: ADOPT-width + BLOCKED-sâu (O-2) |
| 3.2 | đào điểm-nóng | N-A (chưa có trục sâu) |
| 3.3 | con TƯƠI chống mỏ-neo | N-A + 🔴 nợ đã lộ (O-4a) |
| 3.4 | cận-ngân-sách LOUD | ADOPT |
| 4.1 | lead default Opus | **KÉP**: ĐÃ-CÓ-thực-tế + BLOCKED-nhãn (O-5) |
| 4.2 | retire resume có phạm vi | ADOPT + khảo sát C15 xong |
| 4.3 | điểm-dừng rẻ | **KÉP**: ADOPT-luật + DEFER-đo (thiếu ngưỡng owner) |
| 4.4 | cửa lời-hứa-máy | ADOPT (cổng-người) + máy = dự-định |
| 4.5 | pool ≠ mandate | ĐÃ-CÓ |
**Đếm lại cho khớp:** 17 khoản = **4 KÉP** (2.3 · 3.1 · 4.1 · 4.3) + **13 đơn**.
Trong 13 đơn: ADOPT **4** (1.1 · 1.2 · 3.4 · 4.4) · ĐÃ-CÓ **2** (2.2 · 4.5) · ADOPT-có-khảo-sát **1** (4.2) · DEFER **3** (1.3 · 1.4 · 2.4) · BLOCKED **1** (2.1) · N-A **2** (3.2 · 3.3).
4 + 2 + 1 + 3 + 1 + 2 = **13** ✓ · 13 + 4 KÉP = **17**
**17/17 có dòng, 0 khoản bị im.** Con số nay **reconcile được** — và bài học là: **khoản tách đôi thì đếm theo khoản, đừng đếm theo trạng-thái**, nếu không tổng luôn phồng đúng bằng số khoản bị tách.

View File

@ -0,0 +1,48 @@
# C15 — SE có dựa vào model-override sống qua resume không?
> Nghĩa vụ `goi-chot:73` SELF-CHECK (khoản 2 **nửa sau**) — v1 bỏ sót, R2 bắt (O-2).
> Đo trên đĩa 2026-07-22 (S144). **Đây là KHẢO SÁT, chưa phải phép đo runtime.**
## Hai đường model, khác nhau về mức phơi nhiễm
| Đường | Model đến từ | Có override tại spawn? | Phơi nhiễm khi resume |
|---|---|---|---|
| **Agent-tool spawn** | `frontmatter` (17/17 vai pin `model: opus`) | **KHÔNG** | 🟢 **KHÔNG** — không có override nào để mất |
| **hmw lane spawn** | `hmw.js:234` `model: resolveModel(role, raw, t && t.tier, i)` | **CÓ** | 🔴 **CÓ** |
## 🟢 Ca em dùng HÔM NAY = an toàn
Path-2 `SendMessage-resume` em chạy 2 lần (H1 `tooling-auditor`, H2 `harvest-curator`) đều là **Agent-tool spawn**. Model của chúng đến từ frontmatter, **không có spawn-param override** ⇒ resume không thể làm rớt thứ vốn không tồn tại. **Không cần lo cho 2 ca này.**
## 🔴 Ca THẬT SỰ phơi nhiễm — và nó nằm ngay trong runbook
`docs/governance/fable-real-runbook.md:120` ghi resume là đường recovery cho **lane workflow**:
> *"**Resume lane garble/truncate** | **SendMessage-resume in-session** | gửi lại agent đã spawn (KHÔNG re-spawn mới) | Lane trả wrong-slice (#53)"*
Mà lane workflow **có** override tại spawn. Và chỗ duy nhất SE dùng override **KHÁC** frontmatter là `/fable-real` (`tier:'fable'` vs frontmatter `opus`).
**Chuỗi hỏng giả định:**
1. `/fable-real <vai>` phóng lane với `tier:'fable'` → H23 đo S126: spawn-param **THẮNG** frontmatter ⇒ lane chạy Fable ✓
2. Lane garble (#53) → runbook bảo `SendMessage-resume`
3. **Nếu override không sống qua resume** → lane hồi sinh chạy **Opus** (frontmatter), không phải Fable
4. Nó vẫn trả verdict bình thường ⇒ **không ai biết**
⇒ Anh gõ `/fable-real` để mua một lượt hạng-nhất, nhận về kết quả hạng-hai, **và không có tín hiệu nào**.
## Nấc trung thực
- **H23 @S126 đo spawn-param THẮNG frontmatter** — nhưng đo **tại lúc SPAWN**. Không ai đo **sau RESUME**.
- Hub tự khai `goi-chot:36` bằng chứng resume-rớt-override là **n=1, env-dependent**, từ MỘT sister ⇒ chưa chắc đúng ở env SE.
-**Chưa kết luận SE có hỏng.** Kết luận đúng nấc: **SE có bề mặt phơi nhiễm, và chưa bao giờ đo.**
## Đề xuất (owner-gated — em không tự chạy)
`goi-chot:38` *"Muốn giữ resume → **tự verify trên env mình trước**"*.
Phép đo rẻ: phóng 1 lane `/fable-real` với `tier:'fable'` → ép garble hoặc chủ động resume → đọc model resolved bằng `scripts/spawn-model-audit.ps1` (PA-2b đã có sẵn, so resolved-vs-expected).
**Trong lúc chưa đo** — 2 lựa chọn, cần anh chọn:
- **(a)** Runbook `:120` thêm cảnh báo: resume lane **có `tier:` override** thì phải re-check model sau resume, hoặc **re-spawn thay vì resume**.
- **(b)** Đo 1 lần rồi mới quyết.
🔸 Ranh: khoản 2 gói-chốt **KHÔNG retire** path-2 cho ca in-session (`goi-chot:37` giữ *"hội-thoại tiếp-diễn trong cùng lượt làm việc"*) ⇒ lưới #53 **giữ nguyên**. Đây chỉ là nghĩa vụ kèm theo mà v1 làm rơi.

View File

@ -0,0 +1,65 @@
# C4/C4b — Design-doc 3 vai-KIỂM (TÁCH · owner-decision [2] · chờ anh duyệt trước khi tạo file)
> Trạng thái: **PROPOSAL** — chưa tạo file nào. Anh duyệt / sửa 3 mục "Open" cuối rồi mới implement.
> Phiên: S145 (/tiep resume S144).
## 0. Neo (không chép — trỏ nguồn)
- **Broadcast** `harness-dong-du-vong` khoản ① (`:51`): *mỗi vòng-ĐO có ≥1 vai-KIỂM độc-lập* — đọc OUTPUT con-đo (KHÔNG re-chạy đo), spot-check tay + chủ động falsify ≥2 claim; vòng báo CLEAN phải có phép **thách-CLEAN** (re-check 1 lens sạch).
- **§4** broadcast: *hình-thức (số vai/tên/gộp-tách) — mỗi dự-án tự quyết*. → **owner-decision [2] = TÁCH** (mỗi vòng 1 con riêng, KHÔNG gộp).
- **C4:** propose-only · **no-self-exempt** (cấm tự-kiểm vòng mình đo — m-3 S139) · re-check ≥1 số **CÓ-THỂ-SAI**.
- **C4b:** tuần-tự trong-vòng — audit vòng X ở invocation **SAU** con-đo vòng X (bằng-chứng: 2 run-id khác + mtime(audit) > mtime(đo)).
## 1. Hiện trạng (C14:23) — chỉ vòng-3 (trio) có KIỂM
| Vòng-ĐO | Con-ĐO đang có | Vai-KIỂM hiện tại |
|---|---|---|
| trio (memory-triad) | `harness-eval` + `harness-refine` | ✅ `harness-audit` |
| **tooling / harvest** | `tooling-auditor` (H1) + `harvest-curator` (H2) | ❌ 0 |
| **soi-lead (H24)** | `lead-view-auditor` + `lead-omission-auditor` | ❌ 0 |
| **nén-ngủ (sleep)** | skill `/sleep-recovery-memory-l2` | ❌ 0 |
**3 vai-KIỂM mới** (TÁCH), roster **17 → 20**. (Chỉ đóng 3 vòng C14 nêu; KHÔNG tự suy "khung 5-vòng" đủ hay chưa — ngoài scope [2].)
## 2. Thiết-kế 3 vai
Mỗi con = **cặp mắt độc-lập** đọc OUTPUT con-đo, KHÔNG re-chạy đo. Mirror `harness-audit.md` (frontmatter `model: opus · effort: max · tools` read-only+rag · `memory: project · maxTurns ~18`).
| # | Tên (đề-xuất) | Vòng | Đọc OUTPUT của | Số **CÓ-THỂ-SAI** tự re-check (≥1) | thách-CLEAN | no-self-exempt |
|---|---|---|---|---|---|---|
| A | `tooling-harvest-audit` | tooling/harvest | H1 (4-mặt freshness) + H2 (5-trục harvest) return/propose | tự đếm `.claude/agents/*.md` đối-chứng roster-count H1 báo · HOẶC "N run harvested / M sub spawned" tự đếm run-folder vs agent-memory | H1 PASS / H2 GATE-PASS-0 → mở 1 skill "fresh" xem thật fresh · 1 sub "harvested" xem có delta APPEND thật | ≠ H1, ≠ H2 |
| B | `h24-audit` | soi-lead (H24) | `lead-view-auditor` + `lead-omission-auditor` FLAG-list + class-assign | tự đếm flag-count · HOẶC mở 1 FLAG cụ-thể (vd `view-stale`) đối-chứng source · HOẶC 1 dòng `class_repeat` tally trong `.session-counter.json` | 2 vai báo ÍT/0 FLAG → tự soi 1 surface tìm FLAG bị sót (CLEAN nguy nhất = "lead ổn" khi không ổn) | ≠ lead-view, ≠ lead-omission |
| C | `sleep-audit` | nén-ngủ | output `/sleep-recovery-memory-l2` (gist mới + Fidelity-gate verdict) | tự đo byte trước/sau đối-chứng claim giảm-byte · HOẶC đếm gist-file sinh ra | Fidelity 5P/0F → mở 1 `.gist.md` đối-chứng archive gốc (gist trung-thực hay mất chi-tiết load-bearing) | độc-lập với ai chạy sleep |
**Kỷ-luật chung mọi con:**
- **Propose-only** (trả TEXT, lead single-writer B3). 🔴 Backstop THẬT = **git-diff commit-gate**, KHÔNG phải thiếu-tool (`tools:` whitelist KHÔNG chặn write runtime — đo S143 `[carry:tools-whitelist-no-teeth]`).
- **PIN đích-danh** input (mirror harness-audit (i)): pin missing/rỗng ⇒ TỪ-CHỐI chấm, CẤM ĐẠT-ảo.
- Verdict per-claim ĐẠT/TRƯỢT + falsify-log HELD/BROKE + tự tái-dựng ≥1 số, KHÔNG tin lời-khai.
## 3. Cadence + consent (KHÔNG thêm đồng-hồ mới) — ✅ OWNER-CHỐT S145
- **Fire-after-measure, coupled:** mỗi KIỂM fire ở invocation **SAU** con-đo vòng mình vừa chạy phiên này (thoả C4b). 🔴 **KHÔNG thêm cadence-key** vào `memory-budget.json` — giống trio §2.1.9(h) ("trộn 2 đồng-hồ = hỏng cả hai"). Trigger = "vòng X vừa đo xong phiên này", không phải counter riêng.
- **AUTO sau đo (owner-chốt S145 — KHÔNG consent-gate):** vòng X đo xong ⇒ KIỂM tự chạy ngay, KHÔNG in dòng đề-xuất, KHÔNG chờ gật. Khác trio/H24 (2 cái đó consent-gated). 🔴 **Fail-safe bắt buộc:** nếu con-đo KHÔNG chạy phiên này (vd `/tiep` skip session-start) ⇒ pin input missing ⇒ KIỂM **NO-OP im-lặng** (không có gì để chấm), CẤM ĐẠT-ảo. Auto ≠ chạy-mù: không có measure thì không có audit.
## 4. Files khi implement (sau khi anh duyệt)
- 🆕 `.claude/agents/tooling-harvest-audit.md` · `h24-audit.md` · `sleep-audit.md` (mirror `harness-audit.md`)
- ✏️ `.claude/agents/README.md` — roster matrix + audit-map (17→20)
- ✏️ `docs/STATUS.md §Sub-agents` — count canonical (KHÔNG chép số ra chỗ khác, B1)
- ✏️ `.claude/commands/session-start.md` + `session-end.md` — thêm proposal-line + consent + WAL skip-trace (mirror §2.1.9 trio)
- ✅ fault-inject 2-chiều (no-self-exempt guard FLAG khi pin trùng vòng mình · thách-CLEAN có răng) + reviewer-gate trước commit
- 🔸 governance-detectors: cân-nhắc 1 detector INFORM "vòng-ĐO nào chưa có KIỂM chạy phiên gần nhất" (optional, defer)
## 5. ✅ OWNER-CHỐT S145 (3 quyết-định, AskUserQuestion)
1. **Tên 3 vai** → GIỮ đề-xuất: `tooling-harvest-audit` · `h24-audit` · `sleep-audit`.
2. **Consent-model****AUTO sau đo** (KHÔNG consent-gate) — xem §3 (kèm fail-safe NO-OP khi thiếu measure).
3. **Nhịp adopt****INCREMENTAL từng vòng** (§6 broadcast) — làm 1 vai → chạy thử 1 phiên → báo nấc → vai kế.
### Thứ-tự incremental (em chọn, anh veto được)
- **Vai #1 = `tooling-harvest-audit`** (làm TRƯỚC): vòng tooling/harvest chạy **mỗi phiên** (session-start + session-end) ⇒ auto-fire test được **nhanh nhất**.
- Vai #2 = `h24-audit` (vòng H24 chạy theo nhịp ~6 phiên) · Vai #3 = `sleep-audit` (sleep hiếm chạy).
### Wiring vai #1 (auto)
- Fire tại **session-end** SAU khi H1 (tooling-auditor) + H2 (harvest-curator) chốt (đó là chỗ GATE thật: H2 5-trục + H1 freshness). Đọc output 2 con → verdict + tự tái-dựng ≥1 số + thách-CLEAN. (session-start report nhẹ hơn — cân-nhắc phủ sau, defer.)
- Fail-safe: H1/H2 không chạy phiên đó ⇒ NO-OP im-lặng.

View File

@ -0,0 +1,63 @@
# C6 — Cửa-duyệt lời-hứa-máy (`goi-chot:52`)
> Vá theo R3 (v1 chấm **RỖNG HOÀN TOÀN**) + owner-decision "em solo".
> 🔴 **Đo lại độc lập, KHÔNG chép số reviewer** — và phép đo lại lật luôn con số reviewer đưa.
## 1. Ba con số, và vì sao cả hai con đầu đều SAI
| Phép đo | Kết quả | Verdict |
|---|---|---|
| **v1 (lead)** — literal `"máy sẽ"` trong `docs/governance/` | **0** | ❌ **Quá HẸP.** Tập-đo rỗng ⇒ acceptance đạt mà không cần sửa gì. R3 fault-inject: cắm câu-hứa-giả → **vẫn XANH**. |
| **R3 (reviewer)** — dòng chứa `(detector\|guard\|hook)` **và** `(chặn\|quét\|bắt\|đảm)` | **19** | ❌ **Quá LỎNG.** Lead tái lập được đúng 19, rồi soi ra **4/19 = 21% dương-giả substring**. |
| **Lead sau khi lọc** | **15 thô → phần lớn là ghi-chép lịch-sử** | ⚠️ Vẫn không phải mẫu-số dùng được |
### 🔴 4 dương-giả: `bắt buộc` (mandatory) bị pattern `bắt` (catch) nuốt
Ca điển hình `fable-real-runbook.md:440`:
> *"3 GAP-guard §K.C (**bắt buộc** CẢ 2 mode — pin để stamp CÓ NGHĨA)"*
`bắt buộc` = *mandatory*, **không phải** *catch*. Regex không phân biệt được.
🔴 **Đây là ca THỨ BA cùng lớp trong CÙNG một phiên:**
1. Lead: `grep -vE 'Designer|Snapshot'` nuốt migration `AddPeApprovedBudgetSnapshot` → đếm 66 thay vì 67
2. Lead: `^\|[[:space:]]*[0-9]+` trượt row in-đậm `| **64** |` → đọc "row cuối = Mig 11" thay vì Mig 66
3. **Reviewer**: `bắt` nuốt `bắt buộc` → mẫu-số phồng 21%
**Bộ lọc chuỗi thất bại trong im lặng, và nó không chừa ai** — kể cả vai được giao đi soi người khác.
### Vì sao 15 còn lại vẫn không dùng làm mẫu-số được
Đọc từng dòng: phần lớn là **bản ghi lịch sử** (`error-ledger:117` prevention · `:144` recurrence), **honest-caveat** (`harness-11-engine:289` *"FP-guard … blind-spot có-chủ-đích"*), hoặc **câu đã CÓ sẵn existence-proof** (`:267` *"C1 spec-compliance checker deterministic LIVE: `scripts/memory-selfimprove-audit.ps1`"* — nêu đích danh script ⇒ đã đạt `goi-chot:52`).
Số câu **thật sự vi phạm** (hứa năng lực mà không có máy) ⇒ **không xác định được bằng regex**, phải đọc bằng mắt.
## 2. Kết luận thiết kế — bỏ đo-số, chuyển sang đo-CỔNG
R3 nói đúng chỗ then chốt: `goi-chot:53`*"cửa này chặn **từ lúc VIẾT**, không đợi tới lúc trả nợ"*.
⇒ Deliverable thật **KHÔNG PHẢI** một lần quét, mà là **một câu hỏi thường-trực ở cửa review**.
**Cổng C6 (đây là thứ được cài):**
> 🔴 **Trước khi bất kỳ doc governance nào được ghi/sửa:** mọi câu khẳng định năng-lực-máy (*"X chặn/quét/bắt/đảm-nhiệm Y"*) phải mang **existence-proof TẠI CHỖ**:
> `{đường-dẫn máy}` + `{lệnh chạy được}` + `{test hoặc positive-control}`.
> Thiếu bất kỳ mảnh nào ⇒ **BẮT BUỘC viết dạng dự-định** (*"sẽ build — CHƯA có máy"*). **CẤM viết dạng đang-có.**
> Reviewer hỏi đúng một câu: **"mã nào làm việc đó?"**
**Ranh use ⟂ mention:** câu *định nghĩa* luật (như chính đoạn trên) hoặc *trích dẫn* anti-pattern **KHÔNG** tính vi phạm. Đây là cùng lớp `citation-trap` SE đã trả giá 3 đời/1 wave @S123 — discriminator là **enclosure**, không phải hình dạng.
## 3. Acceptance MỚI (thay bản literal đã chết)
| # | Tiêu chí | Cách chứng |
|---|---|---|
| a | **Positive-control BẮT BUỘC** | Cắm 1 câu-hứa-giả vào cây tạm → cổng **phải** nhặt ra. Không nhặt được = cổng mù, TRƯỢT |
| b | **Không dùng regex làm mẫu-số** | Đã chứng: literal → 0 (mù), loose-regex → 21% dương-giả. Mẫu-số = **danh sách liệt kê tường minh** |
| c | **use ⟂ mention tách bạch** | Câu định-nghĩa/trích-dẫn không tính vi phạm |
| d | **Đo GATE đã cài, không đo QUÉT xong** | `goi-chot:53` forward-looking |
| e | **Hồi-tố time-box** (P-2) | Floor `goi-chot:55` chỉ nói *"tài-liệu governance **mới**"*; hồi-tố toàn corpus vượt floor **và** đụng `goi-chot:44` (điểm-dừng phải rẻ) |
## 4. Khai thật (residual)
- **Cổng này là KỶ LUẬT NGƯỜI, không phải máy.** Hub tự khai cùng điều: `goi-chot:54` *"máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có** (khai residual)"*.
⇒ Theo đúng luật của chính khoản 4: **mục này viết dạng DỰ-ĐỊNH cho phần máy**, chỉ phần cổng-người là đang-có.
- **Chưa chạy sweep hồi-tố.** Lý do: floor chỉ đòi forward-looking; hồi-tố = P-2 time-box, chưa tới hạn.
- **Số câu vi phạm thật: CHƯA ĐẾM.** Không bịa một con số mà chính phép đo vừa chứng minh là không đáng tin.

View File

@ -0,0 +1,35 @@
# adap-đợt-11 — SYNTHESIS (🔴 RETRO-HARVEST @S146, không viết lúc chạy)
> **Khai ngay đầu:** viết **hồi-tố @S146 2026-07-22** trong lượt `/tiep`, khi sàn-3 `/tiep §0` bắt folder này là **orphan** (có `run.md`, thiếu `*-synthesis.md` phẳng).
> Mọi dòng dưới **truy từ đĩa trong chính folder này + `.claude/agents/`**. Chỗ nào **suy ra** ghi rõ. **KHÔNG bịa.**
## Kết luận 1 dòng
Đợt adap thứ 11 (**10 broadcast** hub, 07-18 → 07-21) đã chạy trọn: verify 2 tuyến → invest ensemble 5 lane → spec → review ensemble → spec-v2 → triển khai. **Sản-phẩm lớn nhất = 3 vai-KIỂM mới**, đưa roster **17 → 20**.
## Bằng chứng trên đĩa (đo lại @S146)
| vật | trạng thái |
|---|---|
| `spec-adap-dot-11-22-07-2026.md` + `-v2.md` | cả 2 tồn tại ⇒ S3 + S5 đã xong |
| `sub-investigator-codebase-{0,3}.md` | tồn tại ⇒ S2 invest ensemble đã chạy (RUN-TRACE mode) |
| `sub-reviewer-{0,1,2}.md` | tồn tại ⇒ S4 review ensemble đã chạy |
| `C4-design-3-vai-kiem.md` · `C6-cửa-lời-hứa-máy.md` · `C14-disposition-per-khoản.md` · `C15-resume-model-override.md` | 4 design-doc theo khoản |
| `.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md` | **cả 3 tồn tại** ⇒ S6 triển khai đã land |
| roster | **20** (`ls .claude/agents/*.md \| grep -v README \| wc -l`) |
## Cổng vào đáng giữ (verify 2 tuyến, S0)
- 10 thư kéo từ **`outbox/all`**, verify **2 tuyến độc lập**: (a) whole-file hash **10/10 byte-identical** · (b) `stamp_verify.py` **10/10 exit 0** — 0 tamper.
- 🔴 **Kẽ đã bịt (giá trị thật của đợt này):** `/check-email` bước 2 chỉ đọc `outbox/se`, **không nhắc `outbox/all`** — mà `outbox/all` (90 file) chính là **nguồn thật của cả 10 thư**. Không bịt thì cả đợt này vô hình.
- Dương-giả đã loại đúng: 51 file cũ (06-02 → 07-15) = lớp *đã-adopt-chưa-copy-body* (process-gap S101/S119), **không phải thư mới**.
## Kết quả cấu-trúc (owner-decision, đã land)
- **[2] TÁCH mỗi-vòng-1-con** (không gộp) ⇒ 3 vai-KIỂM độc lập: `tooling-harvest-audit` (vòng tooling/harvest) · `h24-audit` (vòng soi-lead) · `sleep-audit` (vòng nén-ngủ).
- Cả 3 mang cùng bất-biến: **no-self-exempt** (không tự kiểm vòng mình đo) · **propose-only, lead single-writer** · **fail-safe NO-OP khi pin missing** (cấm ĐẠT-ảo).
- **[1] `min_pending_shards` = 15** đã áp (toán-tử `-gt`).
## Guard fire THẬT (đáng giữ)
Lượt phóng đầu `wf_977c2690-5ce` **THROW đúng guard** `checkpointApproved chưa set`**0 agent, 0 token**. Lead @inform quy mô {5 agent · `investigator-codebase` · 10 broadcast / 5 lăng-kính} rồi mới set cờ, phóng lại `wf_491c05a8-6dc`. ⇒ anti-accidental-fire **có răng thật**, không phải chữ.
## Residual thật (KHÔNG đóng)
- `## Stages` trong `run.md` còn `[!] S2 · [ ] S3..S6`**stale**: S2S6 đều đã xong (bằng chứng bảng trên).
🔸 **Giữ nguyên, KHÔNG sửa ngược** — cùng lý do với `trio-first-run`: checkbox stale là **vết thật** của closeout bị cắt giữa chừng. Xoá vết = xoá đúng thứ retro-harvest sinh ra để ghi.
- Chỉ-thị anh lúc phóng — *"Nhớ chú ý đọc thật kỹ bọn mày rất hay sót"* — đã được thiết-kế đáp lại bằng **mỗi file ≥2 người đọc, lăng-kính KHÁC nhau**. Hiệu lực của phép đó **chưa có phép đo hậu-kiểm**; đừng đọc thành "đã chứng minh không sót".

View File

@ -0,0 +1,62 @@
# run: 2026-07-22-S144-adap-dot-11
- **Phiên:** S144 (2026-07-22) · **HEAD lúc phóng:** `d5656ab`
- **Lệnh anh gõ:** `/fable-clone invest & review` → spec-cách-làm-chi-tiết-checklist → `hmw` Opus 4.8 MAX triển khai
- **Engine:** LỆNH-B ensemble tier-2 (H21 per-invocation) · vai lượt-1 = `investigator-codebase` · lane pin `tier:'opus'`
- **Lead:** Opus 4.8 (owner-choice) · **HMW-mode ON**
- **Chỉ-thị anh, nguyên văn:** *"Nhớ chú ý đọc thật kỹ bọn mày rất hay sót."* → lane thiết-kế phủ **mỗi file ≥2 người đọc, lăng-kính KHÁC nhau**.
- **Anh chốt:** các câu hỏi treo *"đã bảo trả lời với Hub và đã adap broadcast rồi"* ⇒ đáp-án nằm TRONG 10 thư này, KHÔNG hỏi lại anh.
## Tiền-đề đã verify (đo tươi phiên này, không chép)
| Việc | Kết quả |
|---|---|
| `/check-email` STAGE-1 | 10 thư MỚI kéo từ `outbox/all` (07-18 → 07-21) |
| Tuyến (a) whole-file hash | **10/10 byte-identical** vs nguồn hub |
| Tuyến (b) `stamp_verify.py` | **10/10 exit 0** — 0 tamper, 0 WRONG-METHOD |
| Dương-giả đã loại | 51 file cũ (06-02 → 07-15) = lớp *đã-adopt-chưa-copy-body* (process-gap S101/S119), **KHÔNG phải thư mới** |
| Kẽ đã bịt | `/check-email` bước 2 chỉ ghi `outbox/se`; **`outbox/all` (90 file) không được nhắc** → nguồn thật của cả 10 thư này |
## 10 broadcast đợt-11 (input)
| # | id | B |
|---|---|---|
| 1 | `2026-07-18-Governance-spawn-label-panel-audit-khung` | 5.189 |
| 2 | `2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing` | 6.782 |
| 3 | `2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested` | 7.755 |
| 4 | `2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc` | 7.835 |
| 5 | `2026-07-19-Governance-goi-chot-owner-nam-khoan` | 12.320 |
| 6 | `2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side` | 7.249 |
| 7 | `2026-07-19-Governance-hub-tu-danh-gia-3-goc-va-chuyen-pha` | 9.194 |
| 8 | `2026-07-20-Governance-3-khoan-title-tier-posture-home-distill-params` | 6.521 |
| 9 | `2026-07-20-Governance-auto-toan-vong-distill-2-tang` | 6.274 |
| 10 | `2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval` | 9.540 |
**Tổng ~79 KB.** Thư mục: `broadcasts/inbox/<id>.md` (root = pending, chưa STAGE-2).
## taskList snapshot (lượt-1 — invest ensemble 5 lane, cùng vai `investigator-codebase`)
| lane | label | lăng-kính | file phụ-trách ĐỌC TRỌN |
|---|---|---|---|
| 1 | `lens-ensemble` | trục ENSEMBLE/routing/cost | #2 #3 #4 |
| 2 | `lens-eval-audit` | trục ĐO / audit-của-audit | #6 #7 #10 |
| 3 | `lens-distill-tier` | trục DISTILL / tier / spawn-label | #1 #8 #9 |
| 4 | `lens-owner-binding` | trục RÀNG-BUỘC: cái nào là LỆNH vs bàn | #5 + lướt cả 10 |
| 5 | `lens-anti-sot` | **cross-cut CHỐNG SÓT** — đọc CẢ 10, săn cái 4 lane kia dễ rơi | cả 10 |
⇒ mỗi file có **≥2 người đọc** (1 lane chuyên sâu + lane 4/5 cross-cut).
## Stages
- [x] S0 — `/check-email` kéo + verify 2 tuyến 10/10
- [x] S1 — scaffold run-folder + taskList snapshot (file này)
- [!] S2 — invest ensemble 5 lane (`/fable-clone investigator-codebase`) — **RUNNING** `wf_491c05a8-6dc`
- [ ] S3 — lead refute + synthesize → `spec-adap-dot-11-22-07-2026.md` (3 heading cố-định)
- [ ] S4 — review ensemble (`/fable-clone reviewer`) chấm spec
- [ ] S5 — lead áp fix → spec v2
- [ ] S6 — `hmw` Opus 4.8 MAX triển khai theo spec (bơm qua args)
## wf run-id
- S2: `wf_491c05a8-6dc` — 5 lane `investigator-codebase` tier:opus, RUN-TRACE mode.
- Lượt phóng đầu `wf_977c2690-5ce` **THROW đúng guard** `checkpointApproved chưa set` (anti-accidental-fire) — 0 agent, 0 token. Lead @inform quy mô {5 agent · investigator-codebase · 10 broadcast/5 lăng-kính} rồi set cờ, phóng lại.

View File

@ -0,0 +1,136 @@
# spec v2 — adap đợt-11 (10 broadcast AI_INFRA 2026-07-18 → 07-21)
> **Supersedes** `spec-adap-dot-11-22-07-2026.md` (v1). v1 **GIỮ NGUYÊN** làm vết audit — CẤM sửa.
> **Gate:** `/fable-clone reviewer` 3-lane `wf_301d3943-144` — **3/3 lane sạch, 0 rỗng**.
> R1 anchor `PASS_WITH_FIXES` (60 neo · 55 khớp · 4 MAJOR) · R2 scope `PASS_WITH_FIXES` (5 mục để lên PASS) · R3 teeth `PASS_WITH_FIXES` (bảng: **2 răng-thật · 4 nửa-răng · 3 nửa-rỗng · 4 rỗng**).
> 🔴 **Đính chính reviewer:** R3 §0 headline ghi "4 răng-thật · 4 nửa-răng · 5 rỗng" — **không khớp bảng của chính nó**. v2 dùng **số từ bảng** (2+4+3+4=13 ✓).
---
## ⓿ DISPOSITION — 20 finding, TỪNG DÒNG (luật-chung #3, cấm báo số tổng)
| # | Finding | Nguồn | Xử |
|---|---|---|---|
| M1 | `settings.json:11` **trỏ nhầm lãnh-thổ** — repo `.claude/settings.json` 330 B, dòng 11 = `]`, 0 hit `model\|opus\|fable`; sự thật ở `~/.claude/settings.json:11` (global, NGOÀI git) | R1 | ✅ **SỬA** — mọi neo ngoài-git mang đường-dẫn đầy đủ (§P4-1). Lead **tự re-verify**: repo 0 hit ✓, global dòng 11 = `"model": "claude-opus-4-8[1m]"` ✓ |
| M2 | `cost-lens:50` **cắt nửa dòng** — rơi *"Khoản ③ áp được cho MỌI nhà"* | R1+R2(O-4c) | ✅ **SỬA** — thêm P3-5 |
| M3 | C11 giẫm knob owner (`session-start.md:135` khai **DP-5 quyền owner cục-bộ**) | R1 | ✅ **SỬA** — thành **O-6**, gỡ khỏi tay em-main |
| M4 | Nhãn *"đo được"* (tool-use 21/23 vs 28/34/35) **0 phản-chứng trên đĩa** | R1 | ✅ **SỬA** — khai nguồn = khối `<failures>` in-session **KHÔNG lưu đĩa** ⇒ hạ nhãn xuống *"quan sát in-session, không tái-lập được"* |
| P-1 | C8 **sai trục + tự mâu thuẫn**: `depth-axis:40` trần áp **tổng-lượt trục SÂU**, spec ép lên `taskList.length` (**width**); và `depth-axis:43` nói *"**không văng lỗi**"* trong khi C8 đòi THROW — trái cả `spec-v1:53` cấm-throw | R2 | ✅ **SỬA** — tách C8a/C8b, **bỏ THROW** |
| P-2 | C6 sweep **hồi-tố toàn corpus** > floor `goi-chot:55` (*"tài-liệu governance **mới**"*) | R2 | ✅ **SỬA** — forward-looking bắt buộc; hồi-tố **time-box** |
| O-1 | `harness-dong-du-vong:46` **khoản ③ tuần-tự trong-vòng****0 dòng** trong v1 | R2 | ✅ **SỬA** — thành **P1-6** + C4b |
| O-2 | `goi-chot:38/:66/:73` **nửa sau khoản 2** — SE dùng resume **VÀ** dựa model-pin (`hmw.js:219`) ⇒ phải tự verify override sống qua resume | R2 | ✅ **SỬA** — thành **P4-6** |
| O-3 | khoản ② propose-only **không có dòng disposition** (dù `hmw.js:185` writeGuard nhiều khả năng đã đạt) | R2 | ✅ **SỬA** — bảng 4-dòng/thư-binding |
| O-4a | `hub-tu-danh-gia:27` *"điểm tự-chấm của lead phải để **NGOÀI mọi kênh sub với tới được**"* — 🔴 **FIRE ĐỎ NGAY RUN NÀY** | R2 | ✅ **NHẬN LỖI + SỬA** — xem ⓪ dưới |
| O-4b | `hub-tu-danh-gia:62` cite nửa dòng (nửa kia = *"dùng được ngay ở mọi nhà"*) | R2 | ✅ **SỬA** — P3-6 |
| O-4d | `depth-cost:52` bài-học-1 *"lệnh ép-full-power của owner phải khoá cả chiều MÁY"* | R2 | ✅ **SỬA** — neo vào C8b |
| O-4e | `auto:29-31`+`:46` instrument **tự làm tươi** số-đo-đóng-băng | R2 | ✅ **SỬA** — P2-2 thêm nhánh làm-tươi |
| G-1 | C8 chứa **SỐ** + **đổi CƠ CHẾ** = 2 cột owner (`eval:24`), chưa có trong O-1…O-5 | R2 | ✅ **SỬA****O-7** |
| G-2 | C12 ghi **posture TOGGLE** vào `CLAUDE.md` = stale-by-construction (`ultra-off.md:9` xoá marker) + đẻ **ghost-wire mới** | R2+R3 | ✅ **SỬA** — đổi sang **trỏ nơi tra**, không chép giá-trị |
| G-3 | `≤3 file/lane` là số **AI tự đặt** | R2 | ✅ **KHAI** — "AI-tự-đặt, đảo được", không gate |
| T-C6 | C6 **RỖNG HOÀN TOÀN** — literal `"máy sẽ"` trong `docs/governance/` = **0 hit**; họ-diễn-đạt cùng nghĩa = **19 hit NGOÀI tập-đo**; sweep rộng hơn **đã chạy** @wave-3 (3/3 sạch). Fault-inject: cắm câu-hứa-giả → **VẪN XANH** | R3 | ✅ **VIẾT LẠI** |
| T-C11 | C11 **BẤT-KHẢ-THI**`grep=0` buộc xoá luật owner đang GIỮ (`sleep-…l2.md:52`); fault-inject: đổi `ngày``chu-kỳ` → grep=0 → xanh, hành vi y nguyên | R3 | ✅ **VIẾT LẠI** — đo **hành vi**, không đo chữ |
| T-C7 | *"đo wall-clock, ghi số"* **PASS ở MỌI giá trị**; `pause.md:44` đã gọi `powershell.exe` **lọt khe** danh-mục-cấm | R3 | ✅ **VIẾT LẠI** |
| T-mix | C2/C3/C5/C9/C10/C13 nửa-răng/nửa-rỗng | R3 | ✅ **SIẾT** từng mục (§③) |
### ⓪ 🔴 LEAD NHẬN LỖI — anchor ngầm (O-4a), bằng chứng ngôi-thứ-nhất
`hub-tu-danh-gia:27`: *"điểm tự-chấm của lead phải để **NGOÀI mọi kênh sub với tới được** — 'không đưa vào pack' chưa đủ khi sub đọc sổ chung."*
v1 mang sẵn phán quyết của lead (*"SE hiện **FAIL rõ**"* `:67` · *"⇒ **FAIL**"* `:95` · *"→ **SE QUALIFY**"* `:18`) **rồi đưa chính file đó cho reviewer chấm**. Đó là anchor ngầm, và hub vừa phát đúng bài này 3 ngày trước.
**Sửa từ v2:** phán quyết của lead tách khỏi mệnh đề đo được. v2 viết *"đo được: `hmw.js:114-117` = soft-notice, không có clamp cứng"* thay vì *"SE FAIL rõ"*. Kết luận để reviewer tự rút.
🔸 **Khai thật:** vòng review v1 **đã bị anchor**, không sửa ngược được. 3 lane vẫn tìm ra 20 finding kể cả khi bị mồi — nhưng con số đó **không được đọc thành "anchor vô hại"**.
---
## ① TÍNH-NĂNG / ĐỀ-BÀI
Giữ nguyên v1 §① (R2 xác nhận **phân hạng 10/10 đúng ở mức THƯ, 0 ca phóng-đại tầng thư**), **cộng 3 đính chính**:
1. **M2/O-4b/O-4c** — 3 thư nhóm GHI-NHẬN vẫn chứa khoản *"dùng được ngay ở mọi nhà"*: `cost-lens:50` khoản ③ · `hub-tu-danh-gia:62` pattern eval-3-góc + 3 câu kiểm · `depth-cost:52` bài-học-1. **Xếp GHI-NHẬN không có nghĩa bỏ trắng** ⇒ P3-5, P3-6.
2. **O-3** — thư BINDING phải có bảng **4 dòng disposition/thư**, không tuyên "4 khoản" rồi làm 2.
3. **M4** — con số tool-use lane (21/23 vs 28/34/35) đến từ khối `<failures>` + phân tích transcript **in-session**, **KHÔNG lưu đĩa** ⇒ đọc là *quan sát không tái-lập*, không phải *phép đo*.
Ba phát hiện lật tiền-đề của v1 (0/12 mục treo · `hmw.js:225` · SE đi trước hub ở positive-control) — R1/R2/R3 **đều xác nhận**, giữ nguyên.
---
## ② CÁCH IMPLEMENT (delta so v1)
### P0 — giữ nguyên
**P0-1** `hmw.js` lane-chết-phải-kêu · **P0-2** luật đóng-gói-lane. R3 chấm **C1 = RĂNG THẬT**, giữ.
🔸 G-3: `≤3 file/lane` = **AI tự đặt, đảo được** (không phải số owner).
### P1 — thêm **P1-6** (vá O-1)
**P1-6. Tuần-tự trong-vòng** (`harness-dong-du-vong:46`, khoản ③ BINDING v1 bỏ sót)
- *"audit **chờ đúng con đo vòng mình xong** (chống chấm bản stale); các vòng khác nhau chạy song song thoải mái"*.
- 🔴 Vì sao KHÔNG vô hại: `hmw.js:175` `parallel()` **không tuần-tự-hoá trong 1 invocation**. Nếu C4 bơm `harness-audit` chung `taskList` với con-ĐO ⇒ audit chấm **bản rỗng** = đúng lỗ thư vá. v1 đã biết tính chất này (`:100`) mà không áp cùng kết luận.
- Cách: audit vòng X chạy ở **invocation hmw SAU** con-đo vòng X.
### P2 — sửa P2-1, mở rộng P2-2
**P2-1 (sửa P-1 + G-1 + O-4d).** Tách 2 trục, **BỎ THROW**:
- **(a) trục SÂU** — `assert tổng-lượt ≤ trần`; trần = **O-2 (owner)**.
- **(b) trục RỘNG** — `depth-axis:43` *"BỎ đào + báo RÕ (**không văng lỗi**, không lặng-thầm bỏ)"* ⇒ **LOUD-skip**, KHÔNG throw. Neo `depth-cost:52` *"cổng-ngân-sách tự hạ được = máy đè lệnh owner"* — SE có `/fable-real` = lệnh owner đích danh, cổng cứng ở fan-out là đúng lớp bệnh thư cảnh báo.
- Trần width hiện `hmw.js:115` = `16`**O-7**.
**P2-2 (thêm O-4e).** Bảng cost re-ground **+ nhánh tự-làm-tươi** (`auto:29-31`): khi chính bộ đo báo trôi quá ngưỡng % → đọc lại + cập nhật **ngay trong phiên**, hết vòng "ghi nhận → treo → bàn lại".
### P3 — thêm P3-5, P3-6; sửa P3-2, P3-3
**P3-5 (M2).** `cost-lens:50` khoản ③ — *"suggest **đúng 1 dòng** non-blocking rồi chạy luôn"*, hub khai *"áp được cho MỌI nhà"*.
**P3-6 (O-4b).** `hub-tu-danh-gia:62` pattern **eval-3-góc** (§1) + **3 câu kiểm** (§6) *"dùng được ngay ở mọi nhà"* — gồm cả câu tự soi anchor (§6 câu 2), thứ vừa fire đỏ ở ⓪.
**P3-2 (sửa M3/T-C11).** Distill trigger đếm-thật ⇒ chuyển thành **O-6** (owner) vì `sleep-…l2.md:52` khai *"INFORM 7-ngày **GIỮ** (quyền owner cục-bộ, B1 §3.4)"*. Em-main **KHÔNG** tự gỡ.
**P3-3 (sửa G-2).** discoverability-home: `CLAUDE.md` **trỏ NƠI tra** posture (marker + `/session-start`), **CẤM chép giá-trị ON/OFF**`ultra-off.md:9` xoá marker ⇒ chép giá-trị = sai ngay lượt sau.
### P4 — thêm P4-6
**P4-6 (O-2).** `goi-chot:73` SELF-CHECK: **grep call-site resume/continue** → SE có dựa vào model-override sống qua resume không? SE thoả tiền-đề (`hmw.js:219` bơm model tại spawn; path-2 `SendMessage-resume` dùng **2 lần hôm nay**). Nếu CÓ dựa ⇒ **đo 1 lần trên env SE** trước khi tiếp tục tin path-2.
🔴 Nếu override không sống qua resume, lane được cứu chạy **model khác mà không ai biết** — đúng `depth-cost:53` *"thử-rồi-chết ≠ chạy-rồi-sạch"*.
### 🔒 OWNER-GATED — **O-1…O-7** (thêm 2)
| # | Khoản |
|---|---|
| O-1 | Số `min_pending_shards` / `bulk_note_shards` |
| O-2 | Posture trục-sâu + **trần tổng-lượt** |
| O-3 | Gộp hay tách vai-KIỂM 3 vòng còn thiếu |
| O-4 | Ratify ranh `refine ⟂ lead-omission` |
| O-5 | Nhãn model-flip |
| **O-6** 🆕 | **Sleep-trigger 7-ngày → đếm-shard?**`sleep-…l2.md:52` khai owner **đang GIỮ** có chủ đích. `eval:24` xếp *"đổi cơ chế"* = **owner-quyết-LUẬT**. Em-main CẤM tự gỡ |
| **O-7** 🆕 | **Trần width + cơ chế** (`hmw.js:115` hiện `16`, soft) — số = owner-SỐ; throw-hay-LOUD-skip = owner-LUẬT |
---
## ③ CHECKLIST v2 — đã siết theo R3
**Ký hiệu:** 🦷 răng-thật · ⚙️ đã siết · 🔒 owner-gated
| # | Vai | Deliverable | Acceptance **có răng** |
|---|---|---|---|
| **C1** 🦷 | em-main | `hmw.js` lane-chết-kêu | **Fault-inject 2 CHIỀU**: null→**phải** chứa `lane CHẾT`; sạch→**không được** chứa. R3 chứng: bản giả `log()` vô-điều-kiện **trượt vế âm** ⇒ răng thật. `node --check` exit 0 |
| **C2** ⚙️ | em-main | Luật đóng-gói-lane | ❌ Bỏ `grep -c 'trần lượt'` (đếm chữ). ✅ Đo ở **run KẾ**: 0 lane chết. 🔸 **Khai hạn chế**: C1 chỉ biết `null`, **không phân biệt được NGUYÊN NHÂN** ⇒ "chết vì cháy lượt" hiện **chưa đo được** |
| **C3** ⚙️ | em-main | Khuôn label 4 thành-phần | ✅ **negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc **phải TRƯỢT**. ✅ **Neo artifact**: label xuất hiện trong `runs/<id>/run.md` (panel ephemeral, không grep được) |
| **C4** ⚙️ | `harness-audit` | Vai-KIỂM 3 vòng | ✅ **Cấm tự-kiểm vòng mình đo** (`m-3 no-self-exempt` S139). ✅ Con số re-check phải là số **CÓ THỂ SAI**, không phải hằng số hiển nhiên |
| **C4b** 🆕 | em-main | Tuần-tự trong-vòng (P1-6) | Audit vòng X ở **invocation hmw SAU** con-đo vòng X. Bằng chứng: 2 run-id khác nhau, mtime audit > mtime đo |
| **C5** ⚙️ | `test-specialist` | Eval phía DÙNG | ✅ **Thêm POSITIVE-control**: id THẬT đã biết → **phải** ra `APPLIED`. 🔴 Thiếu vế này thì matcher **chết** (luôn 0-hit) đạt neg-control **hoàn hảo** |
| **C6** ⚙️🔴 | `reviewer` | Cửa lời-hứa-máy | ❌ **BỎ** neo literal `"máy sẽ"` (tập-đo = **0/19**, fault-inject cắm câu giả **vẫn xanh**). ✅ Tập-đo = **danh sách liệt kê tường minh**, mẫu-số công bố (**19** đo được), mỗi câu 1 dòng disposition. ✅ **positive-control BẮT BUỘC**: cắm 1 câu-hứa-giả vào cây tạm → sweep **phải** nhặt ra. ✅ Tách **use ⟂ mention** (7 hit hiện có đều là *mention*). ✅ Đo **gate đã cài**, không đo *đã quét xong*`goi-chot:53` *"chặn từ lúc VIẾT"*. ✅ Hồi-tố **time-box** (P-2) |
| **C7** ⚙️ | em-main | Điểm-dừng rẻ | ❌ Bỏ *"ghi số"* (PASS ở mọi giá trị). ✅ **Ngưỡng = O-gated**. ✅ Tập cấm đổi từ liệt-kê sang **bất kỳ tiến-trình ngoài nào** trong đường dừng — 🔴 `pause.md:44` **đã** gọi `powershell.exe nhip-no-probe.ps1`, danh-mục cũ để nó lọt |
| **C8a** 🦷🔒 | em-main | Clamp **trục SÂU** | `assert tổng-lượt ≤ trần`. **BLOCKED-by-O-2** |
| **C8b** ⚙️🔒 | em-main | Ngân-sách **trục RỘNG** | **LOUD-skip**, ❌ **KHÔNG throw** (`depth-axis:43` *"không văng lỗi"*). Fault-inject 2 chiều. **BLOCKED-by-O-7** |
| **C9** ⚙️ | `investigator-codebase` | Bảng cost re-ground + nhánh làm-tươi | ✅ Gỡ mâu thuẫn: **khai thẳng** falsifier `depth-cost:59` **vẫn CHƯA đo được** (đơn-vị thứ ba); C9 chỉ đóng phần **re-ground roster 7→17** + wire nhánh tự-làm-tươi |
| **C10** ⚙️ | trio | Eval-của-eval 4 câu | ✅ Cỡ mẫu **≥3**, **ưu tiên thước CHƯA từng fault-inject** (loại S138/S143 đã xanh). ❌ Bỏ *"mỗi thước có verdict"* khỏi headline (100% do cấu trúc, `eval:32`) |
| **C11** ⚙️🔒 | — | Distill trigger | ❌ **BỎ** `grep 'ngày'=0` (rời-tập-đo: đổi `ngày``chu-kỳ` là xanh, hành vi y nguyên; và buộc xoá luật owner đang GIỮ). ✅ Đo **HÀNH VI**: {0 shard chưa-gist, 30 ngày} → trigger **phải IM**; {3 shard, 0 ngày} → **phải KÊU**. **BLOCKED-by-O-6** |
| **C12** ⚙️ | em-main | discoverability-home | ❌ **BỎ** *"CLAUDE.md có dòng nêu posture đang hiệu lực"* (stale-by-construction). ✅ `CLAUDE.md` **trỏ NƠI tra**. ✅ Phép thử **use**: 1 ca dương + 1 ca âm — phiên mới đọc file luật có nói **đúng** posture hiện hành không |
| **C13** ⚙️ | em-main | P4-1…P4-6 | ✅ *"Lý-do-không-làm"* phải kèm **phân loại** {owner-gated · defer-có-ngày · bác-bỏ-có-bằng-chứng} — nếu không = cửa thoát vô hạn |
| **C14** 🆕 | em-main | Bảng disposition per-thư-binding (O-3) | 4 thư BINDING × 4 khoản = **16 dòng**, mỗi dòng {ADOPT · ĐÃ-CÓ+neo · N-A+lý do}. **CẤM** tuyên "4 khoản" rồi làm 2 |
| **C15** 🆕 | em-main | Grep resume call-site (P4-6) | Liệt kê call-site `SendMessage`/resume + verdict 1 dòng *"SE có/không dựa vào model-override sống qua resume"*. Nếu CÓ → đo 1 lần env SE |
### 🔴 Luật chung (v1 giữ 6, thêm 3)
1. Existence-proof tại chỗ · 2. Đo trước khi tuyên · 3. Bảng disposition TỪNG DÒNG · 4. Ghi đĩa TRONG lúc làm · 5. Điểm-dừng phải rẻ · 6. Số của owner — O-1…**O-7** CẤM tự đặt.
7. 🆕 **Neo ngoài-git mang đường-dẫn đầy đủ** (M1 `neo-trỏ-nhầm-lãnh-thổ`).
8. 🆕 **Cite nguyên DÒNG, không cắt nửa** (M2/O-4b/O-4c — 3 ca cùng lớp trong 1 spec).
9. 🆕 **Phán quyết của lead KHÔNG đi vào file sub đọc được** (O-4a `hub-tu-danh-gia:27`).
### Trạng thái khoá
- **Chạy được ngay (không chờ owner):** C1 · C2 · C3 · C4 · C4b · C5 · C6 · C9 · C12 · C13 · C14 · C15
- **BLOCKED chờ owner:** C8a (O-2) · C8b (O-7) · C11 (O-6) · C7-ngưỡng · C10 (nếu đụng số)

View File

@ -0,0 +1,177 @@
# spec — adap đợt-11 (10 broadcast AI_INFRA 2026-07-18 → 07-21)
> **Run:** `2026-07-22-S144-adap-dot-11` · **Phiên:** S144 · **Lead:** Opus 4.8 · **HMW-mode ON**
> **Nguồn:** 10 thư `broadcasts/inbox/` — verify 2 tuyến **10/10 whole-file** + **10/10 `stamp_verify.py` exit 0**
> **Engine:** `/fable-clone investigator-codebase` 5-lane (`wf_491c05a8-6dc`) — **2/5 lane sống**, 3 lane chết vì `maxTurns:20`; lead đọc bù 6 thư trực tiếp ⇒ **phủ 10/10**
> **Pipeline H21:** engine propose → **lead verify + ghi (file này)** → reviewer chấm → worker thực-thi theo spec (bơm qua args)
---
## ① TÍNH-NĂNG / ĐỀ-BÀI
Áp 10 broadcast đợt-11 vào SOLUTION_ERP. Nội dung chia **4 hạng ràng buộc** (phân loại lấy từ chính dấu hiệu văn bản, không suy diễn):
| Hạng | Thư | Neo dấu hiệu |
|---|---|---|
| **BINDING-floor** | `spawn-label` (4 khoản) | `:22` *"Khung sàn (function-floor — 4 khoản bắt buộc)"* |
| **BINDING-floor** | `harness-dong-du-vong` (4 khoản) | `:42` *"Khung sàn (function-floor — 4 khoản)"* |
| **BINDING-floor** | `depth-axis` (4 khoản) | `:38`; điều-kiện `:20` *"Áp cho dự-án nào có ensemble đa-agent/đa-lăng-kính"***SE QUALIFY** |
| **BINDING-mixed** | `goi-chot-nam-khoan`**khoản 3 + 4** binding; khoản 1/2/5 = quyết-định nội-bộ hub + *"floor chuyển được"* | `:44-45`, `:52` vs `:29`, `:37`, `:59` |
| **KHUYẾN NGHỊ** | `eval-quality` · `auto-toan-vong` · `3-khoan` | `:13` *"Khung = sàn chức năng"* · `:43-47` · `:15` *"FYI + khung tự-áp"* |
| **GHI NHẬN** | `cost-lens` · `depth-cost` · `hub-tu-danh-gia` | `:50` · `:63` *"KHÔNG floor mới"* · `:62` *"điểm số và findings là của hub, không áp"* |
### 🔴 Phát hiện lật tiền-đề (phải đọc trước khi làm)
**(1) 0/12 mục treo của SE có đáp án TRỰC TIẾP trong 10 thư — nhưng phần lớn KHÔNG PHẢI NỢ.**
Đây là lỗi **phân loại** của SE, không phải hub im lặng:
| Nhóm | Số mục | Thực chất |
|---|---|---|
| Product-scope | 5 (UAT S133 · UAT S134 · D1 · VC-1/2/3 · close-sweep) | `grep UAT\|lũy kế\|phiếu\|migration` trên 10 thư = **0 hit**. Hub **KHÔNG BAO GIỜ** trả lời. Chờ **owner**. |
| Owner-quyết-SỐ | 3 (`pull_warn_days` · `session_ctx_kb` · hook-vs-budget-cap) | Hub nói **≥3 lần**: `eval:55` *"đừng chép số hub làm chuẩn"* · `auto:19` *"núm-số ngân sách vẫn thuộc chủ dự án"* · `eval:24` *"AI không tự quyết hai cột sau"*. ⇒ SE để trống = **TUÂN THỦ**. |
| Đã có đáp án `[ngoài-10]` | 3 | `58e28bae` (thư đã kéo đợt trước) |
| Còn nợ thật | 1 | ratify ranh `refine ⟂ lead-omission` |
🔴 **Hệ quả vận hành:** bảng "chờ" của SE phải **tách 2 cột chủ-thể** (chờ-owner ⟂ chờ-hub). Gộp chung tạo kỳ vọng sai — 5 mục sẽ nằm đó vĩnh viễn.
**(2) `hmw.js:225` = lỗ ĐANG CHẢY MÁU, và nó vừa cắn CHÍNH RUN NÀY.**
`return results.filter(Boolean)` — lane chết runtime → `null`**nuốt lặng**. Đối chiếu `depth-cost:53` *"Thử-rồi-chết ≠ chạy-rồi-sạch… tầng tổng-hợp sẽ viết 'tầng-2 không thêm gì' = củng-cố verdict bằng một tầng-2 không tồn tại"*.
**Bằng chứng sống hôm nay:** 3/5 lane chết, lead nhận mảng 2 phần tử **không tín hiệu chết**. Lead chỉ biết nhờ khối `<failures>` của **harness**, KHÔNG nhờ `hmw.js`. Falsifier `depth-cost:59` hỏi *"tầng chết thì tầng sau thấy 'chết' hay 'sạch'?"***SE trả lời: thấy SẠCH.**
**(3) SE đang ĐI TRƯỚC hub đúng một khoản** — `eval:31` *"Bộ kiểm-tra-đặc-tả của hub có 17/18 check không có positive-control"*; SE đã fault-inject 2 chiều nhiều đợt (13/13 @S138 · 7 ca @S143). Đây là chất liệu báo nấc **bằng SỐ**.
**(4) Bẫy over-apply khoản 2 gói-chốt.** `goi-chot:37` retire resume **chỉ cho mục-đích giữ-model/giữ-context**; *"hội-thoại tiếp-diễn trong cùng lượt làm việc"* **vẫn hợp lệ** ⇒ path-2 `SendMessage-resume` cứu #53 **KHÔNG bị retire**. Áp sai = mất lưới #53 (đã dùng 2 lần thành công hôm nay).
---
## ② CÁCH IMPLEMENT
### P0 — lỗ SỐNG (làm trước, có repro hôm nay)
**P0-1. `hmw.js` — lane chết phải KÊU, không được nuốt.**
- Thay `return results.filter(Boolean)` bằng: giữ nguyên mảng có `null`, **đếm** `died = results.filter(r => !r).length`; `died > 0``log()` **LOUD** dạng `hmw: 🔴 <died>/<total> lane CHẾT (null) — KHÔNG phải "sạch"` + trả kèm marker để P3 thấy.
- 🔴 **CẤM** sửa thành `throw``hmw.js:124-125` đã tự khai đúng: *"per-lane throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn"*.
- **Neo lineage:** ghi lý do tại chỗ wire (khuôn `auto:35` — giữ vết, thêm chú thích có ngày + chủ-ký).
**P0-2. `maxTurns` vs khối lượng lane — chống tái diễn.**
- Nguyên nhân đo được: `investigator-codebase` `maxTurns: 20`; lane sống dùng 21/23 tool-use, lane chết dùng 28/34/35 ⇒ **cháy lượt khi đang đọc, chưa tới bước ghi**.
- 🔴 Fix **KHÔNG** phải nâng `maxTurns` (sửa frontmatter cần restart). Fix = **kỷ luật đóng gói lane**: ≤3 file/lane + **ép ghi khung rỗng ở lượt đầu** rồi append, thay vì dặn "ghi sớm".
- Ghi thành luật trong `.claude/commands/fable-clone.md` (mục mới: *"đóng gói lane theo trần lượt"*).
### P1 — BINDING floor (bắt buộc adopt)
**P1-1. Spawn-label 4 khoản** (`spawn-label:22-27`)
- Khuôn SE (form tự quyết, function là sàn): `{Vòng-N|Core|Gate|WF} {vai} {pha/wave} s<N>` — vd `Vòng-3 harness-eval w1 @start s144`.
- Áp **MỌI** kênh spawn: `Agent` tool `description`, `hmw` `label`, monitor 2-đầu-phiên, cổng review.
- Áp **từ phiên kế** (`:51`); spawn trước đó giữ nguyên làm vết, **KHÔNG sửa lùi** (`:43` khuôn hub).
- 🔴 SE hiện **FAIL rõ**: label phiên này (`"Probe harness-eval alive"`, `"H1 tooling-freshness re-report"`) thiếu pha + mã phiên.
**P1-2. Đóng đủ vòng — mỗi vòng-ĐO có vai-KIỂM** (`harness-dong-du-vong:42-47`)
- Trạng thái SE: **chỉ vòng-3 (trio) có con KIỂM**. Vòng tooling/harvest (H1+H2), vòng soi-lead (2 vai H24), vòng nén-ngủ = **0 con soi**.
- 🔴 **Hình thức tự quyết** (`:51` *"gộp hay tách audit (1 con kiểm nhiều vòng hay mỗi vòng 1 con)"*) ⇒ SE **KHÔNG cần đẻ 3 vai mới**. Đề xuất: **1 vai `harness-audit` mở rộng phạm vi** sang cả 3 vòng còn lại (rẻ hơn, khớp `:51`).
- Bắt buộc kèm **thách-CLEAN** (`:44`): vòng nào báo sạch phải re-check mẫu ≥1 lens.
- Khoản ① *"có thể adopt dần từng vòng — báo nấc theo vòng"* (`:59`) ⇒ **làm dần được, không phải all-or-nothing**.
**P1-3. Eval 2 phía — thêm phía DÙNG** (`harness-dong-du-vong:47`)
- SE hiện chỉ đo **presence** (MFE coverage/FIT). Thiếu **use**: cross-session, evidence-based.
- Nhãn bắt buộc 3 loại: `APPLIED` · `DORMANT` (**≠ MISS**) · chờ judge.
- `%` phải mang caveat **NẰM TRONG payload**: *"% = FLOOR theo evidence, không phải ceiling"*.
- **negative-control BẮT BUỘC** trong test (bơm id giả → phải 0-hit; trả APPLIED = matcher rác = test đỏ).
**P1-4. Gói-chốt khoản 4 — cửa-duyệt lời-hứa-máy** (`goi-chot:52`, hub chấm *"áp cho MỌI dự-án"*)
- LUẬT: câu dạng *"máy sẽ chặn/quét/bắt X"* / *"detector đảm-nhiệm Y"***BẮT BUỘC existence-proof tại chỗ** {đường-dẫn máy + lệnh chạy được + test/positive-control}. Thiếu mảnh nào → **phải viết dạng dự-định**. **Cấm viết dạng đang-có.**
- Việc: sweep doc governance SE tìm câu hứa-máy chưa có proof → viết lại 1 trong 2 dạng.
- Reviewer hỏi đúng 1 câu: *"mã nào làm việc đó?"*
**P1-5. Gói-chốt khoản 3 — điểm dừng phải RẺ** (`goi-chot:44-46`, ràng buộc **thiết-kế CỨNG**)
- *"bất kỳ van/gate/phép-đo nào về sau cũng KHÔNG ĐƯỢC chặn hoặc làm chậm các cửa dừngnốicheckpoint"*.
- Việc: **audit `/pause` + `/tiep` + `/session-end`** — bước nặng (spawn agent · đo lớn · quét rộng) nằm trong đường pause = **vi phạm ranh** → dời về closeout.
- `goi-chot:74` *"Đo wall-clock một lần"*.
- 🔴 **Đè lên carry #7 và NEXT#3**: mọi hardening SE định thêm vào `/pause``/tiep` (kể cả hook chặn sub-write) phải qua câu hỏi *"có làm điểm dừng đắt lên không"* **TRƯỚC** khi bàn giá trị.
### P2 — BINDING-conditional (SE có ensemble ⇒ áp)
**P2-1. depth-axis 4 khoản** (`depth-axis:38-43`) — điểm sàn adopt `:55` = **có trục sâu bật-được + escape width-only**.
- F1 owner-gated + **clamp trần cứng** + assert tổng-lượt ≤ trần. 🔴 SE hiện `hmw.js:114-117` *"KHÔNG cap cứng (soft notice only)"***FAIL**.
- F2 đào điểm-nóng KHÔNG đào-tất; worker tầng-2 **KHÔNG** tổng-hợp.
- F3 con **TƯƠI** + prompt-floor *"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"*. 🔴 SE hiện refute do **em-main** làm (đã đọc tầng-1) = **dính mỏ-neo**.
- F4 **cận-ngân-sách LOUD** (bỏ đào + báo RÕ, không lặng-thầm).
- Tiên quyết: `depth-cost:54` *"Phát-hiện chưa-qua-kiểm không được quyền đè"* · `:55` *"con thử-phá tầng-2 phải THẤY vòng-1"*.
- 🔴 Ép cơ học: `hmw.js` `parallel()` **không tuần-tự-hoá** ⇒ tầng-2 = **invocation hmw THỨ HAI** (cùng bài trio S141).
**P2-2. Bảng cost re-ground** (`agents/README.md:249-257`)
- Đóng băng thời **7 sub-agent**, roster nay **17**; đơn-vị *"Effective tokens billed (after caching)"* = **đơn-vị THỨ BA**, không so được hub ⇒ falsifier `depth-cost:59` **CHƯA ĐO ĐƯỢC**.
- Việc: đo lại theo roster hiện hành + khai rõ đơn-vị + thêm cột *"đốt đơn-vị NÀO"* (`cost-lens:28`).
### P3 — khuyến nghị giá trị cao
**P3-1. Eval-của-eval, khung 4 câu** (`eval:15-24`) — áp cho **TỪNG thước** của SE (~10 script/detector):
(1) đã bắt lỗi THẬT chưa (trích dòng sổ)? · (2) đo **KẾT QUẢ** hay đếm **HOẠT ĐỘNG**? · (3) có **tự nói chuyện với mình** không (4 dạng: token-hoá-thạch · đếm-chính-dòng-định-nghĩa · nhãn-hứa-không-ép · chú-thích-tự-mâu-thuẫn)? · (4) bỏ thì **lỗi nào lọt**?
- Verdict `{GIỮ/SỬA/BỎ/THÊM}` + thẩm quyền `{AI-tự-sửa · owner-quyết-SỐ · owner-quyết-LUẬT}`.
- Gậy phân loại quý cho close-sweep: `eval:22` **dormant-đúng-thiết-kế** (máy báo khói) ⟂ **thừa-thật** (cấu trúc không thể kêu).
**P3-2. Distill trigger = ĐẾM VẬT THẬT, bỏ ngày-lịch** (`auto:21-27`)
- 🔴 SE hiện dùng **sleep-check 7 NGÀY** = đúng proxy giả hub vừa bác, **và trái chính mark Active-High `RC-…10-29-11`** của SE (age = false-proxy).
- Đổi sang đếm shard chưa-gist. Tham số hub (đính chính `3-khoan:47-51`): `min_pending_shards: 1` = **kích hoạt** · `bulk_note_shards: 10` = **báo-to****đếm SỐ FILE chưa-nén, KHÔNG phải số agent** (hub tự khai đã đọc nhầm 1 lần).
- 🔴 **Số là của owner** — SE đặt số riêng, không chép.
**P3-3. discoverability-home** (`3-khoan:31-41`)
- Phân biệt **implement-home** (máy chạy ở đâu) ⟂ **discoverability-home** (phiên mới NHÌN THẤY ở đâu).
- Chỉ-thị đổi hành vi mặc-định mọi phiên ⇒ **1 dòng vào file luật luôn-được-load + bump masthead**.
- Ứng dụng SE: `HMW-mode ON` là operating-posture — `CLAUDE.md` (file đọc đầu tiên) **có nói không?**
**P3-4. Masthead sweep** (`3-khoan:19-27`) — sửa body doc nào ⇒ **đọc lại dòng-1 + masthead của CHÍNH doc đó** trước khi tuyên sweep xong.
### P4 — đóng sổ / dọn (rẻ, làm kèm)
| # | Việc | Neo |
|---|---|---|
| P4-1 | **Nhãn model-flip**`settings.json:11` pin Opus từ 07-20, canonical `STATUS §Sub-agents` còn ghi "Fable 5" ⇒ outage-recipe `session-start.md:43` thành **no-op**. `goi-chot:28` nay cho luật đóng: boot-default = Opus, Fable qua **2 cửa owner-chủ-động** | `goi-chot:23-30` |
| P4-2 | **`/check-email` bước 2 thiếu `outbox/all`** — chỉ ghi `outbox/se`; `outbox/all` = **90 file**, nguồn thật của cả 10 thư đợt này | đo hôm nay |
| P4-3 | **Sổ garble** đĩa `×25` vs STATUS/HANDOFF `×23` + phiên này **+2** ⇒ `×27`. Chốt **CUỐI phiên** | `auto-memory:13` |
| P4-4 | H1 `F-1` `/sleep-recovery-memory-l2` 4 site lệch roster · `F-2` `ef-core-migration/SKILL.md` sót Mig 67 · `F-6` `.gitignore` thiếu `scheduled_tasks.lock` | S144 H1 |
| P4-5 | **Tách 2 cột chủ-thể** trong bảng chờ (chờ-owner ⟂ chờ-hub) | ① (1) |
### 🔒 OWNER-GATED — em KHÔNG tự quyết
| # | Khoản | Vì sao cần anh |
|---|---|---|
| O-1 | Số `min_pending_shards` / `bulk_note_shards` cho SE | `auto:19` núm-số thuộc chủ dự án |
| O-2 | Posture trục-sâu: trần+dial-down **hay** opt-in-off; giá trị clamp | `depth-axis:55` *"KHÔNG bắt buộc default nào"* |
| O-3 | Gộp hay tách vai-KIỂM cho 3 vòng còn thiếu | `harness-dong-du-vong:51` |
| O-4 | ratify ranh `refine ⟂ lead-omission` (đã wire TRƯỚC ratify) | mục treo #10, hub không trả |
| O-5 | Nhãn model-flip (P4-1) | quyền owner |
---
## ③ CHECKLIST (vai · deliverable · acceptance ĐO ĐƯỢC)
| # | Vai | Deliverable | Acceptance **ĐO ĐƯỢC** |
|---|---|---|---|
| C1 | em-main | `hmw.js` lane-chết-kêu (P0-1) | Fault-inject: ép 1 lane trả null → output **PHẢI** chứa chuỗi `lane CHẾT`; lane sạch → **KHÔNG** chứa. 2 chiều PASS. `node --check` exit 0 |
| C2 | em-main | Luật đóng-gói-lane vào `fable-clone.md` (P0-2) | `grep -c 'trần lượt'` ≥1; run kế ≤3 file/lane; **0 lane chết vì cháy lượt** |
| C3 | em-main | Khuôn label 4 thành-phần (P1-1) | Chọn ngẫu nhiên **3** task trên panel, **chỉ đọc label** nói được {ai·gì·nhịp·phiên} → 3/3. 0 label bị cắt chữ |
| C4 | em-main + `harness-audit` | Mở rộng vai-KIỂM sang 3 vòng (P1-2) | Mỗi vòng: chỉ ra **ai ngoài con đo** đã re-check **con số nào** bằng tay. Vòng báo CLEAN có ≥1 lens re-check mẫu |
| C5 | `test-specialist` | Eval phía DÙNG + negative-control (P1-3) | Bơm id giả → **0-hit** (trả APPLIED = test ĐỎ). Payload chứa literal `FLOOR theo evidence` |
| C6 | `reviewer` | Sweep lời-hứa-máy (P1-4) | Mọi câu *"máy sẽ…"* còn lại **đều** có {đường-dẫn + lệnh + positive-control}, hoặc đã đổi sang dạng dự-định. Đếm trước/sau |
| C7 | em-main | Audit điểm-dừng rẻ (P1-5) | **Đo wall-clock** `/pause` 1 lần, ghi số. 0 bước spawn-agent/quét-rộng trong đường pause |
| C8 | em-main | Clamp cứng + budget-gate `hmw.js` (P2-1) | `taskList.length > <trần>`**THROW**, không phải `log`. Fault-inject 2 chiều |
| C9 | `investigator-codebase` | Bảng cost re-ground (P2-2) | Số đo theo roster **hiện hành** (không phải 7); cột đơn-vị hiện diện; trả lời được falsifier `depth-cost:59` |
| C10 | `harness-eval` + `harness-refine` + `harness-audit` | Eval-của-eval 4 câu (P3-1) | Mỗi thước có verdict + cột thẩm-quyền. **Phép thử 2**: bịa input sai cho 1 detector bất kỳ → nó **ĐỎ**. Không đỏ = xanh-vì-mù |
| C11 | em-main | Distill trigger đếm-thật (P3-2) | `grep 'ngày\|7 day'` trong trigger = **0**; trigger đọc số shard. Lineage retire cũ **giữ vết** + chú thích có ngày |
| C12 | em-main | discoverability-home + masthead (P3-3/4) | `CLAUDE.md` có dòng nêu posture đang hiệu lực. Doc governance sửa body → dòng-1 khớp |
| C13 | em-main | P4-1…P4-5 | Từng mục có diff hoặc lý-do-không-làm. **CẤM** báo số tổng thay bảng từng dòng (bài `meta-count` S119) |
### 🔴 Luật chung áp cho MỌI mục
1. **Existence-proof tại chỗ** (P1-4) áp cho chính spec này: mục nào nói "máy sẽ bắt" mà chưa có máy → viết **dự-định**.
2. **Đo trước khi tuyên** — mọi số trong report phải re-đo, cấm chép từ spec.
3. **Bảng disposition TỪNG DÒNG**, không báo số tổng (`meta-count blind-spot`).
4. **Ghi đĩa TRONG lúc làm**; return chỉ là bản sao.
5. **Điểm-dừng phải rẻ** (`goi-chot:44`) — đè lên mọi đề xuất thêm việc.
6. **Số của owner** — O-1…O-5 **CẤM** tự đặt.
### Nấc báo hub (sau khi xong)
6/10 thư đòi `/adap-apply` + báo nấc per-khoản `sent→ACK→agreed→executed→verified`.
🔴 **Bất-đối-xứng đáng ghi:** `goi-chot-nam-khoan`**thư binding nhất****KHÔNG** có mục "Nấc adopt", **0** câu `/adap-apply`. Báo nấc cho nó = tốt nhưng **không có mandate văn bản**; đừng để bảng nấc lệch vì chuyện này.

View File

@ -0,0 +1,175 @@
# sub-investigator-codebase-0 — LANE 1 "lens-ensemble" (S144 adap đợt-11)
> Lăng-kính: **TRỤC ENSEMBLE** — chi phí · khan hiếm · routing · trục-độ-sâu · deepen-on-contested · sơ-đồ-thực.
> 3 file đọc TRỌN (không lướt). Mọi claim neo `file:line`. Ghi đĩa TRONG lúc làm (chống #53).
**Ký hiệu 3 thư:**
- **[A] depth-axis** = `broadcasts/inbox/2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested.md` · sha `f05eba5b…`
- **[B] depth-cost-update** = `broadcasts/inbox/2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc.md` · sha `294be326…`
- **[C] cost-lens** = `broadcasts/inbox/2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing.md` · sha `0a03b2c8…`
**Trạng-thái adopt hiện tại:** `grep -rn "0a03b2c8|f05eba5b|294be326"` toàn repo (trừ chính 3 file inbox) = **0 hit****CẢ 3 CHƯA ADOPT/CHƯA STAMP**. `broadcasts/_index.md` (tail) — outbox mới nhất = `2026-07-22-…errata-bao-nac-wave-dot-9-10`, **0 row** cho cụm ensemble.
---
## CÂU 1 — Mỗi thư ĐÒI SE LÀM GÌ (phân (a) floor · (b) khuyến nghị · (c) thông tin)
### [A] depth-axis — **THƯ DUY NHẤT MANG FLOOR**
**Điều-kiện kích-hoạt (A:20):** *"Áp cho dự-án nào có **ensemble đa-agent / đa-lăng-kính** (nhiều model/nhiều góc nhìn chạy song song rồi tổng-hợp). Không có ensemble → FYI, chưa cần áp."*
**SE QUALIFY**`.claude/commands/fable-clone.md:15` ("ENSEMBLE tier-2-mạnh-nhất = N lane đa-lăng-kính CÙNG 1 VAI (qua HMW `parallel`) + em-main refute + synthesize") + `.claude/workflows/hmw.js:175` (`await parallel(A.taskList.map(...))`). ⇒ **floor A ÁP CHO SE, không né được bằng "không có ensemble"**.
**(a) LỆNH / floor bắt buộc** — `A:38` heading *"## 3. Khung sàn (function-floor — 4 khoản)"*:
| # | Neo | Nội dung sàn |
|---|---|---|
| F1 | `A:40` | Trục sâu = **owner-gated, posture tự-chọn**; **"tắt-trục-sâu = escape về chiều-rộng LUÔN còn" (không khoá cứng)**; **"clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần"** |
| F2 | `A:41` | **"Đào-vào-điểm-tranh-cãi, KHÔNG đào-tất"** — worker tầng-2 nhắm điểm nóng (bị-phá/bỏ-sót/mâu-thuẫn) + nhận lời-thử-phá làm bản-đồ, **KHÔNG tổng-hợp** |
| F3 | `A:42` | **Chống-mỏ-neo tường-minh** — worker tầng-2 = con **TƯƠI**, prompt-floor **"đồng-ý-lại=0-điểm"**; tầng-2 REFUTE-có-evidence **đè** tầng-1; tầng-2-paraphrase = **0-tín-hiệu** |
| F4 | `A:43` | **Cận-ngân-sách LOUD** — vượt ngân-sách trước bước đào → **BỎ đào + báo RÕ** (không văng lỗi, không lặng-thầm bỏ), trả kết-quả chiều-rộng |
- **Điểm sàn adopt (A:55):** *"điểm sàn adopt = có trục sâu **bật-được** + có **escape width-only** (không khoá cứng), **KHÔNG bắt buộc default nào**"*.
- **Quy-trình (A:55):** *"Pull bằng quy trình thường (`/adap-apply`), tự báo nấc trong report-back định kỳ."*
**(b) khuyến nghị (form, KHÔNG floor):**
- `A:28-31` — 2 bước THÊM **SAU** lượt propose + thử-phá, **"KHÔNG đụng lượt cũ"**: **Đào (Deepen)** k worker TƯƠI + **Thử-phá-2** + **Tổng-hợp depth-aware**.
- `A:29` — 3 lăng-kính đào gợi ý: **truy-bằng-chứng · mô-hình-đối · săn-ca-biên**.
- `A:34` — posture của chính hub: *"AI_INFRA chọn mặc-định TRẦN (sâu+rộng nhất) + dial-down theo chủ-đề + lệnh MAX khoá trần"*; *"Dự-án e-ngại cost → chọn opt-in-off"*.
- `A:35`**"Tuyến-tính, KHÔNG nhiều-vòng"** (vòng 2-3 bão-hoà + trôi-đề + phá mất tính độc-lập).
- `A:47`*"Số worker đào, tên 3 lăng-kính, cách nhắm điểm-nóng, có cấp quyền đọc-file cho worker đào hay chỉ-pack — mỗi dự-án tự quyết theo engine mình."*
**(c) chỉ thông tin:**
- `A:22-24` — vấn-đề ensemble đơn-trục.
- `A:59` honest-status: engine hub **"đã SHIPPED + máy-verify"** + qua rà-soát độc-lập; **chứng-minh runtime + bảng-cost thực-đo "đang tiến-hành"***"PATTERN + code đã chín để bạn đọc/áp; số-cost-thực-đo sẽ ra ở bản `update` sau."*
### [B] depth-cost-update — **KHÔNG floor**
- `B:20`*"Không floor mới; FYI-số + bài học."* · `B:63`*"FYI-số + bài-học — KHÔNG floor mới, không bắt làm gì."*
- **(b) khuyến nghị:** `B:63` *"Dự-án có ensemble: đối-chiếu bảng cost của mình theo kiểm-nhanh §4; 4 bài học §3 đáng soi lại pipeline nhiều-tầng của bạn."* + 3 bài học số `B:36-38` + 4 bài vá `B:52-55`.
- **(a) quy-trình:** `B:63` *"Pull `/adap-apply`, báo nấc thường-lệ."*
- **(c) thông tin:** bảng số `B:26-31`, provenance `B:33`, đấu tay-đôi n=1 `B:42-46`.
### [C] cost-lens — **KHÔNG floor**
- `C:20`*"Cả 3 khoản = chia-sẻ cách-làm, **KHÔNG floor mới**."* · `C:50`*"FYI owner-side — KHÔNG floor, không bắt làm gì."*
- **(b) khuyến nghị:**
-`C:28` *"bảng cost của bạn nên có thêm cột **"đốt đơn-vị NÀO"** bên cạnh "bao nhiêu""*.
-`C:32-35` heuristic routing: *"**việc mới để chế-độ thật · fix cái cũ để model ảo**"* — `C:37` khai rõ *"Là heuristic khởi-điểm, **không phải luật**"*.
-`C:44` pattern chốt-giữa: *"lệnh gõ đích-danh của owner = kênh cứng…; còn khi owner giao việc không chỉ-định chế-độ → lead đánh giá + **suggest đúng 1 dòng non-blocking** ("việc này ảo/thật làm tốt hơn — vì …") **rồi chạy luôn**"*.
- `C:50`*"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ)"* ⇒ khoản dễ-áp nhất.
- **(c) thông tin:** `C:24-26` trục khan-hiếm; `C:42-43` 2 cực owner hub đã thử rồi RÚT.
- **(a) quy-trình:** `C:50` *"Pull `/adap-apply`, báo nấc thường-lệ."*
---
## CÂU 2 — SỐ / NGƯỠNG / TÊN-KEY / TÊN-FILE phải wire (NGUYÊN VĂN)
### Tên-key (chép nguyên văn)
| Token | Neo | Ghi chú |
|---|---|---|
| `DEEPEN-ON-CONTESTED` | `A:26` heading *"trục sâu "đào-vào-điểm-tranh-cãi" (DEEPEN-ON-CONTESTED)"* | tên cơ-chế |
| `Đào (Deepen)` · `Thử-phá-2` · `Tổng-hợp depth-aware` | `A:29`,`A:30`,`A:31` | 3 tên bước |
| `truy-bằng-chứng` · `mô-hình-đối` · `săn-ca-biên` | `A:29` | 3 lăng-kính đào — **tên tự quyết** (`A:47`) |
| prompt-floor: **"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"** + **"lời thử-phá cũng là vật-liệu, kiểm cả nó"** | `A:36` (lặp rút gọn `A:42` *"đồng-ý-lại=0-điểm"*) | **chuỗi PHẢI bơm vào prompt worker tầng-2** |
| `attempted-failed` | `B:53` *"Mọi pipeline nhiều-tầng cần trạng-thái **attempted-failed** tường-minh"* | tên trạng-thái |
| `flip-cosmetic` | `B:54` *"**flip không đổi hành-động** (chỉ relabel, không đổi fix/verdict) = flip-cosmetic, không cho đè"* | tên anti-pattern |
| cột **"đốt đơn-vị NÀO"** | `C:28` | tên cột bảng cost |
### Số / ngưỡng (nguyên văn)
| Số | Neo | Nguyên văn |
|---|---|---|
| **≤3** | `A:40` | *"clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần"***"vd" = ví dụ, KHÔNG mandate** |
| **10 lượt** | `B:24` | *"Cấu-hình trần: 5-góc + thử-phá + 3-đào-tầng-2 + thử-phá-2 = **10 lượt**"* |
| **~1.14 triệu token** | `B:28` | *"Tổng (vào+ra) — con số burn thật … (+ lượt tổng-hợp ~129 nghìn — tính cả nó: ~11× một phát thật)"* |
| **467.5 nghìn** | `B:29` | *"Phía-ra … {đề-xuất 207.9 · thử-phá 65.7 · đào 145.1 · thử-phá-2 48.8 — cộng KHỚP CHÍNH XÁC}"* |
| **~114 nghìn/lượt** | `B:30` | *"(dải thật 76143 nghìn — lượt-đào đắt hơn lượt-đề-xuất ~25%) — trung-bình đúng bằng 1 phát "chế-độ thật" cùng đề (114.1 nghìn)"* |
| **194 nghìn = 41.5%** | `B:31` | *"Lớp-đào chiếm … phía-ra = 41.5% run"* |
| **2.9× / 2.4×** | `B:36` + `B:10` | *"Ước-lượng cũ "~395 nghìn" gần đúng ở lens phía-ra (467.5) nhưng thấp **2.9×** so tổng vào+ra (1.14M)"* · frontmatter `B:10` *"hai số lệch nhau **2.4×**"* |
| **~50% + ×2** | `C:24` | *"model-hạng-nhất bị trần quota (~50%) và giá token gấp đôi (tiêu-thụ thực-tế đôi khi cũng gấp đôi)"* |
| **10×** | `C:26` | *"đốt 10× token hạng-hai cho việc-fix để DÀNH suất hạng-nhất cho việc xứng nó = đánh-đổi ĐÚNG"* |
| **1 dòng** | `C:44` | *"suggest đúng 1 dòng non-blocking"* |
### TÊN-FILE phải wire
**KHÔNG CÓ.** 3 thư không chỉ-định file/đường-dẫn nào phải tạo/sửa trong repo sister. Chỉ token định-danh = 3 broadcast-id + 3 `content_sha256` (`A:12` `f05eba5b…` · `B:12` `294be326…` · `C:12` `0a03b2c8…`) dùng cho stamp/verify. **KHÔNG NEO ĐƯỢC** bất kỳ tên script/config nào hub yêu cầu.
---
## CÂU 3 — MÂU THUẪN / SUPERSEDE floor SE đang chạy
**Kết luận đầu:** **KHÔNG có khoản nào GIẾT floor SE.** A tự khai additive — `A:28` *"Thêm 2 bước **SAU** lượt propose + thử-phá (**KHÔNG đụng lượt cũ**)"*. 4 va-chạm dưới đây là **THIẾU (gap) + phải-THÊM**, không phải supersede.
| # | Floor SE | Neo SE | Khoản hub | Phán |
|---|---|---|---|---|
| 1 | **H21 `/fable-clone` ensemble tier-2** = N lane đa-lăng-kính CÙNG 1 vai + em-main refute+synthesize | `fable-clone.md:15` · `harness-11-engine.md:343` | A `:28` | **SỐNG NGUYÊN** — hub chỉ nối thêm tầng-2. SE = **đúng ca "ensemble đơn-trục"** hub mô tả (`A:24`) |
| 2 | **worker-tier-pin S124** opus+`effort:max` 17/17 | `hmw.js:57-58` · `:76` | C `:32-35` routing thật/ảo | **SỐNG** — routing nói về **chế-độ lead** (thật=1 con hạng-nhất / ảo=ensemble), KHÔNG đụng pin worker. 0 mâu thuẫn |
| 3 | **GAP#6 lane ensemble mang `tier:'opus'`** | `fable-clone.md:47-57` · `hmw.js:70` | A `:29` (k worker đào) | **SỐNG + MỞ RỘNG** — nếu thêm lane tầng-2 thì lane đó cũng phải mang `tier:'opus'` (cùng luật, không luật mới) |
| 4 | **`hmw.js` parallel 1 sóng** | `hmw.js:175` | A `:35` *"thêm k+1 lượt tuyến-tính, KHÔNG ping-pong nhiều-vòng"* | **TƯƠNG-THÍCH nhưng ép cơ-học:** `parallel()` KHÔNG tuần-tự-hoá ⇒ tầng-2 = **hmw invocation THỨ HAI** (giống bài trio S141), không nhét chung 1 taskList |
**3 GAP THẬT (SE thiếu, phải thêm nếu adopt):**
- **G-a — 0 trục sâu.** `grep -rn "tầng-2|deepen|DEEPEN|đào-vào-điểm|chống-mỏ-neo|thử-phá-2" .claude/commands/ .claude/workflows/*.js docs/governance/` = **0 hit**. ⇒ falsifier `A:51` *"có bước nào cho con TƯƠI đào tiếp CHÍNH điểm đó không, hay kết-luận dừng ở tầng-1?"***SE = dừng ở tầng-1**. Escape width-only (`A:40`) thì SE **thoả sẵn vì trivially không có gì để tắt**.
- ⚠️ Nuance: SE **có** bước thử-phá nhưng do **em-main** làm (`fable-clone.md:15` "em-main refute + synthesize"), **không phải con TƯƠI** ⇒ đúng bệnh mỏ-neo `A:36` (người refute đã đọc trọn tầng-1).
- **G-b — 0 clamp trần cứng.** `hmw.js:114-117`: *"S4 — số task THOẢI MÁI: harness chạy theo slot, dư tự queue, **KHÔNG cap cứng (soft notice only)**"* — >16 chỉ `log()`. Floor `A:40` đòi **clamp cứng + assert tổng-lượt ≤ trần****FAIL nếu bật trục sâu**. (Cap cứng SE hiện có = `checkpointApproved` `hmw.js:111-113` — anti-accidental-fire, **KHÔNG phải** trần lượt.)
- **G-c — 0 cổng ngân-sách.** Không có budget-gate nào trong `hmw.js` (grep ngân-sách/budget = 0 trong file). Floor `A:43` "cận-ngân-sách LOUD" ⇒ **chưa có chỗ đáp**.
**🔴 PHÁT HIỆN NẶNG NHẤT — SE ĐANG DÍNH ĐÚNG BÀI-HỌC-2 CỦA [B]:**
`hmw.js:223-225`
```js
// trả mảng kết quả (lọc null nếu agent lỗi/null — invalid-role đã STOP-HARD up-front; .filter(Boolean) chỉ lọc null-lane do agent lỗi runtime)
return results.filter(Boolean)
```
Đối chiếu `B:53`: *"**"Thử-rồi-chết" ≠ "chạy-rồi-sạch"**. Tầng-2 spawn mà 0 worker sống, nếu không có trạng-thái riêng, tầng tổng-hợp sẽ viết "tầng-2 không thêm gì" = củng-cố verdict bằng một tầng-2 **không tồn tại**."*
Và falsifier `B:59`: *"nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy "chết" hay thấy "sạch"?"*
**SE trả lời: THẤY "SẠCH".** Lane chết runtime → `null` → bị `.filter(Boolean)` nuốt → em-main @P3 nhận mảng **ngắn hơn, KHÔNG có tín-hiệu "lane chết"**. Comment ngay tại `:223` tự khai đúng hành-vi đó. **Lỗ này TỒN TẠI HÔM NAY ở chiều-rộng, chưa cần trục sâu.** (Cùng lớp với luật đã có `hmw.js:124-125`: *"per-lane throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn"* — SE đã vá cho **role sai** [validate up-front] nhưng **KHÔNG vá cho lane chết runtime**.)
**GAP bảng cost (khoản ① của [C] + falsifier §4 của [B]):**
- Bảng cost DUY NHẤT của SE = `.claude/agents/README.md:249-257` (heading `:249`), **cột đơn-vị `:251`** ghi **"Effective tokens billed (after caching)"** — **KHÔNG phải** "tổng vào+ra" cũng **KHÔNG phải** "phía-ra" ⇒ là **đơn-vị THỨ BA**, không so trực tiếp được với số hub.
- Toàn bộ giá trị mang tiền-tố `~` (ước, không đo) + đóng băng ở thời **7 sub-agent** (`README.md:253` *"| 7 sub-agents spawn setup | ~1.1M (7 × ~155K cache WRITE) |"*; tổng `:256` *"~1.85M (~9× solo)"*) trong khi roster nay = **17****stale ~2.4× về số-vai**.
- ⇒ Falsifier `B:59` *"Hai số đó lệch bao nhiêu lần trên hệ bạn?"***SE: CHƯA ĐO ĐƯỢC** (đúng chẩn của hub: *"Không trả lời được = chưa đo, đang ước"*).
- `harness-11-engine.md:355` đã cite bản gốc *"ensemble không rẻ hơn nhiều về token thô"* ⇒ [B] `:37` **làm SẮC** câu đó thành *"Ensemble trả tiền theo **SỐ LƯỢT**, không rẻ per-lượt"* — **bổ-sung, không lật**.
---
## CÂU 4 — Hub ĐÁ CÂU HỎI VỀ CHO SE TỰ QUYẾT (nguyên văn)
**Đá quyết-định (SE phải chốt):**
1. `A:55`*"**Posture default (trần+dial-down HAY opt-in-off) mỗi dự-án tự chọn** — điểm sàn adopt = có trục sâu **bật-được** + có **escape width-only** (không khoá cứng), KHÔNG bắt buộc default nào."*
2. `A:47`*"Số worker đào, tên 3 lăng-kính, cách nhắm điểm-nóng, có cấp quyền đọc-file cho worker đào hay chỉ-pack — mỗi dự-án tự quyết theo engine mình."*
3. `A:34`*"Dự-án e-ngại cost → chọn opt-in-off. Điểm sàn: phải CÓ escape về chiều-rộng, không khoá cứng."*
4. `C:28`*"**Trần/giá cụ-thể mỗi nhà tự điền theo subscription của mình.**"*
5. `C:50`*"**Owner mỗi nhà tự chốt form.**"*
**Đá câu-hỏi-kiểm (falsifier — SE phải TRẢ LỜI BẰNG SỐ/ĐO):**
6. `A:51`*"Ensemble của bạn: "khi 2 đề-xuất mâu-thuẫn hoặc con thử-phá phá được 1 điểm — có bước nào cho con TƯƠI đào tiếp CHÍNH điểm đó không, hay kết-luận dừng ở tầng-1?" Không có = còn hở trục sâu. Và: "nếu có bước đào — con đào bị chặn a-dua tầng-1 thế nào?" Không trả lời được = trục sâu thiếu chống-mỏ-neo (dễ thành lặp-lại tốn token)."*
7. `B:59`*""bảng cost của bạn ghi đơn-vị nào — tổng vào+ra hay phía-ra? Hai số đó lệch bao nhiêu lần trên hệ bạn?" Không trả lời được = chưa đo, đang ước. Và: "nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy "chết" hay thấy "sạch"?" — thấy "sạch" = đang có lỗ bài-học-2."*
**Đáp án ĐO ĐƯỢC của SE cho 4 câu hỏi trên (đã verify):** ① dừng ở tầng-1 (0 hit grep) · ② N/A + refute do em-main (đã đọc tầng-1) = không có chống-mỏ-neo · ③ đơn-vị thứ-ba "effective billed after caching", lệch = **chưa đo** · ④ **thấy "sạch"** (`hmw.js:225`).
---
## CÂU 5 — Thư sau có sửa/đính-chính thư trước trong CÙNG cụm không?
**Frontmatter:** cả 3 đều `supersedes: null` (`A:9` · `B:9` · `C:9`) ⇒ **KHÔNG có supersede hình-thức nào**.
**Chuỗi quan-hệ THẬT (đọc từ chính body):**
1. **[A] → [B] = TRẢ NỢ, không sửa.** `A:59` hứa *"số-cost-thực-đo sẽ ra ở bản `update` sau"*`B:20` *"Bản này là `type:update` **trả nợ số** cho bản trục-chiều-sâu phát sáng nay (đã khai "số-cost thực-đo sẽ ra ở bản update sau") — giữ đúng lời: đây là số đo, không phải ước."* ⇒ [B] **lấp chỗ trống [A] tự khai**, KHÔNG đụng cơ-chế/floor của [A].
2. **[B] → [C] = REFINE CÁCH ĐỌC, số GIỮ NGUYÊN.** `C:20` (nguyên văn): *"Bản này là `type:update` NHỎ chồng **bản số-đo cùng ngày** (`2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc` · sha `294be326` — per-lượt ~114 nghìn, 10 lượt ≈ 10-11×) — **số KHÔNG đổi**; đổi là **lens đọc số** … Đây là **refine (không thay)** câu kết của bản số *"thật = mặc-định cho phán-quyết hệ-trọng"*: qua lens khan-hiếm, "thật" thành **suất-để-dành** → default thực-dụng đẩy việc-fix về ảo, suất thật dành cho việc xứng nó."*
- Câu bị refine nằm ở `B:46`: *"Gợi-ý dùng: thật = mặc-định cho phán-quyết hệ-trọng (mạnh nhất/token); ảo-trần = khi cần đào chéo…"*.
-**[C] KHÔNG lật số, nhưng ĐỔI HƯỚNG khuyến-nghị thực-dụng**: [B] đọc "thật thắng hiệu-quả/token" (`B:44`) → [C] `C:24-26` đọc lại: token-thô không phải trục quyết-định, **đơn-vị khan-hiếm** mới là ⇒ **fix → ảo** (`C:32`).
**AI THẮNG (per trục):**
| Trục | Thắng | Vì sao |
|---|---|---|
| **Cơ-chế / floor** | **[A]** | thư DUY NHẤT có function-floor (`A:38`); [B]`:20` + [C]`:20` tự khai KHÔNG floor |
| **Con số** | **[B]** | thư DUY NHẤT có số đo; [C]`:20` tự khai *"số KHÔNG đổi"* |
| **Cách ĐỌC số + routing thật/ảo** | **[C]** | mới nhất + tự khai *"delta-đọc chồng bản số-đo"* (`C:11`) + *"refine (không thay)"* (`C:20`) |
**Đính-chính DUY NHẤT trong cụm** = nội-bộ [B]: `B:36` *"**Khai 2 đơn-vị hoặc sai 3×.** Ước-lượng cũ "~395 nghìn" gần đúng ở lens phía-ra (467.5) nhưng thấp **2.9×** so tổng vào+ra (1.14M)"* — nhưng con "~395 nghìn" đó **KHÔNG NẰM trong 3 file này** (ước cũ nội-bộ hub) ⇒ **KHÔNG NEO ĐƯỢC trong cụm-3**.
**Bẫy tên-file:** `depth-cost-update-so-do-thuc` **nghe như** bản cập-nhật của `depth-axis` **nhưng KHÔNG PHẢI thay nó** — nó cập-nhật **phần số bị hoãn**, còn cơ-chế/floor của `depth-axis` **vẫn nguyên hiệu-lực**. Thư thật-sự "chồng lên" bản số là **[C]**, không phải [B].
---
## PHỤ — vật-chứng grep đã chạy (tái-lập được)
- `grep -rn "0a03b2c8\|f05eba5b\|294be326" --include="*.md" --include="*.json" .` (trừ 3 file inbox) → **0**
- `grep -rn "tầng-2\|deepen\|DEEPEN\|đào-vào-điểm\|chống-mỏ-neo\|thử-phá-2" .claude/commands/ .claude/workflows/*.js docs/governance/`**0**
- `.claude/workflows/hmw.js` = 225 dòng · `resolveModel` `:69-77` · `parallel` `:175` · `filter(Boolean)` `:225` · soft-cap `:114-117` · checkpoint `:111-113`
- Bảng cost SE duy nhất: `.claude/agents/README.md:249-258`
- SE ensemble def: `.claude/commands/fable-clone.md:15` · `docs/governance/harness-11-engine.md:343` · honest-cost-note `:355`

View File

@ -0,0 +1,191 @@
# sub-investigator-codebase-3 — LANE 4 "lens-owner-binding"
> Run: `2026-07-22-S144-adap-dot-11` · vai: investigator-codebase · lăng-kính: **TRỤC RÀNG-BUỘC** (lệnh đã chốt / còn bàn / đá về SE)
> Nguồn: 10 file `broadcasts/inbox/2026-07-1[89]-*.md` + `2026-07-2[01]-*.md` (đọc TRỌN file chính 12.320 B + lướt 9 file)
> Ghi-đĩa-TRONG-lúc-làm (chống #53). Mọi claim neo `file:line`. **Phần CHÉP NGUYÊN VĂN tách khỏi phần DIỄN GIẢI.**
---
## CÂU 1 🔴 — "Năm khoản" là NĂM KHOẢN NÀO
File: `broadcasts/inbox/2026-07-19-Governance-goi-chot-owner-nam-khoan.md` · `content_sha256: c580c566…` (`:12`) · `type: update` `:7` · `to/targets: all-fit` `:4-5` · status `🟢 PUBLISHED s105` `:11`
Tự khai bản chất: *"mỗi khoản chồng lên một bản đã phát trước, khung cũ giữ nguyên — chỉ đọc phần delta"* (`:21`) · *"Mọi khoản đã land phía hub … trước khi phát; không khoản nào là lời hứa"* (`:21`).
### Khoản 1 — `:23-30`
**Tiêu đề nguyên văn (`:23`):** `## 1. Mặc-định lead = Opus 4.8 (1M) MAX; model đắt nhất đi qua đúng HAI cửa owner-chủ-động`
Chồng bản `1b3aa909` (`:25`).
**Owner verbatim (`:27`):** *"nói chung fable tao muốn dùng là sẽ dùng theo command /fable-real ngoài ra thì Opus 4.8 MAX hết"* — làm rõ cùng đợt: owner tự chọn Fable ở ghế lead lúc mở phiên vẫn hợp-lệ, **0 caveat**.
**Quyết cuối (`:28`):** boot-default máy (settings) đổi về **Opus 4.8 (1M) MAX** cho ghế lead (trước là Fable). Fable đi qua đúng **hai cửa, cả hai owner-chủ-động**: ① owner CHỌN lead Fable lúc mở phiên · ② owner gõ lệnh gọi đích-danh một con Fable cho một vai cụ-thể. **"Lead và sub không bao giờ tự nâng lên Fable."** Owner đổi model giữa phiên = quyền owner.
**Giới hạn phạm vi (`:29`):** sister-floor KHÔNG ĐỔI (lead = frontier-class owner-choice, cấm lớp Sonnet/Haiku ở ghế lead); *"Hub thu default về Opus là **lựa-chọn của owner hub — không ép dự-án nào đổi default theo**."*
**Floor chuyển được (`:30`):** *"tier đắt nhất không nên là đường mặc-định — nó nên là cửa owner-gated đích-danh."*
### Khoản 2 — `:32-38`
**Tiêu đề (`:32`):** `## 2. RETIRE resume-agent cho mục-đích "giữ context / chắc model" — đường chính là spawn mới + pack`
Chồng `7c0ec067` + `d68de5e7` (`:34`).
**Bệnh (`:36`):** resume/continue một agent đã spawn làm **rớt model-override** đặt lúc spawn — máy-chứng từ MỘT sister, **khai thật n=1, env-dependent**.
**Quyết cuối (`:37`) — ĐẢO một mặc-định cũ của hub:** mục-đích *"giữ context / chắc chắn đúng model"***dùng spawn MỚI với memory-pack đầy-đủ**; *"resume/continue chỉ còn hợp-lệ cho **hội-thoại tiếp-diễn trong cùng lượt làm việc**, không phải cơ-chế bảo-toàn model."*
**Floor (`:38`):** spawn mới + model-param tường-minh tại call-site; muốn giữ resume → **tự verify trên env mình trước**.
### Khoản 3 — `:40-46`
**Tiêu đề (`:40`):** `## 3. Ràng-buộc thiết-kế NỀN: không cơ-chế nào được chặn hoặc làm đắt cửa dừngnốicheckpoint`
Chồng khung-nhịp `3daf5ee4` (`:42`).
**Quyết cuối (`:44`):** van giữa-phiên **GIỮ TREO** (dữ-liệu hai phía {sister + hub} chưa đủ đặt ngưỡng) + owner verbatim *"cái này phải nhanh"**"**bất kỳ van/gate/phép-đo nào về sau cũng KHÔNG ĐƯỢC chặn hoặc làm chậm các cửa dừngnốicheckpoint** (lệnh pause / lệnh nối-mạch / lệnh chốt-nhanh-không-dừng của bạn)."*
**Vị-thế (`:45`):** nâng heuristic *"điểm-dừng-phải-rẻ"* thành **ràng-buộc thiết-kế CỨNG**: *"mọi đề-xuất thêm việc vào đường điểm-dừng phải qua câu hỏi 'có làm điểm dừng đắt lên không' TRƯỚC khi bàn giá-trị của việc đó."*
**Floor (`:46`):** audit lệnh điểm-dừng; bước nặng (**spawn agent, đo đạc lớn, quét rộng**) nằm trong đường pause-tương-đương = **vi-phạm ranh** → dời về closeout/bookend.
### Khoản 4 — `:48-55`
**Tiêu đề (`:48`):** `## 4. Cửa-duyệt lời-hứa-máy — thành luật sổ chuẩn (credit khuôn-câu: SE)`
`:50`*"nâng khoản-3 của bản năm-quyết `123d8272` từ 'xử một ca' thành 'cửa chặn mọi ca mới'; khuôn-câu gốc từ thư SE `58e28bae`, hub CONFIRM"*.
**LUẬT nguyên văn (`:52`):** *"câu dạng **'máy sẽ chặn/quét/bắt X'** · **'detector đảm-nhiệm Y'** trong doc/rule/broadcast ⇒ BẮT BUỘC **existence-proof tại chỗ**: {máy tồn-tại (đường-dẫn) + lệnh chạy được + test/positive-control}. Thiếu bất kỳ mảnh nào → PHẢI viết dạng **dự-định** ('sẽ build — CHƯA có máy'). **Cấm viết dạng đang-có.**"*
**Honest (`:54`):** *"máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có** (khai residual)"* — lưới hiện-hành = gate người + khuôn-câu bắt-buộc hai-dạng.
**Floor (`:55`):** khuôn-câu hai-dạng {đang-có (kèm proof tại chỗ) | dự-định (nói rõ chưa-có)}; reviewer hỏi một câu: *"mã nào làm việc đó?"*
### Khoản 5 — `:57-61`
**Tiêu đề (`:57`):** `## 5. Ghi-chú pool: model đắt xuất hiện available trong env ≠ đổi pin`
**Quyết cuối (`:59`):** sau đợt spend-limit mở lại, Fable xuất hiện available trong pool sub phía hub → *"**available-in-pool ≠ mandate** — pin sub (Opus) giữ nguyên; nâng tier per-case vẫn owner-gated như cũ."* `:60`: *"env thay đổi không phải mệnh lệnh."*
**Floor (`:61`):** mọi thay-đổi pin/tier — kể cả khi env "mời" — đi qua owner; *"Agent ghi-nhận và báo, không tự adopt."*
**PROJECT-FIT hub tự chấm (`:65-68`):** khoản 1/5 → n/a phần cấu-hình nếu 1-model; khoản 2 → chỉ áp nếu dùng resume kèm model-override; khoản 3 → áp cho mọi dự-án có lệnh điểm-dừng; **khoản 4 → áp cho MỌI dự-án** ("không cần hạ-tầng gì").
**Phần KHÔNG-BIẾT hub tự khai (`:86-88`):** khoản 2 n=1 env sister · khoản 3 **chưa có máy** đo "điểm-dừng đắt lên" (kiểm tay) · khoản 4 mới codify, sẽ đính-chính nếu lộ kẽ lách.
---
## CÂU 2 🔴 — BẢNG 12 MỤC TREO CỦA SE × 10 THƯ (không bỏ dòng nào)
**Ký hiệu:** `[10]` = trong tập 10 thư lane này · `[ngoài-10]` = thư đã kéo trước, nằm `broadcasts/inbox/ai_infra/`.
**Kết quả tổng: 0/12 mục có đáp án TRỰC TIẾP trong 10 thư.** 3 mục có **nguyên-tắc phủ** (hợp-thức-hoá việc để trống), 3 mục có đáp án ở `58e28bae` `[ngoài-10]`, 5 mục = product/owner-scope hub không đụng, 1 mục ratify vẫn nợ.
| # | Mục treo SE | Có đáp án trong 10 thư? | Đáp án / neo |
|---|---|---|---|
| 1 | trio first-run | ❌ CHƯA (0 hit `[10]`) | CÁCH chạy đã có: `harness-dong-du-vong:46` *"Tuần-tự trong-vòng, song-song giữa-vòng: audit chờ đúng con đo vòng mình xong (chống chấm bản stale)"*. Nhịp gốc `[ngoài-10]` `58e28bae:33` *"chạy **ĐỦ CẢ HAI ĐẦU mỗi phiên-LOGIC** … **TUẦN TỰ** ĐO → ĐỀ-XUẤT → KIỂM, KHÔNG bắn song song"*. Việc CHẠY lần đầu = blocker owner (restart CLI + gật) — `HANDOFF:8` NEXT#1. |
| 2 | ngưỡng `pull_warn_days` (cố ý trống) | ❌ số CHƯA — nhưng ✅ **NGUYÊN-TẮC phủ** | grep `pull_warn_days` = **0 hit / 10 thư**. Phủ bởi `2026-07-20-auto:19` *"**núm-số ngân sách vẫn thuộc chủ dự án** (nâng trần, đặt target — máy chỉ BÁO khi chạm, không tự nâng)"* + `2026-07-21-eval:24` *"chủ-dự-án-quyết-SỐ (ngưỡng, target)… **AI không tự quyết hai cột sau**"*. ⇒ SE để trống = **ĐÚNG luật hub**, không phải nợ. |
| 3 | tools-whitelist KHÔNG chặn ghi runtime (§3(b) chờ hub) | ❌ CHƯA `[10]` (0 hit) · ✅ có stance `[ngoài-10]` | `58e28bae:42` nguyên văn: *"(i) 'read-only' ở đây = **chặn-bằng-thiếu-tool** cho kênh ghi-file/RAG; **Bash vẫn là kênh ghi mở về lý thuyết** — lưới thật là **lead soát `git status` sau mỗi lượt** (hub vừa bắt sống một ca sub tự ghi nhật-ký qua Bash ngay hôm nay — **content đúng nhưng vẫn xử lý là vi phạm biên**…)"*. ⚠️ Xác nhận cho §3(b) **KHÔNG THỂ** nằm trong 10 thư: mọi thư ≤ 2026-07-21, SE báo 07-22. |
| 4 | UAT lũy-kế S134 | ❌ n/a — ngoài scope hub | grep `UAT\|lũy kế\|phiếu\|migration` trên 10 file = **0 hit**. Product-scope → chờ **owner**, không phải chờ hub. |
| 5 | UAT freeze-NS S133 | ❌ n/a — ngoài scope hub | như trên, 0 hit. |
| 6 | D1 nháp-không-cộng-tiền | ❌ n/a — ngoài scope hub | như trên, 0 hit. |
| 7 | hook-vs-budget-cap | ❌ số CHƯA — ✅ **hình-dạng có** | `2026-07-20-auto:17` *"Khi phép đo vượt ngưỡng đã khai trong config, bước xử lý chạy NGAY trong lần đóng phiên đó — **không ghi sổ nợ để dồn**"* + `:19` ranh: *"Automation xử **nợ-vệ-sinh** (mảnh lưu trữ chưa nén, số đo instrument cũ, **sổ vượt trần dung lượng**), **không xử núm-quyết-định**"*. ⇒ máy ĐƯỢC tự nén/archive khi vượt; TRẦN vẫn của owner. |
| 8 | session-model duyệt bảng VC-1/2/3 | ❌ CHƯA (0 hit "VC" `[10]`) | 10 thư không nhắc session-model ngoài 1 datapoint `hub-tu-danh-gia:46-48` (owner hub 1 phiên-logic xuyên 3 cửa-sổ 1M; **khai rõ "testimonial, chưa phải phép đo máy"**, 2 phiên dogfood 10/10). Bảng VC = artifact SE, chờ owner. |
| 9 | close-sweep 7-carry | ❌ CHƯA (0 hit) | không thư nào chạm. |
| 10 | ratify ranh `refine ⟂ lead-omission` (ĐÃ WIRE trước ratify) | ❌ CHƯA ratify | 0 hit `[10]`. Ranh TRỤC bộ-ba `[ngoài-10]` `58e28bae:35`: *"hub `lead-stale`/`lead-gap` ≡ SE `lead-view`/`lead-omission` — **chức năng trùng, tên = form tự quyết, KHÔNG cần rename**"*. **Verify đĩa SE:** `.claude/agents/harness-refine.md:22` heading `## 🔴 RANH SẮC — refine ⟂ lead-omission-auditor (đọc kỹ, dễ lẫn)` → bảng 3 trục `:24-28``:30` *"LEAD session hot-feed/carry/work-state underfill = **việc của `lead-omission-auditor`** → **NHƯỜNG**"*. ⇒ claim "đã wire :22-30" **CHÍNH XÁC**; ratify vẫn nợ owner. |
| 11 | 5 câu session-model | ❌ CHƯA `[10]` · 1/5 có đáp án `[ngoài-10]` | `session_ctx_kb`: `2026-07-17-…-manifest:69` *"function-floor là: **có một trần, hoặc chấp nhận mặc-định**"* + `:73-74` *"`session_ctx_kb: 64` # đơn vị KB (đọc code nhân 1024) … **Vắng khoá → code lấy default 64KB.** Đừng đọc đơn-vị thứ ba"*. ⇒ 64 = **default của code, KHÔNG phải số hub ép**; để trống = hợp lệ. 4 câu còn lại (map N↔L + folder-form · VC từng dòng · hook 3→4-path · prereq unblock) = **0 hit** mọi thư. |
| 12 | consent-form trio dài hạn | ❌ hub **ĐÃ ĐÁ VỀ SE**, 10 thư không nhắc lại | `58e28bae:33` nguyên văn: *"**Consent:** chạy trong nghi-thức mở/đóng phiên = đã nằm trong consent chuẩn của nghi-thức; **nhóm có luật cứng no-auto-run riêng thì giữ nguyên hình thức consent của nhóm** — floor chỉ đòi '2 đầu mỗi phiên chạy đủ'."* ⇒ câu hỏi còn nguyên cho owner SE; **hub sẽ không trả thêm**. |
---
## CÂU 3 — BINDING vs KHUYẾN NGHỊ vs GHI NHẬN (dấu hiệu văn bản)
### Dấu hiệu BINDING (floor)
- `"Khung sàn (function-floor — 4 khoản **bắt buộc**)"``2026-07-18-spawn-label:22`
- `"## 3. Khung sàn (function-floor — 4 khoản)"``depth-axis:38` · `harness-dong-du-vong:42`
- `"**Luật:**"` + `"BẮT BUỘC existence-proof"` + `"**Cấm viết dạng đang-có.**"``goi-chot:52`
- `"nâng từ heuristic thành **ràng-buộc thiết-kế cứng**"``goi-chot:45`
- `"**Floor chuyển được:**"` (×4: `goi-chot:38,:46,:55,:61`) / `"**Nguyên-tắc chuyển được:**"` (`:30`)
- frontmatter `to: all-fit` + `targets: all-fit` + `status: PUBLISHED`
### Dấu hiệu KHUYẾN NGHỊ (function giữ, form tự quyết)
- `"## 2. Hình-thức tự quyết (mỗi dự-án)"``spawn-label:29` · `depth-axis:45` · `harness-dong-du-vong:49`
- `"**FYI + khung tự-áp** — không bắt adopt; function giữ, form mỗi project tự quyết"``2026-07-20-3-khoan:15`; `"Không bắt buộc gì. Ba việc tùy chọn"` `:59`
- `"**Posture default … mỗi dự-án tự chọn** … **KHÔNG bắt buộc default nào**"``depth-axis:55`
- `"Khung = sàn chức năng; hình thức tổ chức = mỗi nhà tự quyết"``2026-07-21-eval:13`
### Dấu hiệu CHỈ GHI NHẬN (FYI, no-floor)
- `"Cả 3 = owner-side chia-sẻ, **KHÔNG floor**"``cost-lens:10` (frontmatter `re:`), lặp `:20`, `:50`
- `"**FYI-số + bài-học — KHÔNG floor mới, không bắt làm gì**"``depth-cost:63`
- `"FYI, **KHÔNG floor**"``hub-tu-danh-gia:10`, `:20`; `"điểm số và findings là của hub, **không áp**"` `:62`
- `type: update` + `supersedes_scope: "DELTA … các khoản cũ giữ nguyên, sister **re-verify PHẦN ĐỔI**"``2026-07-20-auto:5` ⇒ thu hẹp phạm vi phải làm
### Phân loại 10 thư (10/10, không bỏ)
| Hạng | Thư | Neo |
|---|---|---|
| **BINDING-floor** | `2026-07-18-spawn-label` (4 khoản bắt buộc) | `:22-27` |
| **BINDING-floor** | `2026-07-19-depth-axis` (4 khoản sàn) | `:38-43` |
| **BINDING-floor** | `2026-07-19-harness-dong-du-vong` (4 khoản sàn) | `:42-47` |
| **BINDING-mixed** | `2026-07-19-goi-chot-nam-khoan` — khoản 3 (ràng-buộc cứng) + khoản 4 (Luật/Cấm) = **binding**; khoản 1/2/5 = **quyết-định NỘI-BỘ hub** + "floor chuyển được" (khuyến nghị mạnh) | `:44-45`, `:52` vs `:29`, `:37`, `:59` |
| **KHUYẾN NGHỊ** | `2026-07-20-3-khoan` | `:15`, `:59-63` |
| **KHUYẾN NGHỊ** | `2026-07-20-auto-toan-vong` ("Sister cần làm gì" 3 gạch) | `:43-47` |
| **KHUYẾN NGHỊ** | `2026-07-21-eval-quality` (khung 4 câu = sàn chức năng; 3 phép thử) | `:13`, `:49-53` |
| **GHI NHẬN** | `2026-07-19-cost-lens` | `:50` |
| **GHI NHẬN** | `2026-07-19-depth-cost` | `:63` |
| **GHI NHẬN** | `2026-07-19-hub-tu-danh-gia` | `:62` |
**Diễn giải (tách khỏi trích):** phần THỰC SỰ ràng buộc SE trong đợt này = **4 khoản label-spawn + 4 khoản audit-mọi-vòng/eval-2-phía + khoản 3 & 4 của gói-chốt** (+ 4 khoản depth-axis nếu SE nhận mình có ensemble). Phần còn lại = tự chọn/tham khảo.
---
## CÂU 4 — Hub có nói "đây là config của các em, đừng chép số của hub" không?
**CÓ — 6 chỗ, chép nguyên văn:**
1. `2026-07-21-eval-quality:55`*"các con số trong bản này là số hub tự đo trên chính mình (một dự án, một giai đoạn); chị em áp KHUNG và tự đo số của mình, **đừng chép số hub làm chuẩn**."* ← khớp gần nhất câu SE từng bị dặn.
2. `goi-chot:29`*"Hub thu default về Opus là **lựa-chọn của owner hub — không ép dự-án nào đổi default theo**."*
3. `cost-lens:28`*"**Trần/giá cụ-thể mỗi nhà tự điền theo subscription của mình.**"*
4. `2026-07-20-auto:27`*"Ngưỡng sống trong file config một-nguồn, **tài liệu chỉ trỏ key, không chép số**."* (= B1 derived-trỏ-canonical, cùng họ)
5. `hub-tu-danh-gia:62`*"**điểm số và findings là của hub, không áp**."*
6. `depth-cost:38`*"**Cost scale theo kích-thước đề** — số trên là 1 class-task (code-audit có nguồn); đề to hơn = đắt hơn tuyến-tính theo pack."*
**Bổ trợ (cùng trục, quyền-SỐ thuộc owner):** `2026-07-20-auto:19` *"núm-số ngân sách vẫn thuộc chủ dự án"* · `2026-07-21:24` *"{AI-tự-sửa · **chủ-dự-án-quyết-SỐ** (ngưỡng, target) · **chủ-dự-án-quyết-LUẬT**} — AI không tự quyết hai cột sau"* · `depth-axis:55` *"KHÔNG bắt buộc default nào"*.
**Diễn giải:** mục treo #2 (`pull_warn_days`) và #11-phần (`session_ctx_kb`) **không phải nợ SE** — hub nói ≥3 lần rằng số là của owner. Việc SE từ chối tự đặt số = **tuân thủ**, nên báo nấc dạng "n/a-owner-gated", không phải "pending".
---
## CÂU 5 — Deadline / thứ tự bắt buộc / điều kiện tiên quyết
**DEADLINE lịch: 0.** grep `deadline|hạn chót|trước ngày|hạn nộp` trên 10 file = **0 hit**.
**Mốc áp duy nhất:** `spawn-label:51` *"áp từ **phiên kế**"*; `:43` khai thật hub *"áp khuôn từ giữa phiên phát hành … loại việc-thường và workflow-task áp từ **spawn kế tiếp**"*.
**THỨ TỰ BẮT BUỘC (5):**
- (a) `harness-dong-du-vong:46`*"**Tuần-tự trong-vòng, song-song giữa-vòng**: audit chờ đúng con đo vòng mình xong (chống chấm bản stale)"* [≡ `58e28bae:33`].
- (b) `goi-chot:45` — câu hỏi *"có làm điểm dừng đắt lên không"* phải hỏi **TRƯỚC** khi bàn giá-trị của việc.
- (c) `goi-chot:52` — existence-proof **tại chỗ** trước khi được phép viết dạng đang-có.
- (d) `2026-07-20-3-khoan:25`*"sau khi sửa body doc NÀO trong một lượt sweep → **đọc lại dòng-1 + masthead của chính doc đó trước khi tuyên sweep xong**"*.
- (e) `depth-axis:28-31` — đào tầng-2 chỉ SAU {propose + thử-phá}; thử-phá-2 sau đào; tổng-hợp depth-aware cuối.
**ĐIỀU KIỆN TIÊN QUYẾT (4):**
- (f) `depth-axis:43`*"**Cận-ngân-sách LOUD**: vượt ngân-sách trước bước đào → BỎ đào + báo RÕ (không văng lỗi, không lặng-thầm bỏ), trả kết-quả chiều-rộng."*
- (g) `depth-cost:54`*"**Phát-hiện chưa-qua-kiểm không được quyền đè.** Lớp thử-phá-2 chết → mọi 'lật vòng-1' của tầng-2 phải **TREO chờ người**, không auto-override."*
- (h) `depth-cost:55`*"Con thử-phá tầng-2 phải **THẤY** vòng-1"* (nếu không = mandate bất-khả-thi về cấu-trúc).
- (i) `depth-axis:40` — escape bắt buộc tồn tại: *"**tắt-trục-sâu = escape về chiều-rộng LUÔN còn** (không khoá cứng); clamp trần cứng (vd ≤3)"*.
**ZERO-DEBT (ràng buộc nhịp):** `2026-07-20-auto:17` — xử lý chạy **NGAY trong lần đóng phiên**, *"không ghi sổ nợ để dồn"*.
**Ràng buộc CHÉO đè mọi khoản khác:** `goi-chot:44-46` (khoản 3) — mọi cơ-chế mới không được làm đắt đường dừngnốicheckpoint. **SE-relevant:** trio đặt ở bookend (`58e28bae:33`) = ĐÚNG chỗ; nếu ai đề xuất chạy trio/đo-nặng trong `/pause`**vi phạm khoản 3**. Self-check hub kèm: `goi-chot:74` *"Lệnh điểm-dừng của bạn có bước nặng nào không? **Đo wall-clock một lần** — điểm dừng phải rẻ."*
---
## CÂU 6 — Hub yêu cầu SE BÁO LẠI gì?
**6/10 thư có mục "Nấc adopt" đòi pull + báo nấc — chép nguyên văn:**
| Thư | Yêu cầu |
|---|---|
| `spawn-label:51` | *"Pull bản này bằng quy trình thường (`/adap-apply`), áp từ phiên kế, **tự báo nấc per-khoản (sent→ACK→agreed→executed→verified)** trong report-back định kỳ."* |
| `depth-axis:55` | *"Pull bằng quy trình thường (`/adap-apply`), tự báo nấc trong report-back định kỳ."* |
| `cost-lens:50` | *"Pull `/adap-apply`, báo nấc thường-lệ."* |
| `depth-cost:63` | *"Pull `/adap-apply`, báo nấc thường-lệ."* |
| `harness-dong-du-vong:59` | *"Pull … tự báo nấc per-khoản … **Khoản ① có thể adopt dần từng vòng — báo nấc theo vòng.**"* |
| `hub-tu-danh-gia:62` | *"Pull `/adap-apply`, báo nấc thường-lệ."* |
**4/10 thư KHÔNG đòi báo nấc:**
- 🔴 `goi-chot-nam-khoan` (**thư binding nhất**) — **KHÔNG có mục "Nấc adopt", 0 câu `/adap-apply`**. Chỉ có §7 SELF-CHECK 4 ô tự kiểm (`:72-75`) + §8 DELTA re-verify (`:79-82`) + footer *"kênh-hỏi = email về AI_INFRA"* (`:91`).
- `2026-07-20-3-khoan:59-64`*"Không bắt buộc gì. Ba việc tùy chọn… **Câu hỏi gửi về hub qua kênh email broadcasts như thường lệ.**"*
- `2026-07-20-auto:43-47` — "Sister cần làm gì" = 3 **việc**, không phải báo cáo.
- `2026-07-21-eval:49-53` — chỉ "Ba phép thử nhanh (tự kiểm sau khi áp)".
**ERRATA:** không thư nào đòi SE gửi errata. Chiều ngược lại hub tự hứa: `goi-chot:88` *"hub sẽ đính-chính nếu khuôn-câu hai-dạng lộ kẽ lách"*.
**RE-VERIFY phạm vi hẹp (bắt buộc đọc lại, không phải báo):** `goi-chot:79-82` — chỉ re-read delta của 4 bản nền `1b3aa909` · `7c0ec067`+`d68de5e7` · `3daf5ee4` · `123d8272`; `2026-07-20-auto:5` *"sister **re-verify PHẦN ĐỔI**"*.
---
## SURPRISES (ngoài câu hỏi chính)
1. 🔴 **Thư binding nhất lại KHÔNG đòi báo nấc** (`goi-chot` 0 câu `/adap-apply`) trong khi 6 thư FYI/khuyến-nghị đều đòi. Nếu SE báo nấc cho nó = tốt nhưng **không có mandate văn bản**; nếu bỏ cũng không sai văn bản. Bất-đối-xứng này dễ khiến bảng nấc của SE lệch.
2. ⚠️ **Cite-lệch nhẹ về `58e28bae`:** `goi-chot:50` gọi nó là *"thư SE `58e28bae`"*, nhưng file trên đĩa SE mang đúng sha đó là `broadcasts/inbox/ai_infra/2026-07-18-ai_infra-to-se-reply-tong-bo-ba-harness-sub-4-khoan.md` (`:9` `content_sha256: 58e28bae…`) — frontmatter `from: ai_infra` `to: se`. Tức sha trỏ **thư HUB TRẢ SE** (nội dung khuôn-câu gốc do SE đề xuất, hub CONFIRM ở `§(C)④a:49`). SE tra sha sẽ ra thư hub, dễ tưởng hub nhầm.
3. **Khoản 2 (RETIRE resume) đụng recipe #53 của SE nhưng KHÔNG cấm nó:** `goi-chot:37` retire resume **chỉ cho mục-đích giữ-model/giữ-context**; *"hội-thoại tiếp-diễn trong cùng lượt làm việc"* vẫn hợp-lệ ⇒ path-2 `SendMessage-resume in-session` để vớt verdict garble **KHÔNG bị retire**. Chỉ bị nếu SE resume để "giữ model Fable". Cần khai rõ khi báo nấc, tránh over-apply rồi bỏ mất lưới #53.
4. **5/12 mục treo (4,5,6 + phần 8,9) sẽ KHÔNG BAO GIỜ có đáp án từ hub** — 0 hit product trên cả 10 thư. Gộp chúng chung một bảng "đang treo chờ" tạo kỳ vọng sai (chờ owner ≠ chờ hub); nên tách 2 cột chủ-thể.
5. **SE đang ĐI TRƯỚC hub ở đúng một khoản:** `2026-07-21-eval:31`*"Bộ kiểm-tra-đặc-tả của hub có **17/18 check không có positive-control**"*; SE đã có fault-inject 2-chiều nhiều đợt (13/13 S138, 7 ca S143 theo `HANDOFF:5`). Đây là chất liệu báo nấc bằng SỐ thay vì "đã đọc".
6. **Khoản 3 gói-chốt là ràng buộc CỨNG đè carry #7 (hook-vs-budget-cap) + #1 (trio):** bất kỳ hardening nào SE định thêm vào đường `/pause``/tiep` (kể cả hook chặn sub-write, `HANDOFF:8` NEXT#3) phải qua câu hỏi "có làm điểm dừng đắt lên không" **trước** khi bàn giá trị.
7. **`2026-07-21-eval:22` cho SE một cây gậy phân loại rất hợp lúc:** *"**dormant-đúng-thiết-kế** (rẻ, chưa có ca nhưng CÓ ca lịch sử nó SẼ bắt — như máy báo khói) khác **thừa-thật** (cấu trúc không thể kêu)"* — dùng được ngay cho close-sweep 7-carry (#9) và cho detector INFORM-only của SE.
---
## GHI CHÚ BIÊN (transparency cho lead git-diff audit)
File này ghi bằng **Write tool** (KHÔNG Bash-write, KHÔNG mojibake), đúng và chỉ đúng path được PIN trong ISOLATION. 0 file khác bị đụng. Đây đồng thời là **datapoint sống cho mục treo #3**: vai `investigator-codebase` khai read-only nhưng runtime **CÓ** Write/Edit — khớp `58e28bae:42` *"chặn bằng thiếu-tool, không chỉ bằng lời dặn"*.

View File

@ -0,0 +1,139 @@
# sub-reviewer-0 — R1 `anchor-verify` (S144 adap đợt-11)
> **Run:** `2026-07-22-S144-adap-dot-11` · **Vai:** reviewer (adversarial) · **Câu hỏi:** nền SỰ KIỆN của spec có đứng vững không?
> **Target:** `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` (17.559 B)
> **Phạm vi:** 60 neo tự mở file kiểm (16 neo mã/repo SE + 44 neo trích-dẫn 10 broadcast). Không neo nào được chấm mà chưa mở file.
## VERDICT — `PASS_WITH_FIXES`
**Nền sự-kiện ĐỨNG VỮNG.** 55/60 neo KHỚP nguyên văn · 3 neo KHỚP-nội-dung nhưng **lệch số dòng** · 2 neo **LỆCH thật** (1 neo trỏ nhầm file, 1 neo cắt nửa dòng làm rơi một khoản "áp cho MỌI nhà"). **0 neo KHÔNG TÌM THẤY.**
Không có trích dẫn nào sai chữ tới mức đổi nghĩa. Các suy-luận nặng của spec (P2-1 FAIL clamp · P2-2 đơn-vị-thứ-ba · P3-3 gap CLAUDE.md · P4-2 outbox/all · P4-3 lệch sổ garble) đều **tự đứng được bằng bằng chứng độc lập tao đo lại**.
| Trục | Số |
|---|---|
| Neo chấm | **60** |
| KHỚP | **55** |
| KHỚP nhưng lệch số dòng | **3** (B10 · B14 · B40) |
| LỆCH | **2** (A11 · B43) |
| KHÔNG TÌM THẤY | **0** |
| MAJOR | **4** · MINOR **5** · nit **2** |
---
## MAJOR (phải xử trước khi worker thực-thi)
### M1 — `settings.json:11` trỏ NHẦM FILE (P4-1)
- Spec `:129`: *"`settings.json:11` pin Opus từ 07-20"*.
- Trong repo: `.claude/settings.json` **330 B, 15 dòng, 0 hit** `opus|model|fable`; `git log -1` = **`23bbe97` 2026-07-15**. Dòng 11 = `]`.
- Sự thật nằm ở file **NGOÀI repo**: `/c/Users/pqhuy/.claude/settings.json:11: "model": "claude-opus-4-8[1m]"` — mtime **2026-07-20 13:38****nội dung + số dòng + ngày đều đúng, chỉ SAI ĐƯỜNG DẪN**.
- Vì sao MAJOR: worker/reviewer nào grep trong repo sẽ ra 0 hit và kết luận claim bịa; file global **không nằm trong git** ⇒ claim không tái-lập được bằng CI. Sửa: ghi rõ `~/.claude/settings.json:11` (global, untracked) mỗi lần nhắc.
- Phần còn lại của P4-1 **KHỚP**: `docs/STATUS.md:450` (ô canonical §Sub-agents, CURRENT STATE) vẫn ghi *"em main **Fable 5** (1M) Max"*; `session-start.md:43` outage-recipe bảo fallback sang `claude-opus-4-8[1m]` = đúng thứ đang pin ⇒ **no-op có thật**. Đã có tiền-lệ ghi ở `STATUS.md:462` ("Còn CHỜ ANH") ⇒ xếp O-5 là đúng thẩm quyền.
### M2 — `cost-lens:50` bị cắt nửa dòng, rơi khoản ③ "áp cho MỌI nhà"
- Spec `:21` xếp `cost-lens` = **GHI NHẬN**, neo `:50`.
- `:50` nửa đầu đúng: *"FYI owner-side — KHÔNG floor, không bắt làm gì."* **Nửa sau cùng dòng đó**: *"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ): pattern suggest-1-dòng-non-blocking dùng cho bất-kỳ lựa-chọn vận-hành nào lead làm thay owner được nhưng owner muốn giữ mắt nhìn."*
- Spec chỉ mang `cost-lens:28` (cột "đốt đơn-vị NÀO") vào P2-2; **khoản ③ không vào bất kỳ mục P nào**. Hướng lệch = **under-claim** ⇒ rủi ro bỏ sót thứ hub nói rõ là dùng được cho mọi nhà.
### M3 — C11 giẫm lên knob đã đánh dấu OWNER (P3-2)
- Chẩn đoán của spec **ĐÚNG**: `session-start.md:135` dùng `today last_sleep_at ≥ 7 ngày`; và mark `RC-pqhuy1987-20-06-2026-10-29-11` (`.claude/governance/ACTIVE-MARKS.md:17`, **🔖 Active-High, anh-confirm S79**) đúng là tuyên *"time/age/recency-decay = false-proxy"* ⇒ SE tự mâu thuẫn với chính mark mình.
- **Nhưng** chính dòng `:135` khai: *"🔴 **KHÔNG bịa số** (giữ INFORM 7-ngày — **DP-5 quyền owner cục-bộ** B1 §3.4)"*.
- C13-checklist `C11` giao **em-main**, acceptance `grep 'ngày|7 day' trong trigger = 0` ⇒ AI **gỡ knob owner đã chốt**. Theo `eval:24`, "bỏ check / đổi cơ chế / thêm gate" = **chủ-dự-án-quyết-LUẬT**; O-1 của spec chỉ phủ **CON SỐ**, không phủ **đổi cơ chế**.
- Sửa: tách C11 thành (a) đo + đề-xuất (AI) và (b) flip cơ-chế → thêm **O-6 owner-quyết-LUẬT**.
### M4 — Nhãn "đo được" không có đường phản-chứng (P0-2)
- Spec `:57`: *"**Nguyên nhân đo được**: … lane sống dùng 21/23 tool-use, lane chết dùng 28/34/35"*.
- `grep "21/23\|28/34/35\|tool-use" run.md sub-investigator-codebase-*.md` trong run-folder = **0 hit**. Không có artifact trên đĩa để ai đó làm con số này TRƯỢT nếu nó sai.
- Load-bearing thật: chính con số này dùng để **bác** phương án thay thế ("Fix KHÔNG phải nâng `maxTurns`"). `maxTurns: 20` thì tao xác nhận (`investigator-codebase.md:14`); phần tool-use thì không.
- Sửa (rẻ, 1 dòng): khai nguồn = khối `<failures>` của harness trong phiên, **không lưu đĩa** — hoặc bỏ nhãn "đo được", giữ nhãn quan-sát.
---
## MINOR
- **m1 — B10:** prompt-floor *"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"* nằm ở `depth-axis:36`; spec cite `:38-43` (trong khoảng đó `:42` chỉ có bản nén *"đồng-ý-lại=0-điểm"*). Chữ đúng, dòng lệch.
- **m2 — B14:** *"áp cho MỌI dự-án"* nằm ở `goi-chot:68` (§6 PROJECT-FIT), spec đặt cạnh `goi-chot:52`.
- **m3 — B40:** `depth-cost:59` được để trong ngoặc kép nhưng là **paraphrase rút gọn**. Nguyên văn: *"nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy 'chết' hay thấy 'sạch'?"* — spec: *"tầng chết thì tầng sau thấy 'chết' hay 'sạch'?"*. Nghĩa giữ, chữ không khớp 100%.
- **m4 — P1-3 neo hụt:** 3 nhãn `APPLIED`/`DORMANT`/chờ-judge (`:37`), literal *"% = FLOOR theo evidence, không phải ceiling"* (`:38`) và negative-control (`:39`) đều là **nguyên văn hub**`harness-dong-du-vong:37-39`; spec chỉ cite `:47`. Nên cite `:37-39` — vì C5 acceptance đòi đúng literal đó, cite hụt làm nó trông như chữ SE tự đặt.
- **m5 — P4-3 phân loại trước khi cộng:** "phiên này +2 ⇒ ×27". 3 lane chết lượt-1 là **cháy maxTurns**, KHÁC class #53 (wrong-slice-of-transcript). Sổ đĩa (`feedback_agent_return_garble_recover.md:13`) tự có bài học (c) *"cập-nhật tally ở CUỐI phiên"* — spec đã theo; chỉ cần thêm bước phân-class.
## nit
- **n1 —** `auto:45` (nằm trong chính khoảng `:43-47` spec cite) ghi *"form tự quyết, **chức năng là sàn**"* ⇒ xếp `auto-toan-vong` thuần KHUYẾN NGHỊ hơi nhẹ hơn chữ "sàn". Hướng lệch = under-claim.
- **n2 —** Header spec khai *"10/10 `stamp_verify.py` exit 0"*. Script **có thật** (`scripts/stamp_verify.py`, 2.378 B, 20-07) nhưng tao **KHÔNG chạy lại** ⇒ chưa xác nhận độc lập, không tính là lỗi.
---
## Neo ĐỨNG VỮNG đáng ghi (chống hạ-bar — mấy claim này chịu được soi)
| Claim spec | Bằng chứng độc lập tao đo |
|---|---|
| P2-1 "SE FAIL clamp trần cứng" | `hmw.js:114` *"KHÔNG cap cứng (soft notice only)"* + `:115-117` chỉ `log()` — đúng, và floor `depth-axis:40` đòi *"clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần"* |
| P0-1 "lane chết → null → nuốt lặng" | `hmw.js:225` `return results.filter(Boolean)`; comment `:223` **tự khai** *".filter(Boolean) chỉ lọc null-lane do agent lỗi runtime"* ⇒ code tự tố chính nó |
| P0-1 "CẤM sửa thành throw" | `hmw.js:124-125` *"(per-lane throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn)"* — và vì nó nói **per-lane**, C8 (throw up-front) KHÔNG mâu thuẫn |
| P2-2 "đơn-vị THỨ BA" | `agents/README.md:251` = *"Effective tokens billed (after caching)"* — không phải "tổng vào+ra" cũng không phải "phía-ra" của `depth-cost:59` ⇒ falsifier đúng là CHƯA ĐO ĐƯỢC |
| P2-2 "đóng băng thời 7 sub-agent, roster nay 17" | `README:249-257` (`:253` "7 sub-agents spawn setup"); roster đo 2 cách độc lập: `ls .claude/agents/*.md`=18 (gồm README) và `grep maxTurns`=**17** |
| P3-3 "CLAUDE.md có nói posture không?" | `grep -i hmw CLAUDE.md docs/CLAUDE.md` = **0 hit** ⇒ gap discoverability-home CÓ THẬT |
| P4-2 "`/check-email` bước 2 chỉ ghi outbox/se" | `check-email.md:15`**dòng DUY NHẤT** chứa `outbox` trong cả file |
| P4-2 "outbox/all = 90 file" | `ls ../../AI_INFRA/broadcasts/outbox/all/*.md \| wc -l` = **90** (khớp chằn chặn) |
| P4-3 "đĩa ×25 vs STATUS/HANDOFF ×23" | đĩa: `feedback_agent_return_garble_recover.md:13` *"+ S143 ×5 = ×25 tổng"*; canonical: `STATUS.md:462` **và** `HANDOFF.md:5` đều *"×20/S118 → ×23/S143"***lệch 2 phía đều verify** |
| P4-4 F-6 ".gitignore thiếu lock" | `grep scheduled_tasks .gitignore` = NOT FOUND |
| ① "goi-chot khoản 3+4 binding" | `goi-chot:67-68` PROJECT-FIT: khoản 3 *"áp cho mọi dự-án … có lệnh điểm-dừng riêng"*, khoản 4 *"áp cho MỌI dự-án viết doc/rule"* |
| ①(4) "bẫy over-apply khoản 2" | `goi-chot:37` giữ nguyên *"resume/continue chỉ còn hợp-lệ cho hội-thoại tiếp-diễn trong cùng lượt làm việc"* ⇒ path-2 cứu #53 KHÔNG bị retire — spec chặn đúng |
| P1-2 "1 vai harness-audit mở rộng là hợp khung" | `harness-dong-du-vong:51` *"gộp hay tách audit (1 con kiểm nhiều vòng hay mỗi vòng 1 con) … mỗi dự-án tự quyết"* |
| "2/5 lane sống" | run-folder có đúng 2 sub-file investigator (`-0`, `-3`) |
---
## Bảng neo đầy đủ
### A. Neo vào mã/repo SE (16)
| # | Neo spec | Verdict | Bằng chứng |
|---|---|---|---|
| A1 | `hmw.js:225` = `return results.filter(Boolean)` | **KHỚP** | đúng nguyên văn; comment `:223` củng cố claim nuốt-lặng |
| A2 | `hmw.js:114-117` *"KHÔNG cap cứng (soft notice only)"* | **KHỚP** | `:114` nguyên văn; `:115-117` = `if (>16) log(...)` |
| A3 | `hmw.js:124-125` *"per-lane throw … STOP-SILENT, tệ hơn"* | **KHỚP** | câu vắt 2 dòng, nguyên văn |
| A4 | `agents/README.md:249-257` bảng cost "7 sub-agents" + "Effective tokens billed" | **KHỚP** | `:249` header · `:251` cột · `:253` hàng |
| A5 | roster 17 | **KHỚP** | 2 cách đo độc lập đều ra 17 |
| A6 | `investigator-codebase` maxTurns=20 | **KHỚP** | `investigator-codebase.md:14` |
| A7 | `reviewer` maxTurns=25 | **KHỚP** | `reviewer.md:14` |
| A8 | SE dùng sleep-check 7 NGÀY | **KHỚP (+cảnh báo M3)** | `session-start.md:135`, kèm nhãn DP-5 quyền owner |
| A9 | `/check-email` bước 2 chỉ `outbox/se` | **KHỚP** | `check-email.md:15` là hit duy nhất |
| A10 | sổ garble đĩa ×25 | **KHỚP** | `feedback_agent_return_garble_recover.md:13` |
| A11 | `settings.json:11` pin Opus từ 07-20 | 🔴 **LỆCH (nhầm file)** | repo `.claude/settings.json` 0-hit, mtime 07-15; global `~/.claude/settings.json:11` mới đúng, mtime 07-20 13:38 |
| A12 | `session-start.md:43` outage-recipe | **KHỚP** | `:43` đúng nội dung; hệ quả "no-op" đứng được nhờ file global (M1) |
| A13 | CLAUDE.md có nói HMW-mode? | **KHỚP (gap thật)** | 0 hit |
| A14 | `.gitignore` thiếu `scheduled_tasks.lock` | **KHỚP** | NOT FOUND |
| A15 | 2/5 lane sống | **KHỚP** | 2 sub-file trong run-folder |
| A16 | 10 thư inbox 07-18→07-21 | **KHỚP** | `ls` = 10 file |
### B. Neo trích 10 broadcast (44) — tóm tắt
- **`spawn-label`** `:22` `:22-27` `:43` `:51` + falsifier `:47` (khuôn C3) — **5/5 KHỚP** nguyên văn.
- **`depth-axis`** `:20` `:38` `:40` `:43` `:55`**KHỚP**; riêng **B10** verbatim F3 ở `:36` (lệch dòng).
- **`goi-chot`** `:28` `:29` `:37` `:44` `:45` `:52` `:59` `:74` + header §1/§3/§4 + PROJECT-FIT `:67-68`**KHỚP**; riêng **B14** *"áp cho MỌI dự-án"*`:68` (lệch dòng).
- **`harness-dong-du-vong`** `:42` `:44` `:47` `:51` `:59`**KHỚP**; +neo hụt m4 (`:37-39`).
- **`eval-quality`** `:13` `:15-24` `:19-22` `:24` `:22` `:31` `:55`**7/7 KHỚP** nguyên văn.
- **`auto-toan-vong`** `:19` `:21` `:27` `:35` `:43-47`**KHỚP**; nit n1 ở `:45`.
- **`3-khoan`** `:15` `:19-27` (`:25`) `:31-41` (`:36-37`,`:39`) `:47-51` `:53`**KHỚP**, kể cả claim *"hub tự khai đã đọc nhầm 1 lần"* (`:53`).
- **`depth-cost`** `:53` `:54` `:55` `:63`**KHỚP**; **B40** `:59` là paraphrase-trong-ngoặc-kép.
- **`cost-lens`** `:28` **KHỚP**; **B43** `:50` 🔴 **LỆCH — cắt nửa dòng** (M2).
- **`hub-tu-danh-gia`** `:62`**KHỚP**.
---
## Khuyến nghị (mô tả vấn đề + tiêu chí nghiệm thu, KHÔNG viết code hộ)
1. **M1** — mọi chỗ nhắc pin model phải ghi đủ đường dẫn `~/.claude/settings.json:11` (global, ngoài git). Nghiệm thu: grep spec, 0 lần xuất hiện chuỗi `settings.json:11` mà không có tiền tố `~/.claude/`.
2. **M2** — thêm 1 dòng vào P-list cho `cost-lens` khoản ③, hoặc khai rõ "đã cân-nhắc → BÁC vì lý do X". Nghiệm thu: bảng disposition có dòng riêng cho khoản ③.
3. **M3** — chuyển flip cơ-chế sleep-trigger sang mục OWNER-GATED (O-6); C11 giữ lại phần đo + đề xuất. Nghiệm thu: C11 không còn acceptance dạng `grep 'ngày' = 0` khi chưa có chữ owner.
4. **M4** — khai nguồn con số tool-use hoặc bỏ nhãn "đo được". Nghiệm thu: mỗi số mang nhãn đo-lường trong spec trả lời được câu *"phép kiểm nào làm nó TRƯỢT nếu sai?"*.
5. **m1-m4** — sửa số dòng cite (1 phút/cái). Nghiệm thu: mở đúng dòng, thấy đúng chữ.
6. **m5** — phân class trước khi cộng sổ garble ở closeout.
## Ghi chú phương pháp
- Mỗi neo chấm 1 trong 3: **KHỚP** / **LỆCH** / **KHÔNG TÌM THẤY**; không neo nào chấm mà chưa mở file.
- Lệnh dùng: `awk NR>=a&&NR<=b` in kèm `FILENAME:NR` (đọc đúng dòng, không tin grep-context), `git log -1 --` cho mtime/commit, `ls | wc -l` cho phép đếm.
- Không sửa file nào ngoài chính sub-MD này (isolation B6).

View File

@ -0,0 +1,186 @@
# sub-reviewer-1 — R2 scope-calibration (S144 adap dot-11)
**Vai:** reviewer adversarial · trục = "spec đòi ĐÚNG mức không?"
**Target:** `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` (177 dòng)
**Nguồn:** 10/10 thư `broadcasts/inbox/` đã MỞ THẬT (không suy diễn từ bảng của spec)
**Trạng thái:** DONE
---
## 0. VERDICT — `PASS_WITH_FIXES`
Phân hạng 4 mức của spec (BINDING / BINDING-mixed / KHUYẾN NGHỊ / GHI NHẬN) **đúng 10/10 ở mức THƯ** — mọi neo `file:line` trong bảng ①
đều khớp verbatim khi mở thư gốc. **0 ca phóng-đại ở tầng phân-hạng thư.**
Lỗi nằm ở **tầng khoản** (bên trong thư binding) và **tầng checklist**:
| Loại | Số | Mức nặng nhất |
|---|---|---|
| Phóng-đại (đòi hơn thư) | 2 | 1 MAJOR (C8 sai-trục + tự mâu-thuẫn) |
| Bỏ sót ràng buộc | 4 (+5 khuyến-nghị-cấp) | 2 MAJOR (`harness:46` khoản③ · `goi-chot:38+66+73`) |
| Owner-gate thiếu | 2 | 1 MAJOR (số trần C8) + 1 MAJOR (C12 ghi posture-toggle vào CLAUDE.md) |
| Trục 3 (depth-axis qualify) | — | **ĐÚNG**, có bằng chứng cơ học |
| Trục 4 (retire-resume) | — | **ĐÚNG**, đọc khớp `goi-chot:37` — nhưng bỏ nửa sau của khoản 2 |
---
## 1. TRỤC 1 — PHÓNG ĐẠI (spec đòi HƠN thư)
### 🔴 MAJOR P-1 — C8 "THROW" vừa SAI TRỤC vừa MÂU THUẪN với chính khoản mà nó viện
- Thư `depth-axis:40` (khoản ①): *"clamp trần cứng (vd ≤3) + **assert tổng-lượt ≤ trần**"* — trần này áp lên **SỐ LƯỢT của trục SÂU**
(cấu-hình đối chiếu `depth-cost:24`: *"5-góc + thử-phá + 3-đào-tầng-2 + thử-phá-2 = **10 lượt**"*).
- Spec `:158` (C8) lại ép trần lên **`taskList.length`** = **CHIỀU RỘNG** (số lane fan-out), neo vào `hmw.js:114-117` (`taskList.length > 16` soft notice).
Hai đại lượng khác nhau: `hmw.js:175` `parallel(A.taskList...)` = width; depth = *invocation hmw thứ hai* (chính spec `:100` nói vậy).
**fix đúng-chữ-nhưng-sai-trục**: làm xong C8 vẫn **KHÔNG**`assert tổng-lượt ≤ trần` cho trục sâu.
- Nặng hơn: `depth-axis:43` (khoản ④) ghi rõ vượt ngân-sách ⇒ *"BỎ đào + báo RÕ (**không văng lỗi**, không lặng-thầm bỏ), trả kết-quả chiều-rộng"*.
Spec `:98` chép đúng câu này (F4 "cận-ngân-sách LOUD") rồi `:158` yêu cầu **THROW****spec tự mâu thuẫn trong cùng 1 tài liệu**.
Cùng họ với chính lệnh CẤM của spec ở `:53` (P0-1 cấm `throw` vì STOP-SILENT).
- Bối cảnh làm nó nặng thêm: `depth-cost:52` bài-học-1 *"cổng-ngân-sách tự hạ được = **máy đè lệnh owner**"* — SE có `/fable-real` = lệnh owner đích-danh;
thêm 1 cổng ngân-sách cứng ở đúng đường fan-out là đúng lớp bệnh thư cảnh báo. (Thư này spec xếp GHI-NHẬN nên không soi bài-học-1 — xem O-4 dưới.)
- **Acceptance đề nghị:** C8 tách 2 dòng — (a) *trục SÂU*: assert `tổng-lượt ≤ trần` (trần = O-2, owner); (b) *trục RỘNG*: giữ soft-notice **hoặc** LOUD-skip
theo `depth-axis:43`, **không** THROW. Nếu vẫn muốn THROW ở width → phải khai là **quyết-định SE vượt floor**, không được viết như "adopt khoản ①".
### 🟡 MINOR P-2 — C6 sweep hồi-tố rộng hơn floor văn bản
- `goi-chot:55` (Floor chuyển được): *"adopt khuôn-câu hai-dạng … cho mọi tài-liệu governance **mới**"*; `:53` *"cửa này chặn từ lúc **VIẾT**, không đợi tới lúc trả nợ"*;
`:54` hub tự khai *"máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có**"*.
- Spec `:83` + C6 `:156` đòi **sweep toàn bộ doc governance SE + "đếm trước/sau"** = hồi-tố toàn corpus.
Luật `:52` viết không giới-hạn thời-gian nên cách đọc này *không sai*, nhưng nó là **cạnh nặng nhất** của một luật mà chính hub chưa có máy,
và đụng thẳng `goi-chot:44-45` (điểm-dừng phải rẻ) + `hub-tu-danh-gia:36` (attention owner = tài nguyên khan hiếm nhất).
- **Acceptance đề nghị:** giữ luật forward-looking là BẮT BUỘC; phần hồi-tố → time-box/mẫu (vd: doc governance sửa trong 30 ngày) + khai rõ residual, thay vì "mọi câu còn lại".
*(Đã soi và KHÔNG tính là phóng-đại: P1-1 "áp MỌI kênh spawn" khớp `spawn-label:27` khoản④ 4-loại; P1-5 audit `/pause` khớp `goi-chot:46` + `:74`.)*
---
## 2. TRỤC 2 — BỎ SÓT RÀNG BUỘC (trục nguy hiểm nhất)
### 🔴 MAJOR O-1 — `harness-dong-du-vong` khoản ③ (tuần-tự trong-vòng) KHÔNG có 1 dòng nào trong spec
- Thư `:46`: *"**Tuần-tự trong-vòng**, song-song giữa-vòng: audit **chờ đúng con đo vòng mình xong** (chống chấm bản stale); các vòng khác nhau chạy song song thoải mái."*
- Spec xếp thư này **BINDING-floor 4 khoản** (`:17`) nhưng chỉ triển khai khoản ① (P1-2) + khoản ④ (P1-3). Khoản ③ **vắng mặt** ở cả ② CÁCH IMPLEMENT lẫn checklist.
- Đây **không** phải khoản vô hại: `hmw.js:175` `const results = await parallel(A.taskList.map(...))`**không có cơ chế tuần-tự trong 1 invocation**.
Nếu C4 mở rộng `harness-audit` (file có thật: `.claude/agents/harness-audit.md`) sang 3 vòng và bơm chung 1 `taskList` với các con ĐO ⇒ audit chấm **bản stale/rỗng** = đúng lỗ thư vá.
Spec đã biết tính chất này (`:100` *"`hmw.js` `parallel()` **không tuần-tự-hoá** ⇒ tầng-2 = invocation hmw THỨ HAI"*) nhưng **không** áp cùng kết luận cho vòng audit.
- **Acceptance đề nghị:** C4 thêm 1 dòng — audit của vòng X chạy ở **invocation hmw sau** con-đo vòng X (hoặc bằng chứng cơ chế tương đương), + nêu rõ vòng khác vẫn song song.
### 🔴 MAJOR O-2 — `goi-chot` khoản 2 **nửa sau** bị bỏ: SE dùng resume + đang DỰA vào model-pin
- Spec `:43` đọc **ĐÚNG** phần retire (xem trục 4). Nhưng thư còn 2 câu spec im:
- `:38` *"Floor chuyển được: nếu bạn đang resume agent VÀ dựa vào model-override sống qua resume — **coi chừng nó không sống** … Muốn giữ resume → **tự verify trên env mình trước**"*.
- `:66` (PROJECT-FIT) *"Khoản 2: **chỉ áp nếu bạn dùng resume/continue agent kèm model-override**"* → SE **đúng là ca ĐƯỢC ÁP**.
- `:73` (SELF-CHECK) *"**Grep chỗ dùng resume/continue agent** — có chỗ nào đang DỰA vào model-override sống qua resume không?"* = việc rẻ, chạy được ngay.
- SE thoả đúng tiền-đề: worker-tier-pin bơm model tại spawn (`hmw.js:219` `model: resolveModel(role, raw, t && t.tier, i)`), và path-2 `SendMessage-resume` là lưới #53
(spec `:43` khai *"đã dùng 2 lần thành công hôm nay"*). ⇒ Nếu override **không** sống qua resume thì lane được cứu chạy **model khác** mà không ai biết —
im lặng đúng kiểu `depth-cost:53` *"thử-rồi-chết ≠ chạy-rồi-sạch"*.
- Spec kết luận "path-2 KHÔNG bị retire" rồi **dừng**, nên mất luôn nghĩa vụ kèm theo. Đây là bỏ-sót **có hậu quả**, không phải thiếu chữ.
- **Acceptance đề nghị:** thêm 1 mục P4 (rẻ): grep call-site resume + ghi 1 dòng verdict *"SE có/không dựa vào override sống qua resume"*; nếu CÓ → đo 1 lần trên env SE trước khi tiếp tục tin path-2.
### 🟠 MAJOR-nhẹ O-3 — `harness-dong-du-vong` khoản ② (propose-only) không có dòng disposition
- Thư `:45`: *"**Audit = propose-only**: trả TEXT, lead là người duy nhất ghi; kèm rào tường minh chống sub tự ghi sổ."*
- SE **nhiều khả năng đã đạt** (`hmw.js:185` `const writeGuard = …` + G-015), nên đây là lỗi **sổ sách**, không phải lỗ năng lực.
- Nhưng chính spec ra luật `:169` *"Bảng disposition **TỪNG DÒNG**, không báo số tổng"* — tuyên "4 khoản" rồi làm 2, im 2 = đúng bệnh `meta-count` S119 mà spec tự dặn tránh.
- **Acceptance đề nghị:** bảng 4 dòng/thư-binding với disposition {ADOPT / ĐÃ-CÓ + neo / N-A + lý do}.
### 🟡 MINOR O-4 — 5 khoản "dùng được ngay" trong nhóm GHI-NHẬN/KHUYẾN-NGHỊ bị rơi (cite nửa dòng)
| # | Khoản bị rơi | Neo | Ghi chú |
|---|---|---|---|
| a | `hub-tu-danh-gia:27` *"điểm tự-chấm của lead phải để **NGOÀI mọi kênh sub với tới được** — 'không đưa vào pack' chưa đủ khi sub đọc sổ chung"* + falsifier `:57` | thư | **Fire ĐỎ ngay tại run này**: spec (do lead viết) mang sẵn phán quyết `:67` "SE hiện **FAIL rõ**", `:95` "⇒ **FAIL**", `:18` "→ **SE QUALIFY**" rồi đưa cho chính reviewer chấm ⇒ anchor ngầm. Bằng chứng ngôi-thứ-nhất. |
| b | `hub-tu-danh-gia:62` *"pattern eval-3-góc (§1) + 3 câu kiểm (§6) **dùng được ngay ở mọi nhà**"* | spec chỉ trích nửa sau cùng dòng (*"điểm số và findings là của hub, không áp"*) | cite **nửa dòng** — nửa còn lại là lời mời áp |
| c | `cost-lens:50` *"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ): pattern suggest-1-dòng-non-blocking"* (+ `:44`) | spec cite đúng dòng `:50` nhưng chỉ lấy vế "KHÔNG floor" | cùng lỗi cite-nửa-dòng |
| d | `depth-cost:52` bài-học-1 *"lệnh ép-full-power của owner phải khoá cả chiều MÁY"* | thư | trực tiếp liên quan C8 (P-1) |
| e | `auto:29-31` + `:46` instrument **tự làm tươi** số-đo-đóng-băng | thư | SE có đúng vật đó: bảng cost `agents/README.md:249-257` "đóng băng" (spec `:103` tự khai) — P2-2 chỉ re-ground **1 lần**, không wire nhánh làm-tươi |
*(Nhóm này là khuyến-nghị-cấp ⇒ bỏ được, nhưng phải là bỏ **có chữ**, không phải im.)*
### ✅ Không sót (đã kiểm từng khoản)
- `spawn-label` 4/4 khoản có chỗ đứng (①→P1-1 · ②③→C3 *"0 label bị cắt chữ"* + khuôn 1 kiểu · ④→P1-1 "MỌI kênh spawn" phủ đủ 4 loại `:27`).
- `depth-axis` 4/4 khoản có mặt (F1-F4 `:94-98`), khớp `:40-43`.
- `3-khoan` 3/3 khoản có mặt (P3-2 `:47-51` · P3-3 `:31-41` · P3-4 `:19-27`).
- `goi-chot` khoản 3 (`:44-46`)→P1-5 · khoản 4 (`:52`)→P1-4 · khoản 1/5 → P4-1 + O-5.
---
## 3. TRỤC 3 — ĐIỀU KIỆN KÍCH HOẠT `depth-axis:20` → SE QUALIFY = **ĐÚNG**
Thư `:20`: *"Áp cho dự-án nào có **ensemble đa-agent / đa-lăng-kính** (nhiều model/nhiều góc nhìn chạy song song rồi **tổng-hợp**). Không có ensemble → FYI, chưa cần áp."*
Bằng chứng cơ học (không phải suy luận):
1. `hmw.js:175``const results = await parallel(A.taskList.map((t, i) => () => {` ⇒ chạy **song song**.
2. `hmw.js:215-219` — mỗi lane `agent(prompt, { agentType: role, …, model: resolveModel(...) })`**đa-agent, đa-vai**, model per-lane.
3. `hmw.js:9`*"fan-out roster ĐẦY-ĐỦ … return findings + checklistEvidence + memoryDelta"*; bước `@P3` em-main **VERIFY + harvest** ⇒ có **tổng-hợp**.
4. Run đang chạy: `/fable-clone investigator-codebase` 5 lane (spec `:5`) + trio 3-lăng-kính `.claude/agents/harness-{eval,refine,audit}.md` tồn tại trên đĩa.
⇒ 4/4 mảnh của định nghĩa `:20` có mặt. **Không phóng đại.** Kèm theo: `:20` chỉ mở cửa áp — `:55` mới là điểm sàn (*"có trục sâu bật-được + escape width-only, **KHÔNG bắt buộc default nào**"*), và spec trích đúng câu này ở `:94`.
---
## 4. TRỤC 4 — OVER-APPLY KHOẢN 2 GÓI-CHỐT → cách đọc của spec **ĐÚNG**
- Thư `goi-chot:37`: *"…resume/continue **chỉ còn hợp-lệ cho hội-thoại tiếp-diễn trong cùng lượt làm việc**, không phải cơ-chế bảo-toàn model."*
- Thư `:32` (tiêu đề khoản) giới hạn retire vào đúng *mục-đích* *"giữ context / chắc model"*.
- SE `SendMessage-resume` cứu #53 = resume **in-session, cùng lượt làm việc**, mục đích = vớt output của con đang sống, **không** phải giữ model/context.
⇒ spec `:43` kết *"path-2 KHÔNG bị retire"* = **đọc đúng**, không over-apply. Giữ nguyên lưới #53.
- ⚠️ Nhưng xem **O-2**: đúng ở vế retire không miễn cho SE nghĩa vụ `:38`/`:66`/`:73`.
---
## 5. TRỤC 5 — OWNER-GATED ĐỦ CHƯA (neo `eval:24` {AI-tự-sửa · owner-quyết-SỐ · owner-quyết-LUẬT})
**O-1…O-5 hiện có: đúng và cần.** Thiếu 2 ca, cả 2 đều rơi vào 2 cột owner:
### 🔴 MAJOR G-1 — C8 chứa **con SỐ** + **đổi CƠ CHẾ**, cả hai đều thuộc owner
- `eval:24` xếp *"đổi cơ chế, thêm gate"* = **chủ-dự-án-quyết-LUẬT**; *"ngưỡng, target"* = **chủ-dự-án-quyết-SỐ**; *"AI không tự quyết hai cột sau"*.
- C8 `:158` giao em-main biến soft-notice (`hmw.js:114-117`) thành **THROW** (= thêm gate cứng, đổi cơ chế) tại ngưỡng `<trần>` (= số).
- O-2 chỉ phủ *"giá trị clamp"* của **trục sâu**; trần **width** hiện là `16``hmw.js:115`**không** nằm trong O-1…O-5.
- Spec tự ra luật `:172` *"**Số của owner** — O-1…O-5 **CẤM** tự đặt"* ⇒ worker cầm C8 sẽ hoặc bịa số, hoặc kẹt. **Mâu thuẫn vận hành.**
- **Acceptance đề nghị:** C8 gắn nhãn `BLOCKED-by-O-2`, và bổ sung `O-6 = trần width + cơ chế (throw hay LOUD-skip)`.
### 🔴 MAJOR G-2 — C12 ghi **posture đang bật** vào `CLAUDE.md` = ghi trạng-thái TOGGLE vào file luật
- Đo tại đĩa: `grep "HMW-mode" CLAUDE.md docs/CLAUDE.md`**0 hit** (lỗ spec nêu ở `:121`**CÓ THẬT**).
- Nhưng HMW-mode là **toggle owner-consent**, không phải mặc-định thường-trực:
- `.claude/commands/ultra-on.md:2`*"BẬT HMW-mode … **Gõ = anh CONSENT chạy Workflow (deliberate on-ramp)**"*;
- `.claude/commands/ultra-off.md:9`*"**xóa marker** `.claude/hmw-mode.on``/session-start` kế báo **OFF**"*.
- `3-khoan:39` chỉ áp cho *"chỉ-thị nào **đổi hành vi mặc định của mọi phiên về sau** (operating-posture)"*. Trạng thái bật/tắt **theo phiên** không thuộc lớp đó.
- Viết thẳng "HMW-mode ON" vào file-đọc-đầu-tiên ⇒ (i) **sai ngay khi owner gõ `/ultra-off`** (drift by construction), (ii) biến một **cửa consent của owner** thành **default có văn bản** = owner-quyết-LUẬT, (iii) trái B1 (derived trỏ canonical, không chép giá-trị).
- **Acceptance đề nghị:** C12 đổi thành *"CLAUDE.md có **1 dòng trỏ NƠI xem posture hiện hành** (marker `.claude/hmw-mode.on` + `/session-start`), KHÔNG chép giá-trị ON/OFF"*; nếu owner muốn HMW-mode thành mặc-định thường-trực → đó là O-mới, hỏi anh.
### 🟡 MINOR G-3 — vài số nhỏ khác tự đặt
`:58` *"≤3 file/lane"* (P0-2/C2) là **ngưỡng** do AI đặt. Rủi ro thấp (kỷ luật nội bộ, đảo được), nhưng spec đã gate `min_pending_shards` (O-1) nên bỏ trống ca này là **bất-nhất**.
Nêu 1 dòng "AI-tự-đặt, đảo được" là đủ.
---
## 6. Ghi chú công bằng (những chỗ spec làm ĐÚNG, chống Smart-Friend ngược)
- **10/10 neo trong bảng ① khớp verbatim** khi mở thư gốc — tao kiểm từng dòng: `spawn-label:22` · `harness:42` · `depth-axis:38`+`:20` · `goi-chot:44-45/:52/:29/:37/:59` · `eval:13` · `auto:43-47` · `3-khoan:15` · `cost-lens:50` · `depth-cost:63` · `hub-tu-danh-gia:62`. Không có neo bịa.
- 3 thư tự khai *"KHÔNG floor"* (`cost-lens:50` · `depth-cost:63` · `hub-tu-danh-gia:20/62`) được xếp GHI-NHẬN ⇒ **không** ép SE làm việc hub không đòi.
- `eval-quality` xếp KHUYẾN NGHỊ dù `:13` nói *"Khung = sàn chức năng"*: lệch **hướng nới**, nhưng thư **không** có mục "Nấc adopt" và **0** câu `/adap-apply` ⇒ chấp nhận được; và spec vẫn giao C10 với acceptance có răng (*"bịa input sai → nó ĐỎ"*).
- Phát hiện `:177` (goi-chot **không** có "Nấc adopt", 0 `/adap-apply` dù binding nhất) — tao **xác nhận đúng**: mở thư, không có mục nào tên "Nấc adopt", không có chuỗi `/adap-apply`. Đây là quan sát tinh, đúng loại chống-lệch-bảng-nấc.
- `hmw.js:225` `return results.filter(Boolean)`**đúng nguyên văn**; P0-1 chẩn đúng, và lệnh CẤM-throw của nó khớp comment `hmw.js:124-125`.
---
## 7. Danh sách chốt
**{phóng-đại}**
1. `P-1` MAJOR — C8 (`spec:158`) ép trần lên **width** `taskList.length` trong khi `depth-axis:40` nói **tổng-lượt trục sâu**; và **THROW** trái `depth-axis:43` *"không văng lỗi"* + trái chính `spec:98`.
2. `P-2` MINOR — C6 (`spec:156`) sweep **hồi-tố toàn corpus** trong khi floor `goi-chot:55` viết *"mọi tài-liệu governance **mới**"* và `:54` khai hub **chưa có máy**.
**{bỏ-sót}**
1. `O-1` MAJOR — `harness-dong-du-vong:46` khoản ③ **tuần-tự trong-vòng** (chống chấm bản stale) — 0 dòng trong spec; `hmw.js:175` không tuần-tự-hoá ⇒ rủi ro thật cho C4.
2. `O-2` MAJOR — `goi-chot:38` + `:66` + `:73` — SE dùng resume + dựa model-pin (`hmw.js:219`) ⇒ phải **tự verify override sống qua resume**; spec dừng ở "không bị retire".
3. `O-3` MAJOR-nhẹ — `harness-dong-du-vong:45` khoản ② propose-only: không có dòng disposition (dù `hmw.js:185` writeGuard nhiều khả năng đã đạt) — vi phạm chính `spec:169`.
4. `O-4` MINOR ×5 — `hub-tu-danh-gia:27`+`:57` (anchor điểm-tự-chấm, **fire đỏ ngay run này**) · `hub-tu-danh-gia:62` · `cost-lens:50` khoản③ · `depth-cost:52` bài-học-1 · `auto:29-31`+`:46` (instrument tự-làm-tươi).
**{owner-gate thiếu}**
1. `G-1` MAJOR — C8: trần width + cơ chế THROW = owner-SỐ + owner-LUẬT (`eval:24`), chưa có trong O-1…O-5.
2. `G-2` MAJOR — C12: ghi giá-trị posture TOGGLE (`ultra-on.md:2` / `ultra-off.md:9`) vào `CLAUDE.md` = owner-LUẬT + drift-by-construction.
3. `G-3` MINOR — `spec:58` "≤3 file/lane" là số AI tự đặt (chấp nhận được nếu khai).
**Điều kiện để lên PASS:** đóng `P-1`, `O-1`, `O-2`, `G-1`, `G-2` (5 mục) — mỗi mục 1 dòng sửa trong spec, không mục nào đòi code.

View File

@ -0,0 +1,102 @@
# sub-reviewer-2 — R3 "acceptance-teeth" (S144 adap dot-11)
> Vai: reviewer adversarial. Câu hỏi duy nhất: **qua được C1→C13 thì có NGHĨA LÝ gì, hay chỉ xanh-vì-mù?**
> Khung áp: `broadcasts/inbox/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md` (gọi tắt `eval:`).
> Đối tượng chấm: `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` §③ C1→C13 (`:149-172`).
## 0. VERDICT — `PASS_WITH_FIXES`
**4 răng-thật · 4 nửa-răng · 5 nghi-thức-rỗng.** Spec đáng làm, nhưng **thước đo của nó yếu hơn việc nó mô tả**.
Hai mục phải sửa trước khi worker chạy:
- **C6 rỗng-hoàn-toàn** — tập-đo có **0 phần tử**; đạt mà không cần sửa gì; sweep này **đã chạy rồi** ở wave-3 với pattern RỘNG HƠN.
- **C11 bất-khả-thi** — muốn `grep=0` phải **xoá một luật owner đang GIỮ**, trái chính luật-chung #6 của spec.
Một mục **độc-hại**: **C12** đẩy em-main viết vào `CLAUDE.md` một claim **stale-by-construction**.
## 1. Ground-truth đã đo (lượt 3-5, re-đo từ đĩa — không chép spec)
| Neo | Lệnh | Kết quả |
|---|---|---|
| `hmw.js:225` | `grep -n "filter(Boolean)"` | `return results.filter(Boolean)` — XÁC NHẬN spec ①(2) đúng |
| `hmw.js:114-116` | `grep "cap c"` | `S4 — số task THOẢI MÁI … KHÔNG cap cứng (soft notice only)`; ngưỡng `>16` chỉ `log()` ⇒ C8 chưa có clamp: ĐÚNG |
| `hmw.js:124-125` | idem | `throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn` + `(trước parallel) — halt KHÔNG phụ-thuộc semantics parallel()` |
| `fable-clone.md` (70 dòng) | `grep "lượt"` | **KHÔNG có** chuỗi `trần lượt` (hiện = 0) |
| `.claude/agents/` | `ls` | 18 mục `README.md` = **17 vai** ⇒ spec P2-2 "roster nay 17" **ĐÚNG**; `harness-audit.md` **đã tồn tại** ⇒ C4 không phải đẻ vai mới |
| **C6 tập-đo** | `grep -rn "máy sẽ" docs/governance/ .claude/` (trừ `runs/`) | **0 hit** |
| C6 toàn repo | `grep -rn "máy sẽ" --include="*.md"` (trừ `runs/`) | **7 hit — 100% nằm trong `broadcasts/`, 100% là use⟂mention** (câu *định nghĩa* luật, không phải lời hứa) |
| C6 rủi-ro thật | `grep "detector\|guard\|hook"``chặn\|quét\|bắt\|đảm` trong `docs/governance/*.md` | **19 hit****ngoài** tập-đo của C6 |
| **C6 trùng-việc** | `broadcasts/outbox/ai_infra/2026-07-18-se-to-ai_infra-adap-wave-3-ban-17-07-bao-nac.md:26` | *"Grep lớp câu 'máy sẽ quét / detector phủ / đã fault-inject' trên governance SE ra **3 câu** … cả 3 trace được vào mã đang chạy … **Không câu nào phải hạ chữ**"* |
| **C12 tiền-đề** | `grep -n "HMW\|posture\|ensemble" CLAUDE.md docs/CLAUDE.md` | **0 hit** (CLAUDE.md 147 dòng) ⇒ phát hiện P3-3 của spec **ĐÚNG** |
| **C12 bẫy** | `fable-clone.md:16` | *"Hiệu-lực CHỈ lượt đó — KHÔNG còn 'về mặc-định', KHÔNG marker, KHÔNG persist"* |
| **C11 xung-đột** | `.claude/commands/sleep-recovery-memory-l2.md:52` | *"**INFORM 7-ngày GIỮ** (quyền owner cục-bộ, B1 §3.4; cấm-là-cấm-hub-phát-chuẩn)"* |
| C11 over-broad | `grep -c "ngày"` file trên | **6** — phần lớn văn xuôi (`:68/:76/:80`), KHÔNG phải trigger |
| **C7 đường pause** | `pause.md:44` (53 dòng) | đã gọi `powershell.exe … scripts/nhip-no-probe.ps1` **ngay trong** đường dừng |
| C10 mẫu-số | `ls scripts/` | ~10 thước: `governance-detectors` · `memory-archive-gate` · `memory-selfimprove-audit` · `mfe-eval` · `applied-eval-nokey` · `agent-frontmatter-eol-check` · `crystallized-backfill` · `nhip-no-probe` · `measure-agent-memory` · `deps-audit` |
| C5 máy nền | idem | `scripts/mfe-eval.ps1` + `scripts/applied-eval-nokey.ps1` **có thật** |
## 2. Bảng C1→C13 — 4 câu hub (`eval:15-24`)
| # | Lớp đo (`eval:20`) | Goodhart-able? — đường lách cụ thể | Pos/Neg-control (`eval:31`) | Bỏ thì lọt gì (`eval:22`) | **Verdict** |
|---|---|---|---|---|---|
| **C1** | integrity→**efficacy** | Khó. Hardcode `log('lane CHẾT')` qua được vế dương nhưng **trượt vế âm** | **CÓ CẢ 2** (null→phải có · sạch→phải không) + `node --check` | Đúng ca đã cắn hôm nay: 3/5 lane chết, lead thấy "sạch". **Active, không dormant** | **RĂNG THẬT** |
| **C2** | **activity** (2/3 vế không đo được) | **CAO**`grep -c 'trần lượt' ≥1` hiện = 0, gõ đúng cụm chữ là xong | KHÔNG | Lane chết vì cháy lượt — ca thật, nhưng **thước không quy được NHÂN**: marker C1 chỉ biết `null`, không biết *vì sao* | **NỬA-RỖNG** |
| **C3** | **activity**, tự-chấm | **CAO** — chấm chính label mình vừa viết, n=3, **không có artifact** (label panel ephemeral, `grep` không truy được; chỉ `hmw.js:9` là chuỗi tĩnh) | KHÔNG (thiếu ca label-hỏng-phải-trượt) | Ca thật có (`spec:67` `"Probe harness-eval alive"` thiếu pha+phiên) ⇒ **dormant-đúng-thiết-kế, thước hỏng** | **RỖNG** |
| **C4** | integrity→outcome | TRUNG BÌNH — re-check con số **dễ nhất**; **không cấm em-main tự kiểm vòng chính mình đo** (trái `m-3 no-self-exempt` S139) | Một nửa (thách-CLEAN ≥1 lens) | Vòng báo CLEAN sai — ca thật S143 (lead ĐO tốt nhưng ĐẾM-VỀ-MÌNH ~13%) | **NỬA-RĂNG** |
| **C5** | **efficacy** (nửa) | Vế `payload chứa literal 'FLOOR theo evidence'` = dán chuỗi | **CHỈ NEG, THIẾU POS** 🔴 — matcher **luôn** trả 0-hit qua neg-control **hoàn hảo** | Matcher rác báo APPLIED bừa | **NỬA-RĂNG** |
| **C6** | **activity, tập rỗng** | **TUYỆT ĐỐI** — tập-đo literal = **0/19**; và **rời-tập-đo** miễn phí: viết "hệ thống chặn X" là thoát | KHÔNG (không có câu-hứa-giả cắm vào) | **KHÔNG LỌT GÌ MỚI** — sweep rộng hơn đã chạy 3/3-sạch @wave-3 | **RỖNG HOÀN TOÀN** 🔴 |
| **C7** | **activity** | **CAO** — "đo wall-clock 1 lần, **ghi số**" **PASS ở MỌI giá trị** (`eval:21c` nhãn-hứa-không-ép). Tập cấm chỉ liệt "spawn-agent/quét-rộng" ⇒ `pause.md:44` gọi `powershell.exe` **lọt qua khe** | KHÔNG | Điểm dừng đắt lên — ràng buộc CỨNG `goi-chot:44` | **NỬA-RỖNG** |
| **C8** | integrity→efficacy | Khó — đòi **THROW**, `log` không giả được | **CÓ CẢ 2** (fault-inject 2 chiều) | `depth-axis` F1 trần cứng; hiện `hmw.js:114-116` = FAIL đo được | **RĂNG THẬT** |
| **C9** | activity + **mâu-thuẫn** | "cột đơn-vị hiện diện" = có cột là xong | KHÔNG | Bảng cost đóng băng ở 7 vai (roster thật 17) | **NỬA-RỖNG** — acceptance đòi *"trả lời được falsifier `depth-cost:59`"***chính spec `:103` khai falsifier "CHƯA ĐO ĐƯỢC"**, không nêu lối thoát |
| **C10** | activity + phép-thử thật | **CAO ở chỗ chọn mẫu** — "1 detector **bất kỳ**" trên **~10**; lựa chọn hợp lý = cái **đã** fault-inject (S138 13/13 · S143 7 ca) ⇒ **xanh chắc chắn, 0 thông tin về 9 cái kia**. Bảng "mỗi thước có verdict" = 100%-do-cấu-trúc (`eval:32`) | Có, nhưng **cỡ mẫu 1/10 tự chọn** | Thước xanh-vì-mù — chính bệnh hub tự bắt 17/18 | **NỬA-RĂNG** |
| **C11** | **activity, grep-vắng-mặt** | **TUYỆT ĐỐI** — grep-cho-VẮNG là dạng dễ lách nhất: đổi tên `ngày``chu-kỳ`/`d` là = 0, **hành vi y nguyên**. Thêm: phạm vi "trigger" **không nêu file** ⇒ người chấm tự chọn | KHÔNG | Proxy-giả theo tuổi | **RỖNG + BẤT-KHẢ-THI** 🔴 — đạt `=0` buộc **xoá luật owner đang GIỮ** (`sleep-…l2.md:52`), trái **luật-chung #6****O-1** của chính spec; lại **over-broad**: 6 chữ "ngày" phần lớn là văn xuôi ⇒ đỏ-giả vĩnh viễn |
| **C12** | **activity** (đo presence, mục tiêu là **use**) | **CAO** — thêm 1 dòng là xong (hiện 0 hit) | KHÔNG (không có phép thử "phiên mới có THẤY không") | Posture vô hình với phiên mới | **RỖNG + ĐỘC-HẠI** 🔴 — `fable-clone.md:16` nói posture **KHÔNG persist, chỉ sống trong lượt**; ghi dòng thường-trực vào `CLAUDE.md` (load MỌI phiên) = **đẻ ghost-wire mới**, đúng lớp SE đang trả nợ |
| **C13** | integrity (per-dòng) | TRUNG BÌNH — *"lý-do-không-làm"***cửa thoát vô hạn**: mọi dòng đều đạt được bằng một lý do ⇒ **không bao giờ đỏ** | KHÔNG | Báo số tổng che dòng sót (bài `meta-count` S119) | **NỬA-RĂNG** — cấu trúc đúng, **ngưỡng vắng** |
## 3. Câu chốt A — răng THẬT ⟂ nghi thức rỗng
- **RĂNG THẬT (2):** **C1**, **C8**. Cả hai: fault-inject **2 chiều** + đòi **hình dạng mã** (`THROW``log`) mà lời-nói không giả được. Đây là chỗ SE **đi trước hub** (`eval:31` hub 17/18 thiếu positive-control) — giữ nguyên.
- **NỬA-RĂNG (4):** **C4**, **C5**, **C10**, **C13** — có lõi thật, hỏng ở **cỡ mẫu / thiếu nửa control / thiếu ngưỡng**.
- **NGHI THỨC RỖNG (5):** **C2**, **C3**, **C6**, **C11**, **C12**.
🔴 Nguy nhất **không phải mục thiếu, mà là C6** — nó **trông nghiêm nhất** (binding floor, giao cho vai `reviewer`, có "đếm trước/sau") nhưng **tập-đo rỗng + việc đã làm rồi**. Qua C6 sẽ tạo cảm giác "đã phủ lời-hứa-máy" trong khi **19 câu** họ-diễn-đạt chưa ai sờ tới.
## 4. Câu chốt B — phép thử 2 (`eval:52`): bịa input chắc-chắn-sai
### Ca 1 — bịa cho **C6** ⇒ **KHÔNG ĐỎ** (xanh-vì-mù, đã chứng minh bằng số)
Bịa: chèn vào `docs/governance/harness-11-engine.md` câu *"Cổng nén-kết-tinh **tự-động quét** mọi shard mới và **chặn** shard thiếu guard."* — **không có mã nào làm việc đó**.
Chạy acceptance C6 (`grep "máy sẽ"` trên governance SE) → **0 hit → BÁO XANH**. Câu bịa **lọt trọn**.
Bằng chứng hậu thuẫn: literal `"máy sẽ"` trong `docs/governance/` = **0**, trong khi họ-diễn-đạt cùng nghĩa = **19**. ⇒ **C6 không có cách nào đỏ** trên đúng loại lỗi nó sinh ra để bắt.
### Ca 2 — bịa cho **C1** ⇒ **ĐỎ ĐÚNG** (răng thật)
Bịa: sửa `hmw.js` thành in **vô điều kiện** `log('hmw: 0/0 lane CHẾT (null) — KHÔNG phải "sạch"')`.
- Vế dương (ép 1 lane null → output phải chứa `lane CHẾT`) → **XANH** (lách được nếu chỉ có 1 chiều).
- Vế âm (lane sạch → **KHÔNG** được chứa) → **ĐỎ**. ⇒ C1 **bịt được** ca giả này nhờ **2 chiều**.
### Ca 3 (bonus) — **C11** ⇒ **KHÔNG ĐỎ**
Đổi `≥ 7 (ngày)` thành `≥ 7 (chu-kỳ)``grep 'ngày\|7 day'` = **0 → XANH**, trigger **vẫn đếm tuổi y hệt**. Rời-tập-đo thuần tuý.
## 5. Đề xuất SIẾT (acceptance mới — mô tả tiêu chí, KHÔNG viết mã hộ)
| # | Siết thành |
|---|---|
| **C6** | Bỏ neo literal. Tập-đo = **danh sách liệt kê tường minh** các câu-hứa-năng-lực trong `docs/governance/*.md` (mẫu số công bố, hiện đo được **19**), mỗi câu một dòng disposition {mã + lệnh + positive-control ⟂ đã hạ thành dự-định}. **Bắt buộc positive-control**: cắm **1 câu-hứa-giả** vào cây tạm → sweep **phải** nhặt ra. Và tách bạch **use⟂mention** (7 hit hiện có đều là *mention*, không được tính là vi phạm). Deliverable thật của `goi-chot:52`**câu hỏi thường-trực ở cửa review**, không phải một lần quét ⇒ acceptance nên đo *gate đã cài*, không đo *đã quét xong*. |
| **C11** | **Gỡ khỏi phạm vi em-main** hoặc viết lại: `grep=0` **mâu thuẫn** với `sleep-…l2.md:52` (owner GIỮ 7-ngày) + luật-chung #6 + O-1. Nếu giữ: đo **hành vi** (bơm trạng thái *0 shard chưa-gist nhưng đã 30 ngày* → trigger **phải im**; *3 shard chưa-gist, 0 ngày***phải kêu**) thay vì grep chữ. |
| **C12** | Bỏ vế "CLAUDE.md có dòng nêu posture **đang hiệu lực**" (stale-by-construction vs `fable-clone.md:16`). Thay bằng: `CLAUDE.md` trỏ **nơi tra posture**, và phép thử **use**: phiên mới chỉ đọc file luật có **nói đúng posture hiện hành** không (1 ca dương + 1 ca âm). |
| **C7** | Thêm **ngưỡng** (số của **owner** — O-gated, em không tự đặt) để "rẻ" có thể ĐỎ; đổi tập cấm từ liệt-kê-danh-mục sang **bất kỳ tiến-trình ngoài nào** trong đường dừng (nếu không, `pause.md:44` lọt khe). |
| **C10** | Cỡ mẫu **≥3, và ưu tiên thước CHƯA từng fault-inject** (loại trừ các ca S138/S143 đã xanh) — nếu không, phép-thử-2 xanh-do-chọn-mẫu. Bỏ vế "mỗi thước có verdict" khỏi headline (100% do cấu trúc, `eval:32`). |
| **C5** | Thêm **positive-control**: id THẬT đã biết → **phải** ra APPLIED. Không có vế này, matcher chết (luôn 0-hit) đạt C5 tuyệt đối. |
| **C2** | Bỏ `grep -c 'trần lượt'` khỏi acceptance (đếm chữ). Giữ vế "≤3 file/lane" nhưng **khai rõ nó chỉ đo được ở run KẾ** — không phải cổng của run này. Muốn "0 lane chết **vì cháy lượt**" đo được thì cần tín hiệu **phân biệt nguyên nhân**, C1 hiện chỉ biết `null`. |
| **C3** | Thêm **negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc-lại **phải trượt**. Và neo **artifact** (label phải xuất hiện trong `runs/<id>/run.md`) — nếu không thì không tái-lập/không audit được. |
| **C4** | Cấm **tự-kiểm vòng chính mình đo** (`m-3 no-self-exempt` S139); nêu đích danh **con số** bị re-check phải là con số **có thể sai** (không phải hằng số hiển nhiên). |
| **C13** | "Lý-do-không-làm" phải kèm **phân loại** {owner-gated · defer-có-ngày · bác-bỏ-có-bằng-chứng} — nếu không, cửa thoát vô hạn. |
| **C9** | Gỡ mâu thuẫn: hoặc khai *"falsifier `depth-cost:59` vẫn CHƯA đo được, C9 chỉ đóng phần re-ground roster"*, hoặc nêu đơn-vị chung làm cho nó đo được. Không để acceptance đòi thứ chính spec khai bất-khả-đo. |
## 6. Công bằng (Smart-Friend guard — nói cả chỗ đúng)
- Spec **re-đo đúng** roster **17** (`ls .claude/agents/` = 18 README) — không chép số cũ.
- ①(2) `hmw.js:225`, `:114-116`, `:124-125` **khớp đĩa 3/3**.
- P3-3 phát hiện `CLAUDE.md` thiếu posture: **ĐÚNG** (0 hit) — vấn đề nằm ở *cách vá*, không ở *chẩn đoán*.
- Luật-chung #3 (bảng disposition từng dòng) + #4 (ghi đĩa trong lúc làm) là **tự-nhận-thức thật**, và chính #4 cứu lượt này.
- **C1 + C8 là hàng thật** — 2 chiều, đúng chuẩn `eval:31` mà hub tự thú còn thiếu.
## 7. Cảnh báo phối-hợp (ngoài 4 câu)
**C1 CẤM `throw` ⟂ C8 ĐÒI `throw`** trong cùng một tài liệu (`spec:53` vs `spec:158`). Hoà giải **có tồn tại nhưng nằm trong mã, không nằm trong spec**: `hmw.js:124`*"(trước parallel) — halt KHÔNG phụ-thuộc semantics parallel()"* ⇒ C8 chặn **up-front trước `parallel()`** (throw sống), C1 nói về **per-lane trong `parallel()`** (throw bị nuốt thành null). Worker đọc spec đơn thuần sẽ thấy mâu thuẫn ⇒ **nên ghi 1 dòng phân định vào spec** trước khi giao.

View File

@ -0,0 +1,193 @@
# sub-harvest-curator-1 — H2 session-start RE-REPORT S144 (2026-07-22)
> Vai: harvest-integrity 5-trục · INFORM-only · propose-only (lead = single-writer).
> Giao-thức #53: ghi ĐĨA ngay khi tìm ra, KHÔNG dồn cuối. Return = tóm-tắt trỏ file này.
> HEAD lúc đo: `d5656ab` (2026-07-22 14:08:13 +0700). Giờ đo: 14:15 → (cập nhật dần).
---
## A. Ground-truth đo tươi (đĩa, không chép của lead)
### A1. Run-folder inventory
- Tổng thư-mục dưới `.claude/workflows/runs/` = **43** (`find -mindepth 1 -maxdepth 1 -type d`).
-`run.md` = **40**. Không có `run.md` = **3**:
- `2026-07-14-S117-pe-approve-minmax-range` — spec-only, **by-design** (đã xác lập @S132).
- `2026-07-14-S117-pe-luyke-finalize` — spec-only, **by-design** (đã xác lập @S132).
- `2026-07-22-S144-bootstrap`**folder phiên NÀY, đang sinh live** (xem A4).
### A2. Orphan scan C5 — DUAL-ACCEPT (dạng-3 RETIRED, không nhận)
Thuật toán chạy độc-lập: với mọi `d``d/run.md` → PASS nếu tồn tại `d/*-synthesis.md` size>0 (dạng-1 phẳng) **hoặc** `d/harvest/*-synthesis.md` size>0 (dạng-2 legacy).
```
TOTAL run.md folders = 40
ORPHAN = 0
```
**VERDICT: XÁC NHẬN ĐỘC-LẬP số của lead — orphan 0/40.** (Mẫu-số của tao = 40, tăng từ 37 @S140 do +3 folder S141/S142/S143. m#12: mẫu-số có NGÀY-ĐO — 40 là số lúc 14:15 ngày 2026-07-22, chưa tính S144-bootstrap vì folder này chưa có `run.md`.)
### A3. Placement + Corruption sơ-bộ (2 trục quét-máy)
- Role-dir dưới `.claude/agent-memory/` = **17** (đếm bằng `find -mindepth 1 -maxdepth 1 -type d`, **guard m#11** — không dùng `cut -d/ -f3` vì nuốt file root-level `memory-budget.json`/`.mfe-state.json`).
- **0 file 0-byte** dưới toàn `.claude/agent-memory/` (`find -type f -size 0` → rỗng). ⇒ Không tái bug #53-zero-byte kiểu S45.
- **0 empty-dir** dưới toàn `.claude/` (`find .claude -type d -empty` → rỗng). ⇒ m#13 (git MÙ dir rỗng) sạch; không có stray cwd-relative kiểu S54/S119.
- `git status --porcelain -- .claude/agent-memory` = **rỗng tuyệt đối** ⇒ 0 delta mồ-côi dạng uncommitted trong agent-memory.
- Porcelain repo-wide chỉ 3 mục: ` M .claude/governance/.session-counter.json` · `?? .claude/scheduled_tasks.lock` · `?? runs/2026-07-22-S144-bootstrap/` — cả 3 đều là **live-state phiên đang chạy**, không phải residue.
### A4. 🔴 LIVE mid-flight observation (bắt được nhờ đo 2 lần cách nhau ~1 phút)
- 14:14:02 — `runs/2026-07-22-S144-bootstrap/` tồn-tại nhưng **RỖNG** (`ls -la` chỉ có `.`/`..`; `find -type d -empty` cùng lượt KHÔNG báo → đã có tranh-chấp thời-điểm).
- 14:14:32 — xuất-hiện `sub-tooling-auditor-1.md` **1778 B**.
- 14:15:08 — vẫn **chưa có `run.md`**.
⇒ Đây là **folder bootstrap dạng sub-md-first** (sub ghi trước, `run.md`/synthesis do lead đóng sau). KHÔNG xếp orphan (chưa có `run.md` ⇒ ngoài mẫu-số C5 theo đúng định-nghĩa folder-scan). **Chỉ thành orphan nếu cuối phiên có `run.md` mà thiếu `*-synthesis.md`** → đề-nghị lead kiểm lại ở close-gate.
---
## B. Trio-memory 3 vai mới (harness-eval / harness-refine / harness-audit)
**Trạng-thái: CÓ diary, và là trạng-thái ĐÚNG — KHÔNG phải gap.**
| Vai | Path | Byte | mtime | Commit sinh |
|---|---|---|---|---|
| harness-eval | `.claude/agent-memory/harness-eval/MEMORY.md` | **1547** | 2026-07-20 18:31 | `2757e41` (A = added) |
| harness-refine | `.claude/agent-memory/harness-refine/MEMORY.md` | **1616** | 2026-07-20 18:31 | `2757e41` (A) |
| harness-audit | `.claude/agent-memory/harness-audit/MEMORY.md` | **1513** | 2026-07-20 18:31 | `2757e41` (A) |
- Cả 3 = **seed-tại-adopt** (không phải diary rỗng): có đủ `Role baseline` + `Split boundary` + `Luật cứng` + `Nhật-ký`.
- Dòng nhật-ký duy nhất, giống nhau cả 3: `S141 (2026-07-20) seed khi adopt khuôn hub 58e28bae — CHƯA chạy lần nào; first-run chờ restart-CLI + spawn-probe + anh consent.`
-**Tự-khai "CHƯA chạy lần nào" KHỚP thực-tế đĩa**: 0 run-folder nào có `sub-harness-{eval,refine,audit}*.md`. Spawn-probe ALIVE phiên này = probe, không phải task thật ⇒ **không sinh nghĩa-vụ harvest**.
- 🟢 **Điểm tốt đáng ghi:** 3 vai này khai boundary `NOT (nhường): harvest-op → harvest-curator H2` — ranh-giới với tao rõ, **0 double-touch**. (`harness-refine` còn cắm cảnh-báo "RANH SẮC — dễ lẫn" với `lead-omission-auditor`.)
---
## C. Trục COVERAGE — 0 silent-miss (mọi sub/run đã-chạy đều có vết harvest)
### C1. Ai NỢ diary, ai KHÔNG — luật phân-định lấy từ ĐĨA
`hmw.js:181` (đọc tươi): ``const subMd = wave ? `${wave.dir}/sub-${role || 'task'}-${i}.md` : null``
⇒ **Tên file = bằng-chứng vai:** `sub-<role>-<i>.md` = role-agent (CÓ diary, NỢ spawn-record) · `sub-task-<i>.md` = **role-less** (inherit lead, **KHÔNG nợ diary** — by-design).
### C2. Bảng coverage 3 run gần nhất (S141 · S142 · S143)
| Run | Artifact trên đĩa | Vai | Nợ diary? | Vết harvest | Verdict |
|---|---|---|---|---|---|
| S141 | `sub-task-0.md` 2427B · `sub-task-1.md` 2858B | **role-less** (tên `task`) | ❌ KHÔNG | — (`implement-vong1-synthesis.md` 3263B partial-honest) | ✅ |
| S141 | `sub-reviewer-fable-spec.md` 18297B | reviewer | ✅ CÓ | entry `S141 (07-20) fable-real gate SPEC…` — nay ở `reviewer/archive/2026-07.md` (moved @S143-curate) | ✅ |
| S141 | 5-lane `/fable-clone invest` (lens-1→5, không có sub-md riêng) | investigator-codebase | ✅ CÓ | `investigator-codebase/MEMORY.md` M @`2757e41`, mtime 07-20 17:55 | ✅ |
| S142 | `sub-task-0.md` 16978B · `sub-task-1.md` 22901B | **role-less** (run.md tự khai *"2 lane, role-less → inherit lead"*) | ❌ KHÔNG | `implement-synthesis.md` 4150B | ✅ |
| S143 | `sub-reviewer-0.md` 18205B | reviewer | ✅ | `reviewer/MEMORY.md:3` tag `[s143, outward-gate-fail, …]` | ✅ |
| S143 | `sub-lead-view-1.md` 5744B | lead-view-auditor | ✅ | diary tag `[s143, deep-force-fire-som, …]` (**on-behalf**, `c4903dd`) | ✅ |
| S143 | `sub-lead-omission-2.md` 10027B | lead-omission-auditor | ✅ | `:25` tag `[s143, deep-1, …]` | ✅ |
| S143 | `sub-harvest-3.md` 13200B | harvest-curator | ✅ | `harvest-curator/MEMORY.md` entry S143 | ✅ |
| S143 | `sub-tooling-4.md` 13896B | tooling-auditor | ✅ | diary tag `[s143, drift-found-4, …]` | ✅ |
| — | trio `harness-{eval,refine,audit}` | 3 vai mới | ❌ (0 task thật) | seed-diary tự khai "CHƯA chạy" **khớp đĩa** | ✅ |
**COVERAGE = ✅ PASS — 0 silent-miss.** 5/5 sub S143 (đúng 5 vai garble) đều có vết diary; 0 vai role-agent nào chạy mà im.
### C3. 🔴 BẪY coverage suýt sinh dương-giả (m#16 MỚI — đề-xuất ghi Methods)
`S141/sub-task-0.md:3` tự khai **"Vai: implementer-backend"** — nhưng **tên file là `sub-task-0`** ⇒ lane role-LESS.
Đối-chứng: `implementer-backend/MEMORY.md` mtime **2026-07-18 00:47** (không đổi từ S140-era) — nếu tin dòng self-label, tao sẽ kết "implementer-backend nợ entry S141" = **dương-giả**.
⇒ **m#16: nhãn-vai TRONG thân sub-md = mô-tả CHỨC-NĂNG, KHÔNG phải bằng-chứng spawn. Thẩm-quyền vai = TÊN FILE (`hmw.js:181`).** Cùng họ m#4 ("commit-stat có-append ≠ có-fanout-record").
---
## D. Trục PLACEMENT + DELTA MỒ-CÔI — 0 mồ-côi, 3/3 FLAG S143 ĐÃ ĐÓNG
### D1. Mồ-côi dạng "chưa commit"
`git status --porcelain -- .claude/agent-memory` = **RỖNG** ⇒ 0 delta chờ. Mọi APPEND S143 đã vào 4 commit: `2757e41` · `36cefcc` · `c4903dd` · `a1e2416`.
### D2. Mồ-côi dạng "nằm lại trong sub-*.md, không lên diary" — soi từng FLAG S143 của chính tao
| FLAG @S143 | Trạng-thái ĐO LẠI HÔM NAY | Verdict |
|---|---|---|
| **F1 MED** counter-claim-vs-đĩa (2 diary H24 khai `class_repeat` mà `.session-counter.json` chưa) | `.session-counter.json` nay có **6/6 khớp EXACT**: `view-residual-asym:1` · `view-stale-status:0` · `gap-carry-dropped:1` · `gap-owner-specifics:2` · `gap-decision-sunk:1` · `gap-incident-unrecorded:0` — đúng từng con-số 2 diary khai | 🟢 **CLOSED** |
| **F2 LOW** stray git-MÙ `broadcasts/.claude/…` rỗng (lớp S54, `porcelain --ignored` IM) | **quét REPO-WIDE** (không chỉ `.claude/`): `find . -type d -name .claude` → **CHỈ `./.claude`**; empty-dir toàn repo = 3, đều tool-cache (`.vs/sd` · `fe-admin|fe-user/node_modules/.vite-temp`) — 0 dính memory | 🟢 **CLOSED** |
| **F3 MED** sửa-một-phía (index ×23 vs topic-file ×20) | `auto-memory/MEMORY.md:34` = **×25** · `feedback_agent_return_garble_recover.md` = **"+ S143 ×5 = ×25 tổng"** ⇒ **2 phía khớp** | 🟢 **CLOSED** |
### D3. Finding của 4 vai kia có lên diary/hành-động không (mẫu 4 điểm)
- reviewer → đề-xuất **errata** (CẤM sửa file đã stamp): `docs/changelog/sessions/2026-07-22-1455-S143-tiep-closeout-audit-errata.md` sinh @`a1e2416` + gửi @`39cc060`. ✅ LANDED.
- lead-view 4 site "roster/NO-Write" → `36cefcc` chạm `.claude/agents/README.md` (+7/−…) + `docs/STATUS.md`. ✅ LANDED.
- lead-omission `gap-incident-unrecorded` (xin owner mở enum) → **enum canonical `memory-budget.json.lead_self_audit.flag_classes` nay = 11 phần-tử** (đo bằng `json.load` → `['view-stale-count','view-stale-status','view-stale-header','view-stale-role-desc','view-residual-asym','gap-carry-dropped','gap-carry-aged','gap-owner-specifics','gap-decision-sunk','gap-underfill','gap-incident-unrecorded']`). ✅ LANDED.
- tooling F-B enum 10→11 → 3/3 site khớp canonical: `STATUS:450` *"11 class = 5+6"* · `hmw.js:33` *"11 class: 5 view-* + 6 gap-*"* · budget=11. ✅ LANDED.
- tooling **F-A LOW carry** (`skills/ef-core-migration/SKILL.md` còn *"Mig 27-66"* — **grep = 2 occurrence, VẪN CÒN**) → chính tooling xếp *carry monthly-lane*, **có chủ-đích hoãn**, không phải rơi. 🔶 **OPEN by-design — lãnh-địa H1 `tooling-auditor`, tao KHÔNG chấm.**
**PLACEMENT = ✅ PASS · DELTA MỒ-CÔI = 0.** 17/17 role-dir có `MEMORY.md`, 0 delta lạc nhà, 0 stray, 0 empty-dir memory.
---
## E. Trục FIDELITY — PASS (0 bịa) + 2 nit nhãn-thời-điểm (INFORM, KHÔNG escalate)
Tao **tự re-chạy** 3 claim load-bearing, không tin lời khai:
**Probe-1 — reviewer, class `bằng-chứng-tự-huỷ-sau-squash`** (claim: `1a0fa59`/`a458102` là commit-object nhưng dangling sau squash; `2757e41` sống):
```
1a0fa59 type=commit is-ancestor-of-HEAD=NO branch--contains=(EMPTY)
a458102 type=commit is-ancestor-of-HEAD=NO branch--contains=(EMPTY)
2757e41 type=commit is-ancestor-of-HEAD=YES branch--contains=* main
```
⇒ **KHỚP 3/3, GROUNDED.** Claim mạnh nhất phiên S143 đứng vững khi tao đo độc-lập.
🔎 Hệ-quả sống: `.session-counter.json` (bản committed) từng ghi `last_ticked_head = 1a0fa59de2e…` = **đúng commit đã chết** ⇒ cùng CLASS reviewer vừa đặt tên. Nay tick S144 đã thay bằng `d5656ab` (reachable). Ghi nhận, không tính lỗi mới.
**Probe-2 — 2 diary H24 vs `.session-counter.json`:** 6/6 giá-trị khớp exact (bảng D2/F1).
**Probe-3 — sổ đếm garble:** index ×25 == topic-file ×25 ⇒ 0 lệch 2 phía.
### 🔴 2 nit nhãn-THỜI-ĐIỂM (không phải bịa — số đúng LÚC ghi, thiếu mốc as-of)
- **N1 (LOW, trong memory):** `lead-omission-auditor/MEMORY.md:25` khai *"3/3 sub garble #53 phiên này"*. Đúng lúc 13:10 (mới 3 sub chạy), nhưng chốt phiên = **5/5**. Diary **không có mốc as-of** ⇒ người đọc sau dễ trích sai. **Đề-xuất lead APPEND-sửa nhãn** (không xoá): thêm `(số lúc 13:10; chốt cuối phiên = 5/5)`. Trớ trêu: chính `feedback_agent_return_garble_recover.md` data-point **(c)** đã đặt tên cho bẫy này — *"cập-nhật tally ở CUỐI phiên, đừng giữa phiên"*.
- **N2 (LOW, NGOÀI memory — báo để không lan sang bề-mặt S144):** **brief giao việc phiên này ghi "Sổ đếm garble ×23"**. Đĩa = **×25** (đã sửa @`a1e2416`). ×23 chính là con-số mid-session mà đĩa đã tự khai là sai. Memory ĐÚNG, brief STALE ⇒ đừng để ×23 chảy vào STATUS/HANDOFF/email S144.
**FIDELITY = ✅ PASS — 0 fabrication, 0 claim không truy được về đĩa ⇒ KHÔNG escalate `reviewer`.** (Tiêu-chí S143 giữ nguyên: beyond-source ≠ bịa, miễn truy được về đĩa + có khai nguồn.)
---
## F. Trục CORRUPTION — PASS 4/4 phép đo
1. **U+FFFD** (m#6: đo bằng literal U+FFFD, **CẤM** heuristic `Ã|ư|â€` = máy-đẻ-dương-giả trên UTF-8 tiếng Việt): **6 hit / 4 file**, TẤT CẢ là quoted-evidence trong entry lịch-sử (m#9) — `cicd/archive/2026-06.md:26` · `harvest/archive/2026-06.md:3,12,13` (dòng 3 **tự khai** *"NOTE: chứa U+FFFD quote"*) · `harvest/archive/2026-07.md:24` · `harvest/MEMORY.md:48` (entry S132 trích `"<22>24.1KB"` làm chứng-cứ m#6).
**Chứng minh KHÔNG phải hư mới:** `git show a1e2416^:…/harvest-curator/MEMORY.md | grep -c` = **1** ; HEAD = **1** ⇒ delta 0.
2. **iconv round-trip UTF-8**: **VALID 8/8** (5 diary chạm hôm nay + 3 seed trio).
3. **0-byte**: 0 file / toàn `.claude/agent-memory` ⇒ không tái #53-zero-byte (S45).
4. **moved-not-cut** — curate DUY NHẤT hôm nay = `reviewer` @`36cefcc` (L1 26.5KB→17784B):
- 20 dòng bị gỡ khỏi L1 = **4 stub-pointer** (m#15: `[→ archive/… @Sxxx]`, nội-dung đã ở archive từ trước → nén 4 stub thành 2 digest-stub, **KHÔNG tính cut**) + **16 dòng nội-dung**.
- **16/16 dòng nội-dung tìm thấy BYTE-IDENTICAL** (`grep -Fqx`) trong `reviewer/archive/2026-07.md` dưới marker `## [BATCH S143-curate … moved-not-cut]`. **CUT-NOT-MOVED = 0.**
- **dead-pointer check** 2 digest-stub: `S139 (07-18)`=1 hit · `S134b (07-17)`=1 · `S133 (07-17)`=1 · `S124`=3 · `S125`=5 trong archive ⇒ **0 con-trỏ chết** (lớp tao bắt @S102).
### 🔴 Bug tự-bắt trong CHÍNH phép đo của tao (m#14-EXT — đề-xuất ghi Methods)
Lượt 1 chạy `grep -Fqx "$line"` với `$line` bắt đầu bằng `-` ⇒ shell/grep nuốt làm **option** (`grep: unknown option --`) ⇒ báo **13/16 "CUT-NOT-MOVED"** = **dương-giả 100%**. Chạy lại `grep -Fqx -e "$line"` ⇒ **0**.
⇒ **m#14-EXT: dòng-diff mở đầu bằng `-` đã phá grep ở 3 hình-dạng khác nhau (m#5 filter · m#14 diff-extract · nay m#15 moved-not-cut). Mọi so-khớp dòng-diff PHẢI dùng `-e`/`--`.** Nếu tin lượt-1, tao đã báo lead một cáo-buộc "reviewer cut-not-moved 13 dòng" HOÀN TOÀN SAI.
---
## G. Chore-memory (byte đo tươi, cap canonical từ `memory-budget.json`)
Cap canonical: `tiers.l1_hot.autoinject_cap_bytes = 25600` · `soft_cap_bytes = 30720` · `archive_gate.low_watermark_ratio = 0.85` (→ 21760).
| Role | L1 bytes | vs cap 25600 |
|---|---|---|
| **investigator-codebase** | **26624** | 🔴 **VƯỢT auto-inject cap +1024B** → phần đuôi L1 KHÔNG inject; archive-gate due |
| cicd-monitor | 22607 | 🟠 >85% watermark (WATCH) |
| test-specialist | 22140 | 🟠 >85% (WATCH) |
| frontend-designer | 21492 | 🟢 sát watermark |
| implementer-backend | 19449 | 🟢 |
| tooling-auditor | 18534 | 🟢 (>self-target 17.1K của vai đó) |
| reviewer | 17784 | 🟢 (vừa curate; nhỉnh 274B trên self-target 17.1K vai đó) |
| **harvest-curator (tao)** | **17175** | 🟢 **DƯỚI self-target 17510** |
Còn lại (database-agent 7388 · investigator-api 8510 · office-document 3323 · lead-omission 9680 · lead-view 6610 · implementer-frontend 15951 · trio 1513/1547/1616) đều thoáng.
---
## H. VERDICT TỔNG 5 TRỤC — @session-start S144
| Trục | Verdict | Neo bằng-chứng |
|---|---|---|
| **Coverage** | ✅ **PASS** | 5/5 sub S143 có vết diary · role-less lane 4/4 không nợ (hmw.js:181) · trio 0-task-0-nợ · orphan **0/40** |
| **Completeness** | ✅ **PASS** | 5 entry S143 đủ 4-field-tương-đương {task-scope · verdict · learned · surprise/tag}; mỗi entry trỏ `runs/…/sub-*.md` chi-tiết |
| **Placement** | ✅ **PASS** | 17/17 role-dir có MEMORY.md · porcelain agent-memory RỖNG · 0 stray `.claude` repo-wide · 0 empty-dir memory |
| **Corruption** | ✅ **PASS** | FFFD 6 = quoted-evidence (delta 0) · iconv 8/8 VALID · 0-byte 0 · moved-not-cut **16/16 byte-identical, cut=0** · 0 dead-pointer |
| **Fidelity** | ✅ **PASS (STRONG)** | 3/3 probe re-chạy độc-lập KHỚP (dangling-commit 3/3 · class_repeat 6/6 · tally 2/2) · 0 bịa ⇒ **không escalate reviewer** |
**TỔNG: 🟢 ALL-CLEAN 5/5 — 0 delta mồ-côi, 0 orphan/40.**
### Propose cho lead (INFORM-only, lead VERIFY→APPEND)
1. **P1 (LOW)** APPEND nhãn as-of vào `lead-omission-auditor/MEMORY.md:25` — *"3/3 sub garble"* → thêm `(số lúc 13:10; chốt cuối phiên 5/5)`. **KHÔNG xoá** câu gốc.
2. **P2 (LOW, ngoài memory)** Brief S144 ghi *"garble ×23"* — đĩa = **×25**. Chặn trước khi lan sang STATUS/HANDOFF/email S144.
3. **P3 (MED, chore)** `investigator-codebase/MEMORY.md` **26624B > 25600** cap ⇒ đề-xuất chạy archive-gate/curate L1→L2 (moved-not-cut + seal-verify).
4. **P4** Ghi 2 method mới vào diary tao: **m#16** (nhãn-vai trong thân sub-md ≠ bằng-chứng spawn; thẩm-quyền = tên file `hmw.js:181`) · **m#14-EXT** (dòng-diff mở đầu `-` phá grep ở 3 hình-dạng ⇒ luôn `-e`/`--`).
5. **P5 (nhắc close-gate)** `runs/2026-07-22-S144-bootstrap/` hiện **chưa có `run.md`** ⇒ đang NGOÀI mẫu-số orphan. Khi lead đóng `run.md`, folder vào mẫu-số ⇒ **phải kèm `*-synthesis.md` size>0** kẻo tự sinh orphan đầu tiên sau 40 run sạch.
6. **P6 (bàn giao H1)** `skills/ef-core-migration/SKILL.md` còn *"Mig 27-66"* ×2 — tooling-auditor đã xếp carry monthly-lane; **lãnh-địa H1**, tao chỉ chuyển tiếp.

View File

@ -0,0 +1,201 @@
# H1 tooling-auditor — S144 session-start RE-REPORT
- **Phiên:** S144 (2026-07-22) · **HEAD:** `d5656ab` (wal flush) · baseline so sánh = S143
- **Vai:** tooling-freshness 4 mặt · INFORM-only · propose-only (lead = single-writer)
- **Giao-thức #53:** ghi đĩa NGAY khi tìm ra từng phát-hiện. File này = nguồn thật; return chỉ là tóm-tắt.
- **Model self-report:** Opus 4.8 (`claude-opus-4-8`)
---
## Đo thô (ground-truth từ đĩa)
| Lớp | Số | Nguồn |
|---|---|---|
| skill project | 6 | `ls .claude/skills/` (trừ README.md) |
| skill standalone | 23 | `ls ~/.claude/skills/` |
| command-file | 18 | `ls .claude/commands/*.md` |
| agent persona | **17** | `ls .claude/agents/*.md` = 18 file README.md |
| plugin registered | 18 | `~/.claude/settings.json` enabledPlugins |
| plugin enabled | 15 | 18 3 false |
| plugin disabled | 3 | pr-review-toolkit · code-modernization · hookify |
| marketplace | 37 | `~/.claude/plugins/marketplaces/claude-plugins-official/plugins` |
Git working tree: chỉ `M .claude/governance/.session-counter.json` + `?? .claude/scheduled_tasks.lock` (untracked lock).
---
## ③ PLUGIN — PASS (0 delta)
- 18 registered / 15 enabled / 3 disabled — **IDENTICAL S143**, 0 install/enable/disable mới.
- Marketplace **37** — bằng số S143 đã đo (S143 bắt delta 35→37; nay đứng yên) ⇒ 0 skill/plugin MỚI cần phân-bổ.
- `settings.json:11` `"model": "claude-opus-4-8[1m]"` — lead pin GIỮ NGUYÊN so S143.
- `effortLevel: xhigh` (:39) không đổi.
- Nấc báo: installed 18 → enabled 15 → assigned (theo skill-matrix agents/README) → used. KHÔNG conflate.
**⇒ new-alloc: 0 action.** Không có plugin/skill mới rơi vào giỏ chưa-phân-bổ.
---
## 🔴 F-1 (MED) — `/sleep-recovery-memory-l2` bỏ sót trio: cùng lớp "ghost-enum" S143
**File:** `.claude/commands/sleep-recovery-memory-l2.md` — 3 site sai, 1 site đúng-đừng-đụng.
Roster 14→17 (+trio `harness-eval`/`harness-refine`/`harness-audit`, land S142) nhưng command này chưa theo.
| Site | Text hiện tại | Thực tế đĩa |
|---|---|---|
| `:37` | regex loại-trừ `^(tooling-auditor\|harvest-curator\|lead-view-auditor\|lead-omission-auditor)$` | chạy THẬT hôm nay → **13 tên**, gồm cả 3 trio |
| `:40` | "Hiện-hành = …" liệt-kê đúng **10 tên** | mâu-thuẫn `:37` (13) — 2 dòng cạnh nhau đá nhau |
| `:42` | "**4 monitor** INFORM-only KHÔNG vào `all`" | 7 vai INFORM-only (4 + trio) |
| `:58` | "`all`**9 sub** có-ký-ức SE" | sai từ TRƯỚC trio: `:43` (vá S122) tự khai con số 9 là stale, sửa `:40`→10 nhưng **quên `:58`** ⇒ nay lệch kép |
**Bằng chứng trio cùng lớp monitor**`.claude/agents/harness-eval.md:4`: *"Read-only INFORM-only … Propose-only, single-writer = lead. KHÔNG store_memory, KHÔNG Write/Edit"* → đúng tiêu-chí loại-trừ như 4 vai kia.
**Vì sao MED không HIGH (hiệu-ứng hiện chỉ tiềm-ẩn):** trio CHƯA có `archive/` — chỉ `MEMORY.md` ~1.5KB mỗi vai (`ls` xác nhận; `memory-budget.json:159-161` `l2_verbatim: 0`, rollout "no archive"). Phase 0.2 guard-rỗng sẽ skip ⇒ chạy `all` hôm nay **chưa hỏng**. Nhưng khi trio có archive đầu tiên, `all` sẽ nuốt chúng **không ai quyết**.
**Site KHÔNG được sửa (đừng vá nhầm):** `:45` "Ghi-chú S122 … đếm 16 thay vì 14" = ghi-chú CÓ NGÀY, record lịch-sử → **frozen-in-time, sửa = giả-mạo** (luật prescriptive⟂frozen S143). `:44` "đo S71: 4" cũng vậy.
**Đề-xuất (lead quyết):** thêm 3 tên vào regex `:37` + sửa `:40` (giữ 10) + `:42` "4 → 7 monitor" + `:58` bỏ số cứng, trỏ "quét đĩa". 🔴 Nhưng **"trio có thuộc diện loại-trừ không" = quyết-định owner**, không phải tao suy ra — tao chỉ chứng minh 4 site đang tự mâu-thuẫn.
### F-1 đắt ở chỗ này: đúng bản vá S143, sót đúng 1 file
`runs/2026-07-22-S143-closeout-audit/sub-reviewer-0.md:250` ra lệnh: *"Vá `agents/README.md:225` (thêm 3 trio + **'4 monitor'→7**)"*. Bản vá ĐÃ LÀM — `README.md:225` nay đọc *"Cả **7 monitor** đều INFORM-only"* ✅. Nhưng **cụm chữ y hệt**`sleep-recovery-memory-l2.md:42` không ai sờ tới.
⇒ Không phải drift mới sinh, mà là **same-class-miss của chính bản vá vừa rồi** — trùng khuôn S126 (sweep liệt-kê consumer thiếu một lớp) và khuôn S143 F-B (ghost-enum). Lớp `.claude/commands/` lại là chỗ sót, **lần thứ 3** (S57 · S99 · S126 đều bắt ở đây).
**Luật rút cho lần sau:** vá một CỤM CHỮ ⇒ grep chính cụm chữ đó toàn repo, đừng vá theo danh-sách-site do phiên trước liệt-kê.
---
## ① SKILL — PASS_WITH_FLAGS (1 drift thật, 1 dương-giả)
6 project + 23 standalone + 18 command = **0 thêm/bớt/đổi tên** vs S143. `git diff` thư-mục `.claude/skills/` từ S142 tới HEAD = **rỗng**. Map vai: skill-matrix `agents/README` đã vá 15→17 @S143 ✅.
### 🔴 F-2 (MED) — `ef-core-migration` tự nhận là nguồn "mới nhất" rồi để lỡ Mig 67
- `.claude/skills/ef-core-migration/SKILL.md:19` tự khai: *"Migration history (số hiện tại → `docs/STATUS.md` canonical; **mới nhất = row cuối bảng**)"* — tức file này **tự nhận quyền** trả lời "mig mới nhất là gì".
- Row cuối bảng = `:88` **Mig 66** `AddPeApprovedPriceRange`.
- Đĩa: **67** migration (`ls Persistence/Migrations/*.cs` trừ Designer/Snapshot), mới nhất `20260717032812_AddPeApprovedBudgetSnapshot` = **Mig 67**, land S133 (2026-07-17, 5 ngày trước).
- `grep "67\|ApprovedBudgetSnapshot"` trong SKILL.md → **0 hit**. Mig 67 vắng mặt hoàn toàn.
- Site khác đã ĐÚNG: `CLAUDE.md:62` có "12,13,15,49,50,52-61,**65-67**" + tả Mig 67 đầy đủ ⇒ **chỉ mình skill tụt lại**.
- Lây sang `.claude/skills/README.md:20`: nhãn *"✅ Updated S117 … Mig 66 … row added"* nay cũng cũ.
🔴 **Bài học đáng giữ:** B1 (derived-trỏ-canonical) áp ĐÚNG cho *con số* — nhưng file vẫn ôm nhiệm-vụ thứ hai ("mới nhất") mà không bảo-trì. **Trỏ-được-một-nửa nguy hơn không trỏ**: người đọc thấy có anti-drift banner rồi tin cả dòng.
**Đề-xuất:** thêm row Mig 67 vào bảng + cập nhãn `skills/README:20`.
### F-3 (LOW — tao xếp DƯƠNG-GIẢ, đừng vá số)
Detector flag `form-engine/SKILL.md:15` anchor `2026-04-30` (83 ngày). **Tao kiểm nội-dung, không kiểm tuổi** — và 2 claim của nó vẫn ĐÚNG hôm nay:
| Claim SKILL.md | Kiểm chứng |
|---|---|
| "Missing: loop `{{#loop}}` cho table lặp" | `src/Backend/SolutionErp.Infrastructure/Forms/DocxRenderer.cs:10`*"Không support `{{#loop}}...{{/loop}}` (table lặp)"* ⇒ vẫn chưa làm ✅ |
| "Export PE phiếu PDF (Phase 9 carry over)" | `CLAUDE.md:62` cuối dòng — *"Export PDF pending"* ⇒ vẫn pending ✅ |
**Tuổi ≠ ôi**. Skill này cũ vì mảng nó tả **thật sự không đổi**, không phải vì bị bỏ quên. Vá ngày tháng cho detector im = đúng nghĩa Goodhart (rời tập-đo mà không sửa gì thật). Đề-xuất: **giữ nguyên**, hoặc chỉnh detector đo nội-dung thay vì đo tuổi.
`contract-workflow/SKILL.md` (last-touch 2026-05-08): các số trong đó là **Mig 16/18-20 lịch-sử phase 9** — record quá-khứ, không phải claim hiện-hành ⇒ frozen, **không vá**.
---
## ② ROSTER — PASS (17 = 17 = 17 = 17 = 17, khớp 5 nguồn)
| Nguồn | Số | Bằng chứng |
|---|---|---|
| đĩa `.claude/agents/*.md` | **17** | 18 file `README.md` |
| `docs/STATUS.md:450` | **17** | row `\| Sub-agents \| **17** \|` |
| `hmw.js:22-39` VALID_ROLES | **17** | đếm phần tử: 10 product + 4 monitor + 3 trio |
| `agents/README.md:225` | **17** | liệt-kê TÊN, đếm ra 17 + "Cả 7 monitor" |
| `.claude/agent-memory/*/` | **17** | 1 dir/vai, đủ cả trio |
**Đợt vá S143 giữ được:** `README:27` "Roster THẬT" nay có đủ 🧪×3 trio ✅ · `README:225` VALID_ROLES đủ 17 + "7 monitor" ✅ · `README:3` + `:5` dùng con-trỏ B1 **không chép số** ✅ · `hmw.js:33` "11 class = 5 view-* + 6 gap-*" ✅ · `hmw.js:44` "17/17 frontmatter" ✅ · `session-start.md:97` + `session-end.md:152` liệt-kê NHÓM "10 product/quality + (H1 · H2 · 2×H24 · **3×trio-memory**)" ✅.
**Grep 2 chiều (theo yêu-cầu, chống bẫy S143):** theo SỐ (`roster 14|14/14|14 vai|4 monitor|10 product`) **và** theo TÊN (`lead-view-auditor` có mà `harness-eval` vắng ⇒ nghi-can). Phép theo-TÊN chính là cái lôi F-1 ra — phép theo-SỐ **không bắt được `:37`** vì regex đó thuần tên. Xác nhận lại bài S143: **grep-theo-SỐ một mình là không đủ.**
Còn lại toàn bộ hit "14" đều nằm ở **record lịch-sử** (session-log · adap-report outbox · run-folder S143 · `auto-memory/project_*` mô-tả mốc S124) ⇒ **frozen-in-time, KHÔNG vá**.
---
## ④ DOCS — PASS_WITH_FLAGS
### Số canonical vs đĩa — tao đo lại, KHÔNG chép mồi lead
| Hạng mục | STATUS ghi | Tao đo tươi | Kết |
|---|---|---|---|
| Migration | Mig 67 | `ls Persistence/Migrations/*.cs` trừ Designer/Snapshot = **67**, mới nhất `20260717032812_AddPeApprovedBudgetSnapshot` | ✅ |
| gotcha | 83 | `grep -c "^### [0-9]" docs/gotchas.md` = **83** | ✅ |
| Test | `:446` 528 PASS (45 Domain + 483 Infra, 0 fail/0 skip) | 45+483 = **528** cộng khớp; commit code cuối `6664a61` (2026-07-17) ghi 520→528, S141S143 governance-only 0 code ⇒ nhất-quán | ✅ |
| Bảng | 89 | Mig 67 = snapshot-AddColumn **no new table** ⇒ 89 giữ, count-invariant | ✅ |
| Roster | 17 | khớp 5 nguồn (mặt ②) | ✅ |
| menu | 54 | 🔸 **tao KHÔNG kiểm được** — cần DB/seed runtime, ngoài tầm read-only của tao. Khai thẳng là **chưa verify**, không tick bừa |
`docs/HANDOFF.md:5` stamp **2026-07-22 (S141S143)**, phản-ánh đúng roster 14→17 · test 528 · 0 mig · bundle FROZEN + 14 carry + NEXT-anh đánh số ⇒ **kịp-thời** ✅.
### 🔴 F-4 (MED · CARRY-OPEN từ S143 F-C, KHÔNG phải phát-hiện mới) — nhãn lead-model
Sự thật đĩa: `~/.claude/settings.json:11` = `"model": "claude-opus-4-8[1m]"`.
Ô canonical `docs/STATUS.md:450` §Sub-agents vẫn viết: *"em main **Fable 5 (1M) Max**"*.
**Kết quả sweep prescriptive (4 site, tao đọc từng dòng — chỉ 1 site sai):**
| Site | Nội dung | Phán |
|---|---|---|
| `docs/STATUS.md:450` | "em main Fable 5 (1M) Max" = khẳng-định trạng-thái HIỆN-HÀNH | 🔴 **STALE** |
| `.claude/commands/session-start.md:43` | outage-recipe: lỗi `claude-fable-5[1m]` → fallback `/model claude-opus-4-8[1m]` | 🔴 **NO-OP** — bảo đổi sang đúng cái đang pin |
| `.claude/commands/session-start.md:41` | "Lead = frontier-class ANH CHỌN per-session **{Fable 5 \| Opus 4.8}**" | ✅ ĐÚNG — đây là **thực-đơn lựa-chọn**, không phải khẳng-định hiện-trạng |
| `.claude/agents/README.md:5` | "Lead runtime = per-session owner-choice (Fable ↔ Opus); flip-chain canonical → STATUS §Sub-agents" | ✅ ĐÚNG — con-trỏ B1, không chép nhãn |
| `docs/governance/fable-real-runbook.md:499` | `LEAD_MODEL` = `claude-fable-5[1m]` **HOẶC** `claude-opus-4-8[1m]` (probe per-session) | ✅ ĐÚNG — spec biến, liệt kê cả 2 trị |
🔴 **Đảo chiều đáng ghi:** thường drift chảy canonical → derived. Ở đây **NGƯỢC**: 3 site derived viết theo lối "owner-choice / con-trỏ" nên **sống sót cú flip mà không cần sửa gì** — đúng như B1 thiết kế. Chính **ô canonical** là chỗ tụt lại. Hệ quả: mọi con-trỏ trỏ về `STATUS §Sub-agents` giờ **resolve ra câu trả lời sai**, dù bản thân con-trỏ viết đúng.
⇒ Bài: B1 chống được drift-lan-toả, **không** chống được canonical-tự-ôi. Ô canonical cần chính nó có nguồn đối-chứng (ở đây = `settings.json`).
**Tao KHÔNG tự quyết** — nhãn flip {owner-choice | outage} là quyền anh (chính `session-start.md:43` quy định vậy). Tao chỉ nộp: 1 site sai + 1 hệ-quả no-op + 3 site đã miễn-nhiễm.
### F-5 (LOW — đo-sống ghi thành số-chết, KHÔNG nên đuổi theo)
`docs/STATUS.md:451` ghi RAG chunks **2441** (mốc S126). Tao gọi `list_projects` đo tươi: `solution_erp.chunk_count` = **2446** (+5).
Nhưng cùng dòng đó tự khai `last_indexed 05-29` (stale) + "store_memory stopgap" — và `last_indexed_at` trả về đúng `2026-05-29T23:26:13`**không hề có re-index nào**. +5 chunk = 5 lần lead ghi memory từ S126 tới nay. Tức con số này **tăng đều theo hoạt động bình thường**: 2429 (S80) → 2441 (S126) → 2446 (nay).
**Lành, không phải drift.** Đây là **bộ-đếm SỐNG bị chép thành row TĨNH** — stale ngay khoảnh-khắc sau khi ghi, và sẽ stale lại sau mỗi lần vá. Cùng lớp với ca S140 tao từng bắt ("183KB un-gisted" ghi cứng trong 3 command-file). Đề-xuất đúng: **dán nhãn mẫu-có-ngày** ("2446 @2026-07-22") thay vì đuổi số. 🚧 Re-index = lãnh-địa AI_INFRA/cicd — **ngoài ranh tao**, không đề-xuất.
### F-6 (LOW · vệ-sinh) — `.claude/scheduled_tasks.lock` lọt lưới `.gitignore`
- `git status` untracked; `git log -- <file>` rỗng ⇒ **chưa từng tracked**.
- Nội dung = state runtime thuần: `{"sessionId":"365dd935-…","pid":66104,"procStart":…,"acquiredAt":…}` — vô nghĩa với repo, đổi mỗi lần chạy.
- `.gitignore``!.claude/**` (re-include) + các dòng loại-trừ đặt SAU cho `hmw-mode.on` `:87` / `fable-real-mode.on` `:92` / `wave-*` `:105`**nhưng không có dòng nào cho `scheduled_tasks.lock`**; `:17-18` chỉ có `project.lock.json`.
- ⇒ Nó sẽ **bám `git status` vĩnh viễn** và có ngày lọt vào `git add -A`. Đúng khuôn đã được xử 3 lần trước (marker-file), chỉ thiếu dòng thứ 4.
**Đề-xuất:** thêm `.claude/scheduled_tasks.lock` sau `!.claude/**` (last-match-wins, y hệt 3 dòng kia).
---
## CHỐT
| Mặt | Verdict | Finding |
|---|---|---|
| ① skill | PASS_WITH_FLAGS | F-2 MED (ef-core lỡ Mig 67) · F-3 LOW **dương-giả, đề-xuất KHÔNG vá** |
| ② roster | **PASS** | 17=17=17=17=17, đợt vá S143 giữ vững |
| ③ plugin | **PASS** | 18/15/3 + marketplace 37, 0 delta · new-alloc 0 action |
| ④ docs | PASS_WITH_FLAGS | F-1 MED · F-4 MED (carry S143) · F-5 LOW lành · F-6 LOW |
**Cần lead quyết:** F-1 (4 site `sleep-recovery-memory-l2.md`) · F-2 (row Mig 67) · F-6 (1 dòng gitignore) = vá được ngay.
**Cần ANH quyết:** F-4 nhãn model-flip.
**Đề-xuất KHÔNG động:** F-3 (tuổi≠ôi) · F-5 (bộ-đếm sống).
---
## Phụ-lục — residual sweep (đối-chứng 2 công-cụ, chống mù `.gitignore`)
Sweep chính chạy bằng ripgrep (**tôn trọng `.gitignore`**). Tao chạy thêm `grep -r` thô (**không tôn trọng**) rồi lấy hiệu 2 tập "có `lead-view-auditor` mà vắng `harness-eval`" để soi chỗ ripgrep có thể mù. Kết quả: **0 file bị bỏ sót**, nhưng lòi ra 2 file tao chưa đọc — đã đọc nốt:
| File | Phán | Lý do |
|---|---|---|
| `.claude/governance/ACTIVE-MARKS.md:41` | ✅ **KHÔNG phải drift** | Ledger có luật riêng: *"BẢN KÝ GIỮ NGUYÊN, KHÔNG SỬA MỘT CHỮ (P4/P8)"*, delta ghi ở **chú-thích** dưới. "roster 12" trong thân mark = **frozen đúng thiết-kế**. Chú-thích `:41` đã tự khai *"12 là ảnh-chụp lúc ký, KHÔNG phải giới-hạn"* — luận-điểm gánh-lực này **phủ luôn trio** dù ngoặc đơn chỉ kể tới S121. Nit, không nêu thành finding (nhất-quán với lập-trường F-3/F-5: không thổi tuổi thành ôi). |
| `.claude/agents/lead-omission-auditor.md` | ✅ **S143 F-B ĐÃ VÁ** | `gap-incident-unrecorded` xuất-hiện **2×**; `:29` + `:42` nay đọc **"6 class"** (trước là 5). Ghost-enum S143 **đóng thật**, không phải đóng trên giấy. |
⇒ Chốt lại F-1: `sleep-recovery-memory-l2.md`**file DUY NHẤT** còn ôm nhãn roster cũ ở dạng chỉ-dẫn-hiện-hành.
*Đo bởi tooling-auditor (Opus 4.8) · S144 · read-only, 0 file repo bị sửa — file này là run-trace, không phải file dự-án.*

View File

@ -0,0 +1,83 @@
# harness-audit — RETURN S144 (2026-07-22) — con KIỂM, FIRST-RUN THẬT
> Lead scribe @W3. ⚠️ Lượt-1 **#53 garble** (trả mẩu giữa chừng) → **SendMessage-resume** → return đầy đủ. Vai này **không ghi đĩa**, resume là đường cứu **duy nhất**.
> PIN hợp lệ: eval-return 10.907 B · refine-return 14.321 B · run.md 2.288 B ⇒ **CHẤM ĐƯỢC**, không từ-chối.
## A — 6/6 INSTRUMENT TỰ RE-CHẠY (không phải 2)
| # | instrument | kết |
|---|---|---|
| R1 | `measure-agent-memory` | **17 row TRÙNG TỪNG Ô** — 0 LỆCH |
| R2 | `distill-shard-probe` | `pending=15 \| nguong=7 => KEU` — 0 LỆCH |
| R3 | `mfe-eval` | 13 row + DENOM 36 + span 28057 + strikes 23 — 0 LỆCH |
| R4 | `memory-archive-gate` | 99/0/41/55/56 → 251/251 failed 0 — 0 LỆCH |
| R5 | `crystallized-backfill` | TOTAL 540724 · [135181..180241] · headroom 199759 — 0 LỆCH |
| R6 | `nhip-no-probe` | trùng **ký-tự-đối-ký-tự** |
Tự cộng lại (không tin tổng con ĐO): l1_hot 221.943 ✓ · verbatim 776.522 ✓ · gist 201.141 ✓ · 93/99 = 93,939% ✓ · 22108/20480 = 107,9% dư 1628 ✓ · 2662421760 = 4864 ✓ · 180241+210000 = 390241 vượt trần 10241 ✓.
### 🔴 1 LỆCH DUY NHẤT CẢ LƯỢT — KHÔNG ở con ĐO, mà ở **`run.md` CỦA LEAD**
| | lead ghi | đĩa |
|---|---|---|
| hotload | 538.529 B | **540.724 B** |
| headroom | 200.490 | **199.759** |
Lệch **+2.195 B / 731 tok**. 6 file nguồn mtime ≤ **15:38:39**, tức **đứng yên TRƯỚC khi run mở (15:50)** ⇒ số 538.529 **đã stale ngay lúc được viết là "đo tươi"**.
🔴 **Con ĐO ĐÚNG, run.md SAI.** Và header scribe *"Đối chứng 4 mốc lead: 0 LỆCH"* đếm **4** trong khi run.md liệt **5** mốc — **mốc thứ 5 (crystallized) chính là mốc lệch, và việc loại nó KHÔNG được khai**. ⇒ lead-surface, escalate H24.
## B — VERDICT PER-CLAIM
**Con ĐO — 11/11 tín-hiệu ĐẠT.** Neo tiêu biểu: S2 byte-exact (`budget:156` S141-ADDENDUM inv-cb 26624→26624 = 0; reviewer 24024→17784 = **6240 đúng từng byte**) · S5 `ls`*No such file* + R4 in `strike counters NOT persisted` · S7 67374+66747+25581+18065 = **177.767** ✓ /776.522 = **22,89%** ✓ · S3b `budget:86` có đúng chuỗi *"~253.7K tok"*.
**Con ĐO — 8 trục: 7 ĐẠT, 1 TRƯỢT-MỘT-PHẦN.**
- **T7 TRƯỢT-MỘT-PHẦN:** verdict REGRESSION dựng trên `pending=15` mà E4 chứng minh là **dương-giả**. Caveat T7 (*"vỡ-ngưỡng ≠ xấu đi"*) là phanh **đúng hướng nhưng chưa đủ sâu** — vấn đề không phải thiếu chuỗi-thời-gian mà là **tử số không đo thứ nó tưởng**. 🔴 **Con ĐO CÓ CƠ HỘI BẮT MÀ TRƯỢT:** probe **CÓ in 8 đường dẫn** (audit re-chạy thấy tận mắt), con ĐO chỉ chép dòng verdict. Nó tự khai *"Tập-đo SẠCH"* dựa trên đọc code `:40-43`**code sạch thật, nhưng giả-định-quy-ước-đặt-tên thì không**.
- **T4 nit:** frontend-designer vào rổ "5 vai PASS" nhưng in `pointers 0 resolved 0` ⇒ byte thực-sự-verified = **76,3%**, không phải 77,1%.
**Con ĐỀ-XUẤT — A1A4 ĐẠT 4/4** · **E1E8 ĐẠT 8/8** · **B1B12 BÁC ĐÚNG 12/12, 0 mục BÁC SAI**.
- A1 Goodhart-trap **chính xác**: `measure-agent-memory.ps1:20` = `if ($_.Name -eq '_INDEX.md')`; `_INDEX-2026-05.md` rơi nhánh `else → $verbatim`
- A3 **targeting tinh hơn audit tưởng**: inv-cb `2026-07.gist` (07-18) **mới hơn** verbatim (07-17) ⇒ chưa stale; refine viết *"(sau A2)"* = **điều-kiện-hoá ĐÚNG**
- A4 citation byte-exact: `budget:14` có đủ 4 ca; **E4 là ca thứ 5 — hợp lệ**
## C — FALSIFY-LOG (9 phép)
| # | phép PHỦ ĐỊNH | kết |
|---|---|---|
| **F1** | 🔴 thách vùng CLEAN: *"0 instrument gác l2_index"* — grep **28 script** | **HELD.** `l2_index` xuất hiện **đúng 1 lần toàn repo scripts**: `measure-agent-memory.ps1:30` — thuần **báo cáo**, 0 so-sánh cap. Cố phá, **không phá được** |
| **F2** | 🔴 thách CLEAN #2: *"A7 PASS 251/251"* | **HELD byte-exact** — nhưng đào ra nit con ĐO không nói: frontend-designer PASS với **0 pointer** |
| **F3** | phá E4: nghi frontmatter tự-khai mà thân bài không đụng | **HELD.** Đếm back-resolve trong THÂN: cicd→runs 19/q4 5/q3 3/q2 2 · impl-be 4/4/3/3 · inv-cb 14/7/8/6 · reviewer 10/8. **Mọi file nguồn có pointer thật.** E4 đứng vững dưới phép **NẶNG HƠN** refine tự áp |
| **F4** | phá E5: quét TOÀN BỘ cặp twin | **HELD — và BROKE NGƯỢC vào refine.** **6 cặp stale**, refine báo **2**: impl-be 2026-06 **+25,7d** · inv-cb 2026-06 +13,2d · impl-fe 2026-H1 +12,0d · cicd 2026-06 +8,5d · reviewer 2026-07 +4,1d · reviewer 2026-06 +2,0d. **Điểm mù refine phát hiện LỚN GẤP 3 lần nó báo**; 4 cặp lớn nhất **ngoài tập target A3** |
| **F5** | phá *"0 dư-lượng ghi"* bằng mtime 17 MEMORY.md + 7 file dirty | **HELD.** 17/17 mtime ≤ 14:03:54; 7 file dirty 14:13→15:48 — **tất cả TRƯỚC 15:50** |
| **F6** | phá *"mfe ghi 1 file"* — nghi ghi lén | **HELD.** `.mfe-state.json` mtime 15:51:50 (trong W1) ⇒ ghi THẬT; nhưng md5 `21a5a12d…` **không đổi****delta 0 byte** |
| **F7** | phá E4: tìm 1 shard KHÔNG gist nào phủ | 🔴 **BROKE — 1/15.** `test-specialist/baseline-history.md` **không có gist gộp nào phủ**; nó thoát nhờ `budget:162` *"reference-file [skip sleep: đã distilled-form]"* = **cơ chế KHÁC hẳn** |
| **F8** | phá A1 bằng hệ quả **bậc 2** | 🔴 **BROKE-BỔ-SUNG.** Tách `_INDEX.md` không chỉ đẩy byte sang `l2_verbatim` — file tách **cũng thành shard MỚI** của probe (không tên `_INDEX`, không `.gist`, không twin) ⇒ **pending 15→16**. Refine bắt nhánh 1, **sót nhánh 2**. Ghép cặp instrument này **không con nào nêu** |
| **F9** | phá *"trio 5/5 là tautology"* | **HELD (tautology xác nhận).** `harness-audit.md:54-58` = **đúng 5** anti-pattern đánh số = mẫu-số 5. Diary mtime 07-20 18:31, chưa ghi lại lần nào |
## D — 5 CÂU LEAD GIAO
**① E4 ĐÚNG — 14/15 chuẩn, 1/15 over-generalize.** Audit **tự mở cả 5 file**. `test-spec/baseline-history.md` thoát bằng **cơ chế khác** (skip-note), nên **tiêu đề** của refine vơ cả 15 vào một rọ là quá rộng. 🔴 **Kết luận vận-hành KHÔNG ĐỔI: 0/15 file thực sự cần nén.**
🔴 **Hệ quả nặng nhất, xác nhận bằng chính config:** `budget:12 _owner_set` viết nguyên văn *"đây là số anh tự đặt **sau khi thấy phép đo 15-shard-tồn**"* ⇒ anh chốt **7 SAU KHI nhìn 15**, mà 15 là dương-giả ⇒ **tiền đề chọn số đã lệch, có bằng chứng trong chính file config**. Chỉ owner sửa được.
🔴 **Về fault-inject 6/6 của C11:** probe **chạy đúng spec**; fault-inject chứng minh **logic đếm** có răng — nhưng **không thể** chứng minh **giả-định quy-ước-đặt-tên**, vì **cây tạm được dựng theo đúng giả định đó**. **Pass thật mà vẫn sai.** Ca thứ **5** của lớp "bộ lọc nuốt nhầm" — lần này *"nó nuốt nhầm cả một quy ước đặt tên"*.
**② E5 ĐÚNG — refine tự đếm thiếu.** `reviewer/2026-07.md` mtime 07-22 13:13, commit `36cefcc 13:40:49`; `.gist.md` dừng 07-18 11:56 (`aa88d01`) — xác nhận bằng **git**, mạnh hơn mtime. Nhưng đủ thì **6 cặp, không phải 2**. Nghịch lý refine nêu **đúng, biên độ gấp 3**.
**③ Con ĐO tự hạ giá 100% — TỰ-PHÊ ĐÚNG MỨC.** Mẫu-số 5 = đúng 5 anti-pattern đánh số ở `harness-audit.md:54-58`; diary seed chưa ghi lại. Điểm 5/5 **theo cấu tạo mà có**. Đây là tự-phê **chính xác về mặt cơ khí**, không phải khiêm tốn tu từ. Ngược lại — con ĐO **chưa đủ mạnh tay ở T7**.
**④ B2 BÁC ĐÚNG.** 3 chứng: (a) 4 vai đều có `source-verbatim:` + `pointer-style: substring back-resolve` ⇒ gist **đang làm đúng việc bản đồ**; (b) `budget:165` **đã tự xếp** impl-fe *"no _INDEX yet [P2 event, not sleep-scope]"* ⇒ BÁC-hạ-P2 **trùng phân loại có sẵn của spec**; (c) tạo `_INDEX` lúc này chủ yếu để **A7 đếm được** = sửa phép đo.
🔸 **Dư-lượng refine chưa đóng:** 4 vai đó **0 cơ chế kiểm pointer-integrity**, mà 2 trong đó (harvest-curator, tooling-auditor) **tự khai frontmatter** rằng nội dung đã move vào verbatim SAU khi gist chụp = **drift đã biết**. Refine đặt thuốc vào **câu chữ**, không giảm điểm mù. Đường rẻ hơn refine **không cân nhắc**: cho A7 resolve thẳng pointer trong `source-verbatim` của gist, **không cần `_INDEX.md`**.
**`git status` SẠCH.** Duy nhất `?? scheduled_tasks.lock` (lock runtime). 7 file tracked-dirty mtime 14:13→15:48 **TRƯỚC run-start 15:50****dơ có sẵn, KHÔNG phải dư-lượng wave**. Khai *"read-only = thiếu tool, KHÔNG sandbox"* của **cả hai con: ĐÚNG SỰ THẬT** — kiểm bằng mtime, không bằng lời khai.
🔴 **1 khuyết tật SPEC bắt được:** `run.md(f)` viết kỳ vọng *"post-wave git status → 0 tracked-change ngoài run-folder"*. Đọc theo mặt chữ thì **TRƯỢT** (7 file dirty), nhưng cả 7 có từ trước. **Phép kiểm như đang viết KHÔNG phân biệt được dơ-có-sẵn với dư-lượng-wave** ⇒ hoặc kêu oan, hoặc (nguy hơn) **bị bỏ qua như dương-giả rồi nuốt luôn dư-lượng thật**. Muốn có răng phải **chụp baseline `git status` TRƯỚC wave rồi so hiệu**.
## E — VERDICT TỔNG
**Con ĐO:** 11/11 tín-hiệu ĐẠT · 7/8 trục ĐẠT, **T7 TRƯỢT-MỘT-PHẦN**. Số **byte-exact 6/6**; audit cố phá 2 vùng CLEAN **không phá được**. Điểm trừ duy nhất: bỏ khối 8 đường dẫn probe ⇒ **tự bịt mắt trước E4**.
**Con ĐỀ-XUẤT:** 4/4 action ĐẠT · 8/8 E ĐẠT (E4 kèm nhãn over-generalize 1/15) · **12/12 BÁC ĐÚNG**. Điểm trừ: **E5 tự đếm thiếu 4/6 cặp** · **A1 sót hệ quả bậc 2** (F8).
**Toàn-vẹn:** cả hai con khai **THẬT** — kiểm bằng mtime + md5 + git, không bằng lời.
**3 việc đẩy owner/lead (ngoài trục audit, KHÔNG tự chấm):**
1. `min_pending_shards=7` **tiền đề lệch**, `budget:12` tự làm chứng — **số của owner**.
2. `run.md` crystallized **stale 2.195 B** + header *"0 LỆCH trên 4 mốc"* **im lặng loại đúng mốc lệch** — lead-surface, H24.
3. `run.md(f)` cần **baseline-diff**, `git status` trần không dùng được.
**KHAI BÁO CỦA AUDIT:** 6 script chạy — 5 read-only; `mfe-eval.ps1` ghi `.mfe-state.json`, md5 **trước = sau = `21a5a12d0354543cfea35e7d79527a45`**, **delta 0 byte**. **Không** Write/Edit file nào. *"Read-only" của audit cũng = thiếu tool, KHÔNG phải sandbox* — Bash vẫn là kênh ghi mở; đã tự soát `git status`: sạch.

View File

@ -0,0 +1,144 @@
# harness-eval — RETURN S144 (2026-07-22) — con ĐO, FIRST-RUN THẬT
> Lead scribe nguyên văn return @W1, ngay khi con ĐO trả (§2.1.9(c) — vai không có Write).
> 6/6 instrument chạy tươi, 0 lỗi, 0 `probe-loi`. **Đối chứng 4 mốc lead: 0 LỆCH.**
## PHẦN 1 — SỐ NGUYÊN VĂN
### 1.1 `measure-agent-memory.ps1` — 17 agent (`soft_cap 30720` · `autoinject_cap 25600`)
| agent | l1_hot | l2_verbatim | l2_index | l2_gist |
|---|---|---|---|---|
| cicd-monitor | 22607 | 226307 | **22108** | 40303 |
| database-agent | 7388 | 0 | 0 | 0 |
| frontend-designer | 21492 | 6624 | 1531 | 3231 |
| harness-audit | 1513 | 0 | 0 | 0 |
| harness-eval | 1547 | 0 | 0 | 0 |
| harness-refine | 1616 | 0 | 0 | 0 |
| harvest-curator | 17175 | 67374 | 0 | 20317 |
| implementer-backend | 19449 | 75787 | 10105 | 23079 |
| implementer-frontend | 15951 | 25581 | 0 | 11125 |
| investigator-api | 8510 | 0 | 0 | 0 |
| investigator-codebase | **26624** | 147348 | 12384 | 43854 |
| lead-omission-auditor | 9680 | 0 | 0 | 0 |
| lead-view-auditor | 6610 | 0 | 0 | 0 |
| office-document | 3323 | 0 | 0 | 0 |
| reviewer | 17784 | 142689 | 13780 | 35098 |
| test-specialist | 22140 | 18065 | 0 | 5374 |
| tooling-auditor | 18534 | 66747 | 0 | 18760 |
Tổng (số-học của con ĐO trên số máy in): l1_hot **221.943** · l2_verbatim **776.522** · l2_gist **201.141** B.
🔴 **BẪY GOODHART ĐÃ CHẶN:** cột `l1_over_30kb` in `false` cho investigator-codebase. `false` đúng theo **soft_cap 30720**, KHÔNG theo **autoinject_cap 25600**. 26624 > 25600 ⇒ file **KHÔNG lọt trọn auto-inject**. **CẤM đọc `false` này thành HEALTHY.**
### 1.2 `mfe-eval.ps1`
```
lead cap 380000 tok | mem-sub cap 60000 tok
[LEAD] marks(Active+High)=9 AS-classes=15 net-extra-guards=5 net-extra-recurring-gotchas=7
=> DENOMINATOR = 36 items
[LEAD] Coverage-FIT: span 28057 B => ~7014-9352 tok / 380000 = 2,46% worst-case FIT = PASS
[LEAD] age-band: marks parseable=9; >30d nhưng vẫn Active=4 -> KEPT
[LEAD] Goodhart anchor: strikes_total=23 RCA=12 AS-classes=15 last_run_strikes=23
```
Per-role: **100% (8 vai)** cicd 10/10 · frontend-designer 2/2 · harness-audit 5/5 · harness-eval 5/5 · harness-refine 5/5 · lead-omission 6/6 · lead-view 6/6 · test-spec 6/6.
**<100% (5 vai)** impl-be 17/18=94% · inv-cb 7/8=88% · reviewer 7/8=88% · inv-api 6/7=86% · impl-fe 11/13=85%.
**N/A — không rút được mẫu-số (4 vai)** database-agent · harvest-curator · office-document · tooling-auditor.
Cộng dồn **93/99 = 93,9% — chỉ trên 13/17 vai**.
### 1.3 `memory-archive-gate.ps1` (DRY-RUN)
```
cap 25600 | low-water 21760 (0.85) | keep-floor 5 | strike-need 2
PASS 1: investigator-codebase 26624 YES entries 15 strike 1 after-est ~24830
WATCH (strike 1<2) ; 6 value-protected entries HARD-SKIPPED
16/17 còn lại: over?=no strike 0
[A6] DRY-RUN: strike counters NOT persisted
PASS 2 (A7): cicd 99/99 · frontend-designer 0/0 · impl-be 41/41 · inv-cb 55/55 · reviewer 56/56
A7 GATE PASS — 251 pointers, 251 resolved, 0 failed
```
### 1.4 `crystallized-backfill.ps1`
```
STATUS 170744 | HANDOFF 96043 | ACTIVE-MARKS 30145 | migration-todos 84679
gotchas 111616 | agents/README 47497 TOTAL 540724 B
cap 380000 | tok RANGE [135181 .. 180241] | measured_headroom 199759
target (owner) 210000 | expected_backfill 199759 => headroom binds (target exceeds room)
```
### 1.5 `nhip-no-probe.ps1`
```
NHIP-NO: kiem light 1/6 deep 1/15 ok | tran-bo-nho 1 over-cap | run-chua-gom 2 | pull-cach 2 ngay
```
### 1.6 `distill-shard-probe.ps1` (MỚI phiên này — C11)
```
SHARD-PROBE: pending=15 | nguong=7 => KEU
```
Kiểm tập-đo: đọc `distill-shard-probe.ps1:40-43` loại trừ tường minh `_INDEX.md` + `*.gist.md`; ngưỡng đọc LIVE (`:29`). **Tập-đo SẠCH**, 15 khớp `_dinh_nghia_shard` trong budget. Con ĐO **không** tự viết lệnh đếm song song.
## PHẦN 2 — SO BASELINE (trích các trục có delta đáng kể)
🔸 **Cảnh báo đọc delta (bắt buộc cho con ĐỀ-XUẤT):** khối `measured` trong budget TỰ KHAI nhiều row ảnh-chụp S107/S138 đã trôi, chờ full re-sync **2026-08-01**. Nên `delta vs row` = **trôi-so-với-sổ**, TRỘN tăng-trưởng thật với tụt-hậu-của-sổ.
**2.a l1_hot** vượt autoinject: **1/17** (inv-cb 26624 = **104,0%**, +1024). Vượt soft-cap: **0/17**. Roster 17 row vs 17 đo **0 drift danh-sách**.
Đối xứng đáng chú ý: reviewer **6240** L1 (đã curate L1L2) inv-cb **delta vs S141 = 0** **kẹt trên cap, chưa được xử qua ít nhất 1 nhãn-phiên**.
**2.b l2_index vs cap 20.480** 🔴 **cicd-monitor 22108 = 107,9% VƯỢT (+1628)**. Budget tự ghi WATCH *"cicd l2_index 18774/20480 (~92% cap)"* **mốc WATCH ĐÃ VỠ**. **không instrument nào gác trục này**: archive-gate PASS 1 chỉ soi L1 vs autoinject-cap; A7 soi pointer-resolve không soi kích-thước; `tran-bo-nho` chỉ đếm `MEMORY.md`.
**2.c l2_verbatim/gist (no-cap)** verbatim 580.737 **776.522** (+195.785) · gist 118.957 **201.141** (+82.184). 2 vai mới gist.
**2.d archive_gate params** 4/4 khớp budget, **0 drift config**. Hai quan sát:
1. `after-est ~24830` **> low-water 21760** ⇒ drain nếu nổ **không chạm** mục tiêu hysteresis A4; đệm dưới cap chỉ ~770 B (do 6 entry value-protected HARD-SKIP).
2. `strike 1` + `NOT persisted` + **`.claude/agent-memory/.archive-strikes.json` KHÔNG TỒN TẠI** ⇒ ở chế-độ DRY-only strike **không bao giờ tiến tới 2** ⇒ nhánh PROPOSE của A6 **bất-khả-đạt** trừ khi `-Apply`.
**2.e crystallized** — headroom **199.759 < target 210.000****ĐẢO CHIỀU lần đầu** (S115: target 210K < headroom ~253,7K). Δ **53,9K**. Số-học: floor worst-case 180.241 + target 210.000 = **390.241 > cap 380.000** (âm 10.241); đầu lạc-quan 135.181+210.000 = 345.181. Dải **vắt ngang trần**.
**2.f MFE** cap khớp live; strikes **23 = 23 (không leo)**; RCA 12=12. per-role coverage **KHÔNG CÓ BASELINE LƯU** **N/A, không so được**.
**2.g cadence** `light_every 6`/`deep_every 15` khớp probe; nợ 1/6 1/15 **ok**. `pull-cach 2 ngay` không hậu-tố OVERDUE.
## PHẦN 3 — VERDICT PER-TRỤC
| # | trục | verdict |
|---|---|---|
| T1 | l1_hot vs autoinject-cap | **MIXED** 16/17 lành, inv-cb kẹt 104% **delta S141 = 0** |
| T2 | **l2_index vs cap** | **REGRESSION** cicd 107,9%, WATCH-92% đã vỡ, **0 cửa gác** |
| T3 | l2_verbatim/gist (no-cap) | **HEALTHY** |
| T4 | archive-gate strike + A7 | **MIXED** A7 251/251 PASS nhưng chỉ phủ **5/9 vai có archive = 77,1% bytes**; strike bất-khả-tiến |
| T5 | **crystallized headroom** | **REGRESSION** headroom < target lần đầu; floor+target vượt trần |
| T6 | MFE FIT + coverage | **HEALTHY (3 caveat)** |
| T7 | **distill shard (C11 mới)** | **REGRESSION** 15 vs 7 = 214%. *Caveat: ngưỡng vừa đặt hôm nay, **không chuỗi-thời-gian** VỠ-NGƯỠNG, chưa chứng-minh "xấu đi"* |
| T8 | nhịp/cadence + pull | **HEALTHY** |
🔴 **3 caveat gắn T6 — CẤM bỏ khi trích lại:**
1. Trio 5/5 = 100% mỗi vai nhưng diary **SEED 1,5KB chưa chạy**. Mẫu-số rút từ chính khối anti-pattern của role-file seed được viết để soi gương **đo "seed khớp spec của chính nó"**, KHÔNG đo giữ-trí-nhớ-xuyên-phiên. **Đừng đọc thành bằng chứng hệ nhớ khoẻ.**
2. 4 vai **N/A** = vùng **không đo được**, không phải vùng đạt.
3. `judge_layer` vẫn **SCAFFOLD rỗng** nhánh recall/apply chưa điểm thật.
🔴 **Caveat T4:** "A7 PASS 251/251" đúng nguyên văn nhưng phạm vi **5/9 vai**. 4 vai (harvest-curator 67374 · tooling-auditor 66747 · impl-fe 25581 · test-spec 18065 = **177.767 B**) archive **không có `_INDEX.md`** ngoài tầm soi pointer. **PASS thật, KHÔNG toàn phần.**
## VERDICT TỔNG: **MIXED**
3 REGRESSION (T2·T5·T7) · 2 MIXED (T1·T4) · 3 HEALTHY (T3·T6·T8).
Trục vỡ đều **trần/ngưỡng bị vượt**, KHÔNG phải hỏng toàn-vẹn mọi phép integrity chạy được đều PASS (A7 251/251, cadence ok, strikes không leo).
## PHẦN 4 — TÍN-HIỆU cho con ĐỀ-XUẤT (chỉ tín-hiệu + số, KHÔNG action)
| # | tín-hiệu | số neo |
|---|---|---|
| S1 | l2_index cicd vượt cap | 22108/20480 = 107,9%, 1628 **không cửa gác nào bắt** |
| S2 | L1 inv-cb kẹt trên cap | 26624/25600; **delta vs S141 = 0**; reviewer cùng kỳ tụt 6240 cơ-chế rút hoạt động nơi khác |
| S3 | headroom tụt dưới target owner | 199.759 < 210.000; 53,9K vs S115; 180.241+210.000 = 390.241 > 380.000 |
| S4 | shard vỡ ngưỡng mới | 15 vs 7 = 214%; cicd ×4 + impl-be ×4 + 7 nữa |
| S5 | strike A6 **bất-khả-tiến** | strike 1, need 2, NOT persisted, `.archive-strikes.json` **không tồn tại** ⇒ nhánh PROPOSE chưa từng có cơ hội nổ |
| S6 | A4 hysteresis không đạt nếu drain nổ | after-est 24830 > low-water 21760; đệm ~770 B; value-gate kéo ngược mục-tiêu drain |
| S7 | 4 vai archive **không có `_INDEX`** | 177.767 B = **22,9% bytes archive** ngoài tầm A7 đang in PASS |
| S8 | coverage cao hơn mức nó chứng minh | 93/99 chỉ trên 13/17; trio 100% là seed-tự-soi |
| S9 | 5 vai coverage <100% | mỗi vai thiếu 1-2 mục; **MFE không lưu baseline** không nói được tốt lên hay xấu đi |
| S10 | **KHÔNG PHẢI VIỆC CON ĐO — chuyển H2** | `run-chua-gom 2` nhường `harvest-curator` |
| S11 | **thiếu chuỗi-thời-gian** | budget `measured` tự khai stale S107/S138, re-sync 2026-08-01; MFE không lưu coverage lịch sử mọi delta "tươi vs sổ", KHÔNG phải tốc-độ theo phiên |
## KHAI BÁO TOÀN-VẸN (con ĐO tự khai — không cắt)
1. **Dư-lượng ghi từ chính lượt W1 — 1 file:** `mfe-eval.ps1` GHI `.claude/agent-memory/.mfe-state.json` **theo thiết-kế** (budget `mfe.honest_caveats.read_only_scope` khai sẵn *"MFE WRITES exactly one file"*). 5 script còn lại read-only (archive-gate `DRY-RUN no writes`, backfill `READ-ONLY never tunes/writes`, 3 script chỉ stdout).
2. **"read-only" của con ĐO = thiếu tool Write/Edit, KHÔNG phải sandbox** vẫn giữ Bash = kênh-ghi-mở. Containment THẬT = lead soát `git status`.
3. **Không tự tính lại phép đo** mọi số hoặc máy in, hoặc số-học đơn giản trên số máy in (đã ghi chỗ nào).
4. **Ranh-trục giữ:** 0 action đề xuất · 0 chấm-spec · 0 soi lead-surface · `run-chua-gom 2` đẩy sang H2.

View File

@ -0,0 +1,113 @@
# harness-refine — RETURN S144 (2026-07-22) — con ĐỀ-XUẤT, FIRST-RUN THẬT
> Lead scribe nguyên văn @W2. INPUT PIN hợp lệ (`harness-eval-return.md`, 10.907 B, 11 tín-hiệu) ⇒ **fail-closed KHÔNG nổ**.
> Phụ trợ đã đọc: `reinject-ledger.md` (**TRỐNG** — chỉ placeholder S95) · diary vai (seed S141).
## PHẦN 0 — Đã VERIFY gì trước khi đề xuất
**KHÔNG đo lại: 0 script chạy.** Mọi số hoặc là số nguyên văn con ĐO, hoặc số-học đơn giản trên số đó.
**Có làm — targeting** (`ls`/`head`/`stat`/đọc config), vì action trỏ vào file không tồn tại hoặc **đã nén rồi** là action vô giá trị:
| Kiểm | Kết quả |
|---|---|
| `.archive-strikes.json` | **KHÔNG TỒN TẠI** — xác nhận S5 bằng existence-check |
| `measure-agent-memory.ps1:20` | `l2_index` = **duy nhất** file tên `_INDEX.md` ⇒ S1 quy về đúng 1 file |
| 9 vai có archive | 5 có `_INDEX.md` / 4 không — khớp S7 |
| `mfe-eval.ps1:270` | chỉ in `hit/den = pct`, **KHÔNG in TÊN mục trượt** ⇒ lớp ① mất địa chỉ |
| `distill-shard-probe.ps1:56` | `$fire = ($n -ge $minShards)` ⇒ muốn IM phải xuống ≤6, tức cần **9** gist |
| Liệt kê 15 shard | cicd 4 · inv-cb 4 · impl-be 4 · reviewer 2 · test-spec 1 = **15** ⇒ nền số con ĐO đứng vững |
| Frontmatter 4 file `2026-05.gist.md` | 🔴 **LẬT NGƯỢC cách đọc S4** — xem E4 |
## PHẦN 1 — BẢNG ACTION (propose-only)
| # | action | lớp | đối-tượng | trigger | chốt-dừng | owner-gate |
|---|---|---|---|---|---|---|
| **A1** | Nén tại chỗ `_INDEX.md` cicd xuống dưới cap, **giữ nguyên số pointer** | ③ | `cicd-monitor/archive/_INDEX.md` | **S1** 22108/20480 = 107,9%, dư 1628 | lần **1** (ledger trống). Lượt kế vẫn ≥20480 ⇒ **KHÔNG lần 2**, leo thang lead+owner | **Hỗn hợp** — sửa nội dung = AI/lead; **cap 20480 = số owner, CẤM AI nâng**. Cần thêm low-water cho `l2_index` — chỉ NÊU |
| **A2** | Curate L1→L2 inv-cb: cắt **≥4864 B** (xuống dưới low-water 21760, **không** dừng ở "vừa đủ dưới 25600") | ③ | `investigator-codebase/MEMORY.md``archive/2026-07.md` + `_INDEX.md` | **S2** 104,0%, delta S141 = 0 · **S6** after-est 24830 > low-water 21760, đệm ~770 B. Tiền lệ: reviewer 6240 | lần **1**. Cắt hết low-value mà vẫn >21760 ⇒ **value-floor thật** ⇒ leo thang owner, **không cắt tiếp** | **Hỗn hợp** — thao tác AI/lead (moved-not-cut + md5). **6 entry value-protected + keep-floor 5 = CẤM đụng.** cap/low-water = số owner |
| **A3** | 🔴 **Làm TƯƠI gist đã cũ** (KHÔNG tạo gist mới) | ④ | `reviewer/archive/2026-07.gist.md` (chính) · `investigator-codebase/2026-07.gist.md` (sau A2) · *(yếu)* `implementer-frontend/2026-H1.gist.md` | **S2** reviewer 6240 = đã append verbatim SAU khi gist sinh ⇒ **gist thiếu phần mới**. Đây là **nợ mà S4 KHÔNG nhìn thấy** | lần **1**/file | AI/lead. Ràng buộc: coverage-diff gate + tăng `distill-gen` 1→2 + tôn trọng double-distill guard |
| **A4** | Thăng hạng bài học *"bộ lọc chuỗi nuốt nhầm đối tượng — kiểm tập-đo TRƯỚC khi tin số"* | ② | `harness-eval/MEMORY.md` (chính) · *(tuỳ chọn)* `tooling-auditor/MEMORY.md` | Lặp **≥2** sẵn: `memory-budget.json:14` liệt **4 ca cùng phiên**; **E4 là ca thứ 5**. Chỗ đặt còn trống: L1 harness-eval 1547/25600 | lần **1**. Lượt sau không hiện diện ⇒ chuyển ① reinject theo CG-1 | **Lead quyết** (chạm diary vai khác). Không chạm số/luật owner |
**Lớp ① nạp-lại = 0 action** — không phải thiếu tín hiệu mà **mất địa chỉ**: S8 nói thiếu đúng 6 mục nhưng `mfe-eval.ps1:270` không in tên; ledger CG-1 bắt buộc `item-id`. Đề xuất reinject không có id = **bịa**.
**Thứ tự:** A2 → A3 (A2 làm gist inv-cb cũ đi). A1, A4 độc lập.
## PHẦN 2 — Bẫy Goodhart gắn từng action
- **A1 — CẤM "tách file" để hạ số.** `measure-agent-memory.ps1:20` chỉ cộng file tên đúng `_INDEX.md`. Tách thành `_INDEX-2026-05.md` làm `l2_index` tụt ngay mà **0 byte thông tin mất** — bytes chỉ chuyển sang `l2_verbatim` **vốn không cap**. Nghiệm thu đúng = **A7 vẫn resolve ≥99 pointer, 0 failed**.
- **A2 — CẤM cắt entry value-protected để đạt chỉ tiêu byte.** Chỉ còn cách đó ⇒ kết luận đúng là "value-floor", leo thang owner.
- **A3 — CẤM viết gist rỗng cho đủ số.** Hạ `pending` 15→≤6 **rất dễ làm giả** (9 file `.gist.md` rỗng là probe im ngay). Nghiệm thu lớp ④ phải là **coverage-diff gate, KHÔNG BAO GIỜ là con số pending**.
- **A4 —** bài học thăng hạng phải kèm **ca cụ thể**, không thì thành khẩu hiệu mà MFE vẫn tính là "có mặt".
## PHẦN 3 — NGOÀI 4 LỚP → NÊU + LEO THANG
**E1 — lớp ① bị chặn ở tầng công cụ.** `mfe-eval.ps1:270` không in mục trượt. `reinject-ledger.md:50` **tự khai** đúng khuyết tật (*"per-item-L1-presence detection is still PARTIAL"*). ⇒ 6 mục thiếu **không thể** vào ledger. Đề nghị con ĐO lượt sau in kèm danh sách mục trượt per-role.
**E2 — S5 ghost-wire + mâu thuẫn thiết kế nội tại.** `memory-budget.json:45` khai *"persists strikes in `.archive-strikes.json`"* — file **không tồn tại**. Nhưng cùng file, `value_protect._note` chốt *"Archive-gate stays DRY-RUN"*. Hai câu **kéo ngược nhau**: strike chỉ tiến khi ghi state, mà ghi state chỉ xảy ra khi rời DRY-RUN. Owner phán 1 trong 2: **tách quyền** (persist-strike ≠ apply-drain — ghi bộ đếm không phải xoá dữ liệu) hoặc **gỡ lời khai** để cơ chế không tự nhận có răng.
**E3 — S1 không cửa gác, cũng không low-water.** Budget tự ghi index này *"grows with each run"* ⇒ A1 cắt đúng 1628 B thì tái vượt sau ~1 phiên. Cần low-water cho `l2_index`**số của owner**.
### 🔴 E4 — PHÁT HIỆN NẶNG NHẤT: 15 shard "pending" đều ĐÃ CÓ bản nén, dưới TÊN GỘP
| file gist | frontmatter khai phủ | số file |
|---|---|---|
| `cicd-monitor/2026-05.gist.md` | `source-verbatim: 2026-05-q2 (1) · q3 (3) · q4 (7) · 2026-05-runs (20 run-records)` | **4/4** |
| `investigator-codebase/2026-05.gist.md` | *"q1+q2+q3+q4 distilled"*, `distill-gen: 1 (already-distilled — do NOT re-compress)` | **4/4** |
| `implementer-backend/2026-05.gist.md` | *"Covers verbatim files: q1 (S21-24), q2 (S25-29), q3, q4"*, `do NOT re-compress` | **4/4** |
| `reviewer/2026-05.gist.md` | *"Verbatim: q1 + q2"*, *"KHÔNG nén lại bản này"* | **2/2** |
| `test-specialist/baseline-history.md` | không phải `<period>.md`; `memory-budget.json:162` đã ghi *"reference-file [skip sleep: đã distilled-form]"* | **1/1** |
**4+4+4+2+1 = 15/15.**
🔴 **Nguyên nhân KHÔNG phải bug code** — probe chạy đúng spec của nó. Sai ở **GIẢ ĐỊNH của spec**: `_dinh_nghia_shard` giả định gist ghép **1:1 theo tên**, trong khi corpus thực tế dùng **gist gộp nhiều-về-một**. ⇒ `pending=15` đang đo **TÊN FILE**, không đo **ĐỘ PHỦ DISTILL**.
**Ba hệ quả đưa tới owner:**
1. Đề xuất máy móc "tạo 9 gist twin" sẽ **vi phạm `do NOT re-compress` ghi thẳng trong 3 file gist** + nhân bản nội dung đã có ⇒ **BÁC** (A3 đổi hướng).
2. `min_pending_shards = 7` là số **owner chốt hôm nay SAU KHI NHÌN con số 15**. Nếu mẫu-số đó phần lớn dương-giả thì **tiền đề chọn số đã lệch****chỉ owner được sửa số của mình**.
3. Quy trình: `distill-shard-probe.ps1:63-65` **CÓ in 8 đường dẫn pending** khi kêu; phần đó **không có trong eval-return**, chỉ còn dòng verdict. Nếu khối đường dẫn được chép nguyên, lớp ④ đã chẩn đúng **ngay từ nấc 1**.
### E5 — điểm mù THỨ HAI của probe: đếm twin TỒN TẠI, không đếm twin TƯƠI
- `reviewer/archive/2026-07.md` sửa **hôm nay** trong khi `2026-07.gist.md` dừng **07-18****được số con ĐO chứng thực** (S2: reviewer curate L1 6240 vào L2). Độ tin **CAO**.
- `implementer-frontend/2026-H1.md` (07-14) mới hơn `.gist.md` (07-02) — **chỉ mtime**, độ tin **THẤP**, cần soi nội dung.
🔴 **Nghịch lý phải nói thẳng:** *tín hiệu LÀNH MẠNH S2 (reviewer chịu curate) chính là thứ sinh ra nợ gist mà probe không thấy.* **Càng làm đúng ở lớp ③ thì nợ ẩn ở lớp ④ càng tăng, mà đồng hồ vẫn im.**
**E6 — S3 ngoài tầm với, khai thẳng.** headroom đứng trên sàn file của **lead hot-feed**, KHÔNG phải agent-memory corpus ⇒ **không action nào của A1A4 làm S3 dịch 1 byte**. `crystallized._target_note` cấm AI auto-tune. **Ai nói action memory-corpus "giải quyết" S3 là nói sai.**
**E7 — chốt-dừng của chính con ĐỀ-XUẤT hiện là NGHI THỨC, chưa phải cơ chế.** Ghi "lần 1" cho A1A4 nhưng **không có sổ nào** để lượt sau biết đó là lần 1; ledger schema chỉ nhận floor-rot; và vai bị **cấm tự tìm run mới nhất**. Đề nghị rẻ: lượt sau lead **PIN thêm input thứ 2 = bản refine-return này**. Không có nó thì luật "một lần rồi leo thang" là **chữ, không phải răng**.
**E8 — S9/S11 không có đường lùi.** MFE không lưu coverage lịch sử ⇒ mọi câu "tốt lên/xấu đi" **không kiểm chứng được**. Đã không đề xuất gì dựa trên xu hướng.
## PHẦN 4 — ĐÃ CÂN NHẮC RỒI BÁC (12 mục)
| # | đã soi | quyết | lý do |
|---|---|---|---|
| B1 | Tạo 9 `.gist.md` để probe im (đọc thẳng S4) | **BÁC** | E4: cả 15 đã có bản nén; 3 gist ghi `do NOT re-compress`. Nén-2-lần + nhân bản, hạ số mà **không** cải thiện trí nhớ = rời tập-đo |
| B2 | Tạo `_INDEX.md` cho 4 vai thiếu (S7) | **BÁC, hạ P2** | 4 vai đều có `source-verbatim:` + `pointer-style: substring back-resolve`**gist đang làm đúng việc bản đồ**; mỗi vai chỉ 2 file verbatim. Tạo index lúc này chủ yếu để **A7 đếm được** = sửa phép đo chứ không sửa trí nhớ, **cùng loại lỗi B1 đổi chiều**. Khuyết tật thật là **câu chữ "A7 PASS 251/251" nghe như toàn phần** |
| B3 | ① reinject 6 mục thiếu | **BÁC** | Không có item-id (E1); đề xuất "mục nào đó" = bịa |
| B4 | Tự dò tay 6 mục nào thiếu | **BÁC** | = chạy lại phép đo con ĐO bằng tay ⇒ lấn nấc 1 + tạo 2 nguồn số cạnh tranh |
| B5 | Đề nghị owner hạ `target` 210.000 cho khớp headroom | **BÁC** | Số owner; `_target_note` cấm auto-tune; hạ số cho vừa phép đo = **bịt đèn báo** |
| B6 | Nâng `l2_index.cap` >22108 cho cicd hết đỏ | **BÁC** | Cùng lớp B5: đổi thước khi vật vượt thước. A1 đi hướng ngược (giảm vật) |
| B7 | Chạy `-Apply` để strike ghi được | **BÁC** | Read-only + chạm dữ liệu thật; budget chốt gate **cố ý** DRY-RUN ⇒ đẩy E2 |
| B8 | Nhịp curate theo "tốc độ phình L1" | **BÁC** | S11 khai không có chuỗi thời gian ⇒ đề xuất theo xu hướng = đề xuất trên dữ liệu **không tồn tại** |
| B9 | Ghi nhật ký first-run cho diary của chính mình | **BÁC** | Lặp=1 chưa chạm ngưỡng ②; và **tự phục vụ** |
| B10 | Thăng hạng "công thức curate L1→L2" vào L1 inv-cb | **BÁC** | Ngưỡng ② đạt nhưng **chỗ đặt sai**: nhét vào đúng file đang vượt cap = tự làm nặng thứ A2 đang gỡ |
| B11 | `run-chua-gom 2` | **BÁC — nhường** | H2 `harvest-curator` |
| B12 | Mọi thứ thuộc hot-feed/carry/work-state LEAD | **BÁC — nhường** | Trục `lead-omission-auditor`; cố ý không đề xuất gì cho S3 ngoài nêu |
## PHẦN 5 — Phản hồi RANH SẮC (lead hỏi)
Ranh `refine ⟂ lead-omission` **theo đối tượng thì sạch, chạy được**. Ba chỗ nên chỉnh khi owner ratify:
1. 🔴 **Có đường nối mà bảng 2 cột không thấy:** `crystallized.source_order` = gist → dòng archive có value-marker → RAG ⇒ **corpus của refine là NGUỒN NẠP cho hot-feed của lead**. S3 rơi đúng chỗ nối. Đề nghị ghi thành chữ: *refine được đề xuất thay đổi **nguồn** (corpus); KHÔNG được đề xuất thay đổi **số/nội dung lead nạp**.*
2. **5/11 tín hiệu là khuyết tật INSTRUMENT** (S1·S5·S6·S9·S11) mà 4 lớp của refine đều là corpus-mutation ⇒ tất cả rơi vào sọt "escalate", **dễ thành nơi việc đi vào rồi nằm im**. Đề nghị định tuyến lớp instrument sang `tooling-auditor`.
3. **Chốt-dừng cần vật mang, không chỉ cần luật** (E7).
## PHẦN 6 — KHAI BÁO TOÀN VẸN
1. **Dư lượng ghi: KHÔNG.** 0 script chạy, 0 file tạo/sửa/xoá. Chỉ `Read` + `Bash` với `ls`/`head`/`stat`/`grep`/`sed`.
2. **"read-only" = thiếu tool Write/Edit, KHÔNG phải sandbox** — Bash vẫn là kênh ghi mở.
3. **Đề xuất ≠ đã làm.** A1A4 propose-only, chờ lead VERIFY (single-writer B3).
4. **Ranh trục giữ:** 0 phép đo mới · 0 chấm điểm · 0 đụng lead-surface.
5. **Chỗ vượt ra ngoài "chỉ đọc số":** mở frontmatter 6 file gist + mtime 7 cặp — vì lớp ④ **bắt buộc** phải biết đối tượng đã nén hay chưa. Kết quả E4/E5 **không mâu thuẫn** số nào của con ĐO; nó chỉ nói con số 15 đang đếm **tên file** chứ không đếm **độ phủ**.
6. **Độ tin không đồng đều:** E4 = frontmatter tự khai (**CAO**) · E5-reviewer = có số con ĐO chứng thực (**CAO**) · E5-impl-fe = chỉ mtime (**THẤP**).
7. **Ledger CG-1 trống** ⇒ A1A4 đều **attempt = 1** hợp lệ, 0 ca phải leo thang lượt này.

View File

@ -0,0 +1,32 @@
# run: 2026-07-22-S144-trio-first-run
- **Phiên:** S144 · **Lead:** Opus 4.8 · **Consent:** anh gõ *"3 cái này chạy đi nhé"* @S144
- 🎯 **FIRST-RUN THẬT của bộ-ba trio-memory** — land S142, spawn-probe ALIVE 3/3 sáng nay, **chưa chạy task thật lần nào**. Đây là thứ duy nhất chặn nấc `executed-file/verified-pending-restart`**`verified-runtime`**.
## Nghi thức (§2.1.9)
- (b) **3 spawn RIÊNG, TUẦN TỰ** eval → refine → audit. 🔴 **CẤM `parallel()`** — audit chạy song song sẽ chấm bản CŨ ⇒ verdict vô nghĩa.
- (c) **Lead scribe NGAY** khi mỗi con trả → `harness-{eval,refine,audit}-return.md`, **không đợi đủ 3**. Lý do: 3 vai khai không có Write/Edit; phiên chết giữa chừng = mất return (bài học vòng-1 S141).
- (d) **PIN đích danh**: refine nhận path `harness-eval-return.md`; audit nhận path run-folder này. Pin missing/rỗng ⇒ vai **TỪ CHỐI**, cấm tự tìm "run mới nhất".
- (e) 🔒 **Mirror C1 — đóng băng bề-mặt-đo** từ đây tới verdict cuối: KHÔNG ghi `agent-memory/` · `.session-counter.json` · `ACTIVE-MARKS` · `STATUS` · `HANDOFF` · `gotchas` · `error-ledger` · `migration-todos` · `agents/*.md`. Ngoại lệ: `WAL.md`.
- (f) Post-wave `git status --short` → kỳ vọng **0 tracked-change ngoài run-folder**.
- Label theo C3 (dogfood khuôn 4 thành-phần vừa adopt): `Vòng-3 harness-eval w1 @start s144`
## Bối cảnh đo (để 3 con có nền, KHÔNG phải để chép)
Đo tươi phiên này, **trước khi đóng băng**:
- roster 17 · L1 lớn nhất `investigator-codebase` **26.624 B** > autoinject cap 25.600 ⇒ 1 over-cap
- 3 diary trio: eval 1.547 B · refine 1.616 B · audit 1.513 B (seed-state, `l2_*`=0 — đúng vì chưa chạy)
- shard chưa-gist **15** / ngưỡng mới **7** ⇒ KÊU (C11 vừa wire phiên này)
- detector TOTAL **47** · H17 spec-audit GAPS **none** · nhịp-nợ light 1/6 deep 1/15
- ~~crystallized: hotload 538.529 B → tok RANGE [134.632..179.510], headroom 200.490~~ 🔴 **SỐ NÀY SAI — audit W3 bắt, lead tự đo lại xác nhận.**
**ĐÚNG: hotload 540.724 B → RANGE [135.181..180.241], headroom 199.759**, target 210.000.
**Nguyên nhân (lead tự truy):** lead chạy `crystallized-backfill` **sớm trong phiên**, sau đó **tự tay sửa `agents/README.md`** cho C9 (bảng cost 7→17 vai, **+2.195 B**, mtime **15:38:39**), rồi chép **con số TRƯỚC khi sửa** vào đây và gắn nhãn *"đo tươi"*. ⇒ **lead đổi chính vật mình vừa đo, rồi trích số cũ.**
🔴 **Lỗi thứ hai, nặng hơn:** header `harness-eval-return.md` scribe *"Đối chứng 4 mốc lead: 0 LỆCH"* — mà khối này liệt **5 mốc**. Mốc thứ 5 (crystallized) **chính là mốc lệch**, và việc loại nó khỏi phép đối chứng **không được khai**. Con ĐO không sai; **lead thu hẹp tập đối chứng mà im lặng**.
Giữ dòng gạch để làm vết — xoá là mất chứng nhân.
## Stages
- [!] W1 — `harness-eval` (con ĐO)
- [ ] W2 — `harness-refine` (con ĐỀ-XUẤT, PIN eval-return)
- [ ] W3 — `harness-audit` (con KIỂM, PIN run-folder)

View File

@ -0,0 +1,35 @@
# trio-first-run — SYNTHESIS (🔴 RETRO-HARVEST @S146, không viết lúc chạy)
> **Khai ngay đầu:** file này viết **hồi-tố @S146 2026-07-22** bởi lead, trong lượt `/tiep`, khi sàn-3 `/tiep §0` bắt folder này là **orphan** (có `run.md`, không có `*-synthesis.md` phẳng).
> ⇒ Đây **KHÔNG** phải bản ghi lúc chạy. Mọi dòng dưới đều **truy được từ đĩa** (3 file `harness-*-return.md` + `run.md` trong chính folder này); chỗ nào **suy ra** thì ghi rõ là suy ra. **KHÔNG bịa kết quả.**
## Kết luận 1 dòng
**FIRST-RUN THẬT của bộ-ba trio-memory ĐÃ CHẠY ĐỦ 3/3 TUẦN TỰ và ĐẠT** — nấc `executed-file`**`verified-runtime`** cho `harness-eval` · `harness-refine` · `harness-audit`. Lệch duy nhất cả lượt **không nằm ở 3 con**, mà ở **`run.md` của chính lead**.
## Bằng chứng trên đĩa (đo lại @S146)
| vật | trạng thái |
|---|---|
| `harness-eval-return.md` | tồn tại (con ĐO, lead scribe @W1) |
| `harness-refine-return.md` | tồn tại (con ĐỀ-XUẤT, PIN eval-return) |
| `harness-audit-return.md` | tồn tại (con KIỂM, PIN run-folder) |
| nghi-thức §2.1.9(b) TUẦN TỰ | giữ — 3 spawn riêng, KHÔNG `parallel()` |
| nghi-thức §2.1.9(c) scribe-ngay | giữ — và **đã cứu được một lượt** (xem dưới) |
## 2 phát hiện đáng giữ (nguyên văn từ return, không tô hồng)
**(1) `#53` garble fire THẬT — resume là đường cứu duy nhất.**
`harness-audit` lượt-1 trả mẩu giữa chừng → **SendMessage-resume** → mới có return đầy đủ. Vai này **không ghi đĩa**, nên nếu phiên chết lúc đó thì **mất trắng**. ⇒ củng-cố đúng luật §2.1.9(c) *lead scribe NGAY, không đợi đủ 3*.
**(2) 🔴 Lệch duy nhất nằm ở LEAD, không ở con ĐO.** Con KIỂM tự re-chạy **6/6 instrument** (không phải 2 như sàn tối-thiểu) → **0 LỆCH** trên cả 6, và tự cộng lại 7 tổng phái-sinh đều khớp. Nhưng bắt được `run.md` của lead ghi:
| | lead ghi | đĩa thật |
|---|---|---|
| hotload | 538.529 B | **540.724 B** |
| headroom | 200.490 | **199.759** |
**Nguyên nhân lead tự truy (giữ nguyên trong `run.md`, có gạch ngang làm vết):** lead chạy `crystallized-backfill` sớm trong phiên → **rồi tự tay sửa `agents/README.md`** (+2.195 B) → **chép lại con số TRƯỚC khi sửa** và gắn nhãn *"đo tươi"*. ⇒ **lead đổi chính vật mình vừa đo, rồi trích số cũ.**
🔴 **Lỗi thứ hai, nặng hơn:** header scribe ghi *"đối chứng 4 mốc lead: 0 LỆCH"* trong khi khối đó liệt **5 mốc** — mốc thứ 5 (crystallized) **chính là mốc lệch**, và việc loại nó khỏi phép đối chứng **không được khai**. Con ĐO không sai; **lead thu hẹp tập đối chứng mà im lặng**. Đây đúng class `meta-count self-coverage blind-spot`.
## Residual thật (KHÔNG đóng)
- `## Stages` trong `run.md` tới giờ vẫn `[!] W1 · [ ] W2 · [ ] W3`**stale**: cả 3 đã chạy xong. Checkbox không được đóng lúc kết thúc.
🔸 **Giữ nguyên, KHÔNG sửa ngược:** đó là **vết thật** của việc closeout bị cắt; sửa ở đây thành `[x]` sẽ xoá đúng bằng-chứng mà retro-harvest này sinh ra để ghi lại. Bài học đi vào `_residual` chứ không đi vào việc làm đẹp checkbox.
- Vì sao thành orphan: phiên S144→S145 chạy tiếp việc khác rồi `/pause`, harvest-gate chưa kịp gom.

View File

@ -0,0 +1,43 @@
# implement-synthesis — spec-v2 áp xong (S145 phóng → S146 relaunch-cắt-gọt → reviewer PASS-with-fixes)
> Bản-ghi-kết-quả **dạng-1 phẳng** (đóng orphan ① của Sàn-3). Viết @S146 sau khi reviewer trả và lead đã vá.
## Kết luận 1 dòng
**5 axis của `spec-apply-hub-s145-v2.md` đã land, verify TRÊN ĐĨA, 0 file prod-code.** Reviewer bắt **2 MAJOR thật — cả hai là lỗi của lead** — đã vá xong trong phiên.
## Đường đi (2 phiên, 1 lần chết giữa chừng)
| stage | kết |
|---|---|
| S0S3 @S145 | ground → spec-v1 → `/fable-clone` reviewer ensemble 5 lane (**FAIL 2C + nhiều MAJOR**) → synthesize **spec-v2** |
| S4 lần 1 @S145 | `wf_f9f24694-12b`**CHẾT giữa chừng**`/pause`; chỉ axis **B** landed (~1/4) |
| S4 lần 2 @S146 | `/tiep §4` **relaunch-CẮT-GỌT** `wf_3d803740-41d` — 3 worker DISJOINT-file (A · C+E · D), **3/3 DONE**, 511k tok / ~20 |
| S5 @S146 | `reviewer` pre-commit + fault-inject → **F1/F2 MAJOR** → lead vá → quét cuối sạch |
🔴 **Cross-session resume KHÔNG hợp-lệ** (`tiep.md §4.5` SAME-SESSION-ONLY) ⇒ bỏ hẳn run cũ, relaunch với memory-pack **dẫn-xuất-lại TƯƠI**. Harvest-hồi-tố axis B bằng cách **đo đĩa**, không tin return đã mất.
## Kết quả per-axis (bằng-chứng đo đĩa @S146)
| axis | kết |
|---|---|
| **A** C7 | `harness-11-engine.md` **§N.8** — predicate 4-vế, tách FLOOR/FORM; `N.2` 3→**4 path cố định** |
| **B** bulk | `bulk_note_shards: 30` (landed @S145, verify lại) |
| **C** session-model | hook `wal-flush.ps1:13` = **4 path** (+`.claude/sessions/`) · Sàn-3 **⑤ + ORPHAN-L** · VC-1 nhãn 2 tầng · scaffold + orphan-L rule · `session_ctx_kb`=64 owner-set |
| **D** 5-vòng | `session-end` gỡ "land dần sau" · **D2 KIỂM end-only** + H24-coupling · completeness-gate **§L.c** có RĂNG (cấm bare-PASS) |
| **E** tiep/pause | line-ref `:7``:13` · wf: 5-trường · memory-pack-rule |
**🎯 LIVE-VERIFY hook 4-path PASS trong repo THẬT:** commit `da7ee8a` nuốt `.claude/sessions/session-1/probe.md`. Worker CE chỉ verify được **cây tạm****khai thật** là không quan-sát được repo-thật từ trong subagent (hook ở event `Stop`, không phải `SubagentStop`) ⇒ lead tự làm nốt. **Khai đúng phạm-vi = lý do mảnh này không thành claim rỗng.**
## 🔴 2 MAJOR reviewer bắt — cả hai của LEAD
- **F1** `session-end.md` ×2 vẫn dạy **`hook-3-path`** (GẠCH NỐI). Worker CE **đã chỉ tận nơi** trong sub-file của mình, worker D không vá ⇒ **residual có người chỉ mà vẫn rơi**.
- **F2** phép quét cardinality của lead **siết LỆCH TRỤC** (lọc co-occurrence cùng dòng + tập-file hẹp) ⇒ bắt 7/11, **lọt 4 ca thật — gồm chính F1**.
- **F3 HELD** — reviewer tự `git show da7ee8a` xác minh live-verify, không tin lead.
- **F4** probe residue ô-nhiễm ID-space + làm ⑤ kêu tới khi push ⇒ lead `git rm`, bằng-chứng còn trong history.
## Bài học đắt nhất (giữ nguyên, đừng nén)
Phép quét ấy lead sửa **4 LẦN trong 1 phiên**: **quá rộng** (nuốt câu đúng) → **quá hẹp** (lọt lỗi thật) → **rộng lại** (kéo về 3 miền khác) → chốt.
🔴 Cả 4 đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Ý-định ở đây là **NGỮ-NGHĨA** ("đang nói về path-list của hook") — thứ khớp-mẫu **không biểu-diễn được**. Nấc đúng = **lưới soát cho người + allowlist CÓ TÊN + `use ⟂ mention` (🧊)**, cùng khuôn `/tiep §0` đã dùng cho **dạng-4**.
🪤 Lần 4 đặc-biệt: **bộ dò bắt chính nốt-vá của mình**, vì nốt vá trích-dẫn giá-trị cũ (citation-trap). Và giới-hạn kèm theo: 🧊 lọc theo **DÒNG** ⇒ với **mega-line** (`STATUS.md`) thì cấm dùng 🧊, phải diễn-đạt lineage không lặp cụm.
## Residual thật (KHÔNG đóng)
- **Meld-forward** (`.claude/sessions/` qua squash) — floor hub, **CHƯA ĐO**.
- Hub-floor còn thiếu: `_snapshot-k` + lệnh chụp-nhanh · `_context` tầng **stock**+nén · `/pause` tự-chụp · `/tiep` đọc snapshot + phòng cửa-sổ-sập. **Chưa chốt** (đã carry).
- V2 mới "auto-khi-tới-nhịp", **chưa** bookend-hub. Trong 5 vòng: **V1+V3 = 2 đầu thật** · V2 cadence · V4 on-signal · V5 liên-tục.

View File

@ -0,0 +1,56 @@
# run: 2026-07-22-S145-apply-hub-answers
- **Phiên:** S145 (/tiep resume S144) · **Lead:** Opus 4.8 · **HMW-mode ON**
- **Lệnh owner:** *"áp ngay bây giờ và /fable-clone review lại cụ thể — chú ý đi thật kỹ theo spec list của Hub => Sau đó hmw 4.8 MAX xử lý"* + *"kiểm tra kỹ nghi-thức session-start/end đóng đủ 5 vòng"* + *"kiểm tra kỹ lại command tiep/pause/snapshot"*.
- **Engine:** LỆNH-B ensemble (/fable-clone reviewer) review spec → em-main synthesize → hmw 4.8 MAX implement.
- **Governance/config-only** — 0 prod-code (src/·fe-*·tests/), 0 mig; test count giữ, bundle FROZEN.
## Tiền-đề đã verify (investigator-codebase ground, đo tươi)
- C7: script `nhip-no-probe.ps1` ĐÃ thỏa predicate 4-vế (catch :203-206 → `probe-loi (khong chan)` → exit 0); CHƯA có luật thành-văn. 🧊 **ĐÍNH-CHÍNH @S146 (câu gốc SAI, spec-v2:13 đã bác):** ~~header "4 surface" SAI (chỉ 2: pause:44 + tiep:112)~~**header "4 surface" ĐÚNG** — đo lại `grep -rn nhip-no-probe.ps1 .claude/commands/` = **4 file caller THẬT** (pause · tiep · session-start · session-end). Spec-author v1 nhầm vì session-start/end gọi CẢ `nhip-no-probe` LẪN `distill-shard-probe`. 🔴 **CẤM "sửa" header 4→2.**
- bulk: `memory-budget.json:11` = null; BÃO-TO logic :63 OK; single-source clean (0 derived copy).
- session-model: draft VC-3 STALE → owner S144 override hub-form `sessions/session-<N>/`; `session_ctx_kb` thiếu (default 64KB); `wal-flush.ps1:13` = 3-path.
## 5 vòng canonical (spawn-label:32 + checklist f71c5b65)
V1 tooling/harvest → `tooling-harvest-audit` · V2 soi-lead → `h24-audit` · V3 trio → `harness-audit`(built-in) · V4 nén-ngủ → `sleep-audit` · V5 truth-floor → measured-label-gate (floor). Completeness-gate = 5-vòng chức-năng + 4 phép sàn.
## Stages
- [x] S0 — investigator-codebase ground 3 area + em-main ground 5-vòng
- [x] S1 — em-main draft spec-v1 (5 axes: C7 · bulk · session-model · 5-vòng closure · tiep/pause/snapshot) — file này + spec-apply-hub-s145.md
- [x] S2 — /fable-clone reviewer ENSEMBLE review spec vs hub-spec-list + 5-vòng + tiep/pause/snapshot (5 lane → FAIL 2C + MAJOR; `sub-reviewer-*.md`)
- [x] S3 — em-main refute + synthesize → `spec-apply-hub-s145-v2.md`
- [!] S4 — hmw 4.8 MAX implement theo spec-v2 — **CHẾT GIỮA CHỪNG @/pause S145**; done = **B only**. RELAUNCH-CẮT-GỌT @S146 (dưới).
- [ ] S5 — reviewer pre-commit + fault-inject 2-chiều + cicd (nếu push)
## taskList snapshot (S4-relaunch — /tiep §4 cắt-gọt @S146, run cũ `wf_f9f24694-12b` done≈1/4)
🔴 **Vì sao relaunch chứ không resume:** resume-theo-run-id = **SAME-SESSION-ONLY**; S145 đã chết ⇒ cross-session resume KHÔNG hợp-lệ (`tiep.md §4.5`). Memory-pack **DẪN-XUẤT-LẠI TƯƠI** từ đĩa @S146, CẤM dùng snapshot cũ.
**Harvest-hồi-tố (partial-honest) — đo tươi trên đĩa @S146, KHÔNG tin return đã mất:**
| axis | trạng-thái đĩa | bằng-chứng |
|---|---|---|
| **B** bulk=30 | ✅ **LANDED** | `memory-budget.json``"bulk_note_shards": 30` (>15 ✓, đúng target owner) |
| **C1** session_ctx_kb | ✅ **thoả bằng KHÔNG-ĐỘNG** | `grep session_ctx_kb memory-budget.json` = **0** ⇒ để-trống đúng K6.2 |
| **A** C7 §N | ❌ chưa | `grep predicate-4-vế harness-11-engine.md` = 0 |
| **C2/C2b** hook+Sàn-3 | ❌ chưa | `wal-flush.ps1:13` = 3 path · `tiep.md` "3 path/3 điểm mù" ×4 (:21 :23 :75 :78) |
| **C3C7** session-model | ❌ chưa | `.claude/sessions/` KHÔNG tồn-tại · draft:54 còn VC-3 conflict |
| **D** 5-vòng | ❌ chưa | `session-end.md:123` còn "land dần sau" (3 vai THỰC-TẾ đã BUILT, roster 20) |
| **E2** line-ref | ❌ chưa | `tiep.md:23` còn `wal-flush.ps1:7` (đúng phải `:13`) |
**3 worker DISJOINT-FILE (B đã xong ⇒ gỡ khỏi fan-out):**
| # | worker | file sở-hữu (KHÔNG chồng lấn) | axis |
|---|---|---|---|
| 1 | `impl-A-c7` | `docs/governance/harness-11-engine.md` + trỏ-§N ở `pause.md`/`tiep.md` (chỉ 2 dòng TRỎ) | A1 A2 A3 A5 |
| 2 | `impl-CE-sessionmodel` | `.claude/hooks/wal-flush.ps1` · `.claude/commands/tiep.md` · `pause.md` · `session-start.md` · `docs/governance/session-model-se-draft.md` | C2 C2b C3C7 E1 E2 |
| 3 | `impl-D-5vong` | `.claude/commands/session-end.md` + 3 contract `.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md` | D1 D2 D3 D4 |
⚠️ **Seam A↔CE:** worker-1 viết §N; worker-2 sở-hữu `tiep.md`/`pause.md`. Để tránh 2 tay cùng file → **worker-2 chèn dòng TRỎ §N** (worker-1 CHỈ viết luật trong `harness-11-engine.md` + trả về số §N thật).
## taskList snapshot (S2 — /fable-clone reviewer ensemble, cùng vai `reviewer`)
5 lane đa-lăng-kính review `spec-apply-hub-s145.md`:
| lane | lăng-kính |
|---|---|
| 1 | C7 predicate 4-vế — khớp hub spec-list? luật-home đúng? fault-inject đủ răng? stale-fix đúng? |
| 2 | bulk_note_shards=30 — reference-not-copy? >tầng-1? fault-inject im/bão? |
| 3 | session-model — bám WAL S144 (KHÔNG draft VC-3 stale)? VC-1 2-tầng (né OR-guard)? hook-4-path an-toàn? Q4-defer đúng? |
| 4 | 5-vòng closure — completeness-gate (5 vòng + 4 phép sàn)? session-start KIỂM gap đóng/defer đúng? |
| 5 | tiep/pause/snapshot — C7-compliant? recovery-integrity (Sàn-3 · wf-relaunch · snapshot)? cross-cut CHỐNG SÓT cả 5 axis |

View File

@ -0,0 +1,174 @@
# SPEC v2 — Áp hub-answer + 5-vòng closure + tiep/pause/snapshot (synthesize từ /fable-clone ensemble)
> S145 · governance/config-only. v1 verdict ensemble = **FAIL 2C + nhiều MAJOR** (đã verify TỪNG cái trên đĩa). v2 vá hết. Đây là bản **hmw 4.8 MAX** implement. 🔴 3 thay-đổi lớn nhất so v1: **(A) GỠ "4 surface→2" — nó SAI · (C) session_ctx_kb ĐỂ TRỐNG — KHÔNG hardcode 64 · (C↔E) hook 4-path PHẢI cập-nhật Sàn-3 tiep §0 atomic.**
## [1] ĐỀ-BÀI
Áp 3 câu hub (C7 predicate 4-vế · bulk=30 · session-model 101e69d6) + đóng đủ 5 vòng + re-check tiep/pause/snapshot. Governance-only (0 src/·fe-*·tests/, 0 mig).
## [2] CÁCH IMPLEMENT (v2 — per axis)
### Axis A — C7 predicate 4-vế
1. **Viết luật §N** `harness-11-engine.md` (mục mới cạnh WAL H22, implementer chốt số N.x): predicate (i) read-only · (ii) KHÔNG spawn con · (iii) KHÔNG write · (iv) lỗi→`probe-lỗi (không chặn)`→đi-tiếp **[LOAD-BEARING]**. FLOOR = read-only + non-blocking + **gỡ-được-không-hậu-quả**. FORM = wording + interpreter.
2. Reword tập-cấm (KHÔNG cấm-tất): "cấm ĐẮT/side-effect; CHO PHÉP probe read-only non-blocking theo §N". pause.md:44 + tiep.md:112 **TRỎ** §N (B1, không chép predicate).
3. 🔴🔴 **GỠ HẲN v1-A.4 + v1-A2 "4 surface→2" — LÀ TIỀN-ĐỀ SAI.** Verify đĩa: `nhip-no-probe.ps1`**4 caller THẬT** (pause:44 · tiep:112 · session-start:216 · session-end:104). Header "4 surface" + `session-model-se-draft.md:34` "4 điểm lệnh" = **ĐÚNG**. Spec-author v1 nhầm (session-start/end gọi CẢ nhip-no-probe @216/104 LẪN distill-shard-probe @135). **KHÔNG đụng header/draft.** (run.md:9 mang cùng lỗi → bỏ.)
4. **Fault-inject 2-chiều** (chứng vế-iv, script KHÔNG đổi code — `nhip-no-probe.ps1:203-208` catch→exit 0 đã thỏa): inject-vector = ép `-RepoRoot` bậy HOẶC kill mid-run (S135 precedent `-RepoRoot`); observe **no-hang** (timeout wrapper). (lành) probe OK → dòng-nợ in xong · (lỗi) → `probe-lỗi (không chặn)` + hoàn-tất KHÔNG hang.
5. 🔸 verify `distill-shard-probe.ps1` (probe THỨ-2 @session-start:135) cũng read-only/non-blocking (thỏa §N general) — nếu chưa, thêm.
- **Đường-chết:** đừng đổi python; đừng cấm-tất; đừng chép predicate 2 nơi; **đừng "sửa" header 4→2 (nó ĐÚNG — nhầm distill-shard-probe).**
### Axis B — bulk_note_shards = 30
1. `memory-budget.json:11` null→**30** + `_bulk_note` note (owner-set initial-anchor 2×min-SE, reference-not-copy, cờ LOUD không-đổi-hành-vi). 🔴 BÃO-TO target = **`distill-shard-probe.ps1:63`** (KHÔNG phải memory-budget.json:63 — v1 line-ref mờ).
2. **B-fault-inject boundary CÓ RĂNG** (cây-tạm `-RepoRoot`, bulk=30): **n=30 → tầng-2 IM** (tầng-1 KÊU, chứng "chỉ tầng-1 xử") · **n=31 → `BÃO-TO: backlog 31 > 30`**. Cặp 30/31 chứng ĐỒNG-THỜI `-gt` không off-by-one + tầng-2 độc-lập TRÊN tầng-1. (n≤15 = vô-giá-trị.)
- **Đường-chết:** số ≤15 vô-nghĩa; đừng copy 10 hub.
### Axis C — session-model (BÁM WAL S144)
1. 🔴🔴 **session_ctx_kb = ĐỂ TRỐNG (KHÔNG hardcode 64).** Verify đĩa: **0 script đọc `session_ctx_kb`** (ghost-wire, khác `pull_warn_days` có reader `nhip-no-probe.ps1:190`); K6.2 cấm mượn số chưa-đo; SE artifact (`draft:55`·`spec-adap-dot-11:31`) khai để-trống = TUÂN-THỦ. "vắng→64KB" = default-AT-READ ⇒ để-trống ĐÚNG biểu-diễn "owner chưa chọn". **Chỉ set khi owner directive tường-minh** (kèm `_owner_set`); mặc-định = **KHÔNG đụng key** (hoặc mark `owner-gated-inert-pending-wire`).
2. **hook 4-path** `wal-flush.ps1:13`: 3-path → +**`.claude/sessions/`** (full path). 🔴 KHÔNG "pending-restart" — `settings.json:9` `-File` re-đọc body MỖI Stop ⇒ ăn NGAY. **Live-verify**: stage 1 file `sessions/session-<N>/x` → trigger hook → confirm commit `wal: flush` nuốt nó. + fault-inject.
3. 🔴🔴 **CRITICAL-2 ATOMIC (seam C↔E) — hook 4-path BẮT BUỘC đi kèm cập-nhật Sàn-3 tiep.md §0:**
- (a) 4 site "3 path"/"3 điểm mù" → **"4 path"/"4 điểm mù"**: `tiep.md:21` · `:23` · `:75` · `:78`.
- (b) **THÊM strong-signal ⑤** cho `sessions/`: `wal:`-commit chưa-đẩy đụng `.claude/sessions/` (mirror signal ④ cho runs/) — vì per-pause context-map (C.5) hook auto-commit thành `wal:`, phiên chết còn context-map mà signal cũ MÙ = tái mở đúng bug "sổ trống≠sạch".
- (c) BẬC-TRUNG (:75/:78) "ngoài 3 path"→"ngoài 4 path".
- Acceptance: `grep "3 path\|3 điểm mù" tiep.md = 0` sau vá.
4. **VC-1 nhãn 2-tầng** `S<nn>` + `logic:L<mm>`. Align `session-model-se-draft.md` (gỡ VC-3 stale `logic-sessions/L<mm>` → hub-form `sessions/session-<N>/`).
5. **Folder scaffold** `session-start.md`: `.claude/sessions/session-<N>/` (N=phiên-LOGIC ID nguyên tăng, regex `^session-\d+$`); .gitignore verify `check-ignore -q` exit=1.
6. **per-pause context-map** `pause.md` append context-block vào `sessions/session-<N>/` (accumulate); `tiep.md` đọc.
7. **orphan-L rule**: phiên chết giữa phiên-logic → `L<mm>`/`session-<N>/` mồ-côi. Thêm rule `tiep` phát-hiện (gộp signal ⑤). KHÔNG để drift-vector hở.
8. **Q4-audit = DEFER** (chỉ display dòng-nợ; KHÔNG audit-rerun giữa phiên = phá C7). Optional: đo khoảng-giãn gửi hub.
- **Đường-chết:** VC-1 1-tầng giết tick; đừng bám VC-3 stale; đừng hardcode session_ctx_kb; hook-4-path mà quên Sàn-3 §0 = vỡ recovery-floor.
### Axis D — 5-vòng closure
1. **Map verified** (lane-4 đĩa): V1→tooling-harvest-audit · V2→h24-audit · V3→harness-audit(built-in, wired 2-đầu) · V4→sleep-audit · V5→measured-label-gate(floor). ✓ REAL.
2. 🔴 **D2 = COMMIT DEFER (option b)** — lane-4 phán DEFER là đọc canonical ĐÚNG: "hai đầu" nhịp buộc tầng **ĐO** (H1/H2 báo-diff @open, wired 2-đầu); cột self-verify V1/V2/V4 canonical = **CLOSE-time**; @open output là diff-report nhẹ (đã em-main-verify), artifact authoritative (chốt/harvest/distill) ở close ⇒ KHÔNG có gì authoritative để audit @open. **Landing site defer-rationale** = ghi vào `session-end.md` cạnh (g-bis) + contract 3 vai (1 dòng "KIỂM end-only: @open chỉ diff-report, authoritative-artifact ở close"). **+ H24-coupling**: khai rõ h24-audit theo cặp H24 **wherever it fires** (nếu H24 OVERDUE chạy @session-start §2.1.8 thì h24-audit theo — HOẶC khai end-only intentional + lý-do).
3. **D1 completeness-gate CÓ RĂNG**: mỗi phép sàn SHOW disk-evidence (KHÔNG bare-PASS): phép-1 cửa-count vs counter-delta (số) · phép-2 literal dòng-nợ 3-vế · phép-3 3 closeout ritual-sổ trace · phép-4 roles-ran list + sổ paths.
4. 🔴 **phép-4 landmine + incremental resolve**: đĩa NOW = `tooling-harvest-audit/` RỖNG (no MEMORY.md), `h24-audit/`+`sleep-audit/` MISSING. 3 KIỂM **WIRED AUTO** nhưng **CHƯA chạy audit THẬT** phiên này (không có measure H1/H2/H24/sleep để chấm; tooling-harvest-audit chỉ spawn-PROBE cố-ý-0-ghi). ⇒ completeness-gate ghi 3 vai = **"not-yet-run (vacuous)" + folder-state evidence**, KHÔNG phép-4 FAIL. Sửa session-end.md:123 "land dần sau" → "cả 3 BUILT+WIRED S145; chạy audit-round khi measure vòng tương-ứng chạy" (gỡ ambiguity với :40-42 AUTO).
### Axis E — tiep/pause/snapshot
1. **E1 concrete teeth** (thay "review PASS" vòng-tròn): `pause.md:17` wf: đủ 5-trường (grep run=/runId=/args=/done=/harvested=) · `tiep.md §0` đủ 4 (→ post-C.2 là 5) signal MẠNH · `tiep.md:127` rule "memory-pack DẪN-XUẤT-LẠI TƯƠI (CẤM reuse cũ)" present · run.md có `## taskList snapshot`.
2. **Fix line-ref** `tiep.md:23` `wal-flush.ps1:7``:13` (paths thật ở :13; :7=comment). Gộp khi vá §0 (C.3).
3. Seam C↔E = đã xử ở Axis C.3 (atomic).
## [3] CHECKLIST ACCEPTANCE v2 (đo được, siết teeth)
| # | Axis | Acceptance có-răng |
|---|---|---|
| A1 | C7 luật | §N có predicate 4-vế; **wording khớp FLOOR 3 tính-chất** (read-only·non-blocking·gỡ-được-không-hậu-quả) + tách FLOOR/FORM; pause/tiep TRỎ §N (grep chép-predicate-2-nơi=0) |
| A2 | C7 no-op | 🔴 **KHÔNG đụng "4 surface"/"4 điểm lệnh"** (chúng ĐÚNG); grep header vẫn "4 surface" = pass |
| A3 | C7 fault-inject | inject-vector (`-RepoRoot` bậy/kill) → `probe-lỗi (không chặn)` + no-hang (timeout-observed) |
| B1 | bulk số | `memory-budget.json:11`=30 (>15); grep `bulk_note_shards\|30` trong {commands·agents·engine}=0 (value duy-nhất memory-budget.json) |
| B2 | bulk boundary | n=30→IM · n=31→`BÃO-TO 31>30` trên cây-tạm (chứng -gt + tầng-2>tầng-1); target=`distill-shard-probe.ps1:63` |
| C1 | session_ctx_kb | 🔴 **key ĐỂ TRỐNG** (hoặc `owner-gated-inert-pending-wire`); grep consumer-script (nếu 0 → khai ghost-wire, KHÔNG set số) |
| C2 | hook 4-path | `wal-flush.ps1` = 4 path (+`.claude/sessions/`); **live-verify** (stage→hook→commit nuốt), KHÔNG "restart" |
| C2b | 🔴 Sàn-3 sync | `grep "3 path\|3 điểm mù" tiep.md = 0`; signal ⑤ cho sessions/ tồn-tại; BẬC-TRUNG "4 path" |
| C3 | VC-1 tick-behavior | grep counter/OR-guard/H24 đọc `S<nn>` KHÔNG `L<mm>`; fault-inject ép L<mm> → tick +0 (chứng guard, KHÔNG chỉ label-shape) |
| C4 | scaffold + orphan-L | sessions/session-`<N>` regex + gitignore-verify + per-pause context-map + orphan-L rule + Q4-defer documented |
| D1 | completeness-gate | 5 vòng chức-năng + 4 phép sàn, MỖI phép SHOW disk-evidence (không bare-PASS) |
| D2 | defer-landing | DEFER (b) ghi vào session-end.md/contract 3 vai + H24-coupling khai; phép-4 = 3 KIỂM "not-yet-run vacuous" + folder-state |
| E1 | tiep/pause/snapshot | 4 check cụ-thể (wf:5-trường · Sàn-3 5-signal · memory-pack-rule · taskList-snapshot); line-ref :23→:13 fixed |
| Z | governance-only | 0 file src/·fe-*·tests/ (git-diff); test count giữ; bundle FROZEN |
---
## [4] 🔴 ADDENDUM @S146 (em-main, lúc /tiep relaunch) — C2b THIẾU CONSUMER
> **Bối-cảnh:** v2 mục C.3 chỉ liệt `tiep.md` 4 site. Grep lại toàn-repo lúc relaunch ⇒ **claim "3 path" còn sống ở 3 nơi NỮA mà v2 KHÔNG nhắc**. Đây đúng class `cardinality-change → grep MỌI consumer` (S87/S88: *sửa write-site sót read-site → vỡ feature*). Nếu chỉ theo v2 thì hook thành 4-path còn 3 surface vẫn dạy "3" ⇒ tái-tạo đúng cái drift mà Sàn-3 sinh ra để chặn.
### C2b-EXT — bảng consumer ĐẦY-ĐỦ (phân LIVE ⟂ LỊCH-SỬ)
**🔴 LIVE PRESCRIPTIVE — BẮT BUỘC flip cùng commit với hook:**
| # | file | site | nội-dung phải đổi |
|---|---|---|---|
| 1 | `.claude/hooks/wal-flush.ps1` | `:13` | **SOURCE**`$paths = @(…)` 3→4 (+`.claude/sessions/`) |
| 2 | `.claude/commands/tiep.md` | `:21` `:23` `:75` `:78` | "3 điểm mù"→4 · "3 path"→4 (v2 §C.3 đã liệt) |
| 3 | 🔴 `docs/governance/harness-11-engine.md` | **N.2** | **CANONICAL FLOOR***"`git add` per-path **3 path cố định** {WAL · agent-memory · workflows/runs}"*. **v2 SÓT.** Đây là **luật gốc** mà hook thi-hành ⇒ sót = hook vi-phạm chính floor của nó |
| 4 | 🔴 `.claude/governance/.session-counter.json` | `_why_this_path` | *"The hook covers **exactly 3 paths** … `.claude/governance/` is **OUTSIDE all three**"*. **v2 SÓT.** Ngoài đổi số, PHẢI **tái-verify** mệnh-đề: `.claude/governance/` có còn ngoài **cả 4**? (còn — `sessions/``governance/`) ⇒ sửa thành "outside all four" + giữ nguyên lý-do |
| 5 | 🔴 `.claude/auto-memory/project_h22_wal_session_continuity.md` | `:10` | *"persist-only (per-path+CAND+exit-0; **3 path**: WAL/agent-memory/runs)"*. **v2 SÓT — NGUY NHẤT:** file này **auto-inject MỖI PHIÊN** ⇒ để stale = mọi phiên sau bị dạy sai ngay từ context đầu-vào |
**🧊 LỊCH-SỬ — KHÔNG rewrite (nguyên-tắc C8 "đừng rewrite history"):**
`docs/governance/adap-reports/2026-07-14-…:56` (báo-cáo có ngày) · `.claude/agent-memory/reviewer/{MEMORY.md,archive/2026-07.md}` (nhật-ký vai) · `.claude/WAL.md` (bị ghi-đè theo nhịp).
⇒ Chúng mô-tả *trạng-thái LÚC ĐÓ*, đúng tại thời-điểm viết. Đụng vào = phá vết.
### Acceptance C2b-EXT (thay acceptance C2b cũ — siết hơn)
> 🔴 **HIỆU-CHỈNH @S146 sau khi CHẠY THẬT — bản đầu của chính mục này SAI (quá rộng).** Mẫu trần `'3 path'` **khớp nhầm** `session-end.md:162` → *"3 path `runs/<id>/harness-*-return.md`"*, tức **3 đường-dẫn file return của bộ-ba memory** — KHÔNG dính gì tới danh-sách path của hook. Câu đó **ĐÚNG**, phải để yên.
> ⇒ Nếu giữ mẫu trần: acceptance **KÊU vĩnh-viễn** (nợ ảo), hoặc tệ hơn — ai đó "vá" cho hết kêu bằng cách **sửa một câu đang đúng**. Đây đúng class `matcher quá rộng` (họ hàng citation-trap): **discriminator phải là NGỮ-NGHĨA** (*"3 path" nói về HOOK*) chứ không phải literal.
> 🔸 Neo vào **TÍNH-CHẤT**, đừng neo vào literal: cụm chỉ sai khi nó **liệt-kê danh-sách path của `wal-flush.ps1`**.
> 🔴🔴 **HIỆU-CHỈNH LẦN 2 @S146 — reviewer bác bản siết ở trên (F2). Bản siết SAI TRỤC, và nó đã để lọt lỗi thật.**
> Bản siết lọc bằng **co-occurrence CÙNG DÒNG** (`3 path` phải đứng cạnh chữ `hook`/`WAL.md`/…) + **tập-file hẹp**. Đo lại trên `HEAD` tiền-vá: bắt **7/11** site — **trượt 4 ca THẬT**:
> | ca trượt | vì sao |
> |---|---|
> | `session-end.md` ×2 `hook-3-path` | regex chỉ có `3 path` **dấu cách**; đây là **gạch nối** ⇒ 0 match. **Chính ca này sống sót tới lúc reviewer bắt.** |
> | `tiep.md:78` *"Bẩn ngoài 3 path…"* | dòng không chứa từ-khoá hook ⇒ bị vế-2 vứt |
> | `session-model-se-draft.md` ×2 | file **ngoài tập quét** |
> 🔴 **Bài học (lần 2 trong CÙNG một phiên, ngược chiều nhau):** lần 1 bộ lọc **quá rộng** (nuốt câu đúng), lần 2 **quá hẹp** (lọt lỗi thật). Cả hai đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Cách đúng: **loại theo ĐƯỜNG-DẪN** (lịch-sử ⟂ live — thuộc-tính có thật của file), **khớp RỘNG** (mọi biến thể chữ), và miễn-trừ dương-giả bằng **allowlist CÓ TÊN + lý-do**, không bằng mẹo regex.
```bash
# 1) 0 surface LIVE nào còn dạy cardinality CŨ của hook
# Trục lọc = ĐƯỜNG-DẪN (không phải từ-khoá cùng dòng). Khớp RỘNG mọi biến thể chữ.
grep -rnE '3[ -]path|3 điểm mù|exactly 3 paths|three paths|ba path' \
--include='*.md' --include='*.json' --include='*.ps1' . 2>/dev/null \
| grep -v '/node_modules/' \
| grep -vE '^\./(broadcasts|docs/governance/adap-reports|docs/changelog|docs/_archive)/' \
| grep -vE '^\./\.claude/(agent-memory|workflows/runs)/' \
| grep -vE '^\./\.claude/WAL\.md:' \
| grep -vE 'harness-\*-return\.md' # ← ALLOWLIST CÓ TÊN (xem dưới)
| grep -v '🧊' # ← USE ⟂ MENTION (xem "citation-trap" dưới)
# 🔴 KỲ-VỌNG **KHÔNG PHẢI 0** — xem ALLOWLIST dưới. Đây là **LƯỚI SOÁT cho người**, KHÔNG phải cổng-chặn.
#
# 🔸 ALLOWLIST — 4 mục, mỗi mục khai lý-do (KHÔNG dùng mẹo regex để giấu chúng):
# (1) session-end.md ô V3 bảng 5-vòng: "3 path `runs/<id>/harness-*-return.md`"
# = 3 ĐƯỜNG-DẪN FILE return của bộ-ba memory. Không dính hook. CÂU ĐÚNG.
# (2) docs/guides/deployment-iis.md:45 "3 site hoặc 1 site với 3 path" = path của IIS. Khác miền.
# (3) docs/guides/rag-onboarding-guide.md:128 "Default 3 path cover docs…" = corpus_paths của RAG. Khác miền.
# (4) docs/governance/README.md:93 "rag-v1.3 path-b" = trúng vì SỐ PHIÊN-BẢN `v1.3` + chữ `path`. Rác thuần.
# + session-model-se-draft.md: "hook 3→4 path" / "body-3-path (control)" = đang KỂ chuyện nới path. ĐÚNG.
#
# 🔸 Vì sao loại 4 nhóm đường-dẫn trên: chúng là LỊCH-SỬ (broadcast hub · adap-report có ngày ·
# session-log · archive · nhật-ký vai · run-folder · WAL ghi-đè) — đúng tại thời-điểm viết.
# Sửa = rewrite history, đúng cái C8 cấm. Đây là thuộc-tính CỦA ĐƯỜNG-DẪN, ổn-định hơn từ-khoá.
#
# 🔸 Đối-chứng ANTI-GOODHART (chạy kèm, BẮT BUỘC): bỏ 4 vế `grep -v` đường-dẫn phải ra >0 dòng
# (đo @S146: **119**). Ra 0 => phép quét đã chết (vacuous), KHÔNG phải repo sạch.
```
### 🔴 KẾT-LUẬN THẲNG về phép này (đừng nâng cấp nó thành cổng)
**Không cơ-khí-hoá được thành zero-gate.** Cụm "3 path" sống hợp-lệ ở **≥3 miền khác** trong repo (IIS site-path · RAG `corpus_paths` · chuỗi phiên-bản `v1.3 path-b`). Mọi regex đủ hẹp để loại chúng đều đủ hẹp để **lọt biến-thể chữ của ca thật** — đã chứng: `hook-3-path` (gạch nối) sống sót qua bản siết và **chỉ reviewer bắt được**.
⇒ Nấc đúng = **lưới soát cho người** + **allowlist có tên**. Cùng khuôn `/tiep §0` đã dùng cho **dạng-4** (*"để nguyên cho người phán, KHÔNG cơ-khí-hoá"*). Ai thêm hit mới thì **phân-loại tay** rồi hoặc vá, hoặc thêm vào allowlist **kèm lý-do**.
### 🪤 CITATION-TRAP — bộ dò bắt chính nốt-vá của mình (xảy ra THẬT @S146, lần thứ 4)
Vá xong `ACTIVE-MARKS.md:20` + `STATUS.md:450`, chạy lại ⇒ **cả hai VẪN kêu**. Lý do: ghi-chú lineage em viết để **giữ vết** có dạng *"🧊 stamp S111 ghi **3-path**; nới +`.claude/sessions/` @S146"* — tức **nốt vá trích-dẫn đúng giá-trị cũ**, và bộ dò khớp-mẫu **không phân-biệt được**:
| | dạng | ví-dụ |
|---|---|---|
| **USE** — phải vá | doc đang **KHẲNG-ĐỊNH** hook có 3 path | *"file ngoài `hook-3-path`"* |
| **MENTION** — phải tha | doc đang **KỂ LẠI** rằng xưa là 3, nay là 4 | *"🧊 stamp S111 ghi 3-path; nới @S146"* |
**Discriminator = `🧊`** — quy-ước SẴN CÓ của repo cho *"phát-biểu đã nghỉ hưu, giữ làm vết"*. Không đẻ ký-hiệu mới; chỉ **dùng đúng cái đã có**.
⚠️ **Giới-hạn thứ-2 (đo được, đừng quên):** `🧊` lọc theo **DÒNG**. `docs/STATUS.md`**mega-line** dài hàng nghìn ký-tự ⇒ đặt 1 chữ 🧊 ở đó là **miễn-trừ nguyên cả row** khỏi lưới. ⇒ Với mega-line, **đừng dùng 🧊** — hãy **diễn-đạt lineage KHÔNG lặp lại cụm bị dò** (vd *"hook nới từ 3 lên 4 @S146"* thay vì *"3-path tới S145"*). Ca thật @S146: STATUS.md:450 xử đúng theo cách này.
🔴 **Rủi-ro khai thẳng:** ai đó có thể **núp sau 🧊** để giữ một khẳng-định stale thật. Chấp-nhận, vì (a) 🧊 là dấu **người viết cố-ý đặt**, không tự mọc; (b) lưới này vốn **cho người soát**, không phải cổng — người đọc thấy 🧊 vẫn liếc được. Đổi lại: **không có 🧊 thì mọi nốt-vá-có-lineage đều thành dương-giả vĩnh-viễn**, và hậu-quả thực-tế là **người ta sẽ xoá lineage cho hết kêu** — mất đúng thứ quý nhất.
📌 **Lịch-sử 4 lần sửa phép này TRONG CÙNG MỘT PHIÊN — giữ làm vết, đừng xoá:**
| lần | lỗi | ai bắt |
|---|---|---|
| v1 | **quá rộng** — nuốt `session-end.md:162` (câu ĐÚNG về 3 file return) | lead tự bắt lúc chạy |
| v2 | **quá hẹp** — lọc co-occurrence cùng dòng + tập-file hẹp ⇒ **lọt 4 ca thật**, gồm `hook-3-path` | **reviewer** (F2) |
| v3 | **rộng lại** — kéo về 3 miền không liên-quan | lead, khi chạy thật |
🔴 **Bài học nén 1 câu:** ba lần đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Ý-định ở đây là **ngữ-nghĩa** (*"đang nói về danh-sách path của hook"*) — thứ mà **khớp-mẫu không biểu-diễn được**. Chỗ nào ngữ-nghĩa là tiêu-chí thì **để người phán + allowlist có tên**, đừng đẻ thêm regex.
# 2) hook thật = 4 path
grep -n '$paths = @' .claude/hooks/wal-flush.ps1 # phải thấy .claude/sessions/
# 3) mệnh-đề counter còn ĐÚNG sau khi +1 path
grep -o 'OUTSIDE all four' .claude/governance/.session-counter.json # phải có
```
🔴 **Ranh:** phép (1) **CỐ Ý** loại `adap-reports/` + `agent-memory/` + `WAL.md` khỏi tập quét — chúng là lịch-sử. Quét cả vào sẽ ép rewrite-history, đúng cái sai mà `/tiep §0` dạng-2 C8 đã cảnh-báo.
### §N pin số (seam A↔CE — em-main chốt, KHÔNG để worker tự chọn)
`harness-11-engine.md` PHẦN N hiện có **N.1…N.7** ⇒ luật C7 predicate = **§N.8**. Worker-1 viết §N.8; worker-2 chèn dòng TRỎ `§N.8` ở `pause.md`/`tiep.md`. **Cả hai dùng đúng số này** (chạy song song, không hỏi nhau được).
🔸 Worker-1 **kiêm luôn N.2** (cùng file `harness-11-engine.md` — tránh 2 tay 1 file): sửa "3 path cố định"→"4 path cố định" +`.claude/sessions/`.
## Ghi-chú synthesis (em-main, cho hmw)
- **v1→v2 GỠ:** "4 surface→2" (SAI) · session_ctx_kb=64 (K6.2 vi-phạm + ghost-wire).
- **v1→v2 THÊM:** Sàn-3 §0 atomic (C2b) · phép-4 vacuous-resolve (D2) · B2 boundary 30/31 · C3 tick-behavior · orphan-L rule · fault-inject vectors.
- **Owner-question NỔI:** session_ctx_kb — SE giữ kỷ-luật ĐỂ-TRỐNG (K6.2); owner muốn set 64 tường-minh thì báo, em thêm `_owner_set`.

View File

@ -0,0 +1,64 @@
# SPEC v1 — Áp hub-answer (C7 + bulk + session-model) + 5-vòng closure + tiep/pause/snapshot re-check
> S145 · governance/config-only (0 prod-code · 0 mig · test giữ · bundle FROZEN). Pipeline: spec → `/fable-clone reviewer` ensemble → em-main synthesize → `hmw` 4.8 MAX. **Số/luật cuối = SE tự đặt SAU verify 2-tuyến (đã) + fault-inject 2-chiều (G-015, hub dặn).**
## [1] ĐỀ-BÀI (3 câu)
Áp 3 câu trả lời canonical của hub (đã verify 2-tuyến `01f567`/`8378a6`): **C7** predicate 4-vế · **bulk_note_shards=30** · **session-model** trên manifest 101e69d6. ĐỒNG THỜI (owner S145): (D) verify + đóng đủ **5 vòng** tự-bảo-trì trong session-start/end · (E) re-check kỹ **tiep/pause/snapshot**. Neo tất cả về canonical (B1 con-trỏ, KHÔNG chép số/luật rải rác).
## [2] CÁCH IMPLEMENT (per axis + đường-chết)
### Axis A — C7 "điểm-dừng-rẻ" (predicate 4-vế)
Hiện: `nhip-no-probe.ps1:65-206` try/catch → `:203-206` catch in `probe-loi (khong chan)``:208` `exit 0`; read-only. ✅ Script THỎA 4-vế rồi. CHƯA có luật thành-văn (engine §N = 0 hit).
1. **Viết luật C7 thành-văn** — NHÀ = `harness-11-engine.md §N` (thêm mục N.x "C7 điểm-dừng-rẻ", cạnh WAL H22). Predicate: (i) read-only · (ii) KHÔNG spawn process con · (iii) KHÔNG write file · (iv) lỗi → in `probe-lỗi (không chặn)` → đi tiếp **[LOAD-BEARING]**. FLOOR = read-only + non-blocking + **gỡ-được-không-hậu-quả**. FORM = wording + interpreter (powershell OK, KHÔNG đổi python).
2. **Reword tập-cấm** (KHÔNG "liệt-kê", KHÔNG "cấm-tất"): *"cấm tiến-trình ĐẮT/side-effect (write·network·spawn-con·blocking); CHO PHÉP probe read-only non-blocking theo predicate §N"*.
3. **pause.md:44 + tiep.md:112**: inline-guard TRỎ về §N C7 (B1 — KHÔNG chép predicate 2 nơi).
4. 🔴 **Đính-chính stale-claim:** `nhip-no-probe.ps1:6-7` header "gọi bởi 4 surface (/pause /tiep session-start session-end)" → **SAI**, thực chỉ **2** (pause:44 + tiep:112; session-start/end gọi `distill-shard-probe` script KHÁC). Sửa header → 2. + `session-model-se-draft.md:34` "4 điểm lệnh" → 2.
5. **Fault-inject 2-chiều** (chứng vế-iv, script KHÔNG đổi code): (lành) probe OK → pause in dòng-nợ xong · (lỗi) ép `nhip-no-probe.ps1` lỗi/kill giữa chừng → pause in `probe-lỗi (không chặn)` **VẪN xong, KHÔNG hang**.
- **Đường-chết:** đừng đổi interpreter sang python (FORM, hub KHÔNG đòi); đừng cấm-tất (cấm nhầm probe lành); đừng chép predicate vào pause/tiep (drift 2-nơi).
### Axis B — bulk_note_shards = 30
Hiện: `memory-budget.json:11` = null; BÃO-TO `:63` `if bulkShards!=null AND n -gt bulkShards`. Single-source clean.
1. Set `:11` `null → 30` (2×min-SE=15, **reference-not-copy** — KHÔNG copy 10 của hub; **>tầng-1 15** ✓). +`_bulk_note` semantics (owner-set, cờ LOUD observability, KHÔNG đổi hành-vi nén).
2. **Fault-inject 2-chiều:** (im) pending ≤30 → tầng-2 IM (chỉ tầng-1 xử) · (bão) pending >30 → `BÃO-TO: backlog N > 30`.
- **Đường-chết:** số ≤15 = tầng-2 dưới tầng-1 = vô-nghĩa; đừng copy 10 (min hub=1 khác scale).
### Axis C — session-model (build trên manifest 101e69d6 · BÁM WAL S144 KHÔNG draft VC-3)
Hiện: manifest 4 khoản (①.gitignore PASS ②pause/tiep+WAL CÓ ③session_ctx_kb THIẾU ④folder chưa tạo). 🔴 Draft VC-3 (`logic-sessions/L<mm>`) **STALE** — owner S144 override → hub-form `sessions/session-<N>/`.
1. **session_ctx_kb**: set `memory-budget.json` = **64** (canonical default "vắng→64KB"; owner override được — note owner-gated như `pull_warn_days`).
2. **hook 4-path**: `wal-flush.ps1:13` 3-path → **+`sessions/`** (path-4). 🔴 CHẠM CƠ-CHẾ (owner S144 chốt "hook nối 4-path") — ENV-dep, **restart để ăn**; verify hook fire sau.
3. **Folder scaffold**: `session-start.md` scaffold `.claude/sessions/session-<N>/` (N = phiên-LOGIC ID **nguyên tăng**, regex `^session-\d+$`); `.gitignore` verify không nuốt (`check-ignore -q` exit=1).
4. **VC-1 nhãn 2-tầng**: `S<nn>` (vật-lý) + `logic:L<mm>` (phiên-logic). 🔴 **BẮT BUỘC 2-tầng**`S<nn>`=phiên-logic thì OR-guard tick **chết** (phép-7 +0, bẫy label-convention S135). Align `session-model-se-draft.md` VC-3 → WAL-S144 hub-form + bump nấc.
5. **per-pause context-map**: `pause.md` append context-block vào `sessions/session-<N>/` (accumulate, KHÁC WAL overwrite ≤40); `tiep.md` đọc context.
6. **Q4 van-audit-giữa-phiên = DEFER** (hub chốt): chỉ build DISPLAY (dòng-nợ đã có); **KHÔNG build audit-rerun giữa phiên** (phá C7 non-blocking). Optional: đo khoảng-giãn 2-đầu gửi hub (§5 mời).
- **Đường-chết:** VC-1 1-tầng = giết tick; đừng theo draft VC-3 stale; hook-change chưa restart = chưa ăn (khai pending-restart); L mồ-côi khi phiên chết = drift-vector (cần rule).
### Axis D — 5-vòng closure (verify + đóng)
Canonical: V1 tooling/harvest→`tooling-harvest-audit` · V2 soi-lead→`h24-audit` · V3 trio→`harness-audit` · V4 nén-ngủ→`sleep-audit` · V5 truth-floor→measured-label-gate(floor). Checklist f71c5b65: completeness-gate = **5 vòng chức-năng + 4 phép sàn** (1 tick-vs-cửa · 2 dòng-nợ-3-vế · 3 closeout-đủ-nghi-thức · 4 vai-đã-chạy-có-sổ).
1. **Verify từng vòng** ĐO+KIỂM đúng nhịp trong session-start/end (bảng 5 hàng × {vòng·ĐO-ở-đâu·KIỂM-ở-đâu·đủ/thiếu}).
2. 🔴 **Đóng GAP session-START KIỂM**: checklist V1 nhịp="HAI ĐẦU". 3 KIỂM mới wire session-END only. Quyết: (a) mở-rộng KIỂM phủ session-start HOẶC (b) **defer có-lý-do** (session-start measure = "báo diff" nhẹ, KIỂM đợi session-end authoritative — document defer + acceptance). /fable-clone lane-4 phán.
3. **Chạy completeness-gate** → PASS (5 vòng + 4 phép sàn).
- **Đường-chết:** "5 vai = 5 vòng đóng" SAI — phải đúng nhịp + qua 4 phép sàn; đừng nhét audit nặng vào điểm-dừng (phá C7).
### Axis E — tiep/pause/snapshot re-check
1. **pause.md**: WAL-write ≤40 · `wf:` snapshot 5-trường · C7 stop-path (nhip-no-probe non-blocking) · commit đích-danh `wal: pause`. Verify đúng + C7-compliant.
2. **tiep.md**: Sàn-3 "sổ trống≠sạch" (4 tín-hiệu MẠNH + DUAL-ACCEPT orphan dạng-3-retired) · ground-truth-thắng-WAL · §4 wf-relaunch cắt-gọt (taskList snapshot + memory-pack DẪN-XUẤT-LẠI TƯƠI). Verify đúng.
3. **snapshot**: `## taskList snapshot` run.md đầy-đủ? `wf: args=<snapshot>`? memory-pack-tươi rule? Integrity.
4. Fix defect nếu tìm thấy.
- **Đường-chết:** đừng reuse memory-pack snapshot cũ (lỗi-thời sau harvest); Sàn-3 KHÔNG suy "chain rỗng ⇒ sạch".
## [3] CHECKLIST ACCEPTANCE (đo được — có răng)
| # | Axis | Acceptance |
|---|---|---|
| A1 | C7 luật | §N có mục C7 predicate 4-vế; pause/tiep TRỎ về §N (grep 0 chép-predicate-2-nơi) |
| A2 | C7 stale-fix | `nhip-no-probe.ps1:6-7` header = "2 surface"; `session-model-se-draft:34` = 2 (grep "4 surface\|4 điểm lệnh" = 0 hit stale) |
| A3 | C7 fault-inject | chiều-lỗi: ép probe lỗi → pause in `probe-lỗi (không chặn)` + hoàn-tất (KHÔNG hang) — chạy thật, KHÔNG happy-path |
| B1 | bulk số | `memory-budget.json:11` = 30 (số > 15); grep derived-copy = 0 |
| B2 | bulk fault-inject | im (≤30) / bão (>30 → `BÃO-TO`) 2-chiều PASS trên cây tạm |
| C1 | session_ctx_kb | key = 64 trong memory-budget.json |
| C2 | hook 4-path | `wal-flush.ps1` = 4 path (+sessions/); khai pending-restart để ăn |
| C3 | VC-1 2-tầng | nhãn = `S<nn>` + `logic:L<mm>` (KHÔNG 1-tầng); draft aligned S144 (VC-3 stale gỡ) |
| C4 | session-model scaffold | sessions/session-`<N>` regex + .gitignore-verify + per-pause context-map + Q4-defer documented |
| D1 | 5-vòng completeness-gate | ĐẠT: 5 vòng chức-năng + 4 phép sàn (bảng verify) |
| D2 | session-start KIỂM gap | đóng HOẶC defer-có-lý-do documented (không im-lặng bỏ) |
| E1 | tiep/pause/snapshot | review PASS; defect (nếu có) fixed; C7-compliant |
| Z | governance-only | 0 file src/·fe-*·tests/ đụng (verify git-diff); test count giữ; bundle FROZEN |

View File

@ -0,0 +1,77 @@
# sub-h24-audit-S146 — KIỂM vòng soi-lead H24 (vai #3/3, C4b tuần-tự)
> Vai: `h24-audit` — KIỂM **2 con-đo H24**, KHÔNG soi lead trực-tiếp. Propose-only.
> no-self-exempt: tao ≠ `lead-view-auditor` ≠ `lead-omission-auditor`. ✅
> **Ghi đĩa TRONG lúc làm** (anti-#53 — cả 2 vai H24 phiên này ĐỀU garble). Trạng-thái: ĐANG CHẠY.
## (i) PIN + fail-safe — VERIFY TỒN-TẠI ✅ PASS
| pin | tồn-tại | byte | mtime | tươi? |
|---|---|---|---|---|
| `sub-lead-view-S146.md` | ✅ | 10.404 | 2026-07-22 23:52 | ✅ phiên này |
| `sub-lead-omission-S146.md` | ✅ | 20.043 | 2026-07-23 00:02 | ✅ phiên này |
⇒ H24 CÓ chạy phiên này. **KHÔNG NO-OP.** Tuần-tự C4b: file này ghi SAU 00:02 ⇒ mtime tao > mtime cặp. ✅
FLAG-list nhận: **3 view + 4 omission = 7 FLAG**. Khớp lệnh spawn.
---
## 🔴 PHƯƠNG-PHÁP — bẫy "đo-xong-lead-đã-vá" (phải khai TRƯỚC mọi verdict)
Cả 2 vai H24 đo lúc **23:52** (view) / **00:02** (omission). Lead **đã vá nhiều FLAG NGAY SAU ĐÓ**
(WAL mtime `00:05:53` · `tiep.md` `23:55:18` · `h24-audit.md` `23:54:39`).
⇒ Nếu tao chấm theo **đĩa HIỆN TẠI**, tao sẽ báo TRƯỢT hàng loạt FLAG **đúng** chỉ vì chúng đã được sửa.
🔴 **Luật tao tự đặt:** mỗi FLAG chấm theo **state TẠI THỜI-ĐIỂM ĐO**, dựng lại bằng `git show <sha>:<path>`
+ đối-chiếu mtime. Neo: `ea3eb30` (23:59:07) = commit cuối; `.claude/agents/` + `.claude/commands/`
**NGOÀI 4-path hook** ⇒ sửa ở đó KHÔNG auto-commit ⇒ phải dùng **mtime**, không dùng git, để định thời.
Timeline neo (git log `--date=format`):
`ad02483` 23:05 → `9c68bae` 23:10 → `e7d06f2` 23:26 → `c2d1a05` 23:30 → `c03f359` 23:49 →
**[view đo 23:52]** → `a6863a1` 23:56 → `ea3eb30` 23:59 → **[omission đo 00:02]** → [lead vá WAL 00:05]
---
## (ii) Verdict per-FLAG — 7/7
### view FLAG-1 · `view-stale-status` · `tiep.md:100` wired-but-declared-unwired → **ĐẠT**
- Dựng lại `git show ea3eb30:.claude/commands/tiep.md` (= bản `c2d1a05` 23:30, file ngoài hook-path,
mtime 23:55:18 **sau** lượt đo 23:52 ⇒ lúc đo đĩa đúng bản này):
`:100` 🔴 *"`closed.md` … **CHƯA wire** (bảng **VC-2** còn chờ anh duyệt)"* — **có thật, nguyên-văn**.
- Nghịch-lý nội-tại **verify độc-lập**: cùng bản đó, `:89` ghi *"hoặc closed.md do đóng-L"*,
`:94` `c=0; [ -f "$d/closed.md" ] && c=1`, `:95` `[ "$p" -gt $((r + c)) ]`
**MÁY ĐỌC `closed.md` THẬT** trong khi PROSE khai "chưa wire". Chẩn-đoán **wired-but-declared-unwired** CHÍNH XÁC.
- Class `view-stale-status` ∈ enum ✅. Ranh-giới `:23` (không flag run-trace S145 frozen-by-design) = **đúng luật**.
- 🔸 Đã được vá lúc 23:55: `:100` lật ✅ ĐÃ WIRE, `:101` hạ 🧊 lineage **đúng nguyên-văn câu cũ**, `:102` ghi công
*"H24 `lead-view-auditor` bắt @S146"*. ⇒ resolve của FLAG được thi-hành **y hệt** đề-xuất.
### view FLAG-3 · `view-residual-asym` · sweep-consent sót 6 site → **ĐẠT** (+ 🔴 residual CÒN SỐNG)
- Dựng lại `git show ea3eb30:.claude/agents/h24-audit.md` (bản `c2d1a05`; mtime đĩa 23:54:39 **sau** 23:52):
`:4` "OVERDUE+consent" ✅ · `:25` "OVERDUE + anh consent" ✅ · `:27` "OVERDUE + anh consent" ✅ ·
`:28` "chưa tới nhịp / anh không consent" ✅ ⇒ **4/4 site tao kiểm được đều CÓ THẬT**.
- Source đối-chứng: `session-end.md:106` + `session-start.md §2.1.8(e)` + `WAL:9 [7](3)` = auto ⇒ lệch **thật**.
- 🔴 **TAO TỰ ĐO ĐƯỢC — RESIDUAL CHƯA ĐÓNG:** đĩa **NGAY BÂY GIỜ** `.claude/agents/h24-audit.md:25` vẫn là:
`- Owner S145: **AUTO sau đo, KHÔNG consent-gate.** Cặp H24 chạy xong (… §2.1.8 khi OVERDUE + anh consent) ⇒ …`
⇒ lead đã vá `:4`, `:27`, `:28` nhưng **BỎ SÓT `:25`** — câu **tự mâu-thuẫn trong CÙNG một dòng**
("KHÔNG consent-gate" … "khi OVERDUE + anh consent"). **5/6 đóng, 1/6 sống.**
Bằng-chứng mạnh nhất: dòng đó **đang nằm trong persona nạp vào chính tao lượt này** — tao đọc được nó ở
context của mình VÀ trên đĩa, 2 nguồn khớp.
🔴 Đây là **đời-3 của cùng lớp lỗi** lead-view đã cảnh-báo (S143 grep-theo-SỐ → S146 sweep-consent →
nay **vá-sót ngay trong lượt vá**). Vá theo *danh-sách site do người khác liệt* mà không **tự grep lại
sau khi vá** = đúng cái bẫy FLAG-3 mô-tả.
### omission FLAG-1 · `gap-owner-specifics` · owner-decision `[7]` bị ghi đè → **ĐẠT**
- `git show ad02483:.claude/WAL.md:9` **và** `9c68bae` — cả hai có nguyên-văn:
`[7] "con lai xu ly het xong roi session-end" = uy quyen commit+push + chay session-end`
- `git show e7d06f2:` → slot `[7]` bị **thay** bằng session-model ✅ (đúng cơ-chế overwrite-in-place).
- 🔴 Đo tại **đúng bản omission đối-mặt** (`ea3eb30`, HEAD lúc 00:02): `grep -ci "con lai xu ly"` = **0** ⇒ MẤT thật.
- **KHÔNG phải "đổi chỗ sang sổ khác"** (tao tự grep 4 bề-mặt bền, không chép của omission):
`docs/` · `.claude/WAL.md` · `.claude/sessions/` · `.claude/governance/`**0 hit** cho cụm uỷ-quyền;
chỉ ra nhiễu vô-can (`database-guide.md:155` "người được ủy quyền ký NĐUQ", `forms-spec.md:39`, …) = **domain HĐ**, không liên-quan.
- 🔸 Vá lúc 00:05:53 (uncommitted): `WAL:8-9` `[7] ⚠️ KHOI-PHUC (bi ghi de @e7d06f2, **H24-omission bat**)` +
header đổi thành `🔴 SLOT-INDEX CHI-TANG, CAM TAI-DUNG (luat moi @S146)` ⇒ lead nhận **cả FLAG-1 lẫn INFORM-3**.
- ⚠️ **1 sai-số nhỏ của omission (không đổi verdict):** nó ghi *"@ HEAD `c2d1a05`"* — nhưng lúc 00:02 HEAD thật
`ea3eb30` (23:59), `c2d1a05` là 23:30 (cũ 3 commit). Nội-dung khối OWNER-DECISION **giống nhau ở cả hai**
nên kết-luận không đổi; nhưng nhãn-HEAD **sai** ⇒ ghi nhận, không trừ verdict.
(đang chạy tiếp…)

View File

@ -0,0 +1,175 @@
# sub-implement-A-c7 — Axis A (C7 predicate 4-vế) + N.2 cardinality 3→4
> Worker-1 (`impl-A-c7`) · S146 relaunch-cắt-gọt · file sở-hữu = `docs/governance/harness-11-engine.md` DUY-NHẤT.
> Ghi-đĩa-TRONG-lúc-làm (anti-#53, bài học S123). **VERDICT: DONE** (VIỆC 3 = báo-cáo PARTIAL-về-script, không phải PARTIAL-về-task).
## Trạng-thái
- [x] B0 — đọc spec-v2 toàn-file (gồm §[4] ADDENDUM @S146) + run.md
- [x] B1 — VIỆC 1: viết **§N.8** (predicate 4-vế + tách FLOOR/FORM + reword tập-cấm) → `harness-11-engine.md:413-421`
- [x] B2 — VIỆC 2: N.2 `3 path cố định`**`4 path cố định`** (+`.claude/sessions/`) → `:406` (+N.3 `:407` gỡ literal stale, giữ sự-thật lịch-sử)
- [x] B3 — VIỆC 3: verify `scripts/distill-shard-probe.ps1` vs N.8 → **(i)(ii)(iii) PASS · (iv) NỬA** (chi-tiết dưới) — KHÔNG sửa script
- [x] B4 — VIỆC 4: fault-inject 2-chiều `scripts/nhip-no-probe.ps1` (KHÔNG đổi code) → **2/2 chiều PASS**
- [x] B5 — acceptance greps chạy thật, output dán dưới
- [x] B6 — guard LUẬT-CỨNG: 0 file `src/` `fe-*` `tests/` trong diff
---
## B0 — baseline đo TƯƠI trên đĩa (TRƯỚC khi sửa)
```
$ grep -n '3 path cố định' docs/governance/harness-11-engine.md
406:- **N.2 Hai tầng ghi (🔴):** … `git add` per-path 3 path cố định {`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/`} …
407:- **N.3 …** commit `12071c5 "wal: flush 20260712T1105"` chứa ĐÚNG 4 file thuộc 3 path cố định (…)
⇒ 🔴 v2 §C2b-EXT chỉ liệt N.2. Đĩa có **2 site** trong cùng file (N.2 luật-sống + N.3 bằng-chứng-lịch-sử).
$ grep -c '4 surface' docs/governance/harness-11-engine.md
0 <-- baseline = 0. Header "4 surface" nằm ở `scripts/nhip-no-probe.ps1:6-7`, KHÔNG ở file này.
⇒ acceptance "không giảm" = giữ 0 (no-op). ĐƯỜNG-CHẾT tôn-trọng: KHÔNG đụng header/`4 điểm lệnh`.
$ grep -n 'N\.8' docs/governance/harness-11-engine.md
(0 dòng) <-- N.8 chưa tồn-tại; PHẦN N = N.1…N.7 (dòng 405411). Số N.8 do lead CHỐT, worker KHÔNG tự chọn.
$ grep -rn 'nhip-no-probe.ps1' .claude/commands/
pause.md:44 · session-end.md:104 · session-end.md:131(tham-chiếu) · session-start.md:216 · tiep.md:112
⇒ **4 FILE caller THẬT** → header "4 surface" ĐÚNG. Tiền-đề v1 "→2" đã bị bác, KHÔNG đụng.
```
---
## B1 — VIỆC 1: §N.8 (`docs/governance/harness-11-engine.md:413-421`)
Chèn NGAY SAU N.7, TRƯỚC đoạn "Honest nấc §N". Cấu-trúc:
| thành-phần | nội-dung neo |
|---|---|
| 4 vế | (i) read-only · (ii) KHÔNG spawn con · (iii) KHÔNG write · (iv) lỗi → `probe-loi (khong chan)` → ĐI TIẾP 🔴 **[LOAD-BEARING]** |
| **FLOOR** 🔴 | **read-only** · **non-blocking** (fail-open + no-hang + `exit 0` mọi nhánh) · **gỡ-được-không-hậu-quả** — kèm **phép thử probe ⟂ gate**: gỡ lời-gọi mà hành-vi ĐỔI ⇒ nó là gate (§E.3), không phải probe |
| **FORM** 🟡 | wording token (ASCII-only gotcha #30) · số vế/format dòng-nợ · vị-trí gọi · **interpreter = em-main đọc dòng in**, KHÔNG OS-gate (nhất-quán CAVEAT No-OS-hook) |
| tập-cấm reword | "cấm ĐẮT / cấm side-effect (spawn vai · audit-rerun · đo lại instrument · ghi memory/luật · push) — **CHO PHÉP probe read-only non-blocking theo N.8**"; command chỉ **TRỎ** §N.8, **CẤM chép predicate 2 nơi** (B1) |
| trạng-thái đo S146 | `nhip-no-probe.ps1` ✅ 4/4 vế · `distill-shard-probe.ps1` FLOOR-đủ / FORM-thiếu (vế-iv nửa) |
```
$ grep -n 'N\.8' docs/governance/harness-11-engine.md
413:- **N.8 Probe-tại-điểm-dừng — predicate 4-vế (🔴 FLOOR + 🟡 form) — LUẬT-HOME của C7 (hub-answer, adopt S146):** …
418: - **FLOOR (🔴 bất-biến — port-nguyên khi tailor, 3 tính-chất):** **read-only** · **non-blocking** …
420: - **Reword tập-cấm (🔴 KHÔNG phải cấm-tất):** …
$ grep -no 'FLOOR (🔴 bất-biến[^)]*)\|read-only\*\* · \*\*non-blocking\*\*[^·]*· \*\*gỡ-được-không-hậu-quả\*\*\|FORM (🟡 tailor được)' docs/governance/harness-11-engine.md
418:FLOOR (🔴 bất-biến — port-nguyên khi tailor, 3 tính-chất)
418:read-only** · **non-blocking** (fail-open + no-hang + `exit 0` mọi nhánh) · **gỡ-được-không-hậu-quả**
419:FORM (🟡 tailor được)
$ grep -no 'CHO PHÉP probe read-only non-blocking theo N.8' docs/governance/harness-11-engine.md
420:CHO PHÉP probe read-only non-blocking theo N.8
```
🔸 **Seam A↔CE:** worker-2 chèn dòng TRỎ `§N.8``pause.md:44` / `tiep.md:112`. Worker-1 **KHÔNG đụng 2 file đó** (DISJOINT-FILE) — số §N.8 = lead chốt, khớp.
---
## B2 — VIỆC 2: N.2 cardinality 3→4 (`:406`) + N.3 de-stale (`:407`)
**Sửa 1 — N.2 (LUẬT GỐC hook thi-hành):**
```
$ grep -no '4 path cố định\*\* {[^}]*}' docs/governance/harness-11-engine.md
406:4 path cố định** {`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/` · `.claude/sessions/`}
```
+ thêm clause lineage cuối N.2: *"🔄 Cardinality 3→4 @S146 … mọi đổi cardinality phải **grep MỌI consumer cùng-commit** (hook `wal-flush.ps1` · Sàn-3 `/tiep §0` "điểm mù" · `.session-counter.json _why_this_path` · auto-memory H22) — sửa write-site mà sót read-site = vỡ chính floor recovery (lớp S87/S88). Bản-ghi LỊCH-SỬ (adap-report có ngày · diary vai · `WAL.md`) KHÔNG rewrite."*
**Sửa 2 — N.3 (bằng-chứng LỊCH-SỬ, xử KHÔNG falsify):** câu cũ *"chứa ĐÚNG 4 file thuộc **3 path cố định**"* mô-tả commit `12071c5` @S111.
→ đổi thành *"chứa ĐÚNG 4 file thuộc tập path cố định **lúc S111** (… — khi đó `.claude/sessions/` chưa tồn-tại; tập hiện-hành = N.2 bản 4-path @S146)"*.
**Lý-do KHÔNG đơn-giản đổi 3→4:** đổi số = **bịa lịch-sử** (commit đó KHÔNG hề phủ `sessions/`). **Lý-do KHÔNG để nguyên:** file này là **LIVE PRESCRIPTIVE** (C2b-EXT hàng 3) — không nằm trong tập 🧊 LỊCH-SỬ được miễn (adap-reports · diary vai · `WAL.md`); để literal "3 path cố định" sống trong luật-home = dạy sai + fail acceptance. Cách vá giữ **cả** sự-thật lịch-sử **và** con-trỏ tới tập hiện-hành ⇒ KHÔNG phải "rời tập-đo" (nội-dung được LÀM ĐÚNG, không phải đổi hình-dạng để né grep).
```
$ grep -n '3 path cố định' docs/governance/harness-11-engine.md
(rc=1 ; 0 dòng = PASS)
$ grep -n '3 path\|3 điểm mù\|exactly 3 paths' docs/governance/harness-11-engine.md # pattern C2b-EXT đầy-đủ
(rc=1 ; 0 dòng = PASS)
$ grep -c '4 surface' docs/governance/harness-11-engine.md
0 # = baseline, KHÔNG giảm (PASS; "4 surface" vốn không ở file này)
```
---
## B4 — VIỆC 4: fault-inject 2-chiều `scripts/nhip-no-probe.ps1` (KHÔNG đổi code)
Script không sửa (catch tổng `:203-208``Write-Host 'probe-loi (khong chan)'`; `exit 0` `:208` unconditional). Chứng bằng **CHẠY THẬT**, bọc `timeout 60` để quan-sát **no-hang**.
**(A) chiều LÀNH — chạy bình thường:**
```
$ timeout 60 powershell.exe -ExecutionPolicy Bypass -File "D:\...\scripts\nhip-no-probe.ps1"; echo "EXIT=$?"
NHIP-NO: kiem light 3/6 deep 3/15 ok | tran-bo-nho 1 over-cap | run-chua-gom 3 | pull-cach 0 ngay
EXIT=0
```
⇒ dòng NHIP-NO **đầy-đủ 4 vế**, exit 0, trả ngay (không chạm trần timeout).
**(B) chiều LỖI — ép `-RepoRoot` bậy (đường dẫn không tồn-tại):**
```
$ timeout 60 powershell.exe … -File "…\nhip-no-probe.ps1" -RepoRoot "D:\__khong-ton-tai-S146__"; echo "EXIT=$?"
probe-loi (khong chan)
EXIT=0
```
**(B2) biến-thể LỖI — RepoRoot TỒN-TẠI nhưng RỖNG (thiếu `.session-counter.json`):**
```
$ timeout 60 powershell.exe … -File "…\nhip-no-probe.ps1" -RepoRoot "<TEMP>\s146-empty-root"; echo "EXIT=$?"
probe-loi (khong chan)
EXIT=0
```
**vế-(iv) GIỮ ĐƯỢC**: in đúng token `probe-loi (khong chan)`, `exit 0`, **KHÔNG treo** (2 vector lỗi khác nhau: path-không-tồn-tại ⟂ path-tồn-tại-nhưng-thiếu-file ⇒ không phải may một nhánh). **Boundary teeth:** chiều LÀNH in nội-dung THẬT (không phải cùng token) ⇒ token lỗi không phải dương-giả.
---
## B3 — VIỆC 3: `scripts/distill-shard-probe.ps1` vs N.8 (CHỈ BÁO-CÁO, KHÔNG SỬA)
| vế N.8 | phán | bằng-chứng đọc-mã / chạy-thật |
|---|---|---|
| (i) read-only | ✅ PASS | chỉ `Test-Path` · `[IO.File]::ReadAllText` `:24` · `ConvertFrom-Json` `:25` · `Get-ChildItem` `:35,38` · `Write-Output`. 0 mutation. |
| (ii) KHÔNG spawn con | ✅ PASS | `grep -nE 'Start-Process\|Invoke-Expression\|Start-Job\|git '` = 0 hit mã-lệnh (chỉ hit comment/`Write-Output` chuỗi). |
| (iii) KHÔNG write | ✅ PASS | `grep -nE 'Set-Content\|Add-Content\|Out-File\|New-Item\|Remove-Item\|>>'` = 0 hit mã-lệnh. |
| (iv) lỗi→token→đi-tiếp | ⚠️ **NỬA** | nhánh **có-xử** OK · nhánh **exception** KHÔNG bắt ⇒ stderr + **exit 1**, KHÔNG in token. |
**Chạy thật 3 ca:**
```
$ timeout 60 powershell … -File "…\distill-shard-probe.ps1" # LÀNH
SHARD-PROBE: pending=15 | nguong=15 => IM
EXIT=0 ✅
$ timeout 60 powershell … -File "…\distill-shard-probe.ps1" -RepoRoot "D:\__khong-ton-tai-S146__"
Resolve-Path : Cannot find path 'D:\__khong-ton-tai-S146__' because it does not exist.
At …\distill-shard-probe.ps1:18 char:15
+ $root = (Resolve-Path $RepoRoot).Path
EXIT=1 ⚠️ KHÔNG in `probe-loi (khong chan)`
$ timeout 60 powershell … -File "…\distill-shard-probe.ps1" -RepoRoot "<TEMP>\s146-empty-root"
SHARD-PROBE: khong thay memory-budget.json -> probe-loi (khong chan)
EXIT=0 ✅ (nhánh CÓ-XỬ `:23`)
```
**Chẩn gốc:** `$ErrorActionPreference = 'Stop'` `:17` + **KHÔNG có try/catch tổng** ⇒ mọi terminating-error thoát nguyên (2 vector rõ: `Resolve-Path` `:18` với `-RepoRoot` bậy · `ConvertFrom-Json` `:25` khi JSON hỏng).
**Phán theo FLOOR/FORM:** **FLOOR ĐỦ** (read-only ✅ · non-blocking thực-tế ✅ — thoát ngay, no-hang, và caller `session-start.md:135` là em-main-đọc-dòng chứ không phải OS-gate nên exit≠0 không chặn phiên · gỡ-được-không-hậu-quả ✅ — gỡ lời-gọi chỉ mất INFORM sleep-check). **FORM THIẾU** (token vế-iv vắng ở nhánh exception; exit-code lệch contract "exit 0 mọi nhánh").
**Đề-xuất vá (KHÔNG tự làm — ngoài file sở-hữu):** bọc thân `:18-71` trong `try{…}catch{ Write-Output 'probe-loi (khong chan)' }` + `exit 0` cuối, y hệt `nhip-no-probe.ps1:203-208`. 1 sửa, ~4 dòng, 0 đổi hành-vi nhánh lành.
🔸 **Side-observation (ngoài scope, KHÔNG sửa):** `.claude/commands/sleep-recovery-memory-l2.md:52` khai `distill-shard-probe.ps1` chạy ở **cả** `/session-start §2.1.2` **và** `/session-end §L.b(c)`; nhưng `grep -n 'distill-shard-probe\|SHARD-PROBE' .claude/commands/session-end.md` = **0 hit** ⇒ vế "session-end" có mùi **ghost-wire class-2 (defined-but-unread)** H18. Chỉ báo, lead quyết.
---
## B5/B6 — Acceptance + guard (chạy thật)
```
$ grep -n 'N.8' docs/governance/harness-11-engine.md → 413 / 418 / 420 ✅
$ grep -n '3 path cố định' docs/governance/harness-11-engine.md → 0 dòng ✅
$ grep -c '4 surface' docs/governance/harness-11-engine.md → 0 (= baseline) ✅ không giảm
$ git diff --stat -- docs/governance/harness-11-engine.md
docs/governance/harness-11-engine.md | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
$ git diff --name-only | grep -E '^(src/|fe-admin/|fe-user/|tests/)' → rc=1, 0 hit ✅ governance-only
```
`git status --short` lúc kết: `M docs/governance/harness-11-engine.md` (của tôi) + `M .claude/commands/session-end.md`, `M .claude/governance/.session-counter.json` (**worker khác**, không đụng) + 2 file `sub-*.md` untracked. **0 commit / 0 git add / 0 push** (lead lo).
## ĐƯỜNG-CHẾT đã tôn-trọng
- KHÔNG sửa header "4 surface" / "4 điểm lệnh" (tiền-đề v1 đã bị bác; đo lại 4 caller THẬT).
- KHÔNG sửa `scripts/*.ps1` (VIỆC 3 + 4 đều report-only / run-only).
- KHÔNG đụng `pause.md` / `tiep.md` (worker-2 sở-hữu) — chỉ nêu trong N.8 rằng command TRỎ §N.8.
- KHÔNG chép predicate sang file thứ 2 (B1).

View File

@ -0,0 +1,275 @@
# sub-implement-CE-sessionmodel — Axis C (session-model + hook 4-path + Sàn-3 atomic) + Axis E (tiep/pause/snapshot)
> Worker-2 @S146 · spec canonical = `spec-apply-hub-s145-v2.md` (gồm `[4] ADDENDUM @S146`).
> 🔴 Ghi-đĩa TRONG lúc làm (anti-#53 S123) — mỗi bước xong ghi ngay, KHÔNG đợi cuối.
## FILE SỞ-HỮU (disjoint, KHÔNG đụng file worker khác)
`.claude/hooks/wal-flush.ps1` · `.claude/commands/tiep.md` · `.claude/commands/pause.md` · `.claude/commands/session-start.md` · `.claude/governance/.session-counter.json` (chỉ `_why_this_path`) · `.claude/auto-memory/project_h22_wal_session_continuity.md` (chỉ cụm "3 path") · `docs/governance/session-model-se-draft.md`
---
## BƯỚC 0 — GROUND-TRUTH đo tươi trên đĩa @S146 (TRƯỚC khi sửa)
### (0.1) grep consumer "3 path" toàn tập LIVE
```
$ grep -rn '3 path|3 điểm mù|exactly 3 paths|3 path cố định|hook-3-path' \
.claude/commands/ .claude/hooks/ .claude/auto-memory/ \
.claude/governance/.session-counter.json docs/governance/harness-11-engine.md \
docs/governance/session-model-se-draft.md
```
Output THẬT (11 hit / 6 file):
| file:line | nội-dung | chủ-sở-hữu |
|---|---|---|
| `.claude/commands/pause.md:31` | "file NGOÀI hook-3-path" | **TÔI** |
| `.claude/commands/pause.md:34` | "file ngoài hook-3-path" | **TÔI** |
| `.claude/commands/tiep.md:21` | "hook có **3 điểm mù**" | **TÔI** |
| `.claude/commands/tiep.md:23` | "`wal-flush.ps1:7` tự-commit **3 path**" | **TÔI** |
| `.claude/commands/tiep.md:75` | "NGOÀI 3 path hook persist" | **TÔI** |
| `.claude/commands/tiep.md:78` | "Bẩn ngoài 3 path" | **TÔI** |
| `.claude/auto-memory/project_h22_wal_session_continuity.md:10` | "3 path: WAL/agent-memory/runs" | **TÔI** |
| `.claude/governance/.session-counter.json:4` | "exactly 3 paths … OUTSIDE all three" | **TÔI** |
| `docs/governance/session-model-se-draft.md:13` | "persist 3-path" | **TÔI** |
| `docs/governance/session-model-se-draft.md:56` | "quét **đúng 3 path**" (meld-forward-gap) | **TÔI** |
| `.claude/commands/session-end.md:113` `:222` | "hook-3-path" ×2 | 🔴 **WORKER-3** — TÔI KHÔNG ĐỤNG |
| `docs/governance/harness-11-engine.md:406` (N.2) `:407` (N.3) | "3 path cố định" ×2 | 🔴 **WORKER-1** — TÔI KHÔNG ĐỤNG |
🔴 **Phát-hiện MỚI ngoài bảng C2b-EXT của spec** (spec liệt 5 dòng LIVE; đo tươi ra **thêm 4 site**):
- `pause.md:31` + `:34` "hook-**3**-path" (spec chỉ liệt `tiep.md`) — **TÔI vá**.
- `session-end.md:113` + `:222` "hook-**3**-path" — **worker-3 sở-hữu**, tôi KHÔNG đụng ⇒ **residual báo lead**.
- `harness-11-engine.md:407` (N.3) "3 path cố định" — spec chỉ giao worker-1 **N.2**; **N.3 là site thứ-2 cùng file** ⇒ residual báo lead (N.3 là câu LỊCH-SỬ mô-tả commit S111 `12071c5` "chứa ĐÚNG 4 file thuộc 3 path cố định" — có thể giữ nguyên như vết lịch-sử, nhưng phải là **quyết-định có ý-thức**, không phải bỏ sót).
- Lý do class: `cardinality-change → grep MỌI consumer` (S87/S88) — sửa write-site sót read-site = vỡ feature.
### (0.2) `.gitignore` — `.claude/sessions/` có bị ignore không?
```
$ git check-ignore -q .claude/sessions/session-1 ; echo exit=$?
exit=1
```
**exit=1 = KHÔNG bị ignore** — đúng kỳ-vọng spec C.5. (`.gitignore:82-83` `!.claude/` + `!.claude/**` re-include; không pattern nào sau đó loại `sessions/`.)
```
$ ls -d .claude/sessions
ls: cannot access '.claude/sessions': No such file or directory
```
⇒ thư-mục CHƯA tồn-tại lúc bắt đầu.
### (0.3) `session_ctx_kb` — đếm CONSUMER thật (C1: để TRỐNG, CẤM hardcode 64)
grep toàn repo (ripgrep):
- **0 script đọc key** — hit duy-nhất trong `scripts/``scripts/nhip-no-probe.ps1:42` và nó là **COMMENT** (`"same discipline as declining to pick session_ctx_kb"`), KHÔNG phải đọc config.
- `.claude/agent-memory/memory-budget.json`**0 hit** ⇒ key VẮNG.
- Còn lại toàn doc/spec/run-trace/broadcast (mô-tả, không đọc).
**ghost-wire class (H18 defined-but-unread)****KHÔNG ĐỘNG GÌ** vào `memory-budget.json` (đúng C1 + K6.2). Đây là hành-động "không làm" **có chủ-đích**, đã đo.
---
## BƯỚC 1 — VIỆC 1: hook 4-path (spec C.2) ✅ DONE
`.claude/hooks/wal-flush.ps1:13-14``$paths` 3 → **4** (+`.claude/sessions/`), kèm 1 dòng comment pure-ASCII (gotcha #30: .ps1 pure-ASCII).
```
$ sed -n '12,15p' .claude/hooks/wal-flush.ps1
if ((Test-Path ".git/rebase-merge") -or (Test-Path ".git/rebase-apply")) { exit 0 }
# 4 path (S146): +.claude/sessions/ = thu-muc phien-LOGIC (session-model, hub-form session-<N>).
# Floor canonical = engine N.2 (KHONG chep list o day - B1 con-tro).
$paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/")
```
🔴 **KHÔNG viết "pending-restart"**: `.claude/settings.json` gọi hook bằng `-File <path>` ⇒ body được đọc LẠI mỗi lần Stop fire ⇒ ăn NGAY, không cần restart. (Xác nhận đọc `.claude/settings.json` — xem BƯỚC 1b.)
### 1b — LIVE-VERIFY (khai THẬT phạm-vi)
Xem mục "LIVE-VERIFY" cuối file — có **2 phần**: (i) hook chạy THẬT trên **cây tạm** (chứng path thứ-4 được nuốt, có `git log --name-only` thật) · (ii) fire trong repo THẬT = **KHÔNG quan-sát được từ trong subagent** → để lead live-verify.
---
## LIVE-VERIFY hook 4-path — 2 CHIỀU, chạy THẬT (không phải happy-path suông)
### (i) settings.json = `-File` ⇒ ăn NGAY, KHÔNG cần restart
```
$ cat .claude/settings.json
"command": "powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1"
```
⇒ body đọc LẠI mỗi lần Stop fire ⇒ **KHÔNG viết "pending-restart"** (đúng spec C.2).
🔸 Event wired = **`Stop`** (KHÔNG có `SubagentStop`) — đây chính là lý do subagent không quan-sát được fire (mục (iii)).
### (ii) 🧪 CHẠY THẬT hook trên CÂY TẠM (precedent S135 `-RepoRoot`; ở đây inject qua `CLAUDE_PROJECT_DIR`)
Cây tạm `…/scratchpad/hook4path/` — git repo riêng, KHÔNG đụng repo thật.
**Chiều A — BODY MỚI (4 path) ⇒ NUỐT `sessions/`:**
```
$ CLAUDE_PROJECT_DIR=<tmp> powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1
hook exit=0
$ git log --name-only --format='%s' -1
wal: flush 20260722T2238
.claude/WAL.md
.claude/sessions/session-1/probe.md <-- 🔴 PATH THỨ-4 ĐÃ VÀO COMMIT
$ git status --porcelain
?? .claude/hooks/
?? docs/ <-- decoy NGOÀI 4 path: KHÔNG bị nuốt (anti-Goodhart control)
```
**Chiều B — NEGATIVE CONTROL, BODY CŨ (3 path) ⇒ KHÔNG nuốt:**
```
$ grep -n 'paths = @' .claude/hooks/wal-flush.ps1
15: $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/")
$ ... run hook ...
$ git log --name-only --format='%s' -1
wal: flush 20260722T2238
.claude/WAL.md <-- CHỈ WAL
$ git status --porcelain | grep sessions
?? .claude/sessions/ <-- 🔴 VẪN MỒ-CÔI (đúng bug mà 4-path vá)
```
**2 chiều khớp**: file `sessions/` được nuốt **KHI VÀ CHỈ KHI** `$paths` có path thứ-4. Chứng đây là **nguyên-nhân**, không phải trùng-hợp. Decoy `docs/` im ở cả 2 chiều ⇒ hook KHÔNG nới quá list.
### (iii) 🔴 KHAI THẬT — fire trong REPO THẬT: **KHÔNG quan-sát được từ trong subagent**
- Hook wired ở event **`Stop`** (turn-boundary của **phiên chính**), KHÔNG phải `SubagentStop` ⇒ lượt của worker này **không sinh** boundary đó.
- Tôi cũng **KHÔNG tự chạy hook trong repo thật** vì nó `git add` + `git commit` — vi-phạm LUẬT CỨNG #6 (không commit / không git add; lead lo).
-**CẤM tự dán chữ "verified" cho fire-in-repo-thật.** Trạng-thái đúng = **VERIFIED-ON-TEMP-TREE (2 chiều) + PENDING lead live-verify trong repo thật.**
- **Vật-liệu để lead verify đã đặt sẵn:** `.claude/sessions/session-1/probe.md` (xem BƯỚC 4). Lead chỉ cần để một turn-boundary trôi qua rồi:
`git log --name-only -1` → phải thấy commit `wal: flush …` **nuốt** `.claude/sessions/session-1/probe.md`.
---
## BƯỚC 2 — VIỆC 2: SÀN-3 ATOMIC trong `tiep.md` (spec C.3) ✅ DONE
| mục | site | làm gì |
|---|---|---|
| (a) | `:21` | "hook có **3 điểm mù**" → **4 điểm mù** |
| (a)+(d) | `:23` | "`wal-flush.ps1:7`**3 path**" → "**`wal-flush.ps1:13`** … **4 path**" + liệt đủ 4 path |
| (a) | `:24` | "MÙ đúng **3** vùng" → **4** vùng |
| (a) | `:29` | BẬC MẠNH "thấy **1 trong 4**" → **1 trong 5** |
| (b) | `:37` | **THÊM hàng ⑤** vào bảng BẬC MẠNH (lệnh `git log --name-only --format='%s' origin/main..HEAD \| grep -q '.claude/sessions/'`) |
| (b)+orphan-L | `:78-101` | **THÊM block `#### ⑤ ORPHAN-L`** — DUAL 2 cửa (git ⟂ đĩa cân-sổ) |
| (c) | `:103` `:106` | BẬC TRUNG "ngoài **3** path" → **4** path (×2) |
| (e) | `:115-116` | "Cả **4** tín-hiệu MẠNH đều im" → **5** + **luật bất-biến** "mỗi path mới ⇒ mỗi tín-hiệu mới, CÙNG lần sửa" |
| (e) | `:122` | §0.b self-heal: "cả 4 tín-hiệu MẠNH khác" → "cả **4 tín-hiệu MẠNH CÒN LẠI** (= 5 trừ chính ③)" — 🔸 số này **đúng là 4**, không phải 5: ③ `closing:` là chính nó |
| (e) | `:131` | §1 "**4/4** tín-hiệu MẠNH im" → **5/5** |
| §N.8 | `:142` | dòng **TRỎ** `harness-11-engine.md §N.8` (B1 — CHỈ trỏ, KHÔNG chép predicate) |
| C.6 | `:144-149` | **THÊM §2.6** đọc context-map + ghi biên-nhận `resume-*` |
### 🔴 Quyết-định phụ (khai để lead soi): GIỮ `$paths` ĐÚNG DÒNG 13
Bản sửa đầu tôi chèn 2 dòng comment **TRÊN** `$paths` ⇒ đẩy nó xuống **:15** ⇒ acceptance literal `wal-flush.ps1:13` **hỏng**, và mọi trích-dẫn `:13` (spec · run.md · memory) **lão-hoá cùng lúc**. ⇒ **đảo comment xuống DƯỚI**, `$paths` ở lại `:13`. Ghi luôn cảnh-báo trong chính file `.ps1`:
```
16: # !! GIU $paths O DUNG DONG 13: nhieu doc trich-dan "wal-flush.ps1:13" (tiep.md :23, spec, memory).
17: # Chen dong TREN day = lao-hoa het cac trich-dan do (class acceptance-literal-tu-lao-hoa S121).
```
Đã **RE-RUN** live-verify trên body CUỐI sau khi đảo (không tin verify của bản nháp): commit `wal: flush 20260722T2240` vẫn nuốt `.claude/sessions/session-1/probe.md`, decoy `docs/` vẫn im.
### 🧪 Fault-inject ORPHAN-L — 5 ca, 2 CHIỀU (chạy THẬT block trong `tiep.md`, cây tạm)
```
ca 1 pause=1 resume=0 -> ORPHAN-L: .claude/sessions/session-1/ (pause=1 resume=0 closed=0) ✅ FLAG dung
ca 2 pause=1 resume=1 -> (im) ✅ IM dung
ca 3 pause=2 resume=1 (lech 1) -> ORPHAN-L: .claude/sessions/session-3/ (pause=2 resume=1 closed=0) ✅ FLAG dung
ca 4 pause=1 + closed.md -> (im) ✅ IM dung
ca 5 thu-muc RONG (0 pause) -> (im, skip) ✅ IM dung
```
**5/5**. Có ca **lệch-1 trên nền không-rỗng** (ca 3) = ca anti-Goodhart: thiếu nó thì detector chỉ bắt được "chưa từng resume", bỏ lọt "resume thiếu 1 lần".
---
## BƯỚC 3 — VIỆC 3: 2 CONSUMER v2 SÓT ✅ DONE
### (3.1) `.claude/governance/.session-counter.json` → `_why_this_path`
**TÁI-VERIFY mệnh-đề TRƯỚC khi sửa** (không chỉ bump số): `.claude/governance/` có còn ngoài **cả 4** path không?
→ path thứ-4 là `.claude/sessions/`, **≠** `.claude/governance/`**mệnh-đề VẪN ĐÚNG**, chỉ con số đổi. Đã ghi câu **RE-VERIFIED at S146** vào chính field đó + luật "lần nới sau phải **kiểm lại câu**, không chỉ bump số".
Verify sau sửa:
```
$ grep -o 'OUTSIDE all four' .claude/governance/.session-counter.json
OUTSIDE all four
$ head -c 3 .claude/governance/.session-counter.json | xxd
00000000: efbb bf ... <-- BOM CON NGUYEN
$ python -c "import json,io; d=json.load(io.open(...,encoding='utf-8-sig')); ..."
PARSE OK; counter = 20 ; session = S146
last_ticked_head = 474199b32fb0371d76aa2f1c43daa849f973f9fd · last_ticked_at = 2026-07-22
last_audit = 17 17 · class_repeat keys = 8 · history entries = 8
```
🔸 **`git diff --numstat` ra `4 4` — KHÔNG phải tôi sửa 4 dòng.** Soi diff: 3 dòng kia (`counter` 19→20 · `S145``S146` · `last_ticked_head`) **đã có sẵn trong cây** = **tick của lead phiên này**, uncommitted từ trước lúc tôi vào. Sửa của tôi = **đúng 1 dòng** `_why_this_path`. (Ghi rõ kẻo đọc numstat thành "worker đụng counter".)
### (3.2) `.claude/auto-memory/project_h22_wal_session_continuity.md:10`
"(per-path+CAND+exit-0; **3 path**: WAL/agent-memory/runs)" → "**4 path** kể từ S146: WAL/agent-memory/runs/**sessions** — path thứ-4 `.claude/sessions/` = thư-mục phiên-LOGIC, đẻ CÙNG tín-hiệu MẠNH ⑤ + ORPHAN-L ở `tiep.md §0`".
🔴 File này **auto-inject MỖI PHIÊN** ⇒ để stale = mọi phiên sau bị dạy sai ngay từ context đầu-vào (đúng đánh-giá "NGUY NHẤT" của spec).
---
## BƯỚC 4 — VIỆC 4: session-model (spec C.4C.7) ✅ DONE
### (4.1) VC-1 nhãn 2 tầng + siết "MỘT con số" — `session-model-se-draft.md §3 VC-1`
`S<nn>` (cửa-sổ vật-lý, **mọi** tick/counter/H24 giữ nguyên đơn-vị) + `logic: L<mm>`. 🔴 **Siết thêm:** `L<mm>``session-<N>` dùng **CÙNG con số** (`mm ≡ N`) — 2 cách viết của 1 ID, **KHÔNG phải 2 bộ đếm** (2 counter cho 1 khái-niệm = drift bảo-đảm). + khai vì sao tick an-toàn: OR-guard khớp trên `S<nn>` **không đổi ngữ-nghĩa** ⇒ label-convention S135 còn nguyên, phép-7 không về `+0`; `L<N>` **CẤM** dùng ở guard/counter.
### (4.2) Gỡ VC-3 stale → hub-form (K4 chốt)
`.claude/logic-sessions/L<mm>.md` (**một-tệp-per-phiên**) → **`.claude/sessions/session-<N>/`** (**thư-mục-per-phiên**, hub-form). §4 khoản 1 (K4) đổi từ "chờ anh" → **CHỐT @S146** (căn-cứ: owner override S144 + spec-v2 §C.4; lý-lẽ: thư-mục chịu N khối `/pause` không phải sửa file cũ + trùng path thứ-4 của hook).
### (4.3) Scaffold — `session-start.md` **BƯỚC 0.8** (mới)
- form `.claude/sessions/session-<N>/`, **regex `^session-\d+$`**, `<N>` = `max+1`, **chỉ `/session-start` mở `<N>` mới** (`/tiep` nối, không mở).
- **Đo `.gitignore` THẬT, không suy:**
```
$ git check-ignore -q .claude/sessions/session-1 ; echo "exit=$?"
exit=1 <-- KHONG bi ignore (dung ky-vong spec C.5)
```
- **(d) KHAI RANH** — đã wire gì / chưa wire gì (chống đọc thành "đã adopt session-model"): 0 nghi-thức chuyển per-L trong lượt này.
- **+ vá B1 tại chỗ:** BƯỚC 0.7 cũ chép cứng "**4** tín-hiệu BẬC MẠNH" + "Sàn-3 **4/4** im" ⇒ **stale ngay** khi sàn lên 5. Đổi thành **`k/k` đọc sống từ `tiep.md §0`** + ghi rõ vì sao cấm chép số. (Đây là consumer **thứ 6** của cardinality-change mà không bảng nào trong spec liệt — bắt được nhờ grep-mọi-consumer.)
### (4.4) per-pause context-map — `pause.md` **§2.6** (mới)
File **MỚI mỗi lần pause**: `pause-S<nn>-<yyyyMMddTHHmm>.md`, **3 trường** (quyết-định-đã-chốt · delta-còn-sống · con-trỏ run/commit). **CẤM ghi đè**. Khai ranh với WAL (WAL = mạch-sống ghi-đè ≤40 dòng; context-map = tích-luỹ không cap). CẤM secret. + `pause.md §4` add đích-danh `.claude/sessions/session-<N>/` vào commit `wal: pause` (không dựa hook để chốt điểm dừng — *hook là lưới, không phải nghi-thức*).
### (4.5) `tiep.md §2.6` đọc lại — xem BƯỚC 2.
### (4.6) orphan-L rule — gộp chung signal ⑤, xem BƯỚC 2 (block `#### ⑤ ORPHAN-L` + fault-inject 5/5).
### (4.7) Q4-audit = DEFER ✅
`session-model-se-draft.md §5` câu 4 + `harness-11-engine.md §N.8`-pointer: chỉ **hiển-thị dòng-nợ**, **KHÔNG audit-rerun giữa phiên-logic****1 dòng lý-do**: audit-rerun = ĐẮT + side-effect ⇒ **phá predicate C7**.
### (4.8) `session_ctx_kb` = ĐỂ TRỐNG ✅ (hành-động = **KHÔNG ĐỘNG GÌ**, có đo)
`memory-budget.json` **0 hit** ⇒ giữ nguyên, **CẤM hardcode 64**. Đo: **0 script đọc key**; hit `scripts/` duy-nhất = **comment** `nhip-no-probe.ps1:42`. Đối-chứng ca song-sinh: `pull_warn_days` **CÓ** reader sống (`nhip-no-probe.ps1:190`) ⇒ analogy "như pull_warn_days" hỏng. Đã ghi phát-hiện vào `draft §4 khoản 2` + `session-start BƯỚC 0.8(d)`.
### (4.9) TRỎ §N.8 ✅ — `pause.md:5.` + `tiep.md §2.5`, **CHỈ TRỎ**, 0 chép predicate (B1).
---
## ACCEPTANCE — 6/6 PASS (lệnh + output THẬT)
```
1) grep -rn '3 path' .claude/commands/tiep.md -> hits=0 ✅
2) grep -n 'sessions' .claude/hooks/wal-flush.ps1
13: $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/") ✅
3) grep -o 'all four' .claude/governance/.session-counter.json -> all four ✅
4) python json.load(utf-8-sig) -> PARSE OK; counter = 20 ; session = S146
head -c 3 | xxd -> efbb bf (BOM con) ✅
5) grep -n 'wal-flush.ps1:13' tiep.md -> :23 co ; grep 'wal-flush.ps1:7' -> (none) ✅
6) grep '^| \*\*⑤\*\*' tiep.md -> :37 hang ⑤ ton tai trong bang BAC MANH ✅
```
**SCOPE GATE (luật cứng #1):**
```
$ git status --porcelain | grep -E '(src/Backend|fe-admin/|fe-user/|tests/)'
0 file prod-code — PASS
```
0 migration · 0 commit · 0 push · 0 `git add` (luật #6 giữ).
---
## 🔴 RESIDUAL — việc CÙNG CLASS còn sống ở file TÔI KHÔNG SỞ-HỮU (báo lead, KHÔNG tự sửa)
Sweep C2b-EXT sau khi tôi xong (`grep -rn '3 path|3 điểm mù|exactly 3 paths|3 path cố định|hook-3-path'`):
| file:line | nội-dung | phán |
|---|---|---|
| `.claude/commands/session-end.md:114` | "file ngoài **hook-3-path**" | 🔴 **THẬT — cùng class, cần → 4.** Worker-3 sở-hữu. |
| `.claude/commands/session-end.md:296` | "M-7 … file NGOÀI **hook-3-path**" | 🔴 **THẬT — cùng class, cần → 4.** Worker-3 sở-hữu. |
| `.claude/commands/session-end.md:162` | "\| `harness-audit` (k) \| **3 path** `runs/<id>/harness-*-return.md` \|" | 🟢 **DƯƠNG-GIẢ — CẤM sửa.** "3 path" ở đây = **3 file return của bộ-ba**, KHÔNG liên-quan hook. Sweep máy-móc sẽ **làm hỏng** dòng này. |
| `docs/governance/harness-11-engine.md` N.2/N.3 | — | ✅ **worker-1 ĐÃ XỬ**: N.2 = "**4 path cố định** {WAL · agent-memory · runs · **sessions**}"; N.3 reword "path cố định **lúc S111**" (giữ đúng vai câu lịch-sử). Floor ↔ hook nay **khớp**. |
🔸 **Bài rút:** `3 path` là chuỗi **đa-nghĩa** — grep-sweep theo literal phải **phân loại từng hit** trước khi đổi (đúng lớp "citation-trap / use ⟂ mention"). 2 hit sửa được, 1 hit **phải tha**.
🔸 **Ngoài phạm-vi quét CỐ Ý (C8 — đừng rewrite history):** `adap-reports/*` (báo-cáo có ngày) · `agent-memory/*` (nhật-ký vai) · `.claude/WAL.md`. Không đụng.
---
## 🔴 KHAI HỞ CÒN LẠI (không bán quá nấc)
1. **Fire hook trong repo THẬT chưa quan-sát được**`VERIFIED-ON-TEMP-TREE (2 chiều)` + **PENDING lead**. Vật-liệu: `.claude/sessions/session-1/probe.md` (file này **xoá được** sau khi lead verify).
2. **`closed.md` chưa có người ghi** — chân đóng phiên-logic thuộc `/session-end` (VC-2 chờ anh). Ca "pause → đóng thẳng không qua `/tiep`" sẽ **kêu oan**. Hướng hỏng = về phía **hỏi-lại**, không phải im-lặng-bỏ-việc. **KHÔNG được đọc thành "đã kín".**
3. **Nghi-thức KHÔNG chuyển per-L** trong lượt này — chỉ hạ-tầng. Bảng VC-2 vẫn **chờ anh duyệt từng dòng**.
4. **`resume-*` là nghi-thức, không phải code-enforced** — quên ghi ⇒ ORPHAN-L kêu (fail-safe), nhưng vẫn là kỷ-luật người/agent, KHÔNG phải guard có răng.

View File

@ -0,0 +1,154 @@
# sub-implement-D-5vong — Axis D (5-vòng closure + completeness-gate CÓ RĂNG)
> Worker-3 `impl-D-5vong` @S146 · relaunch-cắt-gọt qua `/tiep` (S145 chết giữa chừng).
> **File sở-hữu (disjoint):** `.claude/commands/session-end.md` + `.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md`.
> **VERDICT: DONE** (4/4 việc + 4/4 acceptance PASS, output thật dán bên dưới).
---
## 0 — GROUND-TRUTH đo tươi @S146 (TRƯỚC khi sửa gì)
### 0.1 Folder-state 3 vai-KIỂM (landmine phép-4) — lệnh + output THẬT
```
$ ls -la .claude/agent-memory/tooling-harvest-audit/ .claude/agent-memory/h24-audit/ .claude/agent-memory/sleep-audit/ 2>&1
ls: cannot access '…/.claude/agent-memory/h24-audit/': No such file or directory
ls: cannot access '…/.claude/agent-memory/sleep-audit/': No such file or directory
…/.claude/agent-memory/tooling-harvest-audit/:
total 4
drwxr-xr-x 1 pqhuy 197609 0 Jul 22 18:27 .
drwxr-xr-x 1 pqhuy 197609 0 Jul 22 19:49 ..
```
`tooling-harvest-audit/` **TỒN-TẠI nhưng RỖNG** (0 `MEMORY.md`) · `h24-audit/` + `sleep-audit/` **MISSING**.
⇒ 3 vai **WIRED nhưng CHƯA chạy audit-round THẬT** ⇒ phép-4 = **`not-yet-run (vacuous)`**, KHÔNG FAIL, KHÔNG ĐẠT-ảo.
### 0.2 Ambiguity STALE (VIỆC 1) — xác-nhận trước khi vá
`session-end.md:123` (bản cũ) xếp `h24-audit`/`sleep-audit` vào diện chờ-land về sau ⇒ mâu-thuẫn chính roster Phase 1 (:40-42 đã wire AUTO) + mâu-thuẫn đĩa (3 contract tồn-tại thật).
### 0.3 Phát-hiện thêm TRONG file mình sở-hữu — con-trỏ CHẾT
`session-end.md:42` trỏ **`Phase 4.5`** cho `sleep-audit`. Grep heading file: chỉ có `Phase 1 · 1.5 · 2 · 3 · 4 · 5 · 6`**KHÔNG có Phase 4.5** ⇒ broken-pointer (detector C1 sẽ bắt). Vá trong axis D (V4 = vòng nén-ngủ).
### 0.4 vế-count dòng-nợ — spec ghi "3-vế", ĐĨA in 4 đoạn (đo tươi)
- `scripts/nhip-no-probe.ps1:201` = `Write-Host ("NHIP-NO: kiem {0} | {1} | {2} | {3}" …)`**4 đoạn**
- `:22` usage-doc = `NHIP-NO: kiem … | tran-bo-nho … | run-chua-gom … | pull-cach N ngay` ⇒ 4
- 4 command (`pause:44` · `tiep:112` · `session-start:216` · `session-end:104`) đều gọi **"4-vế"**
- 🔸 **`scripts/nhip-no-probe.ps1:3` header VẪN ghi "3-part debt line" = STALE** — file NGOÀI quyền mình ⇒ **báo lead, KHÔNG tự sửa**
⇒ Gate viết **"dẫn NGUYÊN VĂN dòng script in"** + **trỏ script làm canonical vế-set** (B1), KHÔNG chốt số vế trong doc ⇒ script đổi vế thì gate không stale.
---
## 1 — VIỆC 1: gỡ ambiguity stale (spec D.4) ✅
**File:** `.claude/commands/session-end.md:132` (bullet 🔸 cuối khối (g-bis)).
- Cũ: "vai #2 `h24-audit` + #3 `sleep-audit` land dần sau khi vai này chạy-thử-1-phiên + báo nấc"
- Mới: **"cả 3 vai-KIỂM đã BUILT + WIRED S145 … Mỗi vai chạy audit-round khi vòng tương-ứng chạy, độc-lập, KHÔNG chờ nhau"** + errata 🧊 nêu rõ bản cũ STALE (mâu-thuẫn roster Phase 1 + mâu-thuẫn đĩa) + trỏ `docs/STATUS.md` §Sub-agents cho số roster (B1 — KHÔNG chép số).
🔴 **Citation-trap gặp THẬT (lớp `feedback_citation_trap_selfreference`):** bản vá đầu **dẫn nguyên văn** cụm stale trong ghi-chú errata ⇒ `grep 'land dần sau'` vẫn = **1** (chính dòng vá). Acceptance là grep-trần, KHÔNG có discriminator use⟂mention ⇒ **diễn-đạt lại không tái-tạo literal** ("xếp vào diện **chờ-land về sau**") thay vì bịa discriminator. Sau vá: **0** (cả bản có dấu lẫn không dấu).
**Kiểm chéo :40-42 (yêu-cầu "2 chỗ không nói ngược"):**
- `:40` `tooling-harvest-audit` — "AUTO sau đo §L.b(g-bis)" ✔ khớp end-only tuyệt-đối
- `:41` `h24-audit`**sửa thêm** cho khớp coupling: "@§L.b(j)(ii-bis) nếu cặp nổ ở close, @`session-start` §2.1.8 nếu cặp nổ ở open; *wherever it fires*"
- `:42` `sleep-audit`**sửa** con-trỏ chết `Phase 4.5` → "AUTO sau **mỗi lượt nén** `/sleep-recovery-memory-l2` — post-step của skill, *wherever it fires*: consent @§2.1.2 HOẶC @§L.b(c)" + note 🧊 khai lý-do vá
---
## 2 — VIỆC 2: D2 COMMIT DEFER (option b) + landing site + H24-coupling ✅
**Landing chính:** `session-end.md:124-131` — mục **(vi)** MỚI trong khối (g-bis).
- **Luật 1 dòng** (câu canonical chép sang 3 contract): *"KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close."*
- **3 vế lý-do (viết rõ, không "chưa kịp làm"):** (1) nhịp "hai đầu" buộc tầng **ĐO** 2 đầu (H1/H2 báo-diff @open, wired thật) — KHÔNG buộc tầng **KIỂM**; (2) cột self-verify V1/V2/V4 canonical = **CLOSE-time**, thứ bị chấm chỉ SINH ở close; (3) @open chỉ diff-report đã em-main verify ⇒ **0 artifact authoritative** ⇒ ép KIỂM @open = chấm bản chưa tồn-tại = đúng **ĐẠT-ảo** mà fail-safe NO-OP của cả 3 contract đang cấm.
- **Đánh-đổi + điều-kiện huỷ-defer** khai thẳng: sai @open chỉ soi ở close cùng phiên (trễ, không mất); @open mà sinh artifact authoritative ⇒ **PHẢI xét lại** (defer có điều-kiện huỷ, không đóng vĩnh-viễn).
**H24-coupling — CHỌN option "wherever it fires"** (viết rõ, kèm lý-do + phân ranh 3 vai):
- `h24-audit` bám **cặp H24 wherever it fires**: cặp @§L.b(j)(ii) ⇒ chạy close; cặp @`session-start §2.1.8` (OVERDUE + consent) ⇒ chạy **NGAY tại open, ngay sau cặp**. Lý-do: pin = FLAG-list H24 tươi, **authoritative NGAY khi cặp trả**.
- `sleep-audit` **cùng khuôn** (bám lượt nén — consent @§2.1.2 hoặc @§L.b(c)); pin = `.gist.md` tươi.
- **Chỉ `tooling-harvest-audit` end-only TUYỆT-ĐỐI** (pin H1-chốt + H2-5-trục chỉ sinh ở close).
- Hoà-giải mâu-thuẫn biểu-kiến: **"end-only" = KHÔNG mở nhịp KIỂM RIÊNG @open**; vai vẫn **đi theo con-đo** bất kể con-đo nổ ở đâu.
**3 contract — mỗi file +1 dòng luật (+ coupling riêng):**
| file | dòng | nội-dung |
|---|---|---|
| `.claude/agents/tooling-harvest-audit.md` | `:25` | luật + "end-only **TUYỆT-ĐỐI**", CẤM tự chạy @open |
| `.claude/agents/h24-audit.md` | `:26` (+`:27`) | luật + ngoại-lệ bám cặp H24 *wherever it fires* |
| `.claude/agents/sleep-audit.md` | `:25` (+`:26`) | luật + ngoại-lệ bám lượt nén *wherever it fires* |
Cả 3 **TRỎ** `session-end.md §L.b(g-bis)(vi)` cho lý-do đầy-đủ (B1 — không chép lý-do 3 nơi).
---
## 3 — VIỆC 3: D1 completeness-gate CÓ RĂNG ✅
**Landing:** `session-end.md:145-205`**§L.c MỚI** (sau §L.b(k), trước Phase 2). Trước đó **repo KHÔNG có** completeness-gate trong `session-end.md` (grep `completeness-gate|phép sàn` trên 2 command = 0 hit — nó chỉ sống trong checklist hub `f71c5b65` + run-folder S135). ⇒ đây là **build mới**, không phải sửa chữ.
**RĂNG = luật đọc kết-quả (dòng :150-153):** mỗi phép chỉ mang 1 trong 3 nhãn —
`ĐẠT` (**bắt buộc dán bằng-chứng đĩa**) · `TRƯỢT` (kèm số/path lệch) · `vacuous` (kèm folder-state).
🔴 **"Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT"** + **"đã verify"/"khớp rồi"/trí-nhớ KHÔNG tính**.
🔴 **Chống meta-count (S119):** báo `phép: ĐẠT a / TRƯỢT b / vacuous c` (a+b+c=4); **CẤM** gộp "4/4 PASS" khi còn vacuous; vacuous **không** cộng tử-số.
🔸 Nấc khai thẳng: gate = **evidence-mandate, KHÔNG chặn** đóng phiên (cùng triết-lý Sàn-5 trong chính file: cổng báo-động-giả ⇒ bị bypass ⇒ tự xoá chính nó).
**Bảng 5 vòng chức-năng** (V1..V5, mỗi vòng con-ĐO + con-KIỂM + bằng-chứng tối-thiểu; ô = con-trỏ, KHÔNG chép logic — B1) + luật `không-nhịp` (không ✓, không TRƯỢT, **không được im-lặng bỏ khỏi bảng**).
**4 phép sàn — mỗi phép có disk-evidence requirement + lệnh chạy được:**
| phép | bằng-chứng BẮT BUỘC | chống-bare-PASS |
|---|---|---|
| **1 — tick vs cửa** | **3 SỐ thật**: `cửa = L nhãn + P dừng` + `counter-delta trước→sau` (snippet `git log … \|\| true` + grep `.session-counter.json`) | lệch ⇒ TRƯỢT + **in danh-sách cửa CÂM**; thiếu 3 số ⇒ TRƯỢT |
| **2 — dòng-nợ tại cửa** | **DÁN NGUYÊN VĂN** dòng `NHIP-NO: …` máy in (kể cả `probe-loi (khong chan)`) | tóm-tắt/diễn-giải/"đã in rồi" ⇒ TRƯỢT |
| **3 — closeout đủ nghi-thức** | **PATH THẬT** — bảng 3 closeout × 4 sổ, UNION-per-label (snippet `git log --name-only \| grep -E`) | ô rỗng ⇒ TRƯỢT + tên sổ thiếu + kỳ nào |
| **4 — vai đã-chạy có sổ** | **roles-ran list** + path `.claude/agent-memory/<role>/MEMORY.md` + **byte>0** + mtime | thiếu sổ/0-byte ⇒ TRƯỢT (AS-8) |
Chi-tiết đáng nêu (đều là bẫy đã trả giá thật, ghi vào gate để khỏi tái):
- phép-1 + phép-3 **DÙNG CHUNG regex closeout §L.b(j)(vi)** — placeholder `<regex closeout — lấy ở (j)(vi)>`, **KHÔNG chép bản thứ 2** (B1).
- phép-1 dùng `|| true` (KHÔNG `|| echo 0`) — đúng bẫy `grep -c` mà chính file đã ghi 3 lần.
- phép-2 **trỏ script làm canonical vế-set**, khai luôn lệch tên gọi hub "3-vế" vs script in 4 đoạn.
- phép-3 **CẤM per-commit-naive** (agent-memory vào qua `wal:` cùng kỳ ⇒ FAIL oan; dẫn ca thật S133 `e53a693` + `9f404d3`) + khai proxy không phân-biệt "không chạy" vs "chạy không ghi sổ" (**cả hai đều lỗi** ⇒ vẫn bắt đúng).
**Dòng báo gate** (ASCII, ghi cạnh khối `memory-triple` trong session-log):
`completeness-gate S<nn>: vong <x>/5 chuc-nang (khong-nhip: <ds>) | phep DAT a / TRUOT b / vacuous c`
+ luật: có TRƯỢT ⇒ NÊU ở Phase 4 **+ đổ vào sổ đích** (carry-slug HANDOFF / WAL-line / STATUS-row).
---
## 4 — VIỆC 4: phép-4 landmine "not-yet-run (vacuous)" ✅
`session-end.md:197-200` — mục 3 của phép-4:
- 🔴 Vai **WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state**, **KHÔNG TRƯỢT****KHÔNG ĐẠT** — kèm lệnh `ls -la` 3 folder chạy được.
- 📌 **Baseline @S146 dán vào doc** (mốc 1 lần, KHÔNG lặp mỗi phiên): `tooling-harvest-audit/` tồn-tại **RỖNG** · `h24-audit/`+`sleep-audit/` **MISSING** ⇒ cả 3 = WIRED nhưng CHƯA chạy audit-round THẬT (vai #1 @S145 chỉ spawn-PROBE, cố-ý 0-ghi).
- 🔴 **Chặn ĐẠT-ảo tương-lai (vacuous không phải giấy phép vĩnh-viễn):** khi vòng tương-ứng CHẠY (H1/H2 chốt · cặp H24 chạy · lượt nén chạy) mà vai-KIỂM vẫn không có sổ ⇒ **TRƯỢT thật**, hết cửa vacuous.
- 🔴 Nêu thẳng đây là chỗ dễ ĐẠT-ảo nhất: *"folder trống"* đọc **giống hệt** giữa "chưa tới lượt" và "chạy rồi mà nuốt sổ" ⇒ **phải kèm bằng-chứng vòng đó có/không chạy**, không chỉ kèm `ls`.
---
## 5 — ACCEPTANCE (tự chạy, output THẬT)
```
$ grep -nE 'land d(ầ|a)n sau' .claude/commands/session-end.md ; count=…
count=0 ← bản CÓ DẤU + không dấu (regex phủ cả 2)
$ grep -c 'land dan sau' .claude/commands/session-end.md
count_ascii=0 ← bản ASCII thuần
$ grep -rnE 'KI(Ể|E)M end-only' .claude/agents/
.claude/agents/h24-audit.md:26: …
.claude/agents/sleep-audit.md:25: …
.claude/agents/tooling-harvest-audit.md:25: …
files=3 ← ĐÚNG 3 file
$ grep -n 'phép-1 —|phép-2 —|phép-3 —|phép-4 —|CẤM bare-PASS|TỰ ĐỘNG TRƯỢT' .claude/commands/session-end.md
145: ### §L.c — completeness-gate 5-vòng (D1, land S146 — 🔴 CÓ RĂNG: CẤM bare-PASS)
152: > Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT …
170: 🔎 phép-1 — tick vs cửa · bằng-chứng = 3 SỐ thật
180: 🔎 phép-2 — dòng-nợ tại cửa · bằng-chứng = DÁN NGUYÊN VĂN dòng máy in
184: 🔎 phép-3 — closeout đủ nghi-thức · bằng-chứng = PATH THẬT
194: 🔎 phép-4 — vai ĐÃ-CHẠY phải có sổ · bằng-chứng = roles-ran list + path sổ
$ grep -n 'not-yet-run (vacuous)' .claude/commands/session-end.md
197: 🔴 Vai WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state …
```
**Z — governance-only (git status):** 0 file `src/` · `fe-admin/` · `fe-user/` · `tests/` (`prod_files=0`), 0 migration.
File mình chạm ĐÚNG 4 + sub-file này. (`tiep.md` · `wal-flush.ps1` · `harness-11-engine.md` · `.session-counter.json` modified = **worker-1/worker-2**, KHÔNG phải mình.)
---
## 6 — NGOÀI PHẠM-VI (báo lead, KHÔNG tự sửa)
1. 🔸 **`scripts/nhip-no-probe.ps1:3` header STALE** — ghi *"3-part debt line"* trong khi `:22` + `:201` in **4 đoạn**. File ngoài quyền worker-3. Gate §L.c đã **miễn-nhiễm** (đo nguyên-văn, trỏ script), nhưng header nên vá cho khỏi dạy sai.
2. 🔸 Spec-v2:41 ghi *"phép-2 literal dòng-nợ **3-vế**"* — số này **stale so đĩa** (script in 4). Gate cố-ý KHÔNG chép số vế ⇒ không kế-thừa drift.

View File

@ -0,0 +1,139 @@
# sub-lead-omission-S146 — H24 light-audit #4 (FORCE-FIRE, P=8 pause)
> Vai: `lead-omission-auditor` — soi **CÁI KHÔNG CÓ**. Propose-only, KHÔNG Write/Edit ngoài file này.
> Counter=20 · last_audit.light=17 · P=8 `wal: pause` ⇒ OVERDUE(light). Consent-gate GỠ @S146 ("3 → auto").
> **Ghi đĩa TRONG lúc làm** (anti-#53). Trạng thái: ĐANG CHẠY.
## Tập KỲ-VỌNG (dựng TRƯỚC khi so — H24 §2(1) method)
Nguồn cam-kết đã đọc:
- `docs/HANDOFF.md:6` khối `Carry MỞ re-stamp (14)` — segment mới nhất = **S141S143**, CHƯA có segment S146 (đúng: `/session-end` mới tới BƯỚC 0).
- `docs/HANDOFF.md:7` `NEXT anh` 12 mục · `:8` `NEXT em`.
- `.claude/WAL.md` — 40 dòng, `closing: S146` sentinel treo, chain `[x]×6 + [!]×1`, khối `OWNER-DECISION`, dòng `carry:` (:38-40).
- `.claude/governance/.session-counter.json` — counter/last_audit/class_repeat/history.
- `.claude/agent-memory/memory-budget.json` — enum ĐÓNG 11 class · `h24_cadence` · `token_governor`.
- run-folder `runs/2026-07-22-S145-apply-hub-answers/` (13 file) — `implement-synthesis.md` + `sub-reviewer-precommit-s146.md`.
Đo cơ-học (chống bẫy mega-line): `grep -o '\[carry:[a-z0-9-]*\]' docs/HANDOFF.md | wc -l` = **142 occurrence / 22 distinct tag** (grep -c ra 34 dòng — KHÔNG dùng).
## FLAG (ghi ngay khi tìm ra)
---
### FLAG-1 · MED-HIGH · `gap-owner-specifics`
**Owner-decision `[7]` bị GHI ĐÈ mất hẳn vì slot-index bị tái-dụng.**
- **hứa ở:** `.claude/WAL.md` @ commit `ad02483` (`wal: flush 20260722T2305`) **và** `9c68bae` (`…T2310`), khối `## OWNER-DECISION (ghi de, KHONG hoi lai)`, nguyên-văn:
`[7] "con lai xu ly het xong roi session-end" = uy quyen commit+push + chay session-end`
- **hiện:** **VẮNG.** @ `e7d06f2` (`…T2326`) slot `[7]` bị **thay** bằng `[7] session-model: (1)…(2)…(3)…`; @ HEAD `c2d1a05` chỉ còn `[5][6][7]`. Grep 4 bề-mặt bền:
`grep -rn "con lai xu ly|còn lại xử lý|uy quyen|ủy quyền" docs/ .claude/WAL.md .claude/sessions/ .claude/governance/`**0 hit**.
Session-log `2026-07-22-2350-S146-…md` (4457 B) ⇒ **0 hit**. pause-block + resume-block ⇒ **0 hit**.
- **im:** ~20 phút sống rồi mất; tính đến giờ **0 sổ bền nào** giữ nó.
- **vì sao là THIẾU, không phải "xong rồi":** phần "chạy session-end" đang chạy thật, nhưng phần **"uỷ quyền commit+push"** thì lead đang làm **NGƯỢC**: `WAL:29-30` `next:` ghi *"toi Phase 5 HOI ANH truoc khi push"*`resume-S146-…md:29` ghi *"5 squash→push (**HỎI ANH trước khi bấm**)"*. Tức lead sắp hỏi lại đúng thứ owner đã trả lời — mà khối này tự đặt tên là **"ghi đè, KHÔNG hỏi lại"**. Nếu lead cố-ý siết chặt hơn owner thì đó là quyết-định riêng và **phải khai**, hiện **không khai ở đâu**.
- **resolve:** chép nguyên-văn uỷ-quyền `"còn lại xử lý hết xong rồi session-end"` vào segment HANDOFF S146 (mục owner-decision) HOẶC vào session-log §"Owner chốt"; nếu lead vẫn muốn hỏi lại trước push thì ghi 1 dòng lý-do. Hết flag khi 1 trong 2 tồn tại trên đĩa.
- 🔸 **Cơ-chế đứng sau (INFORM-3 bên dưới):** khối `OWNER-DECISION` trong WAL là **index-keyed + overwrite-in-place**, không có vết eviction — nên quyết-định `[N]` cũ bị quyết-định `[N]` mới **âm-thầm** thế chỗ. Đối-chứng: `.session-counter.json` `history[]` cố-ý **append-unbounded** với ghi-chú *"absence of a marker = never-happened (safe semantics)"*. Hai sổ cùng nhà, hai ngữ-nghĩa ngược nhau, chưa ai đối-chiếu.
---
### FLAG-2 · MED-HIGH · `gap-incident-unrecorded`
**Sự-cố vận-hành S144 chỉ có vết trong run-folder, 0 hit trên MỌI sổ bền — trong khi sổ đếm vẫn quảng-cáo con số của kỳ TRƯỚC.**
Hai sự-cố, cùng một lượt chạy `runs/2026-07-22-S144-trio-first-run/`, cùng một lỗ ghi-sổ:
**(a) `#53` garble fire THẬT trên `harness-audit` (S144, ~16:35).**
- **vết:** `trio-synthesis.md:20-21`*"`harness-audit` lượt-1 trả mẩu giữa chừng → SendMessage-resume → mới có return đầy đủ. Vai này **không ghi đĩa**, nên nếu phiên chết lúc đó thì **mất trắng**."*
- **0 hit trên 5 sổ bền:** `.claude/WAL.md` (grep `garble|#53` = 0) · `docs/HANDOFF.md` (grep `S144` = 0, `harness-audit` = 0) · `docs/STATUS.md` (`S144`×`garble` co-occurrence = **0**) · `docs/governance/error-ledger.md` (grep `S144|S145|S146` = **0**, `harness-audit` = 0) · sổ đếm `.claude/auto-memory/feedback_agent_return_garble_recover.md`.
- **quảng-cáo kỳ TRƯỚC (dấu-hiệu gốc của class):** sổ đếm dừng ở **`+ S143 ×5 = ×25 tổng`**; `mtime = 2026-07-22 14:02`, commit cuối `a1e2416`**TRƯỚC** lượt trio 16:0516:35. `docs/STATUS.md` in `×20 qua S118 → ×23 qua S143` (còn lệch nội-bộ với ×25, nhưng **đó là view-turf**, không phải của tao).
- 🔴 **Chính sổ đó tự tiên-đoán ca này:** dòng cuối `feedback_agent_return_garble_recover.md` ghi *"sổ này **từng đứng yên 8 nhãn phiên** (×20 từ S118) trong khi class vẫn fire — chính là ca đẻ ra class `gap-incident-unrecorded` (@S143 owner mở enum)"*. Nay lặp lại sau **2 nhãn phiên** (S144→S146).
**(b) Lead tự-sai khi đo + **thu hẹp tập đối-chứng mà im lặng** (S144).**
- **vết:** `trio-synthesis.md:23-30` — lead ghi `run.md` hotload **538.529 B** / headroom **200.490** trong khi đĩa thật **540.724** / **199.759**; nguyên-nhân: lead **sửa chính vật vừa đo** (`agents/README.md` +2.195 B) rồi **chép lại số TRƯỚC khi sửa** và dán nhãn *"đo tươi"*. Nặng hơn: header scribe ghi *"đối chứng **4 mốc** lead: 0 LỆCH"* trong khi khối liệt **5 mốc**, mốc thứ-5 **chính là mốc lệch** — loại khỏi phép đối-chứng mà **không khai**. Con KIỂM tự kết luận: *"Đây đúng class `meta-count self-coverage blind-spot`."*
- **0 hit:** `docs/governance/error-ledger.md` (không có E-row/AS-row nào cho S144) · `.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md` **mtime `2026-07-15 11:15`, commit cuối `23bbe97` (2026-07-15)****tái-phát của một class ĐÃ CÓ TÊN mà sổ của chính class đó không nhích một byte**.
**(c) 3 lỗi lead @S146** (phép quét sửa 4 lần · trả lời SAI về `/snapshot` · residual F1 có người chỉ vẫn rơi) — 🔸 **KHÔNG tính vào FLAG này**, vì chúng **CÓ** vết bền: `docs/changelog/sessions/2026-07-22-2350-…md:21-28` mục *"🔴 3 lỗi của LEAD trong phiên (ghi để không tái)"* + `pause-S146-…md` mục (1)D và (2). Khai thật: **đã ghi**, chỉ **chưa** vào `error-ledger` — mà `§L.a` RCA thuộc Phase 1.5 **chưa chạy**, nên chưa đủ điều-kiện fire. Xem INFORM-1.
🔴 Riêng **"sweep consent sót 6 site"** (do `lead-view-auditor` bắt cùng phiên): tao **KHÔNG** đo được nó từ đĩa trong lượt này (chưa đọc output vai kia) ⇒ **không đưa vào FLAG**, tránh nhận-vơ phát-hiện của vai khác. Nếu em-main xác nhận nó là sự-cố thật thì nó **cùng lớp (b)/(c)** và đi chung resolve.
- **resolve:** (i) §L.a RCA ghi **≥1 E-row** cho lượt S144 (garble + meta-count-narrowing), gắn AS-class có sẵn hoặc mở AS mới; (ii) bump sổ đếm garble `×25 → ×26` **ở CUỐI phiên** (đúng luật (c) mà chính sổ đó đã tự viết); (iii) chạm `feedback_meta_count_selfcoverage_blindspot.md` với data-point S144. Hết flag khi cả 3 có byte trên đĩa.
---
### FLAG-3 · MED · `gap-decision-sunk`
**2/3 mục khối "Chờ-anh" `spec-adap-dot-9-10:68` KHÔNG được đưa lên bàn @S146 — đúng lúc owner đang ngồi trả lời câu ANH EM SONG SINH của chúng.**
- **hứa ở:** `runs/2026-07-20-S141-…/spec-adap-dot-9-10-20-07-2026.md:68` khối *"Chờ-anh (không block implement)"* → đã được kéo lên `docs/HANDOFF.md:7` **NEXT anh (10)(11)(12)** @closeout S143 (chính tao bắt @S143, `gap-decision-sunk`).
- **hiện:** grep 3 bề-mặt S146 (`.claude/WAL.md` · `.claude/sessions/session-1/*.md` · session-log `2026-07-22-2350-…md`):
- `refine`**0 hit** ⇒ mục (10) *ratify ranh `refine ⟂ lead-omission`* **không được nhắc một lần**.
- `consent`**5 hit**, nhưng **TẤT CẢ** là khẳng-định trạng-thái, **không có câu hỏi nào**: `WAL:17-18` *"go consent H24 3 cho … sleep/trio VAN consent"* · `pause-block:16` *"gỡ cổng NGƯỜI (consent) ở 3 chỗ"* · `pause-block:23` *"**sleep + trio VẪN consent**; 3 cổng nay không còn cùng khuôn, cấm suy một ra ba"*. Mục (12) *consent-form trio **dài hạn** — mỗi phiên gật hay thành luật đứng* ⇒ **0 lần được hỏi**.
- **im:** sunk từ `spec:68` (S141) → tao bắt @S143 → lên NEXT anh @S143**S144, S145, S146 = 3 nhãn phiên nữa, 0 lần tiến thêm.**
- 🔴 **Đòn bẩy phân-biệt "bỏ sót" ⟂ "owner chủ-động gác"** (cùng khuôn `pull_warn_days` @S143):
1. **Bất-đối-xứng trong CÙNG một dòng WAL.** `WAL:17-18` viết liền: *gỡ consent **H24*** … *sleep/trio **VẪN** consent*. Owner được hỏi và trả lời về cổng H24; cổng trio — **cùng cơ-chế, cùng câu, cách nhau 6 chữ** — không được hỏi. Chính lead viết *"3 cổng nay **không còn cùng khuôn**"* — đó đúng là khoảnh-khắc phải hỏi *"vậy khuôn của 2 cổng kia là gì?"*, và câu hỏi đó **đã nằm sẵn** ở NEXT anh (12).
2. **Mục (12) đã bị hub ĐÁ VỀ SE** (`58e28bae` Câu-3) ⇒ không còn ai khác trả lời hộ; SE im = chìm luôn.
3. **Mục (10) nay NẶNG hơn lúc phát-hiện:** `harness-refine` **đã chạy runtime lần đầu @S144** (`runs/2026-07-22-S144-trio-first-run/harness-refine-return.md`, 14.321 B) ⇒ cái ranh **wire-trước-khi-ratify** (`harness-refine.md:22-30`) nay **đã được thi-hành thật**, chưa ai duyệt. Đây là ranh chia việc với **chính vai này** — tao khai xung-đột lợi-ích và vẫn báo, vì im mới là sai.
4. **Đối-chứng "vắng vì XONG":** mục (11) *5 câu session-model* **KHÔNG** flag — vì @S146**tiến thật** (`session_ctx_kb`=64 owner-set · hook 3→4 path landed · folder-form chốt scaffold). Cùng khối, cùng tuổi, một mục tiến / hai mục 0 ⇒ khác biệt nằm ở **agenda do lead dựng**, không ở ý-chí owner.
- **resolve:** đưa (10) + (12) vào **NEXT anh** của segment S146 với 1 dòng nêu rõ "đã treo N phiên + nay đã chạy runtime", HOẶC owner nói rõ "giữ treo" ⇒ hạ xuống INFORM-only. Hết flag khi 1 trong 2 có byte trên đĩa.
---
### FLAG-4 · MED · `gap-carry-dropped`
**Tập việc-mới sinh @S146 bị TÁCH ĐÔI giữa 2 sổ, KHÔNG sổ nào giữ đủ — và sổ sắp bị RESET lại là sổ giữ nhiều hơn.**
Đây **không** phải dự-đoán: hai sổ đang **lệch nhau ngay lúc này**, đo được.
| việc mới (hub-floor + bookend) | `.claude/WAL.md:38-40` (`carry:`) | session-log `…2350-…md:36-41` ("Còn treo") |
|---|---|---|
| `_snapshot-k` + lệnh chụp-nhanh không-dừng | ✅ | ✅ (1) |
| `_context` tầng **STOCK** + nén | ✅ | ✅ (2) |
| `/pause` **tự chụp** trước khi dừng | ✅ | ❌ **VẮNG** |
| `/tiep` đọc snapshot mới nhất + **phòng cửa-sổ-sập** | ✅ | ❌ **VẮNG** |
| **meld-forward** qua squash — chưa đo | ✅ | ✅ (4) |
| **bookend đủ 5/5 vòng** | ❌ **VẮNG** | ✅ (3) |
| **hợp (union) = 6** | **5/6** | **4/6** |
- **hứa ở:** `.claude/sessions/session-1/pause-S146-20260722T2328.md:37-47` (bảng "GAP hub-floor mới lộ" 5 dòng + đoạn "Nghi-vấn còn treo" = bookend 5/5) — đây là **nguồn đầy đủ nhất**, đủ cả 6.
- **hiện:** WAL 5/6 · session-log 4/6 (bảng trên, `grep` từng cụm).
- **vì sao NGUY:** `next:` của chính WAL (`:29-30`) ghi Phase 6 = **reset WAL**. Sau reset, hai vật còn sống ở tầng work-state là **session-log + HANDOFF**. ⇒ hai mục `/pause tự-chụp``/tiep đọc snapshot + phòng cửa-sổ-sập` **chỉ còn sống trong `pause-block`** — mà `pause-block` là artifact **theo-cửa-sổ**, `/tiep` chỉ đọc **cái mới nhất**, không phải sổ backlog. Đây đúng hình "tổng nhìn vẫn ổn nên không ai kêu" của `gap-carry-dropped` @S143.
- **máy mù chỗ này (đúng thiết-kế):** cả 6 mục **chưa có tag `[carry:*]`**`H24-2` không nhìn thấy. Đo tươi phiên này: detector chỉ soi **6/14** carry có tag (`[ok] pull-warn-threshold` · `[ok] tools-whitelist-no-teeth` · `[ok] session-model-adopt` + 3 dòng FIRE). Không token nào để grep ⇒ **không detector nào bắt được**.
- **im:** sinh @S146 (~23:26 WAL / ~23:50 log), lệch ngay từ lúc sinh.
- **resolve:** segment HANDOFF S146 ghi **đủ 6** mục, gắn tag `[carry:*]` (đề-xuất: `[carry:hub-floor-snapshot]` · `[carry:context-stock]` · `[carry:pause-tu-chup]` · `[carry:tiep-doc-snapshot]` · `[carry:meld-forward]` · `[carry:bookend-5-5]` — tên do lead chốt), và **con số khối carry phải là `14 + 6 = 20`**, không phải `14`. Hết flag khi khối carry mới chứa đủ 6.
🔸 Nếu lead cố-ý gộp 6 → ít mục hơn thì **được**, miễn khai rõ gộp gì vào đâu (gộp-có-khai ≠ rơi-âm-thầm).
---
## KHÔNG fire — và lý-do (khai thật, không phải "chưa soi")
**`gap-carry-aged` — ĐỌC detector, KHÔNG tự tính.** `governance-detectors.ps1` H24-2 phiên này in `M = 6 (read from config)`, 66 logic-segment / 19 carry-line, FIRE **3**:
`uat-s134-luyke` streak **7** · `uat-s133-budget-freeze` streak **9** · `hook-vs-budget-cap` streak **13** (≥ M=6).
**KHÔNG fire** vì cả 3 đều đang nằm trên `HANDOFF:7` **NEXT anh** (4)(5)(7) = owner **chủ-động giữ**, đúng anti-pattern #3**INFORM-only**. Y hệt S143, **không báo lại như mới**.
**`gap-underfill` — 0, có lý-do, KHÔNG phải bỏ soi.** Không tồn tại phép đo để so: phiên vào bằng `/tiep`**không có** `session-start §2.1.6` %-print; `session-end §L.b(c)` %-print nằm ở **Phase 1.5 CHƯA CHẠY**. `token_governor.lead_tokens = 380000``crystallized_backfill.target = 210000` đều không có dòng thực-nạp nào trên đĩa phiên này ⇒ **bất-khả-đo**, không phải "đủ". Đã cân-nhắc-rồi-BÁC ứng-viên *"spawn-prompt cho 3 worker mỏng so với 50K wf-sub"*: `sub-implement-*.md` 12.920.8 KB là **return**, không phải input ⇒ không suy ra được input-fill. Trùng INFORM-2 @S143, **repeat, không báo mới**.
**`gap-owner-specifics` cho 2 câu còn lại — 0, vì lead ghi ĐỦ.** Kiểm từng chữ:
- *"1 → tường minh"* ⇒ `memory-budget.json:7` `_session_ctx_kb_owner_set` chép **nguyên-văn** `"anh chot '1 -> tuong minh'"` + giữ nguyên caveat ghost-wire (`:8`) ⇒ ĐỦ, thậm chí giữ cả phần bất-lợi.
- *"1 và 2 → giống hub. 3 → auto."* ⇒ session-log `:12` chép **nguyên-văn cả câu**, + `:13-15` bung 3 specifics (tách cấp-SỐ ⟂ tạo-THƯ-MỤC · `closed.md` FROZEN 4 trường NO-OP-im-lặng · *"auto = bỏ HỎI, không phải bỏ ĐẾM"*); `pause-block:13-17` trùng khớp. ⇒ ĐỦ. **Chỉ mỗi vế "còn lại xử lý hết xong rồi session-end" là mất** → FLAG-1.
**`gap-incident-unrecorded` cho 3 lỗi lead @S146 — 0.** Có vết bền thật (session-log `:21-28` + pause-block (1)D/(2)) ⇒ **không** thoả "0 hit mọi sổ". Chỉ chưa vào `error-ledger`, mà `§L.a` chưa chạy → INFORM-1.
---
## INFORM (không phải FLAG)
1. **`error-ledger` = 0 hit cho S144/S145/S146.** `§L.a` RCA thuộc Phase 1.5 chưa chạy nên **chưa fire**. Khi chạy, đây là 5 ứng-viên: 3 lỗi lead S146 + 2 sự-cố S144 (FLAG-2). 🔸 Quan-sát class: *"kết-luận VẮNG-MẶT từ một tập-đo HẸP"* nay đủ **3 ca**: `AC4 grep-theo-SỐ` (S143, 2 site liệt-kê-TÊN lọt) · `phép quét siết LỆCH TRỤC` (S146-F2, lọt 4/11) · `"không có /snapshot"` (S146, kết-luận từ đĩa SE mà không mở manifest hub `101e69d6`). Bảng `AS-1…AS-16` **chưa có row nào** cho class này. Đề-xuất mở AS-17 — **quyền lead/owner, tao chỉ nêu**.
2. **Cam-kết `NEXT em` "MFE GOODHART-WARN strikes 21→23 theo dõi" (`HANDOFF:8`) = 0 hit** trên `WAL` · `pause-block` · `resume-block` · session-log. Đĩa: `.claude/agent-memory/.mfe-state.json` `strikes_total: 23`, mtime `16:26` = do lượt **trio S144** chạm, **không phải quan-sát của lead**. Chưa fire vì memory-triple ở Phase 1.5 chưa chạy; **nếu closeout đóng mà 0 dòng MFE thì đó là `gap-carry-dropped` thật.**
3. **Cơ-chế: khối `OWNER-DECISION` trong WAL là index-keyed, overwrite-in-place, KHÔNG vết eviction** (nguyên-nhân gốc FLAG-1 — `[7]` cũ bị `[7]` mới thế chỗ, không dòng nào ghi lại). Đối-chứng cùng nhà: `.session-counter.json` `history[]` cố-ý **append-unbounded**, tự khai *"absence of a marker = never-happened (safe semantics)"*. Hai sổ, hai ngữ-nghĩa ngược nhau, chưa ai đối-chiếu. Đề-xuất rẻ: cấm tái-dụng số slot trong cùng phiên (chỉ nối `[8]`).
4. **Coverage-gap S140/S143 còn nguyên** — H24-2 chỉ soi carry **có tag trong NEXT-segment** (6/14 phiên này); cụm 7-carry đồng-tuổi S117/S118 và 6 việc-mới đều **vô hình** với phép đo tuổi. **Repeat, không báo mới**; nêu để INFORM-2 của FLAG-4 không bị đọc thành phát-hiện mới.
5. **`adap-synthesis.md:35`** giữ một nợ đo chưa ai gánh: chỉ-thị anh *"Nhớ chú ý đọc thật kỹ bọn mày rất hay sót"* được đáp bằng thiết-kế *"mỗi file ≥2 người đọc, lăng-kính KHÁC nhau"*, nhưng *"hiệu-lực của phép đó **chưa có phép đo hậu-kiểm**; đừng đọc thành 'đã chứng minh không sót'"*. Không xếp vào enum (không phải quyết-định-treo, không phải carry) ⇒ nêu **verbatim**, **KHÔNG bịa class**.
---
## TỔNG
**TOTAL: 4 FLAG** — phân-rã theo class (cho `jump_on_class_repeat` = 3):
- `gap-owner-specifics` ×1 (FLAG-1) → tally **2 → 3** 🔴 **CHẠM JUMP** (S140 ×1 → S143 ×2 → S146 ×3)
- `gap-incident-unrecorded` ×1 (FLAG-2) → tally **0 → 1** (lần đầu fire kể từ khi owner mở enum @S143)
- `gap-decision-sunk` ×1 (FLAG-3) → tally **1 → 2**
- `gap-carry-dropped` ×1 (FLAG-4) → tally **1 → 2**
- `gap-carry-aged` **0 fire** (3 detector-hit đều owner-held ⇒ INFORM) · `gap-underfill` **0** (bất-khả-đo, có lý-do)
🔴 **META-COUNT self-check:** con số 4 ở trên là **đếm từ 4 mục `### FLAG-n` có thật trong file này**, không phải ước-lượng. `gap-owner-specifics` chạm ngưỡng jump=3 ⇒ **đây là số đo, không phải đề-nghị** — quyết kéo nhịp là của em-main/owner.
**Phạm-vi tao KHÔNG soi (tránh lấn):** mọi thứ "CÓ nhưng LỆCH" — `HANDOFF:5` còn khai *"trio CHƯA spawn lần nào"* trong khi trio đã chạy @S144 · `HANDOFF:7` NEXT anh (1) còn đòi restart+gật · `HANDOFF:8` khai *"H24 deep tới hạn"* trong khi `deep_at_counter=17` ⇒ mốc kế 32 · `STATUS` in `×23 qua S143` vs sổ đếm `×25` · `migration-todos.md` (mtime 2026-05-28) còn `[ ] Audit 2026-07-01` dù đã chạy S96 — **tất cả là `lead-view-auditor` turf**, tao nêu con-trỏ chứ không tính vào TOTAL.

View File

@ -0,0 +1,66 @@
# sub-lead-view-S146 — H24 vai-STALE (force-fire @S146 closeout)
> Vai: `lead-view-auditor` (H24 §2(1) — soi VIEW LỆCH SOURCE). Propose-only, KHÔNG sửa file.
> Force-fire: `session-end §L.b(j)(vi)` P=8 `wal: pause` ⇒ OVERDUE(light) bất kể counter. Consent-gate ĐÃ GỠ (owner @S146 "3 → auto").
> counter=20 · `last_audit.light_at_counter`=17 · nhịp tự-nhiên chưa tới (17+6=23).
> Nền máy: `governance-detectors.ps1` TOTAL 47 (KHÔNG chạy lại — chỉ lăng-kính ngữ-nghĩa).
> Ghi ĐĨA TRONG LÚC LÀM — mỗi FLAG append ngay khi tìm ra.
---
## FLAG-1 — `view-stale-status` — MED
- **view:** `.claude/commands/tiep.md:100` — Sàn-3 §0 block ⑤ ORPHAN-L, gạch đầu dòng 🔴 "Khai hở (chống ghost-wire H18)": khai `closed.md` thuộc nghi-thức `/session-end` nhưng còn ở trạng-thái chưa-được-wire, lý-do nêu là "bảng VC-2 còn chờ anh duyệt".
- **source:**
- `.claude/commands/session-end.md:363` — "§6.3-bis … Chân này **trước S146 CHƯA wire****Nay đóng.**"
- `.claude/commands/session-end.md:365-369` — nghi-thức ĐÃ CÓ NGƯỜI GHI: ghi `.claude/sessions/session-<N>/closed.md`, FROZEN, 4 trường tối-thiểu, idempotent NO-OP nếu đã tồn-tại, NO-OP im-lặng nếu 0 thư-mục.
- `.claude/commands/session-end.md:367` — nói THẲNG vào chính block đang stale: "⇒ `tiep.md §0` block **⑤ ORPHAN-L** hết kêu oan."
- `.claude/WAL.md:9` owner-decision `[7]` — "(2) closed.md = **WIRE**"; `.claude/WAL.md:17` — "**§6.3-bis** closed.md FROZEN 4-truong idempotent NO-OP".
- **lệch cụ-thể:** view nói cơ-chế **chưa có người ghi + còn chờ owner duyệt**; source nói owner **đã chốt WIRE** và nghi-thức **đã land trong CÙNG phiên S146**. Hai câu ở hai file cùng lớp `.claude/commands/` nói ngược nhau về CÙNG một cơ-chế.
- **KHÔNG phải nhiễu — đây là dư-lượng thật, không phải lineage:** câu ở :100 viết ở thì HIỆN-TẠI, không có dấu 🧊 (repo dùng 🧊 rất nhất-quán cho lineage — xem chính `tiep.md:69`, `:76`, `session-end.md:119`, `:140`). Nó còn kéo theo một hệ-quả SAI: "chỉ ca *pause rồi đóng thẳng không tiep* mới thiếu đối-ứng" — ca đó nay **đã có** đối-ứng.
- **Nghịch-lý nội-tại (bằng-chứng mạnh nhất, cùng file):** MÁY ở ngay trên đã wire rồi — `tiep.md:89` ghi đối-ứng gồm "hoặc closed.md do đóng-L", `tiep.md:94` `c=0; [ -f "$d/closed.md" ] && c=1`, `:95` `[ "$p" -gt $((r + c)) ]`. ⇒ **code đọc `closed.md` thật, chỉ PROSE còn nói "chưa wire"**. Đây là lật-ngược của ghost-wire (H18 class-2 defined-but-unread): ở đây là **wired-but-declared-unwired** — và trớ trêu là nó nằm đúng dưới nhãn "chống ghost-wire H18".
- **resolve:** `tiep.md:100` lật sang trạng-thái đã-wire + trỏ `session-end.md §6.3-bis`, HOẶC hạ nguyên câu cũ xuống 🧊 lineage (giữ vết theo khuôn repo). Kèm sửa hệ-quả "chỉ ca … mới thiếu đối-ứng". Hết flag khi 0 surface `.claude/commands/**` còn khai `closed.md` chưa-wire ở thì hiện-tại.
- **Ghi-chú ranh-giới:** KHÔNG flag `.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-CE-sessionmodel.md:272` (câu tương-tự) — run-trace S145 = **snapshot đóng-băng đúng thời-điểm ghi**, sửa nó mới là sai (bẫy #3 frozen-by-design).
---
## FLAG-2 — `view-residual-asym` — MED
**Cùng gốc FLAG-1 (`closed.md` đã wire) nhưng surface KHÁC, và ở đây bất-đối-xứng nằm NGAY TRONG MỘT FILE.**
- **view:** `docs/governance/session-model-se-draft.md` — 3 site còn khai `closed.md` chưa-wire:
- `:5` — khối "⏳ CHƯA — vẫn chờ anh duyệt bảng VC", câu cuối khẳng-định `/session-end` chưa ghi `closed.md`.
- `:54` — 🔴 "Chân này CHƯA wire (nghi-thức closeout thuộc VC-2 còn chờ anh) — khai rõ, không claim kín."
- `:113` — 🔴 "Hở CÒN LẠI, khai thẳng: … chưa wire (VC-2 chờ anh) ⇒ ca *pause rồi đóng thẳng không qua /tiep* sẽ kêu oan."
- **source:** `docs/governance/session-model-se-draft.md:81`**CÙNG FILE**, bảng §4-bis "OWNER-DECISION @S146", cột **"Đã land @S146"**, dòng 2 `Wire closed.md | giống hub | session-end §6.3-bis — … Khoá nốt vòng ORPHAN-L ⇒ hết kêu oan ca "pause rồi đóng thẳng"`. Đối-chứng ngoài file: `.claude/commands/session-end.md:363-369`.
- **lệch cụ-thể:** :81 nói **đã land + đã khoá ORPHAN-L**; :113 nói **chưa wire + vẫn kêu oan** — hai câu **phủ-định nhau từng chữ** về cùng một ca. :5 và :54 cùng phía với :113.
- **Vì sao là residual-asym chứ không phải "doc cũ chưa ai đụng":** file này **ĐÃ được sửa @S146** — header `:3` tự khai *"CẬP-NHẬT TRẠNG-THÁI @S146 … sửa cho khớp đĩa"*, `:72` đã lật meld-forward-gap sang ✅ ĐÃ ĐÓNG, `:81` mới thêm. ⇒ đợt sửa **có chạy**, chỉ **không phủ hết**. Đúng chân-dung "sửa nguồn quên gương", lần này gương nằm cùng file.
- **Nguy-hiểm riêng của site :5:** nó là **khối trạng-thái ĐẦU FILE** — người đọc (kể cả hub khi review) dừng ở đó. Một khối tự nhận "cập-nhật @S146" mà nội-dung sai thì **đáng tin hơn nên hại hơn** một dòng cũ không ai cập-nhật.
- **resolve:** lật :5 / :54 / :113 sang trạng-thái đã-wire (hoặc hạ 🧊 lineage), giữ nguyên :81. Hết flag khi trong `session-model-se-draft.md` **0 câu ở thì hiện-tại** nói `closed.md` chưa wire.
---
## FLAG-3 — `view-residual-asym` — MED
**Suspect #1 của lệnh — VERIFY ĐỘC-LẬP: sweep "gỡ consent H24" @S146 CHƯA phủ hết. Còn 6 occurrence / 2 file.**
- **source (sự-thật mới, 3 nguồn khớp):**
- `.claude/commands/session-end.md:106` §L.b(j)(ii) — "OVERDUE → 🔴 **SPAWN AUTO, KHÔNG consent** (owner chốt @S146: "3 → auto"; THAY luật consent-gate era-S122)".
- `.claude/commands/session-start.md` §2.1.8(e) — "OVERDUE(light|deep) → 🔴 **SPAWN AUTO cặp H24 NGAY, KHÔNG consent** (owner chốt @S146 "3 → auto")" + "⚠️ **KHÁC** sleep-check §2.1.2 (vẫn CONSENT) và **KHÁC** trio §2.1.9 (vẫn CONSENT) — 3 cổng nay **không còn cùng khuôn**".
- `.claude/WAL.md:9` owner-decision `[7](3)` — "V2 = **auto** (go cong NGUOI, GIU cong NHIP 6/15/3)".
- **view — 6 site còn khai H24 = consent-gated, tất cả ở thì hiện-tại, KHÔNG có dấu 🧊:**
| # | site | nguyên-văn (rút gọn) | vì sao SAI |
|---|---|---|---|
| 1 | `.claude/commands/session-end.md:110` | h24-audit AUTO "(owner S145, **KHÁC (ii) consent-gate của chính H24**)" | (ii) ở `:106` nay **cũng** auto ⇒ vế tương-phản **sụp**; câu tự-mâu-thuẫn với dòng cách nó 4 dòng |
| 2 | `.claude/commands/session-end.md:110` | Fail-safe: "H24 KHÔNG chạy phiên này (chưa nhịp / **không consent**)" | nhánh `không consent` nay **không thể xảy ra** = nhánh chết |
| 3 | `.claude/commands/session-end.md:135` | "cặp chạy @`session-start` §2.1.8 (**OVERDUE + anh consent**)" | §2.1.8 nay là OVERDUE ⇒ auto, **không có** vế consent |
| 4 | `.claude/agents/h24-audit.md:4` (frontmatter `description`) | "AUTO fire SAU khi cặp H24 chạy (… session-start §2.1.8 khi **OVERDUE+consent**)" | 🔴 nặng nhất — `description` **được nạp vào mô-tả vai**, sai ở đây lan sang mọi lượt spawn |
| 5 | `.claude/agents/h24-audit.md:25` + `:27` | "(session-end §L.b(j) hoặc session-start §2.1.8 khi **OVERDUE + anh consent**)" ×2 | như #3 |
| 6 | `.claude/agents/h24-audit.md:28` | Fail-safe: "H24 KHÔNG chạy phiên đó (chưa tới nhịp / **anh không consent**)" | như #2 — nhánh chết |
- **Bằng-chứng đây là sweep-sót, KHÔNG phải "chưa tới lượt sửa":** lead **đã truy đúng class này và tuyên-bố đóng**`session-model-se-draft.md:85` ghi *"Kết-nhiễm đã chặn: **2 chỗ** (`session-end §L.b(k)(i)` · `session-start §2.1.9(a)`) viện 'trio consent cùng khuôn sleep-check + H24' … **đã gỡ vế H24**"*. Kiểm 2 chỗ đó: `session-end.md:140` ✅ đã gỡ · `session-start.md:253` ✅ đã gỡ. ⇒ sweep **chạy đúng, đếm sai phạm-vi**: nó tìm nơi H24 bị **viện làm khuôn cho vai khác**, mà bỏ nơi H24 bị **viện làm mốc tương-phản** ("KHÁC (ii) consent-gate") và nơi nó nằm trong **điều-kiện fire của vai khác** ("§2.1.8 khi OVERDUE + anh consent").
- 🔴 **Đây là TÁI-DIỄN nguyên si bài S143** (`agents/README.md:28` tự ghi): sweep đặt acceptance theo **hình-dạng chuỗi** ⇒ "0 hit" ⇒ tuyên-bố sạch, trong khi site sống dùng **cách diễn-đạt khác**. S143 là enum-tên-vs-grep-số; lần này là consent-như-chủ-ngữ vs consent-như-tham-chiếu-chéo. **Cùng một lớp lỗi, cách nhau 3 nhãn phiên.**
- **Hệ-quả vận-hành thật (không chỉ prose):** `h24-audit` là vai **AUTO bám cặp H24 wherever it fires**. Contract của nó (`h24-audit.md:25/:27/:28`) dạy rằng cặp H24 chỉ fire *khi anh consent*. Một lượt chạy `h24-audit` đọc đúng contract của mình có thể **NO-OP nhầm** ở đầu `session-start` (thấy "không consent" ⇒ tưởng cặp không chạy) — đúng ca **ĐẠT-ảo im-lặng** mà chính `:124` cấm ("Auto ≠ chạy-mù").
- **resolve:** gỡ vế consent ở 6 site (`session-end.md:110` ×2, `:135`; `h24-audit.md:4`, `:25`, `:27`, `:28`); fail-safe rút về **một** điều-kiện `chưa tới nhịp`. Hết flag khi grep `consent` trong `.claude/agents/h24-audit.md` + `.claude/commands/session-end.md` **không còn occurrence nào gán cho H24** (sleep-check §2.1.2 + trio (k)(i)/§2.1.9 **GIỮ** — 3 cổng nay khác khuôn).
- ⚠️ **CẨN-TRỌNG khi vá (bẫy tự-tham-chiếu W0.4):** `session-model-se-draft.md:85``session-end.md:119` **cố-ý** chứa chữ "consent" để kể luật CŨ (🧊 RETIRED). Đừng quét mù theo chữ `consent` rồi xoá luôn 2 chỗ đó — mất vết lineage. Phân-biệt **use ⟂ mention**.

View File

@ -0,0 +1,54 @@
# VERDICT: PASS_WITH_FIXES
Lens = Axis D (5-vòng closure). Verified against SPEC [2]§Axis-D + [3] A/D1,D2 · canonical checklist f71c5b65 · session-start.md · session-end.md · disk (agent-memory folders + agent files).
## Findings
### F1 — Mapping 5 vòng → KIỂM: CORRECT (verified on disk, not doc-trust)
| Vòng canonical | SE KIỂM role | Wire site verified |
|---|---|---|
| V1 Cặp tooling+harvest | tooling-harvest-audit | session-end.md:40 "verify OUTPUT H1+H2" ✓ agent file exists |
| V2 Cặp soi-lead | h24-audit | session-end.md:41 "verify OUTPUT lead-view+lead-omission" ✓ agent file exists |
| V3 Bộ ba đo→đề-xuất→kiểm | harness-audit | session-start.md:115 "con KIỂM run-folder PIN" ✓ agent file + sổ exist |
| V4 Vòng nén (distill) | sleep-audit | session-end.md:42 "verify OUTPUT /sleep-recovery gist+Fidelity" ✓ agent file exists |
| V5 Sàn-sự-thật nhãn đã-đo | measured-label-gate (reviewer floor) | floor, no spawned role ✓ |
All 5 agent contracts EXIST (glob `.claude/agents/*audit*.md` = 7 files incl all 3 new). Mapping is REAL, not aspirational.
### F2 — D2 premise CONFIRMED TRUE (3 KIỂM = session-END only)
- session-end.md:40-42 wire tooling-harvest-audit / h24-audit / sleep-audit AUTO at close.
- session-start.md:97 lists them ONLY in topology roster (describing what exists), NOT as spawn points. No session-start spawn of these 3.
- CONTRAST: harness-audit (V3 KIỂM) IS wired both ends (session-start §2.1.9 consent-gated + session-end §L.b(k)). So V3 KIỂM ≠ end-only; only V1/V2/V4 KIỂM are end-only. Spec's blanket "3 KIỂM" summary is accurate for the 3 it names.
### F3 — MEASURE layer IS at both ends (key context for the ruling)
- H1 tooling-auditor: session-start.md:127 "spawn → báo tooling-state 4-mặt + DIFF vs last-session" = the "báo diff" open-end. H2 harvest-curator line 110. So canonical "hai đầu" nhịp is SATISFIED at the MEASURE layer.
- em-main VERIFY→APPEND (session-start.md:125, B3) = a human-in-loop checkpoint already exists at open. The gap is ONLY at the new independent KIỂM/audit layer, which sits ON TOP of an already-verified measure.
### F4 — LANE-4 RULING on D2: DEFER (option b) is LEGITIMATE — arguably the CORRECT reading of canonical
Reasons:
- (a) Canonical "hai đầu" nhịp binds the MEASURE function (H1/H2 báo diff at open) — which IS wired both ends (F3).
- (b) Canonical SELF-VERIFY column for V1/V2/V4 is explicitly CLOSE-time: V1 "commit đóng phiên gần nhất CÓ vết sổ", V2 "ba lần đóng phiên gần nhất đều có vết chạy". The KIỂM roles mechanize this self-verify → session-end wiring is canonical-CONSISTENT, not a violation.
- (c) Structural: KIỂM verifies OUTPUT of measure; at open the output is a light diff-report (already em-main-verified), authoritative artifact (chốt+gom/harvest/distill) is at close. Nothing authoritative to audit at open.
RULING CONDITIONS → see FIX-1.
## Acceptance-teeth-check
- **D1** ("5 vòng chức-năng + 4 phép sàn (bảng verify)"): teeth PRESENT (4 floor checks are $0 re-runnable disk-truth, no Goodhart/word-count) BUT WEAK — "(bảng verify)" does not mandate per-check disk-evidence, so "PASS" risks a bare self-tick. See FIX-2.
- **D2** ("đóng HOẶC defer-có-lý-do documented (không im-lặng bỏ)"): falsifiable-in-principle (grep the doc for defer rationale) BUT spec routes decision to lane-4 without NAMING the durable landing site → "documented" unsatisfiable by spec alone until fixed. See FIX-1.
- No Goodhart / đếm-chữ detected in D acceptance. Death-paths (§Axis-D "5 vai=5 vòng SAI · đừng nhét audit nặng vào điểm-dừng phá C7") are ADEQUATE and consistent with F4 ruling (auditing at every open would risk C7).
## Risk/gap
### FIX-1 (MAJOR) — D2 defer must NAME durable landing site + address H24-cadence coupling
Spec Axis-D pt2 says "(a) HOẶC (b) defer... document defer + acceptance / lane-4 phán" but does NOT name WHERE the defer rationale lands. My review is ephemeral; acceptance D2 requires a persistent artifact. Fix: spec must COMMIT to (b) + require implementer WRITE the defer rationale into a NAMED durable doc (recommend: `.claude/agents/tooling-harvest-audit.md` contract or session-end.md near (g-bis), or harness-11-engine §). The rationale must explicitly cover the coupling edge: h24-audit fires "AUTO sau cặp H24" (session-end.md:41) but H24 runs BY CADENCE and the H24 tick/overdue check is at session-START (§2.1.8) — state whether h24-audit follows H24 wherever it fires or is intentionally end-only (else a cadence-at-open H24 goes un-audited).
### FIX-2 (MAJOR) — D1 teeth weak + phép-4 LANDMINE live on disk NOW
Disk truth (verified this review):
- `.claude/agent-memory/tooling-harvest-audit/` EXISTS but EMPTY (no MEMORY.md, created Jul 22 18:27 this session)
- `.claude/agent-memory/h24-audit/` MISSING · `.claude/agent-memory/sleep-audit/` MISSING
- `.claude/agent-memory/harness-audit/` has MEMORY.md ✓
Canonical phép-4 = "vai đã chạy thì phải có sổ". tooling-harvest-audit spawns AUTO this session (session-end.md:118 "spawn NGAY, KHÔNG consent-gate"). If it fires and does NOT write MEMORY.md → phép-4 FAILS this very close. Fix: (i) D1 acceptance must require each of the 4 floor checks to SHOW actual disk-read evidence (phép-1 cửa-count vs counter-delta numbers · phép-2 the literal dòng-nợ 3-vế line · phép-3 the 3 closeout ritual-sổ traces · phép-4 the roles-ran list + sổ paths), not a bare "PASS"; (ii) spec must ensure any KIỂM role firing this session produces a sổ, OR the completeness-gate explicitly records it as not-yet-run (vacuous pass) with the folder-state evidence.
### FIX-3 (MINOR) — incremental-adopt ambiguity is the ROOT of the phép-4 risk
session-end.md:123 "Incremental adopt: đây là vai #1/3 (tooling/harvest). Vai #2 h24-audit + #3 sleep-audit land dần sau" — but lines 41-42 ALREADY wire #2/#3 AUTO. Ambiguous whether #2/#3 FIRE this session. Resolves the phép-4 scope: if #2/#3 don't fire, their MISSING folders are OK (vacuous); if they fire, MISSING folder → phép-4 FAIL. Spec D1 must pin which roster-state the completeness-gate runs against.
## Note (out of lane, forward to synthesis)
Z-acceptance "governance-only": git status shows `.claude/agents/tooling-harvest-audit.md` untracked (??) + h24-audit.md/sleep-audit.md tracked. Confirms 0 src/fe/tests touched by Axis-D scope — Z holds for my lane.

View File

@ -0,0 +1,68 @@
# VERDICT: FAIL
Lens = Axis E (tiep/pause/snapshot re-check) + CROSS-CUT chống sót. 2 CRITICAL (cả hai ship regression nếu implement đúng spec), 1 MAJOR, 4 MINOR.
## Findings
### 🔴 CRITICAL-1 — Axis A.4 + acceptance A2: tiền-đề "thực chỉ 2 surface" là SAI (đo được 4). Thực-thi = HỎNG doc đang ĐÚNG.
- **spec:15 (A.4) + spec:53 (A2)** yêu cầu đổi `nhip-no-probe.ps1:6-7` header "4 surface" → **"2 surface"** + `session-model-se-draft.md:34` "4 điểm lệnh" → 2, với acceptance A2 = `grep "4 surface|4 điểm lệnh" = 0 hit`.
- **Đo ground-truth** `grep -n "scripts/nhip-no-probe.ps1" .claude/commands/*.md`:
- `pause.md:44` ✓ · `tiep.md:112` ✓ · **`session-start.md:216`** ✓ (block (e) "BÁO dòng-nợ 4-vé" — gọi thẳng `scripts/nhip-no-probe.ps1`) · **`session-end.md:104`** ✓ (block (j)(i) "BÁO dòng-nợ 4-vé" — gọi thẳng `scripts/nhip-no-probe.ps1`).
-**4 surface XÁC-NHẬN THẬT.** Header "4 surface" + draft "4 điểm lệnh" = **ĐÚNG**.
- Nhầm của spec-author: thấy `session-start.md:135` gọi `distill-shard-probe.ps1` (probe KHÁC) rồi kết-luận session-start/end KHÔNG gọi nhip-no-probe. Thực-tế session-start/end gọi **CẢ HAI** script (shard-probe @135 + nhip-no-probe @216/104).
- **Hệ-quả:** implement A.4/A2 sẽ biến câu ĐÚNG ("4 surface") thành câu SAI ("2 surface") = tự-tạo stale-claim, NGƯỢC hẳn ý-đồ (vá stale). A2 acceptance có RĂNG NGƯỢC-CHIỀU: đuổi "grep=0 hit" ⇒ xoá text đúng ⇒ **cổng PASS bản-hỏng, FAIL bản-đúng**.
- **measured-label gate:** claim spec "thực chỉ 2" là con-số đo-lường; phép kiểm 1-dòng grep khiến nó TRƯỢT ⇒ phải BỎ/ĐẢO claim.
- **Sửa:** GỠ A.4 + A2 (hoặc đảo thành "xác-nhận 4 surface ĐÚNG, no-op"). Không có stale-claim nào để vá ở đây. Nếu muốn giữ mục "đính-chính", đối-tượng đúng = sửa premise của chính spec-author, KHÔNG sửa header/draft.
### 🔴 CRITICAL-2 — Seam C↔E: Axis C.2 hook 3→4 path (thêm `sessions/`) phá bất-biến Sàn-3 tiep.md §0; KHÔNG axis nào hoà-giải.
- **spec:28 (C.2)** đổi `wal-flush.ps1:13` 3-path → +`sessions/` (owner S144). **spec:44 (E.2)** bảo "verify tiep.md Sàn-3 ĐÚNG". Nhưng Sàn-3 tiep.md §0 hardcode **"3 path"/"3 điểm mù" tại 4 site**: `tiep.md:21` ("hook có **3 điểm mù**") · `:23` ("wal-flush.ps1 tự-commit **3 path**: WAL·agent-memory·runs") · `:75` ("BẬC TRUNG-BÌNH — bẩn NGOÀI **3 path**") · `:78` ("bẩn ngoài **3 path** ⇒ NÊU").
- Sau C.2 (hook = 4 path) mà KHÔNG cập-nhật §0:
1. Tường-thuật "3 điểm mù" → **SAI** (thành 4). 4 site stale.
2. **BẬC MẠNH signal ④** chỉ phủ `runs/``sessions/session-<N>/` (per-pause context-map @C.5, hook auto-commit thành `wal:`) là **điểm-mù thứ-4 KHÔNG có signal đối-ứng** ⇒ phiên chết còn context-map nhưng bị phán "sạch" = **đúng bug-class "sổ trống ≠ sạch"** mà Sàn-3 sinh ra để chặn. Reopens the blind spot.
3. **BẬC TRUNG-BÌNH (:75/:78) misclassify**: dirt trong `sessions/` giờ NẰM TRONG persist-set nhưng luật vẫn đếm nó "bẩn ngoài 3 path" ⇒ dương-giả logic THẬT (không chỉ prose stale).
- Đây là **safety-critical recovery floor** (Sàn-3 = lưới chống mất mạch-việc). Gap đã được chính adap-report ghi: `docs/governance/adap-reports/2026-07-17-...manifest.md:23` = **"meld-forward-gap (Stop-hook SE phủ 3 path, manifest giả-định 4)"** — biết trước, chưa đóng.
- **Sửa:** thêm sub-task tường-minh vào C.2 HOẶC E.2: khi hook→4-path ⇒ (a) cập-nhật CẢ 4 site "3 path"→"4 path" ở tiep.md §0 + (b) QUYẾT sessions/ có cần strong-signal ⑤ không (hoặc lý-do miễn) + (c) sửa BẬC-TRUNG "ngoài 3 path"→"ngoài 4 path". Thêm acceptance đo: `grep "3 path\|3 điểm mù" tiep.md = 0` sau C.2.
### 🟠 MAJOR-3 — Axis C.1 session_ctx_kb=64: nghịch owner-authority + K6.2, + ghost-wire (0 consumer).
- **spec:27 (C.1) + spec:57 (C1)** set `memory-budget.json` session_ctx_kb=**64**, khung "canonical default 'vắng→64KB'; owner override được — note owner-gated như `pull_warn_days`".
- Nhiều artifact phiên trước phân-loại session_ctx_kb = **OWNER-GATED, số là của owner, SE 'không tự đặt số' = TUÂN-THỦ**: `session-model-se-draft.md:55` ("SE chưa đo 64 có hợp không — **mượn số hub mà chưa đo là đúng thứ K6.2 CẤM**") · `sub-task-1:253` (K6.2 cấm) · `spec-adap-dot-11:31` ("SE để trống = TUÂN-THỦ") · `audit-synthesis:56` (session_ctx_kb 0/0 = **bỏ-sót/owner-giữ**, tương-phản pull_warn_days được cấp carry).
- 2 prong hỏng:
1. **Framing "default" ≠ "owner-directed".** WAL.md:62 gợi "session_ctx_kb=64 owner-ap-ngay" — NẾU owner chốt 64 phiên này thì OK, nhưng spec cite "canonical default" chứ KHÔNG cite owner-directive; và acceptance C1 ("key=64") KHÔNG đòi note owner-lineage như bulk_note_shards mang (`_owner_set` lịch-sử 2-nấc @S144). "vắng→64KB" = default-AT-READ ⇒ để-TRỐNG mới đúng biểu-diễn "owner chưa chọn" (mirror bulk=null + pull_warn_days absent). Ghi 64 = xoá tín-hiệu "unset".
2. **Ghost-wire (#H18):** grep toàn-repo — **0 script đọc session_ctx_kb** (chỉ doc/spec/draft + `nhip-no-probe.ps1:42` NÊU tên trong comment "declining to pick"). Trái với `pull_warn_days` mà spec analogize — cái đó CÓ reader sống `nhip-no-probe.ps1:190` `$warn=$cad.pull_warn_days`. ⇒ analogy "như pull_warn_days" hỏng cả 2 mặt (owner-lineage + consumer). Set 64 = wire số không-ai-đọc.
- **Sửa:** (a) nếu owner chốt 64 @S145 ⇒ cite owner-directive + thêm `_owner_set` note (như bulk); bỏ khung "default". (b) nếu chưa ⇒ ĐỂ TRỐNG (default-at-read 64), KHÔNG hardcode — mirror kỷ-luật SE đã giữ. (c) xác-định consumer hoặc mark owner-gated-inert-pending-wire để tránh ghost-wire.
### 🟡 MINOR-4 — Axis B: "BÃO-TO :63" là line-ref MỜ (sai file gợi-ý).
- **spec:20** viết "Hiện: `memory-budget.json:11` = null; BÃO-TO `:63`". `:63` liền sau citation memory-budget.json ⇒ dễ đọc thành memory-budget.json:63 (thực = `_merge_note` của mfe — SAI file). BÃO-TO thật ở **`distill-shard-probe.ps1:63`** (`if ($null -ne $bulkShards -and $n -gt $bulkShards)`). Spec Axis B **KHÔNG hề nêu tên `distill-shard-probe.ps1`** dù B2 (spec:56) đòi fault-inject BÃO-TO — implementer phải tự mò script. Sửa: ghi rõ `distill-shard-probe.ps1:63` + nêu script này là target cho B2.
### 🟡 MINOR-5 — tiep.md:23 line-ref ":7" stale (paths thật ở :13).
- `tiep.md:23` cite "`wal-flush.ps1:7` tự-commit 3 path" nhưng `$paths=@(...)`**`wal-flush.ps1:13`** (dòng 7 = comment INTERLOCK). Spec Axis C.2 tự cite đúng ":13". E.2 "re-check tiep.md" nên gộp fix line-ref này (sẽ chạm §0 khi vá CRITICAL-2 anyway).
### 🟡 MINOR-6 — Acceptance E1 yếu/vòng-tròn (thiếu răng).
- **spec:63 (E1)** = "review PASS; defect (nếu có) fixed; C7-compliant" — không falsifiable độc-lập ("review PASS" = tin reviewer). Thêm check dương cụ-thể: `pause.md:17` wf: đủ 5-trường (grep run=/runId=/args=/done=/harvested=) · `tiep.md §0` đủ 4 signal MẠNH · `tiep.md:127` rule "memory-pack DẪN-XUẤT-LẠI TƯƠI (CẤM reuse cũ)" present · run.md có `## taskList snapshot`.
### 🟡 MINOR-7 — Precision + death-path sót.
- spec:28 "+`sessions/`" nên là **"+`.claude/sessions/`"** (path đầy-đủ; hook paths repo-relative).
- Axis A death-path (spec:17) không phủ **C7-compliance của `distill-shard-probe.ps1`** — probe THỨ-2 cũng chạy ở command-surface (session-start:135). Nếu §N là luật general cho probe-tại-điểm-dừng, nên xác-nhận shard-probe cũng read-only/non-blocking (hiện có tự exit? cần verify — ngoài scope 3-file lens nhưng nêu để lane-A/D bắt).
## Acceptance-teeth-check
| # | Teeth | Note |
|---|---|---|
| A1 | OK | grep predicate-2-nơi=0 falsifiable |
| **A2** | **RĂNG NGƯỢC** | enforces câu SAI "2 surface"; PASS bản-hỏng FAIL bản-đúng → CRITICAL-1 |
| A3 | OK | fault-inject chiều-lỗi chạy thật; nên thêm cách quan-sát "no-hang" (timeout) |
| B1 | OK | =30 >15, grep derived-copy=0 |
| B2 | OK-thiếu-tên | đúng 2-chiều nhưng KHÔNG nêu distill-shard-probe.ps1 (MINOR-4) |
| C1 | thiếu | chỉ "key=64", KHÔNG đòi owner-lineage/consumer → MAJOR-3 |
| C2 | thiếu | grep 4-path OK nhưng KHÔNG đòi cập-nhật tiep.md §0 "3 path" → CRITICAL-2 |
| C3/C4 | OK | 2-tầng nhãn + regex + gitignore-verify falsifiable |
| D1/D2 | OK | routed lane-4 (đúng thiết-kế) |
| **E1** | **yếu** | vòng-tròn → MINOR-6 |
| Z | OK | git-diff scope + test-count + bundle falsifiable |
## Risk/gap (cross-cut sweep — cái 4 lane kia dễ RƠI)
- **Seam A↔truth (CRITICAL-1):** lane-A đọc "Axis A" bị prime tin spec-framing "đây là stale-fix" ⇒ dễ nhận A.4 face-value. Chỉ cross-cut grep 4 file command mới lòi 4-surface. Lane-A KHÓ tự bắt.
- **Seam C↔E (CRITICAL-2):** lane-C lo build session-model, lane-E lo re-check tiep — bất-biến "hook path count = §0 blind-spot count" nằm ĐÚNG khe giữa 2 lane; cả 2 death-path (spec:33 + spec:47) đều KHÔNG nhắc ripple. Đây là gap CHỈ cross-cut thấy.
- **Owner-authority (MAJOR-3):** lane-C dễ coi 64 là "áp số hub-answer" mà bỏ qua rằng session_ctx_kb là cột owner-giữ (khác bulk=30 có owner-lineage rõ). Cần phân-biệt "áp hub-answer" (C7/bulk — hub trả) vs "số owner-giữ" (session_ctx_kb — SE đã CỐ Ý từ-chối).
- **Death-path đủ chưa:** mỗi axis CÓ death-path riêng, nhưng CROSS-axis death-path (C sửa hook ⇒ E phải sync Sàn-3; A.4 premise chưa verify ⇒ đừng thực-thi mù) VẮNG ở cả C lẫn E lẫn A. Đó là điểm sót hệ-thống.
- **Snapshot integrity (Axis E.3):** pause.md:17 wf: 5-trường (run/runId/args/done/harvested) + tiep.md:124-128 relaunch-cắt-gọt + :127 memory-pack-tươi-rule = MÔ-TẢ ĐÚNG, không defect nội-tại. Defect của E nằm ở SEAM (CRITICAL-2), không ở mô-tả E.
- **Spec [1] tự-mâu-thuẫn:** khai "verify 2-tuyến (đã)" nhưng premise A.4 ("thực chỉ 2") sụp dưới grep 1-dòng ⇒ verify 2-tuyến KHÔNG phủ điểm này. Giảm tin-cậy claim "đã verify".

View File

@ -0,0 +1,37 @@
# VERDICT: PASS_WITH_FIXES
Lăng-kính BULK (Axis B) — spec-apply-hub-s145.md. Design SOUND + canonical-aligned; fixes nằm ở ACCEPTANCE TEETH (B2 boundary, B1 grep-scope), không ở thiết-kế.
## Findings
### Canonical-match (task a) — PASS
- Hub Câu 2 (inbox `...c7-bulk-shards.md:65-91`) canonical: ĐẶT số (≠null) · số của SE reference-not-copy (đừng copy `10`) · số > tầng-1 · owner-set · cờ LOUD KHÔNG đổi hành-vi nén. Spec Axis B (`:19-23`) khớp TỪNG vế.
- 🔎 Hub CHÍNH NÓ đề-xuất "anchor ~30 (≈2×min-SE=15)" tại `:79`. ⇒ 30 KHÔNG phải copy `10`; nó là **derive từ tầng-1 CỦA SE (15)**, trùng anchor hub vì hub làm CÙNG phép derive. reference-not-copy = THỎA (số đến từ 15 của SE, không từ 10 của hub). Item(1) 30>15 ✓ · 30≠10 ✓.
- Item(4) script `distill-shard-probe.ps1:63` = `if ($null -ne $bulkShards -and $n -gt $bulkShards)` — khớp EXACT "bulkShards!=null AND n -gt bulkShards". Spec KHÔNG đổi :63 (chỉ set JSON value). PASS. `-gt` (strict) ⇒ n≤30 IM, n≥31 BÃO-TO — khớp spec "≤30 im / >30 bão".
- Item(2) reference-not-copy CLEAN tại spec-time: grep `.claude/commands` = 0 · `docs/governance` = 0 · `.claude/agents` = 0 (repo-wide grep chỉ thấy 30 ở WAL[transient]/spec/run + hub-broadcast[value=10 của hub]). KHÔNG derived-doc nào hardcode bulk-value.
- Spec line-cite `memory-budget.json:11` = ĐÚNG (line 11 thật là `bulk_note_shards`). `_bulk_note` semantics đặt TRONG json = single-source-compliant (khớp hub mandate "derived docs trỏ key, KHÔNG chép số").
### Đường-chết (task d) — ĐỦ, tốt
- `:23` "số ≤15 = tầng-2 dưới tầng-1 = vô-nghĩa" + "đừng copy 10 (min hub=1 khác scale)" — bắt trúng 2 bẫy THẬT. Khớp hub `:78` (copy 10 → 10<15 = tầng-2 DƯỚI tầng-1 nghĩa).
## Acceptance-teeth-check (task b)
### 🔴 MAJOR — B2 under-specified, THIẾU RĂNG BOUNDARY
- B2 = "im (≤30) / bão (>30→BÃO-TO) 2-chiều PASS trên cây tạm". `-RepoRoot` support (script:13) cây-tạm khả-thi ✓. NHƯNG "≤30/>30" KHÔNG chốt ranh CHÍNH-XÁC.
- Script:55-59 tự agonize `-gt` vs `-ge` cho tầng-1 — **CÙNG off-by-one risk ở tầng-2 :63**. Fault-inject happy-path (n=5 im, n=100 bão) sẽ PASS DÙ operator sai (`-ge`). Per feedback_faultinjection_proves_teeth (S95): **boundary + anti-Goodhart-flip BẮT BUỘC**.
- FIX: B2 phải chốt cặp ranh trên cây-tạm với bulk=30 (giá-trị production): **n=30 → tầng-2 IM (tầng-1 KEU, chứng "chỉ tầng-1 xử")** · **n=31 → `BÃO-TO: backlog 31 > 30`**. Cặp này chứng ĐỒNG THỜI (i) `-gt` không off-by-one (ii) tầng-2 gate ĐỘC-LẬP TRÊN tầng-1. Dùng n≤15 cho "im" = vô-giá-trị (cả 2 tầng im, không chứng tầng-2).
### 🔸 MINOR — B1 grep-scope mơ-hồ
- B1 "grep derived-copy = 0" KHÔNG nêu pattern/scope. Verified clean HIỆN-TẠI, nhưng acceptance nên chốt: grep `bulk_note_shards` HOẶC literal `30`(bulk-threshold) trong {session-start/end · pause · tiep · harness-11-engine · agents/*} = 0; value sống DUY-NHẤT ở memory-budget.json (+ script đọc key). Không chốt scope = acceptance tự-lão-hoá (S109/S121).
## Risk/gap (task c)
- 🔸 MINOR (owner-authority): bulk_note_shards = **owner-authority** number (config role_boundary_note; hub `:84` "owner-set"; O-1 spec-adap-11 "núm-số thuộc chủ dự án"). Spec `:21` LABEL "owner-set" ✓ nhưng B1 chỉ verify SỐ, không verify owner-ratify. Risk=0 (hub `:67/:91`: cờ LOUD-only, đặt sai chỉ kêu sớm/muộn KHÔNG mất data) + hub tự đề-xuất ~30 ⇒ em-main initial-anchor CHẤP-NHẬN-ĐƯỢC, nhưng spec nên khai rõ "30 = owner-set/initial-anchor, KHÔNG em-main auto-tune; owner veto bất-kỳ-lúc-nào" (mirror :58-59 operator-vs-number).
- 🔸 MINOR (cross-cutting, PRE-EXISTING, ngoài lens chính): `memory-budget.json:16` _acceptance tầng-1 case(2) "{3 shard,0 ngày}→PHẢI KÊU" MÂU-THUẪN production min=15 (3<15 `-gt` = IM). Chỉ hợp-lệ nếu đọc "cây-tạm ngưỡng<3" nhưng KHÔNG khai ngưỡng-tạm mơ-hồ. KHÔNG do S145 sinh (S144), nhưng Axis B claim "single-source clean" KHÔNG flag. Đề-nghị lane tầng-1/Axis-D xác-nhận. (Cảnh-báo lây: nếu B2 bắt-chước pattern "cây-tạm ngưỡng bịa" thì chứng cơ-chế KHÔNG chứng production-30 xem MAJOR trên.)
- 🔸 MINOR/OPTIONAL (robustness): script KHÔNG guard `bulkShards > minShards`. Mis-set tương-lai (bulk<min) tầng-2-BÃO-TO trong khi tầng-1-IM = nonsensical. Spec dựa human-discipline (:23) không script-assert. Optional harden (spec KHÔNG bắt buộc risk=0 hiện-tại 30>15).
## Positive-validation (resisted scrutiny)
- script:63 logic EXACT ✓ · 30 derive-from-SE-15 not copy-hub-10 ✓ · derived-copy 0-hit commands+governance+agents ✓ · -RepoRoot teeth-capable ✓ · dead-ends bắt trúng 2 bẫy thật ✓ · line-cite :11 accurate ✓.
## Verdict rationale
PASS_WITH_FIXES: thiết-kế Axis B đúng + khớp canonical hoàn-toàn (hub tự đề-xuất 30). Fix DUY-NHẤT bắt buộc = **B2 boundary teeth (n=30 IM / n=31 BÃO-TO trên cây-tạm bulk=30)**. B1 grep-scope + owner-ratify-label = minor tighten. Không block nếu B2 được siết ranh.

View File

@ -0,0 +1,75 @@
# VERDICT: PASS_WITH_FIXES (lăng-kính C7 / Axis A)
Core C7 (viết luật + reword + B1-point + fault-inject) KHỚP canonical hub-reply Câu 1.
NHƯNG 1 must-fix BLOCKING: "đính-chính 4 surface→2" (spec step-4 / A2) FACTUALLY SAI —
spec nhầm `nhip-no-probe.ps1` với `distill-shard-probe.ps1`.
## Findings
### [CRITICAL / must-fix BLOCKING] spec:15 + A2 (:53) — "4 surface → 2" là SAI, phải DROP
Spec:15 khẳng-định: header `nhip-no-probe.ps1:6-7` "4 surface" SAI, "thực chỉ **2** (pause:44 + tiep:112;
session-start/end gọi `distill-shard-probe` script KHÁC)". → **False premise = conflation 2 script.**
Bằng-chứng đĩa (verified live):
- `scripts/nhip-no-probe.ps1:6-8` (header): *"Called (never inlined) by the session command surfaces
(/pause, /tiep, session-start, session-end)"* → header tự khai **4**, và **4 đó ĐÚNG**.
- 4 caller THẬT của `nhip-no-probe.ps1` (grep + Read xác nhận từng dòng):
1. `pause.md:44``powershell.exe ... -File scripts/nhip-no-probe.ps1`
2. `tiep.md:112``powershell.exe ... -File scripts/nhip-no-probe.ps1`
3. `session-start.md:216` → khối "(e) BÁO dòng-nợ 4-vế" gọi `... -File scripts/nhip-no-probe.ps1` (LIVE)
4. `session-end.md:104` → khối "(i) BÁO dòng-nợ 4-vế" gọi `... -File scripts/nhip-no-probe.ps1` (LIVE)
(`session-end.md:131` chỉ là REFERENCE "khối (c) đã chạy ... nhip-no-probe" — KHÔNG phải caller thứ-5.)
- `distill-shard-probe.ps1` là script KHÁC HẲN, mục-đích KHÁC (Sleep-check, đếm shard pending),
gọi ở `session-start.md:135`. Spec-author thấy "session-start/end gọi distill-shard-probe" (ĐÚNG, cho
sleep-check) rồi suy sai "⇒ session-start/end KHÔNG gọi nhip-no-probe" (SAI — gọi CẢ HAI, khác mục-đích).
- `session-model-se-draft.md:34` (path THẬT = `docs/governance/`, KHÔNG `.claude/governance/`):
`| NHIP-NO probe 4-vế | 4 điểm lệnh | GIỮ per-điểm-dừng |` → "4 điểm lệnh" cũng **ĐÚNG**, KHÔNG stale.
Hệ-quả nếu implement A2:
- Ghi 1 FALSEHOOD vào 2 file (header script + draft) — đổi con-số ĐÚNG "4" thành SAI "2".
- Acceptance A2 grep `"4 surface\|4 điểm lệnh" = 0 hit` = **anti-teeth / Goodhart**: cổng PASS bằng cách
XÓA thông-tin ĐÚNG, không verify tính-đúng. Đúng lớp "vá bằng rời tập-đo" mà governance chặn.
- run.md:9 (scratch) mang cùng lỗi ("header '4 surface' SAI (chỉ 2)") — nếu implementer re-derive từ run.md
sẽ nhân lỗi. Cảnh-báo implementer BỎ luôn.
**SỬA:** DROP hẳn spec step-4 + xoá vế stale-fix trong A2. GIỮ NGUYÊN "4" ở cả header lẫn draft:34
(chúng đang đúng). Nếu muốn rõ hơn, header CÓ THỂ ghi "4 surfaces (2 stop-point pause/tiep + 2 bookend
session-start/end)" — nhưng CON-SỐ vẫn là **4**, không phải 2. A2 rút gọn còn: "0 chỉnh — 4 đã đúng".
### [PASS] spec:12 — nhà-luật §N chọn ĐÚNG (verify-point 1)
Law-home = `harness-11-engine.md §N` (thêm N.x "C7 điểm-dừng-rẻ", cạnh WAL H22). CLAUDE.md xác nhận
WAL H22 sống ở "PHẦN N" của engine ⇒ đặt C7 kề đó hợp-lý. pause.md/tiep.md chỉ TRỎ về §N (spec:14, B1 —
KHÔNG chép predicate 2 nơi). ĐÚNG chỗ: engine (governance floor) chứ KHÔNG nhét vào command. Khớp canonical.
🔸 minor: "§N" còn placeholder — implementer phải chốt số §; nhưng hướng đúng.
### [PASS] spec:11 + :16 — code script KHÔNG đổi (verify-point 4, phần code)
`nhip-no-probe.ps1:203-208`: `catch { Write-Host 'probe-loi (khong chan)' }``exit 0`. Thoả vế-iv
non-blocking rồi. Spec:11 "Script THỎA 4-vế rồi" + spec:16 "script KHÔNG đổi code" = ĐÚNG. KHÔNG đổi
interpreter sang python (FORM, hub KHÔNG đòi) — death-path spec:17 bắt đúng.
⚠️ NHƯNG spec:15 lại bảo "Sửa header → 2" = 1 EDIT vào script (comment), VÀ edit đó SAI (xem CRITICAL).
Kết-luận verify-4: logic KHÔNG đổi (đúng); header-edit CÓ nhưng phải DROP.
## Acceptance-teeth-check
| # | Có răng? | Ghi-chú |
|---|---|---|
| A1 C7 luật | ✅ teeth | verify tồn-tại mục C7 4-vế + grep 0-chép-2-nơi (anti-drift B1 thật). 🔸 minor: chưa verify WORDING predicate khớp canonical FLOOR (read-only + non-blocking + **gỡ-được-không-hậu-quả**) + tách FLOOR/FORM — nên thêm để chặn "viết luật nhưng lệch floor". |
| A2 stale-fix | ❌ ANTI-TEETH | Goodhart: PASS = xoá info ĐÚNG. Tệ hơn vô-dụng — nó THƯỞNG cho việc làm doc SAI. Phải DROP (xem CRITICAL). |
| A3 fault-inject | ✅ teeth | falsifiable: probe lỗi → in `probe-loi` + hoàn-tất, KHÔNG hang; "chạy thật KHÔNG happy-path". Khớp hub "vế-iv LOAD-BEARING + chiều-lỗi bắt-buộc". 🔸 minor: chưa nêu VECTOR inject (bad `-RepoRoot` / JSON hỏng / kill mid-run) — S135 precedent dùng `-RepoRoot` sai → probe-loi exit0; nên chốt vector để đảm-bảo răng. |
## Risk/gap
- **Death-path THIẾU (spec:17):** liệt 3 (đừng python · đừng cấm-tất · đừng chép predicate) — ĐÚNG nhưng
SÓT cái quan-trọng nhất mà lỗi này phơi ra: *"đừng 'sửa' header 4→2 — nó ĐÚNG, đừng nhầm với
distill-shard-probe"*. Bổ-sung death-path này.
- **Fault-inject chiều-lỗi teeth-thật:** script đã `exit 0` + catch sẵn ⇒ A3 chỉ CONFIRM behavior hiện-có
(đúng ý hub "verify-before-trust"). Nhưng "KHÔNG hang" chỉ thật-sự có răng nếu inject thứ CÓ-THỂ hang;
script chỉ đọc JSON/bytes/dirs (bounded, no net/lock/loop) ⇒ hang-risk thấp, exception-path là proxy hợp-lý.
OK, chỉ cần chốt vector (minor).
- **A1 chưa neo FLOOR-wording:** rủi-ro implementer viết "4-vế" nhưng chữ lệch canonical (vd bỏ
"gỡ-được-không-hậu-quả" = mất chính phần LOAD-BEARING hub nhấn). Thêm 1 vế acceptance so 3 tính-chất FLOOR.
## Verdict recap (Axis A / C7)
- (1) law-home §N: ✅ ĐÚNG (engine, không command).
- (2) "4→2": ❌ SAI — thực **4** (verified 4 caller). CRITICAL, DROP step-4 + A2-stale-clause.
- (3) fault-inject chiều-lỗi: ✅ có răng (minor: chốt vector).
- (4) đổi code script: logic KHÔNG (đúng); header-edit CÓ nhưng SAI → DROP.
Core C7 sound; chặn ở 1 must-fix conflation. → PASS_WITH_FIXES.

View File

@ -0,0 +1,84 @@
# sub-reviewer PRE-COMMIT S146 — adversarial review + fault-inject re-verify
> Ghi-đĩa-trong-lúc-làm (anti-#53). Append theo thứ-tự tìm ra, KHÔNG đợi cuối.
> Run: `.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/` · reviewer spawn @S146 · 2026-07-22
## [0] SCOPE GATE — VIỆC 4
`git status --porcelain` @spawn (14 M + 1 untracked):
```
M .claude/agent-memory/memory-budget.json
M .claude/agents/h24-audit.md
M .claude/agents/sleep-audit.md
M .claude/agents/tooling-harvest-audit.md
M .claude/auto-memory/project_h22_wal_session_continuity.md
M .claude/commands/pause.md
M .claude/commands/session-end.md
M .claude/commands/session-start.md
M .claude/commands/tiep.md
M .claude/governance/.session-counter.json
M .claude/hooks/wal-flush.ps1
M docs/governance/harness-11-engine.md
M docs/governance/session-model-se-draft.md
M scripts/nhip-no-probe.ps1
?? .claude/scheduled_tasks.lock
```
- 0 file `src/Backend` · 0 `fe-admin/` · 0 `fe-user/` · 0 `tests/` · 0 migration → **SCOPE GATE PASS** (governance/config-only đúng claim).
- ⚠️ `?? .claude/scheduled_tasks.lock` untracked — chưa rõ nên ignore hay commit. Ghi lại, kiểm sau.
Diffstat: 14 files, +225 / -35.
---
## [1] FINDINGS (append khi tìm ra)
### 🔴 F1 [MAJOR→BLOCKING-cho-claim-"grep MỌI consumer"] `session-end.md:114` + `:296` VẪN dạy `hook-3-path` — sót consumer LIVE, và acceptance MÙ với nó
Đĩa NOW (sau khi worker đã vá):
```
.claude/commands/session-end.md:114: ... (file ngoài hook-3-path; bằng-chứng sống: tick S133 ...)
.claude/commands/session-end.md:296: 🔴 M-7 — ... file NGOÀI hook-3-path ⇒ KHÔNG tự vào `wal:` commit ...
```
- **LIVE PRESCRIPTIVE** (thân `/session-end`, echo mỗi closeout) — KHÔNG phải lịch-sử.
- **Đã được cảnh-báo TRƯỚC** trong chính run này: `sub-implement-CE-sessionmodel.md:258-259` liệt đúng 2 dòng, gắn nhãn *"🔴 THẬT — cùng class, cần → 4. Worker-3 sở-hữu."* ⇒ worker-3 KHÔNG vá. Đây là **residual có người chỉ tận nơi mà vẫn rơi**.
- **Bất-đối-xứng nội-bộ:** `pause.md:40`/`:43` ĐÃ đổi sang `hook-4-path`, `session-end.md` thì không ⇒ 2 command anh em nay **nói ngược nhau về cùng một hook**.
- Ngữ-nghĩa mệnh-đề vẫn ĐÚNG (`.claude/governance/` vẫn ngoài cả 4) ⇒ hại = **dạy sai cardinality**, không phải hành-vi sai. Nhưng đó đúng là thứ C2b-EXT sinh ra để chặn.
### 🔴 F2 [MAJOR] Acceptance C2b-EXT (bản siết) **KHÔNG có răng với 3 lớp ca** — tự chứng bằng cách chạy nó trên HEAD (bản TRƯỚC khi vá)
Chạy **nguyên văn** phép (1) của ADDENDUM trên `HEAD` (git grep, tức trạng-thái tiền-vá):
```
HEAD:.claude/auto-memory/project_h22_wal_session_continuity.md:10 ✅ bắt
HEAD:.claude/commands/tiep.md:21 ✅ bắt
HEAD:.claude/commands/tiep.md:23 ✅ bắt
HEAD:.claude/commands/tiep.md:75 ✅ bắt
HEAD:.claude/governance/.session-counter.json:4 ✅ bắt
HEAD:docs/governance/harness-11-engine.md:406 ✅ bắt
HEAD:docs/governance/harness-11-engine.md:407 ✅ bắt
=> 7 dòng. THIẾU 4 site THẬT:
```
| Ca TRƯỢT | Vì sao trượt |
|---|---|
| `tiep.md:78` (HEAD) *"Bẩn ngoài 3 path + không phải EOL-only ⇒ NÊU"* | vế lọc thứ-2 đòi dấu-hiệu hook **CÙNG DÒNG**; dòng này không có `hook`/`WAL.md`/`agent-memory`/`workflows/runs`/`wal-flush`**bị vứt**. Đây là site LIVE, worker phải sửa tay mới xong. |
| `session-end.md:114` + `:296` (`hook-3-path`) | regex chỉ có `3 path` (**dấu cách**). `hook-3-path`**gạch nối** ⇒ 0 match. Cũng nằm **ngoài** ý-định "quét `.claude/commands/`"? KHÔNG — thư-mục có trong scope, chỉ **mẫu chữ** trượt. |
| `session-model-se-draft.md:13` (`persist 3-path`) + `:56` (`quét đúng 3 path`) | file **NGOÀI tập quét** của phép (1) (chỉ có commands/hooks/auto-memory/.session-counter.json/engine). Site LIVE (draft đang được cập-nhật, không phải dated-report). |
⇒ Bản siết **đúng hướng** (bỏ dương-giả `session-end.md:162`) nhưng **siết lệch trục**: nó siết bằng *co-occurrence CÙNG DÒNG* + *tập-file hẹp* + *một mẫu chữ duy nhất*, trong khi 3 lớp ca thật đều lọt. **Không vacuous** (vẫn bắt 7/11) nhưng **không đủ để làm cổng**.
### ✅ F3 [HELD] Live-verify hook 4-path = THẬT (tự xác minh, không tin lead)
```
$ git show --name-only --format='%H|%s|%ci' da7ee8a
da7ee8aebf458bd3aa1ba26ee48b14f3ff3872e3|wal: flush 20260722T2256|2026-07-22 22:56:10 +0700
.claude/WAL.md
.claude/sessions/session-1/probe.md <== path thứ-4 BỊ NUỐT THẬT
.claude/workflows/runs/.../spec-apply-hub-s145-v2.md
...
```
+ `grep -n 'paths = @' .claude/hooks/wal-flush.ps1`**13:** (comment "GIỮ $paths Ở ĐÚNG DÒNG 13" khớp đĩa)
+ `.claude/settings.json` dùng `-File .claude/hooks/wal-flush.ps1` ⇒ body re-đọc mỗi Stop, không cần restart. Claim của lead **ĐỨNG**.
### 🟠 F4 [MAJOR] Residue `session-1/probe.md` đã COMMIT vào repo ⇒ (a) ô-nhiễm ID-space phiên-LOGIC, (b) tín-hiệu ⑤ KÊU vĩnh-viễn cho tới khi push
- `da7ee8a` là commit THẬT trên `main`, chứa `.claude/sessions/session-1/probe.md` (vật thử nghiệm).
- Hệ-quả (a): `session-start.md` BƯỚC 0.8 định `<N> = max(<N> hiện có)+1` ⇒ phiên-LOGIC THẬT đầu tiên sẽ là `session-2`, còn `session-1` là rác probe. `regex ^session-\d+$` khớp `session-1`**nó được tính**.
- Hệ-quả (b): ⑤ = `git log --name-only origin/main..HEAD | grep -q '.claude/sessions/'` ⇒ commit `da7ee8a` chưa push ⇒ **⑤ KÊU** ở mọi `/tiep` tới khi push. Sàn-3 sẽ "HỎI LẠI ANH" vì một file probe. (Hướng hỏng an-toàn, nhưng là **báo động thường-trực do rác test**.)

View File

@ -0,0 +1,58 @@
# VERDICT: PASS_WITH_FIXES
Lăng-kính SESSION-MODEL (Axis C). Review spec `spec-apply-hub-s145.md` [2]§Axis-C (dòng 25-33) + acceptance [3] C1-C4 (dòng 57-60). Canonical = manifest `101e69d6` (4 khoản) + WAL S144 owner-decision (dòng 6).
## Findings
### Canonical-alignment = SOLID (5 verify point owner giao)
1. **Spec BÁM WAL S144, KHÔNG bám draft VC-3 stale — PASS.** Spec:26 khai thẳng "🔴 Draft VC-3 (`logic-sessions/L<mm>`) STALE — owner S144 override → hub-form `sessions/session-<N>/`". Khớp WAL:6 ("VC-1 nhan-2-tang · K4 theo-hub `sessions/session-<N>/` · hook noi 4-path"). Draft `session-model-se-draft.md:43` ĐÚNG là bản VC-3 stale (đề `logic-sessions/L<mm>.md`) → spec:30 yêu cầu align nó về hub-form. Chuẩn.
2. **VC-1 2-tầng BẮT BUỘC — GIỮ (spec:30, acceptance C3).** `S<nn>` (vật-lý) + `logic:L<mm>`. Cơ-chế bẫy có thật: draft:23 + session-start OR-guard (head + session-label content-addressed, "phép 7 PASS đo S137") → single-tier S<nn>=logic ⇒ session-clause khớp nhãn cũ ⇒ tick chết (+0). Design đúng. **NHƯNG teeth-gap C3 — xem MAJOR-2.**
3. **hook 4-path — spec khai pending-restart NHƯNG claim SAI. Xem MAJOR-1.** wal-flush.ps1:13 xác nhận đúng 3-path hiện tại (`WAL.md`, `agent-memory/`, `workflows/runs/`).
4. **Q4-audit-DEFER = ĐÚNG (spec:32, C4).** "chỉ build DISPLAY, KHÔNG audit-rerun giữa phiên (phá C7 non-blocking)". Khớp hub reply + WAL:44. PASS.
5. **session_ctx_kb=64 — khớp manifest default (Khoản 3 dòng 74 "vắng→64KB"). NHƯNG 0-consumer. Xem MINOR-1.**
### MAJOR-1 [spec:28 + acceptance C2] — hook "pending-restart" claim SAI + 0 behavioral-teeth (asymmetric vs Axis A/B)
- **Bằng chứng:** `.claude/settings.json:9` = `powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1`. Invocation `-File` ⇒ powershell RE-ĐỌC body script MỖI Stop-event. Thêm `.claude/sessions/` vào `$paths` (wal-flush.ps1:13) = **body-edit** ⇒ ăn NGAY Stop kế, **KHÔNG cần restart**. Restart chỉ cần khi đổi REGISTRATION trong settings.json (script nào chạy / thêm hook-event), KHÔNG phải khi sửa body script đã-đăng-ký. Memory "hot-reload ENV-DEP #2/#3" = AGENT #2/#3, KHÔNG phải hook này.
- **Hệ quả:** (a) acceptance C2 = "wal-flush.ps1 = 4 path (grep) + khai pending-restart" = pure presence-check, KHÔNG chạy hook ⇒ pass dù hook gãy (path-string sai / loop mishandle path-4 / syntax). (b) claim "pending-restart" khiến implementer HOÃN live-verify dễ-làm-ngay. (c) Axis A & B đều có fault-inject 2-chiều; Axis C — điểm CHẠM-CƠ-CHẾ thật — lại KHÔNG có.
- **Sửa:** thay "khai pending-restart" bằng **live-verify chạy thật**: stage 1 file trong `.claude/sessions/session-N/`, chạy hook thủ-công (hoặc trigger Stop) → confirm commit `wal: flush` NUỐT file đó (lành) + confirm dir rỗng KHÔNG commit-thừa (chiều-2). Sửa/bỏ framing "ENV-dep restart" — hook -File ăn-ngay.
### MAJOR-2 [acceptance C3] — kiểm HÌNH-DẠNG nhãn, KHÔNG kiểm HÀNH-VI tick (chưa test đúng bẫy S135)
- C3 chỉ grep nhãn = `S<nn>` + `logic:L<mm>` (2-tầng) + draft aligned. Đây là bẫy Goodhart-nhẹ: **2-tầng-label BẢO-VỆ tick CHỈ KHI `logic:L<mm>` thuần ADDITIVE và KHÔNG cơ-chế tick/counter/H24/phép-7 nào chuyển sang đọc L<mm>.** C3 không kiểm điều đó ⇒ nếu implementer lỡ để L<mm> rò vào session-clause OR-guard, nhãn VẪN 2-tầng (C3 xanh) mà tick VẪN chết — đúng cái S135 vá.
- **Sửa:** thêm teeth hành-vi: (i) grep counter/OR-guard/H24 đọc `S<nn>` KHÔNG `L<mm>` (điểm-neo đếm giữ nguyên đơn-vị vật-lý) + (ii) fault-inject: ép session-clause key theo L<mm> → tick PHẢI +0 (chứng guard có răng), key theo S<nn> → tick +1. Kiểm BEHAVIOR không chỉ SHAPE.
### MAJOR-3 [spec:33 death-path + thiếu acceptance] — orphan-L: orphan-class MỚI, chỉ nhắc "(cần rule)", 0 acceptance close-or-defer
- Wire session-model đẻ orphan-class MỚI: `sessions/session-<N>/` (hoặc field `logic:L<mm>`) MỞ mà KHÔNG bao giờ `_end`-đóng vì phiên-logic chết giữa chừng (cửa-sổ sập / bỏ dở). Draft:69 tự khai UNSOLVED ("L không đóng khi phiên-logic chết → cần Sàn-3 mở rộng: tệp L mồ-côi = tín hiệu mạnh thứ 5?; ghi nhận, chưa giải trong v0").
- Spec:33 chỉ nhắc trong đường-chết "L mồ-côi khi phiên chết = drift-vector (cần rule)" — **KHÔNG có acceptance** buộc `/tiep` Sàn-3 phát-hiện folder mở. Vi phạm chính triết-lý Sàn-3 "sổ trống≠sạch" (Axis E): logic-session chết để lại folder mở, Sàn-3 không soi ⇒ `/tiep` kết luận "sạch" GIẢ.
- **Bất-đối-xứng với chính spec:** Axis D2 buộc "đóng HOẶC defer-có-lý-do documented (không im-lặng bỏ)". Orphan-L phải chịu CÙNG kỷ-luật — hiện đang lơ-lửng (death-path mention ≠ close ≠ documented-defer).
- **Sửa:** thêm acceptance "Sàn-3 mở rộng: `sessions/session-<N>/` mở-không-`_end` = tín-hiệu-mạnh #5" HOẶC defer-có-lý-do tường-minh (vd: usage session-model ban đầu thấp + scaffold idempotent) — KHÔNG để limbo.
### MINOR-1 [spec:27 + acceptance C1] — session_ctx_kb=64 = declarative, 0-consumer (H18 defined-but-unread)
- Verify: grep `session_ctx_kb` toàn repo → **0 code-consumer**. `scripts/nhip-no-probe.ps1:42` chỉ là COMMENT ("same discipline as declining to pick session_ctx_kb"), KHÔNG đọc làm config. Probe đọc `h24_cadence` (:72) + budget-path (:75), KHÔNG đọc session_ctx_kb.
- Không phải ghost-wire ĐỘC (kiến-trúc memory-nén VỐN em-main-manual; giống `harness_floor.rounded_up_tokens` "NOT actively subtracted by current scripts"). Set=64 THỎA manifest Khoản-3 function-floor ("có một trần HOẶC chấp-nhận default"). NHƯNG acceptance C1 = pure presence-check (key=64) = weak-teeth, và spec nên khai TƯỜNG-MINH "declarative, 0 active-consumer, em-main honor thủ-công" để tránh bẫy H18 "defined-but-unread trông-như-wired".
- **Sửa:** giữ C1 nhưng thêm 1 dòng honest "session_ctx_kb = declarative-ceiling thỏa manifest floor, chưa có script enforce (như rounded_up_tokens)".
### MINOR-2 [acceptance C4] — per-pause context-map thiếu teeth chạy-thật
- C4 gộp "per-pause context-map" như presence-item. Spec:31 = pause.md append context-block vào `sessions/session-<N>/`; tiep.md đọc. Teeth nên cụ-thể: chạy `/pause` 1 lần → `sessions/session-<N>/` có block MỚI append (accumulate, KHÁC WAL overwrite); chạy `/tiep` → đọc được. Hiện chỉ "documented".
## Acceptance-teeth-check
| Acc | Có răng? | Ghi chú |
|---|---|---|
| C1 session_ctx_kb=64 | WEAK (presence-only) | 0-consumer; thỏa manifest floor nhưng nên khai declarative (MINOR-1) |
| C2 hook 4-path | **FAIL-teeth** | presence-check + claim restart SAI; thiếu live-verify/fault-inject (MAJOR-1) |
| C3 VC-1 2-tầng | **WEAK (shape≠behavior)** | grep nhãn ≠ test tick; chưa chứng bẫy S135 (MAJOR-2) |
| C4 scaffold | PARTIAL | gitignore-verify OK (răng thật, exit-code) + regex OK; per-pause context-map + Q4-defer = "documented" (MINOR-2); THIẾU orphan-L (MAJOR-3) |
**Đã tự-verify (không tin doc):**
- `git check-ignore -q .claude/sessions/session-1/` → exit **1** (dir) + exit **1** (file `_context.md`) ⇒ sessions/ KHÔNG bị nuốt, C4 gitignore-acceptance PASS cho SE. (`.gitignore:83 !.claude/**` re-include, 0 pattern-sau bắt sessions/).
- `wal-flush.ps1:13` = đúng 3-path hiện tại; loop per-path add+commit (thêm path-4 an-toàn về cấu-trúc).
- `settings.json:9` = hook `-File` invocation ⇒ body-edit live-ngay (bác claim restart).
- `session_ctx_kb` grep repo-wide = 0 code-consumer.
## Risk/gap
- **Teeth-asymmetry:** Axis A/B có fault-inject 2-chiều; Axis C (2 điểm chạm-cơ-chế THẬT: hook + VC-1-tick) lại thiếu behavioral-test. Đây là nghịch-lý — axis rủi-ro-cao nhất (chạm counter + chạm hook) lại acceptance mềm nhất.
- **orphan-L (MAJOR-3):** vector drift MỚI do chính session-model đẻ ra, spec biết mà không close/defer-tường-minh.
- **Direction-of-error MAJOR-1 = CONSERVATIVE** (claim thừa cẩn-thận, không gây false "chạy được") ⇒ không phải lỗi-nguy-hiểm nhưng LÀM MẤT một live-verify rẻ + weaken C2 thành presence-check.
- Canonical-fidelity: **KHÔNG có mismatch** với WAL S144 / manifest 101e69d6 — 5/5 verify-point owner giao đều đúng hướng; vấn đề nằm ở ĐỘ-CHẶT acceptance, không ở nội-dung quyết-định.
## Verdict rationale
Design canonical-đúng + bám WAL S144 chuẩn + Q4-defer đúng + gitignore verified-clean ⇒ KHÔNG FAIL. Nhưng 3 MAJOR teeth-gap (C2 restart-claim+no-live-verify · C3 shape≠tick-behavior · orphan-L limbo) phải vá TRƯỚC implement để acceptance falsifiable thật ⇒ **PASS_WITH_FIXES**.