<?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: Anton Teterichev</title>
    <description>The latest articles on DEV Community by Anton Teterichev (@xchucx).</description>
    <link>https://dev.to/xchucx</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3963115%2F098839f6-f88c-41ef-bd2e-e30e6d71eba4.jpg</url>
      <title>DEV Community: Anton Teterichev</title>
      <link>https://dev.to/xchucx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xchucx"/>
    <language>en</language>
    <item>
      <title>I got tired of re-explaining my codebase to every coding agent — so I made critical memory live in the repo next to code</title>
      <dc:creator>Anton Teterichev</dc:creator>
      <pubDate>Tue, 02 Jun 2026 08:51:04 +0000</pubDate>
      <link>https://dev.to/xchucx/i-got-tired-of-re-explaining-my-codebase-to-every-coding-agent-so-i-made-critical-memory-live-in-33i1</link>
      <guid>https://dev.to/xchucx/i-got-tired-of-re-explaining-my-codebase-to-every-coding-agent-so-i-made-critical-memory-live-in-33i1</guid>
      <description>&lt;p&gt;I switch coding agents constantly.&lt;/p&gt;

&lt;p&gt;Opus is ahead one month, some GPT the next, Gemini gets better, Cursor changes, local setups become good enough for some tasks, on top of that, usage limits and token policies keep forcing me to jump tools &lt;em&gt;mid-project&lt;/em&gt; just to keep shipping.&lt;/p&gt;

&lt;p&gt;Every switch has the same annoying failure mode:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the new agent is looking at the same repo, but it has lost the project's working memory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It re-scans the tree to orient itself.&lt;/li&gt;
&lt;li&gt;It re-asks things we already settled.&lt;/li&gt;
&lt;li&gt;It misses local conventions.&lt;/li&gt;
&lt;li&gt;It repeats footguns we already hit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;And I paste the same thing into the prompt for the Nth time:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;here's the architecture, we decided X, don't do Y&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All the context I had built up lived inside one tool's session and died the moment I moved.&lt;/p&gt;

&lt;p&gt;So I built a fix for myself, then cleaned it up and open-sourced it.&lt;/p&gt;

&lt;p&gt;The project is called &lt;a href="https://github.com/xChuCx/agent-memory" rel="noopener noreferrer"&gt;&lt;code&gt;agent-memory&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every serious repo has context that is not obvious from the files alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why a module is shaped a certain way&lt;/li&gt;
&lt;li&gt;which convention is local to this project&lt;/li&gt;
&lt;li&gt;which bug we already hit&lt;/li&gt;
&lt;li&gt;what this branch is currently trying to finish&lt;/li&gt;
&lt;li&gt;which approach we explicitly decided not to use&lt;/li&gt;
&lt;li&gt;which API looks tempting but should not be used&lt;/li&gt;
&lt;li&gt;which test command is the one that actually matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of that context belongs in docs. Some belongs in code comments. Some belongs in &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, or &lt;code&gt;.cursor/rules&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;But a lot of it is living project memory.&lt;/p&gt;

&lt;p&gt;It changes as the branch evolves.&lt;/p&gt;

&lt;p&gt;It gets discovered while working.&lt;/p&gt;

&lt;p&gt;It is useful to the next agent, but not always worth turning into permanent documentation.&lt;/p&gt;

&lt;p&gt;And if it only lives in a chat session, it is basically disposable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: boring on purpose
&lt;/h2&gt;

&lt;p&gt;Keep the project's living context: current task state, decisions, conventions, known footguns &lt;strong&gt;as plain Markdown committed to the repo&lt;/strong&gt;, and expose it to the agent over &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;The agent pulls relevant context in one MCP call instead of re-reading the tree every session, and I stop hand-feeding decisions into the prompt because they already live in memory and surface when relevant.&lt;/p&gt;

&lt;p&gt;The short version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memory lives next to the code&lt;/li&gt;
&lt;li&gt;Markdown is the source of truth&lt;/li&gt;
&lt;li&gt;agents fetch relevant context over MCP&lt;/li&gt;
&lt;li&gt;durable updates stage for human review&lt;/li&gt;
&lt;li&gt;the local index is rebuildable&lt;/li&gt;
&lt;li&gt;no cloud memory layer&lt;/li&gt;
&lt;li&gt;no vendor lock-in&lt;/li&gt;
&lt;li&gt;no opaque database as the only source of truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;stop re-teaching the same repo to every coding agent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What the agent gets
&lt;/h2&gt;

