Skip to content

recall: the read path is static retrieve-then-rerank — no evidence-conditioned reconstruction loop (MRAgent, +23% LoCoMo) #361

Description

@cdeust

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:

  1. Reason & selectA(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."
  2. Controlled traversal — apply operators (Cue→Tag, (Cue,Tag)→Content, Content→(Cue,Tag)) to expand candidates.
  3. Route & pruneZ(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.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).
  • Paired benchmark arms at the same commit via 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).
  • Zero surviving non-equivalent mutants on the changed files (§12).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions