Mem0 markets its add() call as "just talk to it, it figures out memory." Mostly true — under the hood, every add() runs an LLM-driven pipeline that extracts facts from the input, searches for semantically similar existing memories, and issues one of four operations per fact: ADD, UPDATE, DELETE, or NONE. That's a real feature, not a demo simplification, and it's genuinely useful: you don't have to hand-write the merge logic every memory-backed app eventually needs.
The problem is that this conflict resolver runs on text similarity, not on your application's notion of scope. It cannot tell the difference between "the user changed their mind" and "the user has two preferences that both hold, just in different contexts." When it gets that distinction wrong, it doesn't warn you — it quietly issues a DELETE, and the fact is gone from every future search() call. I hit this running a long-lived agent that accumulates behavioral memory over weeks, and it took a missing fact silently reappearing as wrong behavior — not an exception — for me to notice.
This article shows the failure mode with working code, then a scoped-key pattern plus an audit wrapper that stops it from costing you memories you still need.






