<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Lore Blog</title><description>Product notes, engineering updates, and memory architecture deep dives from Lore.</description><link>https://withlore.ai/</link><language>en-us</language><atom:link href="https://withlore.ai/rss.xml" rel="self" type="application/rss+xml"/><item><title>The Agentic Memory Trap</title><link>https://withlore.ai/blog/the-agentic-memory-trap/</link><guid isPermaLink="true">https://withlore.ai/blog/the-agentic-memory-trap/</guid><description>Lore is a vendor-neutral proxy that runs on your machine. Plain Markdown and an open SQLite database, run by a fair-source engine.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In April, Harrison Chase wrote an essay called
&lt;a href=&quot;https://blog.langchain.com/your-harness-your-memory/&quot;&gt;Your harness, your memory&lt;/a&gt;.
He named what the AI tooling industry has been circling for a year.
Memory is the new lock-in. The harness owns it by default, and the
harness is what every platform is racing to be.&lt;/p&gt;
&lt;p&gt;He was right about the diagnosis. He was not entirely accurate with
the prescription. He builds LangChain, so he is primed to think in
terms of harness-first. Broaden your thinking and there is a better,
more independent way, and Lore is the proof.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“There is sometimes sentiment that memory is a standalone service,
separate from any particular harness. At this point in time, that
is not true.”
— Harrison Chase, &lt;a href=&quot;https://blog.langchain.com/your-harness-your-memory/&quot;&gt;Your harness, your memory&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The analogy is wrong on the merits too. Memory is part of your brain.
Agent harnesses are like your body, the limbs and everything. You
don’t move your memory to your limbs. You move your memory to your
brain.&lt;/p&gt;
&lt;p&gt;Our argument is equally self-serving as LangChain’s. The difference
is: you can move away from Lore and keep your organized SQLite
database to yourself. That is true open memory.&lt;/p&gt;
&lt;p&gt;The time has come. Lore is the standalone memory service, and it is
the architecture that gets you out of the trap.&lt;/p&gt;
&lt;h2 id=&quot;the-platform-owns-your-data-you-should&quot;&gt;The platform owns your data. You should.&lt;/h2&gt;
&lt;p&gt;When a closed platform builds “agent memory,” it stores your team’s
decisions in a proprietary database behind an API. Retrieval shapes
the agent, and the shape of the agent is the shape of the moat.
Switch IDEs, switch models, switch anything, and the team rebuilds
months of context from scratch. The lock-in is the product.&lt;/p&gt;
&lt;p&gt;Harrison names three levels. The mild one stores state on the
provider’s server so you cannot move threads between models. The bad
one runs a closed harness that interacts with memory in ways you
cannot see, and the artifacts are not portable. The worst one puts
everything behind an API, including long-term memory, and you own
none of it. Anthropic’s Claude Managed Agents lives in that worst
camp. Codex’s open-source harness produces an encrypted compaction
summary nothing outside OpenAI can read, so it creeps toward the
worst too. The incentive is everywhere, and it points the same way.&lt;/p&gt;
&lt;p&gt;Six months of careful work, six months of capturing a team’s taste,
and a vendor change returns the team to zero.&lt;/p&gt;
&lt;h2 id=&quot;lore-is-local-first-and-we-want-to-keep-it-that-way&quot;&gt;Lore is local-first and we want to keep it that way&lt;/h2&gt;
&lt;p&gt;Lore is a vendor-neutral proxy that sits between your harness and
your model. The whole engine runs on your machine. The memory lives
in your repo and your local machine as plain Markdown and an open
SQLite database. You can read, query, and edit it with or without
Lore.&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;https://withlore.ai/_preview/pr-1211/_astro/ec.w36nc.css&quot;&gt;&lt;script type=&quot;module&quot; src=&quot;https://withlore.ai/_preview/pr-1211/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;flowchart LR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;H[&quot;&amp;lt;b&amp;gt;Harness&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;Claude Code · OpenCode · Pi · Codex&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;L[&quot;&amp;lt;b&amp;gt;Lore&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;local-first, vendor-neutral&amp;lt;br/&amp;gt;.lore.md + lore.db&amp;lt;br/&amp;gt;local, sqlite &amp;amp; markdown&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;A[&quot;&amp;lt;b&amp;gt;Model Provider API&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;Anthropic · OpenAI · Google · others&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;H --&amp;gt; L&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;L --&amp;gt; A&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;classDef lore fill:#c4ddc7,stroke:#1a3320,stroke-width:2px,color:#1a3320&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;classDef ext fill:#ececec,stroke:#888,color:#333&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;class L lore&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt;class H,A ext&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;flowchart LR    H[&amp;quot;&lt;b&gt;Harness&lt;/b&gt;&lt;br/&gt;Claude Code · OpenCode · Pi · Codex&amp;quot;]    L[&amp;quot;&lt;b&gt;Lore&lt;/b&gt;&lt;br/&gt;local-first, vendor-neutral&lt;br/&gt;.lore.md + lore.db&lt;br/&gt;local, sqlite &amp;amp; markdown&amp;quot;]    A[&amp;quot;&lt;b&gt;Model Provider API&lt;/b&gt;&lt;br/&gt;Anthropic · OpenAI · Google · others&amp;quot;]    H --&gt; L    L --&gt; A    classDef lore fill:#c4ddc7,stroke:#1a3320,stroke-width:2px,color:#1a3320    classDef ext fill:#ececec,stroke:#888,color:#333    class L lore    class H,A ext&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;The LLM is the cognition, Lore is the memory layer. They form the brain. The harness is the body, the actuator.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.lore.md&lt;/code&gt;&lt;/strong&gt; at the root of your repo. The curated knowledge the
team has reviewed and merged. Version-controlled, PR-reviewable,
human-readable Markdown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A local SQLite database&lt;/strong&gt; at &lt;code&gt;~/.local/share/lore/lore.db&lt;/code&gt;. The
full record: raw conversations, distillations, long-term memory,
entities. Open schema, queryable with &lt;code&gt;sqlite3&lt;/code&gt;, exportable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The engine that ties them together is fair source
(FSL-1.1-Apache-2.0). The code that touches your tokens is right
there to read, and it turns into Apache 2.0 on a timer.&lt;/p&gt;
&lt;p&gt;The SQLite file is the vector database. The vectors ride alongside
the temporal messages, the distillations, and the long-term memory
entries, in one open file. No separate vector store, no separate
process, no separate bill. When a team changes a memory entry, the
engine picks up the change on the next session and re-embeds the
affected entries. Fast and transparent, on your hardware.&lt;/p&gt;
&lt;p&gt;A few months after that initial post, Harrison himself claimed that
memory systems sit beside the harness. In
&lt;a href=&quot;https://blog.langchain.com/wiki-memory/&quot;&gt;Wiki Memory&lt;/a&gt;, he wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“This pattern also sits adjacent to memory systems like LangMem,
Letta, Mem0, and Zep. Those systems attack the broader agent-memory
problem, while wiki memory is notable because it often uses the
simplest possible substrate: files.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All these systems, including Mem0, don’t really solve the immediate
context problem. Lore unifies this and, unsurprisingly, by fusing two
approaches together: locality &amp;amp; files along with long-term memory.&lt;/p&gt;
&lt;h2 id=&quot;the-vendor-route-vs-the-local-first-route&quot;&gt;The vendor route vs the local-first route&lt;/h2&gt;
&lt;p&gt;Harrison is right. You shouldn’t put your memory into a vendor’s hands.
The lock-in is real, and the way to escape it is to keep the data
on your machine, local, sqlite &amp;amp; markdown, where you can read with
&lt;code&gt;sqlite3&lt;/code&gt; and edit with any text editor. To change a memory entry,
you edit the file. To delete an entry, you delete the row. To export
the corpus, you copy the file. To move to a different vendor, you
point the new tool at the same files.&lt;/p&gt;
&lt;p&gt;The same logic applies to the harness. You wouldn’t lock yourself
into a single LLM provider, and you shouldn’t lock yourself into a
single harness either. Claude Code today, Pi tomorrow, Codex next
quarter, something new next year. The memory should outlast the
harness. The harness is the part you swap; the artifact is the part
that stays.&lt;/p&gt;
&lt;p&gt;When your team is ready to share, the sync engine works the way a
good group chat does: end-to-end encrypted, scoped to the entries
you explicitly approve, and the relay never sees plaintext. The
keys stay with the participants. Sharing is opt-in, per entry, and
reversible.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;We have talked before about
&lt;a href=&quot;https://withlore.ai/blog/distill-your-own-knowledge/&quot;&gt;why knowledge lives in token space, not in weights&lt;/a&gt;.
The same logic applies to where the token-space lives. A database in
someone else’s cloud is halfway there. A database or engine tied to
your harness might be better. A replaceable middle layer for memory,
all data local and owned by you, is the rest of the way.&lt;/p&gt;
&lt;p&gt;Models will keep changing. They always do. Every part of the AI
tooling stack above the model is genuinely up for grabs right now.
The part that should not be up for grabs is who owns your team’s
data. That belongs to the team, on infrastructure the team controls.&lt;/p&gt;
&lt;p&gt;Lore is local-first. We aim to keep it that way.&lt;/p&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try it&lt;/h2&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame is-terminal not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;-fsSL&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#ECC48D;--1:#3B61B0&quot;&gt;https://withlore.ai/install&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#7FDBCA;--1:#096E72&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;lore&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#ECC48D;--1:#3B61B0&quot;&gt;run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;curl -fsSL https://withlore.ai/install | bashlore run&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;After a few sessions, open &lt;code&gt;.lore.md&lt;/code&gt; and the database at
&lt;code&gt;~/.local/share/lore/lore.db&lt;/code&gt;. Read what your agent has written
down. Open a PR when it gets something wrong. That is the workflow.&lt;/p&gt;
</content:encoded><dc:creator>Burak Yigit Kaya</dc:creator><category>infrastructure</category><category>open standards</category><category>data</category><category>ownership</category></item><item><title>The Semantic Linter: Automating reviews without losing touch</title><link>https://withlore.ai/blog/review-with-memory/</link><guid isPermaLink="true">https://withlore.ai/blog/review-with-memory/</guid><description>You can&apos;t write down your taste. But you keep working by it, and Lore learns it the way an apprentice would, then helps enforce it in code review.</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;About ten years ago, when machine learning got good enough that you could train a real classifier
without a research lab, I had a specific project in mind. I wanted to train something that reviewed
code the way I did, so I could step back from reviewing every change without the codebase drifting.
I never built it. I never had enough of the right data, and I never had the time.&lt;/p&gt;
&lt;p&gt;The debate about review has finally caught up with the project I never built, and I think both
sides are half right.&lt;/p&gt;
&lt;h2 id=&quot;the-same-complaint-from-two-sides&quot;&gt;The same complaint from two sides&lt;/h2&gt;
&lt;p&gt;One camp says the whole point of writing code with agents is that a human still reads every line
before it ships. Slow down, look closely, stay in control. The other camp, often the same people
on a different day, says the job has turned into something worse: you don’t write much anymore, you
sit and read change after change the machine produced, and it is dull and a little soul-crushing.
Reviewing slop, they call it.&lt;/p&gt;
&lt;p&gt;Those are two views of one loss. Review used to be where judgment happened and where the
team learned how the codebase was meant to work. Now it has shrunk to a checkpoint you sign off on.
The “read every line” camp wants to protect what review was. The “this is soul-crushing” camp is
telling you it has already gone. Both are reacting to one loss.&lt;/p&gt;
&lt;p&gt;A colleague told me the human side of this a few months ago. When he joined the team, he said, he
learned a lot from getting detailed reviews from me, the kind where you explain not just what to
change but why the team works this way. What he picked up wasn’t a list of rules. It was a way of
working. Now we mostly work on our own, agents write and review most of the code, and he misses it.
He wasn’t complaining about speed. He was noticing that something had stopped passing between us.&lt;/p&gt;
&lt;p&gt;Armin Ronacher &lt;a href=&quot;https://lucumr.pocoo.org/2026/7/13/the-tower/&quot;&gt;wrote about this&lt;/a&gt; from the other
end. The shared understanding a team keeps of its own system used to be a byproduct of the friction
in working together, and agents have quietly removed the friction. My colleague felt that up close.&lt;/p&gt;
&lt;h2 id=&quot;what-review-was-really-passing-along&quot;&gt;What review was really passing along&lt;/h2&gt;
&lt;p&gt;A review was never only a gate. It was how one person’s standard reached everyone else. You don’t
mock the database in integration tests, and here’s the migration bug that taught us why. Deploys go
from the release branch, because of the time they didn’t. The standard arrived with its reason, at
the moment it mattered, to whoever was on the change.&lt;/p&gt;
&lt;p&gt;When that stops, the standards don’t disappear. They stop showing up when they’re needed, and six
months later a pull request quietly brings back the exact thing the team decided against. Nobody
used bad judgment. The change looks reasonable on its own. What was missing was a reviewer who knew
the standard and noticed, right then, that the change cut against it.&lt;/p&gt;
&lt;h2 id=&quot;you-are-what-you-do-not-what-you-write-down&quot;&gt;You are what you do, not what you write down&lt;/h2&gt;
&lt;p&gt;That is the hard part, and it’s why the project I never got to needed data I never had. A review
teaches the person reading it, but it’s a poor thing to learn from at scale. It’s the verdict, not
the reasoning: “don’t do this here” lands, and the thinking that led me there stays in my head. Most
of what makes a good reviewer good is taste, built from years of doing the work, and you can’t write
it down. Ask someone to put their standards in a document and you get a thin, lifeless version of
what they actually do. But you keep doing it, review after review, and the standard is real even
when the document isn’t.&lt;/p&gt;
&lt;p&gt;That’s the shift that makes this possible now. Lore watches the work the way an apprentice does. It
sits alongside your sessions, distills what you decide and why, and writes it down for you as
&lt;a href=&quot;https://withlore.ai/docs/team-memory/&quot;&gt;&lt;code&gt;.lore.md&lt;/code&gt;&lt;/a&gt;, a version-controlled file of the team’s decisions and gotchas,
reviewed in pull requests like any other file. We’ve written before about
&lt;a href=&quot;https://withlore.ai/blog/distill-your-own-knowledge/&quot;&gt;why knowledge lives in text&lt;/a&gt;. You don’t write docs that go
stale in a few weeks. You work, and it learns.&lt;/p&gt;
&lt;p&gt;An apprentice is not you, and I want to be honest about the ceiling. It won’t learn your deepest
judgment, the calls that come from taste you couldn’t explain if you tried. But it learns the
standards you set often enough, and that turns out to be a lot of them.&lt;/p&gt;
&lt;h2 id=&quot;the-apprentice-reviews-the-code&quot;&gt;The apprentice reviews the code&lt;/h2&gt;
&lt;p&gt;This is the thing I wanted ten years ago, and it turns out the achievable part was the part that
mattered. Not a machine that thinks like me. One that learned the standards and speaks up when a
change goes against one.&lt;/p&gt;
&lt;p&gt;So we built a check that reads the diff against what Lore has learned. On every pull request, the
&lt;a href=&quot;https://withlore.ai/docs/guides/semantic-linter/&quot;&gt;semantic linter&lt;/a&gt; takes the changes and the standards from
&lt;code&gt;.lore.md&lt;/code&gt; and asks, for the pairs that look related, one question: does this change go against
something the team decided? When the answer looks like yes, it says so, as an annotation next to
the line, with the reason attached. The reason is the point. It’s the part of the review that used
to pass from person to person and stopped.&lt;/p&gt;
&lt;p&gt;It’s a judge, not a rule engine. “Never mock the database in integration tests” isn’t a pattern you
can match with a regex, and any lint rule that tried would be brittle and easy to route around. It’s
a meaning, and you can only check it by understanding what the change does and what the standard
intends. The honest cost is that a judge produces suspicions, not verdicts. It can be wrong, and we
designed around that instead of pretending otherwise.&lt;/p&gt;
&lt;h2 id=&quot;the-boring-part-handled&quot;&gt;The boring part, handled&lt;/h2&gt;
&lt;p&gt;If you’re in the “read every line” camp, what you’re rightly afraid of is a noisy check that blocks
work on a bad guess. We share that fear, so the linter ships advisory only. It never fails a build.
It leaves a note and a human decides. A check that guesses and can break CI would teach everyone to
ignore it inside a week.&lt;/p&gt;
&lt;p&gt;And if you’re in the “this is soul-crushing” camp, look at what it takes off you: the dull part,
checking every change against every standard the team ever set, which is the work no human does well
or enjoys. What’s left is the judgment, the taste, whether this is even the right change. The part
worth doing.&lt;/p&gt;
&lt;p&gt;A ladder above advisory is designed in. Once a team has watched how often the check is wrong, a
rule can graduate to a gate, with an override for the author who knows better. That part is still
coming. Today everything stays advisory on purpose, because the system should earn trust before it
can block anything.&lt;/p&gt;
&lt;h2 id=&quot;wheres-the-limit&quot;&gt;Where’s the limit?&lt;/h2&gt;
&lt;p&gt;I’m not claiming the reviewer goes away. On the contrary, we’re lightening the reviewer’s load so
they can do more of what’s valuable: real judgment and taste. Here’s the line: no reviewer can hold
every standard the team ever set and apply the right one at the right moment. That one job a system
does well, and handing it over costs you none of the taste you were afraid to lose. It gives you
back the attention for the parts that need a person, and brings back, a little, what used to pass
between people when they reviewed each other’s work.&lt;/p&gt;
&lt;p&gt;That’s the version of automated review I’d ask a doubter to try. Not a bot that approves or rejects
your PRs. An apprentice that learned how you work and speaks up when a change breaks from that, and
otherwise stays quiet.&lt;/p&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try it&lt;/h2&gt;
&lt;p&gt;Install Lore and let it learn from a few sessions:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;https://withlore.ai/_preview/pr-1211/_astro/ec.w36nc.css&quot;&gt;&lt;script type=&quot;module&quot; src=&quot;https://withlore.ai/_preview/pr-1211/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame is-terminal not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;-fsSL&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#ECC48D;--1:#3B61B0&quot;&gt;https://withlore.ai/install&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#7FDBCA;--1:#096E72&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;lore&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#ECC48D;--1:#3B61B0&quot;&gt;run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;curl -fsSL https://withlore.ai/install | bashlore run&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then run the check against any range and see what it flags:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame is-terminal not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;lore&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#ECC48D;--1:#3B61B0&quot;&gt;lint&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;--base&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#ECC48D;--1:#3B61B0&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#82AAFF;--1:#3B61B0&quot;&gt;--head&lt;/span&gt;&lt;span style=&quot;--0:#D6DEEB;--1:#403F53&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#ECC48D;--1:#3B61B0&quot;&gt;HEAD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;lore lint --base main --head HEAD&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;With no arguments it auto-detects the range. When you’re ready for CI, the
&lt;a href=&quot;https://withlore.ai/docs/guides/semantic-linter/&quot;&gt;semantic linter guide&lt;/a&gt; has a copy-paste GitHub Action.&lt;/p&gt;
</content:encoded><dc:creator>Burak Yigit Kaya</dc:creator><category>knowledge</category><category>code review</category><category>ci</category><category>agents</category></item><item><title>The compaction tax</title><link>https://withlore.ai/blog/the-compaction-tax/</link><guid isPermaLink="true">https://withlore.ai/blog/the-compaction-tax/</guid><description>A real coding-agent memory benchmark, with receipts. The two taxes memory puts on your dollars and your focus, each with a number attached.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We have made two arguments on this blog. In
&lt;a href=&quot;https://withlore.ai/blog/why-memory-is-not-enough&quot;&gt;Why memory is not enough&lt;/a&gt; we said a store off to the side
cannot save the session overflowing right now, because compaction runs whether or not it
is about to drop something you still need. In
&lt;a href=&quot;https://withlore.ai/blog/how-lore-remembers-and-forgets&quot;&gt;How Lore remembers, forgets, and changes its mind&lt;/a&gt;
we said capture has to be automatic, because memory you have to reach for is memory you
will forget to reach for.&lt;/p&gt;
&lt;p&gt;Arguments are cheap. So we built a benchmark and ran it, and this post is the receipts.&lt;/p&gt;
&lt;p&gt;Agents pay two taxes on memory today. The machine charges one, in dollars and lost
context. You charge yourself the other, in attention. We can now put a number on both.&lt;/p&gt;
&lt;h2 id=&quot;how-we-measured-it&quot;&gt;How we measured it&lt;/h2&gt;
&lt;p&gt;The full protocol is in the repo (see
&lt;a href=&quot;https://github.com/BYK/loreai/blob/main/packages/core/eval/live/METHODOLOGY.md&quot;&gt;the methodology&lt;/a&gt;),
and you can reproduce it with &lt;code&gt;lore eval&lt;/code&gt;. The short version:&lt;/p&gt;
&lt;p&gt;Every run drives a real OpenCode agent, turn by turn, against a real model. We plant four
values, stated once in passing, that you cannot guess from the code: an order status, a
sales channel, a region, a warehouse. If they show up in the file the agent writes at the
end, something carried them. The scorer checks for those four values by hand, so no model
grades its own homework. We ran it across three models, from cheaper everyday ones
(MiniMax-M3 and DeepSeek V4 Flash, capable but not frontier) up to a frontier flagship
(Claude Sonnet-5), because that split is where the two approaches part ways.&lt;/p&gt;
&lt;p&gt;This is not the first version of the benchmark. Like any real task, we had to iterate to
get numbers that were accurate, reliable, and realistic, especially when a result looked
too good for us. An early cut had the competitors at a flat zero everywhere; the cause
turned out to be ours, not theirs, and once we fixed it they tied us on the frontier model.
So now, before every run, we health-probe each memory backend: if it fails to come up we
drop the run as a harness artifact, and if it comes up fine but the model never calls it,
we count that as the real zero it is. The numbers below are the corrected ones.&lt;/p&gt;
&lt;p&gt;For the record, so you can reproduce it or pick it apart: we ran this in July 2026 on a
nightly Lore build (off &lt;code&gt;main&lt;/code&gt;, well ahead of the 0.37.0 release) driving our OpenCode fork
built on &lt;strong&gt;OpenCode 1.18.5&lt;/strong&gt;. The models were MiniMax-M3, DeepSeek V4 Flash, and Claude
Sonnet-5 (&lt;code&gt;claude-sonnet-5&lt;/code&gt;). The memory competitors were
&lt;a href=&quot;https://github.com/mem0ai/mem0&quot;&gt;mem0&lt;/a&gt; (mem0 cloud, via the official &lt;code&gt;mem0-mcp-server&lt;/code&gt;)
and &lt;a href=&quot;https://github.com/Aamirofficiall/mnemonic&quot;&gt;mnemonic&lt;/a&gt; 2.0.2 (the &lt;code&gt;mnemonic-ai&lt;/code&gt;
package), each given both a light “keep notes” instruction and a heavy mandatory-workflow
one, and we report the better of the two.&lt;/p&gt;
&lt;h2 id=&quot;the-first-tax-compaction&quot;&gt;The first tax: compaction&lt;/h2&gt;
&lt;p&gt;Put the agent in one long session and keep working until the window fills. Every major
client does the same thing at that point: it compacts, crushing the older turns into a
lossy summary and dropping the originals. That is the moment the facts you mentioned an
hour ago quietly fall out.&lt;/p&gt;
&lt;p&gt;One thing to be upfront about, because it shapes every token number in this post: we do
not wait for a real workload to slowly fill the window. We force it, by piping a large
reference blob into most turns, roughly 90K tokens a turn in this single-long task and a
somewhat smaller 64K a turn in the cross-session one (where it is the accumulation across
sessions, not the per-turn size, that fills the window). Think of each blob as one large
tool result, a big file the agent reads, a long log it pulls in, which is exactly the kind
of thing that fills a real context window. We do it this way because reproducing a genuine
multi-hour session that overflows on its own is slow and hard to hold steady across runs;
forcing the fill gives every arm the identical pressure on a benchmark timescale. The
consequence is that the absolute token and cost figures below are a product of that forced
fill, not a measurement of what a typical session costs, so read them as &lt;em&gt;relative&lt;/em&gt;
comparisons between arms under identical load, not as a bill you would see in normal use.&lt;/p&gt;
&lt;p&gt;Here is that session, sixteen scripted turns, with the four facts mentioned once near the
start, on the frontier model. The “steps” column is the agent’s own work, the model calls
and tool round-trips it took to get through those sixteen turns, so fewer is more
efficient:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sonnet-5, one long session&lt;/th&gt;
&lt;th&gt;retention&lt;/th&gt;
&lt;th&gt;compactions&lt;/th&gt;
&lt;th&gt;steps&lt;/th&gt;
&lt;th&gt;cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vanilla&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;$9.79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;53&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$9.54&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two things are happening at once. The vanilla agent compacts seven times and keeps one
probe run in five; the retention it does have is noisy, some runs recover a fact from their
own summary, most lose all four. Lore never compacts, because it manages the window on
every turn instead of waiting for it to overflow, and it keeps all four facts every run, in
fewer steps.&lt;/p&gt;
&lt;p&gt;The cost here is close to a tie, and that is the honest read: Lore lands just under vanilla,
about a quarter under a percent, not a headline saving. Lore’s figure is the whole of its
bill, the conversation plus the background distillation that captures memory; the background
worker is a small slice of the run (about nine cents here), and this benchmark is part of
why it is small. An earlier version showed the worker re-reading whole reference blobs it
did not need, so now Lore trims an oversized user blob down to the part that carries meaning
before it ever distills, and that trimming is in these numbers. Two further savings are not:
in real use the worker runs on a cheaper model than the conversation, and against Anthropic
or OpenAI its calls go through the batch API at half price, but this harness pins one model
per run and turns batching off so it can finish distilling before the next session (more on
that below). Even so, the point of this table is not the dollar column, it is the other two:
Lore keeps every fact and compacts zero times, where vanilla compacts seven and keeps almost
nothing. A compacting agent that loses the facts is not a cheaper way to succeed, it is a
more expensive way to fail.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-meters&quot; id=&quot;user-content-fnref-meters&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The pattern holds on a cheaper model, where the dollars are small enough to see the shape
plainly:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DeepSeek Flash, one long session&lt;/th&gt;
&lt;th&gt;retention&lt;/th&gt;
&lt;th&gt;compactions&lt;/th&gt;
&lt;th&gt;steps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vanilla&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;36&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The loss is quiet, which is what makes it easy to miss. Independent research on
context rot (&lt;a href=&quot;https://www.trychroma.com/research/context-rot&quot;&gt;Chroma’s report&lt;/a&gt;, and the
&lt;a href=&quot;https://github.com/Priyanshu-byte-coder/contextrot&quot;&gt;contextrot&lt;/a&gt; tool that measures it on
your own sessions) shows models degrade as their window fills. Compaction does not
announce itself. The agent keeps going, confident, having quietly forgotten.&lt;/p&gt;
&lt;h2 id=&quot;the-second-tax-remembering-to-remember&quot;&gt;The second tax: remembering to remember&lt;/h2&gt;
&lt;p&gt;Now the cross-session case, what most people mean by memory: something said in one
session, needed in a later, separate one. That is the job a memory store is built for, so
we put Lore next to two good ones:
&lt;a href=&quot;https://github.com/mem0ai/mem0&quot;&gt;mem0&lt;/a&gt; (cloud) and
&lt;a href=&quot;https://github.com/Aamirofficiall/mnemonic&quot;&gt;mnemonic&lt;/a&gt; (a local SQLite store, the closest
analogue to how Lore keeps things on your own disk).&lt;/p&gt;
&lt;p&gt;On the frontier model, every system with memory carried the facts, and Lore and vanilla
mark the two ends of the range:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sonnet-5, cross-session&lt;/th&gt;
&lt;th&gt;retention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vanilla&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mem0&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mnemonic&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That is the honest headline: a good store works, and on a capable model it works well. We
will not pretend otherwise. Every system had captured the facts; where the competitors miss
here it is the model failing to recall on a given run, not the store failing to hold. Even
so, on the frontier model the gap is narrow, and we would rather show the spread than round
it up to a tie.&lt;/p&gt;
&lt;p&gt;The difference shows up on the cheaper, everyday models, the kind you actually run at
scale:&lt;sup&gt;&lt;a href=&quot;#user-content-fn-zeros&quot; id=&quot;user-content-fnref-zeros&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;cross-session, cheaper model&lt;/th&gt;
&lt;th&gt;retention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vanilla&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lore (DeepSeek Flash)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mnemonic (DeepSeek Flash)&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mem0 (DeepSeek Flash)&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lore (MiniMax-M3)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mnemonic (MiniMax-M3)&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mem0 (MiniMax-M3)&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The gap is not about storage quality, we just saw the stores hold the same facts. It is
about who has to remember to use it. A store the agent drives only works if the agent
decides, on its own, to save the offhand value when it is mentioned, and then to go
looking for it later. When we traced the competitors’ misses, the pattern was almost
always the same: the agent never called the save step in the first session. The backend
was fine, the tool was there, the model just did not reach for it. An everyday model does
not reliably reach. Lore does not ask it to. It captures as the conversation happens,
with a dedicated background pass that runs whether or not the coding model thinks to, and
surfaces what is relevant on its own. So it does not hang on the model’s discipline on any
given turn.&lt;/p&gt;
&lt;p&gt;That is the attention tax made concrete. Every store the agent reaches for is a store
that depends on remembering to reach, and the further a model sits from the frontier, the
less reliably it reaches.&lt;/p&gt;
&lt;h2 id=&quot;what-the-stores-actually-held&quot;&gt;What the stores actually held&lt;/h2&gt;
&lt;p&gt;Because the interesting question is not just the score but what each system extracted, here
is the same fact, “every order defaults to channel WHOLESALE, region EMEA, warehouse WH-07,”
as each store captured it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lore&lt;/strong&gt;: &lt;em&gt;“Every order built in orderkit carries these fixed metadata fields:
channel=‘WHOLESALE’, region=‘EMEA’, warehouse_code=‘WH-07’. These are not optional,
always include them when constructing order objects.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mem0&lt;/strong&gt;: &lt;em&gt;“User defines that every order in orderkit includes fixed fields: channel set
to ‘WHOLESALE’, region set to ‘EMEA’, and warehouse_code set to ‘WH-07’.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mnemonic&lt;/strong&gt;: batched into a single note alongside the other conventions, terser, but
the values are all there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three are correct. Lore’s tends to carry a little more, the rationale, the “not
optional,” a cross-reference to the related convention, because a background pass with a
dedicated model has room to write more than a tool call squeezed into the coding agent’s
turn. It is a real edge, but a modest one. The decisive difference is not what gets
written, it is whether anything gets written at all without the agent being told to.&lt;/p&gt;
&lt;h2 id=&quot;what-it-costs-honestly&quot;&gt;What it costs, honestly&lt;/h2&gt;
&lt;p&gt;Cost is where memory tools get quiet, so here is ours out loud, including the part that
does not flatter us. On the cross-session run with Sonnet-5:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;measured cost&lt;/th&gt;
&lt;th&gt;third-party backend cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vanilla&lt;/td&gt;
&lt;td&gt;$3.92&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mem0&lt;/td&gt;
&lt;td&gt;$3.97&lt;/td&gt;
&lt;td&gt;mem0 cloud subscription, external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mnemonic&lt;/td&gt;
&lt;td&gt;$4.02&lt;/td&gt;
&lt;td&gt;Gemini (embeddings + extraction), external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$4.02&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Lore lands right on the vanilla line here, within run-to-run noise, and it did not
start there. Two things are true at once. The retention win is real: Lore held all four
facts on every run while vanilla held none, and on the cheaper models it held them where
the stores did not. And Lore gets there on the same bill as an agent that keeps nothing.
Both belong in the same paragraph, and the second one only became true because the
benchmark forced us to chase it.&lt;/p&gt;
&lt;p&gt;Where the cost went is worth being precise about, because the benchmark is what turned it
up. Lore’s figure is the whole bill: the conversation plus the background distillation, on
one key, about $0.28 of it the worker. The rest was prompt-cache churn, and measuring this
run is how we found it. When Lore first injects a session’s recalled memory it rewrites part
of the prefix, which busts the cache for that turn; on the single-breakpoint protocol this
benchmark runs through, that one rewrite re-priced far more of the prompt than it should
have. We landed three fixes off the back of it: one that stops the recalled-memory block
from busting the whole system prefix, one that stops the compression layer from oscillating
turn to turn, and one that anchors a stable cache breakpoint at the middle of the prompt so
an upstream cache eviction re-bills half the prefix at most instead of all of it. Together
they cut this cross-session figure from about $6.22 to the $4.02 above, driving the
one-turn cache spike that opened the gap down to nothing. We would rather publish the number we
now stand behind, and the road we took to it, than a prettier one we could not explain.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-meters&quot; id=&quot;user-content-fnref-meters-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The competitors’ lines also hide a cost this table cannot show. mem0 runs on a hosted
subscription; mnemonic’s extraction and embeddings run on Gemini. mem0’s is a flat monthly
fee, near nothing per run if you already pay it, a whole plan if you do not; the Gemini
spend is real but small, and lands on a separate bill rather than your model spend. Either
way it is off the bill we can show you, and all of Lore’s is on it.&lt;/p&gt;
&lt;p&gt;And Lore’s number here is pessimistic in one direction the others are not: as noted above,
the harness runs the worker on the same frontier model and with batching off, both of which
you avoid in normal use. Point the worker at a cheap model and that $0.28 bucket drops by
roughly ten times; run against Anthropic or OpenAI and the batch API halves it again. That
does not close the whole gap, but it is real, and it is on our side to keep closing.&lt;/p&gt;
&lt;p&gt;So the honest claim is precise. On this benchmark Lore keeps every fact, answers in fewer
steps, and puts its entire cost on one visible bill, and on the frontier cross-session case
it lands on the same bill as a vanilla agent that keeps nothing. The single-long frontier
run reads the same way, near-identical bills, one that keeps every fact against one that
keeps a fifth. You do not pay a premium to stop thinking about any of this, and you still
get to account for all of it.&lt;/p&gt;
&lt;h2 id=&quot;what-we-are-not-claiming&quot;&gt;What we are not claiming&lt;/h2&gt;
&lt;p&gt;The benchmark has limits and we would rather say them than have you find them.&lt;/p&gt;
&lt;p&gt;Start with the most obvious one: we built Lore, we designed this benchmark, we ran it,
and Lore comes out on top. That is a conflict of interest and you should read the numbers
with it in mind. The best evidence we can offer that we took it seriously is the audit we
mentioned up top: our first cut had the competitors at a flat zero, we did not like how
good that looked for us, we dug in, and the zero turned out to be our bug, not their
failure. We fixed it and the competitors climbed to near-parity on the frontier model. We
still almost certainly did not tune mem0 or mnemonic as well as their own authors would. If
you maintain one of these tools and we got your configuration wrong, tell us and we will
re-run it and update the numbers.&lt;/p&gt;
&lt;p&gt;We did not meter the competitors’ third-party backends ourselves, so their totals are
visible cost plus a small off-bill charge, not a full accounting. The reliability gap on
cheaper models is real, but on the frontier model it narrows to a near-tie, and we showed
that rather than bury it. On cost, Lore lands on the vanilla line on the frontier
cross-session run rather than under it; we put the full table up rather than lead with the
retention win alone. Where the numbers are noisy, it is the vanilla arm that carries the
noise: the frontier single-long baseline swings run to run, some runs recovering a fact
from their own compaction summary and some losing all four, the shape of degradation, not
a clean failure. Lore’s cells came in at a flat 100% across every model and cap here, which
we read as the task being within reach once the facts are in front of the model, not as
proof no ceiling exists. A model can still ignore a value in plain sight, the same way it
can ignore any instruction; that is a ceiling no memory layer lifts. We kept every valid
run in the averages. The only runs we dropped were ones where a memory backend failed its
pre-run health probe, a dead server the model could not have called even if it tried; a
healthy backend the model simply never reached for is kept and scored as the zero it is,
because that behavior is the finding, not an artifact. And we could not run Lore on an
anonymous free endpoint, because its background worker needs a real key.&lt;/p&gt;
&lt;p&gt;And, as said above, the window pressure is manufactured: we pipe large reference blobs
into most turns to force compaction on a benchmark timescale. That makes the token and
cost totals artifacts of the harness, not a forecast of your bill. It is why we lean on
the ratios between arms, run under the same forced load, rather than the raw numbers.&lt;/p&gt;
&lt;p&gt;All of it, the tasks, the scorer, the raw per-run numbers, is in the repo. Run
&lt;code&gt;lore eval&lt;/code&gt; and check our work.&lt;/p&gt;
&lt;h2 id=&quot;back-to-the-one-question&quot;&gt;Back to the one question&lt;/h2&gt;
&lt;p&gt;We ended the first post with a question to ask anything sold to you as agent memory:
&lt;strong&gt;what happens at 200K tokens?&lt;/strong&gt; Now there is a number on it. The client compacts, you lose
most of what mattered, and it takes more steps to get there. A store off to the side does
not change that, however good the store is, because it never runs at the moment of
overflow. Managing the window in the loop does, and you never have to think about it.&lt;/p&gt;
&lt;p&gt;That last part is not hypothetical. Building this benchmark changed the product twice, both
times because a result looked wrong and turned out to be our bug. First, an early cut
showed cheaper models dropping the incidental facts even when Lore had captured them, so we
made Lore fold a session’s own distilled memory into the working context the moment it is
written. Then a sharper version of the same symptom: a cheaper-model arm scored zero, and
we had a tidy story ready about the model’s ceiling, not our layer. We did not trust our
own excuse enough to skip the check, and the check killed it. The facts were captured,
embedded, and searchable; the injection path returned nothing whenever a project had no
promoted long-term knowledge yet, so on a fresh project it handed the model an empty
context. Fixing that flipped the arm from 0% to 100% on both cheaper models. And it did not
stop at retention: measuring the cross-session bill turned up three ways Lore was busting the
prompt cache more than it needed to, a recalled-memory block that re-priced the whole system
prefix on first injection, a compression layer that oscillated turn to turn, and a single
cache breakpoint that let one upstream eviction re-bill the entire prompt; fixing all three
cut the frontier cross-session cost from about $6.22 to vanilla parity. The benchmark did not
just score the product. It kept telling us where it was broken, including the times we would
rather have blamed the model.&lt;/p&gt;
&lt;p&gt;We have claimed that memory is table stakes and that the real value is active context
management. This is the shape of the evidence. On a frontier model, a good store lands near
Lore on retention, and Lore’s edge is fewer steps and a bill you can fully account for, now
paid at parity with a vanilla agent that keeps nothing. On the cheaper models people
actually run at scale, the win is retention itself, because those models do not reliably
remember to drive a store by hand, and Lore does not ask them to. We could always &lt;em&gt;feel&lt;/em&gt;
that difference. Putting a test around it, and being honest when the test caught us, both on
what we got wrong and on where we still cost more, is how we keep improving it.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-meters&quot;&gt;
&lt;p&gt;A note on where the dollar figures come from, since the two arms are metered
differently. On the Lore arm, Lore manages the window and proxies the model calls, and
OpenCode records zero token usage for those turns, so Lore’s dollars come from Lore’s own
cost ledger while vanilla’s come from OpenCode’s usage stream. Both meters multiply the
same token counts by the same models.dev prices, so the numbers are comparable, but they
are two meters, not one, and we would rather you know that than assume otherwise. &lt;a href=&quot;#user-content-fnref-meters&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-meters-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1-2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-zeros&quot;&gt;
&lt;p&gt;Our first instinct was that the competitor zeros had to be a harness bug. They
are not. We health-probe each memory backend before every run, and every backend here came
up fine: mnemonic’s local database initialized with its full schema, mem0’s cloud connected
and stored on other runs. The zeros are behavioral. On DeepSeek the model mostly never
called the store at all, in either direction; on M3, mnemonic was invoked (three to four
calls a run) and still returned nothing usable at recall time. We count these as the real
0% they are rather than excluding them, because “the cheaper model did not reliably drive
the store” is the finding, not an artifact to discard. &lt;a href=&quot;#user-content-fnref-zeros&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><dc:creator>Lore Team</dc:creator><category>memory</category><category>context management</category><category>benchmark</category><category>agents</category></item><item><title>Distill the knowledge, not the model</title><link>https://withlore.ai/blog/distill-your-own-knowledge/</link><guid isPermaLink="true">https://withlore.ai/blog/distill-your-own-knowledge/</guid><description>Satya Nadella named the Reverse Information Paradox. His fix over-solves it: your learning can stay yours in token space, without training a model.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-diagnosis-is-right&quot;&gt;The diagnosis is right&lt;/h2&gt;
&lt;p&gt;Satya Nadella &lt;a href=&quot;https://x.com/satyanadella/status/2076323181154230284&quot;&gt;posted this week&lt;/a&gt; about
what he calls the Reverse Information Paradox, and if you build with these models you already
feel it. You pay for intelligence in cash, and then you pay again in the proprietary knowledge
you reveal to make it useful. The harder you push the model to perform, the more of yourself
you feed it. He’s right, and it’s the cleanest framing of the problem we’ve seen.&lt;/p&gt;
&lt;p&gt;The valuable part is everything around a single prompt: how you work a problem, the fixes you
apply when the model gets it wrong, the standard you hold it to. Enough of that adds up to a
portrait of how your team actually thinks, and the portrait moves in only one direction. The
provider gets a little more of it every session. You get an answer to today’s question and
nothing about what they kept.&lt;/p&gt;
&lt;h2 id=&quot;look-closely-at-the-fix&quot;&gt;Look closely at the fix&lt;/h2&gt;
&lt;p&gt;Here’s where we part ways with him, and it’s worth being specific about how. Much of what he
prescribes we have no quarrel with, and some of it we already build. This is about one piece.&lt;/p&gt;
&lt;p&gt;Nadella’s answer is that enterprises should win “the rights to use model outputs to fine tune
and/or train their own models.” Read that twice. The remedy he’s reaching for is the right to
train on the exhaust. In the industry that has a name, distillation: using a strong model’s
outputs to teach a competing model. Anthropic and the other frontier labs restrict exactly
this, which is what he means by “restrictive terms on distillation.”&lt;/p&gt;
&lt;p&gt;It’s worth asking who that fix helps most. Training or fine-tuning a model on your own traces
is expensive, and it pays off only at a scale and with a purpose most companies don’t have. It
reads less like a fix for everyone and more like one sized for large players who want to build
or tune models of their own. Microsoft, for its part, has no frontier-class model of its own
yet, its bet on a single provider has grown complicated, and it’s now building in-house. We
can’t see anyone’s intent and won’t pretend to. But when a fix this specific arrives bundled
with the diagnosis, it’s fair to notice that the principle and the interest happen to point the
same way.&lt;/p&gt;
&lt;p&gt;It also reaches further than the problem needs. Nadella writes that the answer “requires more
than data protection,” and leans on that to justify training rights. But look at the leak he
actually describes: the provider walks away with a compounding record of how you work, and you
walk away with nothing durable. That gap closes the moment you start keeping and compounding
the learning on your own side. You do not need the right to train a model to do that. Training
rights are a separate, much larger ask, folded into the same sentence as if they were the same
need.&lt;/p&gt;
&lt;h2 id=&quot;learning-doesnt-have-to-live-in-weights&quot;&gt;Learning doesn’t have to live in weights&lt;/h2&gt;
&lt;p&gt;The move that dissolves most of the debate is noticing that “learning from your interactions”
and “training a model on your interactions” are two different things.&lt;/p&gt;
&lt;p&gt;There are two kinds of distillation. One compresses a teacher model into a student’s weights.
That’s the kind under dispute, the kind that’s expensive, and the kind the frontier labs
forbid. The other compresses your history into a compact, durable record that rides in the
context window: the decisions you reached, the conventions you set, the corrections you made.
No training run. No weights. No violated terms.&lt;/p&gt;
&lt;p&gt;When we say distillation, we mean the second kind. It’s the framing we took from Sanity’s
&lt;a href=&quot;https://www.sanity.io/blog/how-we-solved-the-agent-memory-problem&quot;&gt;Nuum&lt;/a&gt;, distillation, not
summarization, and it’s the whole reason Lore can hand you a compounding learning loop without
going anywhere near a model’s weights.&lt;/p&gt;
&lt;h2 id=&quot;what-lore-does-instead&quot;&gt;What Lore does instead&lt;/h2&gt;
&lt;p&gt;The learning accumulates in a single file on your own disk. Distillation compresses your
sessions into a dense record of what was established. The knowledge layer pulls out the
decisions, conventions, and gotchas as they happen, including the ones you only ever expressed
by correcting the model. You never have to remember to save anything, and none of it lives in
someone else’s tenant. No account, no server, and none of this learning leaves your machine
unless you choose to share it with your team.&lt;/p&gt;
&lt;p&gt;Be honest about the wire: your prompts still go to whatever model you’re using, because that’s
how you get an answer. Lore doesn’t pretend otherwise. What it changes is the other side of the
ledger. The distilled history, the extracted knowledge, the patterns, the record of every
correction, all of it gets captured and compounded on your side too, in token space, where no
distillation rule reaches. The provider still sees each turn. It just stops being the only one
that walks away with a durable record.&lt;/p&gt;
&lt;p&gt;That seat, seeing every token of every session, only makes sense if it’s yours. It’s why Lore
is &lt;a href=&quot;https://fair.io&quot;&gt;Fair Source&lt;/a&gt; (FSL-1.1-Apache-2.0): the code that touches your tokens is
right there to read, and it turns into Apache 2.0 on a timer.&lt;/p&gt;
&lt;h2 id=&quot;portability-without-the-weights&quot;&gt;Portability without the weights&lt;/h2&gt;
&lt;p&gt;Nadella’s sharpest point is about lock-in. If the model you rely on were taken away tomorrow,
would your veteran capability go with it, or would it stay with you?&lt;/p&gt;
&lt;p&gt;This is the part we already shipped. Lore sits between you and the model, outside any one agent.
Your memory doesn’t belong to Claude Code or Codex or OpenCode. It belongs to the file. Switch
models, switch agents, run three at once, and the same accumulated context comes along. A
generalist model becomes a veteran of your codebase, and that veteran capability is yours to
keep. Take the model away and the learning stays. You get the portability he’s asking for
without owning a single weight.&lt;/p&gt;
&lt;h2 id=&quot;you-can-skip-the-debate&quot;&gt;You can skip the debate&lt;/h2&gt;
&lt;p&gt;Whether the frontier labs should loosen their terms on distillation is a real argument, and
it’s going to play out over years between companies with far more at stake than you. You’re
welcome to watch it.&lt;/p&gt;
&lt;p&gt;You don’t have to wait for it. The learning loop Nadella says every organization needs already
exists in a form that asks no one’s permission: token-space, local, model-agnostic, running
today. In consuming intelligence, you are creating intelligence. That’s his line, and he’s
right about it. The only question is who keeps it, and you can answer that one yourself this
afternoon.&lt;/p&gt;
</content:encoded><dc:creator>Lore Team</dc:creator><category>memory</category><category>context management</category><category>agents</category></item><item><title>How Lore remembers, forgets, and changes its mind</title><link>https://withlore.ai/blog/how-lore-remembers-and-forgets/</link><guid isPermaLink="true">https://withlore.ai/blog/how-lore-remembers-and-forgets/</guid><description>Most memory tools now ship a set of principles for how an agent should manage its context. Lore&apos;s principles work differently, because the layer enforces them instead of asking the agent to. Here are the rules Lore runs on.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Everywhere you look, agents are being taught to fix themselves. Self-healing loops,
self-improving memory, a model that reads back its own transcript, rewrites its own
instructions, and prunes whatever it decides has gone stale. There is real energy here, and
some of it genuinely works.&lt;/p&gt;
&lt;p&gt;Here is the catch, and it is an old one. Self-correction is the hardest kind. Whatever made a
mistake is usually the worst-placed thing to catch it, because from the inside the mistake
still looks like a reasonable call. People hit this constantly, which is why we lean on
outside help: an editor for the draft you have read too many times, a reviewer for the code
you are sure is fine, a colleague who remembers you already tried that back in March. The
whole value is that they are not you. A model sits in the same spot. Once it has written a
shaky assumption into its own memory, it is not the thing you can count on to go back and
find the error.&lt;/p&gt;
&lt;p&gt;Lore takes a different road to the same destination. You never have to manage memory, and
neither does the agent. A fixed set of rules, enforced by the layer that sits in the request
path, makes the call on every turn instead. That distinction matters more than it sounds. A
set of principles written &lt;em&gt;for&lt;/em&gt; an agent is guidance, and it holds only when the agent is
paying attention. The same principles built &lt;em&gt;into&lt;/em&gt; the layer are guarantees. They hold
whether or not anyone is paying attention that turn.&lt;/p&gt;
&lt;p&gt;And because that layer sits outside the model, a model swap does not take your memory with
it. A newer model arrives brilliant and completely unfamiliar with your work, the way a new
hire does; the layer is the institutional memory already in the room, so the model is useful
on the first turn instead of the fiftieth. Change the engine as often as you like. The
assistant, and everything it has learned, stays.&lt;/p&gt;
&lt;p&gt;So here are the rules Lore runs on. Not aspirations we hope a cooperative model follows: the
actual behavior of the layer that touches every token.&lt;/p&gt;
&lt;h2 id=&quot;you-never-have-to-remember-to-remember&quot;&gt;You never have to remember to remember&lt;/h2&gt;
&lt;p&gt;Capture is automatic. Lore sits between your agent and the model, and it distills your work
as it happens. You do not tag a message, save a decision, or file anything away for later.&lt;/p&gt;
&lt;p&gt;This is the whole reason capture lives in the layer. Memory you have to reach for is memory
you will forget to reach for, right at the moment you are heads-down on the actual problem.
The filing was never the hard part, and it should never be your job. If a rule for managing
memory depends on you (or the agent) remembering to invoke it, it is already broken.&lt;/p&gt;
&lt;p&gt;Getting it back works the same way. When memory only returns because the agent thought to
call a search tool, the knowledge can be sitting right there and never reach the model,
because nobody went looking. Lore surfaces what is relevant on its own, and keeps a recall
tool for when the agent wants to dig deeper, so recall does not hang on the agent’s
discipline on any given turn either.&lt;/p&gt;
&lt;h2 id=&quot;being-surfaced-is-not-being-right&quot;&gt;Being surfaced is not being right&lt;/h2&gt;
&lt;p&gt;When Lore pulls a memory into your context, that is a bet about what might be relevant this
turn. It is not a vote on whether the memory is true. Selecting an entry never raises its
confidence.&lt;/p&gt;
&lt;p&gt;That separation keeps the store honest. A note that keeps getting surfaced but never actually
helps does not get more entrenched just for being loud. Confidence is earned somewhere else,
by whether the knowledge holds up in practice, and the act of showing it to the model is kept
strictly out of that accounting.&lt;/p&gt;
&lt;h2 id=&quot;confidence-is-earned-and-it-decays&quot;&gt;Confidence is earned, and it decays&lt;/h2&gt;
&lt;p&gt;Every entry carries a confidence score. It rises when the knowledge proves useful across
sessions and drifts down when it sits untouched. Fall below the floor and the entry is
evicted. The store stays bounded by usefulness rather than by a fixed timer that forgets
things on a schedule, whether or not you still need them.&lt;/p&gt;
&lt;p&gt;There is one deliberate exception. The preferences you state outright, the ones that follow
you across every project, are protected from that decay. Those are not guesses Lore made
about you, so they are not subject to the same erosion as things Lore inferred.&lt;/p&gt;
&lt;h2 id=&quot;when-two-things-disagree-you-get-told-not-overruled&quot;&gt;When two things disagree, you get told, not overruled&lt;/h2&gt;
&lt;p&gt;Opposing rules are never quietly merged. “Always use tabs” and “always use spaces” are not
two versions of one fact, and collapsing them would be Lore deciding for you. Both are kept
and ranked by confidence.&lt;/p&gt;
&lt;p&gt;Genuine contradictions still need settling, so Lore looks for them in the background and flags
each pair for you: on the knowledge dashboard, or from &lt;code&gt;lore data contradictions&lt;/code&gt;. You pick the
rule that still holds, or you keep both. Lore never merges them and never deletes the losing
side on its own. The layer’s job here is narrow on purpose: notice the conflict and hand it to
you. Picking a winner silently is exactly the kind of decision a memory system should not be
making.&lt;/p&gt;
&lt;h2 id=&quot;nothing-is-really-deleted&quot;&gt;Nothing is really deleted&lt;/h2&gt;
&lt;p&gt;Knowledge is append-only. An edit writes a new version and keeps the old one; a delete leaves
a marker rather than erasing the trail. Because the history is intact, you can diff what your
agent has learned and roll it back, the same way you already do with code.&lt;/p&gt;
&lt;p&gt;That is not an abstract property. Curated knowledge lands in a plain
&lt;a href=&quot;https://withlore.ai/different/&quot;&gt;&lt;code&gt;.lore.md&lt;/code&gt;&lt;/a&gt; file in your repo, so a change to your agent’s memory shows up in a
pull request and gets reviewed by the same people and the same process that review your code.
Memory that changes without a diff is memory nobody can audit.&lt;/p&gt;
&lt;h2 id=&quot;the-live-edge-stays-whole&quot;&gt;The live edge stays whole&lt;/h2&gt;
&lt;p&gt;The most recent turns are always protected. Whatever gets distilled or dropped as older
context is compressed, the active end of the conversation, where the work is actually
happening right now, is never touched. Everything else is negotiable under pressure; the edge
you are working on is not.&lt;/p&gt;
&lt;h2 id=&quot;whats-learned-lives-in-tokens-not-weights&quot;&gt;What’s learned lives in tokens, not weights&lt;/h2&gt;
&lt;p&gt;Lore learns by writing durable text, not by fine-tuning the model. That is a deliberate
choice. Text is something you can read, carry across providers and across model generations,
and undo a line at a time. Knowledge baked into weights is none of those things: you cannot
inspect it, it does not move to the next model, and you lose it on the upgrade. The model is
the part you replace. The knowledge is the part you keep.&lt;/p&gt;
&lt;h2 id=&quot;boring-on-purpose&quot;&gt;Boring on purpose&lt;/h2&gt;
&lt;p&gt;Making a model better at checking itself is worth doing, and we hope it keeps improving. But
the corrections you can lean on are the ones that do not wait for the model to notice, this
turn, that it was wrong. Those come from outside it.&lt;/p&gt;
&lt;p&gt;Lore’s bet is narrower, and honestly a little boring in the way infrastructure should be: the
rules that decide what stays, what fades, and what gets surfaced ought to hold on every single
turn, not only when the agent happens to be attending to them. A principle the layer enforces
is one you never have to hope about.&lt;/p&gt;
&lt;p&gt;And because a layer that sees every token is a lot to ask you to trust, the rules above are
not a description you take on faith. Lore is &lt;a href=&quot;https://fair.io&quot;&gt;Fair Source&lt;/a&gt;
(FSL-1.1-Apache-2.0), so the code that decides what your agent remembers and forgets is right
there for you to read, and it turns into Apache 2.0 on a timer. Principles you can enforce are
better than principles you have to believe.&lt;/p&gt;
</content:encoded><dc:creator>Lore Team</dc:creator><category>memory</category><category>principles</category><category>agents</category></item><item><title>Why memory is not enough</title><link>https://withlore.ai/blog/why-memory-is-not-enough/</link><guid isPermaLink="true">https://withlore.ai/blog/why-memory-is-not-enough/</guid><description>A long-term memory store remembers what you said last week. It can&apos;t manage the context window that&apos;s overflowing right now. Those are two different problems, and only one of them is getting solved.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ask anyone building agents what “memory” means and you’ll get the same answer: a place to
store facts and decisions so the agent can pull them back later. A vector DB, a knowledge
graph, a folder of notes, take your pick. It remembers what you discussed last week, and
there are good tools that do this well now.&lt;/p&gt;
&lt;p&gt;Now ask the harder question. What happens when the session you’re in &lt;em&gt;right now&lt;/em&gt; crosses
180K tokens and the agent starts forgetting how it began?&lt;/p&gt;
&lt;p&gt;The usual answer is a list of chores. Spin up a background agent. Write the plan to a file,
then a second, then a third. Open a trail of GitHub issues. Leave notes in scratch markdown.
Keep a tidy &lt;code&gt;AGENTS.md&lt;/code&gt; and prompt more carefully while you’re at it. Every one of these is
the same move: manually push state out of the window and hope it finds its way back. That’s
you doing the filing. Maybe your tools file it for you now, straight from the conversation,
so you never lift a finger. Better, but capture was never the hard part. The question is what
stays in the window &lt;em&gt;this turn&lt;/em&gt;, and saving something to a store, by hand or automatically,
doesn’t decide that.&lt;/p&gt;
&lt;p&gt;When the filing isn’t enough and the window fills mid-task, the one automatic mechanism every
major agent ships kicks in: compaction. The client crushes the older turns into a lossy blob,
drops the originals, and hands you back an agent that was a genius a minute ago and now can’t
quite remember its own name. We all quietly accepted this for something that happens every
session, often more than once: the most predictable failure in agentic coding, answered by a
guillotine. So why has nobody built the thing that keeps up?&lt;/p&gt;
&lt;h2 id=&quot;two-problems-hiding-behind-one-word&quot;&gt;Two problems hiding behind one word&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you say&lt;/th&gt;
&lt;th&gt;What it actually needs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“What did we decide about auth last week?”&lt;/td&gt;
&lt;td&gt;A long-term memory store.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Wait, what was the other thing you said we should do after this?”&lt;/td&gt;
&lt;td&gt;Active context-window management.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These are not the same layer. A long-term store sits &lt;em&gt;beside&lt;/em&gt; your conversation, like a
notebook you keep open on the desk. It only holds what you bothered to write down, and it
only helps when you reach for it. That’s exactly right for what carries across sessions: a
decision, a preference, a constraint from days ago. This part has had real product
attention, and it shows.&lt;/p&gt;
&lt;p&gt;The live window is the other half, and it’s the one you’re left to manage by hand, mid-task.
People do this well, but it’s a tax: every note you set down pulls your focus off the actual
problem, and you have to remember to pick it back up later. And every tool for it is the
same shape: static (a markdown file the model may or may not read), offline (an indexer you
run between sessions), or just advice (“prompt better”). None of it is in the loop at the one
moment that matters, when the window is overflowing &lt;em&gt;while you work&lt;/em&gt;. The one mechanism that
does fire on its own is compaction.&lt;/p&gt;
&lt;h2 id=&quot;a-store-on-the-sidelines-cant-intervene&quot;&gt;A store on the sidelines can’t intervene&lt;/h2&gt;
&lt;p&gt;That compaction step is triage with a blunt instrument: it runs whether or not it’s about to
drop something you still need, with no idea what’s worth keeping. Now bolt the best long-term
memory store on the planet onto the same session. What changes? Nothing. The store can answer
a question &lt;em&gt;if you ask it&lt;/em&gt;, but compaction doesn’t ask questions. It just runs. The store
never gets a vote on what survives. So you can have flawless recall of last week and still
watch the agent get amnesia at 200K tokens.&lt;/p&gt;
&lt;p&gt;Some tools go further than a hand-fed store: they keep the entire conversation and let you
search over it. That’s genuinely better, and it’s worth saying so. But searching is
something &lt;em&gt;you&lt;/em&gt; have to do, after you’ve already noticed something went missing, and
whatever you pull back lands in the same window that was overflowing in the first place.
You found the needle, and the haystack is still on fire. And automating the search doesn’t
save it: async, agent-native RAG still drops what it finds into the same window, and
still never decides what &lt;em&gt;leaves&lt;/em&gt; it.&lt;/p&gt;
&lt;p&gt;There’s a deeper reason the window wins. A model uses what’s already in front of it far more
reliably than what it has to fetch: hand it the relevant text in context and it beats RAG on
the same text (&lt;a href=&quot;https://arxiv.org/abs/2407.16833&quot;&gt;Li et al.&lt;/a&gt;), and what
it does hold, it reads best at the edges, not buried in the middle
(&lt;a href=&quot;https://arxiv.org/abs/2307.03172&quot;&gt;&lt;em&gt;Lost in the Middle&lt;/em&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;RAG has one honest advantage: it’s cheaper to pull a few snippets than to carry the whole
history. But that only pays off when a small slice can substitute for everything else, and an
agent session is the opposite case. RAG can only add to the window, never stand in for it.&lt;/p&gt;
&lt;h2 id=&quot;what-managing-the-window-actually-looks-like&quot;&gt;What managing the window actually looks like&lt;/h2&gt;
&lt;p&gt;Two hundred turns deep, that means keeping the auth decision and the path of the file you’re
editing while dropping the stale 4,000-token test dump, without anyone having to ask. To make
that call on every turn, instead of letting a blunt summarizer maul the whole thing at the
boundary, a few things have to be true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep a distilled prefix at the front.&lt;/strong&gt; Compress the early conversation into a dense,
structured record of what was established: the decisions, the shape of the work, the
constraints. That record stays pinned to the &lt;em&gt;front&lt;/em&gt; of the window where the model can
always see it, carrying the load-bearing facts the rest of the work leans on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compress gradually, in layers.&lt;/strong&gt; Full passthrough while there’s room. As pressure
builds, compress the raw turns behind the distilled prefix. Under more pressure, strip what
ages worst first: stale tool output, redundant dumps. Emergency compression stays the last
resort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Calibrate from the real token counts.&lt;/strong&gt; The window is a hard budget. What gets cut
should follow the actual token counts the API reports back, and what each model’s real
context and pricing are. A character cap hardcoded once and forgotten tracks none of that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protect the live edge.&lt;/strong&gt; The most recent turns stay intact, always. Whatever happens
upstream, the active end of the conversation is where the work is happening, so it stays
whole.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What matters here is the loop: &lt;em&gt;something is actively deciding what stays in the window on
every turn&lt;/em&gt;, instead of a one-shot summarizer flattening the session the moment it overflows.&lt;/p&gt;
&lt;h2 id=&quot;two-layers-one-stack&quot;&gt;Two layers, one stack&lt;/h2&gt;
&lt;p&gt;This isn’t memory &lt;em&gt;versus&lt;/em&gt; context management. You need both, and they stack:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Temporal storage.&lt;/strong&gt; Everything that’s said, captured and indexed, so nothing is truly
lost even after it leaves the window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distillation.&lt;/strong&gt; That history compressed into a dense prefix, so the established facts
survive context pressure and stay in front of the model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-term knowledge.&lt;/strong&gt; The durable decisions, patterns, and preferences pulled out and
carried across sessions, retrievable on demand.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That store, layer 3, is what people mean today when they say “memory”. It’s the top of the
stack, not the whole stack. Without the two layers under it, it’s a filing cabinet next to
a conversation that’s quietly falling apart.&lt;/p&gt;
&lt;h2 id=&quot;the-work-this-is-built-on&quot;&gt;The work this is built on&lt;/h2&gt;
&lt;p&gt;We didn’t invent this architecture, and we want to be clear about that. Two teams got here
first and proved it works. Sanity’s
&lt;a href=&quot;https://www.sanity.io/blog/how-we-solved-the-agent-memory-problem&quot;&gt;Nuum&lt;/a&gt; gave us the
framing we still use, “distillation, not summarization”, and showed a three-tier memory
staying coherent across thousands of messages. (Simen Svale’s description of compaction as
“JPEG compression of memory management” is hard to forget once you’ve read it.) Mastra’s
&lt;a href=&quot;https://mastra.ai/research/observational-memory&quot;&gt;Observational Memory&lt;/a&gt; worked out the
observer/reflector loop and the move from rigid JSON to plain, timestamped observation
logs. Lore is built on both, and it’s better for it. Their write-ups are worth your time.&lt;/p&gt;
&lt;p&gt;There’s a catch, though. Both teams shipped this architecture &lt;em&gt;inside their own agent&lt;/em&gt;.
Nuum is a standalone REPL (Anthropic-only, yolo-mode, built to power Sanity’s Miriad).
Observational Memory lives inside the Mastra framework. The memory is excellent. The
packaging is the constraint. Almost no one is going to replace the coding agent they
already rely on just to get a context-management layer.&lt;/p&gt;
&lt;h2 id=&quot;unhook-it-from-the-harness&quot;&gt;Unhook it from the harness&lt;/h2&gt;
&lt;p&gt;So that’s the gap: take the same ideas and unhook them from the harness. Deliver them as a
layer that works with whatever agent you’re already using, on whatever provider you’re
already paying for.&lt;/p&gt;
&lt;p&gt;Here’s the distinction that actually matters, and it’s easy to miss now that everything
calls itself memory. A store is a tool the agent reaches for: it sits off to the side and
answers when it’s asked, however clever the asking has gotten. A layer sits &lt;em&gt;in the request
path&lt;/em&gt;. Every turn flows through it, and it can reshape that turn before the model ever sees
it. That position is the only one from which you can manage the live window at all.&lt;/p&gt;
&lt;p&gt;It’s also the most invasive seat in the system, and that’s worth being honest about. A
thing that sees every token of every session only earns that seat if it’s &lt;em&gt;yours&lt;/em&gt;: a single
file on your own disk, no account to create, no database to run, nothing leaving your
machine unless you choose to share it. It’s also why this is
&lt;a href=&quot;https://fair.io&quot;&gt;Fair Source&lt;/a&gt; (FSL-1.1-Apache-2.0): the code that touches your tokens is
right there to read, and it turns into Apache 2.0 on a timer. That last part is hard for a
cloud service to follow you into. Routing every token through someone else’s box is a lot to
ask, and a lot for that box to be responsible for. The seat really only makes sense when
you’re the one sitting in it.&lt;/p&gt;
&lt;p&gt;That same vantage point, seeing every request as it happens, is also the right home for a
lot more than distillation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Warm the cache automatically&lt;/strong&gt;, so you’re not paying full price for a cold context at
the start of every session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extract long-term knowledge on its own&lt;/strong&gt;: decisions, conventions, gotchas, without you
remembering to save anything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recognize patterns&lt;/strong&gt; in how you and your agent actually work, and act on them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Track token spend&lt;/strong&gt; day to day, across every agent you run.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one is quietly becoming the point. As model and token costs climb, the layer that
sees every request is exactly where cost control belongs, and because it runs on your own
machine, there’s no infrastructure bill and no per-request meter to feed. A store on the
sidelines can’t do any of this. Plenty of them run the other way: a server you’re renting,
an extra model call to extract and index every exchange, and a metered fee on top of the
requests you were already paying for.&lt;/p&gt;
&lt;p&gt;And once memory lives in that layer instead of inside one agent, it stops belonging to any
single agent. Your context follows you. Move from Claude Code to Codex to OpenCode, or reach
for a different agent on a different task, and the same memory comes along. A team running a
mix shares one knowledge base instead of three separate silos. Portability comes free once
the memory no longer lives inside the harness.&lt;/p&gt;
&lt;p&gt;Memory is the wedge. The layer is the platform.&lt;/p&gt;
&lt;h2 id=&quot;the-one-question-worth-asking&quot;&gt;The one question worth asking&lt;/h2&gt;
&lt;p&gt;Next time something is pitched to you as agent “memory”, ask one question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What happens at 200K tokens?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the answer is some version of “you can search what we stored”, or worse, “write a better
context file”, then it’s a storage tool, and the part that actually breaks mid-session is
still yours to handle. That’s fine, and a good store is genuinely worth having. But it has
no answer for the session that’s overflowing right now, which is the problem you’ll hit
today, not next week.&lt;/p&gt;
&lt;p&gt;Memory is table stakes. Managing the window, in the loop, while it fills, is the part
nobody wants to build. Make sure you know which one you’re being sold.&lt;/p&gt;
</content:encoded><dc:creator>Lore Team</dc:creator><category>memory</category><category>context management</category><category>agents</category></item><item><title>Introducing the Lore Blog</title><link>https://withlore.ai/blog/hello-lore/</link><guid isPermaLink="true">https://withlore.ai/blog/hello-lore/</guid><description>A home for product notes, memory architecture deep dives, and engineering updates from Lore.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Lore blog is ready for longer-form writing: release notes, implementation notes, architecture posts, and the practical lessons that show up when AI coding agents work inside real codebases for days at a time.&lt;/p&gt;
&lt;p&gt;Future posts will cover LLM memory architecture, distillation techniques, context management strategies, and engineering updates from the Lore team.&lt;/p&gt;
</content:encoded><dc:creator>Lore Team</dc:creator><category>memory</category><category>agents</category></item></channel></rss>