&lt;p&gt;Agents access memory through three MCP tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;memory.fetch_context&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch relevant project context for the current task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;memory.propose_update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Propose a durable memory update for human review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;memory.status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inspect memory and index status&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A typical workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent starts a task.&lt;/li&gt;
&lt;li&gt;It calls &lt;code&gt;memory.fetch_context&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It gets a compact pack of relevant decisions, conventions, pitfalls, and module notes.&lt;/li&gt;
&lt;li&gt;During the task, it discovers something durable.&lt;/li&gt;
&lt;li&gt;It calls &lt;code&gt;memory.propose_update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The update is staged.&lt;/li&gt;
&lt;li&gt;A human reviews the diff and applies or rejects it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent can propose.&lt;/p&gt;

&lt;p&gt;The human decides.&lt;/p&gt;

&lt;p&gt;That boundary matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;agent-memory&lt;/code&gt; is a small Go tool: CGo-free, Apache-2.0 licensed, and designed to run locally as an MCP server.&lt;/p&gt;

&lt;p&gt;Add it to &lt;code&gt;.mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&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;"agent-memory"&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;"@xchucx/agent-memory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--root"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;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;Or run it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; @xchucx/agent-memory mcp &lt;span class="nt"&gt;--root&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialize memory in a repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; @xchucx/agent-memory init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, your coding agent can ask the repo for memory instead of starting cold every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payoff: portability
&lt;/h2&gt;

&lt;p&gt;The non-obvious payoff is &lt;strong&gt;portability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because the memory is files in &lt;em&gt;my&lt;/em&gt; repo — not a vendor's cloud, not one IDE's private state, not one chat session — Claude Code, Cursor, Gemini, and MCP-capable local agents can all read the same project memory.&lt;/p&gt;

&lt;p&gt;Switching tools no longer resets the project context.&lt;/p&gt;

&lt;p&gt;The context travels with the code.&lt;/p&gt;

&lt;p&gt;That matters more as agent workflows become less tied to one model or one IDE.&lt;/p&gt;

&lt;p&gt;I do not want my repo's working memory to depend on whichever agent happens to be best this month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just AGENTS.md or CLAUDE.md?
&lt;/h2&gt;

&lt;p&gt;I use those too.&lt;/p&gt;

&lt;p&gt;But for me, files like &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, and &lt;code&gt;.cursor/rules&lt;/code&gt; work best as static instructions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to run tests&lt;/li&gt;
&lt;li&gt;coding style&lt;/li&gt;
&lt;li&gt;repo rules&lt;/li&gt;
&lt;li&gt;preferred libraries&lt;/li&gt;
&lt;li&gt;commands the agent should use&lt;/li&gt;
&lt;li&gt;commands the agent should avoid&lt;/li&gt;
&lt;li&gt;"always do X"&lt;/li&gt;
&lt;li&gt;"never do Y"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They tell the agent how to behave.&lt;/p&gt;

&lt;p&gt;What I was missing was living project memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what this branch is currently trying to finish&lt;/li&gt;
&lt;li&gt;why we chose one implementation over another&lt;/li&gt;
&lt;li&gt;which module owns a particular flow&lt;/li&gt;
&lt;li&gt;which bug or footgun we discovered yesterday&lt;/li&gt;
&lt;li&gt;which convention exists but is not obvious from one file&lt;/li&gt;
&lt;li&gt;what the next agent should know before touching this part of the repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That kind of information changes more often.&lt;/p&gt;

&lt;p&gt;It can become stale.&lt;/p&gt;

&lt;p&gt;It needs review.&lt;/p&gt;

&lt;p&gt;It needs to be searchable.&lt;/p&gt;

&lt;p&gt;And it should not turn static instruction files into a junk drawer of rules, TODOs, old session notes, warnings, decisions, and random reminders.&lt;/p&gt;

&lt;p&gt;So I see them as different layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Lifecycle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;CLAUDE.md&lt;/code&gt; / &lt;code&gt;.cursor/rules&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Stable instructions and repo rules&lt;/td&gt;
&lt;td&gt;Edited rarely, read as policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor or IDE memory&lt;/td&gt;
&lt;td&gt;Personal preferences and tool-specific state&lt;/td&gt;
&lt;td&gt;Useful, but usually trapped in one environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent-memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Decisions, conventions, pitfalls, task state, module notes&lt;/td&gt;
&lt;td&gt;Changes over time, reviewed like project context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal is not to replace instruction files.&lt;/p&gt;

&lt;p&gt;The goal is to stop overloading them.&lt;/p&gt;

&lt;p&gt;Static instructions and living project memory deserve different lifecycles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three decisions that shaped it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Markdown in your repo, not a database
&lt;/h3&gt;

&lt;p&gt;I wanted the memory to be boring and inspectable.&lt;/p&gt;

&lt;p&gt;So the source of truth is plain Markdown inside the repo.&lt;/p&gt;

