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
MRAgent (arXiv 2606.06036, 2026-06-04) reports +23.3% relative on LoCoMo and +32% on LongMemEval over Mem0/A-Mem/MemoryOS/LangMem, at 118k tokens/sample vs Mem0's 245k and A-Mem's 632k — by replacing one-shot retrieval with an iterative loop that reasons while accessing memory. Cortex's read path is the static paradigm the paper measures as the baseline.
Current state (verified 2026-08-06)
docs/mcp-tools.md documents the read path as Route → Enrich → Fuse → Rerank → Filter — a fixed pipeline. Specifically:
core/query_intent.py:116 defines MULTI_HOP as an intent, and core/query_intent.py:151-166 scores it from a regex plus an entity-count threshold.
core/query_decomposition.py:37 maps MULTI_HOP to ["query_decomposition", "entity_bridging"] — a single decomposition pass.
core/retrieval_dispatch.py:29 places MULTI_HOP in MIXED_INTENTS, i.e. a tier selection, not a loop.
So multi-hop is detected and then answered by one-shot decomposition + entity bridging. There is no step that conditions the next memory access on evidence discovered by the previous one, and no learned stopping criterion.
What the paper does that we do not
Per §4.2 of the paper, each step t runs three phases:
Reason & select — A(t) = f_select(x, H(t), Z(t)): the LLM picks traversal actions from the query, accumulated context H(t), and active set Z(t). "Conditioning on accumulated evidence enables the agent to discover new cues and dynamically adjust its reasoning trajectory."
Termination is an LLM decision Stop(x, H(t+1)); their Figure 6 shows max-valid-turns tracking average-turns, i.e. the stop criterion is doing real work rather than always running to the cap.
The three failure modes they attribute to static pipelines map onto ours: "(i) an inability to revise strategies based on intermediate state, such as identifying 'July' as a temporal anchor; (ii) the accumulation of noise due to fixed aggregation; and (iii) heavy reliance on pre-constructed structures." Cortex's fixed WRRF fusion is precisely "fixed aggregation," and core/temporal.py scoring cannot revise on an anchor discovered mid-retrieval.
Ask
Add an iterative reconstruction tier to retrieval_dispatch.py — most naturally as the behaviour of the existing deep tier — that loops reason → traverse → prune over the entity graph with accumulated evidence and an explicit stop decision, instead of one-shot decomposition.
Depends on #362 (the tag layer is their anti-combinatorial-explosion device; without it, traversal expansion is unbounded).
Acceptance criteria
The deep tier performs ≥2 evidence-conditioned traversal rounds where round n+1's candidate set provably depends on round n's accepted evidence, with a test asserting that dependency (not just that two rounds ran).
An explicit stop decision exists, with tests for both arms: stops early on sufficient evidence, and honours a hard turn cap (§13 A3 — every failure path asserted, including the cap-hit signal emission).
Token and latency cost measured before/after on the existing harness; a regression on either is justified in writing or the change does not ship (§3.2, §13 C3).
MRAgent (arXiv 2606.06036, 2026-06-04) reports +23.3% relative on LoCoMo and +32% on LongMemEval over Mem0/A-Mem/MemoryOS/LangMem, at 118k tokens/sample vs Mem0's 245k and A-Mem's 632k — by replacing one-shot retrieval with an iterative loop that reasons while accessing memory. Cortex's read path is the static paradigm the paper measures as the baseline.
Current state (verified 2026-08-06)
docs/mcp-tools.mddocuments the read path as Route → Enrich → Fuse → Rerank → Filter — a fixed pipeline. Specifically:core/query_intent.py:116definesMULTI_HOPas an intent, andcore/query_intent.py:151-166scores it from a regex plus an entity-count threshold.core/query_decomposition.py:37mapsMULTI_HOPto["query_decomposition", "entity_bridging"]— a single decomposition pass.core/retrieval_dispatch.py:29placesMULTI_HOPinMIXED_INTENTS, i.e. a tier selection, not a loop.So multi-hop is detected and then answered by one-shot decomposition + entity bridging. There is no step that conditions the next memory access on evidence discovered by the previous one, and no learned stopping criterion.
What the paper does that we do not
Per §4.2 of the paper, each step
truns three phases:A(t) = f_select(x, H(t), Z(t)): the LLM picks traversal actions from the query, accumulated contextH(t), and active setZ(t). "Conditioning on accumulated evidence enables the agent to discover new cues and dynamically adjust its reasoning trajectory."Z(t+1) = f_route(...): the LLM prunes irrelevant branches;H(t+1) = H(t) ∪ Z(t+1).Termination is an LLM decision
Stop(x, H(t+1)); their Figure 6 shows max-valid-turns tracking average-turns, i.e. the stop criterion is doing real work rather than always running to the cap.The three failure modes they attribute to static pipelines map onto ours: "(i) an inability to revise strategies based on intermediate state, such as identifying 'July' as a temporal anchor; (ii) the accumulation of noise due to fixed aggregation; and (iii) heavy reliance on pre-constructed structures." Cortex's fixed WRRF fusion is precisely "fixed aggregation," and
core/temporal.pyscoring cannot revise on an anchor discovered mid-retrieval.Ask
Add an iterative reconstruction tier to
retrieval_dispatch.py— most naturally as the behaviour of the existingdeeptier — that loops reason → traverse → prune over the entity graph with accumulated evidence and an explicit stop decision, instead of one-shot decomposition.Depends on #362 (the tag layer is their anti-combinatorial-explosion device; without it, traversal expansion is unbounded).
Acceptance criteria
n+1's candidate set provably depends on roundn's accepted evidence, with a test asserting that dependency (not just that two rounds ran).benchmarks/reproduce.sh— not a live-DB comparison, and not our number against the paper's published one (see Three different LoCoMo number pairs published across README / docs/benchmarks / CLAUDE.md-referenced baseline — reconcile before arXiv submission #347).