{"slug": "the-hard-part-of-agent-memory-isn-t-remembering-it-s-forgetting", "title": "The hard part of agent memory isn't remembering — it's forgetting", "summary": "A developer building long-lived agents found that the main failure mode is not forgetting but remembering too much, where junk drowns out signal. The solution is a memory system based on Markdown files with a promotion step that curates facts into long-term memory only if they will still matter in a month, and removes entries only when superseded by newer facts. This approach keeps memory small and clean, making retrieval simple and auditable.", "body_md": "Everyone building agents obsesses over recall: vector stores, embeddings, RAG pipelines, bigger context windows. But after running a few long-lived agents in production, the failure mode that actually bit me wasn't \"it forgot something.\" It was the opposite — **it remembered too much, and the junk drowned the signal.**\n\nAn agent that never forgets isn't wise. It's a hoarder. Every stale decision, every superseded fact, every one-off detail from three weeks ago sits in its memory with equal weight, and the quality of its answers quietly degrades. The interesting engineering problem isn't *storage*. It's *forgetting on purpose*.\n\nHere's the policy I converged on. No framework — just plain Markdown files and a few rules the agent applies to itself.\n\nSay you log everything an agent learns into one growing store. Two things happen:\n\nAdding retrieval sophistication on top of a polluted store just lets you find the wrong thing faster. The fix is upstream: control what earns a place in long-term memory at all.\n\nI split memory by lifespan, and the split is what makes forgetting cheap and safe.\n\n`memory/2026-06-22.md`\n\n): append-only, lossy, never edited. This is the firehose — everything that happened today. It's allowed to be noisy because nobody reads it directly for long. Old daily notes age out naturally; they're the compost.`MEMORY.md`\n\n): curated, small, deliberately gardened. Nothing lands here automatically. A fact has to be The whole trick is the promotion step between them.\n\nOn idle cycles, the agent re-reads recent daily notes and asks one question of each candidate fact: **will this still matter in a month?**\n\nThat last case is the important one. Promotion isn't just copying — it's **reconciliation**. A new durable fact that contradicts an old one overwrites it. This is how you stop the Monday/Friday Postgres problem at the source.\n\nA practical heuristic I encode in the rules: if a fact is about *identity, preference, or a decision*, it's a promotion candidate. If it's about *current state* (\"right now\", \"today\", \"this ticket\"), it stays transient and is allowed to die.\n\nThe mirror image of promotion is removal, and here the instinct most people have is wrong. When you do prune long-term memory, **decay by relevance, not by volume.** Don't cap `MEMORY.md`\n\nat N lines and evict the oldest — age is a terrible proxy for value. \"User's name is Sam,\" learned on day one, should outlive a hundred newer-but-trivial facts.\n\nInstead, remove a long-term entry only when it's been *contradicted* or *rendered obsolete* by a newer promotion. Supersession, not a size limit. The store stays small because promotion is strict on the way in — not because you're knocking things out the back to make room.\n\n(If you ever build a graph layer on top of this, the same principle holds: decay by hops from still-relevant nodes, not by a global age threshold. A fact connected to live context stays warm even if it's old.)\n\nOnce long-term memory is small and clean, retrieval gets boring in the best way. You don't dump the whole store into context every turn. You load a one-line *index* of what's known, and before answering anything about prior work or preferences, you fetch only the relevant entries. Small curated store + on-demand fetch beats giant store + fuzzy search for a single agent, every time.\n\nYou can audit all of this in a text editor. Want to know why the agent thinks you use SQLite? `grep`\n\n. Want to watch its understanding evolve? It's a git diff. A vector DB is a black box you query; a Markdown memory is a mind you can read. For a large external corpus, embed away — but the agent's *own* identity and curated knowledge benefit far more from being legible than from being vectorized.\n\nMost \"my agent has no memory\" complaints are really \"my agent has no *curation*.\" Storage is solved. Retrieval is solved. The unsexy, human part — deciding what's worth keeping, reconciling contradictions, letting the rest decay — is where the actual intelligence lives. It's the same discipline a person uses keeping a journal: write everything down raw, then periodically distill the few things that matter and let the rest fade.\n\nI packaged this whole approach — the file layout, the promotion/pruning rules written out as instructions an agent applies to itself, and a fully worked example agent with all the memory layers filled in so you can see a gardened mind rather than empty templates — as a drop-in kit. If you'd rather copy a working setup than derive the policy yourself: ** AI Soul Kit** (Core ¥980 / Plus ¥3,800).\n\nBut the policy above is the part that matters. Steal it.", "url": "https://wpnews.pro/news/the-hard-part-of-agent-memory-isn-t-remembering-it-s-forgetting", "canonical_source": "https://dev.to/01_a125211d8c3da3fdcfd/the-hard-part-of-agent-memory-isnt-remembering-its-forgetting-ai3", "published_at": "2026-06-22 03:03:38+00:00", "updated_at": "2026-06-22 03:40:16.356715+00:00", "lang": "en", "topics": ["ai-agents", "large-language-models", "developer-tools"], "entities": ["Markdown", "SQLite", "Postgres", "RAG", "vector store"], "alternates": {"html": "https://wpnews.pro/news/the-hard-part-of-agent-memory-isn-t-remembering-it-s-forgetting", "markdown": "https://wpnews.pro/news/the-hard-part-of-agent-memory-isn-t-remembering-it-s-forgetting.md", "text": "https://wpnews.pro/news/the-hard-part-of-agent-memory-isn-t-remembering-it-s-forgetting.txt", "jsonld": "https://wpnews.pro/news/the-hard-part-of-agent-memory-isn-t-remembering-it-s-forgetting.jsonld"}}