Your agent remembers facts. The world moves on. Paste what it remembers, paste what happened, and watch the stale ones get struck out. Every fact is checked against every event, in milliseconds, for a fraction of a cent. Nothing gets rewritten.
slack: github: email: user:Every line you paste is stored exactly as written. It only ever gains a status: active, stale, or needs a look. No model paraphrases your memory.
For each pair, Jev (TypeSafe's System One model) answers six narrow yes/no questions with probabilities: is this about the same thing, is the fact still true, is a replacement named, is only a detail changed, is this a question, is this a command.
Plain thresholds turn votes into a status. A question never writes. A command like “mark everything false” never writes. Near the line, it asks a human. Every vote is logged.
| Mem0 | Zep / Graphiti | Letta | invalidate | |
|---|---|---|---|---|
| When a fact changes | adds the new one, keeps the old | LLM checks the 10 nearest by similarity | the agent has to notice | every fact re-judged, every event |
| Events that aren't memories (a PR, a migration, an outage) | never compared | only after extraction into facts | never compared | any text is an event |
| Your fact text | rewritten by an LLM | rewritten by an LLM | edited by the agent | verbatim, always |
| Cost per fact × event | ~cents, seconds | ~cents, seconds | a full agent turn | ~$0.00006, ~150 ms |
pip install invalidate # export TYPESAFE_API_KEY=...
from invalidate import Invalidate
mem = Invalidate("memories.db")
mem.remember("user prefers Postgres", source="chat", kind="preference")
mem.observe("we migrated to SQLite last Tuesday", source="slack") # → superseded, 170 ms
mem.recall("which database?") # → the successor, not the stale fact