# 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 vô 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 là "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" mà 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 vì 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.