&lt;p&gt;I can open it. Read it. Edit it. &lt;code&gt;git diff&lt;/code&gt; it.&lt;/p&gt;

&lt;p&gt;There is a SQLite index, but it is only a local shadow index for retrieval. It is fully regenerable from the Markdown files.&lt;/p&gt;

&lt;p&gt;The important part is that the memory itself is not trapped inside an opaque database.&lt;/p&gt;

&lt;p&gt;It lives next to the code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Human-in-the-loop writes
&lt;/h3&gt;

&lt;p&gt;I did not want the agent silently rewriting shared project memory.&lt;/p&gt;

&lt;p&gt;That felt wrong.&lt;/p&gt;

&lt;p&gt;If a coding agent learns something durable: a decision, a convention, a module fact, a recurring footgun — it should be able to propose an update.&lt;/p&gt;

&lt;p&gt;But that update should not automatically become shared truth.&lt;/p&gt;

&lt;p&gt;So durable changes stage for review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agent-memory review &lt;span class="nt"&gt;--diff&lt;/span&gt;
agent-memory apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent proposes.&lt;/p&gt;

&lt;p&gt;I approve.&lt;/p&gt;

&lt;p&gt;That keeps memory useful without turning it into a pile of unreviewed agent guesses.&lt;/p&gt;

&lt;p&gt;Shared memory should be treated like shared project knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. No vector databases or embeddings
&lt;/h3&gt;

&lt;p&gt;When building AI memory tools, the industry reflex is to reach for vector databases and embedding models.&lt;/p&gt;

&lt;p&gt;I get why.&lt;/p&gt;

&lt;p&gt;Embeddings are powerful, and for large fuzzy knowledge bases they can be the right tool.&lt;/p&gt;

&lt;p&gt;But for this project I wanted something simpler.&lt;/p&gt;

&lt;p&gt;Project memory is not the whole internet. It is usually dozens or hundreds of small, human-written sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decisions&lt;/li&gt;
&lt;li&gt;conventions&lt;/li&gt;
&lt;li&gt;pitfalls&lt;/li&gt;
&lt;li&gt;module notes&lt;/li&gt;
&lt;li&gt;task state&lt;/li&gt;
&lt;li&gt;local project facts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For that scale, a vector database felt like the wrong default.&lt;/p&gt;

&lt;p&gt;Embeddings add another moving part: API keys, model choice, regeneration, drift, or heavier local setup.&lt;/p&gt;

&lt;p&gt;More importantly, you cannot easily &lt;code&gt;git commit&lt;/code&gt; a vector database and share it with your team as project knowledge.&lt;/p&gt;

&lt;p&gt;So I skipped all of that.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;agent-memory&lt;/code&gt; uses a local SQLite shadow index with standard full-text search via FTS5/BM25.&lt;/p&gt;

&lt;p&gt;The source of truth is still Markdown.&lt;/p&gt;

&lt;p&gt;The index is entirely regenerable from the Markdown files.&lt;/p&gt;

&lt;p&gt;That gives fast, budgeted retrieval with zero external services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no embedding API&lt;/li&gt;
&lt;li&gt;no vector database&lt;/li&gt;
&lt;li&gt;no cloud dependency&lt;/li&gt;
&lt;li&gt;no model-specific memory format&lt;/li&gt;
&lt;li&gt;works offline&lt;/li&gt;
&lt;li&gt;works with local agents&lt;/li&gt;
&lt;li&gt;works on airplanes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the current benchmark, retrieval gets the right section into the top 5 for &lt;strong&gt;98%&lt;/strong&gt; of labeled queries.&lt;/p&gt;

&lt;p&gt;That is recall@5 0.98.&lt;/p&gt;

&lt;p&gt;Is FTS5/BM25 the fanciest possible retrieval method?&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;But it is boring, inspectable, portable, and good enough for repo-scale project memory.&lt;/p&gt;

&lt;p&gt;That tradeoff is exactly the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What belongs in memory?
&lt;/h2&gt;

&lt;p&gt;Not everything.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;agent-memory&lt;/code&gt; works best for compact, durable project knowledge.&lt;/p&gt;

&lt;p&gt;Good candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture decisions&lt;/li&gt;
&lt;li&gt;project conventions&lt;/li&gt;
&lt;li&gt;known pitfalls&lt;/li&gt;
&lt;li&gt;module ownership notes&lt;/li&gt;
&lt;li&gt;current branch or task state&lt;/li&gt;
&lt;li&gt;integration quirks&lt;/li&gt;
&lt;li&gt;test or build gotchas&lt;/li&gt;
&lt;li&gt;things that future agents should not rediscover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;huge logs&lt;/li&gt;
&lt;li&gt;temporary scratchpad noise&lt;/li&gt;
&lt;li&gt;secrets&lt;/li&gt;
&lt;li&gt;raw chat transcripts&lt;/li&gt;
&lt;li&gt;anything you would not want in the repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My rule of thumb:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;if a memory entry would make no sense in code review, it probably does not belong there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The hard part: does it actually work?
&lt;/h2&gt;

