cd /news/artificial-intelligence/nowhere-to-put-the-disagreement-what… · home topics artificial-intelligence article
[ARTICLE · art-108722] src=dev.to ↗ pub= topic=artificial-intelligence verified=true sentiment=· neutral

Nowhere to Put the Disagreement: What a Memory Store Cannot Tell Your Agent

Ken Alger and the Mnemoverse team highlight a fundamental flaw in memory APIs for AI agents: they return flat lists with similarity scores but cannot express conflicts, supersessions, or invalidations between records. This type problem means agents may resolve disagreements by comparing scores, and even a store that tracks relations flattens them on output. The team is adding a supersedes link to their REST API, but admits it is an audit trail rather than a full correction, and MCP still lacks an update verb.

read8 min views3 publishedAug 24, 2026

Ask a memory system what database production uses, and it can hand back two records that flatly contradict each other, each with a confident similarity score, and nothing else. Ken Alger opened his piece on this with exactly that shape: PostgreSQL at 0.94, MongoDB at 0.91, and a migration four months ago that neither number knows anything about.

He wrote it from the interface side. This is the same problem from the store side, and the uncomfortable part is that a store can hold everything it needs to see the conflict, both records and both timestamps, and still return it flattened. Disclosure up front: I work on Mnemoverse, a memory engine for AI agents, so read the parts about our own failures as the ones I am most sure of.

Because the response has nowhere to put it.

A memory API returns a list of items with scores. That shape can express "here are five things, sorted by how well they match." It cannot express "these two are in conflict," "this one was superseded by that one," or "this is still true but no longer governs." Those are relations between records, and a flat list has no field for a relation.

So even a store that tracked the conflict perfectly will flatten it on the way out. The agent sees two ordinary hits, takes the top one, and 0.94 beating 0.91 quietly becomes conflict resolution, performed by a number that was never asked to adjudicate anything.

This is not a bug in anyone's ranker. It is a type problem. Fixing it means the response carries edges, not just items, and that is a much bigger change than adding a column.

This decomposition is Ken's, from the conversation that produced both pieces, and it is the sharpest thing either of us wrote:

At the storage layer all three look identical, because all three end up writing a value. They diverge the moment anyone audits. Supersession keeps the past explicable. Correction says the past was built on something false, which is a different and more expensive fact. And invalidation is not a truth claim: a record can be perfectly accurate and still stop being the thing that decides.

Most stores have one verb for all three, or none. Ours had none until this week, and what it has now is deliberately less than a verb: the REST write accepts a supersedes link, the old record stays and gains a pointer to its replacement, and the read side does not yet hide it, so for now that link is an audit trail rather than a correction. Over MCP there is still no update verb at all, and our own changelog says it plainly: a correction that is admitted at all lands as a second record beside its target. Two atoms, two timestamps, and unless someone linked them, no relation between them. Which means the store genuinely cannot distinguish "never true" from "no longer true."

Because of a bootstrapping problem underneath the interface question.

To know whether a supersession edge is worth carrying, you have to already be holding the record it supersedes. So edge hydration cannot be a filter applied after the top-k cut. It has to influence which candidates are considered in the first place. The relations have to be visible before the ranking, not after it.

That turns a ranking problem into an allocation problem. Once a response can carry facts, relationships, authority and prior decisions, something has to decide what gets dropped when they do not all fit in the context budget. As Ken put it in the thread, a lower-ranked authority edge may matter more than the next highly relevant fact, and dropping a supersession relationship can change the meaning of the records that survive. Top-k knows none of this. It knows one number.

Ranked lists are impoverished. They are also cheap, and whatever replaces them inherits a harder question than the one it solved.

If yesterday's decision is going to be findable when the same disagreement comes back, the disagreement needs a durable identity of its own. The obvious move is to key it on the pair: A conflicts with B. That breaks. The moment a third record arrives, A-conflicts-with-B is no longer the same object, and yesterday's decision points at a conflict that no longer exists in that shape. Key it on the subject the records argue about instead, and the identity survives however many records pile up under it. Participants change, the disputed thing does not.

