You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A fact currently lives in exactly one place. MemoryStore is a BTreeMap<String, Branch>, each Branch owns a Vec<VersionedValue> of details, and a detail belongs to that branch and to nothing else. That is a single parent tree, and the parent is a topic name chosen by an 8B classifier at write time.
Retrieval into generation does not use that tree at all (see #8): it is the driver's message index, which is lexical, BM25 plus embeddings over raw message text. The consequence is structural, not a tuning problem: a question can only reach a fact whose words overlap the question's words.
When an answer needs two facts and the question shares vocabulary with only one of them, the other is unreachable no matter how good the reranker is.
Why it matters
This is the failure that survived every other fix in the repo, and we now have it measured twice in different clothing (see #13 and 9ece598):
Composition, "am I over my monthly API allowance", needs the plan limit and the month's usage. 1 of 7 at scale.
Date shift, "when is my dentist appointment", needs "October 14th" and "pushing everything back a week". The second mention shares no token with "dentist", so it usually does not load and the model answers the stale date. 3 of 7 at scale.
Meanwhile the parts that are not retrieval bound are fine: contradiction chains 7 of 7, arithmetic through the calculator 7 of 7. The answer model is not the weak link. Reachability is.
Hypothesis
Replace single parent branches with multi parent entity nodes: a fact attaches to every entity it mentions rather than being filed under one classifier chosen topic. A statement like "took the cat to the vet on the 3rd" becomes reachable from cat, from vet, and from the date, instead of living under whichever single branch won.
Retrieval then becomes: resolve the entities in the question, then traverse edges, rather than match tokens. Composition becomes a walk between two nodes rather than a lexical coincidence.
Related work
AriGraph (arXiv 2407.04363), the closest structural precedent: a memory graph integrating semantic memory (facts as KG vertices and edges) with episodic memory (specific experiences as episodic vertices and edges), supporting associative retrieval of interconnected concepts for planning.
HeLa-Mem (arXiv 2604.16839): models conversation history as a dynamic Hebbian graph where co-activated memories strengthen their connections, retrieves by base activation then spreading activation, and consolidates hub clusters to prevent graph explosion. Evaluated on LoCoMo, the same benchmark we use, so its numbers are directly comparable to ours.
HyMem (arXiv 2602.13933): dual granular storage with a two tier retrieval scheduler, a cheap summary path plus an LLM based deep path activated only for complex queries. Relevant to keeping graph traversal off the hot path, since our retrieval budget is about 50ms against 2 to 3s of generation.
The cold start caveat we have to plan around
HeLa-Mem states the limitation directly: "Hebbian weights require sufficient interaction history to accumulate, meaning the benefits of associative retrieval are less pronounced in early conversation stages." Their proposed remedy, initializing edges from semantic similarity as a prior, is left as future work.
This lands on us specifically. Every discriminate run is a 34 to 54 turn transcript, which is exactly the regime where a graph whose edges are learned has not warmed up. If we adopt an association learned graph and test it on our current harness, we will measure the cold start, not the mechanism. Two implications:
Seed edges deterministically at ingest from entity co-occurrence, which is available on turn one, rather than relying only on learned weights.
Problem
A fact currently lives in exactly one place.
MemoryStoreis aBTreeMap<String, Branch>, eachBranchowns aVec<VersionedValue>of details, and a detail belongs to that branch and to nothing else. That is a single parent tree, and the parent is a topic name chosen by an 8B classifier at write time.Retrieval into generation does not use that tree at all (see #8): it is the driver's message index, which is lexical, BM25 plus embeddings over raw message text. The consequence is structural, not a tuning problem: a question can only reach a fact whose words overlap the question's words.
When an answer needs two facts and the question shares vocabulary with only one of them, the other is unreachable no matter how good the reranker is.
Why it matters
This is the failure that survived every other fix in the repo, and we now have it measured twice in different clothing (see #13 and 9ece598):
Meanwhile the parts that are not retrieval bound are fine: contradiction chains 7 of 7, arithmetic through the calculator 7 of 7. The answer model is not the weak link. Reachability is.
Hypothesis
Replace single parent branches with multi parent entity nodes: a fact attaches to every entity it mentions rather than being filed under one classifier chosen topic. A statement like "took the cat to the vet on the 3rd" becomes reachable from
cat, fromvet, and from the date, instead of living under whichever single branch won.Retrieval then becomes: resolve the entities in the question, then traverse edges, rather than match tokens. Composition becomes a walk between two nodes rather than a lexical coincidence.
Related work
The cold start caveat we have to plan around
HeLa-Mem states the limitation directly: "Hebbian weights require sufficient interaction history to accumulate, meaning the benefits of associative retrieval are less pronounced in early conversation stages." Their proposed remedy, initializing edges from semantic similarity as a prior, is left as future work.
This lands on us specifically. Every discriminate run is a 34 to 54 turn transcript, which is exactly the regime where a graph whose edges are learned has not warmed up. If we adopt an association learned graph and test it on our current harness, we will measure the cold start, not the mechanism. Two implications: