# sub — harvest-curator (H2) @open S159 · 5-trục harvest-integrity

- **run-id:** `2026-07-29-S159-bookend-open` · vai `harvest-curator` (H2, INFORM-only, propose-only)
- **bắt đầu:** 2026-07-29 (lượt @open, phiên-LOGIC L8)
- **luật tự-áp:** ghi-đĩa-TRONG-lúc-làm (anti-#53); mỗi finding dán LỆNH vừa chạy (anti-pattern #2); mẫu-số khai tiêu-chí lọc (m#19) + ngày/phút đo (m#12).

---

## §0 — Universe & mẫu-số (đo tươi, 2026-07-29)

Lệnh:
```
find .claude/workflows/runs -mindepth 1 -maxdepth 1 -type d | wc -l     -> 66
for d in runs/*/; do [ -f "$d/run.md" ] && echo "$d"; done | wc -l      -> 63
```

- **66 dir** dưới `runs/` (+2 file root: `README.md`, `_ledger.md` — ledger 🧊 RETIRED H18-B S100, không dùng làm authority).
- **63 dir CÓ `run.md`** = universe orphan-scan.
- **3 dir KHÔNG có `run.md`** ⇒ **ngoài universe, KHÔNG orphan** (đã phân loại @S153, verify lại lượt này):
  - `2026-07-14-S117-pe-approve-minmax-range` · `2026-07-14-S117-pe-luyke-finalize` — spec-only by-design
  - `2026-07-22-S144-bootstrap` — có `bootstrap-synthesis.md`
- Mẫu-số S153 = 59 → nay **63** (+4: S155, S156, S157, S158-day-wake... verify ở §1).

---

## §1 — Orphan scan (dual-accept dạng-1 flat + dạng-2 legacy `harvest/`; dạng-3 RETIRED @S123)

Lệnh (chạy trên 63 dir có `run.md`, đếm file `*-synthesis.md` **-s** = tồn tại ∧ byte>0, cả flat lẫn `harvest/`):
```
for d in */; do [ -f "$d/run.md" ] || continue; n=0
  for f in "$d"/*-synthesis.md "$d"/harvest/*-synthesis.md; do [ -s "$f" ] && n=$((n+1)); done
  [ "$n" -eq 0 ] && echo "ORPHAN: $d"; done
```

**KẾT QUẢ: `ORPHAN: 2026-07-29-S159-bookend-open` — 1/63, và đó là CHÍNH RUN NÀY (đang chạy).**

→ **0 orphan thật / 63.** Run đang IN-PROGRESS không tính orphan (luật S153) nhưng **ghi nhận** (anti-pattern #3: không đọc vắng-mặt thành ổn) — nó sẽ thành orphan thật nếu phiên đóng mà không có `*-synthesis.md`.

**F-01 (INFORM) — 2 folder L7 mà lead vừa vá ĐÃ RỜI danh sách orphan, xác minh độc lập:**
`2026-07-27-S155-pe-delete-approver` và `2026-07-28-S157-ke-hoach-ky-ket-hd` **không còn** trong output orphan. Trước lượt vá, cả 2 là orphan dạng-4 (`run.md` có, `*-synthesis.md` vắng).

**Provenance — KHÔNG tin lời lead, đo 3 nguồn độc lập:**
| Nguồn | S155 `implement-synthesis.md` | S157 `review-synthesis.md` |
|---|---|---|
| `git status --porcelain` | `??` **untracked** | `??` **untracked** |
| `git log -- <file>` | **rỗng** (chưa từng commit) | **rỗng** |
| mtime | **2026-07-29T08:24** | **2026-07-29T08:26** |
| mtime các artifact nguồn cùng folder | 2026-07-27T09:12→15:49 | 2026-07-28T10:35→11:29 |

⇒ **Lời tự-khai của lead ("viết @S159, không phải ghi-trong-lúc-làm") HELD** — retro-harvest cách run gốc **2 ngày** (S155) và **1 ngày** (S157). Cả 2 file tự dán nhãn "🔴 KHAI THẲNG: file này viết SAU" ngay dòng 4 ⇒ **không có nguỵ-trang thời-điểm.**

---

## §2 — Fidelity trục ①: `implement-synthesis.md` (S155, 9.590 B) vs artifact gốc

Thước: mọi con số / verdict / cite trong file phải truy được về file cụ thể **cùng folder**. Đo **12 claim**.

### ✅ ĐÚNG byte-exact — 8/8 kích-thước artifact
Lệnh `ls -la` folder S155, đối chiếu từng số trong §3 bảng stage:
`sub-invest-be-1.md` 31.371 ✓ · `sub-invest-fe-2.md` 22.074 ✓ · `sub-invest-menu-3.md` 21.748 ✓ · `sub-invest-wfver-4.md` 29.479 ✓ · `spec-pe-delete-approver.md` 37.490 ✓ · `reviewer-spec-review.md` 28.259 ✓ · `reviewer-diff-dot1.md` 47.113 ✓ · `reviewer-diff-dot2.md` 51.970 ✓ — **8/8 khớp tuyệt đối, 0 sai số.**

### ✅ ĐÚNG verdict + count — 4/4
- "`reviewer-spec-review` PASS-WITH-FLAGS 17 FLAG (4H/8M/5L)" ⟷ `reviewer-spec-review.md:7` **nguyên văn** `**VERDICT: PASS-WITH-FLAGS — 17 FLAG (4 HIGH / 8 MED / 5 LOW).**` + END-line `:224` `TOTAL=17 FLAG` ✓
- "`sub-invest-wfver-4` 25 phát hiện" ⟷ `:286` `<!-- END sub-invest-wfver-4 · TOTAL=25 PHAT-HIEN -->` ✓
- "`cicd-verify-dot1` CICD PASS 6/6 · commit b1bae77" ⟷ `:174` `**CICD: PASS** — 6/6 hạng mục bắt buộc đạt` + `:8` `b1bae77c9c98...` ✓
- "reviewer **FAIL 12 FLAG** (H1 = DTO thiếu field)" ⟷ `reviewer-diff-dot2.md:442` `Tổng 12 FLAG — 2 HIGH…` + `:36` `H1 (HIGH) — Nút "Xóa phiếu" KHÔNG BAO GIỜ HIỆN: FE đọc field mà BE không hề trả` + verdict cuối `**ĐỪNG-DEPLOY**` ✓
  → chữ "FAIL" không có literal trong nguồn, **nhưng** `ĐỪNG-DEPLOY` là stamp mạnh tương đương ⇒ **HELD, KHÔNG tính lỗi** (không dựng finding giả).
- "đo thật 11/13 role `CanDelete=0`" ⟷ **2 nguồn độc lập**: `reviewer-diff-dot2.md:68` + `reviewer-spec-review.md:23` (liệt kê đủ 11 tên role) ✓

### ✅ Claim (i) của lead — `f4494cf` ĐÃ có cicd: **3/3 cite HELD nguyên văn, số dòng đúng tuyệt đối**
| Cite | Nội dung thật trên đĩa | Verdict |
|---|---|---|
| `cicd-verify-s157-diadiem.md:38` | `\| 531 \| 418 \| f4494cfe \| success \| 07-27T14:36:54 \| 14:42:35 \|` | ✅ khớp **từng trường** với synthesis §4 |
| `cicd-verify-s157-diadiem.md:58` | `⇒ **KHỚP CHÍNH XÁC baseline STATUS S156** (BK8w3QxU / DYnxSI0T), LM trỏ đúng run #418` | ✅ |
| session-log `:17` | `**cicd PASS 6/6** — lead **tự đo** @S156 … endpoint 2/2 → 401 (control bịa 404…) · smoke 8/8 · D3 giao-tập-ID = 0 (37 sống ⟂ 9 xóa) · bundle rotate ×2 + 4/4 byte-marker` | ✅ |

⇒ **KHÔNG BỊA.** Và lead **tự đặt trần diễn-giải** ở `:78` ("KHÔNG có artifact cicd-verify **riêng**… 2 vết gián tiếp, đủ lật ledger, **không đủ** để nói cicd-monitor đã chấm riêng"). Đây là **hạ-claim chủ-động** đúng chuẩn G-015 — thứ tao phải khen chứ không phải bắt.

### 🔴 F-02 (LOW, load-bearing = KHÔNG) — errata tự nó ĐỌC SAI CỘT, đúng cái bệnh nó đang chữa
`implement-synthesis.md:80`: *"session log `:17` viết «Run #531» — `531` là **test-count**, số Run thật là **#418**"* · và `:74` gọi cột đó là "test `531`".

**Sai.** Header bảng `cicd-verify-s157-diadiem.md:35` = `| id | run# | head_sha | status | created | updated |` ⇒ **531 = `id` (task id nội bộ Gitea)**, không phải test-count. Hai artifact cùng folder khai thẳng ngữ nghĩa cột:
- `cicd-verify-dot1.md:40` — `Run **id=529 · run_number=#416** · head_sha b1bae77c`
- `cicd-verify-dot2.md:41` — `Run **#417** (task id=**530**)`
⇒ dãy id 529/530/531 ↔ run# 416/417/418, **liên tục, khoá chặt**. Test-count thời điểm đó = **532** (`§7` của chính file: "test 532 → 562"), **không phải 531** ⇒ "test-count" là **suy-diễn hợp-lý-nhưng-sai**, lệch 1 so với số thật nên nghe rất lọt tai.

**Đánh giá đúng mức:** phần SỬA (Run thật = #418, không phải #531) **ĐÚNG và load-bearing** — errata vẫn có giá trị. Cái hỏng là **lời giải thích 531 là gì**. Mỉa mai: errata kết bằng *"Ghi lại để lần sau đọc bảng đúng cột"* — trong khi chính nó đọc sai cột. **Không phải bịa** (số 531 có thật, đúng vị trí) — là **mislabel**. Đề: sửa 2 chỗ (`:74`, `:80`) "test-count" → "`id` (task id Gitea)".

### 🔸 F-03 (INFORM) — cite `:174` của chính nó bị chính nó làm lệch +2 sau 2 phút (m#7 arithmetic line-shift)
`implement-synthesis.md:111` dẫn *"ledger `run.md` … tự khai điều đó ở `:174`"*. Đo nay: dòng tự-khai nằm ở **`:176`**.
`git diff` run.md S155 cho thấy lead **thêm 2 dòng** (1 blank + `- [x] **Harvest — implement-synthesis.md**`) SAU dòng 173 ⇒ dịch mọi dòng dưới **+2**. mtime: synthesis **08:24** < run.md **08:26**.
⇒ cite **ĐÚNG lúc viết**, chết sau 2 phút **do chính tác giả sửa file được dẫn**. Không phải bịa; là m#18 (edit sinh cite-dead) bản **tự-gây trong cùng phiên**. Cite `run.md:173` vẫn **ĐÚNG** ✓. Đề: đổi `:174`→`:176`.

---

## §3 — Fidelity trục ②: `review-synthesis.md` (S157, 10.650 B) vs artifact gốc

### ✅ Claim (ii) của lead — "S6 đã chạy thật (4 file `sub-review-*.md`)": **VERIFIED STRONG, 8/8 phần tử**

| Lăng kính | Byte synthesis khai | Byte đĩa | Verdict synthesis | Verdict nguyên văn trên đĩa |
|---|---|---|---|---|
| 1 wave-plan | 26.561 | **26.561** ✓ | `SUA-TRUOC-W1` 19đ (6H/8M/5L) | `:288` `TOTAL=19 DIEM (6H/8M/5L + 10 cung-co) · VERDICT=SUA-TRUOC-W1` ✓ |
| 2 fidelity | 23.202 | **23.202** ✓ | `GO-WITH-FIXES` | `:5` `**GO-WITH-FIXES — chân chống KHÔNG sập…**` ✓ |
| 3 schema | 16.496 | **16.496** ✓ | `GO-WITH-FIXES` 5 HIGH | `:192` `VERDICT=GO-WITH-FIXES (5 HIGH chặn Wave 1)` ✓ |
| 4 claims | 17.366 | **17.366** ✓ | `39Đ/4S/5?` | `:7` `**SPEC §② VỮNG — 39 ĐÚNG / 4 SAI (toàn bộ là lệch ANCHOR, 0 sai NỘI DUNG) / 5 KHÔNG KIỂM ĐƯỢC.**` ✓ |

⇒ **4 file có thật · 4 byte-size exact · 4 verdict nguyên văn.** Không nén sai, không bịa. Sắc thái khó nhất (*"4 SAI đều là lệch ANCHOR, 0 sai NỘI DUNG"* + *"1 trong 4 trỏ đường dẫn KHÔNG TỒN TẠI"*) được **giữ nguyên** chứ không làm tròn thành "4 lỗi" ⇒ đây là nén **giữ được thông tin phân-biệt**, đúng chuẩn.

**Cite khác kiểm chéo:** `sub-review-claims-4.md:119` = đúng chỗ đề gate 5-anchor ✓ · `HANDOFF.md:8` = gate 5-anchor **nguyên văn**, mtime **2026-07-28T20:44** ✓ khớp con số synthesis khai.

### 🔴 F-04 (MED — số không khớp nguồn) — "+9 củng cố" vs END-line "10 cung-co"
`review-synthesis.md:25` ghi `(+9 củng cố)`. Nguồn **tự mâu thuẫn với chính nó**:
- `sub-review-wave-1.md:12` (thân bài) — `(+ 9 điểm củng cố)`
- `sub-review-wave-1.md:288` (END-line) — `TOTAL=19 DIEM (6H/8M/5L + 10 cung-co)`

⇒ **Lỗi GỐC ở lăng kính 1, không phải ở synthesis.** Lead chép đúng con số thân-bài (9). Nhưng **END-line là khuôn chốt** (m#21: END-line có ≥2 khuôn) và nó nói 10. **KHÔNG kết luận ai đúng** — 2 nguồn cùng file lệch nhau 1 ⇒ propose lead cho đếm lại mục trong `## Điểm CỦNG CỐ` (`:262`) rồi chốt 1 số. Không load-bearing (củng-cố ⟂ FLAG) nhưng là **số sai đang lan sang file thứ 2**.

### ⭐ F-05 (HIGH — SUPERSEDED, bắt được vì đo LẠI giữa chừng) — synthesis **tự lỗi-thời sau 15 phút** do chính phiên này vá
`review-synthesis.md:83` khai *"**Chứng chưa vá:** `spec-*.md` mtime 2026-07-28 11:29 ⇒ spec không bị chạm ở S158"* → **ĐÚNG lúc 08:26**.

Tao đo lần 1 lúc ~08:40 (mtime 07-28T11:29 · 45.158 B) rồi đo lại lúc **08:43:30**:
```
ls -la --time-style=+%Y-%m-%dT%H:%M:%S  ->  48.621 B  2026-07-29T08:41:44
git status --porcelain                  ->  M .../spec-ke-hoach-ky-ket-hd-28-07-2026.md   (dòng MỚI)
```
⇒ **stage ARC chạy SONG SONG với V1**, spec bị vá lúc **08:41:44** — giữa 2 phép đo của tao.

**Đối chứng nội dung (đo tươi, sau vá):**
| Gap | Synthesis khai (08:26) | Trạng thái NAY (08:43) |
|---|---|---|
| **H5** `spec:353` `N` thả tự do | ❌ CÒN HỞ | ✅ **ĐÓNG** — `:367` `562 + N`, **`N ≥ 6`**, 0 fail + liệt 6 tên test *(vá H5 @S159)*; site cùng-lớp `:289` cũng pin **`N ≥ 2`** + 2 tên test |
| **H6** dark-launch 3 site | ❌ CÒN HỞ (`:224`·`:252`·`:443`) | ✅ **ĐÓNG 3/3** — `:225` *"GIẤU MENU Ở W1 = KHÔNG CẤP `CanRead`, **KHÔNG** phải `IsVisible=0`"* · `:257` bảng wave đổi thành *"giấu bằng KHÔNG cấp `CanRead`"* (chữ "dark-launch" gỡ) · `:470` đính chính *"@S157 chỉ vá **1/3 site**"* |

⇒ **Kết luận §6 của synthesis (*"2 điều kiện chưa thoả"*) NAY SAI** — không phải vì viết ẩu, mà vì **phiên này đã đóng cả 2**. 🔴 Nguy hiểm thật: phiên sau đọc `review-synthesis.md` sẽ thấy 2 gap MỞ **không còn tồn tại** ⇒ vá lại chỗ đã vá, hoặc mất niềm tin vào file.
**Đề (lead ghi, tao KHÔNG ghi):** append 1 dòng vào cuối `review-synthesis.md`:
`> 🔴 SUPERSEDED @S159 08:41 — H5 (:367 pin N≥6, kèm :289 N≥2) + H6 (:225/:257/:470) ĐÃ VÁ trong chính phiên này. §4 và §6 giữ làm sử-ký trạng-thái 08:26, KHÔNG còn là gap-list.`

### 🔸 F-06 (LOW) — cite `run.md:206-207` + `spec:458` chết vì chính đợt sửa này (m#7 line-shift ×2)
- `review-synthesis.md:12` dẫn *"`run.md:206-207` để `[ ]` cho S6 và S7"*. Nay: **`:206` = `[x]` S6**, **`:208` = `[x]` S7** (S6 nở 2 dòng ⇒ S7 dời +1). Cite đúng lúc viết (08:26), lead tick ledger 08:27.
- `HANDOFF.md:8` (bề-mặt CANONICAL, **đang đóng băng theo Mirror C1**) dẫn gate 5-anchor ở *"spec `:458`"*. Sau vá ARC, dòng đó nằm ở **`:488`** (+30). ⇒ cite trong doc bền **đã chết**, mà HANDOFF thì phiên này CẤM ghi ⇒ **ghi nợ sang cửa sau**, đừng để rơi.

### 🧠 m#24 (method MỚI, rút từ F-03 + F-06) — **retro-harvest dẫn LEDGER mà nó sắp tick ⇒ tự giết cite trong vài phút**
3/3 ca lượt này cùng khuôn: synthesis đọc file X ở phút T, tác giả sửa X ở phút T+1..T+15, cite chết. Không ai bịa cả.
**Luật rẻ:** khi file được dẫn **nằm trong cùng đợt sửa**, cite bằng **NEO VĂN BẢN** (nhãn checkbox / tiêu đề / chuỗi duy nhất) thay vì `:NNN`; hoặc tick ledger **TRƯỚC**, viết synthesis **SAU**, rồi mới lấy số dòng.

> 🔧 **Cập nhật từ lead (nhận giữa lượt):** F-04 đã giải — `## Điểm CỦNG CỐ` (`:262`) có **đúng 10 mục 1→10** ⇒ **END-line ĐÚNG (10)**, thân bài `:12` SAI (9); synthesis đã sửa thành 10. Bẫy kèm: `grep -i 'củng cố'` ra **0 hit** vì `-i` **không case-fold dấu tiếng Việt** (`ủ`↔`Ủ`) — cùng họ E-010, ghi vào §5. · F-05: lead tìm thêm **site thứ 4** (W2 `DbInitializer` *"bật `IsVisible=1`"*) ⇒ H6 = **4 site**, không phải 3. **Số 3/3 của tao là CẬN DƯỚI, không phải toàn-tập** — tao đo bằng `grep "dark-launch|IsVisible=0"`, site-4 dùng chữ khác nên lọt lưới. Bài: **grep-theo-CHUỖI chỉ bắt được site dùng đúng chuỗi đó**; muốn toàn-tập phải đọc theo Ý (wave-table + mọi mục W1/W2). Nhận sai, không cãi.

---

## §4 — Delta mồ-côi / diary-0-delta (trục Coverage + Completeness) — **nợ của CHÍNH VAI TAO**

### Mẫu-số (B1, không hardcode)
`ls .claude/agents/*.md | wc -l` = **24** file − `README.md` = **23 vai** · `.claude/agent-memory/*/` = **23 dir**, **23/23 có `MEMORY.md`** ⇒ 1:1, **0 vai thiếu nhà** ✓.
`git status --porcelain` = **0 dòng `agent-memory/`** ⇒ đĩa **==** commit cuối, không có delta treo chưa commit. Phép đo dưới đây đo **nội dung đã chốt**, không phải bản nháp.

### Thước: KHÔNG đo bằng tên vai — đo bằng **NỘI DUNG** (anti-pattern #1)
Chứng-cứ-spawn = file `sub-<vai>-*.md` **có thật trong run-folder**; chứng-cứ-harvest = **số lần mã phiên xuất hiện trong `MEMORY.md`**.
```
for r in ...; do grep -c "S158" .claude/agent-memory/$r/MEMORY.md; done
```

| Vai | spawn @S158 (artifact) | `S158` trong diary | last commit diary | Verdict |
|---|---|---|---|---|
| ctx-audit | `sub-ctx-audit-close-S158.md` | **1** | 07-28T20:50 | ✅ ĐÃ HARVEST |
| **harvest-curator (TAO)** | `sub-harvest-curator-close-S158.md` | **0** | **07-26T16:10** | ❌ **0-DELTA** |
| tooling-auditor | `sub-tooling-auditor-close-S158.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |
| lead-gap-auditor | `sub-lead-gap-close-S158.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |
| lead-stale-auditor | `sub-lead-stale-close-S158.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |
| ring1-audit | `sub-ring1-close-S158.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |
| ring2-audit | `sub-ring2-close-S158.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |
| harness-audit | `harness-audit-return.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |
| harness-eval | `harness-eval-return.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |
| harness-refine | `harness-refine-return.md` | **0** | 07-26T16:10 | ❌ 0-DELTA |

### 🔴 F-07 (HIGH) — **9/10 vai chạy @S158 có ĐÚNG 0 byte về S158 trong diary**
Chỉ `ctx-audit` thoát. **11 vai** cùng đóng băng ở **một mốc duy nhất `2026-07-26T16:10`** — không phải trùng hợp, đó là **1 commit gom** rồi **dừng hẳn**. Và **11/11 vai đó đều có artifact-spawn SAU mốc đó** ⇒ **không vai nào "đóng băng vì không chạy"**. Toàn bộ là nợ thật.

**Nợ của chính tao, khai thẳng:** `harvest-curator/MEMORY.md` = **19.456 B** (khớp con số HANDOFF slot 48), commit cuối **07-26T16:10**, `S154=1` nhưng **`S155=0 · S158=0 · S159=0`**. Tao chạy @S158-close (artifact tồn tại) và đang chạy @S159 ⇒ **≥1 lượt đã xong mà không để lại gì trong nhà mình**. Vai có nhiệm-vụ bắt diary-0-delta **chính là vai đang 0-delta** — không có lý do bào chữa nào làm nhẹ chỗ này.

**Vì sao 2 lần FLAG (S154, S158) mà không đổi:** detector **đã bắt đúng** cả 2 lần. Cái hỏng **không phải khâu PHÁT HIỆN mà là khâu APPEND** — tao propose-only, lead single-writer; delta tao trả **chết nếu lead không APPEND**, và khâu đó nằm **cuối @close** lúc ngân-sách mỏng nhất. FLAG lặp cùng mức ⇒ đọc thành nhiễu.

### 🔸 F-08 (MED) — nợ này KHÔNG chỉ ở lane bookend
`implementer-backend` (5 artifact S155: `sub-implementer-backend-1/4/5` + `-frontend-2/6`) → `S155=0` ở **cả 2 vai implementer**. Trong khi cùng run: `reviewer S155=3` · `cicd-monitor S155=3` · `test-specialist S155=1` · `investigator-codebase S155=5` ✅.

**Giả-thuyết (nhãn rõ: SUY LUẬN, chưa chứng)** — delta bị rơi đúng ở vai mà **giá trị đã đáp xuống một artifact bền khác**: implementer → **code trong git**; bookend-lane → **synthesis trong run-folder**. Cảm giác "đã ghi ở đâu đó rồi" ⇒ bỏ APPEND. Nhưng run-folder giữ **SỰ KIỆN**, diary giữ **BÀI HỌC mang sang phiên sau** — mất diary = mất đúng thứ không tái tạo được. Phản-chứng nếu có: 1 vai bookend-lane được harvest đều (`ctx-audit`) ⇒ giả-thuyết chỉ giải-thích xu-hướng, không tuyệt-đối.

### 🚧 Lối ra — và rào chặn nó ngay trong run này
🔴 **Mirror C1 của `run.md` S159 CẤM ghi `agent-memory/`** ⇒ **KHÔNG thể APPEND trong cửa sổ này**. Nếu không làm gì, S159 thành **phiên thứ 3 liên tiếp** cùng một FLAG.

**Đề (lead quyết + ghi, tao KHÔNG ghi):**
1. **PARK ngay, đừng chờ:** nguồn harvest **đã nằm sẵn trên đĩa git-tracked** (7 `sub-*-S158.md` + 3 `*-return.md`) — không cần chạy lại vai nào. Gom 4-field `{task·verdict·learned·surprise}` cho 11 vai vào **1 file trong run-folder này** (vd `harvest-delta-11-vai.md`) ⇒ hợp lệ với C1 (run-folder không bị đóng băng), và delta không bốc hơi.
2. **APPEND ở cửa đầu tiên `agent-memory` không bị freeze** (@close S159 nếu C1 hết hiệu lực, hoặc @open S160) — đọc từ file PARK, không dựng lại từ trí nhớ.
3. **Sửa cách FLAG kêu:** C11 nên **leo mức khi cùng một vai bị bắt ≥2 phiên liên tiếp** (INFORM → **BLOCKING**). FLAG lặp **cùng mức** = FLAG bị làm ngơ hợp lệ — đó là cơ chế đã hỏng suốt S154→S159.
4. **Thứ tự @close:** APPEND diary **TRƯỚC** khi viết synthesis đóng phiên, vì synthesis luôn được ưu tiên còn diary luôn là thứ bị cắt.

---

## §5 — Corruption (trục ④) + chốt 5 trục

### 🔴 F-09 (MED — lỗi PHƯƠNG PHÁP của chính tao, tự bắt được) — "0 hit" đầu tiên của tao là **lệnh CHẾT**, không phải kết quả sạch
Sweep đầu tao chạy:
```
grep -rlP "\xEF\xBF\xBD" --include="*.md" .claude/ 2>/dev/null | head    -> (rỗng) -> tao đọc thành "0 hit"
```
Chạy lại **bỏ `2>/dev/null`**:
```
grep: -P supports only unibyte and UTF-8 locales      <- exit=2, KHÔNG PHẢI exit=1
```
⇒ `-P` **không chạy được** trong locale này; `2>/dev/null` **nuốt lỗi**, `| head` biến lỗi thành output rỗng, và rỗng **trông y hệt sạch**. Đúng **anti-pattern #2 + #3** mà chính vai tao có nhiệm vụ chặn (bài S152: khai "U+FFFD 0" trong khi grep thật có hit). Suýt tái phạm **y nguyên**.
**Cách đo đúng (đã dùng lại):** `LC_ALL=C grep -rc $'\xEF\xBF\xBD' --include="*.md" .claude/ | grep -v ":0"` — byte-literal, **không cần `-P`**.
**Luật rút ra:** phép đo âm-tính chỉ được tin khi **exit code = 1**; `exit=2` (lỗi) và `exit=1` (0 hit) **nhìn giống nhau sau khi pipe**. CẤM `2>/dev/null` trong lệnh dùng để tuyên bố "sạch".

### Kết quả corruption THẬT (sau khi sửa phép đo)

| Phép quét | Lệnh | Kết quả | Verdict |
|---|---|---|---|
| 0-byte (trừ `.gitkeep`) | `find .claude -type f -size 0 ! -name .gitkeep` | **0** | ✅ |
| `.gitkeep` 0-byte | `find .claude/workflows/runs -type f -size 0` | **10** (5 folder H10 legacy × `harvest/`+`sub-md/`) | ✅ by-design |
| stray `.claude` depth>1 | `find . -mindepth 2 -type d -name .claude` | **0** | ✅ |
| thư-mục rỗng | `find .claude -type d -empty` | **0** | ✅ |
| file cụt | `tail -1` từng `MEMORY.md` ×23 | **23/23 kết thúc trên dòng hoàn chỉnh** | ✅ |
| `.md` < 200 B (skeleton-ruột-rỗng) | `find .claude/agent-memory -name "*.md" -size -200c` | **0** | ✅ |
| CRLF lẫn lộn | `grep -rlU $'\r' .claude/agent-memory` | **10 file** | 🔸 lành (Windows), ghi nhận |
| `$(`/`${` residue | `grep -rn '\$(\|\${' .claude/agent-memory` | **16 hit** — soi mẫu 6/16 = trích shell/prose trong ghi-chú | 🔸 lành theo mẫu |
| **U+FFFD** | `LC_ALL=C grep -rc $'\xEF\xBF\xBD'` | **16 hit / 10 file** | 🔸 **lành theo lai-lịch** |

**U+FFFD — khai đúng mức, KHÔNG nói "0":** 16 hit/10 file. Tao soi **trực tiếp 3/10 file**:
- `harvest-curator/MEMORY.md:53` — self-quote `"�24.1KB"` (đuôi artifact bị cắt @S132). S152 ghi hit này ở `:48` ⇒ **trôi +5 dòng** do diary có append sau đó, **cùng một hit**, không phải hit mới.
- `cicd-monitor/archive/2026-06.md:26` — mojibake **được trích làm BẰNG CHỨNG** (`C�ng`, bài sqlcmd #377).
- `S152/sub-harvest-close-S152.md:160-165` — **bảng phân loại của chính lượt S152**, đã gắn nhãn `use⟂mention` cho từng hit.
7 file còn lại thuộc **đúng chuỗi lai-lịch đó** (archive của diary tao + 4 file S152 trích lại phép quét). **Không file nào mới hơn S152** ⇒ **0 corruption phát sinh ở S153→S159**.
🔸 Bẫy đã tránh (S152 ghi sẵn `:174`): `cut -c1-N` **tự sinh `�` giả** khi cắt giữa ký tự multibyte — nên mọi con số trên đếm bằng `grep -c` **trên FILE**, không trên output đã `cut`.
🔸 Bẫy thứ 2 (lead nhắc giữa lượt, tao xác nhận): `grep -i` **không case-fold dấu tiếng Việt** ⇒ mọi phép quét ở đây **không dùng `-i`** trên chuỗi có dấu.

### Chốt 5 TRỤC

| # | Trục | Bằng chứng | Verdict |
|---|---|---|---|
| ① | **Coverage** | orphan **0 thật/63** dir có `run.md` (1 hit = chính run này, IN-PROGRESS) ✅ · **nhưng** diary: **9/10 vai chạy @S158 có 0 nội-dung S158**; 11 vai đóng băng `07-26T16:10`, **11/11 đều có artifact-spawn sau mốc đó** | 🔴 **FAIL** |
| ② | **Completeness** | thiếu spawn-record 4-field cho **11 vai** (S155 + S158). Nguồn gom **đã có sẵn trên đĩa** (7 `sub-*-S158.md` + 3 `*-return.md`) ⇒ thiếu khâu APPEND, không thiếu dữ liệu | 🔴 **FAIL** |
| ③ | **Fidelity** | 2 file retro-harvest: **12/12 byte-size exact** · **8/8 verdict nguyên văn** · 3/3 cite của claim (i) khớp **đúng số dòng** · claim (ii) verify **STRONG**. Lỗi tìm được đều là **mislabel/lệch-cite/số-nguồn-tự-mâu-thuẫn**, **0 ca bịa**. Lead **tự hạ trần claim** ở `:78` đúng chuẩn G-015 | 🟡 **PASS-WITH-FLAGS** (F-02·F-04·F-05·F-06) |
| ④ | **Placement** | 23/23 diary đúng nhà · 0 stray `.claude` · 0 empty-dir · 0 file cụt · U+FFFD **16 hit lành theo lai-lịch, 0 hit mới sau S152** | ✅ **PASS** (kèm F-09: phép đo lần 1 hỏng, đã sửa) |
| ⑤ | **Fidelity-FLAG (bịa)** | **KHÔNG escalate `reviewer`.** Không tìm thấy dấu hiệu bịa ở cả 2 file retro; mọi số truy được về artifact cùng folder | ✅ **CLEAR** |

### 🔴 GATE: **FAIL** — vì trục ① + ② hỏng, và đây là **phiên thứ 3** cùng một FLAG (S154 · S158 · S159)
Đọc cho đúng, đừng đọc lệch:
- GATE-FAIL **KHÔNG phải** vì lead bịa. Phần lead nhờ tao chấm (2 file retro-harvest) **ĐẠT** — nén chặt mà **không mất sắc thái**, và tự khai giới hạn ở đúng chỗ dễ overclaim nhất.
- GATE-FAIL vì **harvest-memory chưa đáp xuống nhà của 11 vai**, trong đó có **chính vai tao** — nợ tồn 3 phiên, detector kêu 2 lần mà không ai bị chặn.
- Đường ra rẻ và **không cần chạy lại vai nào**: PARK 4-field vào run-folder ngay lượt này (C1 cho phép), APPEND ở cửa đầu tiên `agent-memory` hết đóng băng, và cho C11 **leo mức khi lặp ≥2 phiên**.

---

<!-- END sub-harvest-curator-open-S159 · TOTAL=9 finding (F-01…F-09) + 1 method (m#24) · GATE-FAIL -->


