# sub-harvest-curator-close-S162 — H2 HARVEST-INTEGRITY GATE @close (phiên-LOGIC L8, nhãn S162)

> Ghi-đĩa-TRONG-lúc-làm (anti-#53). Propose-only. Mỗi trục append ngay khi đo xong.
> START 2026-07-30 (window-4 close). PIN đọc: `runs/2026-07-30-S162-bookend-close/run.md` (khối số máy ĐÓNG BĂNG — KHÔNG đo lại 8 dòng đó).

## 0. Sổ lệnh (mọi số dưới đây phải tái-lập được — anti-pattern #2)

(đang chạy…)
### Lệnh đã chạy (tái-lập được)
1. universe: `ls -1d .claude/workflows/runs/*/ | wc -l` = **75** · có `run.md` = **72** · không có = **3** (`S117-pe-approve-minmax-range`, `S117-pe-luyke-finalize` = spec-only by-design; `S144-bootstrap` có `bootstrap-synthesis.md`) ⇒ KHÔNG orphan.
2. orphan dual-accept (loop `for f in "$d"*-synthesis.md "$d"harvest/*-synthesis.md` + `wc -c > 0`) trên universe run.md=72 ⇒ **4 hit**, trong đó 1 = folder ĐANG MỞ (`S162-bookend-close`) ⇒ **orphan THẬT = 3/72**.
3. verdict byte-exact: `grep -n -iE "SHIP-READY|PASS-WITH-FLAGS|PASS 5/5|VERDICT=" runs/2026-07-30-S162-cay-4-folder-gd/sub-*.md`
4. coverage: `grep -c -i S162 .claude/agent-memory/<role>/MEMORY.md` cho 4 vai.

## 1. COVERAGE — 4 sub spawn @S162 (verify từ ĐĨA, KHÔNG tin danh sách brief)

| # | vai | artifact ĐĨA | byte | S162-hit trong `agent-memory/<role>/MEMORY.md` | mtime memory |
|---|---|---|---|---|---|
| 1 | ctx-verifier | `.claude/sessions/session-8/_tiep-3.md` (dòng 6) | 856 | **0** 🔴 | 2026-07-28 20:56 |
| 2 | frontend-designer | `runs/2026-07-30-S162-cay-4-folder-gd/sub-frontend-designer-0.md` | 17.844 | 1 (entry dài, dòng 48) | 2026-07-30 10:03 |
| 3 | reviewer | `…/sub-reviewer-1.md` | 16.186 | 4 (entry dòng 3 + 3 dòng curate) | 2026-07-30 09:53 |
| 4 | cicd-monitor | `…/sub-cicd-monitor-2.md` | 12.894 | 3 (entry dòng 3 + 2) | 2026-07-30 10:23 |

🔴 **F-01 COVERAGE-GAP `ctx-verifier`** — chạy THẬT @S162 (`_tiep-3.md:6` = `ctx-verifier: CO-CO — 8 cờ (K1..K8)`) mà **0 nội-dung S162** trong sổ nó; entry cuối = **S158**, mtime 2026-07-28 (2 ngày), commit cuối `bbc39be`.
   ↳ **TÁI PHÁT lần 3**: chính entry S158 của nó tự khai `[LEAD SEED ON-BEHALF @closeout M9 — mày CHẠY THẬT nhưng KHÔNG tự ghi; nguồn = _tiep-4.md + xác nhận H2 grep -c S158 = 0]`; S153 cũng seed on-behalf. ⇒ vai này **CHƯA BAO GIỜ tự-APPEND** — khâu hỏng là APPEND, không phải phát-hiện (nối F-07 @S159).

## 2. COMPLETENESS — 4-field {agent · task · nấc · evidence}

| vai | agent | task | nấc/verdict | evidence (trỏ artifact) | đủ? |
|---|---|---|---|---|---|
| ctx-verifier | — | — | — | — | **0/4** (không có record) |
| frontend-designer | ✅ | ✅ | ✅ "build PASS ×2" | ❌ 0 hit `runs/2026-07-30-S162…` | **3/4** |
| reviewer | ✅ | ✅ | ✅ "PASS-WITH-FLAGS 8 flag/0 blocker" | ❌ 0 hit `runs/2026-07-30-S162…` | **3/4** |
| cicd-monitor | ✅ | ✅ | ✅ "PASS 5/5" | ✅ `Evidence: runs/2026-07-30-S162-cay-4-folder-gd/sub-cicd-monitor-2.md` | **4/4** |

🔸 **F-04 LOW — thiếu trường EVIDENCE (2/4 vai).** `frontend-designer` + `reviewer` viết entry S162 rất dày nhưng **0 hit** `runs/2026-07-30-S162…` trong entry ⇒ 6 tháng sau không lần được về artifact gốc. `cicd-monitor` làm ĐÚNG khuôn: `Evidence: runs/2026-07-30-S162-cay-4-folder-gd/sub-cicd-monitor-2.md`. Đề: chuẩn-hoá đuôi entry = 1 mẩu `Evidence: <path>`.

## 3. CORRUPTION

**Lệnh (đã kiểm exit-code — bài F-09 S159 `grep -P` chết rc=2 im lặng):**
`find .claude -type f -name "*.md" -print0 | xargs -0 perl -ne '$n=()=/\xEF\xBF\xBD/g; if($n){print "$ARGV:$.:$n\n"}'` → `PIPE-EXIT=0/0` (find 781 file .md).
- **U+FFFD = 24 hit / 12 file** (baseline S153 = 16/10). Δ = **+8 hit / +2 file**, TRỌN VẸN nằm ở 2 file S159: `sub-harvest-curator-open-S159.md` (3) + `sub-ring1-audit-open-S159.md` (5).
- Mở RUỘT 8 hit mới (KHÔNG suy-luận lai-lịch): tất cả là **mention** — trích lại `"<FFFD>24.1KB"` / `C<FFFD>ng` / `"D? tr<FFFD>"` làm BẰNG CHỨNG trong chính báo-cáo FFFD (citation-trap đời-4, đã tiên-đoán @S159 T-4).
- **0 hit trong bất kỳ file nào sinh @S162.** 0-byte: **10 file, 100% = `.gitkeep`** (5 run-folder 06-18 dạng `sub-md/`+`harvest/`).
- ⇒ **Corruption PASS** · **baseline kỳ sau = 24 hit / 12 file** (quét trọn `.claude/**/*.md`).

### 3-bis. moved-not-cut (3 vai TỰ CURATE trong phiên này — cửa sổ `2554845..HEAD`, head-sha lấy từ `_tiep-3.md:2`)

| vai | removed | phân loại (difflib + probe substring vào archive) | verdict |
|---|---|---|---|
| frontend-designer | 7 | **7/7 MOVED-to-archive byte-exact** (3 entry: S79 pe-decouple · S69 3-shared-UI · S69 OfficeDashboardPage → `archive/2026-06.md`) | ✅ PASS |
| reviewer | 18 | 2 MOVED verbatim (S161-W2 + S161-W1 → `archive/2026-07.md`) · 9 MODIFIED · 7 stub-gộp — **12/12 token đích (S155/S146/S147/S145a/S143/S139/S134b/S133/S93/S117/S160/S161) đều CÓ trong archive** | ✅ PASS |
| cicd-monitor | 22 | 2 MOVED verbatim (#427 `a8027c0` · #426 `ea962b1`) · 5 STILL-in-L1 · 8 MODIFIED · **5 gộp thành 1 stub `MEMORY.md:9`** | 🔴 **FAIL ×2** |

🔴 **F-02 HIGH — cicd-monitor CUT-NOT-MOVED ×2 + stub tự khai SAI.** Stub mới `MEMORY.md:9` viết
`_(**S159 arc đợt-1→4 (#422 b5799fc · #423 1a47a61 · #424 2a72695 · #425 a2bbcb9) + S157 #419 a52a91e** — … verbatim → archive/2026-07.md via _INDEX …)_`
nhưng đo đĩa: `grep -r -F` trên TOÀN `.claude/agent-memory/`:
- `#423`/`1a47a61` → archive 4/5 hit ✅ · `#424`/`2a72695` → 1/2 ✅ · `#419`/`a52a91e` → 4/5 ✅
- **`#422`/`b5799fc` → 0 hit** · **`#425`/`a2bbcb9` → 0 hit** (kể cả `_INDEX.md`)
- Chứng mạnh hơn: `git log -S"b5799fc" -- .claude/agent-memory/cicd-monitor/archive/` = **RỖNG** (chưa BAO GIỜ vào archive); `-S` trên `MEMORY.md` = 2 commit (chỉ từng sống ở L1).
⇒ nội dung 2 lượt verify (#422 ĐỢT-1 tổng-quan 755 B · #425 đợt-4 7-FLAG-fix 488 B) **mất hẳn**, và câu "verbatim → archive" **che mất** việc mất. Tái phát class `S102 cut-not-moved f229b07`.

### 3-ter. TỰ SỬA phép đo của chính tao (2 lớp — không để lửng)

**(a) 13 ca "CUT-NOT-MOVED" ở vòng đo ĐẦU = ÂM TÍNH, do THƯỚC của tao.** Vòng-1 tao phân loại "removed ∧ ¬archive ∧ ¬L1 ⇒ cut". Sai vì bỏ 2 lớp:
- **dòng bị SỬA tại chỗ** (probe substring giữa-dòng trượt) — vòng-2 dùng `difflib.get_close_matches(cutoff .55)` ⇒ 9 ca cicd + 9 ca reviewer là **MODIFIED** (ví dụ `API Serilog` đổi path `solution-erppi`→`solution-erp\api` + gỡ byte BEL; `Bundle hash live` cập-nhật baseline). Nội dung KHÔNG mất.
- **stub trỏ archive bị GỘP** — 7 dòng reviewer dạng `[→ archive/2026-07.md @S1xx-curate]` là con-trỏ, không phải nội dung; gộp lại vẫn còn con-trỏ.
⇒ **âm tính 20/22 ca nghi. Chỉ 2 ca sống sót qua vòng-2** (F-02) và chúng sống sót bằng chứng cứ MẠNH HƠN substring: `git log -S` trên đường dẫn archive = **RỖNG toàn lịch sử**.

**(b) Tao overclaim trong chính F-02 phía trên: "mất hẳn" là SAI — đính chính.** Đo tiếp:
`runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-b5799fc.md` = **9.930 B** · `cicd-verify-a2bbcb9.md` = **9.860 B**, cả 2 còn nguyên trên đĩa (git-tracked).
⇒ Mức thiệt hại đúng = **mất lớp ĐÃ CHƯNG CẤT (distilled) ở L1/L2**, KHÔNG mất nguyên-liệu. **Phục hồi được** bằng re-distill từ 2 file trên. Giữ F-02 ở HIGH vì (i) stub tự khai "verbatim → archive" là **khai SAI** và (ii) không ai biết để đi tìm nguyên-liệu nếu stub nói đã archive rồi.

## 4. PLACEMENT

- `find .claude -type d -empty` → **0** (S159 báo 5→6 đang tăng ⇒ **ĐÃ ĐÓNG**).
- `find . -type d -name ".claude" -not -path "./node_modules/*"` → **1** = `./.claude` (0 stray lồng; cờ T-5/S159 **ĐÓNG**).
- `find . -type d -name "agent-memory" …` → **1** = `./.claude/agent-memory` (0 stray cwd-relative).
- Roster `find .claude/agent-memory -mindepth 1 -maxdepth 1 -type d | wc -l` = **23 vai** (đếm bằng `-type d`, tránh bẫy m#11 `cut -f3` nuốt file root).
- Delta 3 vai S162 nằm ĐÚNG nhà; 0 delta lạc chỗ. Containment `git diff --name-only 2554845..HEAD` = {WAL · .session-counter.json · `_tiep-3.md` · 12 file FE code-disjoint đã giao · agent-memory 3 vai · runs} — **0 tracked-change ngoài vùng**.
⇒ **Placement PASS.**

## 5. FIDELITY-FLAG (không tự phán "bịa")

| claim brief | đĩa | verdict |
|---|---|---|
| ctx-verifier `CO-CO — 8 cờ` | `_tiep-3.md:6` `ctx-verifier: CO-CO — 8 cờ (K1…K8)` | ✅ **byte-exact** |
| reviewer `PASS-WITH-FLAGS 8` | `sub-reviewer-1.md:87` `# VERDICT: PASS-WITH-FLAGS` + `:89` "8 flag" + `F-1..F-8` distinct=8 | ✅ **khớp, hợp-thành 2 mảnh** |
| cicd `PASS 5/5` | `sub-cicd-monitor-2.md:151` `**END … VERDICT=PASS 5/5**` | ✅ **byte-exact** |
| designer `SHIP-READY` | `sub-frontend-designer-0.md` — `grep -iE "ship.?ready\|verdict\|END "` ⇒ **0 hit**; file kết bằng `### TỰ ĐÁNH GIÁ CÒN HỞ`, **KHÔNG có END/VERDICT-line** | 🔴 **F-03 — không truy được về đĩa** |

🔴 **F-03 MED — `SHIP-READY` là câu KHÔNG có trên đĩa.** `ship-synthesis.md:14` trích như verbatim của vai: ``1. designer `VERDICT: SHIP-READY`…`` — nhưng artifact của designer 17.844 B **chưa bao giờ chứa chuỗi đó**. Nguồn duy nhất = return-message (bốc hơi khi phiên đóng).
**KHÔNG kết luận bịa** — 3 chỉ dấu chống-bịa: (i) nội dung khớp đĩa (`MỐC 4`: tsc EXIT 0 ×2 + build EXIT 0 ×2 + SHA-pair 6/6), (ii) 3/4 vai còn lại byte-exact, (iii) chính artifact tự khai 3 hở. Đây là **lỗ khuôn**: đúng lớp m#21 (END-line ≥2 khuôn) nâng 1 nấc = **0 khuôn**. Đề luật: mọi `sub-*.md` PHẢI kết bằng 1 dòng `END <slug> — VERDICT=<...>`.

## 6. CLOSE-GATE C5 Layer-3 (dual-accept) — 3 folder KÊU: xác nhận/bác từng cái

**Orphan THẬT = 3/72** (folder thứ 4 `S162-bookend-close` = **ĐANG MỞ**, ghi nhận chứ không tính — bài anti-pattern #3).

| folder | phán | bằng chứng | đề xuất xử |
|---|---|---|---|
| `2026-07-29-S159-bookend-open` | ✅ **XÁC NHẬN orphan THẬT** | 11 file, 0 file khớp `*-synthesis.md` ở cả 2 dạng; `run.md` còn **3 ô `[ ]` NỢ VÁ** (F-02 test-count `531` · F-03 cite `:174`→`:176` · citation-trap END-marker). Commit cuối 07-29 10:31 | **retro-harvest NỘI DUNG THẬT** → `bookend-synthesis.md`. Nguyên-liệu đủ: 7 `sub-*.md` + 3 `harness-*-return.md`. Kèm chốt 3 ô `[ ]` (2 trong đó là finding của chính H2 @S159) |
| `2026-07-29-S159-tong-quan-pipeline-menu` | ✅ **XÁC NHẬN orphan THẬT** | 13 file, 0 khớp glob; `run.md` còn `[ ] T4` + `[!]` cicd-verify chạy-nền. Commit cuối 07-29 14:53 | **retro-harvest THẬT** → `arc2-synthesis.md`. 🔴 **ƯU TIÊN CAO hơn cái trên**: đây là nơi duy nhất còn nguyên-liệu #422/#425 vừa bị cut (F-02) ⇒ 1 công đóng 2 lỗ |
| `2026-07-29-S160-khkk-dryrun-plan` | ✅ **XÁC NHẬN dương-giả TÊN** (có synthesis THẬT) | `review-synthesis-clone-s160.md` **8.043 B**, ruột = synthesis thứ thiệt (verdict hội tụ 5/5 lane + bảng "Lead verify độc lập 5/5 CONFIRMED" + DISPOSITION per-finding). `run.md` stage cuối `[x] harvest M9` ⇒ delta ĐÃ về diary | **rename** `review-synthesis-clone-s160.md` → `review-clone-s160-synthesis.md` (`git mv`, giữ nguyên ruột) |

🔸 **BÁC 1 giả-thuyết trong brief/`/tiep`:** lý do trượt glob **KHÔNG PHẢI** "thiếu dấu `-` trước `synthesis`" — dấu `-` **CÓ** (`review-synthesis`, `grep -o -- "-synthesis"` khớp). Lý do THẬT: glob `*-synthesis.md` **neo ở ĐUÔI tên**, mà file còn `-clone-s160` **SAU** chữ synthesis. ⇒ Kết luận của brief đúng, **chẩn đoán sai**; nếu sửa theo chẩn đoán sai (thêm dấu `-`) sẽ không hết bệnh.

## 7. SÀN-5 (informational)

2 run SINH trong phiên (first-commit `git log --format=%cI -- <dir> | tail -1`):
- `2026-07-30-S162-cay-4-folder-gd` → first-commit **2026-07-30T09:11:32+07:00**
- `2026-07-30-S162-bookend-close` → first-commit **2026-07-30T14:20:33+07:00**

Đăng-ký: `grep -c "run=" .claude/WAL.md` = **0** · `grep -nE "wf:|run=" .claude/WAL.md` = **0 dòng** · session-log S162 **chưa tồn tại** (mới nhất = `2026-07-29-1440-S159-…`).
- ⇒ theo khuôn `wf: … run=<id>`: **0/2**.
- NHƯNG có đăng-ký **khác khuôn**: `WAL.md:27` = `- run đợt cây: .claude/workflows/runs/2026-07-30-S162-cay-4-folder-gd/ (sub-frontend-designer-0 + sub-reviewer-1 + ship-synthesis khi đóng)` ⇒ **1/2 có đăng-ký nội-dung**, `bookend-close` **0/1** (mới sinh 14:20).
- Cùng lớp m#21: **sàn đo 1 khuôn ⇒ dương-giả "không đăng ký"**. Sàn-5 = informational, KHÔNG tính vào GATE.

## 8. VERDICT + propose-delta (propose-only, em main VERIFY→APPEND)

**GATE-FAIL — 4 finding** (F-01 HIGH · F-02 HIGH · F-03 MED · F-04 LOW) + 3 orphan xác nhận + 2 chore.
5 trục: Coverage **FAIL** (1/4 vai không record) · Completeness **PASS-with-debt** (3/4 vai đủ, 2 thiếu evidence-pointer) · Fidelity **FLAG** (3/4 byte-exact, 1 không truy được) · Placement **PASS** · Corruption **PASS** (0 hit mới; 🔴 nhưng moved-not-cut **FAIL ×2**).

END sub-harvest-curator-close-S162 — VERDICT=GATE-FAIL 4 finding (Coverage FAIL · moved-not-cut FAIL×2 · Fidelity FLAG×1 · Placement PASS · Corruption PASS)
