# sub-reviewer-3 — fable-real #2 verdict (Giai đoạn C, re-review spec-execute) — HOÀN TẤT

- **engine:** fable-real-single · reviewer · 2026-07-16 · run S127-adap-dot-16-07 · ghi TĂNG-DẦN (chống #53)
- **đối tượng:** `spec-execute-dot-16-07.md` (lead chốt 3 wave + 3 owner-gated) + `sub-investigator-2-spec-draft.md` (canonical detail)
- **phương pháp:** soi-để-phá 5 trọng-tâm + 4 live-test chạy thật + 11 spot-check độc-lập (anchor lead CHƯA check)

## VERDICT: GO-WITH-FIXES — 4 SHOULD-FIX fold trước D (0 BLOCKER, 7 NIT)

Chất spec + draft ĐỨNG VỮNG: 3-wave order đúng ràng-buộc thật, owner-gate lane đúng (2b-file1 = derived-doc thật), LỆCH-1 confirmed tận cơ-chế (projects.py:54-55 setdefault), diff không phá gì (JSON-safe, ASCII-hoá không mất nghĩa, :206 tự-đứng). 4 fix đều là lỗi verify-lệnh/scope-rơi — fold được bằng sửa spec-execute + owner-gated-proposals, KHÔNG cần re-investigate.

## Bảng finding

| # | Mức | Chỗ | Vì sao | Fix đề-xuất |
|---|---|---|---|---|
| F1 | **SHOULD-FIX (cao)** | draft §2d verify (draft:80) + spec ③ "6 file moved" | Verify `(Get-ChildItem broadcasts\inbox\*.md).Count → 0` SAI: `README.md` cũng ở root và KHÔNG được move — chính `WAL.md:20` đếm "7 (README + 6 pending)". Sau move đúng → count = **1**. Worker mechanical bám acceptance "0" có rủi-ro move luôn README.md = misfile phá khuôn inbox | Expected → `1` (chỉ README.md) hoặc lệnh `Get-ChildItem broadcasts\inbox\*.md -File \| Where-Object Name -ne 'README.md'` → 0. Ghi rõ "README.md Ở LẠI root" |
| F2 | **SHOULD-FIX (cao)** | draft §2d verify (draft:80) "Get-FileHash … == sha-prefix trong _index" | `_index` cột sha256(12) = **SHA256(body) canonical** (LIVE-TEST T3: body-sha thư-0 = `181a6d195468` == _index; whole-file Get-FileHash = `f29247cfc33e` ≠) → so Get-FileHash với _index chắc chắn LỆCH → false-tamper giữa wave-3 (đúng lớp S125 verifier-bệnh) | Byte-preserve = `Get-FileHash` TRƯỚC move == SAU move (tuyến (a) check-email.md:17). Muốn so _index → recompute **body-sha** theo công-thức check-email.md:17(b) |
| F3 | **SHOULD-FIX** | spec §Owner-gated (3 mục) vs draft:135 | Draft 4a có mục thứ 4: `memory-budget.json:65` thêm đuôi "(convention -- chua do tokenizer that tai SE; dinh-chinh 58f5afd8)" — "gộp gate với 2b". Spec-execute RƠI mục này ở CẢ wave-1 lẫn owner-gated list → class-fix C1 thiếu đúng NGUỒN hằng-số /3.0 (bài S122/S123: vá 1 lớp = vá đủ matcher cùng-lớp trong diff) | Thêm mục (iv) vào `owner-gated-proposals-dot-16-07.md`: budget:65 tail-note, gộp cùng câu hỏi (i) |
| F4 | **SHOULD-FIX** | spec wave-2 item 10 "STAGE-2 done-ở-wave-3" | Report bản-1 UPDATE viết ở **wave-2**, move 2d chạy **wave-3 CUỐI** → report ghi "done" = **future-claim** (lớp S108: "đã làm X" phải verify X trước khi ghi). Move fail ⇒ claim sai nằm trên đĩa, email đã stamp trước đó | Wave-2 wording = "STAGE-2: chạy ở wave-3" HOẶC wave-3 worker sau move xong update lại dòng đó (adap-report.md:33 idempotent). Email giữ như draft (không claim move done) |
| F5 | NIT (hạ mức sau T2) | verify pattern tiếng Việt qua `Select-String` (draft:65/:71/:110/:148) | Nghi false-match theo lớp S125/gotcha #30 — **ĐO THẬT thì KHÔNG bệnh**: PS 5.1 `Select-String -Path` đọc file StreamReader UTF-8-default → match đúng cả trên UTF-8-no-BOM + ACP Windows-1252 (T2: "7 khoản cũ SAI"=1 · "n=1 ở hub"=1). Bệnh S125 nằm ở `Get-Content`(-Raw) ANSI-default | Giữ nguyên dạng lệnh `Select-String -Path` như draft; CẤM worker "cải tiến" sang `Get-Content \| Select-String` không -Encoding; VN-pattern KHÔNG được nhét vào .ps1 file (gotcha #30) |
| F6 | NIT | spec wave-1 item 2 "wording draft :134 có chữ Việt-có-dấu" | Non-ASCII duy nhất ở draft:134 = **em-dash "—"** (chữ đã ASCII-stripped sẵn "CHUA do... that tai SE"). Chỉ dẫn đúng, mô tả sai loại | Đổi thành "ký tự non-ASCII (em-dash)" — worker khỏi tìm dấu tiếng Việt không tồn tại |
| F7 | NIT | draft Việc-3 verify (draft:110) `"nac G-011\|…"` | Report thật dùng "**nấc** (G-011)" (bookend:4 — dấu + ngoặc) → alternative "nac G-011" 0-hit vĩnh viễn; grep 4-alternative không chứng "đủ 5 trường" (thiếu id-broadcast) | Pattern → `"G-011"`; kiểm 5 trường bằng 5 label thật hoặc để HMW-review đọc mắt |
| F8 | NIT | spec ③ "JSON parse OK 2 file sửa (… + không đụng memory-budget.json)" | Tự mâu-thuẫn: "2 file sửa" nhưng file 2 là xác-nhận-KHÔNG-đụng | "JSON parse OK: rag.json (đã sửa) + memory-budget.json (xác-nhận không đụng trong D)" |
| F9 | NIT | draft 2a after-text (draft:64) | Dòng 8 gốc có backtick quanh `>=` ×2; after-text transcribe đánh rơi. Draft tự dặn "GIỮ nguyên enumeration" | Worker exact-edit giữ backtick, chỉ chèn 2 note ngoặc + đổi câu phân-loại |
| F10 | NIT | 2b-file1 (worker) ⟂ (i) owner-gated — cùng câu chuyện neo | :206 = derived-doc thật (số 6/15/3 + policy giữ; block :185-206 không mâu-thuẫn) → lane worker ĐÚNG. Nhưng nếu anh đổi wording (i) thì :206 phải kể theo | Thêm 1 dòng vào owner-gated-proposals: "anh đổi wording (i) ⇒ re-sync session-start.md:206 cùng lượt" |
| F11 | NIT | 4c câu cửa-duyệt (draft:146) | Câu cửa-duyệt CHỨA chính các nhãn nó săn ("measured/calibrated/đã-đo") = mention-not-use. Nay SE 0 máy-quét tự-động (hub sweeper KHÔNG port) → vô hại; mai sau port sweeper thì dòng này false-positive (gen-2 citation-trap S123) | ½ dòng vào honest-caveat bản 3 (4d): "câu cửa-duyệt = mention; exemption nếu port máy-quét" |

## Soi theo 5 trọng-tâm đề bài

1. **Diff có phá gì không — KHÔNG:**
   - (a) rag.json:31 rationale mới **JSON-safe** ✓: 0 double-quote chưa escape (nháy đơn 'Evaluate trial week 3'), non-ASCII hợp lệ UTF-8 JSON và file ĐÃ chứa sẵn ("→" ở :31 hiện tại, tiếng Việt ở :3). Claim "chunking.py 0 API-call" có quy-thuộc "broadcast f5ce2778:" và MIRROR đúng comment hub tự viết ở `projects.py:39` (đối chiếu tận nơi) ✓. T1 chứng parse-lệnh chạy đúng.
   - (b) backfill.ps1: :25 after pure-ASCII ✓; :117 after còn 1 em-dash — spec đã bắt ASCII-hoá (F6). ASCII-hoá KHÔNG mất nghĩa ("CHUA do tokenizer that tai SE" giữ trọn ý). `grep -i calibrat` scripts/ → đúng 2 site :25/:117 file này (khớp draft "2 chỗ"); selfimprove-audit:283/:304/:322 "calibration-interim" = miễn-trừ visible sẵn (khớp draft:124). Comment-only, :118-119 code giữ nguyên. T4: script exit-0 + output có dòng literal `tok RANGE [low..high]  : [118424 .. 157898]` — acceptance "giữ dòng tok RANGE" đo được ✓.
   - (c) session-start.md:206 — before-text draft khớp đĩa **exact** (đuôi dòng 206); "Chỉnh lại sau chu-kỳ-2" duy nhất 1 chỗ trong file → exact-replace an toàn; block :185-206 đọc lại: :205 "số nhịp = quyền anh" + (c) OVERDUE đọc-từ-config vẫn đứng, wording mới chỉ đổi MỐC so-sánh hub→SE, vế đầu owner-intent giữ nguyên → tự-đứng, 0 mâu-thuẫn ✓.
2. **Thứ-tự wave — ĐÚNG ràng-buộc thật:** mọi consumer file-gốc (5 reports wave-2, email wave-3 item 11) đứng TRƯỚC move 2d (item 12 CUỐI); không việc nào sau move cần file ở root. Sót duy nhất = F4 (report bản-1 nhắc "STAGE-2 done" trước khi nó chạy).
3. **Owner-gate — đúng lane, thiếu 1 mục:** (i)(ii)(iii) đúng; 2b-file1 :206 = derived-doc thật → worker lane ĐÚNG (kèm F10); RƠI mục budget:65 = F3. Điều-chỉnh lead "proposals-file only, apply lượt sau" AN-TOÀN hơn draft — tán thành (không đụng vùng owner-ratified khi anh vắng).
4. **Acceptance đo được — có, sau khi vá F1/F2:** 4 live-test bên dưới; 2/4 lệnh verify draft có lỗi thật (F1 count-0-quên-README, F2 so-sai-loại-hash) — còn lại chạy đúng nguyên văn trên máy này.
5. **Email khuôn §VIỆC-6 vs send-email.md thật — KHỚP đủ:** id :27 ✓ · sha canonical :28 (strip \r + strip-1-leading-newline + CẤM `Get-Content -Raw`) ✓ · 6c selftest-stamp NGAY sau Write :32 ✓ · bước 7 log `_index` :33 cùng lượt ✓ · to=ai_infra ⇒ 6b CC không bắt ✓ · reviewer-gate outward :37 phủ bằng HMW-review Harness-9 ✓ · WAL:12 ask do-token pending khớp đĩa — email GIỮ pending đúng ✓.

## [LIVE-TESTS] — 4 lệnh chạy thật trên máy này (PS 5.1.26100.8875 · pwsh KHÔNG có · ACP Windows-1252)

| T | Lệnh (nguồn draft) | Kết quả | Kết luận |
|---|---|---|---|
| T1 | `python -c "import json; …print(c['contextual_retrieval'])"` (draft:39) | in `True` (pre-flip) | Lệnh chạy đúng nguyên văn; post-flip sẽ in `False` như acceptance ✓ |
| T2 | `Select-String -Path <bookend> -Pattern '7 khoản cũ SAI'` (draft:65) + `-Pattern 'n=1 ở hub'` trên session-start (draft:71) | **1 hit + 1 hit** (file no-BOM: bytes đầu `23 20 61`/`2D 2D 2D`) | VN-pattern qua `Select-String -Path` HOẠT ĐỘNG trên PS 5.1 → F5 hạ NIT; bệnh S125 thuộc `Get-Content` ANSI-default, không thuộc Select-String |
| T3 | `Get-FileHash` thư-0 vs body-sha canonical (check-email.md:17b) vs `_index` | whole-file `f29247cfc33e` ≠ _index `181a6d195468` = body-sha ✓ | `_index` cột = body-sha → draft 2d verify so Get-FileHash với _index SAI LOẠI HASH → F2 confirmed |
| T4 | `powershell.exe -ExecutionPolicy Bypass -File scripts\crystallized-backfill.ps1` (draft:136) | exit-0 + output `tok RANGE [low..high]  : [118424 .. 157898]` | Acceptance 4a đo được, baseline sạch ✓ |

## [SPOT-CHECKS độc-lập] — 11 anchor lead CHƯA check (lead đã check: rag.json:26/:31 · budget:123 · backfill:25/:117-119 · budget:89/:92 · bookend:8)

1. `broadcasts/_index.md:11` khuôn pending→processed + `:33-38` đúng 6 row pending/(root), sha khớp run.md ✓
2. `session-start.md:206` before-text exact + block :185-206 không mâu-thuẫn + uniqueness 1/1 (grep) ✓
3. `adap-report.md:13-19` LOCK 5 trường + `:33` idempotent-update + `:43` Write-tool-only — draft trích đúng cả 3 ✓
4. `send-email.md:24-34` id/sha-canonical/6c/bước-7 + `:37` reviewer-gate — draft §VIỆC-6 khớp đủ ✓
5. `.claude/agents/reviewer.md:35` = `### 2. Apply 5-category checklist` exact; section kết ở :44 → điểm chèn 4c không mơ hồ ✓
6. `scripts/mfe-eval.ps1:166-167` `/4.0`·`/3.0` + `:179-180` RANGE-honest, 0 nhãn calibrated — claim "cùng-lớp giữ nguyên" của draft ĐÚNG ✓
7. `memory-budget.json:65` nguồn hằng-số "~3.0-3.5 byte/tok" đúng như draft tả (→ lòi F3 khi so spec) ✓
8. `WAL.md:12` ask do-token pending ✓ + `WAL.md:20` "7 = README + 6" (→ bằng chứng F1) ✓
9. `AI_INFRA\claude-rag\lib\projects.py:39` `False # OWNER-FINAL 2026-07-16 (s100)` + `:46-55` walk-up + `setdefault` merge-missing-only → **LỆCH-1 mechanism CONFIRMED tận gốc**: SE override `true` thắng default → worker in-repo edit = lane đúng ✓
10. Glob inbox root = ĐÚNG 6 broadcast + README (khớp danh sách 2d) + `inbox/ai_infra/` tồn tại (25 file) → `git mv` target sẵn ✓
11. `grep -i calibrat` toàn scripts/ = 2 site backfill + 3 "calibration-interim" selfimprove-audit (miễn-trừ visible) — sweep draft chính xác ✓

## memoryDelta

- **task:** Giai đoạn C — adversarial re-review `spec-execute-dot-16-07.md` + draft canonical trước khi HMW workers (D) chạy; 4 live-test + 11 spot-check độc-lập.
- **verdict:** GO-WITH-FIXES — 4 SHOULD-FIX fold trước D (F1 README-count · F2 sai-loại-hash vs _index · F3 budget:65 rơi khỏi owner-gated · F4 STAGE-2 future-claim) + 7 NIT; 0 BLOCKER.
- **learned:** (1) Lệnh verify trong spec cũng là CODE — phải chạy thử trên máy trước khi worker bám: 2/4 lệnh draft sai thật (count quên README; so body-sha bằng whole-file-hash). (2) Tinh-chỉnh lớp S125: PS 5.1 `Select-String -Path` đọc UTF-8-no-BOM ĐÚNG (StreamReader UTF-8-default) — bệnh ANSI-decode thuộc `Get-Content`(-Raw); ranh giới bệnh nằm ở CMDLET, không ở shell version. (3) Bước nén draft→spec-execute là chỗ RƠI item thật (budget:65 gated-edit biến mất cả 2 lane) → fold spec phải đối-chiếu bảng-lane draft từng dòng.
- **surprise:** VN-diacritic pattern match NGON trên PS 5.1 + no-BOM + ACP Windows-1252 — ngược trực-giác gotcha #30/S125; nghi-án encoding phải ĐO trên đúng cmdlet thay vì suy từ lớp bệnh cũ (đúng bài fault-injection: happy-path + negative đều chạy thật).
