<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: gregor</title>
    <description>The latest articles on DEV Community by gregor (@plur9).</description>
    <link>https://dev.to/plur9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3849560%2Fba4d90a4-9ae4-4131-a919-4af0f270ba30.png</url>
      <title>DEV Community: gregor</title>
      <link>https://dev.to/plur9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/plur9"/>
    <language>en</language>
    <item>
      <title>What's the Difference Between Open Engrams and Model-Native Memory?</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Sat, 29 Aug 2026 06:11:58 +0000</pubDate>
      <link>https://dev.to/plur9/whats-the-difference-between-open-engrams-and-model-native-memory-3c95</link>
      <guid>https://dev.to/plur9/whats-the-difference-between-open-engrams-and-model-native-memory-3c95</guid>
      <description>&lt;h1&gt;
  
  
  What's the Difference Between Open Engrams and Model-Native Memory?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Model-native memory is locked to the vendor that created it. Open engrams are a portable, developer-controlled memory format that any model in your stack can read.&lt;/strong&gt; ChatGPT, Claude, and Gemini each have their own built-in memory systems — useful within their own interfaces, but siloed: what ChatGPT learns about you never reaches Claude, and vice versa. Open engrams (the format used by PLUR) are structured memory units stored locally in a format you own, so any model, tool, or agent workflow can read and write the same memory store without crossing a vendor boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Your Memory Is Fragmented Across Vendors
&lt;/h2&gt;

