<?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: lanbass869-cell</title>
    <description>The latest articles on DEV Community by lanbass869-cell (@lanbass869cell).</description>
    <link>https://dev.to/lanbass869cell</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%2F4156498%2Faaddd45e-5cad-46a1-92e0-f315b155167b.png</url>
      <title>DEV Community: lanbass869-cell</title>
      <link>https://dev.to/lanbass869cell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lanbass869cell"/>
    <language>en</language>
    <item>
      <title>I wrote a system that remembers 1,390 things my AI assistants told me — using symlinks, no cloud</title>
      <dc:creator>lanbass869-cell</dc:creator>
      <pubDate>Fri, 02 Oct 2026 06:22:36 +0000</pubDate>
      <link>https://dev.to/lanbass869cell/i-built-a-cross-client-memory-hub-for-ai-agents-heres-what-i-learned-418l</link>
      <guid>https://dev.to/lanbass869cell/i-built-a-cross-client-memory-hub-for-ai-agents-heres-what-i-learned-418l</guid>
      <description>&lt;p&gt;Does your AI do this? Monday you tell Claude Code "don't touch the auth file."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wednesday it modifies the auth file. Tuesday you tell Cursor "this project uses&lt;br&gt;
PostgreSQL." Thursday Copilot assumes MySQL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three AI assistants. Three separate memories. None of them know what the others know.&lt;/p&gt;

&lt;p&gt;This is the most common complaint from anyone using AI coding tools in 2026. And it&lt;br&gt;
hasn't been solved.&lt;/p&gt;
&lt;h2&gt;
  
  
  The biggest thread on this topic proves the pain is real
&lt;/h2&gt;

&lt;p&gt;Last December, someone posted "Stop Claude Code from forgetting everything" on&lt;br&gt;
Hacker News. It got &lt;strong&gt;202 points and 225 comments&lt;/strong&gt;. The top comment: &lt;em&gt;"I absolutely&lt;br&gt;
love this concept! It's like the thing that I've been looking for my whole life."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That solution (ensue-skill) is a Shell script for Claude Code only. It can't share&lt;br&gt;
memory across clients. Claude's memory doesn't flow to Cursor. Codex can't read what&lt;br&gt;
Windsurf learned.&lt;/p&gt;
&lt;h2&gt;
  
  
  My approach: use the OS's oldest capability
&lt;/h2&gt;

&lt;p&gt;I didn't invent a new storage format, a new vector database, or a new embedding model.&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;symlinks&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.workbuddy/MEMORY.md     → junction → ~/.agents/memory/MEMORY.md
~/.workbuddy-ai/MEMORY.md  → symlink  → same file
~/.codex/AGENTS.md         → symlink  → same file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three clients, three different MCP config formats, three different memory injection&lt;br&gt;
methods. But their memory files are &lt;strong&gt;literally the same file at the filesystem level&lt;/strong&gt;.&lt;br&gt;
No sync logic. No API calls. No network requests. Write something in one client, and&lt;br&gt;
every other client sees it &lt;strong&gt;immediately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;"The symlink is the deploy step." Deployment is building a file pointer.&lt;/p&gt;

&lt;h2&gt;
  
  
  But sharing was the easy part
&lt;/h2&gt;

