Summary
Two independent bugs affect memories that Recallium internally splits into chunks:
-
modify_memory update does not reach expand_memories
modify_memory(action="update") returns success.
search_memories(search_mode="keyword") can find phrases from the updated content.
- But
expand_memories still returns the old assembled content.
-
store_memory can introduce duplicated sections in assembled output
- On larger memories,
expand_memories returns content with contiguous duplicated markdown sections near chunk boundaries.
- The content is not missing, but the assembled output is corrupted.
Severity
High. This is a silent consistency problem in a core read/write path for chunked memories.
Environment
- Recallium version:
v0.8.373
- Integration: MCP server
- Client context: Claude via Anthropic tool-use API
Observed on split-parent memories ranging from about 6 KB to 20 KB. Duplication was reproduced on 4 fresh memories; update divergence was reproduced 3 times across 2 memories.
Bug 1: modify_memory updates index, but not assembled reads
Minimal reproduction
-
Call store_memory(...) with content large enough to become a split-parent memory.
-
Call expand_memories(memory_ids=[id]) and save the returned content as baseline.
-
Call:
modify_memory(
action="update",
memory_id=id,
content="<clearly different content with a unique sentinel phrase>"
)
-
Call expand_memories(memory_ids=[id]) again.
-
Call:
search_memories(
query="<sentinel phrase>",
search_mode="keyword",
project_name="test"
)
Expected
After a successful modify_memory, both:
expand_memories
search_memories
should reflect the new content.
Actual
modify_memory reports success.
search_memories finds the new content.
expand_memories still returns the pre-update assembled content.
Why this matters
The write path and read path appear to diverge for split-parent memories. An agent can successfully write new content, then immediately read back stale data.
Diagnostics already ruled out
- Not eventual consistency: repeated reads minutes later still return stale content.
- Not payload truncation:
modify_memory echoes the new content in its response.
- Not a total persistence failure: keyword search sees the new content.
- Not limited to parent expansion: expanding child chunk IDs also returns the same stale assembled content.
Bug 2: store_memory can duplicate sections at chunk boundaries
Minimal reproduction
- Call
store_memory(...) with ~10 KB or more of structured markdown containing multiple ## sections.
- Call
expand_memories(memory_ids=[id]).
Expected
The assembled content should match the input content exactly.
Actual
One or more sections near chunk boundaries are duplicated contiguously in the assembled output, for example:
## Section X
## Section X
...
Notes
- Reproduced on 4 independently created memories.
- Present on the first read after
store_memory.
- Observed even before any
modify_memory call.
- This looks like an overlap / off-by-one issue in chunk assembly.
Expected vs actual
| Area |
Expected |
Actual |
modify_memory on split-parent |
Update is reflected by expand_memories and search_memories |
Only search_memories reflects update |
expand_memories after update |
Returns new content |
Returns old content |
store_memory on larger split-parent |
Assembled output matches input exactly |
Sections can be duplicated at chunk boundaries |
| Error handling |
Clear error or partial-write signal on failure |
No warning or error |
Summary
Two independent bugs affect memories that Recallium internally splits into chunks:
modify_memoryupdate does not reachexpand_memoriesmodify_memory(action="update")returns success.search_memories(search_mode="keyword")can find phrases from the updated content.expand_memoriesstill returns the old assembled content.store_memorycan introduce duplicated sections in assembled outputexpand_memoriesreturns content with contiguous duplicated markdown sections near chunk boundaries.Severity
High. This is a silent consistency problem in a core read/write path for chunked memories.
Environment
v0.8.373Observed on split-parent memories ranging from about 6 KB to 20 KB. Duplication was reproduced on 4 fresh memories; update divergence was reproduced 3 times across 2 memories.
Bug 1:
modify_memoryupdates index, but not assembled readsMinimal reproduction
Call
store_memory(...)with content large enough to become a split-parent memory.Call
expand_memories(memory_ids=[id])and save the returned content as baseline.Call:
Call
expand_memories(memory_ids=[id])again.Call:
Expected
After a successful
modify_memory, both:expand_memoriessearch_memoriesshould reflect the new content.
Actual
modify_memoryreports success.search_memoriesfinds the new content.expand_memoriesstill returns the pre-update assembled content.Why this matters
The write path and read path appear to diverge for split-parent memories. An agent can successfully write new content, then immediately read back stale data.
Diagnostics already ruled out
modify_memoryechoes the new content in its response.Bug 2:
store_memorycan duplicate sections at chunk boundariesMinimal reproduction
store_memory(...)with ~10 KB or more of structured markdown containing multiple##sections.expand_memories(memory_ids=[id]).Expected
The assembled content should match the input content exactly.
Actual
One or more sections near chunk boundaries are duplicated contiguously in the assembled output, for example:
Notes
store_memory.modify_memorycall.Expected vs actual
modify_memoryon split-parentexpand_memoriesandsearch_memoriessearch_memoriesreflects updateexpand_memoriesafter updatestore_memoryon larger split-parent