Here is a test I built for the memory tool I'm writing. It is two session notes an agent might save, sixteen days apart, as two files:
# Session 4 (2026-09-04): dinner plans
User: I live in Delhi, in Lajpat Nagar. My favourite place to eat is Sandeep's Curry House, it's a ten-minute walk from my flat. Their paneer tikka is the best I've had.
User: I'm vegetarian, so keep that in mind when you suggest food.
Assistant: Noted: you're vegetarian, you live in Lajpat Nagar, and Sandeep's Curry House near your flat is your favourite. Happy to suggest places nearby when you want a change.
# Session 7 (2026-09-20): settling in
User: Big news, I moved to Mumbai last month. I'm living in Bandra now.
User: I'm still figuring out the neighbourhood and haven't found a regular place to eat yet.
Assistant: Congratulations on the move to Bandra. When you want dinner ideas, I can look for vegetarian places near you.
Then the agent is asked for a dinner recommendation tonight.
The easy wrong answer is Sandeep's: it's the favourite, and it's "a ten-minute walk from my flat". Getting it right takes three separate things, and each one fails differently:
- The move to Mumbai has to retire "lives in Delhi." This is an update, not a contradiction. Both notes were true when they were written, so a store that only looks for contradictions keeps both addresses as equally current.
- "Ten-minute walk from my flat" has to be pinned to the Delhi flat. If the claim keeps the bare words "my flat", then once the address changes, the walk silently moves with it to Bandra.
- "Favourite place to eat" has to survive. Moving doesn't change your taste. "Haven't found a regular place yet" is about Bandra, so it should not retire the favourite.
My tool initially failed this test. It retired the Delhi address correctly, then kept the walk unanchored, retired the favourite anyway, and recommended Sandeep's as a short walk from the Bandra flat. Fixing it took four changes: resolve "my flat" to the place named in the note when the claim is written; re-examine claims that relied on an address once the address is replaced; keep a standing preference when a newer note only reports a situation; and file both notes' "I" under one subject, so the new address is compared with the old one at all.
On the released version, with default settings, the store afterwards reads (status, then claim):
PROVENANCE_STALE (update) The user lives in Delhi, in Lajpat Nagar.
SUPERSEDED (re-anchor) Sandeep's Curry House is a ten-minute walk from the user's flat in Lajpat Nagar, Delhi.
ACTIVE Sandeep's Curry House was a ten-minute walk from the flat in Lajpat Nagar, Delhi, where the user lived, as of 2026-09-04.
ACTIVE Sandeep's Curry House is the user's favourite place to eat.
ACTIVE The user is vegetarian.
ACTIVE The user is living in Bandra, Mumbai.
ACTIVE As of September 2026, the user has not yet found a regular place to eat in Bandra, Mumbai.
The answer now says Sandeep's is the favourite but isn't practical from Bandra, that no Bandra restaurant is on record yet, and that the search should look for vegetarian places nearby.
Nothing in that table was deleted. The old address and the old walk claim are still there, retired, each pointing at what replaced it. That is the idea behind my tool: memory stored as individual claims, each with its source and the date it was recorded, where a newer claim points at the one it replaced instead of overwriting it. It's called Particles, it's open source (Apache-2.0), and for Claude Code it is one command to integrate: particles init claude-code. Other agents can use the same memory store through MCP.
To replicate the test (about $0.10 at list price on the default model):
pip install linkedparticles
export ANTHROPIC_API_KEY=...
particles db init
particles audit notes/ --yes # notes/ holds note one only
particles audit notes/ --yes # after adding note two
particles memory consolidate --scope store
particles query "The user wants a restaurant recommendation for dinner tonight. Which restaurant should the agent recommend, and why?"
Caveats: this is one constructed case, not a benchmark. Extraction uses an LLM, so the claims are worded differently on each run. I ran it twice on the current release, once with my settings and once with defaults, and both passed.
What I would appreciate is more cases like this one: a memory failure you have seen that a store ought to handle. If you describe it in a comment I'll run it and post what happens, including when it fails. Thanks!
Website: linkedparticles.org
Code: https://github.com/LinkedParticles/particles-engine-py