Files
solution-erp/.claude/agent-memory/harvest-curator/MEMORY.md
pqhuy1987 a1e2416f37
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m35s
[CLAUDE] Docs: S143 closeout — §L.a E-012/AS-16 + vá 4 drift H1 + harvest GATE-PASS-5
§L.a RCA:
- E-012 + AS-16 NEW "bằng-chứng-tự-huỷ-sau-squash": outward artifact cite sha
  chưa-push / stamp trước khi git status sạch. Root = tiêu-chí verify chọn theo
  cái MÌNH đo được, không theo cái NGƯỜI NHẬN sẽ đo (cùng lớp E-010).
  Đối chứng: wave trước cite commit đích -> sống hết.

§L.b:
- (c) memory-triple: do exit 0 · de-xuat A7 251/251 · kiem reviewer FAIL 1C/4M/4m/1nit
  · do-record TOTAL 47 + nhip-no 4-vế. sleep-check 4d < 7d -> không INFORM.
- (d)(f) harvest-curator GATE-PASS-5, 5-trục PASS, Fidelity on-behalf PASS STRONG
  0-fabrication, C5 dạng-1 đủ, orphan 0/40, Sàn-5 khớp. Spawn-record 5 sub.
- (g) tooling-auditor DRIFT-FOUND(4) -> vá hết: F-A doc "3-vế" vs script 4-vế
  (7 site prescriptive; giữ 15 file frozen) · F-B ghost-enum HIGH (mở enum 10->11
  mà quên chính vai dùng nó + 2 site số) · F-C lead-model pin chưa ghi sổ
  (thêm dòng Lead row S143; cell canonical để owner quyết) · F-D marketplace.
- (j) H24: class_repeat cập theo 2 vai · last_audit light/deep = 17 · history +S143
  (khai rõ force-fire SỚM 1 nhịp theo lệnh owner, KHÔNG tới-hạn tự-nhiên).
- (k) trio SKIP có vết (cần restart CLI) -> ghi CẢ session-log vì §6.4 reset WAL.

Sửa-một-phía bắt được 4 lần trong phiên (tool-grant · enum · sổ đếm garble · _note
counter) -> bài: đổi một con số thì grep con số đó repo-wide trước khi đóng.

#53: 5/5 sub garble, 0 mất dữ-liệu nhờ ghi-đĩa. Tally ×20 -> ×25, +path-4
lead-on-behalf khi resume không cứu được diary.

Test 528 kế-thừa (0 file src/fe/tests bị đụng, verify bằng diff). Bundle FROZEN.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 14:05:48 +07:00