&lt;p&gt;I did not want to ship a vanity number.&lt;/p&gt;

&lt;p&gt;So I tried to measure it.&lt;/p&gt;

&lt;p&gt;This turned into the most interesting part of the project.&lt;/p&gt;

&lt;p&gt;There are three different questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does retrieval return the right memory sections?&lt;/li&gt;
&lt;li&gt;Does a lesson recorded in one session survive into the next?&lt;/li&gt;
&lt;li&gt;Does the agent actually behave differently because of memory?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first two are relatively easy to measure honestly.&lt;/p&gt;

&lt;p&gt;The third one is where things get messy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieval
&lt;/h3&gt;

&lt;p&gt;Retrieval is deterministic.&lt;/p&gt;

&lt;p&gt;On a labeled benchmark, the right section lands in the top 5 for &lt;strong&gt;98%&lt;/strong&gt; of queries.&lt;/p&gt;

&lt;p&gt;That is recall@5 0.98.&lt;/p&gt;

&lt;p&gt;It runs in CI.&lt;/p&gt;

&lt;p&gt;That does not prove the whole product works, but it does prove that the local retrieval layer is not just vibes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuity
&lt;/h3&gt;

&lt;p&gt;Continuity asks a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;does a lesson recorded in session 1 survive into session 2?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Through the real record → persist → retrieve loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5/5&lt;/strong&gt; scenarios with memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0/5&lt;/strong&gt; without memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also deterministic.&lt;/p&gt;

&lt;p&gt;This is the core thing I wanted: the next agent should not rediscover what the previous agent already learned.&lt;/p&gt;

&lt;h3&gt;
  
  
  Behavioural impact
&lt;/h3&gt;

&lt;p&gt;The hardest question is not retrieval.&lt;/p&gt;

&lt;p&gt;It is behavioural impact:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;does the agent actually make better decisions because memory exists?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My early usage and test runs are positive: agents do reuse remembered decisions, avoid repeated footguns, and recover project context faster when memory is available.&lt;/p&gt;

&lt;p&gt;But I do not want to publish a clean-looking number until I can stand behind the benchmark.&lt;/p&gt;

&lt;p&gt;A proper behavioural benchmark is surprisingly hard to isolate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modern coding agents already use many sources of context&lt;/li&gt;
&lt;li&gt;some tools have their own cross-session memory&lt;/li&gt;
&lt;li&gt;user-scoped MCP servers can leak into supposedly isolated runs&lt;/li&gt;
&lt;li&gt;model behaviour varies across runs&lt;/li&gt;
&lt;li&gt;"success" is harder to score than retrieval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So for now, I treat behavioural results as promising but not fully benchmarked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;agent-memory&lt;/code&gt; is not a replacement for reading the code.&lt;/p&gt;

&lt;p&gt;The agent still needs to inspect files, run tests, and understand the actual implementation.&lt;/p&gt;

&lt;p&gt;It is not a vector database for everything you have ever done.&lt;/p&gt;

&lt;p&gt;It is not a raw transcript store.&lt;/p&gt;

&lt;p&gt;It is not meant to let agents silently rewrite project truth.&lt;/p&gt;

&lt;p&gt;The point is narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;keep durable project context close to the repo, make it retrievable by agents, and make changes reviewable by humans.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is it.&lt;/p&gt;

&lt;p&gt;Boring on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on a real repo
&lt;/h2&gt;

&lt;p&gt;The project is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/xChuCx/agent-memory" rel="noopener noreferrer"&gt;&lt;code&gt;github.com/xChuCx/agent-memory&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The best test is not a toy demo.&lt;/p&gt;

&lt;p&gt;The best test is an annoying real project where you keep repeating the same context to agents again and again.&lt;/p&gt;

&lt;p&gt;Try it there.&lt;/p&gt;

&lt;p&gt;I'm especially interested in feedback from people using multiple coding agents across the same codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does the memory structure fit your workflow?&lt;/li&gt;
&lt;li&gt;are the MCP tools the right primitives?&lt;/li&gt;
&lt;li&gt;what should be easier in the review/apply flow?&lt;/li&gt;
&lt;li&gt;which clients should be supported better?&lt;/li&gt;
&lt;li&gt;what kind of memory would you trust agents to propose?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/xChuCx/agent-memory" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try agent-memory on GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;If you want portable, reviewable project memory to become a normal layer for coding agents, a star helps other people find the project.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
      <category>go</category>
    </item>
  </channel>
</rss>