&lt;p&gt;If you use multiple AI tools — and most developers do — your context is split across closed silos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT Memory&lt;/strong&gt; stores up to ~1,500 words of extracted facts tied to your OpenAI account. When you open Claude or Cursor to continue the same project, it knows nothing about you (&lt;a href="https://www.anuma.ai/blog/chatgpt-memory" rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini's memory&lt;/strong&gt; doesn't sync to ChatGPT or Claude (&lt;a href="https://plurality.network/blogs/gemini-memory-limitations/" rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude's memory&lt;/strong&gt; for managed agents is in public beta — cross-session recall within Claude, not portable outside it (&lt;a href="https://platform.claude.com/docs/en/managed-agents/memory" rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a structural problem: every vendor solves memory for their own surface, not for your workflow. When you run a multi-agent pipeline that touches Claude Code, a Hermes agent, and a custom CLI tool, there is no shared memory layer unless you build one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Model-Native Memory?
&lt;/h2&gt;

&lt;p&gt;Model-native memory is memory managed and controlled by the model vendor:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Typical model-native memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage location&lt;/td&gt;
&lt;td&gt;Vendor cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who controls what's stored&lt;/td&gt;
&lt;td&gt;The model (implicit extraction)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portability&lt;/td&gt;
&lt;td&gt;Locked to one vendor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditability&lt;/td&gt;
&lt;td&gt;Limited — you can view some, rarely edit raw data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API access&lt;/td&gt;
&lt;td&gt;Proprietary or none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works across models&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ChatGPT Memory uses implicit extraction: the model decides what to save from your conversations. You can view and delete memories, but you can't query them programmatically or export them to another tool in a structured format (&lt;a href="https://konshus.ai/chatgpt-memory-limits" rel="noopener noreferrer"&gt;source&lt;/a&gt;). Claude's managed-agent memory is similar: optimized for recall within Claude, not designed to be read by a Cursor plugin or a Python script.&lt;/p&gt;

&lt;p&gt;This is appropriate for consumer chat use cases. It is not appropriate for agent workflows where memory needs to cross tool and model boundaries.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Open Engrams?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;engram&lt;/strong&gt; is a single, structured unit of memory: a statement, a type, a confidence score, and metadata — stored in a format you own.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Use snake_case for all database column names in this project."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"architectural"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"conventions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The open engram format (used by &lt;a href="https://plur.ai" rel="noopener noreferrer"&gt;PLUR&lt;/a&gt;) is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Open engrams&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage location&lt;/td&gt;
&lt;td&gt;Local SQLite on your machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who controls what's stored&lt;/td&gt;
&lt;td&gt;You or your agent, explicitly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portability&lt;/td&gt;
&lt;td&gt;Any MCP-compatible model or tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditability&lt;/td&gt;
&lt;td&gt;Full — inspect, edit, or delete any engram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API access&lt;/td&gt;
&lt;td&gt;MCP tools: &lt;code&gt;plur_learn&lt;/code&gt;, &lt;code&gt;plur_recall&lt;/code&gt;, &lt;code&gt;plur_recall_hybrid&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works across models&lt;/td&gt;
&lt;td&gt;Yes — Claude, Cursor, Hermes, custom agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Because engrams are stored in a local SQLite file and accessed via the Model Context Protocol, any model in your stack can read the same memory. Claude Code, a Hermes agent, and a custom Python script all see the same engram store.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Model-native memory&lt;/th&gt;
&lt;th&gt;Open engrams (PLUR)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Portability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vendor-locked&lt;/td&gt;
&lt;td&gt;Any MCP client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transparency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Opaque synthesis&lt;/td&gt;
&lt;td&gt;Every engram readable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implicit background extraction&lt;/td&gt;
&lt;td&gt;Explicit, developer-driven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auditability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;View + delete (limited)&lt;/td&gt;
&lt;td&gt;Full CRUD on every record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Staleness handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Contradictions accumulate silently&lt;/td&gt;
&lt;td&gt;Confidence decay + retirement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vendor cloud&lt;/td&gt;
&lt;td&gt;Local-first, you own the data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Works for agent workflows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Designed for it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  They Do Different Jobs — Use Both
&lt;/h2&gt;

&lt;p&gt;Model-native memory and open engrams are not in competition. They target different jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model-native memory&lt;/strong&gt; is best for &lt;strong&gt;conversational continuity&lt;/strong&gt; within one vendor's surface — remembering your name, your preferences for that product, the last project you discussed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open engrams&lt;/strong&gt; are best for &lt;strong&gt;programmable, portable recall&lt;/strong&gt; across agent workflows — conventions, corrections, project context, facts that need to survive across models, tools, and sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question to ask is: &lt;em&gt;who needs to read this memory?&lt;/em&gt; If the answer is "just ChatGPT," model-native memory is fine. If the answer is "my Claude Code session, my Hermes agent, and my custom script," you need open engrams.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;PLUR is an open-source memory layer that implements the open engram format. Install the MCP server and your memory is instantly available to any MCP-compatible client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @plur-ai/mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After setup, call &lt;code&gt;plur_learn&lt;/code&gt; to write an engram and &lt;code&gt;plur_recall&lt;/code&gt; or &lt;code&gt;plur_recall_hybrid&lt;/code&gt; to retrieve it — from any model in your stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I use open engrams alongside ChatGPT or Claude memory?&lt;/strong&gt;&lt;br&gt;
Yes. They operate at different layers. Model-native memory handles session context within a vendor's product; open engrams handle portable, cross-model recall. Running both is the recommended setup for developers who use multiple AI tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the open engram format a specification or a product?&lt;/strong&gt;&lt;br&gt;
Both. The open engram format is a specification for how memory units are structured. PLUR is an open-source implementation of that specification. The goal is to prevent vendor lock-in at the memory layer the same way SQLite prevents vendor lock-in at the storage layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I have to choose one model to use PLUR?&lt;/strong&gt;&lt;br&gt;
No. PLUR connects to any MCP-compatible client — Claude Code, Cursor, Hermes agents, and custom applications. You write to one engram store; every tool reads from it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>mem0, Letta, and PLUR: Three Memory Architectures, Three Different Bets</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Sat, 22 Aug 2026 02:16:19 +0000</pubDate>
      <link>https://dev.to/plur9/mem0-letta-and-plur-three-memory-architectures-three-different-bets-5dee</link>
      <guid>https://dev.to/plur9/mem0-letta-and-plur-three-memory-architectures-three-different-bets-5dee</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; mem0 solves memory as a storage problem — extract facts&lt;br&gt;
from conversations, deduplicate them with an LLM, store them in a vector&lt;br&gt;
database. Letta solves memory as an agent OS problem — build a runtime where&lt;br&gt;
memory is natively managed in a persistent process. PLUR solves memory as an&lt;br&gt;
exchange problem — make engrams portable across every tool the agent touches,&lt;br&gt;
decay stale knowledge, and let agents share what they learn. The architectures&lt;br&gt;
are not competing for the same user. They make different bets about where the&lt;br&gt;
constraint is.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What the memory problem actually is
&lt;/h2&gt;

&lt;p&gt;AI agents are stateless by default. The context window resets between sessions.&lt;br&gt;
A correction made on Monday is gone on Tuesday. A convention established in one&lt;br&gt;
tool is invisible to another.&lt;/p&gt;

&lt;p&gt;Every memory system answers this the same way at the surface: attach persistent&lt;br&gt;
storage, store what was learned, retrieve it next time. The architectural question&lt;br&gt;
is not whether to store it, but where, what format, how to retrieve it, and what&lt;br&gt;
happens when facts age or conflict.&lt;/p&gt;

&lt;p&gt;Three projects have built serious answers to these questions. Each chose a&lt;br&gt;
different layer to optimize for.&lt;/p&gt;
&lt;h2&gt;
  
  
  mem0: memory as a storage service
&lt;/h2&gt;

&lt;p&gt;mem0 ($24M raised, 52,000 GitHub stars as of mid-2026) frames memory as a&lt;br&gt;
managed API. Your agent makes calls to &lt;code&gt;m.add()&lt;/code&gt; and &lt;code&gt;m.search()&lt;/code&gt;. mem0 handles&lt;br&gt;
extraction, deduplication, and retrieval. The internal architecture follows a&lt;br&gt;
layered pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extraction&lt;/strong&gt;: an LLM pass identifies "memory-worthy" content from the
conversation (user facts, preferences, stated goals)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication&lt;/strong&gt;: a second LLM pass checks the candidate against existing
memories and resolves conflicts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: deduplicated memories land in a vector database (25+ supported
backends, including Qdrant, Pinecone, Weaviate, pgvector)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval&lt;/strong&gt;: similarity search returns the top-N memories for a given query&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is clean. The API surface is minimal. Dropping it into an existing agent&lt;br&gt;
requires fewer than ten lines of code. The graph memory extension (mem0 v0.2+)&lt;br&gt;
adds relationship storage: "user likes Python" becomes an edge in a property&lt;br&gt;
graph, enabling richer associative recall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the tradeoffs live:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The LLM extraction step is also the cost step. Every conversation turn that&lt;br&gt;
might generate new memory triggers an LLM call to decide what to keep. At&lt;br&gt;
scale, that adds up — and the extraction quality depends on the model you route&lt;br&gt;
it through. Cheaper models miss nuanced corrections. Better models are expensive&lt;br&gt;
per extraction pass.&lt;/p&gt;

&lt;p&gt;Memory in mem0 also doesn't decay. A preference stored twelve months ago has&lt;br&gt;
the same retrieval weight as one stored yesterday. For long-running agents with&lt;br&gt;
months of accumulated context, this means increasingly noisy retrieval: the&lt;br&gt;
agent surfaces old preferences that no longer apply alongside current ones. The&lt;br&gt;
deduplication pass catches direct contradictions ("user prefers Python" vs "user&lt;br&gt;
now prefers Go") but misses obsolescence. The gradual drift where old facts&lt;br&gt;
become irrelevant without being explicitly contradicted is invisible to it.&lt;/p&gt;

&lt;p&gt;mem0 is a single-agent silo. The memory accumulated in your Claude Code&lt;br&gt;
integration does not propagate to your Cursor integration or your Slack bot.&lt;br&gt;
Each agent instance has its own memory store.&lt;/p&gt;
&lt;h2&gt;
  
  
  Letta: memory as agent operating system
&lt;/h2&gt;

&lt;p&gt;Letta ($10M raised) takes a different approach. Rather than attaching memory to&lt;br&gt;
an agent as a service, Letta builds the agent runtime itself so that memory is&lt;br&gt;
natively managed in a persistent process. The key abstraction is the &lt;strong&gt;MemGPT&lt;br&gt;
architecture&lt;/strong&gt; (from the 2023 paper by Packer et al.,&lt;br&gt;
&lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;arXiv:2310.08560&lt;/a&gt;): a hierarchical memory&lt;br&gt;
system where an LLM manages its own context window, explicitly paging information&lt;br&gt;
in and out of different memory tiers.&lt;/p&gt;

&lt;p&gt;The Letta runtime maintains four memory regions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core memory&lt;/strong&gt;: always-in-context, persona and user facts (bounded, ~2K tokens)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall memory&lt;/strong&gt;: searchable conversation history (vector store, queried on demand)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archival memory&lt;/strong&gt;: unbounded long-term storage (queried via explicit function calls)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working context&lt;/strong&gt;: current task state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent itself, running as a Letta server process, decides when to search&lt;br&gt;
archival memory, when to page content into core memory, and when to write new&lt;br&gt;
facts. Memory management is not a side channel: it's a first-class capability&lt;br&gt;
the agent exercises as part of its reasoning loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the tradeoffs live:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Letta's strength is coherence. Because the agent controls its own memory, there&lt;br&gt;
is no lossy extraction step — the agent decides what matters. Corrections are&lt;br&gt;
explicit. Contradictions are resolved in the reasoning loop, not in a&lt;br&gt;
post-hoc LLM deduplication pass.&lt;/p&gt;

&lt;p&gt;The cost is infrastructure. Running Letta means running a persistent agent&lt;br&gt;
server. The stateful process model makes Letta well-suited for long-running&lt;br&gt;
autonomous agents but poorly suited for tools where you want memory to follow&lt;br&gt;
the user across different surfaces. A correction made in a Letta agent does not&lt;br&gt;
carry over to your IDE's code assistant, your email client's AI assistant, or&lt;br&gt;
any other tool outside the Letta runtime.&lt;/p&gt;

&lt;p&gt;Like mem0, Letta does not implement confidence decay. Memories are managed by&lt;br&gt;
the agent's reasoning, not by a time-weighted retrieval system. An agent that&lt;br&gt;
hasn't been asked about a topic in six months has no mechanism to let that&lt;br&gt;
knowledge age out. It stays in archival memory at full retrieval weight.&lt;/p&gt;
&lt;h2&gt;
  
  
  PLUR: memory as exchange layer
&lt;/h2&gt;

&lt;p&gt;PLUR takes a structurally different position. Rather than building a better&lt;br&gt;
storage service or a smarter agent runtime, PLUR builds the layer that makes&lt;br&gt;
memory portable and tradeable across tools.&lt;/p&gt;

&lt;p&gt;The core unit is the &lt;strong&gt;engram&lt;/strong&gt; — an atomic, typed assertion stored as a&lt;br&gt;
human-readable YAML file in &lt;code&gt;~/.plur/&lt;/code&gt;. An engram looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ENG-2026-0412-001&lt;/span&gt;
&lt;span class="na"&gt;statement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deploy&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;target&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;trading&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;module&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;nightshift.internal:8080&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rsync,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;scp"&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;procedural&lt;/span&gt;
&lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;infrastructure.deploy&lt;/span&gt;
&lt;span class="na"&gt;confidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.85&lt;/span&gt;
&lt;span class="na"&gt;created&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-04-12&lt;/span&gt;
&lt;span class="na"&gt;last_verified&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-07-01&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every engram carries a confidence score. The retrieval system is&lt;br&gt;
feedback-trained: when an injected engram helps, its score rises. When it&lt;br&gt;
doesn't surface anything useful, it decays. Engrams that haven't been confirmed&lt;br&gt;
useful in a long time are candidates for retirement — the system forgets them,&lt;br&gt;
exactly as human long-term memory culls information that hasn't been reinforced.&lt;br&gt;
The activation model is derived from ACT-R (Anderson et al., "An Integrated&lt;br&gt;
Theory of the Mind," &lt;em&gt;Psychological Review&lt;/em&gt;, 2004), where memory strength is a&lt;br&gt;
function of recency and frequency of use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval: three modes, one local stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PLUR's retrieval stack is fully local — no API calls required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BM25 only&lt;/strong&gt;: 15ms synchronous, zero dependencies. Used in hot path when
latency matters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid BM25 + embeddings&lt;/strong&gt;: ~2s on first run, ~200ms cached, uses
all-MiniLM-L6-v2 via @huggingface/transformers. Doubles Hit@K retrieval
accuracy vs BM25 alone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic search&lt;/strong&gt;: ~1s async, LLM-assisted multi-step retrieval for complex
queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Merging is via Reciprocal Rank Fusion (RRF), which combines ranked lists from&lt;br&gt;
sparse and dense search without requiring score normalization. On the LoCoMo&lt;br&gt;
benchmark (Maharana et al., 2024 — a 300-dialog dataset testing long-term&lt;br&gt;
conversation memory), agentic PLUR achieves 60% accuracy at 100% retrieval rate&lt;br&gt;
and 1.0 MRR. Single-hop fact recall is 100% in agentic mode. The known weakness&lt;br&gt;
is multi-hop reasoning (33%), where the system needs to chain multiple engrams&lt;br&gt;
to answer a question — an area being addressed by meta-engram aggregation.&lt;/p&gt;

&lt;p&gt;For context on the benchmark landscape: Zep with GPT-4o achieves 71.2% on&lt;br&gt;
LongMemEval. Supermemory claims 98.6% using an 8-variant ensemble with&lt;br&gt;
majority-vote answering. These numbers are on different benchmarks with different&lt;br&gt;
setups — not directly comparable — but they situate PLUR's retrieval accuracy&lt;br&gt;
in the range where it performs well on straightforward recall and lags on the&lt;br&gt;
multi-hop edge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the exchange layer enables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The architectural difference that mem0 and Letta do not address is cross-tool&lt;br&gt;
portability. Because engrams are files on disk at a standard path (&lt;code&gt;~/.plur/&lt;/code&gt;),&lt;br&gt;
every tool that integrates the PLUR MCP server reads and writes the same&lt;br&gt;
engrams. A correction made in Claude Code is immediately available in Cursor,&lt;br&gt;
Hermes, and OpenClaw — no sync step, no API call, no data export. The&lt;br&gt;
&lt;code&gt;~/.plur/&lt;/code&gt; directory is the memory.&lt;/p&gt;

&lt;p&gt;This is the "one more thing" that changes the unit of analysis. The question is&lt;br&gt;
no longer "does this agent have memory?" It becomes "does the memory follow the&lt;br&gt;
user, or is it trapped in one tool's silo?"&lt;/p&gt;

&lt;p&gt;Cross-device sync is handled by the same mechanism as any file sync — git,&lt;br&gt;
Syncthing, Dropbox — because the engrams are files. No proprietary sync&lt;br&gt;
protocol is required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge packs: memory as a first data product&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The second capability that mem0 and Letta do not implement is the exchange&lt;br&gt;
itself. PLUR ships &lt;strong&gt;knowledge packs&lt;/strong&gt; — curated, versioned bundles of engrams&lt;br&gt;
published to the PLUR registry. A pack might encode a project's deployment&lt;br&gt;
conventions, a company's API quirks, or a hard-won debugging workflow. An agent&lt;br&gt;
that installs a pack gains the knowledge immediately, without the token cost of&lt;br&gt;
learning it from scratch.&lt;/p&gt;

&lt;p&gt;The unit economics follow a simple test: is the pack price less than the token&lt;br&gt;
cost of having each new agent instance re-learn the same knowledge from scratch?&lt;br&gt;
For a team running ten agent instances against the same codebase, that learning&lt;br&gt;
cost multiplies by ten. The pack pays it once.&lt;/p&gt;

&lt;p&gt;This is distinct from model weights. A knowledge pack is inspectable: every&lt;br&gt;
engram is readable, correctable, and deletable. You can audit what an installed&lt;br&gt;
pack knows. You cannot do that with fine-tuning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing the architectures
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;mem0&lt;/th&gt;
&lt;th&gt;Letta&lt;/th&gt;
&lt;th&gt;PLUR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory model&lt;/td&gt;
&lt;td&gt;LLM extraction → vector store&lt;/td&gt;
&lt;td&gt;Agent-managed hierarchical tiers&lt;/td&gt;
&lt;td&gt;Atomic engrams with typed structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retrieval&lt;/td&gt;
&lt;td&gt;Similarity search&lt;/td&gt;
&lt;td&gt;Agent-initiated archival search&lt;/td&gt;
&lt;td&gt;BM25 + embeddings + agentic (local)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidence decay&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Feedback-trained, ACT-R activation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None (agent-managed retention)&lt;/td&gt;
&lt;td&gt;Engram retirement on low activation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tool sharing&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (shared &lt;code&gt;~/.plur/&lt;/code&gt; files)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-device sync&lt;/td&gt;
&lt;td&gt;Proprietary/API&lt;/td&gt;
&lt;td&gt;Proprietary/API&lt;/td&gt;
&lt;td&gt;File-based (git, Syncthing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory portability&lt;/td&gt;
&lt;td&gt;API-bound&lt;/td&gt;
&lt;td&gt;Runtime-bound&lt;/td&gt;
&lt;td&gt;Open YAML, Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge packs&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (published, versioned)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory exchange&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;Managed API or self-hosted server&lt;/td&gt;
&lt;td&gt;Persistent agent server&lt;/td&gt;
&lt;td&gt;Local files + optional MCP server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token cost to add memory&lt;/td&gt;
&lt;td&gt;LLM extraction pass per addition&lt;/td&gt;
&lt;td&gt;Included in agent reasoning&lt;/td&gt;
&lt;td&gt;plur_learn call, no LLM pass&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The token economics question
&lt;/h2&gt;

&lt;p&gt;Injecting memory has a cost. The question is whether selective injection is&lt;br&gt;
cheaper than full context dumps — and by how much.&lt;/p&gt;

&lt;p&gt;A team sending a 3,000-token &lt;code&gt;CLAUDE.md&lt;/code&gt; system prompt on every turn at $15/M&lt;br&gt;
tokens (Opus pricing as of mid-2026) pays $0.045 per turn for context. At 200&lt;br&gt;
turns/day per developer across a five-person team, that's $45/day for&lt;br&gt;
background context most turns don't use.&lt;/p&gt;

&lt;p&gt;PLUR's hybrid retrieval injects 5–10 engrams per turn — typically 200–400&lt;br&gt;
tokens of targeted memory. At the same pricing, that's $0.003–$0.006 per turn,&lt;br&gt;
a 87–93% reduction per turn before accounting for the fact that smaller context&lt;br&gt;
also means shorter inference. On the Datacore benchmark (internal, n=218 tasks),&lt;br&gt;
Haiku with PLUR injection outperformed Opus without memory on navigation and&lt;br&gt;
discoverability tasks. Weaker models benefit most from targeted injection because&lt;br&gt;
they lack the capacity to filter noise from a large, undifferentiated context&lt;br&gt;
block.&lt;/p&gt;

&lt;p&gt;mem0 adds an LLM extraction cost on top of the storage cost. Every turn that&lt;br&gt;
might generate a new memory triggers an LLM call for extraction and potentially&lt;br&gt;
a second call for deduplication. Letta folds the memory management cost into the&lt;br&gt;
agent's reasoning budget — it pays for memory in model tokens rather than API&lt;br&gt;
calls, which makes it harder to isolate but not cheaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing between them
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;mem0&lt;/strong&gt; fits agents that need memory with minimal integration work and don't&lt;br&gt;
require cross-tool sharing. If you have one agent, one integration, and want to&lt;br&gt;
drop in memory without building infrastructure, mem0 is the fastest path. The&lt;br&gt;
cost is the extraction overhead and the absence of decay — a tradeoff that&lt;br&gt;
matters more as the memory store ages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Letta&lt;/strong&gt; fits long-running autonomous agents where memory coherence is critical&lt;br&gt;
and the agent controls its own context. If you're building a persistent agent&lt;br&gt;
that runs over weeks and needs to reason about what it knows, the MemGPT&lt;br&gt;
architecture gives you that. The cost is the stateful server requirement and&lt;br&gt;
the inability to share memory across different agent surfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PLUR&lt;/strong&gt; fits teams or users running agents across multiple tools, where the&lt;br&gt;
same knowledge needs to follow the agent everywhere it goes. If your workflow&lt;br&gt;
touches Claude Code and Cursor and a custom agent, and you want corrections to&lt;br&gt;
propagate without manual re-entry, PLUR's file-based portability is the&lt;br&gt;
architectural answer. The cost is a different kind of infrastructure assumption:&lt;br&gt;
the engram store works best when it's maintained (reviewed, pruned) like any&lt;br&gt;
accumulating knowledge base.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architectural bet
&lt;/h2&gt;

&lt;p&gt;The three architectures make different bets about where the constraint is.&lt;/p&gt;

&lt;p&gt;mem0 bets on integration friction: developers won't build memory if it's hard&lt;br&gt;
to add. The API surface is the answer. Letta bets on coherence: memory without&lt;br&gt;
a reasoner managing it degrades. The stateful runtime is the answer. PLUR bets&lt;br&gt;
on portability: memory trapped in one tool's silo doesn't follow the user.&lt;br&gt;
The open file format and exchange are the answer.&lt;/p&gt;

&lt;p&gt;A team could use all three simultaneously. mem0 for an isolated service agent,&lt;br&gt;
Letta for a long-running autonomous planner, PLUR as the cross-tool memory layer&lt;br&gt;
that connects the user's knowledge across both. The architectures compose rather&lt;br&gt;
than compete.&lt;/p&gt;

&lt;p&gt;What doesn't compose is the exchange. Memory that can only be consumed by the&lt;br&gt;
system that produced it cannot be shared, curated, or priced. The knowledge a&lt;br&gt;
senior engineer accumulates through six months of agent corrections stays trapped&lt;br&gt;
in their instance — unusable by teammates, invisible to new hires, gone when the&lt;br&gt;
tool changes.&lt;/p&gt;

&lt;p&gt;The engram format is open. The packs are publishable. The &lt;code&gt;~/.plur/&lt;/code&gt; directory&lt;br&gt;
belongs to the user, not the tool vendor. Not your files, not your memory.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Benchmarks&lt;/strong&gt;: &lt;a href="https://plur.ai/benchmark" rel="noopener noreferrer"&gt;plur.ai/benchmark&lt;/a&gt; · &lt;strong&gt;Engram specification&lt;/strong&gt;: &lt;a href="https://plur.ai/spec" rel="noopener noreferrer"&gt;plur.ai/spec&lt;/a&gt; · &lt;strong&gt;Install&lt;/strong&gt;: &lt;code&gt;npx @plur-ai/mcp init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What does your agent stack look like? If you're running agents across multiple&lt;br&gt;
tools, we'd like to know how you're handling memory today — open an issue or&lt;br&gt;
find us on &lt;a href="https://github.com/plur-ai/plur" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GTD Content Writer&lt;/strong&gt; - Created: 2026-07-06&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; DRAFT - Requires human review before publication&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>How PLUR Cut Our Agent Context Costs by 90%</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Sat, 22 Aug 2026 02:16:17 +0000</pubDate>
      <link>https://dev.to/plur9/how-plur-cut-our-agent-context-costs-by-90-5c1</link>
      <guid>https://dev.to/plur9/how-plur-cut-our-agent-context-costs-by-90-5c1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; The bottleneck isn't model intelligence — it's context.&lt;br&gt;
You're paying to send the same 3,000 tokens of background facts on every&lt;br&gt;
turn, 90% of which the agent doesn't need. PLUR injects only what's&lt;br&gt;
relevant. Haiku + PLUR now outperforms Opus without memory at 1/10th the&lt;br&gt;
cost.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem: context is expensive and mostly irrelevant
&lt;/h2&gt;

&lt;p&gt;Every AI team eventually hits the same wall. Your agent knows how to code,&lt;br&gt;
write, and reason. But it doesn't know &lt;em&gt;your&lt;/em&gt; things: your deployment servers,&lt;br&gt;
your tag conventions, which of your hundred tools handles which task, the&lt;br&gt;
decision you made six months ago and why.&lt;/p&gt;

&lt;p&gt;The instinct is to put all of it in the system prompt. A &lt;code&gt;CLAUDE.md&lt;/code&gt; or&lt;br&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; file that grows to 3,000 words. You send it on every turn — most&lt;br&gt;
of it irrelevant to what the agent is doing right now.&lt;/p&gt;

&lt;p&gt;At $15 per million tokens for Opus, that's $0.045 per turn just for the system&lt;br&gt;
prompt. Multiply by a team of 5 developers, 200 turns a day each, and you're&lt;br&gt;
spending &lt;strong&gt;$45/day on context the agent mostly ignores.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The deeper problem: it doesn't even work. An agent asked to "deploy the trading&lt;br&gt;
module" doesn't need the 400-word section on Zettelkasten conventions. It needs&lt;br&gt;
the 5 lines about your deploy target. Burying those 5 lines in 3,000 tokens of&lt;br&gt;
noise is how you get agents that apply the wrong server or skip the smoke test.&lt;/p&gt;
&lt;h2&gt;
  
  
  The insight: inject, don't dump
&lt;/h2&gt;

&lt;p&gt;Human experts don't memorize everything before starting a task. They pull from&lt;br&gt;
memory &lt;em&gt;on demand&lt;/em&gt;, surfacing only what's relevant to right now. An agent&lt;br&gt;
should work the same way.&lt;/p&gt;

&lt;p&gt;PLUR stores knowledge as &lt;strong&gt;engrams&lt;/strong&gt; — small, typed assertions that strengthen&lt;br&gt;
with use and decay when irrelevant, modeled on human memory (ACT-R activation).&lt;br&gt;
Each turn, a fast local search (BM25 + BGE embeddings, no API calls) selects&lt;br&gt;
the 5–10 most relevant engrams for the current task and injects only those into&lt;br&gt;
context.&lt;/p&gt;

&lt;p&gt;Instead of 3,000 tokens of background, you send 200–400 tokens of targeted&lt;br&gt;
memory. The agent has exactly what it needs. Nothing it doesn't.&lt;/p&gt;
&lt;h3&gt;
  
  
  What this looks like in practice
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Task: "deploy the trading module to production"
# Injected automatically (5 engrams, ~280 tokens):

deploy target: nightshift (not prod) — SSH alias: nightshift
trading module lives in 0-personal/trading/
deployment: git pull + systemctl restart plur-trading
never push to main directly — PR required
smoke test: python test/smoke.py --env nightshift
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No Zettelkasten conventions. No email conventions. No 40 other things that&lt;br&gt;
aren't relevant right now.&lt;/p&gt;
&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;We ran head-to-head tests: the same task, the same agent, with and without&lt;br&gt;
PLUR memory. 28 scenarios across Haiku 4.5, Sonnet 4.6, and Opus 4.5. The&lt;br&gt;
question was whether PLUR memory changes which model wins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: 31 wins, 4 losses — 89% win rate across all models.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The clearest result was &lt;em&gt;house rules&lt;/em&gt; — tasks that require applying&lt;br&gt;
organization-specific knowledge (tag conventions, file routing, deployment&lt;br&gt;
procedures). Without PLUR, agents got these right 10–38% of the time depending&lt;br&gt;
on model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Config&lt;/th&gt;
&lt;th&gt;House rules&lt;/th&gt;
&lt;th&gt;Win rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opus (no memory)&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet (no memory)&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haiku (no memory)&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Haiku + PLUR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12–0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Haiku with PLUR memory beat Opus without memory in 89% of decisive contests.&lt;br&gt;
The model didn't get smarter — it got the right context instead of noise.&lt;/p&gt;

&lt;p&gt;On &lt;a href="https://github.com/xiaowu0162/LongMemEval" rel="noopener noreferrer"&gt;LongMemEval&lt;/a&gt; (retrieval&lt;br&gt;
benchmark), PLUR scores &lt;strong&gt;97.6% Hit@5&lt;/strong&gt; on the 500-question suite using hybrid&lt;br&gt;
BM25 + embedding search. Zero API calls. All local.&lt;/p&gt;
&lt;h2&gt;
  
  
  The cost math
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Config&lt;/th&gt;
&lt;th&gt;Cost per turn&lt;/th&gt;
&lt;th&gt;Quality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Opus + 3k-token system prompt&lt;/td&gt;
&lt;td&gt;~$0.045&lt;/td&gt;
&lt;td&gt;House rules: 38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;After&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Haiku + PLUR injection (~300 tokens)&lt;/td&gt;
&lt;td&gt;~$0.002&lt;/td&gt;
&lt;td&gt;House rules: 100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's a &lt;strong&gt;95% cost reduction&lt;/strong&gt; with a &lt;strong&gt;2.6× improvement&lt;/strong&gt; in the tasks that&lt;br&gt;
actually require knowing how your organization works.&lt;/p&gt;

&lt;p&gt;The math holds at any scale. At 1,000 turns/day (a small team), the before/after&lt;br&gt;
is ~$45/day vs ~$2/day — $43/day saved while the agent performs better.&lt;/p&gt;
&lt;h2&gt;
  
  
  How memory is captured
&lt;/h2&gt;

&lt;p&gt;PLUR hooks into your session lifecycle. When you correct your agent, it learns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# You say: "no, deploy goes to nightshift, not prod"
# PLUR captures automatically:
&lt;/span&gt;&lt;span class="nf"&gt;plur_learn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deploy target: nightshift (not prod) — SSH alias: nightshift&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the agent discovers a convention or makes a decision, same thing. Over&lt;br&gt;
time, it accumulates a model of how your world works — not as a static document,&lt;br&gt;
but as a searchable, weighted knowledge graph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engrams decay.&lt;/strong&gt; A convention from a codebase you refactored six months ago&lt;br&gt;
stops appearing in context on its own. No manual curation needed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why not just use a smaller CLAUDE.md?
&lt;/h2&gt;

&lt;p&gt;You could. But "smaller" has a ceiling — you'll always need more context than a&lt;br&gt;
curated static file can hold without growing unwieldy again. And a static file&lt;br&gt;
can't learn. It can't prioritize. It sends the same facts regardless of what&lt;br&gt;
task the agent is doing.&lt;/p&gt;

&lt;p&gt;PLUR's injection is task-aware. The same knowledge base surfaces different&lt;br&gt;
engrams for "deploy trading module" vs "write a blog post" vs "review this PR."&lt;br&gt;
The agent sees its world through the lens of what it's doing right now.&lt;/p&gt;
&lt;h2&gt;
  
  
  One-command install
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @plur-ai/mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Sets up storage (&lt;code&gt;~/.plur/&lt;/code&gt;), MCP config, and Claude Code hooks in one step.&lt;br&gt;
Restart your editor. Memory works from the next session.&lt;/p&gt;

&lt;p&gt;For Cursor, Windsurf, or any MCP-compatible client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plur"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@plur-ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Memory lives in &lt;code&gt;~/.plur/&lt;/code&gt; — plain YAML files, human-readable, zero cloud&lt;br&gt;
dependency. Sync across machines with &lt;code&gt;plur_sync&lt;/code&gt; (git-based).&lt;/p&gt;




&lt;p&gt;Open source. Apache 2.0. Works with Claude Code, Cursor, Windsurf, and any MCP&lt;br&gt;
client. Python agents: &lt;code&gt;pip install plur-hermes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/plur-ai/plur" rel="noopener noreferrer"&gt;GitHub →&lt;/a&gt; · &lt;a href="https://plur.ai/benchmark.html" rel="noopener noreferrer"&gt;Benchmark →&lt;/a&gt; · &lt;a href="https://plur.ai/spec.html" rel="noopener noreferrer"&gt;Engram spec →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>OpenClaw has built-in memory now. Do you still need PLUR?</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Sat, 15 Aug 2026 23:22:48 +0000</pubDate>
      <link>https://dev.to/plur9/openclaw-has-built-in-memory-now-do-you-still-need-plur-13k</link>
      <guid>https://dev.to/plur9/openclaw-has-built-in-memory-now-do-you-still-need-plur-13k</guid>
      <description>&lt;h1&gt;
  
  
  OpenClaw has built-in memory now. Do you still need PLUR?
&lt;/h1&gt;

&lt;p&gt;OpenClaw has had built-in cross-session memory since mid-2026 — per-session notes indexed in a local SQLite database, keyword and vector search, and one-way imports from Codex and Claude Code. For basic session continuity inside OpenClaw, you no longer need a memory plugin. But OpenClaw's memory stays inside OpenClaw. If you use more than one AI tool, if you want memory that improves with feedback rather than just accumulates, or if you ever want to share or sell what your agent has learned, PLUR is still the layer you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenClaw's built-in memory covers
&lt;/h2&gt;

&lt;p&gt;OpenClaw's native memory stores observations from your sessions — what the agent did, what you asked for, project-level context — and makes them available in future conversations within OpenClaw. This is a genuine improvement: you no longer have to re-explain your codebase conventions to an OpenClaw agent at the start of every session.&lt;/p&gt;

&lt;p&gt;What it does not do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-tool sync&lt;/strong&gt; — OpenClaw memory is scoped to OpenClaw. Your Claude Code agent, Cursor, Codex, and Hermes agents each start from scratch unless you run PLUR alongside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning over time&lt;/strong&gt; — OpenClaw stores what happened; it does not improve the signal. PLUR's ACT-R-inspired activation and decay model strengthens frequently-confirmed facts and quietly fades outdated ones. The memory gets better with use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured, queryable format&lt;/strong&gt; — OpenClaw memory is plain Markdown in &lt;code&gt;~/.openclaw/workspace&lt;/code&gt;, so it is readable and editable in any editor; its SQLite index, however, is opaque. PLUR engrams are structured YAML in &lt;code&gt;~/.plur/&lt;/code&gt; — individually addressable, version-controllable, and portable across tools, with the index rebuildable from the files themselves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pack marketplace&lt;/strong&gt; — PLUR's exchange layer lets you install pre-trained context packs (for a framework, a domain, a methodology) and, eventually, sell your own. OpenClaw has no equivalent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The architecture difference
&lt;/h2&gt;

&lt;p&gt;OpenClaw's native memory and PLUR solve adjacent but different problems:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;OpenClaw native memory&lt;/th&gt;
&lt;th&gt;PLUR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Inside OpenClaw&lt;/td&gt;
&lt;td&gt;Shared across Claude Code, Cursor, Codex, Hermes, OpenClaw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;Platform-managed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.plur/&lt;/code&gt; YAML, open spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning&lt;/td&gt;
&lt;td&gt;Accumulates&lt;/td&gt;
&lt;td&gt;ACT-R activation + decay — improves with feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspectable&lt;/td&gt;
&lt;td&gt;Yes — Markdown files (MEMORY.md, memory/*.md); SQLite index is opaque&lt;/td&gt;
&lt;td&gt;Yes — edit or delete any engram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exchange&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Pack marketplace (Phase 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise governance&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Team scopes, provenance, org-level isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PLUR and OpenClaw native memory are not mutually exclusive. Developers who install PLUR alongside OpenClaw get both: OpenClaw's fast in-platform recall, plus engrams that carry institutional knowledge across every tool they use.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you only need OpenClaw memory
&lt;/h2&gt;

&lt;p&gt;If you work exclusively in OpenClaw, your context is simple, and you have no interest in sharing knowledge across tools or agents, OpenClaw's built-in memory is likely enough. It is free, requires no setup, and covers the most common case: not re-explaining yourself at the start of a new conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  When PLUR adds the most value
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You use Claude Code, Cursor, Codex, or Hermes alongside OpenClaw and want a unified memory layer.&lt;/li&gt;
&lt;li&gt;Your team has hard-won conventions, decisions, or domain knowledge you want every agent to know — regardless of which tool they run in.&lt;/li&gt;
&lt;li&gt;You want memory that improves: confirmed facts activate, stale facts fade.&lt;/li&gt;
&lt;li&gt;You want to inspect, edit, or selectively forget what the AI remembers — with full auditability.&lt;/li&gt;
&lt;li&gt;You want to install a pre-trained context pack for a framework or domain instead of bootstrapping from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @plur-ai/mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs PLUR's MCP server, creates &lt;code&gt;~/.plur/&lt;/code&gt;, and wires the session hooks for your configured tools. Engrams written by one tool are readable by all of them. &lt;a href="https://github.com/plur-ai/plur#install" rel="noopener noreferrer"&gt;Full install guide →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're using OpenClaw specifically, you can also install PLUR as a native OpenClaw plugin: &lt;code&gt;openclaw plugins install @plur-ai/claw&lt;/code&gt; — this wires PLUR's engram layer directly into OpenClaw's Context Engine.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://docs.openclaw.ai/concepts/memory" rel="noopener noreferrer"&gt;OpenClaw memory concepts&lt;/a&gt;; &lt;a href="https://docs.openclaw.ai/concepts/memory-builtin" rel="noopener noreferrer"&gt;OpenClaw built-in memory&lt;/a&gt;; &lt;a href="https://plur.ai/spec" rel="noopener noreferrer"&gt;PLUR engram spec&lt;/a&gt;; &lt;a href="https://github.com/plur-ai/plur" rel="noopener noreferrer"&gt;github.com/plur-ai/plur&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>How Do I Use Memory in Long-Running Agent Loops?</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Thu, 13 Aug 2026 16:11:05 +0000</pubDate>
      <link>https://dev.to/plur9/how-do-i-use-memory-in-long-running-agent-loops-1b1m</link>
      <guid>https://dev.to/plur9/how-do-i-use-memory-in-long-running-agent-loops-1b1m</guid>
      <description>&lt;h1&gt;
  
  
  How Do I Use Memory in Long-Running Agent Loops?
&lt;/h1&gt;

&lt;p&gt;Long-running agent loops — autonomous workflows where an AI agent operates for hours or days, making decisions, calling tools, and accumulating state — hit a wall that short interactions do not: the context window fills up. Once it does, one of three things happens: the agent drops early context and forgets decisions it made (context drift), the agent re-does work it already completed because it lost the memory of doing it (redundant work), or the agent errors out when the context window overflows. The fix is external memory: a persistent store the agent reads from and writes to throughout the loop, so accumulated knowledge survives context window eviction. Research from MemGPT (tiered memory management, &lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;arXiv:2310.08560&lt;/a&gt;), Voyager (lifelong learning via skill libraries, &lt;a href="https://arxiv.org/abs/2305.16291" rel="noopener noreferrer"&gt;arXiv:2305.16291&lt;/a&gt;), and Reflexion (verbal reinforcement via episodic memory, &lt;a href="https://arxiv.org/abs/2303.11366" rel="noopener noreferrer"&gt;arXiv:2303.11366&lt;/a&gt;) converges on the same architecture: agents need managed external memory — not bigger context windows — to operate coherently over long horizons.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pain: what breaks when an agent runs too long
&lt;/h2&gt;

&lt;p&gt;An agent starts a long-running task: refactor a codebase, research a market, process a dataset, or manage a multi-step deployment. It makes decisions, calls tools, reads results, and generates next steps. Each interaction adds tokens to the context window. After enough turns, the context window is full — and the agent's behavior degrades in three ways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context drift.&lt;/strong&gt; As the context window fills, earlier context is evicted (or compressed, or simply lost in attention). The agent forgets the decision it made at step 3 — "we chose PostgreSQL" — and may contradict it at step 40. Packer et al. (&lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;arXiv:2310.08560&lt;/a&gt;) identified this as the core limitation of LLMs in extended interactions: "limited context windows, hindering their utility in tasks like extended conversations and document analysis." The solution they proposed — MemGPT's virtual context management — is essentially an external memory tier the agent manages itself, moving information between fast (in-context) and slow (external) memory as needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redundant work.&lt;/strong&gt; Without persistent memory, the agent cannot recall that it already tried an approach and failed. It re-attempts the same API call, re-reads the same file, re-runs the same analysis. Shinn et al. (&lt;a href="https://arxiv.org/abs/2303.11366" rel="noopener noreferrer"&gt;arXiv:2303.11366&lt;/a&gt;) demonstrated this with Reflexion: agents that maintain an "episodic memory buffer" of past attempts — what worked, what failed, why — make better decisions on subsequent trials. The memory buffer is not a context window; it is a separate, persistent store of distilled lessons the agent reads before acting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision amnesia.&lt;/strong&gt; In a long loop, the agent makes a sequence of decisions: which approach to take, which file to edit, which API to call. Without memory, it cannot reconstruct why it made an earlier decision — it only sees the current context window. This leads to inconsistent behavior: the agent may undo its own earlier work, or take an approach that contradicts a constraint it established ten steps ago. Wang et al. (&lt;a href="https://arxiv.org/abs/2305.16291" rel="noopener noreferrer"&gt;arXiv:2305.16291&lt;/a&gt;) showed that Voyager, a lifelong learning agent, solves this with an "ever-growing skill library" — a persistent store of executable skills the agent builds up over time. The skills are "temporally extended, interpretable, and compositional," which "compounds the agent's abilities rapidly and alleviates catastrophic forgetting." The skill library is external memory; the model's weights never change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture: memory as a separate module
&lt;/h2&gt;

&lt;p&gt;The research literature on agent memory converges on a single architectural principle: memory should be a separate module from the model, not stuffed into the context window.&lt;/p&gt;

&lt;p&gt;Zhang et al. (&lt;a href="https://arxiv.org/abs/2404.13501" rel="noopener noreferrer"&gt;arXiv:2404.13501&lt;/a&gt;) organize the field around memory as "the key component to support agent-environment interactions" — the basis for "self-evolving capability." Their survey identifies multiple memory types (short-term, long-term, episodic, semantic) and multiple operations (read, write, reflect, forget), all operating on a store external to the model.&lt;/p&gt;

&lt;p&gt;Sumers et al. (&lt;a href="https://arxiv.org/abs/2309.02427" rel="noopener noreferrer"&gt;arXiv:2309.02427&lt;/a&gt;) proposed CoALA (Cognitive Architectures for Language Agents), a framework that describes agents with "modular memory components, a structured action space to interact with internal memory and external environments, and a generalized decision-making process." The memory is modular — it has its own structure, its own operations, and its own lifecycle — separate from the model's parameters or the context window.&lt;/p&gt;

&lt;p&gt;Park et al. (&lt;a href="https://arxiv.org/abs/2304.03442" rel="noopener noreferrer"&gt;arXiv:2304.03442&lt;/a&gt;) demonstrated this with generative agents that "store a complete record of the agent's experiences using natural language, synthesize those memories over time into higher-level reflections, and retrieve them dynamically to plan behavior." The architecture has three layers: observation (what happened), reflection (what it means), and retrieval (what is relevant right now). Memory is not just storage — it is an active process of consolidation and recall that makes the agent more coherent over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical approaches to memory in long-running loops
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Tiered memory (MemGPT pattern)
&lt;/h3&gt;

&lt;p&gt;The agent manages memory in tiers: a small "core memory" in the context window (the current task, key facts), and a larger "archival memory" outside the context window (historical context, past decisions, learned lessons). The agent moves information between tiers as needed — promoting relevant archival memories to core when they become pertinent, and demoting stale core memories to archival when they are no longer active.&lt;/p&gt;

&lt;p&gt;This is the approach Packer et al. (&lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;arXiv:2310.08560&lt;/a&gt;) demonstrated with MemGPT. The agent "intelligently manages different memory tiers in order to effectively provide extended context within the LLM's limited context window." The OS metaphor is apt: just as an operating system pages data between RAM and disk, the agent pages knowledge between context and external storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Episodic memory with reflection (Reflexion pattern)
&lt;/h3&gt;

&lt;p&gt;The agent maintains an episodic memory buffer — a log of past attempts, outcomes, and verbal reflections. Before each new attempt, the agent reads the relevant reflections to avoid repeating mistakes and to build on past successes.&lt;/p&gt;

&lt;p&gt;Shinn et al. (&lt;a href="https://arxiv.org/abs/2303.11366" rel="noopener noreferrer"&gt;arXiv:2303.11366&lt;/a&gt;) showed that this "verbal reinforcement learning" — reinforcing the agent through linguistic feedback stored in memory, not through weight updates — produces significant improvements across coding, decision-making, and reasoning tasks. The key insight: the agent learns from its own experience without retraining.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Skill libraries (Voyager pattern)
&lt;/h3&gt;

&lt;p&gt;The agent builds a library of reusable skills — executable code, procedures, or strategies — as it works. Each skill is stored externally and indexed for retrieval. When the agent encounters a similar task, it retrieves and composes existing skills rather than starting from scratch.&lt;/p&gt;

&lt;p&gt;Wang et al. (&lt;a href="https://arxiv.org/abs/2305.16291" rel="noopener noreferrer"&gt;arXiv:2305.16291&lt;/a&gt;) demonstrated that this approach enables "lifelong learning" — the agent "continuously explores the world, acquires diverse skills, and makes novel discoveries without human intervention." The skill library "compounds the agent's abilities rapidly and alleviates catastrophic forgetting" because skills are stored externally, not in weights.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. External memory via MCP (the open-standard pattern)
&lt;/h3&gt;

&lt;p&gt;The Model Context Protocol (MCP, specification 2025-11-25, &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt;) is an open protocol — JSON-RPC 2.0 based, inspired by the Language Server Protocol — that standardizes how LLM applications connect to external data sources and tools. An MCP-compatible memory server gives any MCP-compatible agent runtime access to a persistent memory store.&lt;/p&gt;

&lt;p&gt;The agent calls memory tools (recall, learn, forget, feedback) as part of its normal loop. Memory is not stuffed into the context window — it is retrieved on demand, like a database query. The memory store persists across sessions, across agent restarts, and across model switches. Open engram implementations like PLUR expose memory over MCP, so any agent runtime — Claude Code, Hermes, OpenClaw, Cursor — can read from and write to the same memory store.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Memory type&lt;/th&gt;
&lt;th&gt;Persistence&lt;/th&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tiered memory (MemGPT)&lt;/td&gt;
&lt;td&gt;Core + archival&lt;/td&gt;
&lt;td&gt;Session&lt;/td&gt;
&lt;td&gt;Agent manages memory tiers, paging between context and external storage&lt;/td&gt;
&lt;td&gt;Extended conversations, document analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Episodic + reflection (Reflexion)&lt;/td&gt;
&lt;td&gt;Episodic buffer&lt;/td&gt;
&lt;td&gt;Trial-based&lt;/td&gt;
&lt;td&gt;Agent reflects on past attempts, stores verbal lessons, reads before next attempt&lt;/td&gt;
&lt;td&gt;Iterative tasks, coding, reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill library (Voyager)&lt;/td&gt;
&lt;td&gt;Procedural&lt;/td&gt;
&lt;td&gt;Lifelong&lt;/td&gt;
&lt;td&gt;Agent builds reusable skills, indexes for retrieval, composes for new tasks&lt;/td&gt;
&lt;td&gt;Open-ended exploration, skill acquisition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP memory server&lt;/td&gt;
&lt;td&gt;External store&lt;/td&gt;
&lt;td&gt;Cross-session&lt;/td&gt;
&lt;td&gt;Agent calls memory tools (recall/learn/forget) over standard protocol&lt;/td&gt;
&lt;td&gt;Cross-tool, cross-model persistent memory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What to store in long-running loop memory
&lt;/h2&gt;

&lt;p&gt;Not everything belongs in the memory store. The signal-to-noise ratio matters — a memory full of irrelevant observations is as useless as no memory at all. The research suggests storing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decisions and rationale&lt;/strong&gt; — what the agent decided, and why. This prevents contradiction and enables the agent to reconstruct its reasoning later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failed approaches&lt;/strong&gt; — what was tried, what went wrong, what was learned. Reflexion (&lt;a href="https://arxiv.org/abs/2303.11366" rel="noopener noreferrer"&gt;arXiv:2303.11366&lt;/a&gt;) showed this is the highest-value memory type for iterative improvement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills and procedures&lt;/strong&gt; — reusable code, validated workflows, successful strategies. Voyager (&lt;a href="https://arxiv.org/abs/2305.16291" rel="noopener noreferrer"&gt;arXiv:2305.16291&lt;/a&gt;) showed this compounds agent capabilities over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key facts&lt;/strong&gt; — project context, user preferences, environment state that the agent needs to reference repeatedly but that does not fit in the context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflections&lt;/strong&gt; — higher-level abstractions synthesized from observations. Park et al. (&lt;a href="https://arxiv.org/abs/2304.03442" rel="noopener noreferrer"&gt;arXiv:2304.03442&lt;/a&gt;) showed that reflection — "synthesizing memories over time into higher-level reflections" — is what gives agents continuity and personality.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When to forget
&lt;/h2&gt;

&lt;p&gt;Memory that grows without bound is its own problem. An agent that has accumulated 10,000 memory entries will retrieve noise alongside signal. The research points to several forgetting strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temporal decay&lt;/strong&gt; — memories that have not been accessed recently lose activation. This mirrors biological memory consolidation: frequently recalled memories are reinforced; unused ones fade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback-driven relevance&lt;/strong&gt; — memories that were useful (the agent acted on them and the outcome was positive) are promoted; memories that were not useful are demoted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidation&lt;/strong&gt; — multiple related observations are synthesized into a single higher-level reflection, and the raw observations are discarded. Park et al. (&lt;a href="https://arxiv.org/abs/2304.03442" rel="noopener noreferrer"&gt;arXiv:2304.03442&lt;/a&gt;) demonstrated this: observations accumulate, then reflections are synthesized, then the agent retrieves reflections (not raw observations) for planning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These forgetting strategies are not optional — they are what keep the memory store useful over long horizons. A memory system without forgetting is a log file, not a memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do I use memory in long-running agent loops?&lt;/strong&gt; Use an external memory store that the agent reads from and writes to throughout the loop. The agent should store decisions and rationale, failed approaches, reusable skills, key facts, and synthesized reflections. Before each step, the agent retrieves relevant memories to avoid repeating mistakes, contradicting earlier decisions, or re-doing completed work. The memory store persists across context window evictions and across sessions. Research from MemGPT (tiered memory, &lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;arXiv:2310.08560&lt;/a&gt;), Reflexion (episodic memory, &lt;a href="https://arxiv.org/abs/2303.11366" rel="noopener noreferrer"&gt;arXiv:2303.11366&lt;/a&gt;), and Voyager (skill libraries, &lt;a href="https://arxiv.org/abs/2305.16291" rel="noopener noreferrer"&gt;arXiv:2305.16291&lt;/a&gt;) converges on managed external memory — not bigger context windows — as the solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is context drift in AI agents?&lt;/strong&gt; Context drift occurs when an agent's context window fills up and earlier context is evicted or compressed, causing the agent to forget decisions, constraints, or facts it established earlier in the task. This leads to inconsistent behavior, contradiction of earlier decisions, and redundant work. External memory prevents context drift by persisting key information outside the context window and retrieving it on demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does MemGPT manage memory?&lt;/strong&gt; MemGPT (&lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;arXiv:2310.08560&lt;/a&gt;) uses a tiered memory architecture inspired by operating systems: a small "core memory" in the context window for active information, and a larger "archival memory" outside the context window for historical context. The agent pages information between tiers — promoting relevant archival memories to core when needed, and demoting stale core memories to archival. This provides "virtual context management" that extends the effective context window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can AI agents learn from their mistakes during a long task?&lt;/strong&gt; Yes — if they have memory. Reflexion (&lt;a href="https://arxiv.org/abs/2303.11366" rel="noopener noreferrer"&gt;arXiv:2303.11366&lt;/a&gt;) demonstrated that agents which maintain an episodic memory buffer of past attempts (what was tried, what failed, why) and read from it before each new attempt produce significantly better results than agents without memory. The agent "verbally reflects on task feedback signals" and stores the reflection in memory — learning from experience without weight updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is lifelong learning in AI agents?&lt;/strong&gt; Lifelong learning is the ability of an agent to continuously acquire new skills and knowledge over time without forgetting what it already learned. Voyager (&lt;a href="https://arxiv.org/abs/2305.16291" rel="noopener noreferrer"&gt;arXiv:2305.16291&lt;/a&gt;) demonstrated this with an "ever-growing skill library" — a persistent store of executable skills that "compounds the agent's abilities rapidly and alleviates catastrophic forgetting." The key: skills are stored externally, not in model weights, so new learning does not degrade existing capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does MCP help with agent memory?&lt;/strong&gt; The Model Context Protocol (MCP, &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt;) is an open protocol that standardizes how agents connect to external tools and data sources — including memory servers. An MCP-compatible memory server gives any agent runtime access to persistent memory (recall, learn, forget, feedback) over a standard protocol. The memory store persists across sessions, agent restarts, and model switches. This means memory is not tied to one agent framework — it follows the agent across tools.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
      <category>agents</category>
    </item>
    <item>
      <title>Is There an Open Standard for AI Agent Memory Engrams?</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Tue, 28 Jul 2026 11:49:11 +0000</pubDate>
      <link>https://dev.to/plur9/is-there-an-open-standard-for-ai-agent-memory-engrams-2ckj</link>
      <guid>https://dev.to/plur9/is-there-an-open-standard-for-ai-agent-memory-engrams-2ckj</guid>
      <description>&lt;h1&gt;
  
  
  Is There an Open Standard for AI Agent Memory Engrams?
&lt;/h1&gt;

&lt;p&gt;For procedural memory — what an agent knows how to &lt;em&gt;do&lt;/em&gt; — there is already a working open standard: the SKILL.md format from agentskills.io, adopted by Claude Code, Cursor, GitHub Copilot, and a growing number of runtimes. For semantic and episodic memory — what an agent has &lt;em&gt;learned&lt;/em&gt; about you, your preferences, your decisions — there is no universally adopted standard yet. The leading open proposal is the Engram Specification (plur.ai/spec.html, Apache-2.0): a YAML-based format that encodes a discrete fact with type, domain, confidence score, and provenance in a human-readable file you can inspect, edit, and carry between systems. Whether that proposal becomes a standard depends on how many runtimes adopt it. As of mid-2026, the field is converging on engrams as the unit of agent memory — the format is still contested.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem standardization is meant to solve
&lt;/h2&gt;

&lt;p&gt;Every production AI agent faces the same memory problem: the model forgets between sessions, the context window runs out, and learned knowledge — corrections made, preferences stated, decisions taken — vanishes. The fix is persistent external memory. But persistent where, and in whose format?&lt;/p&gt;

&lt;p&gt;Today, the answer is: whichever tool you happen to be using. Mem0 stores memories in its own schema. Letta has its own format. Your Claude Code installation builds its own &lt;code&gt;CLAUDE.md&lt;/code&gt; context files. None of these formats talk to each other. When you switch tools, your memory does not transfer. When you want to audit what your agent knows about you, there is no file to open — or if there is, its structure is proprietary to the vendor.&lt;/p&gt;

&lt;p&gt;This fragmentation is the same problem that HTTP solved for web pages, and that MIME types solved for file formats: without a shared standard, every sender and receiver must negotiate a private protocol. At sufficient scale, the cost of that negotiation exceeds the cost of any individual implementation.&lt;/p&gt;

&lt;p&gt;An open standard for agent memory engrams would provide:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interoperability&lt;/strong&gt; — memories created in one runtime load correctly in another&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability&lt;/strong&gt; — a single known format lets users inspect and verify what agents have learned&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portability&lt;/strong&gt; — memory travels with the user, not with the vendor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt; — a typed, identified format makes individual facts selectable for deletion (GDPR Article 17, right to erasure)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem&lt;/strong&gt; — standardized engrams can be packaged, distributed, and traded as packs, the way npm packages are distributed for code&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What a standard would need to define
&lt;/h2&gt;

&lt;p&gt;An engram standard is not just a file format. It needs to answer at least four questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the atomic unit?&lt;/strong&gt; The field is converging on the following minimal structure: a unique identifier, a human-readable statement of the fact, a type classification (behavioral, procedural, architectural, terminological), a scope that defines which agents or users the fact applies to, a confidence score that decays over time as the fact ages, and a provenance record (when it was learned, from what source). Anything less and the format cannot distinguish facts that should be universal from facts that are agent-specific, or distinguish high-confidence assertions from tentative observations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does confidence decay?&lt;/strong&gt; Facts age. A best practice from 2023 may be superseded in 2025. A user preference stated once may later be reversed. A standard without a decay mechanism will accumulate stale knowledge and inject it into agent context indefinitely. The format needs to encode either an explicit decay schedule or a last-verified timestamp that runtimes can use to compute relevance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does scope work?&lt;/strong&gt; Some facts apply globally (a coding convention used across all projects), some apply per-project, some per-agent, some per-user. A standard without a scope field collapses all of these into a single flat namespace, making it impossible to share select facts across runtimes without sharing all facts. The PLUR spec addresses this with a &lt;code&gt;scope&lt;/code&gt; field (&lt;code&gt;global&lt;/code&gt;, &lt;code&gt;project:&amp;lt;name&amp;gt;&lt;/code&gt;, &lt;code&gt;agent:&amp;lt;name&amp;gt;&lt;/code&gt;) and a &lt;code&gt;domain&lt;/code&gt; field for topic routing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the retrieval contract?&lt;/strong&gt; A stored engram that cannot be found at recall time is useless. A standard should define, at minimum, what metadata fields must support keyword search, and what response shape a compliant runtime must return. The PLUR spec currently specifies BM25 keyword recall and hybrid BM25+embedding search as the retrieval interface, with a structured JSON response that includes the engram, its retrieval strength, and its session injection rank.&lt;/p&gt;

&lt;h2&gt;
  
  
  What exists today
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Procedural memory: agentskills.io (standardized)
&lt;/h3&gt;

&lt;p&gt;For procedural knowledge — step-by-step instructions for how to perform a task — the SKILL.md format from agentskills.io is the de-facto standard. A SKILL.md file uses YAML frontmatter (name, description, trigger conditions, tags) followed by a markdown body containing the procedure. The format is human-authored, human-readable, and stored as a flat file in the project repository. Claude Code uses it as its primary skill extension mechanism. Cursor, GitHub Copilot, and over a dozen other tools have adopted the same convention. There is no formal RFC or standards body — the standard is defined by convergence and adoption, not a specification committee.&lt;/p&gt;

&lt;p&gt;Procedural memory is the simpler case: the format is natural language instructions. The hard case is semantic and episodic memory: the specific facts, corrections, and preferences an agent accumulates at runtime, in response to user behavior rather than human authoring.&lt;/p&gt;

&lt;h3&gt;
  
  
  Semantic and episodic memory: no adopted standard yet
&lt;/h3&gt;

&lt;p&gt;For the category of knowledge that agents accumulate through use — what the user corrected, what the user prefers, what was decided in a previous session — there is no adopted standard as of July 2026. The gap is widely recognized. The term "engram" (borrowed from Semon, 1904, via recent AI memory research) is spreading rapidly on GitHub as a label for this category. A search for "engram" repositories returns dozens of nascent projects, most independent of each other, each defining their own format.&lt;/p&gt;

&lt;p&gt;The most complete open proposal in this space is the Engram Specification published by PLUR (plur.ai/spec.html). It defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typed engrams&lt;/strong&gt; with &lt;code&gt;type&lt;/code&gt; field: &lt;code&gt;behavioral&lt;/code&gt;, &lt;code&gt;procedural&lt;/code&gt;, &lt;code&gt;architectural&lt;/code&gt;, &lt;code&gt;terminological&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain tagging&lt;/strong&gt; for topic routing (e.g., &lt;code&gt;infrastructure.deployment&lt;/code&gt;, &lt;code&gt;conventions.naming&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope system&lt;/strong&gt; (&lt;code&gt;global&lt;/code&gt;, &lt;code&gt;project:&amp;lt;name&amp;gt;&lt;/code&gt;, &lt;code&gt;agent:&amp;lt;name&amp;gt;&lt;/code&gt;) for cross-runtime selectivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence scoring&lt;/strong&gt; (0.0–1.0) with documented decay mechanism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provenance&lt;/strong&gt; (source session, creation date, last-verified date)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pack format&lt;/strong&gt; — bundles of related engrams that can be published to a registry, installed by others, and version-controlled independently of the runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The spec is published under Apache-2.0. The reference implementation (github.com/plur-ai/plur) is also Apache-2.0, with ~226 stars as of July 2026.&lt;/p&gt;

&lt;p&gt;PLUR is not the only structured approach. Mem0 stores memories with entity extraction and graph-based linking (their format is documented in the Mem0 API, but not published as a standalone open spec). Letta (formerly MemGPT) has a well-defined memory architecture with core memory, archival memory, and recall storage — again documented in their API, not as a portable format. Both are strong implementations; neither publishes a format spec designed for adoption outside their own runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Model Context Protocol gap
&lt;/h3&gt;

&lt;p&gt;MCP (Model Context Protocol, Anthropic, 2024) defines an open standard for &lt;em&gt;tool access&lt;/em&gt; — how an AI model calls external functions, reads files, queries databases. It does not define a standard for &lt;em&gt;memory storage&lt;/em&gt;. A model can use MCP to call a memory server, but what that server stores and how it indexes it is outside the MCP scope. Standardizing engram format is the memory-layer equivalent of what MCP did for tool access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for developers
&lt;/h2&gt;

&lt;p&gt;If you are building an agent today, you are making a de-facto format choice that will be hard to change later. Choosing a proprietary-hosted memory backend means your users' accumulated knowledge belongs to the backend, not to you or them. Choosing an open format — even an early-stage one — means the knowledge can travel: to a different model, to a different runtime, to the user's own machine.&lt;/p&gt;

&lt;p&gt;The practical question is not "which standard is official" — there is no official standard yet. The practical question is: which format has the properties a standard needs, and which runtimes have adopted it? SKILL.md answers that for procedural memory. For semantic and episodic memory, the PLUR Engram Specification is the most complete open proposal in the field. Whether the wider ecosystem converges on it, or on something else, depends on adoption over the next 12–24 months.&lt;/p&gt;

&lt;p&gt;The open-source community's track record on format convergence suggests it will happen — it always does. The question is whether the format that wins is designed for human readability, portability, and compliance from the start, or whether it is reverse-engineered from a proprietary implementation after the fact.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Is there an official RFC or ISO standard for AI agent memory engrams?&lt;/strong&gt;&lt;br&gt;
No. As of mid-2026, no standards body has published a formal specification for AI agent memory engrams. The field is converging at the project level, not the committee level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What is the PLUR Engram Specification?&lt;/strong&gt;&lt;br&gt;
An open (Apache-2.0) format specification for encoding discrete facts learned by AI agents. It defines the fields, types, scope system, confidence scoring, and pack format. Published at plur.ai/spec.html.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Is the SKILL.md format a standard for agent memory?&lt;/strong&gt;&lt;br&gt;
SKILL.md (agentskills.io) is a de-facto standard for procedural memory — step-by-step instructions. It is not a format for the semantic and episodic facts agents accumulate from user interactions. Those are the domain of engram formats like the PLUR spec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I use PLUR engrams with any LLM?&lt;/strong&gt;&lt;br&gt;
Yes. PLUR engrams are stored as plain YAML files and injected into the LLM context window via an MCP server. The format is model-agnostic: the same engram file works with Claude, GPT-4, Gemini, Llama, or any model that supports MCP or context injection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What happens if no standard wins?&lt;/strong&gt;&lt;br&gt;
Without convergence, the cost is borne by developers and users: knowledge locked into vendor formats, no portability, compliance pain, duplicate effort across every runtime. The same outcome as the pre-HTTP web — functional for early adopters who commit to a single stack, costly for everyone else.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: Semon, R. (1904). Die Mneme. PLUR Engram Specification: plur.ai/spec.html. agentskills.io SKILL.md format: agentskills.io. MCP (Model Context Protocol): modelcontextprotocol.io. Zhang et al. (2024): arXiv:2404.13501. Mem0: mem0.ai. Letta: letta.com.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>Mem0 vs PLUR: Which AI Agent Memory Layer Should You Use?</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:56:43 +0000</pubDate>
      <link>https://dev.to/plur9/mem0-vs-plur-which-ai-agent-memory-layer-should-you-use-3bc</link>
      <guid>https://dev.to/plur9/mem0-vs-plur-which-ai-agent-memory-layer-should-you-use-3bc</guid>
      <description>&lt;h1&gt;
  
  
  Mem0 vs PLUR: Which AI Agent Memory Layer Should You Use?
&lt;/h1&gt;

&lt;p&gt;Mem0 and PLUR are both open-source AI agent memory layers, but they make opposite architectural bets. Mem0 is a managed memory API: you call &lt;code&gt;client.add(message, user_id=user_id)&lt;/code&gt; and Mem0 extracts, stores, and retrieves relevant facts, with a hosted cloud option and a self-hosted alternative. PLUR is a local-first MCP server: it stores memories as open-format engrams in &lt;code&gt;~/.plur/&lt;/code&gt; on your device, and any MCP-compatible tool — Claude Code, Cursor, Hermes, OpenClaw — reads and writes the same store without SDK integration. Mem0 suits agent products where you need to manage memories for many users in the cloud. PLUR suits developers who want a single persistent memory that follows them across every AI tool they use, stays on their device, and costs nothing per query.&lt;/p&gt;




&lt;h2&gt;
  
  
  How each one works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mem0
&lt;/h3&gt;

&lt;p&gt;Mem0 is a memory API with a Python and JavaScript SDK. You call &lt;code&gt;memory.add()&lt;/code&gt; with a message (or list of messages) and a &lt;code&gt;user_id&lt;/code&gt;. Mem0 runs an extraction pass with an LLM to identify facts worth keeping, stores them in a vector database, and deduplicates or updates contradicting facts automatically. When you call &lt;code&gt;memory.search(query, user_id=user_id)&lt;/code&gt;, it returns the most semantically relevant memories for that user.&lt;/p&gt;

&lt;p&gt;The managed version (mem0.ai) handles the infrastructure. The self-hosted version (&lt;code&gt;mem0ai/mem0&lt;/code&gt; on GitHub, Apache-2.0) runs with a local vector store (Qdrant by default) and your own LLM API key. Mem0 also ships an optional knowledge graph layer (using Neo4j) for relational memory.&lt;/p&gt;

&lt;p&gt;Integration: import the SDK, instantiate a client, call &lt;code&gt;.add()&lt;/code&gt; and &lt;code&gt;.search()&lt;/code&gt; at the right places in your agent code. Works with any stack that can import a Python or JS package.&lt;/p&gt;

&lt;h3&gt;
  
  
  PLUR
&lt;/h3&gt;

&lt;p&gt;PLUR is an MCP (Model Context Protocol) server that exposes memory tools to any compatible AI tool. You run &lt;code&gt;npx @plur-ai/mcp init&lt;/code&gt; once; PLUR registers itself with your MCP-compatible tools (Claude Code, Cursor, Hermes, OpenClaw, etc.) and creates a local engram store at &lt;code&gt;~/.plur/&lt;/code&gt;. From then on, any session can call &lt;code&gt;plur_learn&lt;/code&gt; to store a fact and &lt;code&gt;plur_recall&lt;/code&gt; to retrieve one — without any SDK import in your application code.&lt;/p&gt;

&lt;p&gt;Engrams are stored as structured YAML in the local directory (&lt;code&gt;~/.plur/engrams.yaml&lt;/code&gt;), readable with any text editor or scripted with standard shell tools. PLUR uses hybrid retrieval: BM25 keyword search ranked with reciprocal rank fusion (RRF) alongside semantic embeddings. Confidence scores decay when facts go unused or are contradicted. The format is open and portable — you can inspect, edit, or export the store without any PLUR-specific tooling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key differences
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Mem0&lt;/th&gt;
&lt;th&gt;PLUR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default storage&lt;/td&gt;
&lt;td&gt;Cloud managed or self-hosted Qdrant&lt;/td&gt;
&lt;td&gt;Local directory (&lt;code&gt;~/.plur/&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration model&lt;/td&gt;
&lt;td&gt;SDK — import and call &lt;code&gt;.add()&lt;/code&gt; / &lt;code&gt;.search()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;MCP server — tools pick up via MCP config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works with any MCP tool out of the box&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory format&lt;/td&gt;
&lt;td&gt;Vectors in DB (not directly inspectable)&lt;/td&gt;
&lt;td&gt;Open YAML engrams (text-editor readable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-user (user_id)&lt;/td&gt;
&lt;td&gt;Yes — built-in per-user isolation&lt;/td&gt;
&lt;td&gt;No — single-user local store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidence decay / forgetting&lt;/td&gt;
&lt;td&gt;Automatic dedup and contradiction resolution&lt;/td&gt;
&lt;td&gt;Explicit confidence decay over time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted option&lt;/td&gt;
&lt;td&gt;Yes (Apache-2.0)&lt;/td&gt;
&lt;td&gt;Yes (Apache-2.0, local by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing (cloud)&lt;/td&gt;
&lt;td&gt;Free tier + pay per operation&lt;/td&gt;
&lt;td&gt;Free (local); no cloud managed offering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tool portability&lt;/td&gt;
&lt;td&gt;Requires SDK in each tool&lt;/td&gt;
&lt;td&gt;Any MCP tool shares the same store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy (data leaves device)&lt;/td&gt;
&lt;td&gt;Yes (cloud version)&lt;/td&gt;
&lt;td&gt;No (local by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  When Mem0 fits better
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You are building a multi-user agent product.&lt;/strong&gt; Mem0 has native &lt;code&gt;user_id&lt;/code&gt; isolation — each user's memories are stored separately and retrieved per-user. If you are building a product where hundreds of users each need their own memory, Mem0's managed service handles this cleanly. PLUR is single-user and local — not designed for serving many users from a shared server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want managed infrastructure without self-hosting.&lt;/strong&gt; The mem0.ai managed service handles scaling, backups, and deduplication. PLUR requires you to manage the local directory or run your own backup; there is no hosted offering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You need deep SDK integration.&lt;/strong&gt; Mem0 is a library — you call it at specific points in your agent logic, control exactly what gets stored, and can build fine-grained extraction pipelines. PLUR is tool-level, not code-level — it integrates into AI tool sessions, not into application code directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want a graph layer.&lt;/strong&gt; Mem0's optional Neo4j integration stores relational knowledge alongside vector memory — useful for entities with relationships (users, organizations, projects). PLUR stores flat engrams without a native graph layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  When PLUR fits better
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You use multiple AI tools and want shared memory.&lt;/strong&gt; If you work across Claude Code, Cursor, and Hermes in the same day, PLUR's single &lt;code&gt;~/.plur/&lt;/code&gt; directory means all three sessions read and write the same memory store — no duplication, no sync required. With Mem0, you would need to integrate the SDK into each tool separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want your memory to stay on your device.&lt;/strong&gt; PLUR is local-first by design: nothing leaves your machine unless you configure sync. Mem0's cloud tier sends memories to managed infrastructure. For sensitive contexts (proprietary code, personal health data, legal work), local-first matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want inspectable, portable memory.&lt;/strong&gt; PLUR engrams are JSON files in a directory. &lt;code&gt;ls ~/.plur/&lt;/code&gt;, &lt;code&gt;grep -r "postgres" ~/.plur/&lt;/code&gt;, &lt;code&gt;cat ~/.plur/store/global.jsonl&lt;/code&gt; — standard shell tools work. You can audit, edit, back up, or migrate without any PLUR-specific API. Mem0's vector DB is not directly human-readable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want to avoid per-query costs.&lt;/strong&gt; PLUR's local retrieval is free — no API call for each recall. Mem0 cloud charges per memory operation. At high recall volumes (agent loops running hundreds of queries per day), this difference adds up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are a developer using MCP-compatible tools.&lt;/strong&gt; If you already use Claude Code or Cursor with MCP, &lt;code&gt;npx @plur-ai/mcp init&lt;/code&gt; is the only integration step. PLUR appears as a tool in your session without any application-level code change.&lt;/p&gt;




&lt;h2&gt;
  
  
  Can you use both?
&lt;/h2&gt;

&lt;p&gt;Yes, and the combination makes sense in some architectures. Use PLUR for developer-facing memory (your own context, preferences, and agent-learned facts, shared across your tools). Use Mem0 for user-facing memory (your product's end-user personalization, per-user isolation, cloud-managed). The two stores serve different retrieval paths and do not conflict.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are the best open-source alternatives to Mem0?&lt;/strong&gt;&lt;br&gt;
The closest functional alternatives are Zep (temporal knowledge graph, Apache-2.0), Letta (stateful agent OS with tiered memory, open-source), and PLUR (local-first MCP memory, Apache-2.0). Zep competes most directly on the infrastructure side; PLUR competes on the local-first and cross-tool portability side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which agent-memory tools let me inspect and delete what the AI remembers?&lt;/strong&gt;&lt;br&gt;
PLUR stores memories as open YAML engrams — run &lt;code&gt;cat ~/.plur/engrams.yaml&lt;/code&gt; to see everything. Run &lt;code&gt;plur_forget&lt;/code&gt; via any MCP session to delete a specific engram. Mem0 provides an API for listing and deleting memories by user_id. Both let you programmatically inspect and delete; PLUR does so without any API call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there an open-source Mem0 alternative that keeps data local?&lt;/strong&gt;&lt;br&gt;
Yes — PLUR (Apache-2.0). It stores engrams in &lt;code&gt;~/.plur/&lt;/code&gt; by default, with no network calls for local retrieval. Zep can also be self-hosted, but defaults to cloud. Mem0 self-hosted requires running Qdrant locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mem0 vs PLUR: which has better retrieval?&lt;/strong&gt;&lt;br&gt;
Different tradeoffs. Mem0 uses LLM-based extraction (deciding what to remember) plus vector search (deciding what to surface). PLUR uses hybrid BM25 + embedding search with RRF ranking and confidence decay over time. Mem0's extraction pass adds latency at write time but can normalize and deduplicate facts. PLUR's retrieval runs entirely locally with no LLM call.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/mem0-vs-letta-vs-zep"&gt;Mem0 vs Letta vs Zep: Which AI Agent Memory Layer?&lt;/a&gt; — broader comparison across the open-source memory landscape&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/model-native-vs-agent-memory-layer"&gt;Model-Native vs Agent Memory Layer: What's the Difference?&lt;/a&gt; — explains the architecture distinction that shapes when each tool fits&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/top-10-open-source-ai-memory"&gt;Top 10 Open-Source AI Memory Tools in 2026&lt;/a&gt; — full landscape survey including Mem0 and PLUR&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.mem0.ai" rel="noopener noreferrer"&gt;Mem0 documentation&lt;/a&gt; — mem0.ai&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mem0ai/mem0" rel="noopener noreferrer"&gt;mem0ai/mem0 GitHub&lt;/a&gt; — Apache-2.0 source&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/plur-ai/plur" rel="noopener noreferrer"&gt;PLUR open-format engram memory&lt;/a&gt; — GitHub&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.graphlit.com/blog/survey-of-ai-agent-memory-frameworks" rel="noopener noreferrer"&gt;AI Agent Memory Frameworks in 2026&lt;/a&gt; — Graphlit Blog&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fountaincity.tech/resources/blog/how-to-build-and-operate-ai-agent-memory-in-2026/" rel="noopener noreferrer"&gt;Survey of AI memory tools 2026&lt;/a&gt; — Fountain City&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>What Memory Layer Works with Cursor or Codex?</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Sun, 26 Jul 2026 11:06:35 +0000</pubDate>
      <link>https://dev.to/plur9/what-memory-layer-works-with-cursor-or-codex-48ga</link>
      <guid>https://dev.to/plur9/what-memory-layer-works-with-cursor-or-codex-48ga</guid>
      <description>&lt;h1&gt;
  
  
  What Memory Layer Works with Cursor or Codex?
&lt;/h1&gt;

&lt;p&gt;Cursor and Codex forget everything when a session ends. The correction you gave your agent last Tuesday — "always use &lt;code&gt;pnpm&lt;/code&gt; in this repo, never &lt;code&gt;npm&lt;/code&gt;" — is gone by Wednesday. The architectural decision you explained across six sessions exists nowhere the agent can access. For Cursor, the fix is a single JSON entry that installs PLUR as an MCP server; within one session, your agent is learning and recalling. For Codex CLI, the integration path depends on your version and setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "context window" is not the same as "memory"
&lt;/h2&gt;

&lt;p&gt;Cursor and Codex both maintain context within a session — recently viewed files, your current conversation, the code you're editing. That context clears when the session ends or the window fills. A memory layer is something different: it extracts the facts that matter (corrections, preferences, conventions, decisions), stores them durably, and retrieves them at the start of the next session with relevance ranking. You do not re-explain; the agent already knows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor: three-minute setup via MCP
&lt;/h2&gt;

&lt;p&gt;Cursor supports the &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; for extending its AI assistant with custom tools and context. PLUR ships an MCP server that runs as a local process, so your memory store stays on disk with no cloud account and no API cost for retrieval.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add PLUR to your Cursor MCP config
&lt;/h3&gt;

&lt;p&gt;Open or create &lt;code&gt;.cursor/mcp.json&lt;/code&gt; in your home directory (or the project root for project-scoped memory):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plur"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@plur-ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Cursor. The PLUR MCP server is now active.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 (optional but recommended): Install Cursor hooks
&lt;/h3&gt;

&lt;p&gt;For automatic injection at session start and automatic capture after each tool call, install PLUR's Cursor hook integration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @plur-ai/cli init &lt;span class="nt"&gt;--cursor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This writes to &lt;code&gt;.cursor/hooks.json&lt;/code&gt; — the same hooks mechanism Cursor uses for other session lifecycle events. With hooks installed, you do not need to call &lt;code&gt;plur_session_start&lt;/code&gt; manually; memory is injected before your agent says a word.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Verify
&lt;/h3&gt;

&lt;p&gt;Open a new Cursor session and ask your agent: "What do you remember about this project?" It will call &lt;code&gt;plur_recall_hybrid&lt;/code&gt; and return any relevant memories. On a fresh install that list is empty — it populates as you work.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens automatically
&lt;/h3&gt;

&lt;p&gt;Once set up, three things happen without any action from you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session start&lt;/strong&gt; — Relevant memories are injected into context before the first response. If you previously told your agent "always write async/await, never callbacks in this codebase," that preference is present immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;During the session&lt;/strong&gt; — Corrections you give the agent ("actually, use X not Y") are captured automatically as engrams. High-confidence learnings are stored without you saying "remember this."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Between sessions&lt;/strong&gt; — Memories decay if they stop being useful (the agent stops retrieving them) and strengthen when they keep proving accurate. The memory list self-organizes toward what actually matters for your work.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Cursor's built-in features already handle
&lt;/h3&gt;

&lt;p&gt;Cursor has its own context mechanisms — conversation history within a session, indexed codebase context, recently viewed files. These are not memory in the durable sense: they do not survive session resets, and they do not travel to other tools. PLUR adds the layer above that: knowledge that survives resets, transfers to other MCP-compatible agents (Claude Code, Windsurf, Hermes), and is portable to a new machine via git sync.&lt;/p&gt;




&lt;h2&gt;
  
  
  Codex CLI: what's supported
&lt;/h2&gt;

&lt;p&gt;OpenAI's Codex CLI is a terminal-based coding agent that natively supports MCP servers via stdio and Streamable HTTP transports. To add PLUR, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex mcp add plur &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @plur-ai/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify with &lt;code&gt;codex mcp list&lt;/code&gt;. Codex will negotiate tools with the PLUR server on each invocation and gain the full tool set (&lt;code&gt;plur_session_start&lt;/code&gt;, &lt;code&gt;plur_learn&lt;/code&gt;, &lt;code&gt;plur_recall_hybrid&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;p&gt;If you prefer a Python-native path (e.g. wrapping Codex CLI via the OpenAI Agents SDK), PLUR also ships a Python SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;plur-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For most Codex CLI users, the &lt;code&gt;codex mcp add&lt;/code&gt; path is the lowest-friction option. The Python SDK is for embedding PLUR into custom agent loops, not for the Codex CLI directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The memory store is shared across tools
&lt;/h2&gt;

&lt;p&gt;One benefit of a memory layer that sits outside any single tool: the engrams Cursor captures are available in Claude Code, Windsurf, Hermes, and any other MCP client that points at the same store. The architectural decisions you teach Cursor carry to the terminal agent you run at night. This is the practical difference between in-tool memory (session-scoped, tool-scoped) and an open-format engram layer (portable, durable, multi-agent).&lt;/p&gt;

&lt;p&gt;PLUR's engram format is an open specification — the data is plain YAML at &lt;code&gt;~/.plur/&lt;/code&gt;, not locked to any service. You can inspect, edit, and export every stored memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sync across machines
&lt;/h2&gt;

&lt;p&gt;If you work across machines or share memory with a team:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;plur_sync&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;git@github.com:you/plur-memory.git&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Memory syncs via git. On another machine, point Cursor at the same store, run &lt;code&gt;plur_sync()&lt;/code&gt;, and you pull all memories from the remote. No cloud service required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does this slow down Cursor?&lt;/strong&gt;&lt;br&gt;
No. The PLUR MCP server is a lightweight local process (Node.js). Retrieval is BM25 + local embeddings — no API calls, no network latency. Injection happens once at session start, before your agent responds, and typically takes under a second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where is my memory stored?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;~/.plur/&lt;/code&gt; — plain YAML files on your disk. You own the data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does PLUR replace Cursor's built-in AI memory?&lt;/strong&gt;&lt;br&gt;
No. Cursor's context mechanisms (conversation history, codebase indexing) continue to work as before. PLUR adds the durable layer above them: facts that survive the session boundary, cross-tool portability, and a feedback loop that trains which memories surface most reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I correct the agent and it captures the wrong thing?&lt;/strong&gt;&lt;br&gt;
Call &lt;code&gt;plur_forget&lt;/code&gt; with the engram ID, or open &lt;code&gt;~/.plur/&lt;/code&gt; and delete the YAML entry. The history is preserved but the engram is retired and no longer injected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Windsurf supported?&lt;/strong&gt;&lt;br&gt;
Yes — same pattern as Cursor. Add &lt;code&gt;npx -y @plur-ai/mcp&lt;/code&gt; to Windsurf's MCP config.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>How to Choose a Memory System for Autonomous AI Agents</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Sat, 25 Jul 2026 08:06:27 +0000</pubDate>
      <link>https://dev.to/plur9/how-to-choose-a-memory-system-for-autonomous-ai-agents-465n</link>
      <guid>https://dev.to/plur9/how-to-choose-a-memory-system-for-autonomous-ai-agents-465n</guid>
      <description>&lt;h1&gt;
  
  
  How to Choose a Memory System for Autonomous AI Agents
&lt;/h1&gt;

&lt;p&gt;For autonomous AI agents — batch pipelines, overnight research loops, multi-step task runners — three external memory tools cover most production use cases: &lt;strong&gt;&lt;a href="https://plur.ai" rel="noopener noreferrer"&gt;PLUR&lt;/a&gt;&lt;/strong&gt; for cross-tool portability and full auditability (open file format, no managed infrastructure, MCP-native), &lt;strong&gt;&lt;a href="https://mem0.ai" rel="noopener noreferrer"&gt;Mem0&lt;/a&gt;&lt;/strong&gt; for hosted semantic-search memory (user preference, interaction history), and &lt;strong&gt;&lt;a href="https://letta.com" rel="noopener noreferrer"&gt;Letta&lt;/a&gt;&lt;/strong&gt; for teams who want an opinionated end-to-end agent stack. Model-native memory (ChatGPT saved memories, Claude Projects) does not work for autonomous agents — it requires a human in the loop and cannot be written to programmatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why model-native memory does not work for autonomous agents
&lt;/h2&gt;

&lt;p&gt;ChatGPT saved memories, Claude Projects, and Gemini's workspace memory are built for an interactive use case: a human in a chat interface tells the model something, and the model remembers it for the next conversation. They are not built for autonomous invocation.&lt;/p&gt;

&lt;p&gt;Autonomous agents typically run without a user in the loop: a cron job fires at 02:00, an orchestrator spawns 12 parallel sub-agents, a CI pipeline calls an agent after a code commit. In these scenarios, model-native memory has two hard constraints:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No programmatic write.&lt;/strong&gt; Your orchestration code cannot store a fact directly into ChatGPT memory or Claude Projects. Only the user and the model, inside their respective interfaces, can update those stores. An overnight agent has no interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No cross-tool access.&lt;/strong&gt; If you run your autonomous agent using Claude Code one week and switch to a custom CLI the next, Claude Projects memory does not follow. Each model provider's memory is siloed inside that provider's interface.&lt;/p&gt;

&lt;p&gt;For autonomous agents, you need a memory store your code owns — one your agent can read at startup, write during a run, and query between runs, regardless of which model or tool is doing the work.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://fountaincity.tech/resources/blog/how-to-build-and-operate-ai-agent-memory-in-2026/" rel="noopener noreferrer"&gt;How to Build AI Agent Memory in 2026&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The three memory requirements for autonomous agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Crash-safe persistence
&lt;/h3&gt;

&lt;p&gt;Autonomous agents run without supervision. A run that fails halfway through should not lose the work done up to the failure. This means the memory store must be durable — written to disk or a database on every update, not just at the end of a successful run. In-memory caches and context-window state fail this requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cross-session continuity
&lt;/h3&gt;

&lt;p&gt;The value of an autonomous agent compounds across runs: facts learned on Monday improve Tuesday's results. This requires the memory store to persist between invocations — not just within a single session context window, but across separately launched processes. File-based stores (&lt;code&gt;~/.plur/&lt;/code&gt;, SQLite) and hosted vector databases (Mem0, Zep) both satisfy this; pure in-context memory (stuffing past outputs into the prompt) does not scale past a few runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Programmatic read/write at runtime
&lt;/h3&gt;

&lt;p&gt;The agent's code — not a human, not the model's own conversational output — must be able to write facts to the store and query them on demand. APIs like &lt;code&gt;plur_learn&lt;/code&gt;, &lt;code&gt;mem0.add&lt;/code&gt;, and &lt;code&gt;zep.add&lt;/code&gt; satisfy this. Model-native memory does not.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparing the main options
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PLUR (open-format, MCP-native)&lt;/strong&gt;&lt;br&gt;
Stores facts as plain-text engrams in &lt;code&gt;~/.plur/&lt;/code&gt;. Any MCP-compatible tool reads and writes the same directory. Crash-safe by design (file writes are atomic). Fully auditable — &lt;code&gt;grep&lt;/code&gt; the directory, open files in any editor, diff changes with git. Free and self-hosted. Best for: agents that need cross-tool portability, full auditability, or GDPR-compliant deletion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mem0 (hosted vector memory)&lt;/strong&gt;&lt;br&gt;
Hosted API that stores and retrieves memories as vector embeddings. Good semantic search. Available via Python SDK, TypeScript SDK, and MCP. Managed infrastructure — no deployment. Best for: personalization memory (user preferences, interaction history) where semantic similarity search matters more than exact-match recall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zep / Graphiti (temporal graph memory)&lt;/strong&gt;&lt;br&gt;
Maintains a knowledge graph of facts with temporal context (who said what, when, in which conversation). Graph traversal lets agents reason about causal chains and entity relationships. Best for: multi-agent systems where relationships between entities matter (CRM data, long-term project tracking).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Letta (stateful agent OS)&lt;/strong&gt;&lt;br&gt;
Provides a full stateful agent runtime with built-in memory management (archival memory, recall memory, in-context memory tiers). More opinionated than a standalone memory layer — you write agents using Letta's framework. Best for: teams who want an opinionated end-to-end agent stack rather than composing individual components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQLite / file-based custom store&lt;/strong&gt;&lt;br&gt;
Maximum control, no external dependency. Write your own schema. Works for teams with specific requirements that off-the-shelf memory tools do not meet, but requires building the read/write/query logic yourself.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://www.graphlit.com/blog/survey-of-ai-agent-memory-frameworks" rel="noopener noreferrer"&gt;AI Agent Memory Frameworks in 2026&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Decision guide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your requirement&lt;/th&gt;
&lt;th&gt;Best fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tool portability + auditability&lt;/td&gt;
&lt;td&gt;PLUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semantic similarity search + personalization&lt;/td&gt;
&lt;td&gt;Mem0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temporal reasoning + knowledge graphs&lt;/td&gt;
&lt;td&gt;Zep / Graphiti&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opinionated end-to-end agent framework&lt;/td&gt;
&lt;td&gt;Letta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full control, no external dependency&lt;/td&gt;
&lt;td&gt;SQLite / custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works with any MCP tool out of the box&lt;/td&gt;
&lt;td&gt;PLUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosted, managed infrastructure&lt;/td&gt;
&lt;td&gt;Mem0, Zep, Letta Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Practical setup: PLUR for an autonomous agent
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One-time setup — installs MCP server and initializes the store&lt;/span&gt;
npx @plur-ai/mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In your agent's run loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# At the start of each run: recall relevant context
&lt;/span&gt;&lt;span class="n"&gt;facts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;plur_recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project dependencies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# During the run: persist new discoveries immediately
&lt;/span&gt;&lt;span class="nf"&gt;plur_learn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Confirmed: package X v2.3 is incompatible with Y v1.8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project.deps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# If the run crashes: facts written before the crash survive
# Next invocation picks up from the last durable state
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;~/.plur/&lt;/code&gt; directory holds all facts as plain files. You can inspect, version-control, or back up the directory. When you switch from Claude Code to a custom CLI or another MCP-compatible tool, the same directory is automatically available.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's the best memory system for autonomous AI agents?&lt;/strong&gt;&lt;br&gt;
It depends on your needs. For cross-tool portability and full auditability, PLUR's open-format file store is the practical choice. For semantic search and personalization at scale, Mem0's hosted API is well-suited. For knowledge-graph and temporal reasoning, Zep/Graphiti is purpose-built. Most autonomous pipelines benefit from one of these three over model-native memory, which cannot be written to programmatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why can't I just use context-window state for agent memory?&lt;/strong&gt;&lt;br&gt;
Context windows reset between invocations. An autonomous agent launched at 02:00 has an empty context — it has no access to what a 22:00 run discovered. Durable external memory (file-based or API-backed) is the only way to carry state across separately launched processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does PLUR work with autonomous agents that don't use MCP?&lt;/strong&gt;&lt;br&gt;
Yes. PLUR has a Python SDK and TypeScript SDK that call the local store directly, without requiring an MCP server. The MCP server is optional — it adds integration with MCP-compatible tools (Claude Code, Cursor, OpenClaw) but is not needed for script-based autonomous agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I handle memory cleanup for long-running autonomous agents?&lt;/strong&gt;&lt;br&gt;
Autonomous agents accumulate facts over time. Plan for: (1) expiry — tag facts with a time-to-live or epoch, and decay/archive old entries; (2) deduplication — store-level dedup prevents the same fact being written 100 times; (3) explicit deletion for GDPR/right-to-be-forgotten use cases. PLUR's &lt;code&gt;plur_forget&lt;/code&gt; and &lt;code&gt;plur_batch_decay&lt;/code&gt; handle these; Mem0 has equivalent API calls.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://fountaincity.tech/resources/blog/how-to-build-and-operate-ai-agent-memory-in-2026/" rel="noopener noreferrer"&gt;How to Build AI Agent Memory in 2026&lt;/a&gt; — Fountain City&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.graphlit.com/blog/survey-of-ai-agent-memory-frameworks" rel="noopener noreferrer"&gt;AI Agent Memory Frameworks in 2026&lt;/a&gt; — Graphlit Blog&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/plur-ai/plur" rel="noopener noreferrer"&gt;PLUR open-format engram memory&lt;/a&gt; — GitHub&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
      <category>agents</category>
    </item>
    <item>
      <title>Is AI Agent Memory GDPR Compliant? A Developer's Guide</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Fri, 24 Jul 2026 10:06:45 +0000</pubDate>
      <link>https://dev.to/plur9/is-ai-agent-memory-gdpr-compliant-a-developers-guide-412</link>
      <guid>https://dev.to/plur9/is-ai-agent-memory-gdpr-compliant-a-developers-guide-412</guid>
      <description>&lt;h1&gt;
  
  
  Is AI Agent Memory GDPR Compliant? A Developer's Guide
&lt;/h1&gt;

&lt;p&gt;The short answer is: it depends on how you implement it. AI agent memory is not inherently GDPR non-compliant, but most default implementations create three serious compliance risks: you cannot locate all data about a specific person, you cannot prove that deletion actually happened, and embedding-based storage makes selective erasure technically impossible. This guide explains what GDPR Article 17 requires from AI agent memory, where common memory frameworks fall short, and how to design a system that is defensible.&lt;/p&gt;




&lt;h2&gt;
  
  
  What GDPR Article 17 Actually Requires
&lt;/h2&gt;

&lt;p&gt;Article 17 of the GDPR — the "right to erasure" or "right to be forgotten" — gives data subjects the right to demand deletion of their personal data, and requires the data controller to comply "without undue delay." In the context of AI agents that remember things about users, this creates four concrete engineering obligations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Identification:&lt;/strong&gt; You must be able to find all data the agent holds about a specific data subject. If an agent has learned facts about a user across 50 sessions and stored them as vector embeddings, locating all relevant embeddings is not tractable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Deletion:&lt;/strong&gt; You must be able to remove that data completely. "Remove from the retrieval index" does not meet the standard — the underlying records must be deleted from storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Proof of deletion:&lt;/strong&gt; In practice, regulators and data subjects may request evidence that deletion occurred. A system that logs "deleted at timestamp X" without a verifiable audit trail is harder to defend than one where deletion produces a diff of removed records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Sub-processor propagation:&lt;/strong&gt; If you use a third-party API for memory storage (a managed vector database, a SaaS memory service), you are responsible for ensuring that sub-processor also deletes the data. This has specific implications for cloud-hosted memory services.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Common Memory Architectures Fail
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Embedding-based storage (Mem0, most RAG systems)
&lt;/h3&gt;

&lt;p&gt;When an agent learns a fact — "Alice is vegetarian" — and stores it as a vector embedding, that vector encodes the semantic meaning of the fact in a mathematical space. When you "delete" the record, you remove the reference in the retrieval index, but the vector values persist in the database's underlying storage until the database compacts or vacuums. More critically, the model that generated the embedding "saw" the fact — you cannot un-teach it.&lt;/p&gt;

&lt;p&gt;For GDPR purposes: deletion from the retrieval index removes the practical ability to retrieve the fact, but it does not constitute erasure of the underlying personal data. Vector databases such as Pinecone, Weaviate, and Qdrant do support hard deletion of individual vectors, so this is solvable — but it requires explicit implementation, not the default behavior of frameworks like Mem0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical gap:&lt;/strong&gt; Mem0's default &lt;code&gt;delete_all(user_id=...)&lt;/code&gt; API call removes records from its managed store, but if you are using a self-hosted Mem0 with a Qdrant backend, you must also confirm that Qdrant has flushed the deleted segment before you can claim erasure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stateful agent memory (Letta / MemGPT)
&lt;/h3&gt;

&lt;p&gt;Letta stores memory as structured "memory blocks" — persona, human, archival — that the agent itself can read and edit. Right-to-erasure requires identifying which blocks contain data about a specific person and zeroing or removing them. For single-user agents, this is straightforward. For multi-user agent deployments, where one agent instance serves many users, the isolation model becomes critical: data about User A must not persist in a block that User B's interactions can reach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical gap:&lt;/strong&gt; Letta's memory blocks are human-readable text files or database records, which makes them easier to audit than embeddings — but there is no built-in &lt;code&gt;forget(user_id=...)&lt;/code&gt; API. You need to build this yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Knowledge graph memory (Zep / Graphiti)
&lt;/h3&gt;

&lt;p&gt;Zep stores memory as a temporal knowledge graph: entities (people, organizations, concepts), edges (relationships), and timestamps (when facts were learned). Right-to-erasure requires deleting all nodes and edges that encode personal data about a specific person. Graphiti's graph structure makes this more explicit than embedding search, but also more complex — deleting a person entity may require cascading deletes through related nodes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical gap:&lt;/strong&gt; Graph deletion is well-defined, but orphaned nodes (edges that reference a deleted entity) require careful handling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open-Format Memory and Verifiable Deletion
&lt;/h2&gt;

&lt;p&gt;The technical root of most GDPR compliance friction is &lt;strong&gt;opaque storage formats&lt;/strong&gt;: vectors, compressed database pages, and graph indices all make it difficult to verify what was deleted and prove that nothing remains.&lt;/p&gt;

&lt;p&gt;Open-format memory — where each piece of remembered information is stored as a plain text record in a file — makes deletion both auditable and provable. When you delete a record from a text file and commit the change to version control, the diff is the proof of deletion.&lt;/p&gt;

&lt;p&gt;PLUR stores each engram (a unit of agent memory) as a structured text record in a local YAML file. The &lt;code&gt;plur forget &amp;lt;id&amp;gt;&lt;/code&gt; command retires the engram — marking it &lt;code&gt;status: retired&lt;/code&gt; and excluding it from all future recall. Because the store is a flat file tracked by git, the retirement produces a verifiable diff: the entry's status field changes from &lt;code&gt;active&lt;/code&gt; to &lt;code&gt;retired&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Retire a specific engram by ID&lt;/span&gt;
plur forget ENG-2026-0618-042

&lt;span class="c"&gt;# Retire by search (when you know content but not ID)&lt;/span&gt;
plur forget &lt;span class="nt"&gt;--search&lt;/span&gt; &lt;span class="s2"&gt;"Alice is vegetarian"&lt;/span&gt; &lt;span class="nt"&gt;--reason&lt;/span&gt; &lt;span class="s2"&gt;"Article 17 request 2026-07-15"&lt;/span&gt;

&lt;span class="c"&gt;# Verify the status change via git&lt;/span&gt;
git diff HEAD~1 ~/.plur/engrams.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--reason&lt;/code&gt; flag records the legal basis or request reference in the engram's rationale field, creating a lightweight audit log within the file's git history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this gives you:&lt;/strong&gt; When a data subject exercises their right to erasure, you can search for their identifier, retire matching engrams, commit, and produce a diff showing which entries were retired and when. The retired entries remain in the YAML file but are permanently excluded from retrieval. For strict GDPR erasure (physical removal), you can manually delete the retired entries from the YAML and commit that change — the git diff then shows complete removal. This does not replace a formal data processing log, but it provides a verifiable technical artifact that supports your compliance posture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementing the Right to Be Forgotten: A Practical Checklist
&lt;/h2&gt;

&lt;p&gt;Regardless of which memory framework you use, a GDPR-defensible implementation needs:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Attribute every memory unit to a data subject
&lt;/h3&gt;

&lt;p&gt;When storing a memory, tag it with the user identifier it relates to. In PLUR, this is the &lt;code&gt;scope&lt;/code&gt; field on an engram. In a custom system, a &lt;code&gt;user_id&lt;/code&gt; field on each record.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Learn a fact attributed to a specific user&lt;/span&gt;
plur learn &lt;span class="s2"&gt;"Alice prefers dark mode"&lt;/span&gt; &lt;span class="nt"&gt;--scope&lt;/span&gt; &lt;span class="s2"&gt;"user:alice@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Build a search-by-subject function
&lt;/h3&gt;

&lt;p&gt;You need to find all memories about a person efficiently. Test this before you go to production — do not discover at the time of a regulatory inquiry that your search is missing records.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find all active engrams for a user&lt;/span&gt;
plur recall &lt;span class="nt"&gt;--scope&lt;/span&gt; &lt;span class="s2"&gt;"user:alice@example.com"&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Implement delete-all-for-subject
&lt;/h3&gt;

&lt;p&gt;Map this to your framework's deletion primitives. In PLUR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One-liner to retire all engrams in a user scope&lt;/span&gt;
plur forget &lt;span class="nt"&gt;--search&lt;/span&gt; &lt;span class="s2"&gt;"alice@example.com"&lt;/span&gt; &lt;span class="nt"&gt;--reason&lt;/span&gt; &lt;span class="s2"&gt;"GDPR Article 17 request 2026-07-15"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For embedding-based systems, this typically means: (a) query for all records with &lt;code&gt;user_id = X&lt;/code&gt;, (b) call the hard-delete API on each, (c) trigger a storage compaction to flush deleted segments, (d) log the record IDs and confirmation response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Propagate to sub-processors
&lt;/h3&gt;

&lt;p&gt;If your agent uses external memory APIs, cloud vector databases, or third-party services, confirm that your DPA (Data Processing Agreement) with each sub-processor covers deletion, and test that deletion requests propagate.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Create an audit trail
&lt;/h3&gt;

&lt;p&gt;Log every deletion event with: request reference, subject identifier, list of deleted record IDs, timestamp, and executor. A commit diff qualifies for open-format systems; for database systems, write this to an append-only audit log.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Test deletion before you need it
&lt;/h3&gt;

&lt;p&gt;Run a deletion drill quarterly. Create test records, exercise the right-to-erasure flow, verify that the deleted records do not appear in subsequent recall, and document the result.&lt;/p&gt;




&lt;h2&gt;
  
  
  EU AI Act Considerations
&lt;/h2&gt;

&lt;p&gt;The EU AI Act (fully applicable from August 2026) introduces additional obligations for AI systems classified as high-risk under Annex III — including systems that interact with individuals in employment, education, credit, and law enforcement contexts. If your agent falls under a high-risk category, you have logging and traceability requirements that interact with memory: you must be able to reconstruct what the agent knew when it made a consequential decision.&lt;/p&gt;

&lt;p&gt;This creates a tension with GDPR right-to-erasure: if you delete the memory that informed a hiring recommendation, you may lose your ability to audit that recommendation. Legal guidance for this tension is still evolving; the practical path is to maintain a separate, subject-anonymized audit log of consequential decisions, distinct from the live memory store that is subject to deletion.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Storage format&lt;/th&gt;
&lt;th&gt;Search by subject&lt;/th&gt;
&lt;th&gt;Hard delete&lt;/th&gt;
&lt;th&gt;Provable deletion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PLUR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured text files&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;--scope&lt;/code&gt; filter&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;plur forget&lt;/code&gt; (retires; physical delete via manual YAML edit)&lt;/td&gt;
&lt;td&gt;✅ git diff (status change or entry removal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mem0 (managed)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed vector store&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;user_id&lt;/code&gt; API&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;delete_all&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Partial (server log)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mem0 (self-hosted)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Qdrant / PG vectors&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;user_id&lt;/code&gt; filter&lt;/td&gt;
&lt;td&gt;Needs explicit compaction&lt;/td&gt;
&lt;td&gt;Requires Qdrant audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Letta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory blocks (text/DB)&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zep / Graphiti&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Knowledge graph&lt;/td&gt;
&lt;td&gt;✅ entity search&lt;/td&gt;
&lt;td&gt;Graph node delete&lt;/td&gt;
&lt;td&gt;Requires cascade audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom RAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vector DB&lt;/td&gt;
&lt;td&gt;Depends on indexing&lt;/td&gt;
&lt;td&gt;Depends on DB&lt;/td&gt;
&lt;td&gt;Depends on logging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is storing AI agent memories "personal data" under GDPR?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the memories relate to an identified or identifiable natural person — their preferences, behavior, statements, or any other information about them — yes, they qualify as personal data under Article 4(1) GDPR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does GDPR apply if I run the agent locally on the user's device?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you process data solely locally and do not transmit it to a server, some GDPR obligations (particularly around sub-processors) do not apply. You are still a data controller, however, and the right to erasure still applies if the user requests it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I keep anonymized memories after a deletion request?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If memories have been genuinely anonymized — not pseudonymized, but fully de-identified — they fall outside GDPR scope and do not need to be deleted. The standard for anonymization is high; removing a name while retaining behavioral patterns linked to a single individual is pseudonymization, not anonymization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the right to be forgotten apply to fine-tuned models?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Strictly speaking, yes — if personal data was used in fine-tuning, a data subject can request erasure. In practice, true erasure from a fine-tuned model is not yet technically feasible at scale (machine unlearning is an active research area). Regulators are still developing guidance on this. For agent memory systems, which store facts as discrete records rather than baking them into model weights, deletion is tractable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What retention period applies to agent memories?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GDPR requires data to be kept "no longer than necessary for the purposes for which the personal data are processed" (Article 5(1)(e)). You need a defined retention policy — whether that is session-only, 90-day rolling, or indefinite with annual review — and a mechanism to enforce it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Reviewed: 2026-07-18. This article provides technical guidance, not legal advice. Consult a qualified data protection specialist for your specific use case.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>How to Delete Specific Things an AI Remembers About You</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Thu, 23 Jul 2026 11:18:34 +0000</pubDate>
      <link>https://dev.to/plur9/how-to-delete-specific-things-an-ai-remembers-about-you-m79</link>
      <guid>https://dev.to/plur9/how-to-delete-specific-things-an-ai-remembers-about-you-m79</guid>
      <description>&lt;h1&gt;
  
  
  How to Delete Specific Things an AI Remembers About You
&lt;/h1&gt;

&lt;p&gt;Whether you can delete a specific AI memory depends on two things: which AI you are using and what storage format its memory uses. Consumer AI assistants like ChatGPT and Claude Projects let you delete individual memories through a settings panel — but only report success; they cannot prove the underlying data is gone. Developer-facing agent memory tools (Mem0, Letta, PLUR) offer deletion via API or CLI. The critical difference is the storage format: systems that store memory as plain files — open-format memory — can prove deletion with a file diff. Systems that store memory as vector embeddings or opaque database records cannot. This distinction matters for privacy-sensitive applications, GDPR compliance, and any scenario where a user needs to trust that deletion actually happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deleting memories from consumer AI assistants
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ChatGPT (OpenAI)
&lt;/h3&gt;

&lt;p&gt;ChatGPT's memory stores facts you have shared across conversations. To delete a specific memory:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open ChatGPT and go to &lt;strong&gt;Settings → Personalization → Manage memory&lt;/strong&gt; (or ask the chat directly: "What do you remember about me?")&lt;/li&gt;
&lt;li&gt;Browse the list of stored memories&lt;/li&gt;
&lt;li&gt;Click the trash icon next to the memory you want to remove, or ask: "Forget that I [specific fact]"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OpenAI's Memory FAQ (&lt;a href="https://help.openai.com/articles/8590148" rel="noopener noreferrer"&gt;help.openai.com/articles/8590148&lt;/a&gt;) notes that when you delete a memory, "it is removed and won't be used in future chats." However, deletion through the UI does not guarantee erasure from server backups or audit logs — OpenAI's data retention policies govern what happens at the infrastructure layer.&lt;/p&gt;

&lt;p&gt;You can also turn off memory entirely under &lt;strong&gt;Settings → Personalization → Memory → Off&lt;/strong&gt;, which stops ChatGPT from creating new memories without deleting existing ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Projects (Anthropic)
&lt;/h3&gt;

&lt;p&gt;Claude Projects store context you add to a project (via the project instructions field) and, in some configurations, persist facts across conversations within that project. To remove stored context:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the project and edit or clear the &lt;strong&gt;Project instructions&lt;/strong&gt; field&lt;/li&gt;
&lt;li&gt;If the platform has stored conversation-derived facts, look for a memory management option in project settings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Claude's in-conversation memory does not persist between separate conversations unless you are using a Claude Projects session with memory enabled. Anthropic's privacy controls are documented at &lt;a href="https://privacy.anthropic.com" rel="noopener noreferrer"&gt;privacy.anthropic.com&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft Copilot
&lt;/h3&gt;

&lt;p&gt;Copilot's memory settings are documented at &lt;a href="https://support.microsoft.com/en-us/microsoft-365-copilot/manage-copilot-memory-in-microsoft-365-copilot" rel="noopener noreferrer"&gt;support.microsoft.com&lt;/a&gt;. You can manage and delete stored memories through the Microsoft 365 privacy dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Gemini
&lt;/h3&gt;

&lt;p&gt;Gemini's memory features vary by product surface. For Gemini Advanced, memory is managed through &lt;strong&gt;Gemini Apps Activity&lt;/strong&gt; in your Google account. You can delete individual memory entries or turn off memory entirely through the Google Account privacy dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  The proof problem: why "deleted" does not always mean gone
&lt;/h2&gt;

&lt;p&gt;With all consumer AI memory systems, the deletion UI removes the memory from the active recall surface. What it cannot guarantee:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The vector embedding derived from that memory is removed from all backup stores&lt;/li&gt;
&lt;li&gt;The source text is not retained in server logs for safety or audit purposes&lt;/li&gt;
&lt;li&gt;The memory is not retained in a training dataset snapshot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a failure of these products — it reflects the tension between privacy controls and operational requirements (backups, safety monitoring, legal holds). For most users, UI deletion is sufficient. For regulated industries or GDPR-sensitive deployments, the inability to prove erasure is a compliance problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deleting memories in developer agent systems
&lt;/h2&gt;

&lt;p&gt;If you are building agents — coding assistants, research agents, autonomous workflows — memory deletion is your responsibility, not the AI provider's. Your agent accumulates facts about users across sessions; when a user asks to delete specific data, you need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find all memories related to that user&lt;/li&gt;
&lt;li&gt;Delete them&lt;/li&gt;
&lt;li&gt;Prove they are gone&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How well you can do each step depends on the memory system you chose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory systems and deletion capability
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Find specific memory&lt;/th&gt;
&lt;th&gt;Delete specific memory&lt;/th&gt;
&lt;th&gt;Prove erasure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mem0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vector store&lt;/td&gt;
&lt;td&gt;Via API similarity search — may miss entries with low similarity&lt;/td&gt;
&lt;td&gt;Via &lt;code&gt;mem0.delete(memory_id)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No — vector may persist in backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Letta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent state blocks&lt;/td&gt;
&lt;td&gt;Via API / Letta Studio UI&lt;/td&gt;
&lt;td&gt;Via API &lt;code&gt;DELETE /v1/agents/{id}/memory&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No — database record may persist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zep / Graphiti&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Temporal knowledge graph&lt;/td&gt;
&lt;td&gt;Via graph query&lt;/td&gt;
&lt;td&gt;Via graph node deletion&lt;/td&gt;
&lt;td&gt;Partial — temporal history chain remains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PLUR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;YAML files (open format)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;plur recall &amp;lt;query&amp;gt;&lt;/code&gt; or &lt;code&gt;grep&lt;/code&gt; in &lt;code&gt;~/.plur/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;plur forget &amp;lt;engram-id&amp;gt;&lt;/code&gt; — retires the engram (excludes from recall; physical removal requires manual YAML edit)&lt;/td&gt;
&lt;td&gt;Yes — &lt;code&gt;git diff&lt;/code&gt; shows status change or entry removal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key variable is storage format. &lt;strong&gt;File-based memory can be grepped, diffed, and deleted with proof. Database-backed or vector-backed memory cannot.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing deletion in PLUR
&lt;/h3&gt;

&lt;p&gt;PLUR stores each memory (engram) as a structured YAML entry in a local file store (&lt;code&gt;~/.plur/&lt;/code&gt; by default). Deletion is explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List what the agent knows about a topic&lt;/span&gt;
plur recall &lt;span class="s2"&gt;"user preferences"&lt;/span&gt;

&lt;span class="c"&gt;# View a specific engram&lt;/span&gt;
plur show ENG-2026-0512-042

&lt;span class="c"&gt;# Delete it&lt;/span&gt;
plur forget ENG-2026-0512-042

&lt;span class="c"&gt;# Confirm it is gone&lt;/span&gt;
plur recall &lt;span class="s2"&gt;"user preferences"&lt;/span&gt;   &lt;span class="c"&gt;# should not surface the deleted engram&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the store is a local directory (and optionally a git repository), retirement leaves a verifiable trace: the engram's status field changes from &lt;code&gt;active&lt;/code&gt; to &lt;code&gt;retired&lt;/code&gt; in the YAML, and &lt;code&gt;git log&lt;/code&gt; shows exactly when it happened and the reason provided. For complete physical erasure, you can delete the retired entry from the YAML file and commit — the diff then shows the entry is gone entirely. This is the closest you can get to provable erasure in an agent memory system without a separate audit log.&lt;/p&gt;

&lt;p&gt;PLUR's explicit retirement design — nothing is auto-deleted; only &lt;code&gt;plur forget&lt;/code&gt; can retire an engram — is the same property that makes it trustworthy from a compliance perspective. You can be confident that if you did not call &lt;code&gt;plur forget&lt;/code&gt;, the memory is still active and retrievable.&lt;/p&gt;




&lt;h2&gt;
  
  
  GDPR and the right to erasure
&lt;/h2&gt;

&lt;p&gt;GDPR Article 17 ("right to erasure," also called the right to be forgotten) requires that a data controller delete personal data when the data subject requests it, when the data is no longer necessary for its original purpose, or when consent is withdrawn.&lt;/p&gt;

&lt;p&gt;For developers building AI agents that process EU user data, this creates a concrete requirement: when a user requests deletion, you must be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify all personal data stored about that user (name, email, preferences, conversation history, derived facts)&lt;/li&gt;
&lt;li&gt;Delete it&lt;/li&gt;
&lt;li&gt;Demonstrate that deletion occurred (for potential regulatory review)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent memory is personal data under GDPR if it contains information that can identify an individual. Vector embeddings of personal information are still personal data even though they are not human-readable (the WP29 and EDPB have consistently taken this position).&lt;/p&gt;

&lt;p&gt;The compliance gap with most agent memory systems is step 3: demonstrating deletion. File-based, open-format memory makes this tractable; vector or graph-based memory makes it difficult.&lt;/p&gt;

&lt;p&gt;The EU AI Act (Regulation 2024/1689, in force August 2024) adds additional transparency requirements for high-risk AI systems, including the ability to trace system outputs and understand the data informing decisions. Agent memory that cannot be inspected or audited may create additional exposure under the Act.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this is not legal advice. Consult a qualified privacy lawyer before making compliance decisions.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  For developers: a checklist for deletion-ready agent memory
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Can you list all memories associated with a specific user ID?&lt;/li&gt;
&lt;li&gt;[ ] Can you delete a specific memory by ID (not just by query similarity)?&lt;/li&gt;
&lt;li&gt;[ ] Can you prove that deletion occurred (file diff, audit log, database record timestamp)?&lt;/li&gt;
&lt;li&gt;[ ] Is the memory store backed up, and does your deletion propagate to backups (or does your backup policy exclude deleted records after N days)?&lt;/li&gt;
&lt;li&gt;[ ] If a user exercises GDPR Article 17 rights, can you produce a deletion record?&lt;/li&gt;
&lt;li&gt;[ ] Is the source text of memories (the raw conversation turns) stored separately, and do you have a deletion path for that too?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I make ChatGPT permanently forget something?&lt;/strong&gt;&lt;br&gt;
You can delete a specific memory from ChatGPT's active recall using the Settings → Personalization → Manage memory panel. This removes the memory from future conversations. ChatGPT's server-side data retention policies govern whether the underlying data is retained in backups or logs — consult OpenAI's Privacy Policy for details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which agent memory tools let me inspect and delete what the AI remembers?&lt;/strong&gt;&lt;br&gt;
All major agent memory tools (Mem0, Letta, Zep, PLUR) provide deletion APIs. The practical difference is inspectability and proof of deletion. PLUR stores memory as local YAML files — you can open, read, grep, edit, and delete entries directly without an API, and a git diff serves as a deletion record. Vector-based stores (Mem0, some Zep configurations) are harder to inspect and cannot prove erasure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is AI agent memory GDPR compliant?&lt;/strong&gt;&lt;br&gt;
It depends on the architecture. Agent memory that stores personal data about EU residents is subject to GDPR, including the right to erasure (Article 17). Open-format, file-based memory systems make erasure easier to implement and demonstrate. Vector embedding stores are technically GDPR-covered personal data but harder to fully erase. This is an active area of regulatory attention as agent systems scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I implement the right to be forgotten in an AI agent?&lt;/strong&gt;&lt;br&gt;
The implementation steps: (1) tag every memory with the user ID it was derived from at creation time, (2) provide a deletion path that removes all memories with that user ID, (3) generate an audit record of the deletion. File-based memory systems (PLUR) make all three steps straightforward. For vector-based systems, step 3 typically requires a separate audit log, since the vector store itself does not record deletions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between deleting a memory and turning off memory entirely?&lt;/strong&gt;&lt;br&gt;
Turning off memory stops the agent from creating new memories but does not delete existing ones. Deleting a specific memory removes that individual entry but leaves other memories intact. Turning off memory and deleting all existing memories are separate operations in most systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI Memory FAQ: &lt;a href="https://help.openai.com/articles/8590148" rel="noopener noreferrer"&gt;help.openai.com/articles/8590148&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GDPR Article 17 (right to erasure): &lt;a href="https://gdpr-info.eu/art-17-gdpr/" rel="noopener noreferrer"&gt;gdpr-info.eu/art-17-gdpr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;EU AI Act (Regulation 2024/1689): &lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1689" rel="noopener noreferrer"&gt;eur-lex.europa.eu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"A Survey on the Memory Mechanism of Large Language Model based Agents" (Zhang et al., 2024): &lt;a href="https://arxiv.org/abs/2404.13501" rel="noopener noreferrer"&gt;arxiv.org/abs/2404.13501&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PLUR open-format engram memory: &lt;a href="https://github.com/plur-ai/plur" rel="noopener noreferrer"&gt;github.com/plur-ai/plur&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft Copilot memory management: &lt;a href="https://support.microsoft.com/en-us/microsoft-365-copilot/manage-copilot-memory-in-microsoft-365-copilot" rel="noopener noreferrer"&gt;support.microsoft.com/en-us/microsoft-365-copilot/manage-copilot-memory-in-microsoft-365-copilot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
    <item>
      <title>Do You Still Need an Agent Memory Layer if ChatGPT Already Has Memory?</title>
      <dc:creator>gregor</dc:creator>
      <pubDate>Wed, 22 Jul 2026 10:11:28 +0000</pubDate>
      <link>https://dev.to/plur9/do-you-still-need-an-agent-memory-layer-if-chatgpt-already-has-memory-1jia</link>
      <guid>https://dev.to/plur9/do-you-still-need-an-agent-memory-layer-if-chatgpt-already-has-memory-1jia</guid>
      <description>&lt;h1&gt;
  
  
  Do You Still Need an Agent Memory Layer if ChatGPT Already Has Memory?
&lt;/h1&gt;

&lt;p&gt;Yes — for a reason that becomes clear once you separate two different jobs. ChatGPT memory, Claude Projects, and Gemini's built-in memory solve a conversational recall problem: they remember what you told the model inside its own interface. An agent memory layer (Mem0, Zep, Letta, PLUR) solves a programmatic recall problem: it stores facts inside your application, accessible from your code, portable across every tool your agent uses. These systems serve different jobs and work best together.&lt;/p&gt;




&lt;h2&gt;
  
  
  What model-native memory does (and where it stops)
&lt;/h2&gt;

&lt;p&gt;As of 2026, the major model providers ship built-in memory in two forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt; has "saved memories" — an explicit, user-editable list of facts that ChatGPT chose to remember across conversations — and "reference chat history" (launched April 2025), which implicitly draws on patterns from past chats. Saved memories are auditable: you can open Settings → Personalization → Manage memory and see exactly what is stored. Reference chat history is not auditable — you cannot see what it has inferred. ChatGPT Projects adds a Project Memory scope that captures facts within a specific project workspace, isolated from other projects and from main chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Projects&lt;/strong&gt; maintains a project-level instruction set and uploaded file context, scoped per project, persisting across all conversations in that project. Unlike ChatGPT's saved memories, Claude Projects does not automatically extract facts from conversations — knowledge is added explicitly via the instruction set or uploaded files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini&lt;/strong&gt; offers workspace-scoped memory through Gemini Apps Activity, manageable through your Google Account privacy dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The common constraint:&lt;/strong&gt; all of these live inside the model provider's servers, scoped to the model's own interface. They do not follow your agents into code.&lt;/p&gt;

&lt;p&gt;When your Claude Code session ends, Claude's project memory does not inject into your next Cursor session. When ChatGPT remembers you prefer Python, your custom CLI agent does not know that. Model-native memory exists in one silo, per provider, per interface.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://gptprompts.ai/chatgpt-memory-guide" rel="noopener noreferrer"&gt;ChatGPT Memory Guide 2026&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What an agent memory layer adds
&lt;/h2&gt;

&lt;p&gt;An agent memory layer runs in your application, not the model provider's server. It gives you four things model-native memory cannot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portability.&lt;/strong&gt; The memory store is a resource your code owns. If you switch from Claude to GPT-4o, or from Cursor to a custom CLI, the memory follows automatically — no migration, no re-learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programmatic read/write.&lt;/strong&gt; Your code can store a fact at runtime (&lt;code&gt;plur_learn&lt;/code&gt;, &lt;code&gt;mem0.add&lt;/code&gt;), retrieve it on the next run (&lt;code&gt;plur_recall&lt;/code&gt;, &lt;code&gt;mem0.search&lt;/code&gt;), and update or delete it via API. Model-native memory cannot be written to by your code — only the model and the user can modify it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auditability.&lt;/strong&gt; With file-based memory systems like PLUR, you can open the store with a text editor, &lt;code&gt;grep&lt;/code&gt; for specific facts, and see exactly what the agent knows and when it learned each item. With vector-based stores like Mem0, you can query the API. With model-native memory, you are limited to what the provider's UI exposes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deletion control.&lt;/strong&gt; You can implement right-to-be-forgotten policies, purge all facts about a specific user, or wipe session state programmatically. Model-native memory deletion goes through the provider's interface, not your code.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://fountaincity.tech/resources/blog/how-to-build-and-operate-ai-agent-memory-in-2026/" rel="noopener noreferrer"&gt;How to Build AI Agent Memory in 2026&lt;/a&gt;, &lt;a href="https://www.graphlit.com/blog/survey-of-ai-agent-memory-frameworks" rel="noopener noreferrer"&gt;AI Agent Memory Frameworks in 2026&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The complement frame: different jobs, use both
&lt;/h2&gt;

&lt;p&gt;Model-native memory is useful for: "Remember I prefer Python over JavaScript" — a conversational preference stored in the model's own interface, useful when you are talking directly to ChatGPT or Claude.&lt;/p&gt;

&lt;p&gt;Agent memory is useful for: "Remember the architecture decision we made last sprint, the user's confirmed preferences across three tools, and the intermediate results from yesterday's research loop" — operational knowledge your code needs to function, across tools, overnight, in pipelines.&lt;/p&gt;

&lt;p&gt;The right setup for most production agent deployments: use model-native memory for its intended purpose (conversational recall in the model's own interface), and add an agent memory layer for programmatic recall in your code.&lt;/p&gt;




&lt;h2&gt;
  
  
  PLUR as the cross-tool layer
&lt;/h2&gt;

&lt;p&gt;PLUR stores memories as open-format engrams in a local directory (&lt;code&gt;~/.plur/&lt;/code&gt;). Any MCP-compatible tool — Claude Code, Cursor, Hermes, OpenClaw, or a custom CLI — reads and writes the same directory without additional configuration. When you switch between tools, the memory follows automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install once — works across all your MCP-compatible tools&lt;/span&gt;
npx @plur-ai/mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From any session, &lt;code&gt;plur_recall&lt;/code&gt; queries the store; &lt;code&gt;plur_learn&lt;/code&gt; adds to it. The same &lt;code&gt;~/.plur/&lt;/code&gt; directory is shared. This is the portability that model-native memory cannot provide: one memory store, every tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Model-native memory&lt;/th&gt;
&lt;th&gt;Agent memory layer (e.g. PLUR)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where it lives&lt;/td&gt;
&lt;td&gt;Model provider's server&lt;/td&gt;
&lt;td&gt;Your application / local directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;That model's interface only&lt;/td&gt;
&lt;td&gt;Any tool that speaks MCP or the API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set by&lt;/td&gt;
&lt;td&gt;User + model (conversational)&lt;/td&gt;
&lt;td&gt;Your code (programmatic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read by your code&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tool portable&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditable in full&lt;/td&gt;
&lt;td&gt;Partially (saved memories only)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion via your code&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works without a chat interface&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I still need an agent memory layer if ChatGPT already has memory?&lt;/strong&gt;&lt;br&gt;
Yes, if you are building agents in code. ChatGPT memory is scoped to the ChatGPT interface — it does not follow your agents into Cursor, Claude Code, a custom CLI, or overnight pipelines. An agent memory layer stores facts in your application, accessible from any tool that queries it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between model memory and agent memory?&lt;/strong&gt;&lt;br&gt;
Model memory (ChatGPT saved memories, Claude Projects, Gemini) is conversational memory stored on the model provider's server, accessible only through that model's interface. Agent memory is operational memory stored in your application, accessible by your code, portable across tools. The same agent can use both: model memory for interface-level recall, agent memory for cross-session and cross-tool recall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Claude Projects memory compare to agent memory?&lt;/strong&gt;&lt;br&gt;
Claude Projects memory captures facts within a project session and persists them for future sessions in that project. It is scoped to Anthropic's interface and cannot be read or written by external code. Agent memory (Mem0, PLUR, Zep) is stored in your application and is accessible from any code that calls the memory API — including code running outside any Claude interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use agent memory alongside a model's built-in memory?&lt;/strong&gt;&lt;br&gt;
Yes, and this is the recommended approach. Use model-native memory for conversational recall within that model's interface. Use agent memory for facts your code needs to access, persist across tools, or control programmatically. The two stores do not conflict — they serve different retrieval paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT vs Mem0 vs PLUR — what should I use for AI memory?&lt;/strong&gt;&lt;br&gt;
These are not direct alternatives. ChatGPT memory serves the ChatGPT web interface. Mem0 and PLUR are agent memory layers for use in code. If you are building agents: Mem0 for general personalization, PLUR if you need cross-tool portability and open-format storage. Use ChatGPT memory in addition to — not instead of — a dedicated agent memory layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://gptprompts.ai/chatgpt-memory-guide" rel="noopener noreferrer"&gt;ChatGPT Memory: Complete Guide for 2026&lt;/a&gt; — gptprompts.ai&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.graphlit.com/blog/survey-of-ai-agent-memory-frameworks" rel="noopener noreferrer"&gt;AI Agent Memory Frameworks in 2026: Memory vs. Context&lt;/a&gt; — Graphlit Blog&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fountaincity.tech/resources/blog/how-to-build-and-operate-ai-agent-memory-in-2026/" rel="noopener noreferrer"&gt;How to Build AI Agent Memory in 2026&lt;/a&gt; — Fountain City&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.mayhemcode.com/2026/07/ai-memory-problem-2026-risks-in-chatgpt.html" rel="noopener noreferrer"&gt;AI Memory Problem 2026: Risks in ChatGPT, Claude, Gemini&lt;/a&gt; — MayhemCode&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/plur-ai/plur" rel="noopener noreferrer"&gt;PLUR open-format engram memory&lt;/a&gt; — GitHub&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>memory</category>
    </item>
  </channel>
</rss>
