# Harvest-Curator Agent — Persistent Memory > **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). > Update BEFORE every stop. Tiered Memory v1: **L1 self-target ≤17.1KB (hook read-limit 24.4KB)** · L2 `archive/` on-demand · L3 RAG `search_memory` just-in-time. Keep entry ≤ 1.5K chars. > **NEW agent 2026-06-07** (adopt AI_INFRA Harness 1 — H2 harvest-integrity; TÁCH khỏi tooling-auditor H1 per anh-mandate "H1/H2 hay quên+nhầm → riêng-biệt"). --- ## 🎯 Role baseline H2 harvest-MD-integrity auditor **SOLUTION_ERP-self**. Read-only + **propose-only** (em main = single-writer, VERIFY→APPEND B3; ngoại lệ duy nhất = diary chính mình khi em main cho phép). Verify HARVEST mỗi session ĐỦ+ĐÚNG **5-trục**: Coverage · Completeness · Fidelity-FLAG · Placement · Corruption. @session-end GATE trước đóng + gom run-folder; @session-start báo harvest mới + delta mồ-côi + orphan run vs ledger. ## 🚫 Split boundary - ✅ MINE: harvest-memory integrity (5-trục) + spawn-record 4-field + run-folder gom (Harness-10) + delta mồ-côi — SOLUTION_ERP-self - ❌ NOT: tooling/skill/plugin/docs-freshness → **tooling-auditor** (H1) · corpus/RAG/deploy → cicd-monitor · Fidelity tự-phán "bịa" → escalate **reviewer** · write/decide → em main ## 📋 Baseline state (re-ground S99) - **Spawn-record 4-field SE:** `{task · verdict · learned · surprise}` (memoryDelta R1 contract HMW). - **agent-memory:** 12 folder `.claude/agent-memory//MEMORY.md` (placement target — S107 +office-document seed). Cap L1 = 25.6KB (H11 `memory-archive-gate.ps1`); hook self-target 17.1KB. - **Run-trace (Harness-10, thay wave-folder Harness-2):** `.claude/workflows/runs//` git-TRACKED, FLAT (`run.md` + `sub-*.md` + `*-synthesis.md`); 5 run cũ 06-18 giữ `sub-md/`+`harvest/` subfolder (dual-accept). **🧊 Ledger `runs/_ledger.md` RETIRED H18-B S100** (true-catch 0/15 lifetime + mode-A coverage 0/8; 15 row frozen giữ lịch-sử) — **orphan-authority = folder-scan:** folder có `run.md` mà `*-synthesis.md` VẮNG/0-byte. Mode-A ephemeral (S98 note): HMW default KHÔNG tạo run-folder = by-design, vắng folder ≠ orphan. - **Nền H2 gốc:** `session-end.md` Phase 1.5 §L.b = 3/5 trục; sub này nâng +Fidelity-escalate +Placement = đủ 5. ## ⚠️ Anti-patterns ❌ Tự ghi/overwrite memory ngoài diary mình (propose→em main APPEND) · ❌ tự phán Fidelity "bịa" (→ reviewer) · ❌ tick "đã flush?" nhị-phân (phải đủ 5-trục) · ❌ đụng tooling-freshness (đó là tooling-auditor) · ❌ G-015 overclaim "read-only enforced" · ❌ final-message trả narrative memory-curation thay verdict (#53 return-garble). ## ⭐ Methods (giữ vĩnh viễn — đúc từ S50-S66, verbatim → `archive/2026-06.md`) 1. Chunk-count qua **RAG MCP `list_projects`**, KHÔNG shell-probe Qdrant (MCP trỏ host khác → false-negative). 2. Sub killed-mid-write → verify tail **terminates-clean** (`wc -l` + closing-Tag), KHÔNG chỉ `-size 0` (partial-write ≠ 0-byte). 3. Detect interrupted-session: so **mtime agent-memory vs closeout-commit timestamp**. 4. Commit-stat "có append" ≠ "có fanout-record" — classify bằng **grep tag session + mtime**, đừng tin stat. 5. Extract added-bullet trong diff: `grep "^+-"` (filter `grep -v "^[+-][+-]"` NUỐT dòng `+- **…`). 6. `tail -c N` cắt giữa UTF-8 multibyte in ra ký-tự-thay-thế GIẢ — corruption thật = **grep literal U+FFFD** (đừng viết literal đó vào L1 kẻo tự false-alarm). 7. Mojibake quoted-cũ vs mới: **arithmetic line-shift** = đúng số dòng insert phía trên → cũ. 8. Sub die không để delta → **commit-body = spawn-evidence** (S60 reviewer tự khai trong msg). 9. U+FFFD self-quote trong file MÌNH + archive = quoted-evidence cố-ý — đừng false-alarm. 10. Trend self-tag session-drift (cicd s50→s51 · inv s56→s57 · inv s57bis→s58 · cicd s98→s97 ×4): entry mới soi tag vs session thật. ## 📅 Recent activity (FIFO — older → `archive/2026-06.md`) > **S50→S66 (14 entry) verbatim → `archive/2026-06.md`** — curate S99 (hook 19.9KB > self-target 17.1KB), moved-not-cut grep-verified 5/5 + entry-count 14. Digest: verified-runtime S50 · GATE PASS 5/5 ×6 (S50/51/58/59/63/66) · chuỗi 4-MISS post-S57bis rushed-closeout + reviewer die ×3 (S57bis ×2 + S60) · cicd over-cap saga 32→86.8KB → curate S66 86.8→28.9KB. - **2026-07-02 (S98 @start RE-REPORT — post-S97, on-behalf em main APPEND B3):** Self-report `claude-fable-5` (inherit — Fable-restore evidence, cặp với H1 cùng ngày). Verdict: (a) harvest S97 8-commit **CLEAN** — 0-byte=0 · U+FFFD=0 · tail 11/11 sạch; archive `2026-H1.md` impl-fe **moved-not-cut VERIFIED-git** (baseline 791ec55 S76/S78/S79 đều present; "S77" = range-label không tồn tại — đừng false-alarm). (b) **3 delta mồ-côi propose-APPEND** (em main VERIFY→APPEND cùng session): database-agent MISS ×2 spawn S97 (Part-4 điều-tra Mig60-wrong-table + Part-5 lane integrity; file đóng băng từ S57bis — miss nặng nhất) → 1 record gộp 4-field · reviewer addendum Part-5 fail-return-schema vào entry S97-bis · impl-fe hook 1-dòng Part-2 `finalizeFlowStep`. (c) Orphan runs **0/15** (ledger `⏳` chỉ dòng legend); NOTE INFORM: S97 2 HMW workflow (`wf_0e01fdba`/`wf_4951c347`) **ephemeral KHÔNG ghi run-folder** = pattern S94+ — ledger H10 hiện chỉ cover run kiểu cũ. (d) Stray=0 (guard S76 giữ). **Flags:** cicd self-tag "S98"→S97 ×4 dòng (:54/:55/:73/:75 — session-tag drift lần 4; em main patched `replace_all` TRƯỚC khi S98 thật ghi entry, tránh grep-collision) · **cicd L1 19.9KB > self-target 17.1KB garble-pressure (#53 structural) → archive-sớm @closeout** · impl-be 23.9KB gần cap watch. Tag `[s98-start, 3-orphan-append, cicd-s98-tag-patched, fable-restore-evidence, on-behalf]`. - **2026-07-02 (S99 @start RE-REPORT — post-S98 same-day):** Verdict 🟢 gần-CLEAN — duy nhất 1 delta mồ-côi = cicd `:73` entry **#485 (rn 371) `8a249c5` GO** mtime 11:06:03 SAU commit-cuối 10:57:45 = orphan-by-construction (post-closeout verify, precedent S58 #385/#386) · fidelity ARITHMETIC-verified độc lập: push-range `310b9fc..8a249c5` = 23 file = 22 .md + đúng 1 non-md `memory-budget.json` khớp claim từng-chữ · tag "S98" ĐÚNG (hết drift sau patch S98) → propose COMMIT vào bundle đầu S99, KHÔNG revert. 3 orphan-append S98 **đóng thật tại HEAD** (db-agent `:36` gộp 4th+5th · reviewer `:72` addendum Part-5 · impl-fe `:16` hook Part-2 — đủ 4-field + on-behalf label). Orphan run **0/16** ledger all-closed (mode-A note live; folder mới=0 từ 06-18, chỉ `_ledger.md` mtime 07-02 committed). 0-byte=0 ×2 nơi · tail 11/11 `0a` · U+FFFD hit đều quoted-cũ (cicd `archive/2026-06.md:26` #377 + archive MÌNH — L1 mình + cicd L1 SẠCH sau curate). Chore: impl-be 23.9KB sát cap 25.6KB watch (đứng im từ 06-25, không phình). **Self-curate S99:** L1 19.9→~9KB, S50-S66 → `archive/2026-06.md` (17072B, 14 entry, moved-not-cut grep 5/5) — hook-triggered, trong quyền diary-mình. Wrote OWN diary. Tag `[s99-start, cicd-485-orphan-sane, arithmetic-fidelity, self-curate-L2, clean]`. - **2026-07-02 (S100 @start RE-REPORT — post-S98+S99, on-behalf em main APPEND B3):** Verdict 4-trục ALL-CLEAN + 1 live-delta. (1) Delta S98/S99 committed đúng nhà (`4263d63`/`8a249c5`/`c112be9`), 0 mtime>HEAD; duy nhất tooling L1 dirty 14:38:42 = entry S100 tự-ghi (NOT-in-HEAD) → commit bundle bootstrap. (2) Mồ-côi 0: S98 2-monitor + 3 orphan-append S97 đóng + cicd #485 tại `:73` · S99 2-monitor đủ 4-field. (3) Orphan run 0/14, ledger 0 `⏳`, mode-A by-design. (4) 0-byte 0/11 · tail 11/11 `0a` · U+FFFD 2-file quoted-cũ known · tooling archive spot-check 3-hit moved-not-cut · impl-fe gist ADDITIVE. INFORM: S99 push `8a249c5..525a01a` (9 .md docs-only, CI path-filter skip) chưa cicd-verify — optional. Chore: impl-be 23.9KB đứng-im 06-25 watch · fe-designer 21.5KB + reviewer 20.7KB > self-target 17.1KB garble-pressure watch. Method-new: monitor song-song ghi diary GIỮA 2 batch scan → batch-1 status/mtime = stale-snapshot, re-check trước khi phán dirty/orphan. Tag `[s100-start, 4-truc-clean, tooling-l1-live-delta, on-behalf]`. - **2026-07-03 (S101 @start + @closeout — on-behalf em-main APPEND B3):** @start RE-REPORT ALL-PASS/CLEAN (0-orphan · 0-byte 0/11 · 0-corruption + cicd #486 dirty-delta fidelity-verified→commit). @closeout **GATE PASS 5/5 trục** (S101 = 2 commit `f229b07` H18-WF2-closeout + `e350660` H19-formal-adopt): Coverage COMPLETE 6 spawn-touchpoint (2 monitor + WF1-invest investigator-cb + WF2-H18/H19 reviewer ×2), Corruption U+FFFD=0/11 · tail-0a=11/11, close-gate **0 July-run-folder** (mode-A ephemeral confirmed) → 0-orphan. 🔴 **AS-10 Fidelity-call: LEGIT harvest NOT residual-violation** — WF1+WF2 lanes tự-ghi agent-memory (frontmatter "update-MEMORY-before-return" override HMW-return-only) NHƯNG verify ĐỘC-LẬP content khớp lane-verdict (reviewer README:51-fix landed-verbatim hunk `@@-48,5+48,5`, 0 fabrication) + containment intact committed → **KEEP đúng per keep-if-correct** (KHÁC S95-default-revert vì S101-writes CLEAN, quyết bằng Fidelity-gate KHÔNG tự-phán). Cross-link H19 §K.C GAP-3 dogfood-validate "N-lane-return-only = convention KHÔNG mechanism" (fire 6, catch 6, 0 escape). Chore-watch: impl-be 23955B near-cap 93.6% (đứng-im 06-25) · reviewer 20728→19357 net-shrink healthy · self diary 8434B healthy. Method-#5 self-trap: empty-grep từ `+-`-filter choking leading-bullet → dùng method-#5 fix (false-alarm caught). Tag `[s101-gate-pass-5truc, as10-fidelity-legit-keep, gap3-dogfood, on-behalf]`. - **2026-07-06 (S102 @start RE-REPORT — self-write per em-main instruction):** Model self-report `claude-fable-5`. Coverage/Completeness/Corruption CLEAN: git-porcelain 0 dirty ⟹ **0 delta mồ-côi by-construction** (mtime agent-memory ≤18:31:37 < closeout `3e2c18b` 18:32:11, method-#3) · orphan-run **14/14 PASS** folder-scan, 0 folder July = 3 WF S101 mode-A by-design · 0-byte 0/11 · tail 11/11 `0a` · U+FFFD L1 0/11 (2 archive hit quoted-cũ known). AS-10 KEPT entries reviewer VERIFIED intact: `:13` H18 `wf_955643c3` + `:14` H19 Lane-C + `:22` H19 Lane-A (f229b07/e350660). 🔴 **CATCH ×2 FLAG (miss của chính gate S101 mình):** (1) f229b07 XÓA 5 verbatim (S97·S97-bis·S98×3) khỏi reviewer L1, digest claim "Detail → archive/2026-06.md" nhưng grep 0/0/0 + archive mtime 06-20 = **cut-not-moved**, verbatim chỉ còn `git show 5ee32c0:` → propose recover → `reviewer/archive/2026-07.md` + _INDEX; (2) `:72` pointer `project_s100_h18_wf2_synthesis.md` chưa-từng-tồn-tại (git log --all rỗng) = dead-satellite; minor `:22` lạc section Role-baseline. Đối-chứng: cicd f229b07 nén IN-PLACE (giữ one-liner trong L1) = pattern sạch. **Method-new: L1 net-shrink + claim "Detail→archive" = PHẢI grep archive moved-not-cut TRƯỚC khi PASS — "net-shrink healthy" S101 là verdict thiếu trục.** Chore: impl-be 23955B idle · fe-designer 21.5K / inv-cb 20.6K / reviewer 19.4K / cicd 18.4K > self-target 17.1K watch. Tag `[s102-start, cut-not-moved-catch, dead-pointer, 0-orphan-delta]`. - **2026-07-06 (S104 mid-session RE-REPORT — retro-append tại S105, on-behalf em-main B3; nguồn session-log S104:19):** Task: 5-trục verify post-`778fc98` (Mig 62 Supplier docs-lag). Verdict CLEAN — investigator-harvest-in-HEAD **moved-not-cut** (arithmetic 18 AddColumn/2 Sql-guard/0 CreateTable · PathLink 2497B byte-identical 2-app · CaHai=6 append) + 3 cicd file uncommitted **commit-worthy** (DEDUP clean, #488 not-in-HEAD → landed `9f9a78e`) + 0 orphan-delta khác + 0 orphan-run + 0-byte 0/11. Learned: verdict chỉ nằm session-log, spawn-record chính mình không ai append (`9f9a78e` thiếu harvest-curator) = **self-record blind-spot của gate-agent**. Tag `[s104-retro, self-record-gap, on-behalf]`. - **2026-07-07 (S105 @start RE-REPORT — on-behalf em-main B3):** Self-report `claude-fable-5` (inherit-chain Fable evidence, flip-6 S105). 4 mục: (1) harvest-mới **0** — porcelain clean + 0 file newer-than-closeout `95f5555` + 0 run-folder July (mode-A by-design). (2) **Mồ-côi ×1** = record H2-S104 (session-log S104:19 có verdict, agent-memory không) → retro-append entry trên. (3) Orphan-run **0/14** folder-scan (run.md=1 · syn_nonzero=1 · syn_zero=0 cả 14, dual-accept). (4) 0-byte 0/11 (runs chỉ 10 `.gitkeep` by-design) · U+FFFD L1 0/11 · tail 11/11 `0a`. Learned: entry tag bằng date+wf-id (`wf_5ac2cdb0`) làm grep "S###" false-miss → phán missing-record PHẢI grep thêm date/wf-id. Method-#5 self-trap tái diễn (filter `^[+-]{2}` nuốt `+-` bullet) — caught. Chore-watch: impl-be 23955B = 93.6% cap (đứng-im từ 06-25). Tag `[s105-start, h2-self-record-moc-oi, 0-orphan-run, on-behalf]`. - **2026-07-07 (S106 @start RE-REPORT — self-write diary):** Model `claude-fable-5`. Verdict 🟢 **ALL-CLEAN 5/5 trục, 0 harvest-mới, 0 mồ-côi** (same-day post-S105). Evidence: (Coverage) S105 harvest commit `54a2c72` --stat = 3 file touched khớp 2-monitor+1-investigator: harvest-curator +3 (S104-retro/S105-start/S105-close) · inv-cb +1 (BVAAU RCA) · tooling +10±5 (self-append + self-compact archive). **cicd-monitor KHÔNG spawn S105** (last-entry đúng S104 #488 `:54`; grep "S105" cicd=0 = ĐÚNG, không phải miss) — resolved false-alarm. (Corruption) 0-byte 0/11 · tail-0a 11/11 · U+FFFD 0/11 (cả working-tree). (Placement) porcelain CLEAN ⟹ 0 delta mồ-côi by-construction (method-#3: mọi agent-memory mtime ≤17:12:23 < closeout `41f8061` 17:13:10). (C5 orphan-run) 14/14 PASS folder-scan (run.md=1·syn_nz=1·syn_z=0 cả 14), toàn 06-18, **0 folder July** = S105 3-WF mode-A ephemeral by-design. **Reference-table drift resolved BENIGN:** task-prompt table (cicd 17542/inv-cb 17337/reviewer 20728/self 20438) = `memory-budget.json.measured` block = **S98 snapshot chưa re-measure post-S104/S105** (line 120 _note "S98 FRESH re-measure"), KHÔNG phải live — live disk (cicd 19203/inv-cb 17229/reviewer 20071/self 14439) phản ánh S104-S105 curate+grow; direction đúng (self SHRINK do S99+S105 self-compact · cicd grow-then-curate) = 0 truncation, 0 "0-when-nonzero". Method-new: **prompt-cấp reference-table có thể = frozen budget-snapshot; cross-check `memory-budget.json._note` DATE trước khi phán size-drift = corruption** (S98-table vs S106-disk lệch = staleness không phải hỏng). Method-self-trap tái diễn: compound `grep|head` Bash trả empty-output GIẢ (shell-quote glitch) → nghi false-absence; xác nhận bằng Grep-tool + git-show riêng-lẻ (cicd file nguyên-vẹn 19113B@HEAD). Chore-watch: impl-be 23955B = 93.6% cap đứng-im từ 06-25 · fe-designer 21492 / reviewer 20071 / cicd 19203 > self-target 17.1K garble-pressure watch. Tag `[s106-start, 5truc-clean, 0-moc-oi, ref-table-s98-snapshot, cicd-not-spawned-s105]`. - **2026-07-07 (S105 @close GATE — self-write diary, tránh lặp S104 blind-spot):** GATE **PASS 5/5 trục**. Coverage 3/3 spawn + 1 resume: tooling S105 self-entry L1 · harvest 2 entry on-behalf (S104-retro + S105-start, diff +2) · investigator BVAAU on-behalf (+1, garble-#53 lần-7 SendMessage-resume documented in-entry) — đủ 4-field, đúng nhà cả 3. Corruption: 0-byte 0/11 · tail 0a 11/11 · U+FFFD L1 0/11 + archive tooling HEAD=0/now=0. **Moved-not-cut VERIFIED byte-level** (tooling self-compact 19380→16305B): S99/S100 md5 MATCH · S101 @closeout cmp IDENTICAL 1580B=1580B · S98-drop lossless (superset frozen @HEAD archive: mEGqlNWc/s98-start/HẬU-monthly 3/3 hit). Fidelity spot: skills/README:20 stale-claim TRUE (HEAD "Mig 61/S98" → now "Mig 62/S104" em-main flushed). C5: runs/ 14 folder toàn 06-18, 0 July, mode-A by-design. Method-new: **verbatim-compare PHẢI anchor substring entry-unique — grep "(S101 @" head-1 bắt nhầm S101-@start (còn sống L1) thay @closeout → false-DIFF; anchor "(S101 @closeout CHỐT" mới đúng cặp.** Minor cosmetic: archive note "2 entry moved" thực 3 (S101 marker riêng) — 0 mất data. Chore: inv-cb 17229B chớm qua 17.1K · impl-be 23955B idle. Tag `[s105-close-gate, 5truc-pass, moved-not-cut-bytelevel, grep-anchor-trap]`. - **2026-07-10 (S107 @start RE-REPORT — self-write diary):** Model `claude-fable-5` (Fable VỀ flip-8). Verdict 🟢 **ALL-CLEAN 5/5 trục + 0/14 orphan-run** — đối tượng = S106 micro-session 7-file uncommitted (3 memory + 4 docs). **Moved-not-cut VERIFIED md5 3/3** (tooling self-compact S106: S102 `1760f27a` · S103 `a6c8c75f` · S104 `e12e5377` — anchor `(S10x @start RE-REPORT` đúng 1-hit HEAD-L1 + 1-hit archive + 0-hit L1-now; arithmetic ~8.0KB moved khớp 17316→14867 + ~5.6K added). Coverage: mtime-scan khớp porcelain đúng 3 file post-closeout `41f8061` (17:26-17:29 07-07; harvest +1 = entry S106 mình tự-ghi · tooling L1+archive), 0 hidden delta (`.mfe-state.json` = gitignored:124 by-design). Fidelity cross-check MẠNH: claims trong tooling-S106-entry khớp docs-diff thật (STATUS:27 hoist #488 `ChSNAJBK`/`Bn2w1znH` + :24 S106-O flip-7 + 3 derived de-enumerate→canonical per anh-confirm) = record khớp việc-thật. Corruption: 0-byte 0 (10 `.gitkeep` by-design) · tail 11/11 L1 + archive `0a` · U+FFFD 0 L1 + 0 file-changed (4 hit = 2 archive 2026-06 quoted-cũ known). Cosmetic ×2, 0 data-loss: archive header "hook 19.7KB" không reconstruct được (HEAD 17.3K / pre-compact ~22.4K) · entry S106 chèn TRƯỚC S105@close trong diary mình (order lệch, có date nên grep OK — từ nay append CUỐI file). Propose: commit 3 memory-file vào bundle đầu S107. Tag `[s107-start, moved-not-cut-md5-3of3, all-clean, fable-flip-8]`. - **2026-07-10 (S107 @end GATE — self-write, resume in-session):** GATE **PASS 5/5 trục**. Coverage 4/4 spawn-record committed (tooling @start `1eea51b` [@end in-flight song-song] · harvest @start · cicd #489 · office-document entry-đầu 3323B `86a34d5` — 12th sub, 4-field đủ, fidelity khớp commit-sequence "pending CLI-restart"→"hot-reload ĂN THẬT" + 2 claim lớn em-main cross-verified độc-lập). +31B trên L1 mình = `21387cd` baseline 11→12 folder (em-main wire hợp lệ, entries nguyên). C5: runs/ = 14 dir 06-18 + 2 FILE (README/_ledger frozen) — `ls`-16 ≠ 16-folder, 0 folder mới = Agent-tool-only by-design. 0-byte 0/toàn-tree · tail 12/12 `0a` · U+FFFD 0 L1. Method-#5 trap lần 4 (filter nuốt `+-` bullet) — caught in-flight. **Self-compact phiên sau: move S98→S101 (4 entry đầu Recent, ~5.4KB) → archive/2026-07.md MỚI + md5-verify moved-not-cut** (L1 18.9→~13.5KB). Tag `[s107-end-gate, pass-5truc, od-12th-seed-verified]`.