&lt;p&gt;The hard problems surfaced after sharing worked:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who wrote this?&lt;/strong&gt; Five clients writing to one SQLite file — attribution was chaos.&lt;br&gt;
→ Mandatory &lt;code&gt;--source&lt;/code&gt; tagging. The MCP server auto-detects the calling client from&lt;br&gt;
the parent process name (WorkBuddy.exe → workbuddy, CodeBuddy.exe → codebuddy).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I trace corrections?&lt;/strong&gt; → Bi-temporal tracking. &lt;code&gt;valid_from&lt;/code&gt;/&lt;code&gt;valid_to&lt;/code&gt; for&lt;br&gt;
when the fact is true in the real world, &lt;code&gt;recorded_at&lt;/code&gt;/&lt;code&gt;invalidated_at&lt;/code&gt; for when the&lt;br&gt;
system learned it. Supersession never deletes — it builds a pointer chain. You can&lt;br&gt;
ask "what did the system believe X was last Wednesday?" and get an accurate answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concurrent writes?&lt;/strong&gt; → Built hubguard: &lt;code&gt;msvcrt.locking&lt;/code&gt; cross-process mutex,&lt;br&gt;
temp-file + &lt;code&gt;os.replace&lt;/code&gt; atomic writes (handling symlinks, hardlinks, and Windows&lt;br&gt;
file locking — three separate bugs), SQLite WAL mode for concurrent readers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you find things?&lt;/strong&gt; → Four-way retrieval (FTS5 BM25 + keyword IDF +&lt;br&gt;
bge-m3 vectors + ASCII exact match) → Reciprocal Rank Fusion → bge-reranker&lt;br&gt;
→ temporal decay → Q-Value weighting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if it's not in the database?&lt;/strong&gt; → Refusal gate. When keyword coverage and&lt;br&gt;
vector similarity both fall below thresholds, it returns "no relevant information&lt;br&gt;
found" instead of letting the LLM hallucinate. This is the design I'm most proud of:&lt;br&gt;
&lt;strong&gt;a memory system brave enough to say "I don't know."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A bug that humbled me
&lt;/h2&gt;

&lt;p&gt;After 22 releases, I ran a security audit and typed one command: &lt;code&gt;PRAGMA journal_mode&lt;/code&gt;.&lt;br&gt;
It returned &lt;code&gt;delete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;My README had said "SQLite WAL mode" since version 0.1.0a1. &lt;strong&gt;Twenty-two releases,&lt;br&gt;
never enabled.&lt;/strong&gt; One line of code fixed it. But the lesson stuck: you need a system&lt;br&gt;
that's willing to say "I might be wrong."&lt;/p&gt;

&lt;p&gt;Now I have a scoring card called hub_score with a built-in warning: &lt;em&gt;"The evaluator&lt;br&gt;
itself is the object being evaluated. If the score is high, suspect the test."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Real numbers after 19 days of production use
&lt;/h2&gt;

&lt;p&gt;Not a demo. I use this every single day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1,390 memories&lt;/strong&gt; shared by 5 AI clients through one physical SQLite file&lt;/li&gt;
&lt;li&gt;Every memory carries source attribution, bi-temporal tracking, supersession chain&lt;/li&gt;
&lt;li&gt;62.6% strict / 55.7% judge / 75.7% EAF on LongMemEval 500Q (our own harness,
disclosed failure modes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refusal benchmark&lt;/strong&gt;: 22 negative samples, 41% intercepted, zero false refusals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;39 automated tests&lt;/strong&gt;, CI green, self-check 11/11&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you want your AI to remember what you said
&lt;/h2&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;memtether
memtether init    &lt;span class="c"&gt;# auto-detects your AI clients and writes MCP configs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;23 client adapters. One SQLite file. No cloud. No subscription. Apache-2.0.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/MemTether/MemTether" rel="noopener noreferrer"&gt;MemTether/MemTether&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're also working on agent memory, multi-client AI tooling, or local-first&lt;br&gt;
infrastructure, I'd genuinely love to compare notes — hit me up or open an issue on&lt;br&gt;
the repo.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Update (October 2026)
&lt;/h2&gt;

&lt;p&gt;MemTether has grown significantly since I wrote this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;567 tests passing&lt;/strong&gt; (up from 39 at initial submission)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9 MCP tools&lt;/strong&gt; including &lt;code&gt;correct_memory&lt;/code&gt;, &lt;code&gt;retire_memory&lt;/code&gt;, &lt;code&gt;pin_memory&lt;/code&gt;, &lt;code&gt;as_of_query&lt;/code&gt;, and &lt;code&gt;timeline&lt;/code&gt; — agents can now govern memory, not just search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;proj_judge score: 96/100&lt;/strong&gt; (governance tests 11→27)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Published on PyPI, GitHub Releases, and MCP Registry&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predicate extraction quality&lt;/strong&gt;: prose-junk entities 56%→0%, multi-word entities fixed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic rebuild quota&lt;/strong&gt;: &lt;code&gt;max(static_base, 5% of type count)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External hash-chain anchors&lt;/strong&gt; for tamper-evidence beyond the local DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install: &lt;code&gt;pip install memtether&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/MemTether/MemTether" rel="noopener noreferrer"&gt;MemTether/MemTether&lt;/a&gt;&lt;/p&gt;

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