---
name: agent-return-garble-recover
description: "sub trả text memory-curation thay verdict (#53 return-garble) → recover từ agent-memory, KHÔNG re-spawn"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 67157d21-1ead-475d-9a50-cf7f07468583
  modified: 2026-07-25T18:50:28.119Z
---

Sub-agent đôi khi trả về message CUỐI = text bước memory-curation của nó ("Still 18KB, let me trim...", "Memory updated, splice correct...") THAY VÌ verdict/findings của task (#53 return-channel garble). Nhưng WORK + agent-memory diary VẪN ĐÚNG (nó làm task xong, ghi diary chuẩn, chỉ return nhầm text bước cuối). **Recover: đọc `agent-memory/<role>/MEMORY.md` recent-entry lấy verdict thật — KHÔNG re-spawn** (tốn + có thể garble tiếp; hoặc em-main re-do solo cho task cần chắc). Instruction-fix spawn-prompt "🔴 message CUỐI PHẢI là verdict, KHÔNG phải memory-note" GIẢM garble nhưng KHÔNG 100%.

**Why:** S96 ×3 + **S97 ×3 = ×6 tổng** (cicd-monitor = 5/6 = kẻ tái phạm dai). S96: investigator-codebase 1× + cicd-monitor 2×. **S97: cicd-monitor ×3** (#481 "18.7KB above" + #482 "18.1KB trim S79/S93" + #484 "DATA-SEED-PASS keys merge") — ĐỀU garble text trim-memory **DÙ spawn-prompt explicit "return verdict NOT memory-curation"** → instruction-fix **KHÔNG reliable** (bác claim S96 "lần-3 fixed"); recover verdict từ diary (Run #481 + #482 đủ chi tiết: Mig 60 applied + EF-ternary 200-live + bundle) KHÔNG re-spawn. **🔴 Root-cause structural (mới S97):** cicd-monitor MEMORY.md tự đặt target ~17.1KB, mỗi return CHẠM cap → curate-at-return, và "thinking" bước curate = message CUỐI = return value. Fix bền = **giảm áp lực curate** (archive cicd sớm để return KHÔNG trùng curate-step) HOẶC hook tách verdict-return khỏi memory-step — KHÔNG phải instruction. **Chốt:** recover-from-diary = net ROBUST; instruction "return-verdict" chỉ giảm tần suất (persona memory-curation stochastic — giống AS-10 self-write S95). **+ schema-param KHÔNG chặn return-fail (S97 review-workflow):** 2/4 lane (reviewer+investigator) FAIL StructuredOutput DÙ có `schema` ép-call → return-reliability rộng hơn curate-garble; recover từ diary (reviewer) + em-main tự-cover (grep). → lane QUAN-TRỌNG luôn cần fallback recover-diary/em-main-solo, đừng tin schema chặn được 100%. **+ S103 ×3 = ×9 tổng** (investigator recon + 2 review-lane, DÙ schema+nudge). 🔴 **NEW correlation task-shape (S103):** build-workflow lane NARROW-scoped ("viết script X + return schema") **3/3 CLEAN** vs review-workflow lane OPEN-reasoning ("cố phá + phán-xử") **1/3** → **garble ∝ open-ended-reasoning-task, KHÔNG narrow-build** (cùng schema/nudge/model). Lane-B garble-return NHƯNG full-review Ở DIARY → recover-from-diary hoàn-chỉnh (verdict PASS + 2-CONCERN). → **mitigation = N-lane-redundancy (1 survivor phủ redundant core-concern) + narrow-scoped-schema-lane + em-main-recover-partial** (SE adap-request lên AI_INFRA S103). **+ S105 ×2 = ×11 tổng** (tooling-auditor @bootstrap trả NOTE-DỞ-DANG mid-work + investigator BVAAU trả CÂU MỞ ĐẦU — cả 2 reasoning-lane khớp correlation S103; class RỘNG hơn curate-text: return = wrong-slice-of-transcript bất kỳ, kể cả dòng đầu). 🔴 **NEW recover-path (S105): diary TRỐNG (sub chưa kịp ghi entry cho task đó) → SendMessage-RESUME chính agentId trong-session** (context 150K còn sống) với yêu cầu "nhả verdict theo format, KHÔNG investigate thêm" → verdict đầy đủ chất-lượng-cao lần 2 (investigator BVAAU 3-Q RCA hoàn chỉnh, ~3'). Thứ tự recover: **(1) diary → (2) SendMessage-resume in-session → (3) em-main re-do solo.** **+ S110 ×2 = ×13 tổng** (invest + reviewer — CẢ 2 lane Fable-deep-pass engine-đắt, khớp correlation reasoning-lane; return = 1 câu status giữa-chừng). Cả 2 diary TRỐNG → **SendMessage-resume 2/2 SẠCH → path-2 lifetime 3/3** (S105 + S110×2) — resume re-emit verdict đầy-đủ chất-lượng-cao, 0 investigate lại. Path-2 = default khi diary trống, robust hơn dự đoán. (+monitor-return transcript-LOST khác class: S109 cicd + S110 lượt-sáng 2 monitor — work+diary XONG nhưng return không tới context; disk-diary cứu — WATCH tần suất riêng.) **+ S114 ×5 = ×18 tổng** (review-lane + BE + FE + test + cicd — HMW implement + verify workflow, lead=Opus). 🔴 **NEW class WRITE-lane-garble (S114 quan-trọng):** lane GHI CODE (implementer-backend/frontend/test) garble return → recover KHÔNG từ diary (write-lane không có verdict-diary) mà từ **DISK: `git status`/`git diff` + `dotnet build`/`dotnet test`** ([[feedback_agent_kill_recovery]]). BE-lane 6-file+mig verify-diff-đúng+compile-sạch; FE-lane garble GIỮA mirror → chỉ fe-admin xong (git-status thiếu fe-user) → em-main `cp fe-admin→fe-user` + SHA-verify; test-lane 7-file → `dotnet test` 482 xanh. **Workflow-tool teeth (chốt):** stage-1 `await agent()` TRỰC-TIẾP → 1 garble throw **giết cả workflow** (FE+test stage-2 không chạy); dùng **`parallel()` = thunk-garble→null, workflow SỐNG** → verify-từ-disk bất-kể return. Với WRITE-lane, **return chỉ nice-to-have, DISK = ground-truth**. cicd-lane ×5/6-tổng tái phạm dai → em-main-solo curl-verify (bundle-rotate + byte-verify + smoke). Path recover mở-rộng: **(0) WRITE-lane → disk-truth (git+build+test) → (1) diary → (2) SendMessage-resume → (3) em-main solo.** **+ S118 ×2 = ×20 tổng** (cicd-monitor ×2 — CẢ 2 verify-lane deploy-durability garble return memory-curation ["#388 entry compress prior" + "older stubs archived, tighten longest"], khớp correlation reasoning-lane + cicd tái-phạm dai nhất). 🔴 **VERIFY-lane recover (S118) = READ-lane biến-thể của WRITE-lane disk-truth:** cicd verify-deploy garble → **em-main-solo re-verify từ prod ĐỘC-LẬP** (curl health/401/bundle + `ssh sqlcmd` Serilog/permission-state) → **2 nguồn ĐỘC-LẬP khớp** = verdict chắc. verify-lane garble ≠ mất-việc (verify là READ prod, em tự làm lại được, KHÔNG cần agent). **Serilog log-line = bằng-chứng mạnh nhất** ("Revoked 9"→"Seeded 9 upgraded" 44ms = seeder-thắng-revoke durable, mạnh hơn end-state-DB đơn-thuần). Chốt tổng: WRITE→disk · VERIFY→em-main-re-curl+query · REASONING→diary/resume. **+ S143 ×5 = ×25 tổng** — 🔴 **kỷ-lục 1 phiên: 5/5 sub garble** (reviewer ×2-lần · lead-view · lead-omission · tooling-auditor · harvest-curator), TẤT CẢ đều reasoning-lane, khớp correlation S103. 🔴 **3 data-point MỚI:** **(a) prompt-đúng-từ-đầu KHÔNG chặn được — lần thứ 3 liên tiếp xác nhận:** spawn-prompt của cả 5 vai đã cấm bẫy "trả verdict trước, làm sau" + ép "GHI ĐĨA TRƯỚC, RETURN SAU" NGAY từ lượt đầu ⇒ vẫn 5/5 garble. Thứ **thật sự cứu** = chính câu ép-ghi-đĩa đó: **0 dữ-liệu mất**, mỗi lần garble đều vớt trọn từ `runs/<id>/sub-*.md`. Chống #53 là **thiết-kế artifact**, KHÔNG phải thiết-kế prompt. **(b) recover-path THỨ 4 — resume KHÔNG cứu được diary:** `lead-view-auditor` garble ×2, sau resume nó ghi tiếp sub-file nhưng **KHÔNG ghi diary** (mtime đứng nguyên) ⇒ path-2 (SendMessage-resume) **thất bại ở trục diary** lần đầu ⇒ phải **lead APPEND on-behalf sau VERIFY từ sub-file** (B3, tiền-lệ retro-harvest S132); harvest-curator chấm Fidelity ca này **PASS STRONG 0-fabrication** với 2 nit nhãn-nguồn. ⇒ path đầy-đủ nay: **(0) WRITE→disk · (1) diary · (2) resume · (3) lead-on-behalf-từ-sub-file · (4) em-main solo.** **(c) tally tự nó là bẫy:** lead nâng sổ giữa phiên khi mới 3 sub garble (ghi "×23") rồi 2 sub nữa garble ⇒ số sai ngay trong cùng phiên ⇒ **cập-nhật tally ở CUỐI phiên, đừng giữa phiên**; và sổ này từng đứng yên 8 nhãn phiên (×20 từ S118) trong khi class vẫn fire — chính là ca đẻ ra class `gap-incident-unrecorded` (@S143 owner mở enum). **+ S147 ×3 (product session — tally ×25 S143 + S146 ×3 per-HANDOFF chưa gộp riêng ⇒ ~×31):** `investigator-codebase`(①-attachment) + `reviewer`(②-project-merge) + `cicd-monitor` — cả 3 memory-curation-fragment, khớp correlation reasoning/verify-lane. 🔴 **Data-point MỚI:** cả 3 là **Agent-tool spawn LẺ** (không phải workflow-lane) ⇒ **path-2 SendMessage-resume 3/3 SẠCH** (khác S143 nơi resume fail trục diary của workflow-sub `lead-view`). Giả-thuyết: sub Agent-tool đơn giữ context sống + re-emit trọn khi resume, KHÔNG cần path-4 lead-on-behalf. ⇒ với **sub lẻ**, thứ-tự recover rẻ nhất = **(2) resume-in-session TRƯỚC**, chỉ khi resume fail mới (3) em-main-solo. cicd-lane tái-phạm-dai xác nhận lần nữa (verify-lane) — nhưng em-main-curl độc-lập **2-nguồn-khớp** cross-verify vẫn là backstop chắc nhất cho verdict deploy.

🔴 **+ S148 ×2 và S149 ×2 — GHI SỰ-KIỆN, TALLY CHỐT @CLOSEOUT** (đúng bài học (c) ngay trên: cập-nhật số giữa phiên là tự đẻ số sai; phiên S149 còn workflow 8-lane đang chạy nên chưa đóng băng được). **S148 ×2:** cả `lead-view-auditor` + `lead-omission-auditor` trong vòng H24 force-fire. Phân-hoá đúng bài học S123: lead-view **ghi diary trong lúc làm** ⇒ vớt trọn từ đĩa 0-mất; lead-omission **KHÔNG ghi** (mtime đứng phiên trước) ⇒ phải SendMessage-resume, resume có ghi đĩa rồi mới trả. **S149 ×2:** `h24-audit` (vai KIỂM) garble **CẢ HAI lượt** — lượt-1 return = *"Recording findings so far…"*, lượt-2 sau resume = *"Let me check my own role-diary convention…"*. **CẢ HAI vớt TRỌN** nhờ lead ép ghi-đĩa-trong-lúc-làm ngay từ prompt: file `sub-h24-audit-S149.md` **7,7KB lượt-1 → 25,7KB lượt-2**, đủ §0–§9e, 0 mất dữ-liệu. ⇒ **path-2 (resume) nay có nấc mới: resume CŨNG garble return, nhưng vẫn ghi đĩa đầy đủ** ⇒ khẳng định lại (a): chống #53 = **thiết-kế artifact**, KHÔNG phải thiết-kế prompt — lần thứ 4 liên tiếp xác nhận.
🔴 **BA con số đang trôi, ĐỪNG chép cái nào cho tới closeout** (phát hiện bởi `h24-audit` @S149, evidence `runs/2026-07-24-S148-h24-force-fire/sub-h24-audit-S149.md §7b`): `docs/STATUS.md` narrative ghi **×27** · chính file này ghi **~×31** · tự cộng từ THÂN file ra **25 (qua S143) + 3 (S146) + 3 (S147) + 2 (S148) = 33**, chưa kể S149 ×2. Gốc: thân sổ **ghi sự-kiện mà không cộng vào tổng** ⇒ tổng và thân lệch nhau âm thầm. **Bài: tổng lũy-kế phải DERIVE từ thân, đừng bảo-trì song song** — đây đúng class `gap-incident-unrecorded` mà chính sổ này đẻ ra @S143.

🔴 **TALLY CHỐT @S150 closeout (2026-07-25) — derive-from-body, cộng từng dòng (đúng luật ở trên + lead-gap FLAG-4 @S150):** qua S148 = **33** (25 qua-S143 + 3 S146 + 3 S147 + 2 S148). **S149 +5:** ring2-audit (tên cũ h24-audit) W3 ×2 ("lần 28+29" counter-history) · dong-du-5-vong **L5** kinh-điển (đĩa cứu) · **L7** mất-cả-hai (bù deep-pass) · gate `wf_f4e4c006` **skeleton-ruột-rỗng** (khung 274B, 35 tool-use, **0 append**; return fail + resume fail *"No transcript found"* → path-4 em-main-solo). **S150 +7 — 7/7 first-return của wave closeout-bookend đều garble** (H1 tooling · H2 harvest · lead-stale · lead-gap ×2 [first + resume-diary-step] · ring1 · ring2 — 100% reasoning-lane, khớp correlation S103; resume CLEAN 5/6; **sub-file ghi-trong-lúc-làm cứu 7/7, 0 mất dữ-liệu**). ⇒ **TỔNG = 45 qua S150.** (Số cũ ×27 @STATUS + ~×31 @sổ này = **RETIRED** — sản-phẩm của bảo-trì-song-song, thay hẳn bằng derive.) **Family-incident KHÔNG vào tally:** dong-du **L1 `ngược-#53`** (return ĐỦ mà ĐĨA không — chiều ngược, không phải return-garble).

🔴 **SUB-CLASS MỚI @S150 (2 phản-chứng — tách riêng, KHÔNG nhét vào tally rồi thôi):** ① **`ngược-#53`** — lane KHÔNG ghi file dù bị ép từ prompt (run.md dong-du: *"ép-ghi-khung-rỗng không đảm bảo lane tuân"*); ② **`skeleton-ruột-rỗng`** — lane TẠO file đúng lệnh (274B) nhưng **0 append** = VẬT tồn-tại mà RUỘT rỗng, và path-2 resume cũng chết. ⇒ **Nâng cấp kết-luận (a): ghi-đĩa-trong-lúc-làm = CẦN, KHÔNG ĐỦ** — lead phải **verify BYTE-CONTENT tăng thật** trong lúc wave chạy (không chỉ file tồn-tại); lane quan-trọng giữ N-lane-redundancy + em-main-solo backstop. Theo dõi 2-strike rồi xét error-ledger row (NEXT-em @S150).

🔴 **TALLY CHỐT @S151 closeout (2026-07-25) — derive-from-body:** 45 (qua S150) **+ 5 S151 = 50**. S151 ×5 first-return garble, TẤT CẢ ở wave bookend @open + KIỂM (lead-stale · lead-gap · ring2 · tooling-H1 · ring1 — 100% reasoning-lane; H2 harvest CLEAN 1/6). Chữ ký đồng nhất: **cả 5 chết đúng write-boundary** ("làm xong → bắt đầu ghi/return" — ring2 "Writing the full audit to disk now" rồi tắt; ring1 "All verification done. Writing…" rồi tắt). Recover: resume-in-session **5/5 SẠCH** (path-2 sub-lẻ giữ form S147 3/3 → nay 8/8 lifetime). 🔴 **Sub-class `skeleton-ruột-rỗng` TÁI-HIỆN = 2-STRIKE MET** (S150 gate wf_f4e4c006 → S151 ×2 THUẦN: sub-lead-stale 12-dòng header-only + sub-lead-gap checklist-`[ ]`-only lúc chết, dù prompt ép ghi-đĩa NGAY từ đầu) → **error-ledger row AS-17 + guard promote @S151** (verify BYTE-CONTENT tăng thật trong wave, phân biệt skeleton vs đang-viết-dở phải ĐỌC RUỘT — H2 m#19: size nhỏ = nghi-vấn không phải bằng-chứng). 🔴 **Counter-correlation MỚI (S151):** trio harness-{eval,refine,audit} **3/3 CLEAN** cùng phiên — cả 3 là return-only contract KHÔNG ghi đĩa giữa chừng (eval 21 tool-use vẫn clean) ⇒ garble KHÔNG tương quan "có ghi đĩa hay không", vẫn đúng correlation reasoning-lane S103 nhưng thêm chiều: **return-only + thân-return-CÓ-CẤU-TRÚC-định-sẵn (khuôn VERDICT dòng-1 + section cứng) sống sót tốt hơn return tự-do sau khi ghi files**. n=3 chưa đủ kết luận — theo dõi.

🔴 **ERRATA nguồn-ngoài @S152:** commit-subject `1b85713` (S151-closeout) ghi tally "**53**" = **SAI** — số đúng @S151 là **50** (derive-from-body; ring2 M-1 @S152 bắt bằng phép cộng độc-lập 33+5+7+5 trên 4 bề-mặt). Commit-subject bất-biến sau push ⇒ errata ghi ở đây thay sửa; mọi trích-dẫn lấy số từ SỔ NÀY, không từ subject.

🔴 **TALLY CHỐT @S152 closeout (2026-07-26) — derive-from-body, đếm CÁI-CHẮC:** 50 (qua S151) **+ 10 S152 = 60 (cận dưới)**. S152 events: **@open 7** = 6/6 first-return wave bookend (lead-stale · lead-gap · tooling · harvest · ring2 · ring1 — 100% reasoning-lane, ghi tại `bookend-synthesis.md` cùng phiên) + ring2-resume vẫn mô-tả-ý-định; **@close 3-CHẮC** = stale-close completion-slice + gap-close first-return-mid-work + ring1-close return-slice. **KHÔNG đếm (khai thẳng):** harvest-close + tooling-close hoàn thành TRƯỚC compaction lead — nhãn return không còn khôi phục được ⇒ UNKNOWN, không bịa (file đĩa 20.411B/26.451B đủ, 0 mất). **CLEAN counter-datum:** trio 3/3 + **ring2-close khuôn STRICT-4-dòng** — 4 lượt return-only/khuôn-cứng CLEAN trong chính phiên 10-garble ⇒ củng cố chiều S151: **thân-return-có-cấu-trúc sống sót; return tự-do sau khi ghi file thì không**. **Family (ngoài tally):** `ngược-#53` ×2 cùng phiên (ring1 resume-1 @open chạy-không-ghi · gap-close 0B @close) — sub-class này nay 3 events lifetime (S150 + S152 ×2), đã có AS-17 guard; countermeasure hiệu-lực = lệnh resume "**đổ-ruột-TRƯỚC-làm-tiếp**" (2/2 lần cứu trọn). **Mới @S152 (ring2 4-A):** kỷ-luật ghi-đĩa-từng-finding có TÁC-DỤNG-PHỤ — file luôn hợp-lệ giữa chừng ⇒ lead PIN bản-cắt 16.911B/30.195B mà không thấy dấu cụt ⇒ 3 FLAG ngoài tầm quyết-định (tally thoát nhờ may) ⇒ đề-xuất dòng chốt `<!-- END … TOTAL=n -->` + lead chỉ nhận pin khi grep-count == TOTAL (chờ owner).

**How to apply:** sub return text lạ (memory-curation/off-topic) → ĐỪNG tin nó fail/vô-dụng; đọc diary lấy kết-quả. Task-cần-chắc (bug-reasoning) → em-main re-do solo (reliable). Liên [[feedback_agent_kill_recovery]] · [[feedback_workflow_fanout_reliability]].