54 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/<role>/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/<run-id>/` 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``*-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.
11. **Đếm role-dir từ path-field DÍNH file root-level:** `git ls-files .claude/agent-memory/ | cut -d/ -f3 | sort -u` nuốt `memory-budget.json` + `.mfe-state.json` → ra 14 thay 12 (tự-bắt S123). Guard: `awk -F/ 'NF>3{print $3}'` hoặc `find -mindepth 1 -maxdepth 1 -type d`.
12. **Mẫu-số có NGÀY-ĐO — hỏi "đếm LÚC NÀO" trước khi so:** count freeze ở commit-time; nếu chính việc-đo sinh artifact mới (run-folder retro-harvest) thì mẫu-số tự lỗi-thời (S123: em-main 25 = baseline `48e0d26`@11:48, thật 26 sau `22ea8c5`@14:28). Verdict khớp ≠ mẫu-số khớp.
13. **git MÙ thư-mục RỖNG** → empty-dir residue (stray cwd-relative `<runfolder>/.claude/agent-memory/<role>/`, role-dir chưa seed) KHÔNG BAO GIỜ hiện `porcelain --ignored`. Quét bằng `find .claude -type d -empty`, đừng tin git.
## 📅 Recent activity (FIFO — older → `archive/`)
> **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.
> **S98→S101 (4 entry) verbatim → `archive/2026-07.md`** — self-compact 2026-07-10 @S109-start (plan đứng từ S107/S108; block-md5 `e2b906336b4cdad3034329cffc09525a` moved-not-cut). Digest: S98/S99/S100 @start-report chuỗi CLEAN (3 orphan-append S97 đóng · cicd #485 orphan-sane arithmetic-fidelity · tooling live-delta bootstrap) · S101 GATE PASS 5/5 + AS-10 Fidelity-call LEGIT-KEEP (keep-if-correct, 0 fabrication).
> **S102→S106 (5 entry) verbatim → `archive/2026-07.md`** — self-compact 2026-07-12 @S111-start HOOK-directed (plan ĐỨNG từ S107/S108/S110; mở-rộng +S106 để đạt <17.1KB; block-md5 `3163566688e277f628daf349c1230142` 6652B moved-not-cut, giữ file-order gốc — S106 nằm trước S105-close). Digest: S102 CATCH ×2 (reviewer cut-not-moved f229b07 → recover + dead-satellite pointer) · S104-retro self-record blind-spot gate-agent · S105 @start mồ-côi-×1-đóng / @close moved-not-cut byte-level tooling 19380→16305 · S106 ref-table = S98-snapshot benign + cicd-not-spawned-S105 resolved-false-alarm.
> **S107→S109 (5 entry) verbatim → `archive/2026-07.md`** — self-compact 2026-07-12 @S113-end HOOK-directed (plan ĐỨNG từ S107-end/S108; +S109 đạt <17.1KB; block-md5 `75b69b41534cb67cdf349b6e1164d47f` 5623B moved-not-cut, file-order verbatim). Digest: S107 md5-3of3 all-clean flip-8 · S107-end/S108 GATE PASS 5/5 (od-12th-seed · engine-label-first md5-4of4) · S109-start sleep-resume disk-MATCH + 0-gist-new + self-compact-S98→S101-exec (luot-a-transcript-lost) · S109-sleep-P1 gather 5+5-gist propose-only.
> **S110→S111 (4 entry) verbatim → `archive/2026-07.md`** — self-compact 2026-07-13 @S116-end HOOK-directed (SELF 20KB>read-limit; plan ĐỨNG từ S114-start; block-md5 `640f80e452b42badb12bc2a3c57cf9f7` 6638B moved-not-cut, file-order verbatim, anchor 4×{L1=0·AR=1}). Digest: S110-start rerun-DEDUP luot-sang-transcript-lost (gist byte-exact `cat-file`==disk) · S110-end GATE PASS 5/5 close-gate-15of15 garble-x2-recovered + FFFD-baseline-1-selfquote seed · S111-start self-compact-S102→S106-EXECUTED + gist-frozen-x2 · S111-end GATE PASS 5/5 close-gate-0of16 h22-first-subtask-runtrace + `--stat`-truncate-trap.
> **S113 ×2 entry (start+end) verbatim → `archive/2026-07.md`** — self-compact 2026-07-14 @S118-start (plan ĐỨNG từ S117-end soft-due; block-md5 `0c782c7cebc8f1d8b16f65b8e1474820` 4064B moved-not-cut, file-order verbatim, anchor 2×{L1=0·AR=1}). Digest: S113-start MOSTLY-CLEAN 0-orphan/20 + 2-coverage-gap propose (impl-be thiếu Supplier-BE · test-spec thiếu narrative; embedded-synth pattern mới · maxdepth-1 false-flag lesson) · S113-end GATE PASS 5/5 0/21 (2-gap CLOSED idempotent · wal-flush-landing 6-diary · Fidelity `5fa11b5` file-list exact · nit journal-jsonl dead-pointer + backfill-22-vs-37).
> **S114/S116/S117 (3 entry) verbatim → `archive/2026-07.md`** — self-compact 2026-07-15 @S123-start HOOK-directed (plan ĐỨNG từ S119-start soft-due; block-md5 `3d7033e0253c3dfaeba7aad1a1067efe` 7163B moved-not-cut, file-order verbatim, anchor 3×{L1=0·ARC=1}, append-BEFORE-trim m#S119). Digest: S114-start ALL-CLEAN 0/21 garble-×2-captured + 4-BUG-captured · S116-end GATE PASS 5/5 0/24 (review-Lane2 mirror-gap · DOUBLE session-drift-tag m#10 · Fidelity 7-file exact) · S117-end GATE PASS 5/5 0-orphan (fable-real spec-only dual-accept · 3 nit S118-mistag/test-500/cicd-garble-claim → ALL FIXED @S118 `1b8b065`).
- **2026-07-17 (S132 DỒN S127→S131 — re-spawn sau session-limit-death S131 [E-011]; by em-main VERIFY→APPEND):** GAPS-FOUND→**CLOSED-in-session**. Coverage PASS **31 run.md/33 dirs** (2 = spec-only S117 by-design; interim "26" = S123-baseline stale) · **0-orphan/31** · 2 folder mới S127+S129 flat dạng-1 đủ · roster-harvest đủ (reviewer S127/S128×2/S129/S131×2 · inv-cb S128/S129 · cicd S128/S129; wave-workers generic = no-diary by-design; S130 em-main-solo 0-spawn = không nợ). Fidelity STRONG (entries tự-flag overclaim mình) · Corruption PASS (FFFD 0/3 · porcelain agent-memory 0 mồ-côi; inv-cb "<22>24.1KB" = m#6 tail-cut artifact tự-bắt). Placement FLAG ×2 (git-invisible m#13): 2 dirs H24 RỖNG since-S123 + stray S119 → em-main CLOSED cùng phiên (seed 2 diary retro từ `sub-lead-{view,omission}.md` 8379B/9967B + rmdir stray 3-dir-rỗng). Lesson: (1) folder S127 chứa subs tag S128 = **trigger-session naming**, KHÔNG gap; (2) `sort -u -k2` collapse entry cùng-pattern = measurement-artifact — targeted-grep recover; (3) H24 knowledge sống CHỈ ở run-folder+counter-json ⇒ **per-ROLE diary = lớp không ai sở-hữu** tới khi seed (E-011/GAP-3).
> **S118 (start+end) + S119-start (3 entry) verbatim → `archive/2026-07.md`** — self-compact 2026-07-16 @S125-start HOOK-directed (SELF 22.5KB>read-limit; block-md5 `9f7a11dcd057a27d03b06843bbdf2274` 6252B moved-not-cut, file-order verbatim, anchor 3×{L1=0·ARC=1}). Digest: S118-start ALL-CLEAN 0/26 (3nit-S117-fixed `1b8b065` · FFFD-baseline 1→0 self-quote-left-L1) · S118-end GATE PASS 5/5 0-orphan-no-runtrace (cicd-garble-×2-return-label-nit em-main-FIXED) · S119-start ALL-CLEAN 0/26 77/77-tracked + LIVE mid-flight catch (sibling append-BEFORE-trim=safe-order · m#5 archive-diff-grep-swallow self-caught).
> **S123→S125 (2 entry @start RE-REPORT) verbatim → `archive/2026-07.md`** — self-compact 2026-07-18 @S140-gate HOOK-directed (SELF 19.7KB>17.1 read-limit; block-md5 `cbcd17aba6461d57a5fbb34e9be0e301` 7427B moved-not-cut byte-identical, file-order verbatim, anchor 2×{L1=0·ARC=1}). Digest: S123 @start MOSTLY-CLEAN 0-orphan/26 (m#12 mẫu-số-25-vs-26 · dạng-3 dead-code · doc-stale-at-birth pe-neg-quote · reviewer-coverage-gap-5spawn · 2 H24-dir-no-seed + stray-S54 → ALL CLOSED @S132) · S125 @start FLAGS 0-orphan/27 (2 H24-firstrun-no-diary HIGH · stray-S54-still → CLOSED @S132). m#12/#13 preserved in Methods §⭐.
- **S126 (2026-07-16) session-end GATE [opus-worker, em-main VERIFY+APPEND]:** **PASS 5/5 trục** · orphan **0/29** run.md-folder (2 folder phiên này: S125→`spec-execution-synthesis.md` dạng-1 · S126→2 synthesis dạng-1) · Sàn-5 **0 lệch** (S126 born-in-session có `run=` marker session-log; S125 first-commit 13:29:43 = 77s PRE-session → ngoài scope birth-criterion) · corruption 0 (U+FFFD 0/4 + iconv VALID 4/4) · moved-not-cut 2 archive `@S126 hook-curate batch` VERIFIED khớp digest-pointer L1. Learned: grep `Ã|ư|â€` = **FALSE-POSITIVE generator trên VN UTF-8** (m#6 pattern MỚI — byte ư/ơ trùng-prefix + literal "mojibake" trong RCA-quote = m#9 self-quote); signal THẬT = U+FFFD-count + iconv round-trip. Coverage khi `wf_*` transcript KHÔNG git-tracked = **triangulation 3-nguồn** (session-log[wf+timing] ⋂ synthesis[cite-jsonl per-lane] ⋂ harvest-entry[name lane]). Surprise: Sàn-5 marker phải grep SESSION-LOG (`run=` prefix) KHÔNG phải WAL (path-form cite — 2 doc khác convention). Tag `[s126-end, gate-pass-5truc, 0orphan29, san5-0lech, m6-new-pattern-vn-utf8]`.
- **S140 (2026-07-18) session-end GATE [opus-worker, self-write diary lượt-GATE — KHÁC lượt GATHER 0-ghi]:** **GATE PASS 5/5** · **8/8 invocation có vết** = reviewer 1-spawn/3-task (S140 fidelity-gate + S140b outward-gate; probe-5-nhãn 17s agentId `a56dcf6d` folded Vòng5 + cross-ref lead-view:15) · lead-view S140 1-FLAG-LOW `view-stale-status` · lead-omission S140 1-FLAG-MED `gap-owner-specifics`+2-INFORM+META (**S137-backfill CLOSED in-session** = GAP-3 tự-vá) · harvest ×5 GATHER → 5 gist committed `aa88d01` (5 file .gist.md verify-exist). **Coverage PASS** · Completeness 4-field đủ · **Placement PASS** (0 stray-S54 · 0 empty-dir m#13 · 0 role-thiếu-MEMORY · porcelain agent-memory 0 mồ-côi — S119-stray+2 H24-dir đã seed/rmdir từ S132, KHÔNG tái). **Corruption PASS** (FFFD 0/4 diary+archive · iconv VALID 3/3 · reviewer curate **moved-not-cut** S139+S134b verbatim `archive:81-82` + BATCH-marker`:79`; em-main +7/0, tao verify 2-entry-verbatim). **Fidelity STRONG:** reviewer FIDELITY-FAIL inv-cb (2 recon-cluster `:28`/`:31` + AREA-2 anchor DROPPED, "Drop-thấp:0"=claim FALSIFIABLE-FALSE) → **re-distill LANDED verbatim** `## CỤM 11 [BỔ SUNG Fidelity-gate S140]` + honest-disclose "'0 drop' chỉ đúng từ bản này" ⇒ **FAIL→fix loop CLOSED traceable** (KHÁC propose-suông); lead-view/omission FLAG khớp `.session-counter.json _note` S140 EXACT. **Close-gate C5:** 0 run-folder SINH S140 (toàn Agent-tool mode-A ephemeral, latest=S138) ⇒ Sàn-5 0-marker-cần vacuous PASS · orphan-scan DUAL-ACCEPT **0/37**. GỘP 5-GATHER: đọc 5 verbatim→5 gist propose-only (≈183KB→69KB FROZEN), 4-PASS+1-FAIL(inv-cb)→re-distill +CUM11, 0-ghi by-design (prompt cấm cả diary). Chore: SELF 19.3KB>17.1 target → self-compact S123/S125/S126-block due (defer — no cut-mid-gate). Learned: FIDELITY-gate có RĂNG khi bắt "Drop-thấp:0" falsifiable + đòi re-distill verbatim đóng loop, KHÁC gate tick-nhị-phân; moved-not-cut chèn-TRƯỚC-stub same-source-string = byte-id by-construction. Surprise: cùng phiên FAIL→fix LANDED trọn (gist committed CÓ CỤM11 :28/:31) = harvest-integrity self-healing trong-phiên, hiếm. Tag `[s140-gate, gate-pass-5truc, 8of8-invocation, inv-cb-fidelity-fail-redistill-closed, s137-meta-backfill-closed, 0runfolder-modeA, orphan-0of37, moved-not-cut-verified]`
- **S143 (2026-07-22) session-end GATE `[opus-worker · #53 GARBLE lượt-1 → resume; em-main VERIFY+APPEND on-behalf]`** — **VERDICT GATE-PASS-5.** Phiên `/tiep` nối S142, owner gật 2 lượt, 5 sub spawn. **5-trục:** Coverage PASS (5/5 invocation có vết — brief nói 3 lane, đĩa có thêm `sub-tooling-4` + của tao ⇒ **đếm từ ĐĨA, đừng đếm từ brief**) · Completeness PASS · Placement PASS (`porcelain agent-memory`=0, 0 empty-dir) · Corruption PASS (U+FFFD 0/3 · iconv 3/3 · **moved-not-cut 16/16 byte-identical**) · **Fidelity PASS STRONG 0-fabrication**. C5 DUAL-ACCEPT: dạng-1 phẳng `audit-synthesis.md` 6717B ⇒ ĐỦ; orphan repo-wide **0/40**. Sàn-5 độc-lập: WAL=0 · session-log=1 ⇒ **KHỚP** (marker sống ở SỔ CÁI, không ở WAL — đúng thiết-kế). 🔴 **Ca FIDELITY on-behalf lần đầu chấm sâu:** `lead-view-auditor` garble ×2 ⇒ diary do LEAD ghi thay; tao đối-chiếu **từng mệnh-đề** vs `sub-lead-view-1.md` ⇒ 7 KHỚP · 1 TƯƠNG-ĐƯƠNG(paraphrase) · 3 BEYOND-SOURCE **nhưng truy được về đĩa** (lane khác cùng run-folder / commit thật) + quy-thuộc minh-bạch ("reviewer bắt") + tự-khai on-behalf ở đầu entry ⇒ **KHÔNG bịa**. **Bài:** beyond-source ≠ fabrication — tiêu-chí là *truy được về đĩa nào* + *có khai nguồn không*. **3 FLAG propose:** F1 MED counter-claim-vs-đĩa (diary khai `class_repeat` đã đổi mà `.session-counter.json` chưa — lead vá trong closeout) · F2 LOW stray git-MÙ `broadcasts/.claude/...` rỗng untracked lọt 2 closeout (lớp S54, `porcelain --ignored` IM với dir rỗng) · F3 MED **index nâng ×23 mà topic-file vẫn ×20** = sửa-một-phía (lead vá → ×25). **2 method mới:** **m#14** — chính tao dính bẫy m#5: `grep -v "^[+-][+-]"` **nuốt** dòng `+- [Title](…)` ⇒ suýt kết "diff rỗng"; đúng = `grep "^[+-]" | grep -v "^+++\|^---"`. **m#15** — moved-not-cut phải tách **dòng-nội-dung** vs **stub-trỏ-archive**, không tách ⇒ dương-giả "cut-not-moved" 4/20. Tag `[s143, gate-pass-5, fidelity-on-behalf-strong, beyond-source-≠-fabrication, dem-tu-dia-khong-tu-brief, m14-diff-filter, m15-stub-vs-content, san5-so-cai]`