Build1 publisher3 min readPublished
Mem0-style memory replaces embed-and-store with extraction, write-time retrieval, an ADD/UPDATE/DELETE/NOOP decision and consolidation. The similarity scores in the dev.to writeup show why no threshold can make that call for you.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The arithmetic in the writeup's own example is what makes stage three load-bearing. A new candidate, "user lives in Denver", pulls the existing "user lives in Austin" back at 0.89 cosine similarity, with "user has a dog" trailing at 0.31 [9]. The failure case the same article warns about, "user lives in Denver" against "user was born in Denver", sits at 0.85 or above [14]. So the gap between the pair you must supersede and the pair you must leave alone is at most 0.04 [15]. A threshold cannot live in that gap, because cosine similarity scores the sentence and not the predicate. That is why the decision runs as a model call or a trained classifier rather than an if statement [10].
The retrieval window is the other place this breaks. Write-time search returns the five nearest existing memories, and those are the only memories the decision step ever sees [8]. A genuine contradiction that ranks sixth is invisible, gets classified ADD, and the store is holding both addresses again with no signal about which is current [3]. Atomic extraction helps, since one predicate per record keeps a fact from ranking on the wrong axis, and the article's own reason for it is that welded facts cannot be updated or deleted independently later [7].
Cost tracks facts, not turns. Extraction is one model call per conversational turn [6]. Decision is one call per candidate fact [10]. The article's own example sentence yields three atomic facts [7], which puts the write path at four model calls plus three vector searches for one message about Denver, remote work, and a dog [16].
Consolidation writes resolved state back instead of appending [12], and the sample output shows what that means in the row: m_204 stops saying Austin and starts saying Denver [11]. There is no version kept beside it. Ask that store what the user's address was in March and it cannot answer, and the article does not claim it can. In my context I keep raw turns in an append-only table regardless and treat the memory store as a cache of current state, which is close to what the article concludes it is: a key-value store whose keys are approximate [13]. Described that way it sells less well.
For this to be the right build in your system, your fact distribution has to be one where supersession is common and near-duplicates with different predicates are rare. The case made here is mechanical, not measured: the only numbers in the writeup are example similarity scores, with no error rate, latency, or cost reported for the decision stage [17]. The figure that decides adoption is the rate at which your decision prompt UPDATEs or DELETEs something it should have left alone, on your own facts. Nobody can hand you that one.
Ranked by verification strength, evidence, and original report placement.
For each candidate plus its neighbours, a second LLM call, or in leaner implementations a classifier, outputs one of ADD, UPDATE, DELETE or NOOP; the article says Mem0's public writeups describe exactly this operation.
The decision step returns an operation, a target_id and a resolved_fact; the worked example returns operation UPDATE, target_id m_204, resolved_fact "user lives in Denver".
The article names the failure mode: an overly aggressive DELETE/UPDATE threshold merges facts that only look similar, and gives "user lives in Denver" versus "user was born in Denver" as 0.85+ cosine similar with completely different meanings.
The dev.to writeup argues the naive approach works for a demo but falls apart in production, because nothing ever updates or deletes anything: the store only grows and fills with contradictions.
In the article's example a user says "I live in Austin" in March and "I just moved to Denver" in July; a naive vector store keeps both, both return as top-k matches for "where do I live", and the LLM holds two contradictory facts with no signal about which is current.
The article states this is the problem memory layers like Mem0 are built to solve.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One explainer, illustrative numbers only
Every mechanical claim traces to a single dev.to post, and its only figures are the cosine scores it invented for its own example. The design is self-consistent and the code matches the prose, which keeps this from scoring lower, but nothing in it has been measured against the append-only approach it dismisses.
Nothing observed in the wild
Mem0 is named as the reference implementation and that is as far as it goes. No deployment, release, user count or benchmark appears anywhere in this reporting, and the relocating user is a worked example, so there is nothing to count.
Mechanism ahead of its measurements
Most of what is asserted is definitional and stays within what the code shows, so the gap stays modest. It opens where the post calls the naive approach unfit for production and its own loop the thing that makes memory useful, neither measured, while the cost its design implies for a three-fact turn never comes up.
The interested party is cited, not speaking
Mem0 is the only party with something to gain from this framing and it does not speak here; its write-ups are invoked secondhand and never linked. The post also says nothing about whether its author has any tie to the vendor, which is the disclosure that would settle the question either way.
Checkable by construction, unverified beyond it
Most of what this story asserts can be confirmed by reading the design: four stages, a write-time search at k=5, an operation returned per candidate. Confidence drops where the post reaches past its own code to say what happens in production under a threshold rule, because one unmeasured explainer is the whole evidentiary base for that.
build
DuckDB's vss extension removes a database from your RAG stack, then names the price1 publisher
build
Four control planes, one Postgres: a team's case against polyglot persistence1 publisher
build
The query a vector index cannot answer, whatever you embed it with1 publisher
build
Disproving one pointer in Lemmalog retracts every conclusion that rested on it1 publisher
Publishers with included, body-backed reporting in this cluster.
1 article · September 6, 2026