# sub-harvest-S150 — H2 harvest-integrity GATE 5-trục (closeout phiên-logic 3)

> Vai: `harvest-curator` (H2, read-only + propose-only). Nấc `/session-end` §L.b(d)(f).
> Phạm-vi: commit `aaf95ef`..HEAD `a9efa34` (22 commit, 2026-07-24 18:23 → 2026-07-25 10:07), nhãn S149 + S150.
> 🔴 GHI-ĐĨA-TRONG-LÚC-LÀM (chống #53) — file này viết TIẾN-DẦN, không chờ cuối.

---

## §0 — Ground truth thu được (append theo thứ-tự tìm ra)

### 0.1 Phạm-vi commit (VERIFIED từ đĩa)
- `git log --oneline aaf95ef..HEAD` = **22 commit**. Cấu-thành: 1 commit nội-dung `2f39a7e [CLAUDE] Docs: S148 — gỡ note dạng chuỗi khỏi class_repeat.counts` + 18 `wal: flush` + 3 `wal: pause`.
- Ranh 2 cửa-sổ: window-1 kết ở `a314b12 wal: pause` (2026-07-25 06:59); window-2 = `5a34a29`(08:58) → `a9efa34 wal: pause`(10:07).

### 0.2 Run-folder repo-wide
- `ls -1d .claude/workflows/runs/*/ | wc -l` = **52 folder** (mẫu-số ngày-đo 2026-07-25; m#12 — mẫu-số có NGÀY-ĐO).
- 6 folder trong/quanh phiên-logic 3: 5 folder scope + `2026-07-25-S150-closeout-bookend` (wave đang chạy, chưa synthesis — by-design, lead viết sau).

### 0.3 Role-dir agent-memory
- `find -mindepth 1 -maxdepth 1 -type d` = **19 role-dir** (m#11 guard: KHÔNG `cut -d/ -f3` vì nuốt `memory-budget.json` + `.mfe-state.json` root-level).
- 🚩 **FLAG-P1 (Placement, git-MÙ m#13):** `.claude/agent-memory/ring1-audit` = **THƯ-MỤC RỖNG** (0 file, không có `MEMORY.md`). `find .claude -type d -empty` → đúng 1 hit này. `git status --porcelain` KHÔNG BAO GIỜ thấy (git mù dir rỗng). Anh em nó `ring2-audit/MEMORY.md` ĐÃ có (+37 dòng trong range). ⇒ Lớp lỗi TÁI-PHÁT giống S123/S125 (2 H24-dir-no-seed, closed @S132).

### 0.4 Delta agent-memory trong range (git diff --stat aaf95ef..HEAD)
8 file đổi / +62 −10:
| file | ± | phân-loại sơ-bộ |
|---|---|---|
| `harness-refine/MEMORY.md` | 2 (±1) | rename-ref `lead-omission-auditor`→`lead-gap-auditor` |
| `harvest-curator/MEMORY.md` (của tao) | 2 (±1) | rename-ref (chờ soi) |
| `lead-gap-auditor/MEMORY.md` | 4 | (chờ soi) |
| `lead-stale-auditor/MEMORY.md` | 4 | (chờ soi) |
| `memory-budget.json` | 17 | config, KHÔNG phải diary |
| `reviewer/MEMORY.md` | 4 (±2) | (chờ soi) |
| `ring2-audit/MEMORY.md` | +37 | **entry mới** — seed/first-run |
| `tooling-auditor/MEMORY.md` | 2 (±1) | rename-ref |

⚠️ Quan-sát sớm: delta diary trong range **rất mỏng** so với 5 run-folder + ~24 sub-file. Đây là dấu-hiệu cần soi Coverage kỹ (harvest có thể đã landed ở commit TRƯỚC `aaf95ef`, hoặc chưa gom).

---

## §1 — CLOSE-GATE DUAL-ACCEPT (5 run scope) — **0 orphan / 5**

| # | run-folder | bản-ghi-kết-quả | byte | dạng | verdict |
|---|---|---|---|---|---|
| 1 | `2026-07-24-S148-h24-force-fire` | `h24-synthesis.md` | 5.637 | **1** (phẳng) | ✅ ĐỦ |
| 2 | `2026-07-24-S149-dong-du-5-vong` | `invest-synthesis.md` | 579 | **1** | ✅ ĐỦ |
| 3 | `2026-07-24-S149-owner-gated-3-khoan` | `gate-synthesis.md` | 541 | **1** | ✅ ĐỦ |
| 4 | `2026-07-24-S149-hoi-tu-bookend` | `hoi-tu-synthesis.md` | 3.533 | **1** | ✅ ĐỦ |
| 5 | `2026-07-25-S149-adap-backlog` | `backlog-synthesis.md` | 1.071 | **1** | ✅ ĐỦ |

- **KHÔNG dừng ở `-size +0c`:** 2 file nhỏ nhất (579B/541B) đã ĐỌC FULL — không phải stub, đúng khuôn dạng-1 nén ("Kết quả tiêu thụ tại: `<path>`"). Pointer của cả 2 VERIFY tồn-tại trên đĩa: `spec-hoi-tu-bookend-24-07-2026.md` (13.332B) · `spec-owner-gated-3-khoan-24-07-2026.md` (9.107B).
- **Orphan repo-wide (dual-accept, đo 2026-07-25 ~11:2x):** 52 dir · **49 có `run.md`** · **orphan = 1** = chính `2026-07-25-S150-closeout-bookend` (wave đang chạy, lead viết synthesis sau ⇒ **by-design, KHÔNG tính**). 3 dir không có `run.md` = `S117-pe-approve-minmax-range` + `S117-pe-luyke-finalize` (spec-only by-design) + `S144-bootstrap` — tồn-tại từ trước phạm-vi, không phải nợ phiên này.
- ⇒ **Close-gate: PASS.** Khớp /tiep §0 scan (0 orphan), RE-VERIFY độc-lập bằng folder-scan + đọc nội-dung.

---

## §2 — 5 TRỤC

### 2.1 Coverage — 🚩 **FLAG (2)**
**Giải nghi-vấn §0.4 "delta diary mỏng":** truy `git log --follow` từng sổ (KHÔNG suy từ `--stat`).

| vai | invocation trong 5 run (đếm từ ĐĨA) | commit sổ gần nhất | kết |
|---|---|---|---|
| `lead-stale-auditor` | W1 @S148 | `932d607` **07-24 18:21** (S148 closeout) | ✅ ĐÃ gom — rơi TRƯỚC `aaf95ef` (18:22) đúng **1 phút** |
| `lead-gap-auditor` | W2 @S148 | `932d607` 07-24 18:21 | ✅ ĐÃ gom (cùng lý-do) |
| `ring2-audit` (cũ `h24-audit`) | W3 @S149 → `sub-h24-audit-S149.md` 25.724B | `7d2b7fa` **07-24 19:08** (trong range) | ✅ SEED MỚI, chất-lượng cao |
| `investigator-codebase` | **10** (7 lane `dong-du` + 1 `owner-gated` + 1 `hoi-tu` + 1 `backlog`) | `5f6c3be` **07-23 17:37** — 0 commit sau đó | 🚩 **F3** |
| `reviewer` | **1 thật** (`sub-reviewer-hoi-tu.md` 15.733B, `/fable-real` gate) | `5f6c3be` 07-23; touch `9abc2e1` chỉ ±2 dòng **rename-ref** | 🚩 **F4** |
| `implementer` (generic, 11 lane: M1-M5 + apply L1-L6) | 11 | — | ✅ **no-diary BY-DESIGN** (không có role-dir `implementer/`; tiền-lệ S132 wave-worker generic) |

- ⚠️ **Trừ đúng 1 ca giả:** `2026-07-25-S149-adap-backlog/sub-review-gate.md` (1.486B) TỰ KHAI dòng 2 *"em-main-solo re-do — khai provenance dưới"* ⇒ **KHÔNG phải reviewer invocation**, không tính vào mẫu-số. (Đếm từ đĩa nhưng phải ĐỌC header, m: "đếm từ ĐĨA, đừng đếm từ brief" — nay thêm: đĩa cũng phải đọc nhãn provenance.)
- 🔴 **F3 + F4 là ĐIỂM MÙ MÁY, không phải máy im vì sạch:** detector **C11(b) diary-delta** (`scripts/governance-detectors.ps1:1673-1679`, land @S149) chỉ quét vai có frontmatter **`INFORM-only`** — `grep -l "INFORM-only" .claude/agents/*.md` = 10 vai; `investigator-codebase` + `reviewer` đều **0 hit** ⇒ nằm NGOÀI lưới C11 **by-design**. Hai vai này có sổ giàu và VẪN ghi theo phiên (inv-cb tag tới **S148**, reviewer tới **S147**) ⇒ kỳ-vọng là THẬT, không phải tao bịa chuẩn.
- 🔴 Chính `sub-invest-hoi-tu.md:20` đặt tên bệnh này trong cùng phiên: *"**đo rồi như chưa đo** — vai chạy mà sổ đứng yên (GAP-3 ×4 · backfill S146 · tally view-* · trio diary)"*; và `sub-reviewer-hoi-tu.md:42` bắt spec **RƠI** khoản *"(4) luật diary-seed on-behalf sau VERIFY"*. F3/F4 = đúng lớp đó, tái-diễn **ngay trong phiên phát-hiện nó**.
- **Verdict Coverage: FLAG** (F3, F4). Không FAIL: mọi invocation ĐỀU có vết run-folder (24/24 sub-file), gap là lớp **per-ROLE diary**, propose-only.

### 2.2 Completeness — ✅ **PASS**
Sổ đã landed đủ 4-field:
- `ring2-audit`: 2 entry {task: chấm vòng S148-force-fire · verdict: **7 ĐẠT / 0 TRƯỢT / 2 KHÔNG-CHẤM-ĐƯỢC** · learned: 3 bài phương-pháp · surprise: en-dash nuốt `grep -E`} + Tag line cả 2 entry.
- `lead-stale` / `lead-gap` (@S148, ngoài range): entry có FLAG-count + evidence-path + class.
- Không entry nào thiếu verdict hoặc thiếu evidence-ref.

### 2.3 Placement — 🚩 **FLAG (2)**
- 🚩 **F1 — HIGH — `.claude/agent-memory/ring1-audit/` TỒN-TẠI mà RỖNG** (0 file). `find .claude -type d -empty` = **đúng 1 hit**; `git status --porcelain` **IM** (m#13 git mù dir rỗng) ⇒ không lớp máy nào thấy.
  - Vai `ring1-audit` **INFORM-only** VÀ là **task 5 của chính wave này** (`run.md:13`) ⇒ nó sẽ spawn **MÙ HOÀN TOÀN**, y hệt ca `ring2-audit` @S149 (sổ đó tự khai: *"thư-mục này tồn tại mà RỖNG suốt S146→S149 ⇒ lượt chạy S149 vai vào mù hoàn toàn"*).
  - Lớp lỗi này **đã được ghi nhận 2 lần trước**: reviewer `archive/2026-07.md:113` @S145 gọi đích danh *"phép-4 LANDMINE (`…` EMPTY, auto-fires close ⇒ phép-4 FAIL)"*; S123/S125 cùng lớp, closed @S132. ⇒ **GAP-3 lần 5**.
- 🚩 **F2 — MED — `ring4-audit` KHÔNG CÓ thư-mục nào** (`ls` → No such file). Vai có trong roster từ S145b (18→20) + có frontmatter `INFORM-only`, nhưng chưa từng chạy ⇒ C11(b) im (đúng luật: C11 chỉ bắt vai ĐÃ chạy). Nhà chưa dựng ⇒ chạy lần đầu sẽ lặp đúng F1.
- ✅ PASS phần còn lại: 19 role-dir · 18 có `MEMORY.md` · `git status --porcelain .claude/agent-memory/` = **0 mồ-côi** · **0 stray cwd-relative** `<subdir>/.claude/...` (lớp S54/S119) · mọi delta §0.4 nằm đúng nhà vai.

### 2.4 Corruption — ✅ **PASS**
- **U+FFFD = 0** trên TOÀN `.claude/agent-memory/` (L1 + archive) — `grep -rlP "\x{FFFD}"` rỗng. (KHÔNG dùng `grep "Ã|Æ°|â€"` — m#6: sinh dương-giả trên UTF-8 tiếng Việt.)
- **iconv round-trip: VALID 18/18** MEMORY.md.
- **0-byte: 0** file (`find -name "*.md" -size 0` rỗng) — gotcha #53 closeout-truncate không tái.
- **moved-not-cut: N/A-sạch** — range này **không file `archive/*` nào bị chạm** (`git diff --stat` §0.4 chỉ có L1 + config) ⇒ không có thao-tác curate nào để dương-giả cut-not-moved.
- ℹ️ **INFORM-6 (LOW, không tính corruption):** rename-sweep quét L1 mà **KHÔNG quét L2** ⇒ `reviewer/MEMORY.md` (stub) và `reviewer/archive/2026-07.md:108,113,115` (nội-dung) nay **lệch TÊN**: stub ghi `ring1-audit` / `ring2-audit+ring4-audit`, archive giữ `tooling-harvest-audit` / `h24-audit`+`sleep-audit`. Stub là bản NÉN (không đòi byte-identical) nên không phải cut-not-moved; nhưng grep-theo-tên từ stub xuống archive sẽ **0 hit**. (m#15: tách dòng-nội-dung ⟂ stub-trỏ-archive — ca này là lệch có thật ở lớp stub.)

### 2.5 Fidelity — 🚩 **FLAG-1 (escalate `reviewer`, tao KHÔNG tự phán)**
- 🚩 **F5 — MED — `ring2-audit/MEMORY.md` có 2 CITE-DEAD do rename-sweep:**

| cite trong sổ | file THẬT trên đĩa | byte |
|---|---|---|
| `runs/2026-07-22-S145-apply-hub-answers/sub-ring2-audit-S146.md` | `sub-h24-audit-S146.md` | 6.169 |
| `runs/2026-07-24-S148-h24-force-fire/sub-ring2-audit-S149.md` | `sub-h24-audit-S149.md` | 25.724 |

  - 🔵 **KHÔNG PHẢI BỊA — số liệu KHỚP ĐĨA:** sổ khai "6.169B" ↔ đĩa 6169B; khai "25,7KB lượt-2" ↔ đĩa 25724B. Nội-dung truy được, chỉ **đường dẫn chết**.
  - 🔴 Cái làm nó thành FLAG: **tự mâu-thuẫn với chính banner của nó** — banner đầu file tuyên *"artifact lịch-sử trong `runs/**`/counter-history **giữ tên cũ làm vết**"*, nhưng 2 cite này lại bị đổi sang tên mới.
  - 🔵 **Đòn-bẩy bất-đối-xứng (chống đọc thành "sweep sai toàn cục"):** `lead-gap-auditor` 2/2 cite OK · `lead-stale-auditor` 2/2 cite OK — cả 4 GIỮ tên artifact cũ, đúng policy. ⇒ sweep chỉ lệch ở **đúng 1 file**, không phải bệnh hệ-thống.
  - **Đề-xuất (em-main quyết):** trả 2 chuỗi path về tên cũ, HOẶC giữ tên mới + thêm hậu-tố `(đĩa: sub-h24-audit-S14x.md)`. Rẻ, 2 chỗ.
- ✅ **Fidelity phần còn lại STRONG:** `ring2-audit` **tự khai bất-lợi cho mình** — GAP-3 lần 4 chính nó là nạn-nhân; **từ chối ĐẠT-ảo** 2 FLAG V4/V5 ("KHÔNG TỒN TẠI TRÊN ĐĨA ⇒ KHÔNG-CHẤM-ĐƯỢC"). Tao **re-verify** đối-chứng nó nêu: folder `S148-h24-force-fire` thật sự KHÔNG có `sub-lead-*` nào · folder S146 thật sự có **đúng 3** file `sub-*-S146.md` ⇒ claim HELD. Không phát-hiện dấu-hiệu bịa ở bất kỳ entry nào trong range.

---

## §3 — DELTA MỒ-CÔI: **0**

Mọi delta §0.4 map được về run/task:

| delta | map về |
|---|---|
| `ring2-audit` +37 (seed) | `runs/2026-07-24-S148-h24-force-fire` W3 (`run.md:` stage W3) |
| `lead-gap` / `lead-stale` / `reviewer` / `tooling-auditor` / `harvest-curator` / `harness-refine` (rename-ref) | `runs/2026-07-24-S149-hoi-tu-bookend/run.md` stage *"RENAME 5 vai (chen giữa, anh ratify) — 27 file bulk + 4 targeted"* |
| `memory-budget.json` +17 | `hmw_width{cap:20, mechanism:loud-skip, ratified:2026-07-24}` ⟵ `gate-synthesis.md` (O-7) + rename key `lead-view→lead-stale`, `lead-omission→lead-gap` |

⇒ **0 entry mới không có nhà.** (Ngược lại: có vai CÓ việc mà THIẾU entry = F3/F4 §2.1.)

---

## §4 — CHORE-MEMORY (INFORM, không chặn gate)

- ℹ️ **INFORM-7 (LOW):** `memory-budget.json` registry **thiếu 3 vai `ring*`** (`ring1-audit` · `ring2-audit` · `ring4-audit`) — 17 key có `l1_hot`, roster INFORM-only là 10 vai. **KHÔNG ảnh-hưởng phép đo**: `scripts/measure-agent-memory.ps1:10` liệt-kê bằng `Get-ChildItem -Directory` (từ ĐĨA), không đọc registry ⇒ số "0 over-cap" của máy vẫn đúng. Đây là drift **registry-only**.
- ℹ️ **Soft-target 17.1KB (hook read-limit), KHÔNG mâu-thuẫn "0 over-cap" của máy** (máy đo hard-cap 25.6KB — 2 thước khác nhau, nói rõ để khỏi đọc thành cãi nhau): **8 sổ vượt 17.1KB** — `test-specialist` 22.140 · `frontend-designer` 21.492 · `implementer-backend` 19.449 · `cicd-monitor` 19.281 · `tooling-auditor` 18.530 · `reviewer` 17.412 · `lead-gap-auditor` 17.378 · **`harvest-curator` (tao) 17.176**. Đề-xuất self-compact của tao: **DEFER** (không cắt giữa lượt GATE).

---

## §5 — SPAWN-RECORD 4-FIELD ĐỀ-XUẤT — wave closeout S150
> Đo từ ĐĨA lúc **2026-07-25 ~11:28** (m#12: mẫu-số có GIỜ-ĐO — wave đang chạy, 2 vai KIỂM chạy SAU tao).
> Format `{agent · task · nấc · evidence}`. **Em-main VERIFY→APPEND** — tao KHÔNG tự ghi sổ vai khác.

| # | agent | task | nấc | evidence (path · byte @11:28) |
|---|---|---|---|---|
| 1 | `tooling-auditor` | H1 tooling-freshness CHỐT 4-mặt (rename 5 vai + 4 script mới + C9-C12 + 23 adap-report + flip Opus-5) — §L.b(g) | **executed** | `runs/2026-07-25-S150-closeout-bookend/sub-tooling-S150.md` · 9.820B |
| 2 | `harvest-curator` (tao) | H2 harvest-integrity GATE 5-trục + close-gate 5 run phiên-logic + spawn-record wave — §L.b(d)(f) | **executed** | `…/sub-harvest-S150.md` (file này) · verdict `GATE-PASS-5` |
| 3 | `lead-stale-auditor` | soi-lead view-LỆCH-source (bookend @close lượt đầu) — §L.b(j)(ii) | **agreed** *(file đã xuất-hiện 11:28, chưa chốt return)* | `…/sub-lead-stale-S150.md` · 7.725B |
| 4 | `lead-gap-auditor` | soi-lead cái-BỊ-THIẾU (bookend @close lượt đầu) — §L.b(j)(ii) | **agreed** *(file đã xuất-hiện 11:25, đang lớn dần)* | `…/sub-lead-gap-S150.md` · 1.916B |
| 5 | `ring1-audit` | KIỂM vòng-1: verify OUTPUT H1+H2 (AUTO sau đo, tuần-tự C4b) — §L.b(g-bis) | **planned** | *(chưa spawn)* — 🔴 **chặn bởi F1: sổ vai RỖNG, sẽ vào mù** |
| 6 | `ring2-audit` | KIỂM vòng-2: verify FLAG-list cặp H24 (AUTO sau cặp, tuần-tự C4b) — §L.b(j)(ii-bis) | **planned** | *(chưa spawn)* — sổ OK (seed @S149) |

**Lưu ý cho em-main khi nâng nấc:** 3 vai (#3/#4/#5·#6) sẽ trả SAU tao ⇒ nâng `agreed/planned → executed` **chỉ sau khi re-Read file đích + verify byte>0** (B3 no-overwrite-unverified). Với #5, nếu quyết seed `ring1-audit/MEMORY.md` trong phiên thì seed **TRƯỚC** spawn mới có tác dụng (memory nạp lúc spawn).

---

## §6 — BẢNG FLAG TỔNG

| id | trục | sev | nội-dung | đề-xuất |
|---|---|---|---|---|
| **F1** | Placement | **HIGH** | `agent-memory/ring1-audit/` rỗng; vai INFORM-only, spawn task-5 wave NÀY ⇒ vào mù. GAP-3 lần 5. git-MÙ | seed `MEMORY.md` on-behalf **trước** spawn ring1 |
| **F2** | Placement | MED | `ring4-audit` chưa có thư-mục nào (roster từ S145b) | dựng nhà + seed tối-thiểu trước lần chạy đầu |
| **F3** | Coverage | MED | `investigator-codebase` 10 invocation @S149 → **0** delta sổ (commit cuối 07-23). Ngoài lưới C11(b) | consolidate 1 entry từ 10 sub-file (nguồn còn nguyên trên đĩa) |
| **F4** | Coverage | MED | `reviewer` 1 invocation thật (`sub-reviewer-hoi-tu.md` 15.733B) → **0** entry | append 1 entry gate hoi-tu |
| **F5** | Fidelity | MED | `ring2-audit` 2 cite-dead do rename-sweep, **tự mâu-thuẫn banner của mình**; số liệu KHỚP đĩa ⇒ **không bịa** | escalate `reviewer` xác-nhận; sửa 2 chuỗi path |
| I-6 | Corruption-adj | LOW | reviewer L1-stub ⟂ `archive/2026-07.md` lệch tên (sweep không xuống L2) | INFORM |
| I-7 | Chore | LOW | `memory-budget.json` thiếu 3 key `ring*` (đo không sai — script đọc đĩa) | INFORM |

**VERDICT: `GATE-PASS-5`** — Close-gate 0/5 orphan · Completeness PASS · Corruption PASS · Coverage FLAG(F3,F4) · Placement FLAG(F1,F2) · Fidelity FLAG(F5, escalate reviewer). 0 delta mồ-côi. Không FAIL vì: 24/24 invocation ĐỀU có vết run-folder, 0 mất dữ-liệu, 0 corruption, 0 bịa phát-hiện được — 5 flag đều là **propose-to-fix**, rẻ, không chặn đóng phiên.

