# 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".
