Summary
memory-qdrant scrolls with a fixed SCROLL_LIMIT = 16_384 and no pagination. For a subject/collection with more points than the cap, bi-temporal reads and the forgotten-chain GC silently truncate — and a tombstone past the cap can be dropped from the dead-set, letting a forgotten memory be re-injected into recall.
Evidence
crates/memory-qdrant/src/runtime.rs:50-52 — const SCROLL_LIMIT: u32 = 16_384; with a // TODO … paginate the scroll cursor note.
crates/memory-qdrant/src/runtime.rs:354-366 — scroll_records sets .limit(SCROLL_LIMIT) and reads only points.result; no next_page_offset cursor loop. Consumed by dead_chains (:385), at_time (:494), history_of (:505).
Impact
Scale-dependent correctness bug. Most damaging case: dead_chains misses a tombstone beyond 16,384 points → a memory the user forgot is re-surfaced in recall (a bypass of the forget guarantee).
Suggested fix
Paginate via Qdrant's next_page_offset cursor until exhausted; at minimum warn when a scroll returns exactly the cap.
Summary
memory-qdrantscrolls with a fixedSCROLL_LIMIT = 16_384and no pagination. For a subject/collection with more points than the cap, bi-temporal reads and the forgotten-chain GC silently truncate — and a tombstone past the cap can be dropped from the dead-set, letting a forgotten memory be re-injected into recall.Evidence
crates/memory-qdrant/src/runtime.rs:50-52—const SCROLL_LIMIT: u32 = 16_384;with a// TODO … paginate the scroll cursornote.crates/memory-qdrant/src/runtime.rs:354-366—scroll_recordssets.limit(SCROLL_LIMIT)and reads onlypoints.result; nonext_page_offsetcursor loop. Consumed bydead_chains(:385),at_time(:494),history_of(:505).Impact
Scale-dependent correctness bug. Most damaging case:
dead_chainsmisses a tombstone beyond 16,384 points → a memory the user forgot is re-surfaced in recall (a bypass of the forget guarantee).Suggested fix
Paginate via Qdrant's
next_page_offsetcursor until exhausted; at minimum warn when a scroll returns exactly the cap.