Most stores key on the atom. We have not yet found one that keys on the question the atoms are arguing about.

The thread that produced this article converged on a spec none of us had written down, and it belongs to the people who said it.

Max Quimby named the promotion boundary: an episode should not graduate into policy silently, because policy is expensive to change by design and should be expensive to create. Reid Marlow named the other end of it: every promoted item needs a revoker, or stale policy survives on sounding official. joinwell52 added the acceptance step in between, with scope and supersession kept separate. Suny Choudhary closed the loop from the security side: ten consistent episodes from untrusted documents should not outweigh one reviewed decision, or memory poisoning becomes a promotion attack rather than a retrieval one. anasbuilds997 named why the agent cannot be its own gate: two corroborating tool outputs are not authority, and self-promotion is how hallucinations harden into permanent truths.

Notice what all five are describing. Not better ranking. A write path with governance in it, and a read path honest enough to say which record is governing and on whose authority.

One thing worth stating for anyone building this: authority is not a score. Collapsing trust, recency, validity and usefulness into a single number is what produces systems nobody can explain, because once they are one number you cannot ask which of them decided.

Mike Czerwinski made the point that reframed this for me: handing the contradiction back to the agent only closes the gap if the choice the agent then makes gets logged too. In his words, otherwise "silent resolution just relocates from the store to the inference step, same bug at a different address, and now it's harder to find because the store looks honest."

Tae Kim had already run into it, working on trade data, where the same company resolved to different nodes depending on whether you asked before or after an acquisition. They stamped time ranges on the relationships and started returning both versions to the reasoning layer, which helped. The part that stayed broken was that the agent's choice between them vanished without a trace. They started writing those choices back as events, and the honest reason was not architecture taste: a client asked about a strange output and there was nothing to point at.

That is the pressure that makes a field real. Not elegance, an audit.

One caution about where that record lives, and the thread supplied its own evidence for it. Giulio D'Erme went and counted his own corpus after reading the previous piece: zero of 152 memos and zero of 59 documents carried a validity window or a supersession edge. The engine could read those fields. Nothing was writing them. Availability is not usage.

So a decision log that sits beside memory, outside the retrieval path, will end up in exactly that state: readable, unread, technically shipped. If tomorrow's agent cannot get yesterday's decision back at the moment the same conflict returns, the log is, as Ken put it in the thread, forensic evidence for humans rather than operationally useful memory for the system.

Not a list. Something closer to: here are the records, here is the conflict they belong to, here is which one governs and under whose authority, and here is what was decided the last time this same conflict came up.

We do not ship that. In a personal domain, what we ship today decides admission with a novelty check against the nearest existing memory, which is not trust and not importance, and which has a failure mode we document publicly: a correction is phrased almost exactly like the thing it corrects, so it scores as a near duplicate, so it is the input most likely to be rejected. The stale record then survives as the only one on that subject and looks more authoritative than it did before anyone tried to fix it.

I would rather write that down than describe a nicer engine than the one we have. The three checks I would run against any memory vendor, us included, are still the cheap ones: store a fact, contradict it, and list everything the system holds on that subject; submit a correction phrased like the original and see whether it survives; and ask what the response can express beyond a score.

Ken's piece takes the same problem from the interface end and is worth reading alongside this one. Between us the argument is roughly complete: the store can know more than the response is able to say, and the part it does not know is what anyone did about it.

Disclosure: I work on Mnemoverse, a memory engine for AI agents connected over MCP. The failures described here as ours are documented in our own changelog rather than discovered for this article. Every argument credited above arrived in the comments of the previous piece, which is a better advertisement for writing honestly about your own defects than anything I could say here.

── more in #artificial-intelligence 4 stories · sorted by recency
── more on @ken alger 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/nowhere-to-put-the-d…] indexed:0 read:8min 2026-08-24 ·