# sub-harvest-curator @open S169 (phiên-LOGIC L10 window-1) — 2026-08-01

> Vai: **harvest-curator** (H2 harvest-MD integrity, read-only · propose-only).
> Nhiệm vụ: harvest-MD MỚI kể từ S168 · delta mồ-côi · 5-trục · orphan-scan `runs/*/`.
> **Ghi liên tục trong lúc làm** (chống #53). Mọi claim dán LỆNH (anti-pattern #2).

---

## A. ORPHAN SCAN — xác nhận độc lập con số 3 (nhiệm vụ (a))

### A.1 Lệnh đã chạy (dán nguyên văn, tái-lập được)

```bash
cd .claude/workflows/runs
# universe
find . -mindepth 1 -maxdepth 1 -type d | wc -l                 # -> 80
find . -mindepth 1 -maxdepth 1 -type d | while read d; do [ -f "$d/run.md" ] && echo "$d"; done | wc -l   # -> 77
# orphan: có run.md AND 0 file *synthesis* non-empty (substring, KHÔNG neo đuôi)
find . -mindepth 1 -maxdepth 1 -type d | sort | while read d; do
  if [ -f "$d/run.md" ]; then
    syn=$(find "$d" -type f -name "*synthesis*" -size +0c | wc -l)
    [ "$syn" -eq 0 ] && echo "ORPHAN|$d"
  fi
done
```

🔴 **Thước dùng `-name "*synthesis*"` (substring 2 đầu), KHÔNG `*-synthesis.md` (neo đuôi)** — bài S162: glob neo-đuôi bỏ sót `…-synthesis-clone-s160.md`. Đây là lần đầu áp thước đã sửa trên toàn universe.

### A.2 Kết quả thô — 4 hit

| # | Folder | synth-file (mọi kích cỡ) | Phán |
|---|---|---|---|
| 1 | `2026-07-29-S159-bookend-open` | 0 | **ORPHAN THẬT** (nợ ngủ, có carry) |
| 2 | `2026-07-29-S159-tong-quan-pipeline-menu` | 0 | **ORPHAN THẬT** (nợ ngủ, có carry) |
| 3 | `2026-08-01-S168-bookend-close` | 0 | **ORPHAN THẬT — MỚI, chưa carry** |
| 4 | `2026-08-01-S169-bookend-open` | 0 | **KHÔNG orphan — IN-PROGRESS** (chính phiên này; `run.md` mtime 21:19 hôm nay, mới có 1 sub-file) |

⇒ **XÁC NHẬN 3/3 con số lead đưa. KHÔNG có cái thứ 4.** Hit #4 là folder của chính lượt đang chạy (ghi nhận theo anti-pattern #3: in-progress phải ghi nhận, không flag).

### A.3 Universe hygiene — 3 dir KHÔNG có `run.md` (đã kiểm ruột, không cái nào là orphan giấu)

| Dir | Ruột | Phán |
|---|---|---|
| `2026-07-14-S117-pe-approve-minmax-range` | 1 file `spec-…md` 4.202 B | spec-only, không phải run — dual-accept (đã chốt S117/S153) |
| `2026-07-14-S117-pe-luyke-finalize` | 1 file `spec-…md` 5.828 B | spec-only |
| `2026-07-22-S144-bootstrap` | `bootstrap-synthesis.md` 1.239 B + 2 sub | **CÓ synthesis** ⇒ không orphan (ca tự-trượt @S151, đã đóng @S153) |

Mẫu-số công bố: **80 dir / 77 có `run.md` / 3 orphan xác nhận / 1 in-progress**. (m#12: mẫu-số đo lúc 2026-08-01 ~21:2x, sau khi folder S169 đã tồn tại.)

---

## B. THIỆT HẠI THẬT của từng orphan (nhiệm vụ (b))

🔴 Phân biệt sống-còn: **"orphan" (0 synthesis) ≠ "nguyên-liệu mất"**. Synthesis chỉ là LỚP CHƯNG CẤT. Câu hỏi đúng: *nguyên-liệu trong sub-file đã vào `agent-memory/<role>` chưa?* — vì đó mới là thứ auto-inject cho lượt sau. Đo bằng `grep -c "S1xx"` trên từng diary + `git log --stat` commit closeout.

### B.1 Orphan #3 `2026-08-01-S168-bookend-close` (MỚI) — **thiệt hại NẶNG NHẤT, 9/10 vai không có diary**

Nguyên-liệu mắc kẹt: **10 file / 162.916 B** (`find … -name "*.md" ! -name run.md | awk '{s+=$1}'`).

| Sub-file | B | Vai | `grep -c S168` trong diary vai | Kết |
|---|---|---|---|---|
| `sub-harvest-curator-close-S168.md` | 29.299 | harvest-curator | **0** | ❌ chưa vào |
| `sub-lead-gap-close-S168.md` | 29.820 | lead-gap-auditor | **0** | ❌ |
| `sub-ring1-audit-close-S168.md` | 26.855 | ring1-audit | **1** | ✅ (+2 dòng @`ff7f655`) |
| `sub-lead-stale-close-S168.md` | 23.264 | lead-stale-auditor | **0** | ❌ |
| `sub-tooling-auditor-close-S168.md` | 17.719 | tooling-auditor | **0** | ❌ |
| `sub-ring2-audit-close-S168.md` | 9.740 | ring2-audit | **0** | ❌ |
| `harness-refine-return.md` | 8.573 | harness-refine | **0** | ❌ |
| `harness-eval-return.md` | 6.572 | harness-eval | **0** | ❌ |
| `sub-ctx-audit-close-S168.md` | 6.521 | ctx-audit | **0** | ❌ |
| `harness-audit-return.md` | 4.553 | harness-audit | **0** | ❌ |

**Coverage close-bookend S168 = 1/10 vai (10%).** Lệnh: `for r in …; do grep -c "S168" .claude/agent-memory/$r/MEMORY.md; done`.

🔵 **Giảm nhẹ (phải nói, không được kể một chiều):** nội-dung KHÔNG bốc hơi — commit closeout `ff7f655` (2026-08-01 20:37) đổ findings vào **kênh TRUNG TÂM**:
`docs/changelog/sessions/…-1800-S168-gd3d-lineeditor-k8-dryrun-fixture.md` (+75) · `.claude/sessions/session-9/_mind-s-9.md` (+59) · `docs/STATUS.md` (+14/−) · `docs/HANDOFF.md` (+18/−) · `.claude/auto-memory/…dryrun_finds_promised_but_unlanded.md` (+23 MỚI) · `skills/ef-core-migration/SKILL.md` (+3).
⇒ Đây là lỗi **PLACEMENT**, không phải lỗi **mất dữ liệu**: bài học nằm ở nhà TRUNG TÂM (lead đọc được) nhưng KHÔNG ở nhà VAI (sub không đọc được lúc spawn). Hệ quả cụ thể: 9 vai kia vào phiên sau **mù về chính việc mình vừa làm**.

### B.2 Orphan #1 `2026-07-29-S159-bookend-open` — nợ ngủ, thiệt hại **TRUNG BÌNH nhưng ĐÃ 3 ngày**

10 file / **221.323 B** (lớn nhất trong 3). Chứa `sub-ring2-audit-open-S159.md` 40.196 B + `sub-ring1-audit-open-S159.md` 33.004 B + `sub-harvest-curator-open-S159.md` 26.134 B (= 9 finding GATE-FAIL của chính tao, gồm m#24 và F-07).
Trạng thái diary: khối S159 CÓ vào diary một phần (diary tao có mục S159 đầy đủ). ⇒ thiệt hại thật = **thiếu lớp synthesis liên-lane** (F-02/F-05 errata + m#24) chứ nguyên-liệu per-vai đã gom một phần. Carry `[carry:synthesis-roll-s159-s160]` đúng bản chất.

### B.3 Orphan #2 `2026-07-29-S159-tong-quan-pipeline-menu` — thiệt hại **CAO, có ca MẤT LỚP CHƯNG CẤT đã xác nhận**

10 file / **156.182 B**. Trong đó 5 `cicd-verify-*.md` (54.783 B) + 3 `sub-reviewer-diff-*` (67.640 B) + 2 `sub-frontend-designer-*` (29.759 B).
🔴 Đây chính là folder tao đã kết ở **S162 F-02**: `cicd-monitor/MEMORY.md:9` khai "verbatim→archive" cho #422/#425 mà `git log -S` rỗng toàn lịch sử ⇒ **mất lớp chưng cất, nguyên-liệu còn** ở `cicd-verify-{b5799fc,a2bbcb9}.md`. Nợ đó **vẫn còn nguyên** (folder chưa gom). Carry `[carry:harvest-orphan-s159-tongquan]` đúng.

### B.4 ✅ Tin tốt — 2 orphan CŨ đã ĐÓNG trong S168 (không ai báo)

`git show --stat a2b37dc` cho thấy lead đã tự sinh synthesis cho 2 folder từng là orphan:
- `2026-07-30-S163-bookend-open/bookend-open-synthesis.md` (+31)
- `2026-08-01-S166-h24-deep-midsession/h24-deep-synthesis.md` (+30)

⇒ **Xu hướng orphan KHÔNG đơn điệu tăng**: S168 đóng 2, mở 1. Ròng −1. (Chống kể-chuyện-một-chiều: nếu chỉ đọc "3 orphan" sẽ tưởng đang xấu đi.)

### B.5 🔴 **F-2 — DƯƠNG-GIẢ CÓ CẤU TRÚC của chính thước orphan** (finding lead chưa có)

Hit #4 `2026-08-01-S169-bookend-open` KHÔNG phải nợ — nó là **run-folder đang mở của chính lượt này**. Nhưng đó không phải nhiễu ngẫu nhiên, mà là **lỗi hệ-thống của định nghĩa thước**:

> `run.md` được tạo ở đầu run · `*-synthesis.md` chỉ được tạo ở cuối run ⇒ **MỌI folder đang chạy đều thỏa định nghĩa orphan trong suốt vòng đời của nó.** Thước orphan có **dương-giả 1 đơn-vị cố định** bất cứ lúc nào chạy giữa phiên.

Hệ quả đo được: ai chạy Sàn-3 ① lúc này (21:2x) sẽ nhận **4**, không phải 3 — và nếu không biết luật này sẽ mở carry cho một folder chưa chết. Ngược lại nguy hơn: nếu quen trừ-1-mặc-định thì phiên nào **quên đóng synthesis** sẽ bị nuốt luôn vào "chắc là cái đang chạy".
✅ **Đề-xuất phân-biệt rẻ (deterministic, không cần người phán):** folder là IN-PROGRESS ⟺ `run.md` mtime nằm trong phiên hiện tại **VÀ** `_end`/close-marker của phiên chưa tồn tại. Ở lượt này: `.claude/sessions/session-9/_end` TỒN TẠI (1.187 B, 20:38) ⇒ S168 đã đóng ⇒ S168 = orphan THẬT; `session-10/` mới có `_context-s-10.md`, **chưa có `_end`** ⇒ S169 = IN-PROGRESS. Thước này tự phân loại đúng 4/4 hit mà không cần lead nhớ.

---

## C. 5-TRỤC INTEGRITY trên phần ĐÃ harvest

### C.1 COVERAGE — ❌ **FAIL**
- Bookend-close S168: **1/10 vai** có nội-dung S168 trong diary (bảng B.1). Lệnh + số ở B.1.
- Vai đo theo **FILE-level chứ không role-level** (bài S152: 9/9 vai PASS role-level mà trọn lượt 67 KB mồ-côi). Ở đây file-level cho ra 9 file mồ-côi / 162.916 B.
- Orphan tồn đọng: **3** (A.2), nguyên-liệu kẹt tổng **540.421 B** (162.916 + 221.323 + 156.182).

### C.2 COMPLETENESS — ⚠️ **PARTIAL** (những entry CÓ ghi thì ghi rất đủ)
Đọc 3 seed thật của S168:
- `ring1-audit` +2 dòng @`ff7f655`: có `task` (KIỂM @close) · `verdict` (`52Đ/4T trên 56 claim`) · `learned` (class mới "TỰ-ĐÍNH-CHÍNH NGƯỢC") · `surprise` (**H2 nhận tội oan** — `git grep -c`=DÒNG(22) vs `-o|wc -l`=LẦN(24), cả 2 đúng, đơn-vị lệch) ⇒ **4/4 field ✅**.
- `ctx-verifier` +1 dòng @`a2b37dc`: 4/4 field ✅ nhưng là **gộp 3 lượt** (S165+S167+S168) trong 1 bullet.
- `ctx-curator` +1 dòng @`a2b37dc`: 4/4 field ✅, cũng **gộp 3 lượt** (S163→S167).
⇒ Chất-lượng-mỗi-entry KHÔNG phải vấn đề. Vấn đề là **số entry**. (Phân biệt này quan trọng: đừng kê thuốc "viết kỹ hơn" cho bệnh "không viết".)

🔴 **Nhận về mình (C.2b):** `ring1-audit` ghi rằng seed S169 sẽ mang **baseline lẫn đơn-vị** vì H2 (= tao, @S168) tự-đính-chính SAI: đã hạ "24 hit" xuống "22" trong khi 24 đúng theo thước đếm-LẦN. Tao xác nhận nhận-định đó và ghi ở đây để không tái phát: **corruption baseline phải kèm ĐƠN-VỊ** — S169 đo lại ở C.4 bằng đếm-FILE + đếm-LẦN tách bạch.

### C.3 PLACEMENT — ❌ **FAIL (nhưng là fail "sai nhà", không phải "mất của")**
`git show --stat ff7f655` chứng minh nội-dung close-bookend S168 đã đổ vào **kênh TRUNG TÂM** (session-log +75 · `_mind-s-9.md` +59 · STATUS/HANDOFF/gotchas/auto-memory/SKILL). Nhà VAI (`agent-memory/<role>/`) chỉ nhận 2 dòng (ring1).
⇒ Đúng định nghĩa B2 placement-fail: delta không về đúng nhà. Hệ quả **cụ thể, đo được**: 9 vai kia khi spawn phiên sau **không auto-inject** được bài học của chính mình — trong đó `harvest-curator` (chính tao, 29.299 B) và `tooling-auditor` (17.719 B) là 2 vai monitor sẽ chạy LẠI ngay ở S169 này.
✅ Điểm sáng: **0 stray `.claude/` lạc chỗ** — `git status --porcelain` chỉ có 4 mục, không mục nào là `agent-memory/*` ngoài repo-root (`find . -name ".claude" -not -path "./.claude*"` không cần chạy vì status sạch). Không tái phát ca S54 cwd-relative.

### C.4 CORRUPTION — ✅ **PASS** (scanner đã CHỨNG MINH có răng trước khi tuyên 0)
🔴 **Bẫy đo bắt được TRONG lúc làm (F-8):** lần chạy đầu tao dùng `grep -rlP '\xEF\xBF\xBD'` và nhận `hits_files=0` ×4 pattern. Nhưng control-dương lộ ra:
```
grep: -P supports only unibyte and UTF-8 locales
```
⇒ **cả 4 con số 0 kia là 0-GIẢ do grep chết vì locale, không phải sạch** — và `2>/dev/null` đã nuốt mất lời báo lỗi. Đây đúng lớp `absence_looks_like_clean`. Đo lại bằng scanner byte-exact (python), có control chạy TRƯỚC:
```
CONTROL (bytes tổng hợp chứa đủ 5 pattern): U+FFFD=True · Ã¡=True · â€œ=True · $(=True · ${=True
=> scanner HAS TEETH on all 5 patterns
REAL SCAN: files = 23 | 0-byte = 0 []
  U+FFFD  files=0 · moji-A-tilde files=0 · moji-quote files=0 · shell-$( files=0 · shell-${ files=0
```
**Baseline S169 (KÈM ĐƠN-VỊ, vá lỗi C.2b):** trên tập `agent-memory/*/MEMORY.md`, **n=23 file · đếm-FILE = 0 · đếm-LẦN = 0** cho cả 5 pattern. 0-byte = 0 (không tái phát #53 closeout-truncate).

### C.5 FIDELITY-FLAG — 🚩 **1 ca ESCALATE `reviewer`** (tao KHÔNG tự phán)
`cicd-monitor/MEMORY.md:86` vẫn để header: `## 📅 Recent runs (compressed — verbatim → archive via _INDEX.md)`. Đo:
```
grep -rl "#422" .claude/agent-memory/cicd-monitor/   ->  chỉ .../MEMORY.md   (hits=1)
ls .claude/agent-memory/cicd-monitor/archive/        ->  6 file, không file nào chứa #422
```
⇒ Claim "verbatim → archive" **vẫn 0 chứng** cho #422/#425 — đây chính là **E-016/AS-20 đã lập @S162, đến S169 CHƯA đóng** (4 phiên). Nguyên-liệu vẫn nằm ở `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-{b5799fc,a2bbcb9}.md` (B.3) — tức **có đường cứu**, không mất.
Tao **KHÔNG** phán "bịa": header có thể đúng cho các run KHÁC. Việc phán phạm-vi của một câu khai → `reviewer`.

---

## D. 4 ĐIỂM TREO (nợ mang sang)

### D.1 ⭐ `[carry:ctx-verifier-no-self-append]` — **F-3 HIGH: câu hỏi đang HỎI SAI. Không hỏng ở GHI, cũng không hỏng ở PHÁT-HIỆN.**

Lead hỏi *"hỏng ở khâu GHI hay khâu phát-hiện?"*. Đọc `.claude/agents/ctx-verifier.md` thì **cả hai đều không hỏng** — vai này **bị CẤM ghi theo hợp-đồng**:
- frontmatter `tools: [Read, Grep, Glob, Bash, mcp__rag-unified__*]` — **không có Write, không có Edit**.
- mô-tả vai: *"Trả CHỈ văn bản; `tools:` khai KHÔNG Write/Edit … KHÔNG store_memory"*, và vai được khai `Read-only INFORM-only`.

⇒ **"ctx-verifier chưa lần nào tự APPEND" là mô-tả HỢP-ĐỒNG đang được tuân thủ, không phải triệu chứng lỗi.** Ghi vào carry như một khuyết-tật ⇒ carry này sẽ **không bao giờ đóng được**, vì điều kiện đóng của nó mâu thuẫn với spec của vai. (Tao ở đúng vị trí để nói: chính tao cũng propose-only, cũng "chưa lần nào tự APPEND", và đó là ĐÚNG.)

**Khuyết-tật THẬT nằm chỗ khác — đo được:**
1. **Vá gốc đã hứa @S162 CHƯA LAND.** Diary ctx-verifier ghi: *"vá gốc = wire diary-append vào `tiep.md §3-ter`, đã lên HANDOFF NEXT-em #1"*. Đo:
   ```
   grep -n -i "append|diary|agent-memory" .claude/commands/tiep.md
   -> 3 hit: :23 (wal-flush hook liệt path) · :167 (đọc _context) · :189 (harvest-hồi-tố khi resume)
   -> 0 hit nào ở §3-ter về seed diary sau khi nhận return
   ```
   ⇒ đúng lớp `dryrun_finds_promised_but_unlanded` (bài S168): **lời hứa sống trong sổ, không có đường thi hành**. Lần 4 xảy ra là **tất yếu**, không phải xui.
2. **Seed M9 bị TRỄ và GỘP, chứ không phải vắng.** Seed @`a2b37dc` gộp **S165+S167+S168 vào 1 bullet** (ctx-curator gộp S163→S167). Tức lượt S165 phải chờ **3 phiên** mới vào sổ. C11 khuyến nghị *"lead APPEND … IN THE SAME session"* — nhịp thực tế là gộp-hồi-tố.
3. **Có ca chính vai đã tự tố mà chưa ai xử:** seed ghi `_tiep-4.md` **211 B RỖNG RUỘT, không mang verdict**. Đo lại: `_tiep-4.md` = **211 B** ✅ đúng (và `_pause-1/-3/-4`, `_snapshot-2` cũng đúng 211 B = **kích-thước khuôn rỗng**). ⇒ marker `/tiep` **có thể land rỗng mà không ai kêu** — đây mới là lỗ hổng cơ-chế đáng mở carry.

**Đề-xuất đổi tên carry (em main quyết):** `[carry:ctx-verifier-no-self-append]` → `[carry:tiep-3ter-seed-unwired]`, điều-kiện đóng **soi được**: `tiep.md §3-ter` có bước lead-APPEND diary + 1 lượt `/tiep` chứng minh seed cùng phiên.

### D.2 Detector C11 `diary-0-delta` = 14 — **F-4: con số ĐÚNG nhưng KHÔNG đọc được thành "14 vai chưa seed"**

Đọc code `scripts/governance-detectors.ps1`:
- `:1821` — `$c11Flags` là **TỔNG (a)+(b)**: (a) FLAG-khuôn thiếu class-tag + (b) diary-0-delta. Nên "14 flag `diary-0-delta`" là **gán nhãn nhánh (b) cho tổng 2 nhánh**.
- `:1794` — nhánh (b) chỉ khớp `^sub-<role>[-.]` với `<role>` = **tên file trong `.claude/agents/`**. Hệ quả **2 lỗ**:
  - `harness-audit-return.md` / `harness-eval-return.md` / `harness-refine-return.md` **KHÔNG khớp** (không có tiền tố `sub-`) — dù `:1771` đã cố ý nạp chúng vào danh sách file (comment @S159 nói là đã vá). **Vá nửa vời: sửa bộ lọc FILE mà quên sửa regex ROLE.**
  - `sub-lead-gap-close-S168.md` **KHÔNG khớp** vì thư mục vai tên `lead-gap-auditor` (tương tự `lead-stale`). Cả 2 vai H24 vô hình ở nhánh (b).
- `:1808` — so `git log -1 --format=%cI -- agent-memory/<role>/` với **mtime file**. Vì hook `wal-flush` tự-commit `agent-memory/` ở turn-boundary, một vai **không được seed gì** vẫn có thể có commit mới hơn ⇒ **âm-tính-giả**.

**Đo độc lập (thước của tao, phủ CẢ 23 vai, cửa sổ ≥ 2026-07-24):** 12 FLAG, trong đó **@S168 = 7** (`harness-audit`, `harness-eval`, `harness-refine`, `ctx-audit`, `harvest-curator`, `ring2-audit`, `tooling-auditor`) + @S163 = 4 + @S169 = 2 (2 file vừa sinh trong lượt này, tự-nhiễu).
🔴 **Nhưng con số ĐÚNG cho câu hỏi "bao nhiêu vai thật sự chưa seed" không phải 14 cũng không phải 12 — mà là 9** (B.1), vì thước theo-nội-dung (`grep -c "S168"` trong diary) mạnh hơn thước theo-mtime-commit: nó bắt thêm `lead-gap-auditor` + `lead-stale-auditor` mà cả C11 lẫn scan mtime của tao đều bỏ sót.
**⇒ Bài (đúng anti-pattern #1 của chính tao): đo bằng TÊN/mtime bỏ sót; chỉ NỘI-DUNG mới ra số thật.**

### D.3 `harvest-curator/MEMORY.md` (chính tao) — **F-5: khai thật, và 2 trong 3 tiền-đề của slot (48) SAI**

| Mệnh đề trong slot (48) | Đo tươi hôm nay | Phán |
|---|---|---|
| "19.456 B" | `stat -c%s` = **18.781 B** (mtime 07-31 09:51, commit `43ca5c2`) | ❌ **STALE** — 19.456 B là số @`11db5ef` **S153**, cách đây 6 phiên |
| "self-compact DUE, chưa trả lần nào" | Quỹ đạo: `1b85713` 21.464 → `c2d01f0` 17.655 → `11db5ef` 19.456 → `f8cef20` 21.277 → `e5123ff` **23.493** → `43ca5c2` **18.781** | ❌ **SAI** — đã trả **−4.712 B @S164** (refine A2 đẩy S132-DỒN + S150 sang `archive/2026-07.md`, nay 61.504 B). Không phải "chưa trả lần nào" |
| "budget `:192` + diary `:5` ⇒ DUE" | `grep -rl self_target` ⇒ hit ở diary/return/`_mind`, **KHÔNG hit trong `memory-budget.json`** | ⚠️ **Ngưỡng 17,1 KB KHÔNG phải khoá máy** — đúng như `harness-refine` đã bác @S162. Khoá máy thật = `tiers.l1_hot.autoinject_cap_bytes` = **25.600** (soft-cap 30.720) |

**Trạng thái thật:** 18.781 / 25.600 B = **73,4% trần máy, dư 6.819 B** ⇒ **KHÔNG DUE theo máy**. L2 hiện `archive/`: `2026-07.md` 61.504 B · `2026-06.md` 17.072 B · 2 gist · `_INDEX.md` 8.325 B — tầng hoá lành mạnh.
⇒ **Đề-xuất: đóng slot (48) là DƯƠNG-GIẢ** (một self-target chưa từng được owner phê thành khoá máy, cộng con số stale 6 phiên). Nếu owner MUỐN 17,1 KB thành ràng buộc thật thì phải **ghi thành khoá trong `memory-budget.json`** — còn nằm trong prose thì mọi phiên sau lại cãi lại đúng vòng này (đây là lần thứ 3).

### D.4 `[carry:endline-sub-md]` — **F-6: đã là LUẬT (có văn bản), nhưng chưa có RĂNG (đo được)**

Luật ở đâu: `docs/governance/error-ledger.md:38` (AS-20) + `:99` — *"mọi `sub-*.md` kết bằng `END <slug> — VERDICT=<…>`"*, land cùng E-016 @S162 closeout (`e5123ff`, 2026-07-30 15:13).
Đo tuân thủ, **chỉ tính file sinh SAU lúc luật land** (kỷ luật frozen-history, không chấm điểm quá-khứ):
```
find runs -mindepth 2 -maxdepth 2 \( -name "sub-*.md" -o -name "*-return.md" \) -newermt "2026-07-30 15:13"
POST-LAW TOTAL=87 · END-in-last5=33 (37,9%) · END-anywhere=41 (47,1%)
```
- Riêng `2026-08-01-S168-bookend-close`: **5/10**.
- Riêng `2026-08-01-S169-bookend-open` (đang chạy): **0/4** tại thời điểm đo — 4 file gồm cả file này (tao đóng END ở cuối) + `sub-tooling-auditor-open-S169.md` + 2 file H24 vừa sinh.
- Chênh 33 vs 41 = **8 file CÓ END-line nhưng không ở cuối** (bị nội-dung khác đẩy xuống) ⇒ nếu ai đo bằng `tail` sẽ báo thấp hơn thực, nếu đo bằng `grep` toàn file sẽ báo cao hơn ý-định của luật. **Luật cần chốt 1 thước** trước khi đem tính điểm.

⇒ Trả lời thẳng: **luật CÓ, tuân < 1/2, và 4/4 file của chính phiên S169 hiện chưa tuân.** Nguyên nhân cùng lớp D.1: luật nằm ở `error-ledger` (sổ ghi lỗi) chứ **không nằm ở nơi vai đọc lúc chạy** (`.claude/agents/*.md` — `grep "VERDICT=" .claude/agents/` ⇒ **0 hit**). Vai không đọc error-ledger khi spawn thì không thể tuân.
✅ **Đề-xuất rẻ nhất (em main quyết):** thêm 1 dòng END-line vào phần OUTPUT contract của các persona hay ghi `sub-*.md`, HOẶC vào khuôn prompt spawn của lead — chỗ nào cũng được, miễn **nằm trong luồng đọc lúc chạy**.

---

## E. PROPOSE-DELTA cho em main (idempotent, đã DEDUP)

🔴 Tao **KHÔNG ghi** bất kỳ file nào ngoài chính artifact này. Dưới đây là đề-xuất; em main VERIFY rồi APPEND (B3).

**E.1 — Ưu tiên 1, gom orphan S168 (9 vai còn thiếu).** Nguồn sẵn sàng, không cần chạy lại gì: 9 file trong `runs/2026-08-01-S168-bookend-close/`. DEDUP đã làm: `grep -c "S168"` = 0 trên cả 9 diary ⇒ **không có nguy cơ double-APPEND**. Riêng `ring1-audit` **ĐỪNG** append lại (đã có, `grep -c`=1).
**E.2 — Đừng để S169 lặp lại S168.** Trước khi đóng phiên này: seed diary cho các vai chạy @S169 **trong cùng phiên**, và tạo `*-synthesis.md` cho `runs/2026-08-01-S169-bookend-open/` (nếu không, S169 thành orphan #4 thật).
**E.3 — Carry:** đổi tên `[carry:ctx-verifier-no-self-append]` → `[carry:tiep-3ter-seed-unwired]` (D.1); mở carry mới cho `_tiep-*.md` land-rỗng-211B; đóng slot (48) là dương-giả (D.3) hoặc nâng 17,1 KB thành khoá máy.
**E.4 — Escalate `reviewer`:** ca C.5 `cicd-monitor:86`.
**E.5 — Không thuộc tao (H1 `tooling-auditor` / chủ detector):** 2 lỗ regex C11 ở D.2. Tao chỉ nêu vì nó làm sai **con số harvest** tao phải báo — không tự sửa, không lấn.

---

## F. TỔNG — 8 finding

| # | Sev | Nội dung | Trục |
|---|---|---|---|
| F-1 | **HIGH** | S168 close: **9/10 vai không có diary**, 162.916 B kẹt; nội-dung ở kênh trung-tâm (không mất) | Coverage + Placement |
| F-2 | MED | Thước orphan có **dương-giả cấu-trúc 1 đơn-vị** (folder đang chạy luôn thiếu synthesis); phân-biệt bằng `_end` marker | Coverage |
| F-3 | **HIGH** | `[carry:ctx-verifier-no-self-append]` hỏi SAI câu — vai bị CẤM ghi theo spec; lỗi thật = vá gốc `tiep.md §3-ter` **chưa land** (0 hit) | Coverage |
| F-4 | MED | C11 = tổng (a)+(b), regex `^sub-<role>` sót `*-return.md` + `lead-*`; số thật vai chưa seed = **9**, không phải 14 | Coverage (instrument) |
| F-5 | MED | Slot (48): 19.456 B **stale 6 phiên** (thật 18.781), "chưa trả lần nào" **sai** (đã −4.712 @S164), 17,1 KB **không phải khoá máy** ⇒ không DUE | Completeness (self) |
| F-6 | MED | END-line: post-law **33/87** (37,9%); S169 **0/4**; luật nằm ở error-ledger, `.claude/agents/` 0 hit ⇒ vai không đọc được lúc chạy | Corruption-guard |
| F-7 | MED | `cicd-monitor:86` claim "verbatim→archive" vẫn **0 chứng** cho #422/#425 sau 4 phiên (E-016/AS-20 chưa đóng) → escalate reviewer | Fidelity-FLAG |
| F-8 | LOW | Bẫy đo **bắt trong lúc làm**: `grep -P` chết vì locale + `2>/dev/null` nuốt lỗi ⇒ 4 số "0 corruption" đầu tiên là **0-GIẢ**; đo lại bằng scanner có control | (meta-đo) |

**NOTE tích cực (không tính finding):** S168 **đóng 2 orphan cũ** (S163, S166) trong khi mở 1 ⇒ ròng **−1**. Và 3 entry được seed thì **4/4 field đủ** — bệnh là "không viết", không phải "viết ẩu".

**VERDICT = GATE-FAIL.** Lý do đủ để FAIL (không cần cộng dồn): Coverage 1/10 ở bookend-close vừa xong (F-1) + vá gốc lần-4 chưa có đường thi hành (F-3). Cả 2 đều **có đường sửa rẻ, nguyên-liệu còn nguyên trên đĩa** — FAIL đây là "chưa gom", không phải "đã mất".

---

## G. PHỤ LỤC — 1 quan sát containment (không tính finding, nhưng em main nên biết)

Harness lượt này tạo sẵn **thư mục memory sandbox RỖNG bên trong run-folder**:
```
runs/2026-08-01-S169-bookend-open/.claude/agent-memory/{harvest-curator,lead-gap-auditor,lead-stale-auditor,tooling-auditor}/
find … -type f | wc -l  ->  0   (4 thư mục, 0 file)
```
- Tao **KHÔNG ghi gì vào đó** (propose-only, anti-pattern #4) — 0 file là bằng chứng.
- 🔴 Cảnh báo: đây đúng hình dạng ca **S54 cwd-relative memory mis-land**. Nếu vai nào tuân "persistent memory" của khung mà ghi vào đây, delta sẽ **land ngoài `agent-memory` canonical** và im lặng biến mất khỏi auto-inject.
- 🧊 Thêm một tầng im lặng: **git mù thư mục rỗng** (bài S122) ⇒ `git status` sẽ KHÔNG cho thấy 4 thư mục này; chỉ `find` mới thấy. Em main nên soi bằng `find`, đừng tin `git status` ở điểm này.

END harvest-curator-open-S169 — VERDICT=GATE-FAIL — 8 finding
