<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Letta Memgpt Memory on RockB</title><link>https://baeseokjae.github.io/tags/letta-memgpt-memory/</link><description>Recent content in Letta Memgpt Memory on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 08 Oct 2026 09:55:00 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/letta-memgpt-memory/index.xml" rel="self" type="application/rss+xml"/><item><title>Agent Memory Write-Path Reliability: A Reproducible Evaluation Protocol</title><link>https://baeseokjae.github.io/posts/agent-memory-write-path-reliability-2026/</link><pubDate>Thu, 08 Oct 2026 09:55:00 +0000</pubDate><guid>https://baeseokjae.github.io/posts/agent-memory-write-path-reliability-2026/</guid><description>Recall benchmarks do not tell you whether a fact is recorded, updated, contradicted or deleted. A five-metric, artifact-hashed protocol for testing the agent-memory write path.</description><content:encoded><![CDATA[<p>Selecting an agent-memory system on retrieval quality is measuring half the system. The half that produces confidently-wrong agents in production is the write path — whether a fact is actually recorded, whether an update supersedes the old value, whether a contradiction is flagged or silently averaged, and whether a delete truly removes the fact from every store it touched. Almost nobody publishes how to measure that.</p>
<p>This article is a fixed, reproducible evaluation protocol for the write path, and it ships the working parts: a controlled dataset, a generic harness with a documented adapter contract, a scoring sheet, and deterministic tests that prove every promised measure is runnable. It reports no vendor numbers of its own. That is deliberate: the deliverable is the protocol, and it is built so the person who runs it publishes the result — never a vendor benchmark reused as if it were an independent measurement.</p>
<h2 id="why-the-write-path-is-the-failure-surface">Why the write path is the failure surface</h2>
<p>Recall benchmarks answer one question: given a store that already contains the right fact, can the system retrieve it? They say nothing about how the fact got there, what happened when it changed, or whether it left when it was deleted. Those are the failure modes users actually experience:</p>
<ul>
<li>A deleted preference still surfaces because it was removed from the vector store but not from the entity or graph store.</li>
<li>A corrected fact coexists with its stale twin, and retrieval returns whichever scored slightly higher.</li>
<li>A contradiction between two sources is silently resolved by a summarizer, so the agent answers confidently with no record that the inputs disagreed.</li>
<li>A fact is recorded, but nothing traces it back to the message that produced it, so no one can audit why the agent believes it.</li>
</ul>
<p>Each of these is a <em>write-path</em> defect, and each survives every retrieval benchmark in current use. You can be at the top of a recall leaderboard and still ship an agent that insists a user&rsquo;s employer is a company they left two years ago.</p>
<h2 id="what-the-published-benchmarks-actually-measure">What the published benchmarks actually measure</h2>
<p>The memory benchmarks that drive procurement today were built for retrieval and question answering, not for write correctness.</p>
<p>MemGPT introduced the <em>Deep Memory Retrieval</em> (DMR) benchmark alongside virtual context management, framing evaluation as whether a system can answer questions over a large conversation history (<a href="https://arxiv.org/abs/2310.08560">MemGPT paper, arXiv:2310.08560</a>). LoCoMo added a very-long-term conversational dataset — 300 turns and roughly 9K tokens per conversation across up to 35 sessions — and scored question answering, event summarization and multimodal dialogue generation (<a href="https://arxiv.org/abs/2402.17753">LoCoMo paper, arXiv:2402.17753</a>). Zep reports out-performing MemGPT on DMR (94.8% versus 93.4%) and improvements of up to 18.5% on LongMemEval with a reported 90% latency reduction, through its Graphiti temporal knowledge graph (<a href="https://arxiv.org/abs/2501.13956">Zep paper, arXiv:2501.13956</a>).</p>
<p>The closest to write correctness is LongMemEval, which explicitly defines five core long-term memory abilities: information extraction, multi-session reasoning, temporal reasoning, knowledge updates, and abstention. It embeds 500 curated questions in scalable chat histories and reports that commercial assistants and long-context models show a 30% accuracy drop on memorizing information across sustained interactions (<a href="https://arxiv.org/abs/2410.10813">LongMemEval paper, arXiv:2410.10813</a>).</p>
<p>Two of those five abilities — knowledge updates and abstention — touch the write path, which is why LongMemEval is the right benchmark to build on rather than duplicate. But it scores <em>end-to-end answer accuracy</em>, not the state of each written fact. A team cannot read the LongMemEval output and learn whether one specific deleted fact stopped surfacing, or whether one specific contradiction was flagged. The write path is the unmeasured variable inside a benchmark that comes closest to touching it.</p>
<h2 id="the-five-quantities-that-define-write-path-reliability">The five quantities that define write-path reliability</h2>
<p>A write-path evaluation needs a small number of quantities that map to the four things a memory system must do — record, update, resolve contradictions, delete — plus the audit trail. These five are measurable per fact and are scripted in the harness below:</p>
<ol>
<li><strong>Write success</strong> — after ingest, does an exact-match query return the fact? Measured as the share of ingests that are retrievable immediately afterward. A system that reports success but does not make the fact retrievable has failed at step one.</li>
<li><strong>Staleness after update</strong> — after a fact changes, does the <em>old</em> value stop surfacing on a &ldquo;what is true now&rdquo; query, and does the <em>new</em> value surface? Measured as the share of updates where the stale value is gone and the current value is served.</li>
<li><strong>Contradiction handling</strong> — when two sources assert incompatible values without an explicit update, is the conflict flagged, retained as history, or silently collapsed? Measured as the share of contradictions that leave an auditable trace rather than a single confident answer.</li>
<li><strong>Deletion effectiveness</strong> — after a delete, does the fact disappear from <em>every</em> path that could surface it: exact-match, semantic search, and any entity or graph store the delete touched? Measured as the share of deletes with no residual surface.</li>
<li><strong>Provenance traceability</strong> — can a derived fact be traced back to the raw record that produced it? Measured as the share of facts with an intact lineage from the returned memory to its source episode or message.</li>
</ol>
<p>The protocol also scores a sixth, cross-cutting signal — <strong>out-of-scope abstention</strong> — because a system that fabricates a plausible memory for a question whose answer was never ingested will also fabricate on the deletion and staleness probes. The first four quantities are behavioural and must be measured against the running system. Provenance is partly structural and can be read from the API surface, but a route existing is not evidence that it returns usable lineage, so it is scored the same way: by querying.</p>
<h2 id="the-protocol-you-can-actually-run">The protocol you can actually run</h2>
<p>The protocol is published in full, as files, so that two independent operators get comparable results. Everything lives under the article&rsquo;s evidence directory in the site repository:</p>
<ul>
<li><strong>Dataset</strong> — <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/dataset.json">dataset.json</a>: 40 write units across four types — 12 stable facts, 8 updates, 6 contradictions (12 assertions), 8 deletions — plus 6 out-of-scope probes whose answers are never ingested.</li>
<li><strong>Adapter contract + harness</strong> — <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/adapters.py">adapters.py</a> defines the one interface a system must implement; <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/run_protocol.py">run_protocol.py</a> drives any adapter through the fixed order and writes <code>transcript.json</code> and <code>scores.json</code>.</li>
<li><strong>Scoring sheet + tests</strong> — <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/test_protocol.py">test_protocol.py</a> checks every promised measure deterministically; <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/fixture_report.py">fixture_report.py</a> regenerates the fixture score sheet; <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/README.md">README.md</a> documents how to point the harness at a real system.</li>
</ul>
<p>The adapter is deliberately small. Point it at the system&rsquo;s own <em>documented</em> write API:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MemoryAdapter</span>(ABC):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">write</span>(self, item_id, text, scope): <span style="color:#f92672">...</span>            <span style="color:#75715e"># ingest one fact under a stable id</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">update</span>(self, item_id, new_text, scope): <span style="color:#f92672">...</span>       <span style="color:#75715e"># supersede the current value</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">delete</span>(self, item_id, scope): <span style="color:#f92672">...</span>                 <span style="color:#75715e"># remove from every store it touched</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">retrieve_exact</span>(self, item_id, scope): <span style="color:#f92672">...</span>         <span style="color:#75715e"># str | None</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">query</span>(self, question, scope): <span style="color:#f92672">...</span>                 <span style="color:#75715e"># str | None  (answer or abstain)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">semantic_hit</span>(self, text, scope): <span style="color:#f92672">...</span>              <span style="color:#75715e"># bool: search still surfaces it</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">provenance</span>(self, item_id, scope): <span style="color:#f92672">...</span>             <span style="color:#75715e"># list[str]; [] means no lineage</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">contradiction_trace</span>(self, question, scope): <span style="color:#f92672">...</span>   <span style="color:#75715e"># {&#34;flagged&#34;: bool, &#34;values&#34;: list[str]}</span>
</span></span></code></pre></div><p>Run it in three commands (Python 3.12, standard library only):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python3 test_protocol.py                                             <span style="color:#75715e"># fixture unit tests</span>
</span></span><span style="display:flex;"><span>python3 run_protocol.py --adapter fixture-reference --out $TMPDIR/out   <span style="color:#75715e"># reference run</span>
</span></span><span style="display:flex;"><span>python3 run_protocol.py --adapter fixture-write     --out $TMPDIR/out   <span style="color:#75715e"># one defect injected</span>
</span></span></code></pre></div><p>The harness emits <code>transcript.json</code> — the ordered, sanitized request/response log — and <code>scores.json</code>, which carries the per-item rows (the raw <code>pass</code>/detail for every fact) plus the six aggregate rates and a <code>transcript_sha256</code>. Every &ldquo;this system failed on delete&rdquo; statement you make must map to a transcript line and that hash; without it, it is an anecdote.</p>
<h2 id="fixture-self-check-fixture-only--not-a-vendor-measurement">Fixture self-check (fixture only — not a vendor measurement)</h2>
<p>Before the protocol is trustworthy, the harness and scorer must be. The shipped package includes a deterministic in-memory double — a synthetic adapter, <strong>not a vendor system</strong> — used purely to prove the machinery runs with no credentials, network or hosting. Running <code>python3 fixture_report.py</code> executes the ten deterministic unit tests and scores the reference double plus one single-defect double per measure. The recorded output is <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/fixture-tests.txt">fixture-tests.txt</a> alongside <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/fixture-report.json">fixture-report.json</a>, with the run&rsquo;s environment, commands and hashes recorded in <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/first-party-run.json">first-party-run.json</a>.</p>
<p>On 2026-10-08 (UTC) that run reported <code>RESULT: ran=10 failures=0 errors=0</code>, with the captured stdout hashed as <code>e07922fac4babc5d119a0433ccd327e2cc62c995d85eefdaa98a4fdfa26c14c4</code>. The capture normalizes only the wall-clock elapsed line (<code>Ran 10 tests in &lt;elapsed&gt;s</code>) so the recorded file is byte-reproducible across machines; every test outcome and the result line are preserved verbatim. The reference double scores 1.0 on all six measures (write-success 40/40, staleness 8/8, contradiction 6/6, deletion 8/8, provenance 20/20, out-of-scope 6/6). Each single-defect double then drops exactly its own measure and no other: the dropped-write double lands at write-success 39/40; the never-supersede double at staleness 0/8; the silent-collapse double at contradiction 5/6; the residue double at deletion 7/8; the no-lineage double at provenance 19/20; the fabricating double at out-of-scope 5/6. That is the property a scorer must have: a known injection moves its own column and leaves the others alone.</p>
<p>Read this for what it is. These are <strong>fixture results</strong>, produced by a synthetic double to validate the harness. They are not benchmarks of mem0, Graphiti, Letta or any other system, and no live-vendor run was performed while writing this article. When you point the same harness at a real system, you generate the vendor scores yourself; until then, that score sheet is a template.</p>
<h2 id="how-the-candidate-systems-differ-and-why-that-changes-the-test">How the candidate systems differ, and why that changes the test</h2>
<p>The three most-referenced open systems differ in exactly the way a write-path test is built to detect.</p>
<p><strong>mem0</strong> exposes the write path as first-class routes. Its OpenAPI spec (info version <code>v1</code>) documents collection write and delete on <code>/v1/memories/</code>, per-memory update and delete on <code>/v1/memories/{memory_id}/</code> (get, put, delete), and a per-memory history route <code>/v1/memories/{memory_id}/history/</code> (<a href="https://raw.githubusercontent.com/mem0ai/mem0/main/docs/openapi.json">mem0 OpenAPI spec</a>). That history route is the one to probe for provenance — but the route existing is not proof it answers usefully.</p>
<p>The delete itself is a multi-store, two-phase operation. In the SDK&rsquo;s <code>_delete_memory</code>, deletion removes the vector record, then writes a <code>DELETE</code> row into the history database with <code>is_deleted=1</code>, and — unless skipped — removes the memory from the entity store. <code>delete_all</code> batches, requires at least one filter, and stops when it sees a repeated batch (<a href="https://raw.githubusercontent.com/mem0ai/mem0/main/mem0/memory/main.py">mem0 memory/main.py</a>). That structure is the reason a single vector-store query can over-report deletion success: the vector record can be gone while entity-store cleanup did not run. A deletion-effectiveness test must query both the retrieval path and the entity or graph path — which is why the harness scores <code>retrieve_exact</code> and <code>semantic_hit</code> separately.</p>
<p><strong>Graphiti</strong>, Zep&rsquo;s open-source engine, takes the opposite design stance on updates. Facts carry validity windows; when information changes, old facts are <em>invalidated, not deleted</em>, and every entity and relationship traces back to the episodes — the raw data — that produced it. Its own comparison table lists &ldquo;automatic fact invalidation with temporal history preserved&rdquo; for contradiction handling and &ldquo;bi-temporal tracking&rdquo; with sub-second latency claims (<a href="https://raw.githubusercontent.com/getzep/graphiti/main/README.md">Graphiti README</a>). This design makes the staleness test <em>different</em>, not easier: an invalidated fact should not surface on a &ldquo;what is true now&rdquo; query but should still be recoverable as history, so the scoring sheet must distinguish &ldquo;stale value gone from current answers&rdquo; from &ldquo;stale value erased entirely&rdquo;. One of those is correctness; the other may be data loss, and the harness records both.</p>
<p>The public code surface you can fetch is retrieval-side: <code>graphiti_core/search/search.py</code> defines <code>search</code>, <code>edge_search</code>, <code>node_search</code>, <code>episode_search</code> and <code>community_search</code> with rerankers (<a href="https://raw.githubusercontent.com/getzep/graphiti/main/graphiti_core/search/search.py">Graphiti search.py</a>). That tells you where the write path is <em>not</em> — it must be driven through ingestion and invalidation directly, rather than inferred from a search API.</p>
<p><strong>Letta</strong> carries the MemGPT lineage, and its README states the current source now lives in <code>letta-ai/letta-code</code> while the historical <code>letta-ai/letta</code> tree keeps the retired V1 API server on an <code>archive</code> branch, with existing tags and releases preserved for reproducibility (<a href="https://raw.githubusercontent.com/letta-ai/letta/main/README.md">Letta README</a>). The practical consequence for a test: pin a concrete package version, not a project name. &ldquo;Letta&rdquo; and &ldquo;MemGPT&rdquo; have each referred to different codebases at different times, so a result attributed to either without a version tag is not reproducible.</p>
<p>Pinned versions as of 2026-10-08: mem0 release <code>ts-v3.3.1</code> (published 2026-09-25), Graphiti <code>v0.30.2</code> (2026-09-08), Letta <code>0.16.8</code> (2026-05-14). All three repositories are Apache-2.0, and each had commits pushed within days of that date: mem0 66,806 stars, Graphiti 31,547, Letta 25,074 (<a href="https://api.github.com/repos/mem0ai/mem0/releases/latest">mem0 latest release</a>, <a href="https://api.github.com/repos/getzep/graphiti/releases/latest">Graphiti latest release</a>, <a href="https://api.github.com/repos/letta-ai/letta/releases/latest">Letta latest release</a>, <a href="https://api.github.com/repos/mem0ai/mem0">mem0 repo</a>, <a href="https://api.github.com/repos/getzep/graphiti">Graphiti repo</a>, <a href="https://api.github.com/repos/letta-ai/letta">Letta repo</a>).</p>
<h2 id="reading-vendor-numbers-honestly">Reading vendor numbers honestly</h2>
<p>Vendor benchmark figures are not cross-comparable without a pinned model stack, and the vendors sometimes say so themselves. mem0&rsquo;s README reports a new memory algorithm with LoCoMo 92.5 (from 71.4), LongMemEval 94.4 (from 67.8) and BEAM 64.1 at 1M tokens — and states those scores &ldquo;reflect Mem0&rsquo;s managed platform, which includes proprietary optimizations not available in the open-source SDK; open-source users should expect&rdquo; lower results (<a href="https://raw.githubusercontent.com/mem0ai/mem0/main/README.md">mem0 README</a>). That footnote is the whole point of the discipline this protocol enforces: a self-reported, platform-specific number is a vendor claim, and it is never a substitute for a result the operator produced on the exact version being deployed.</p>
<p>The same caution applies to the Zep figures above. They are the authors&rsquo; measurements on a documented setup, not an independent reproduction, and benchmark results apply to the version and harness they were measured on — not automatically to a later release or a different hosting mode.</p>
<h2 id="running-the-protocol-on-your-stack">Running the protocol on your stack</h2>
<p>The protocol is deliberately small enough to run in an afternoon per system:</p>
<ol>
<li>Keep the shipped <a href="https://github.com/baeseokjae/baeseokjae.github.io/blob/main/research/evidence/agent-memory-write-path-reliability-2026/protocol/dataset.json">dataset.json</a> unchanged, and pin one system version plus one model in the transcript header.</li>
<li>Implement <code>MemoryAdapter</code> against the system&rsquo;s <em>documented</em> write API — ingest, update, delete, and a query path for each. Do not infer write behaviour from a search endpoint.</li>
<li>Run <code>run_protocol.py</code> against your adapter, save <code>transcript.json</code>, and record its hash with the exact date, commit or release tag, and model.</li>
<li>Score the rates from the raw rows, then re-read the deletion rows by hand once — multi-store deletes are where the automated check is most likely to be wrong.</li>
<li>Repeat for a second system with the same dataset, and publish both score sheets together.</li>
</ol>
<p>What a failing score looks like in production is specific and worth naming in advance. A high write-success rate with a low staleness rate means the agent will keep citing superseded facts. A low contradiction rate means it will answer confidently where its inputs disagreed. A low deletion rate means a &ldquo;forget this&rdquo; instruction will appear to work and then resurface weeks later. A low provenance rate means no incident involving a bad memory can be root-caused. Report all five; a single headline number hides which failure you are buying.</p>
<h2 id="limitations-and-what-this-protocol-cannot-tell-you">Limitations and what this protocol cannot tell you</h2>
<ul>
<li><strong>It is a protocol plus a fixture self-check, not a vendor result.</strong> The only numbers reported here come from the synthetic double and prove the harness runs; no run against a live vendor system was performed while writing, and none is implied.</li>
<li><strong>Demand figures are carried, not re-measured.</strong> The cluster-level search impressions that motivate this topic come from the operator&rsquo;s own Google Search Console and Bing exports, not from a third-party volume tool, and no keyword-difficulty number is asserted anywhere here.</li>
<li><strong>Vendor benchmark figures are attributed, not reproduced.</strong> The mem0 and Zep numbers above are the vendors&rsquo; own published claims, scoped to their setups and dates.</li>
<li><strong>API route presence is not behavioural evidence.</strong> A documented delete route does not tell you the delete is complete across stores; that is exactly what the protocol measures.</li>
<li><strong>Fixture adapters are doubles, not systems.</strong> The in-memory reference adapter is a synthetic control for the scorer; its 1.0 rates are a self-test of the harness, never a claim about any product.</li>
<li><strong>Version and time bounds.</strong> Results are only meaningful pinned to a version and date; write-path semantics can change between releases.</li>
<li><strong>What it leaves out.</strong> Multi-tenant isolation, latency and cost under concurrent load, and long-horizon fact churn are out of scope. This protocol measures whether individual facts are correctly written, updated, contradicted, deleted and traced — not how the system performs under production traffic.</li>
</ul>
<h2 id="related-reading">Related reading</h2>
<p>For the retrieval and architecture side of the same cluster, see the <a href="https://baeseokjae.github.io/posts/agent-memory-architecture-guide-2026/">agent memory architecture guide</a> and the <a href="https://baeseokjae.github.io/posts/zep-ai-agent-memory-review-2026/">Zep and Graphiti review</a>. Both cover how these systems retrieve; this protocol covers whether they write correctly in the first place.</p>
<h2 id="primary-sources">Primary sources</h2>
<p>Primary artifacts were fetched on 2026-10-08 (UTC); raw bytes and hashes are recorded with the research brief that accompanies this article.</p>
<ul>
<li>Zep paper (DMR 94.8% vs 93.4%, LongMemEval up to 18.5%, 90% latency reduction; published 2025-01-20) — <a href="https://arxiv.org/abs/2501.13956">https://arxiv.org/abs/2501.13956</a></li>
<li>MemGPT paper (Deep Memory Retrieval; virtual context management; published 2023-10-12) — <a href="https://arxiv.org/abs/2310.08560">https://arxiv.org/abs/2310.08560</a></li>
<li>LoCoMo paper (300 turns, ~9K tokens, up to 35 sessions; published 2024-02-27) — <a href="https://arxiv.org/abs/2402.17753">https://arxiv.org/abs/2402.17753</a></li>
<li>LongMemEval paper (five abilities, 500 questions, 30% accuracy drop; published 2024-10-14) — <a href="https://arxiv.org/abs/2410.10813">https://arxiv.org/abs/2410.10813</a></li>
<li>Graphiti README (validity windows, invalidation not deletion, episode provenance) — <a href="https://raw.githubusercontent.com/getzep/graphiti/main/README.md">https://raw.githubusercontent.com/getzep/graphiti/main/README.md</a></li>
<li>mem0 README (April 2026 algorithm table: LoCoMo 92.5, LongMemEval 94.4, BEAM 64.1; managed-platform caveat) — <a href="https://raw.githubusercontent.com/mem0ai/mem0/main/README.md">https://raw.githubusercontent.com/mem0ai/mem0/main/README.md</a></li>
<li>Letta README (MemGPT successor; current source in letta-ai/letta-code; retired V1 API on the archive branch) — <a href="https://raw.githubusercontent.com/letta-ai/letta/main/README.md">https://raw.githubusercontent.com/letta-ai/letta/main/README.md</a></li>
<li>mem0 OpenAPI spec (write/update/delete/history routes; info version v1) — <a href="https://raw.githubusercontent.com/mem0ai/mem0/main/docs/openapi.json">https://raw.githubusercontent.com/mem0ai/mem0/main/docs/openapi.json</a></li>
<li>mem0 SDK memory/main.py (two-phase multi-store delete; delete_all filter guard and repeated-batch stop) — <a href="https://raw.githubusercontent.com/mem0ai/mem0/main/mem0/memory/main.py">https://raw.githubusercontent.com/mem0ai/mem0/main/mem0/memory/main.py</a></li>
<li>Graphiti search/search.py (retrieval-side module: search, edge_search, node_search, episode_search, community_search) — <a href="https://raw.githubusercontent.com/getzep/graphiti/main/graphiti_core/search/search.py">https://raw.githubusercontent.com/getzep/graphiti/main/graphiti_core/search/search.py</a></li>
<li>mem0 latest release (ts-v3.3.1, 2026-09-25) — <a href="https://api.github.com/repos/mem0ai/mem0/releases/latest">https://api.github.com/repos/mem0ai/mem0/releases/latest</a></li>
<li>Graphiti latest release (v0.30.2, 2026-09-08) — <a href="https://api.github.com/repos/getzep/graphiti/releases/latest">https://api.github.com/repos/getzep/graphiti/releases/latest</a></li>
<li>Letta latest release (0.16.8, 2026-05-14) — <a href="https://api.github.com/repos/letta-ai/letta/releases/latest">https://api.github.com/repos/letta-ai/letta/releases/latest</a></li>
<li>mem0 repository metadata (66,806 stars, Apache-2.0, last push 2026-10-07) — <a href="https://api.github.com/repos/mem0ai/mem0">https://api.github.com/repos/mem0ai/mem0</a></li>
<li>Graphiti repository metadata (31,547 stars, Apache-2.0, last push 2026-10-07) — <a href="https://api.github.com/repos/getzep/graphiti">https://api.github.com/repos/getzep/graphiti</a></li>
<li>Letta repository metadata (25,074 stars, Apache-2.0, last push 2026-09-10) — <a href="https://api.github.com/repos/letta-ai/letta">https://api.github.com/repos/letta-ai/letta</a></li>
</ul>
]]></content:encoded></item></channel></rss>