Preprint · July 2026Patent pending

Causal-Graph Memory for AI Agents: Multiplicative Retention Scoring and Conjunctive Active Forgetting

Abstract

Long-horizon memory for LLM agents is usually framed as a retrieval problem: store everything in a flat similarity index and search harder. We argue it is primarily a retention-and-structure problem — deciding what a memory system keeps, how memories relate, and what it may safely forget — and we present Genesys, an open-source memory engine built around that thesis. Genesys maintains a single causal graph per user in which every memory is a node, typed edges carry causal relationships, and “memory layers” are status tags on nodes rather than separate stores. Retention is governed by a multiplicative three-force score — relevance × causal connectivity × ACT-R base-level activation — in which any vanishing force collapses retention weight, and deletion is governed by a deliberately conjunctive predicate: a memory is pruned only if it is simultaneously below a score threshold, causally orphaned, unpinned, non-core, and non-shared. We give the formal model, an exact account of which components are faithful to ACT-R and which are deliberate departures, and the lifecycle machinery (status FSM, episodic→semantic consolidation, BFS reactivation cascades). We are candid up front that in the evaluated configuration the two headline lifecycle mechanisms are largely unexercised: the shipped recall path does not trigger the cascade, and the conjunctive deletion predicate is gated in practice by structural orphanhood rather than by its score term. The certified gains therefore rest on retention structure and retrieval, and demonstrating the forgetting and revival machinery under load is explicitly future work (§4.4). On the LoCoMo benchmark under a frozen, comparable protocol (the Mem0-paper protocol: gpt-4o-mini answerer and judge at temperature 0, verbatim judge prompt, categories 1–4, n = 1,540), Genesys scores 85.55 ± 0.37 over 10 independent full runs, versus 66.9 published for Mem0 and 75.14 for Zep under the same protocol. We additionally report what most system papers omit: a measured 5.4% answer-regeneration churn floor at temperature 0; a pre-registered persistence gate that the certified configuration fails (persistently losing ~72 baseline-correct answers while persistently gaining ~170, a 2.4:1 trade, disclosed rather than waved through); an estimated oracle-retrieval ceiling of ~94.9 under the frozen protocol; and three reranking designs that reduced accuracy and were abandoned. The evaluation harness is public.

Introduction

The prevailing engineering answer to long-term memory for LLM agents is a flat vector store plus retrieval-augmented generation: embed every utterance or extracted fact, retrieve the top-k nearest neighbors at question time, and hand them to the model. This framing treats memory as a search problem over an append-only corpus. It has two structural deficits that grow with conversation scale.

First, flat stores have no structure over time or cause. A ten-session relationship between “adopted a puppy in March,” “switched to a larger apartment,” and “cut the travel budget” is not recoverable from pairwise cosine similarity; it is a chain of causally linked events. Retrieval over an unstructured store must rediscover such structure at query time, every time, from lexical and semantic proximity alone — and multi-hop and temporal questions are precisely where flat baselines degrade on long-conversation benchmarks [9].

Second, append-only stores have no principled account of forgetting. A store that never forgets accumulates contradictions, stale facts, and noise that degrade retrieval precision; a store that forgets by simple recency or by a scalar importance threshold will eventually delete something that was low-salience but structurally load-bearing. What is needed is not no forgetting and not aggressive forgetting, but forgetting with a defensible safety argument.

This paper describes Genesys, an open-source memory engine (genesys-memory, AGPLv3) designed around the thesis that memory quality is a retention-and-structure problem, not a retrieval problem. Its design commitments are:

  1. One graph, not tiers. All memories for a user live in a single causal graph. Nodes are memories; typed edges (caused_by, supports, derived_from, related_to, contradicts, supersedes, plus a neutral temporal_sequence ordering type) are first-class relationships. “Layers” (active, episodic, semantic, core, dormant) are status tags on nodes; lifecycle transitions are property updates, and edges never break during a transition.
  2. Multiplicative retention scoring. Every node carries a retention weight s = R × C × A: query/context relevance, causal-connectivity, and an ACT-R base-level activation term [2, 4]. The multiplicative composition is a deliberate departure from ACT-R's additive activation: a memory that is fully irrelevant, fully disconnected, or never reactivated should not be rescued by strength on another axis alone.
  3. Conjunctive active forgetting. Deletion requires the conjunction of failure on every survival axis: score below threshold and causally orphaned and not pinned and not core and not organization-shared. A low retention score is necessary but never sufficient for deletion; a single supportive edge is an absolute veto.
  4. Legibility. The score is decomposable and exposed: the engine can explain, per memory, the live value of each force and what would change it. Retention weight is a ranking and lifecycle signal, not a hidden deletion countdown.

We evaluate on LoCoMo [9], the standard very-long-conversation QA benchmark, under a deliberately frozen protocol chosen for comparability rather than for score maximization: the Mem0-paper protocol [5], which is also the protocol behind every public Zep LoCoMo number [13]. Under this protocol Genesys certifies at 85.55 ± 0.37 (mean ± 1 std over 10 independent full runs, n = 1,540), against 66.9 published for Mem0 and 75.14 for Zep.

A second contribution of the evaluation is methodological. We measured, and report, phenomena that single-run benchmark claims silently absorb: (i) a 5.4% per-run answer-regeneration churn at temperature 0, which makes single-run deltas below ~1 pp uninterpretable and motivated certifying by 10-run mean and gating improvements on cross-run persistence; (ii) a pre-registered persistence gate that our certified configuration formally fails — it persistently loses ~72 of the baseline's correct answers while persistently gaining ~170, a 2.4:1 trade that we disclose as a gate failure rather than netting away; (iii) an estimated oracle-retrieval ceiling (~94.9 under the frozen protocol) that bounds what retrieval-side engineering can achieve; and (iv) three reranking designs that reduced accuracy (−2.4, −2.9, −0.85 pp) and the break-even analysis explaining why. We consider negative results and disclosed trade-offs part of the deliverable: an evaluation that reports only net gains leaves its trade surface unmeasured.

Contributions. (1) A formal model of unified causal-graph memory with typed edges and a status-tag lifecycle (§3–§4); (2) a multiplicative three-force retention score with a precise accounting of its ACT-R correspondence — what is transcribed, what is modified, what is relocated, and what is novel (§3.3); (3) conjunctive active forgetting with an explicit safety argument (§4.3); (4) a frozen-protocol LoCoMo evaluation with run-level statistics, churn measurement, a disclosed failed persistence gate, an estimated oracle ceiling, and published negative results (§6); (5) an open-source implementation and a public evaluation harness (§5; Reproducibility Statement).

Related Work

Cognitive foundations

Genesys's scoring and lifecycle are grounded in three strands of memory science. Decay: Ebbinghaus's forgetting curve [7] established that unrehearsed memory availability falls steeply with time — the historical anchor for every decay-based memory system, including ours. Rational activation: Anderson and Schooler [4] showed that human memory availability tracks the environmental statistics of need — frequency, recency, and spacing of past use — and the ACT-R architecture [1–3] formalizes this as base-level activation Bi = ln Σj tj−d over a presentation history. Genesys transcribes this equation directly (§3.3). Consolidation: complementary-learning-systems theory [10] distinguishes fast episodic encoding from slow semantic integration; Genesys's episodic→semantic consolidation and its treatment of layers as stages of one substrate rather than separate stores follow this lineage.

Memory systems for LLM agents

Tiered / paging architectures. MemGPT [11] frames memory as an OS problem: a bounded main context and an external context, with the LLM paging data between them. This manages where information sits, not what it is worth keeping or how items relate; Genesys rejects the tier metaphor — there is one graph, and “tiers” are status tags that never move data.

Scored memory streams. Generative Agents [12] attach to each memory a retrieval score combining recency, LLM-rated importance, and relevance, plus periodic reflection. This is the closest prior art to Genesys's scoring, and the differences are instructive: Genesys replaces model-rated importance with measured causal connectivity (a topological property, free of an LLM call and auditable), composes forces multiplicatively rather than as a weighted combination, and uses the score to drive lifecycle and forgetting — not only retrieval ranking.

Decay-based stores. MemoryBank [15] applies an Ebbinghaus-inspired forgetting curve to stored memories, strengthening those that recur. Genesys shares the decay lineage but differs in the deletion decision: MemoryBank-style designs delete on a scalar signal, whereas Genesys requires conjunctive failure including causal orphanhood (§4.3).

Graph and knowledge-graph memory. Zep [13] stores agent memory in Graphiti, a temporally-aware knowledge graph with entity resolution and edge invalidation. HippoRAG [8] applies hippocampal-indexing theory to corpus QA, running personalized PageRank over an extracted KG at retrieval time. A-MEM [14] maintains Zettelkasten-style atomic notes whose links are agentically created and revised. Genesys shares the graph substrate with these systems but differs in what the graph is for: in Genesys the edge set is a survival signal — connectivity is a multiplicative force in retention and orphanhood is a hard deletion gate — rather than only a retrieval structure. Genesys edges are also typed causally (including contradicts and supersedes, which are deliberately excluded from the survival count) rather than being generic entity relations.

Production memory pipelines. Mem0 [5] is the reference production pipeline: LLM-based fact extraction, update resolution, and retrieval, evaluated on LoCoMo with a fully specified protocol. Genesys is evaluated under exactly that protocol (§6.1) because it is the only fully specified LoCoMo protocol shared by the systems we compare against.

Positioning, stated plainly. No single mechanism in Genesys is unprecedented: decay scoring, graph memory, consolidation, and forgetting each have prior art above. The contribution is the specific composition — a cognitively grounded retention score whose forces are multiplicative, a causal edge set that doubles as the safety case for deletion, a lifecycle FSM over one substrate, and an evaluation methodology that reports its own noise floor, failed gates, and dead ends — together with evidence that this composition exceeds the published graph and pipeline baseline results under a frozen comparable protocol.

Evaluation practice for conversational memory

LoCoMo [9] generates very-long-term multi-session conversations and QA pairs spanning single-hop, multi-hop, temporal, open-domain, and adversarial categories, and has become the de facto benchmark for agent memory systems. Its use in the systems literature, however, has been marred by comparability failures that directly shaped our methodology. Published LoCoMo scores are functions not only of the memory system but of the answering model, the judge model, the judge prompt (LLM judges for this benchmark are deliberately generous, accepting topically-equivalent paraphrases), the category set, and the denominator — and these have varied across publications. The most instructive episode is the public Mem0–Zep dispute: Zep's initially blogged LoCoMo figure contained a numerator/denominator mismatch on the excluded adversarial category, was recomputed sharply downward by Mem0, and was separately corrected by Zep itself — with all three numbers produced on Mem0's evaluation methodology, since Zep's own paper [13] evaluates DMR and LongMemEval and never defined a LoCoMo methodology. Separately, several vendors market LoCoMo scores obtained with stronger answerers or judges than any competitor's published configuration, which are incomparable by construction. The lesson we draw, and operationalize in §6.1, is that a LoCoMo claim is only meaningful relative to a fully frozen protocol shared with the numbers it is compared against — and that run-level statistics are mandatory, because a single run of a temperature-0 LLM answer-and-judge pipeline is measurably noisy (§6.5).

The Genesys Model

Memory graph

For each user, Genesys maintains a directed graph G = (N, E). A node n ∈ N is a memory carrying content (full text and summary), an embedding en, extracted entity references ℰn, a status tag σ(n) ∈ {tagged, active, episodic, semantic, core, dormant}, a pin flag, a visibility scope (private or org), a retention weight s(n) (the retention score; persisted under the legacy field name decay score and surfaced to agents under the API alias activation, both retained for backward compatibility; default 1.0 at creation; nominally in [0, 1], though the query-path relevance term is unclamped — see §3.2), a reactivation history Tn = {t1, …, tm} of timestamps (creation plus every recall), a stability scalar (§3.3), and bookkeeping timestamps (created / last-accessed / last-reactivated).

An edge ε ∈ E has a source, a target, a type, a weight, and an optional natural-language reason. Edge types are partitioned:

𝒯causal = { caused_by, supports, derived_from } 𝒯supp = 𝒯causal ∪ { related_to } 𝒯neg = { contradicts, supersedes } 𝒯neut = { temporal_sequence }(1)

The neutral type temporal_sequence records conversational ordering and counts toward neither degree notion below. The supportive/negative partition induces two distinct degree notions that are load-bearing throughout the system. The causal degree κ(n) counts incident edges (either direction) of causal type and drives the connectivity force below. The supportive degree δ(n) counts incident edges of supportive type and defines orphanhood: n is an orphan iff δ(n) = 0. related_to — the type used for automatic similarity links — is supportive but not causal: a node held in the graph only by auto-links has κ = 0 yet is protected from deletion. Negative edges are neither: a node whose only edges are contradicts or supersedes links is an orphan for survival purposes. Edge weights are stored and surfaced for ranking and explanation, but the connectivity force is a function of edge count, not weighted flow: connectivity in Genesys is topological degree.

The multiplicative retention score

Every node's retention weight is the product of three forces:

s(n; q) = R(n, q) × C(n) × A(n) relevance × connectivity × activation(2)

The composition is multiplicative by design: a zero on any force collapses the product. The constants below are the shipped defaults; all are environment-configurable.

Force 1: Relevance. Against a query or context q with embedding eq and entity set ℰq,

R(n, q) = wv · cos(en, eq) + wk · |ℰn ∩ ℰq| ⁄ max(|ℰn|, 1), wv = 0.7, wk = 0.3(3)

When no context embedding is supplied — the at-rest case used by background rescoring — the term is replaced entirely by a bounded linear recency:

Rrest(n) = max( 0.1, 1 − Δdays(n) ⁄ 365 )(4)

where Δdays is days since last access. An untouched memory's at-rest relevance therefore drifts linearly toward a floor of 0.1 over one year and never reaches zero: at rest, relevance alone cannot kill a memory. Two implementation facts deserve note. The overlap term is deliberately asymmetric: it normalizes by the node's entity count rather than by a Jaccard union over both sets, so a small, precisely tagged memory is not diluted by a verbose query context. And the cosine term is not clamped in the shipped implementation: cos ∈ [−1, 1], so on the query path relevance — and therefore the product — can in principle be negative for anti-correlated embeddings, which simply ranks the node last; the at-rest path is bounded below by 0.1.

Force 2: Connectivity. Let κmax be the maximum causal degree in the user's graph. Then

Craw(n) = ( log₂(1 + κ(n)) ⁄ log₂(1 + κmax) )² C(n) = 0 if δ(n) = 0 (orphan); C(n) = max( Craw(n), 0.1 ) otherwise(5)

with Craw = 0 when κmax = 0. Three properties are intentional. Log-normalization against κmax makes connectivity relative to the busiest hub in the user's own graph rather than to an absolute scale. Squaring is a deliberate convexity that rewards genuine hubs and suppresses barely-connected nodes. The floor of 0.1 guarantees that any non-orphan node — even one held by a single related_to auto-link, for which Craw = 0 — retains a tenth of full connectivity: one good edge keeps a memory alive. The orphan case is the only hard zero in the entire formula, and it is exactly the state that active forgetting tests for (§4.3).

Whether κmax is the right normalization reference is an open design question (B4, §4.4); the text here describes only what the shipped implementation does.

Force 3: Base activation (ACT-R base level). With presentation history Tn (creation timestamp plus one entry per reactivation), elapsed times tj in seconds clamped to ≥ 1, and decay exponent d = 0.5:

B(n) = ln Σj=1…m tj−d, A(n) = min( 1, eB(n) ) = min( 1, Σj tj−1/2 )(6)

Equation (6) is the canonical ACT-R base-level learning equation [2] at ACT-R's canonical default d = 0.5, exponentiated and clamped to the unit interval. For a write-once memory (single timestamp at age E seconds), A = min(1, E−1/2): 1.0 at one second, 0.1 at 100 seconds, 0.01 at 104 seconds. Every recall appends a fresh timestamp whose small elapsed time contributes a large t−1/2 term, so retrieval raises the score — the central legibility property of the system: the retention weight is something the user's own usage visibly feeds. To avoid overloading the word activation — which the API also exposes as an alias for the whole product — we refer to A(n) as the base activation factor throughout.

Why a product and not a sum. The multiplicative form is the load-bearing design decision, so we state the argument rather than assert taste. An additive or weighted-sum composition — the form used both by ACT-R's total activation and by Generative Agents' retrieval score [12] — has compensation semantics: strength on one axis buys back weakness on another. For retrieval ranking alone that is often acceptable; for a score that also drives lifecycle and gates deletion it produces two characteristic failure modes. First, the immortal hub: under addition, a heavily connected memory retains substantial score even when it has not been relevant or recalled in a year, so structural importance alone pins stale knowledge at high rank indefinitely. Second, the noisy singleton: a memory highly similar to the current query but disconnected and never reused scores competitively with genuinely established knowledge, letting one-off noise crowd the context window. The product gives each force veto power over rank: a memory surfaces strongly only when it is simultaneously relevant now, embedded in causal structure, and behaviorally alive. The obvious objection — that veto power makes the product dangerously aggressive as a deletion signal — is correct, and is exactly why deletion is not delegated to the score: the conjunctive gate of §4.3 exists to absorb that aggression. Two monotonicity properties follow directly from the definitions and match user-facing intuition: A(n) is strictly increased by every recall (each appends a fresh t−1/2 term) and strictly decays between recalls; and C(n) is nondecreasing in the node's own causal degree, but relative — adding edges elsewhere can dilute a node's connectivity through κmax, so hub status is earned against the user's own graph, not an absolute scale.

Worked decomposition. Table 1 decomposes the score for three memories from a ~50-node field workload, computed by the released implementation. The order-of-magnitude gap between the recalled memories (A, B) and the write-once memory (C) is driven almost entirely by Force 3. Note that C's score (≈ 0.005) is below the forgetting threshold of 0.01 — and C is nevertheless not deletable, because it retains a supportive edge. That interplay is the subject of §4.3.

Table 1. Worked decomposition of Eq. (2) for three memories in a ~50-node workload. The write-once row is a snapshot at age ≈145 s (A = 0.083 ⇒ E ≈ 0.083−2 ≈ 145 s), not an error. C falls below the forgetting threshold (0.01) yet survives: it is not an orphan.

MemoryRCAs
Most-recalled hub0.880.620.79≈ 0.43
Often recalled0.800.550.48≈ 0.21
Write-once, never recalled0.600.100.083≈ 0.005
10⁰10⁻¹10⁻²10⁻³10⁻⁴306090120150180DAYS SINCE CREATIONRETENTION SCORE scounterfactual: under continuing daily access, A clamps at 1.0 — the curve never leaves this lineθf = 0.01 — forgetting thresholdday 120 — A crosses θf← 30-day daily-access burst ends at day 29Aκ=15 · burstCκ=2 · burstBκ=15 · one access
Figure 1. Multiplicative interaction of the three forces, computed by the released scoring implementation (log y-axis; relevance held at 1.0 to isolate the varied forces). Access schedule, stated exactly: the reactivated trajectories are accessed once per day over days 0–29 of the memory's life — a bounded 30-access burst — and never again; scores are plotted from day 30 to day 180 as the burst recedes into the past. A: high connectivity (κ = 15 = κmax, factor 1.00) with the burst. B: same connectivity, single access at creation. C: low connectivity (κ = 2, factor 0.157) with the burst. A-vs-B isolates the reactivation force; A-vs-C isolates the connectivity force. The horizontal dotted line is the active-forgetting threshold θf = 0.01; trajectory A first crosses it at day 120, and only because access has ceased — under continuing daily access the base activation sum stays clamped at 1.0 (a fresh t−1/2 term arrives every day, a measured counterfactual) and A never approaches θf. Crossing the threshold is a deletion precondition, never a deletion decision (§4.3).

Correspondence to ACT-R: transcribed, modified, relocated, novel

Because “ACT-R-inspired” covers everything from faithful implementation to loose homage, we state the correspondence exactly.

Transcribed unmodified. The base-level term is the ACT-R base-level learning equation Bi = ln Σj tj−d with the canonical default d = 0.5 [2, 4]. The reactivation history is the presentation history {tj}; each recall appends one presentation.

Modified. Standard ACT-R converts activation to a retrieval probability through a logistic P = 1 ⁄ (1 + e−(Ai − τ)/s) with threshold τ and noise s. Genesys does not: it computes eBi — recovering the raw activation odds Σj tj−d — and hard-clamps to [0, 1]. There is no retrieval threshold, no logistic, and no activation noise. This is a deliberate simplification: Genesys needs a bounded deterministic factor for a product, not a stochastic retrieval model.

Relocated. ACT-R's total activation is additive: Ai = Bi + Σj Wj Sji, base level plus context-source spreading activation. The Genesys retention score contains no additive spreading term. The spreading idea instead appears in two discrete mechanisms elsewhere in the engine: a small recall-time ranking bonus (+0.05 per edge among co-retrieved results), which affects ranking but not stored activation; and BFS cascade reactivation (§4.2), which propagates a bounded reactivation write (a reactivation-count increment and last-reactivated timestamp refresh) to graph neighbors, with geometric distance decay gating dormant revival. What propagates is lifecycle protection, not activation: the cascade write feeds the dormancy shield and can revive dormant neighbors, but it never enters the timestamp history that feeds Eq. (6), so no score-side quantity spreads along edges. ACT-R spreading survives here as a ranking bonus plus protective graph traversal, not as an activation term.

Novel (not ACT-R). The multiplicative three-force composition itself (ACT-R composes additively); the connectivity force of Eq. (5), which is a graph-centrality construct with no ACT-R analogue; the relevance force, an IR/embedding construct standing in the role of ACT-R's partial matching but formulated independently; and the stability scalar, a dial in the spaced-repetition lineage [7]: each reactivation applies stability += 0.1 ⁄ stability, a diminishing-return reinforcement update. Because the update carries no inter-review-interval term, it implements diminishing-return reinforcement rather than the empirical spacing effect proper, and we do not claim otherwise. Stability never enters the retention product; it feeds core promotion (§4.1) and is reported by the explanation surface. ACT-R partial matching, mismatch penalties, and activation noise are not implemented.

Memory Lifecycle

Status FSM

Statuses are tags on nodes of the one graph; transitions are property updates and never break edges. On each maintenance pass, the transition engine recomputes Eq. (2) in its at-rest form and persists the fresh score for every active, episodic, and semantic node that is neither core nor org-visible, then applies the rules of Table 2 (Figure 2). tagged nodes are governed by an edge/age rule alone — promoted to active the moment an edge forms, or expired to dormant after 24 h without one — and dormant nodes are not re-examined by the scoring pass. Neither tagged nor dormant nodes have their persisted score refreshed by this cycle: each retains its last-persisted value, which for a node that has never been rescored is the creation default of 1.0. This scoping is load-bearing for the forgetting analysis of §4.3.

Table 2. Lifecycle transitions and shipped default constants (all environment-configurable).

FromToCondition
taggedactivean edge formed (δ(n) > 0) — immediate
taggeddormantorphan and age > 24 h
activeepisodics < 0.6 on 3 accumulated evaluations (counter resets on transition)
episodic / semanticdormants < 0.15 and >90 days since last reactivation and reactivation count < 3
dormantepisodicrevival by cascade: incoming cascade strength ≥ 0.1 (§4.2)
TAGGEDACTIVEEPISODICSEMANTICDORMANTCOREPRUNEDedge formedimmediates < 0.6 × 3 evalsconsolidation mints≥ 3 share an entityorphan · age > 24 hs<0.15 · >90d · n<3cascade revivals(h) ≥ 0.1composite promotion(any status) ≥ 0.55exempt from forgetting;pins never overwrittenconjunctive predicate only — Eq. (7):s < θf ∧ orphan ∧ ¬pinned ∧ ¬core ∧ ¬orgstatuses are tags on one graph —transitions are property updates;edges never break
Figure 2. The memory-lifecycle finite-state machine. Statuses are tags on nodes of a single graph; transitions are property updates; edges are never broken by a transition. semantic is minted by consolidation, core by composite promotion; dormant nodes remain in the graph and are revivable by reactivation cascades.

Three semantics deserve emphasis. First, activeepisodic requires three accumulated low-score evaluations, a hysteresis against transient irrelevance. Second, the dormancy rule's reactivation-count clause is a frequency shield: a node reactivated three or more times can never go dormant regardless of score or age. In the shipped release the count is incremented by direct retrieval — every recall that returns the node applies a reactivation write — and by the cascade mechanism of §4.2 when a cascade is executed; because the shipped recall path does not itself invoke the cascade, the shield is in practice earned by direct retrieval. Third, neither semantic nor core is reachable through this FSM: they are minted by consolidation and promotion respectively, described next. The design of the shield itself is an open question (B3, §4.4).

Consolidation (episodic → semantic). Following the fast-episodic / slow-semantic division of complementary-learning-systems theory [10], when three or more episodic memories share an entity reference, the engine synthesizes a single semantic node from their contents (an LLM summarization step, run asynchronously), embeds it, and links it to each source with a derived_from edge. The episodic sources are not deleted; they remain in the graph, now causally connected to the semantic abstraction — consolidation adds structure rather than destroying evidence.

Core promotion. core status (never auto-forgotten, surfaced preferentially) is granted either by category fast-path or by a composite consolidation score 0.4 · A(n) + 0.3 · hub(n) + 0.2 · schema(n) + 0.1 · stability(n) ≥ 0.55, where hub is supportive degree normalized by the graph's average degree (capped), and schema is the fraction of the node's neighbors that are themselves better-connected than average — an ACT-R-flavored blend of activation, hub importance, and schema fit. User pins are never overwritten by promotion machinery.

Contradiction and supersession. Conflicting knowledge is represented, not resolved by overwriting. Corrections arrive through memory_amend (§5), which creates a new node with a supersedes edge to the old one; contradiction detection runs asynchronously and can link conflicting nodes with contradicts edges, while the synchronous store path may at most return heuristic conflict hints to the writing agent, never auto-created negative edges. Because negative edges count toward neither the connectivity force nor orphanhood protection (§3.1), the lifecycle handles stale knowledge gracefully: a superseded fact decays in rank as recall down-weights it, drifts through the FSM toward dormancy, and — once nothing supportive references it — becomes structurally eligible for forgetting, with its provenance (what corrected it, and why) preserved and traversable unless and until the ordinary retention policy removes the obsolete node — a hard delete removes the node and its incident edges, including the supersedes edge. Whether superseded provenance should instead be exempted from hard deletion is an open design question (B5, §4.4).

Reactivation cascades

The cascade is the relocated form of ACT-R spreading (§3.3), and its shipped semantics are lifecycle protection, not score propagation. The mechanism runs a breadth-first traversal from an accessed node with depth 2 and geometric attenuation: hop strength s(h) = γh with γ = 0.3, i.e. 0.3 at one hop and 0.09 at two, zero beyond. Each reached node — the traversal's seed excluded — receives a bounded reactivation write: its reactivation count is incremented and its last-reactivated timestamp refreshed. The attenuated hop strength s(h) does not scale the magnitude of that write, and the write does not append to the reactivation-timestamp history that feeds the base-level sum of Eq. (6), which grows only on direct retrieval — so a cascade never changes a neighbor's base activation factor or retention score. What the cascade write protects is lifecycle position: it advances the neighbor toward the dormancy shield's count threshold, refreshes the recency clause of the dormancy rule, and — the one thing the hop strength gates — revives a dormant neighbor to episodic when the arriving strength is ≥ 0.1, so a direct neighbor of a recalled memory can wake, but a two-hop neighbor (0.09 < 0.1) cannot. Direct retrieval remains the only score-strengthening event: the shipped recall path applies, to every returned node, a reactivation write that additionally appends a fresh timestamp to the base-level history, and that append is what raises A(n). In the shipped release the recall path performs these direct writes but does not invoke the cascade; whether to wire the cascade into recall is an open integration decision (§4.4). One consequence deserves to be stated plainly: because cascade revival is the only dormantepisodic transition in the FSM (§4.1) and no shipped code path invokes the cascade, in shipped operation dormancy is effectively a one-way door — nothing revives a dormant node, and the dormancy shield's cascade-earned clause is correspondingly dead in practice. Wiring the cascade into recall would make both revival and the transitive shield live at once; that is precisely the B3 integration question (§4.4). Figure 3 therefore demonstrates revival by invoking the cascade directly.

(A) HOP ATTENUATION s(h) = 0.3ʰ0.00.10.20.3gateh=1h=2h=30.30 ≥ 0.1 · clears0.09 < 0.1 · gatedno writehop depth (BFS, depth ≤ 2)(B) MEASURED CHAIN · Δ COUNT = [0, 1, 1, 0, 0]d0seedd+1revivedd+1gated outd0untouchedd0untouchedd₀ seed — excluded · d₁ revived → EPISODIC (0.3 ≥ 0.1)d₂ written, not revived (0.09 < 0.1) · d₃, d₄ beyond depth 2cascade writes never touch base-level history — no score change
Figure 3. The shipped cascade executed on a live five-node chain; all values measured by running the released implementation. (A) Hop strength attenuates geometrically (s(h) = 0.3h) and gates exactly one thing — dormant revival: one hop (0.3 ≥ 0.1) clears the gate, two hops (0.09 < 0.1) does not, and nodes beyond depth 2 receive no write. (B) Executing the cascade from d0 with d1–d4 dormant: measured reactivation-count deltas are [0, 1, 1, 0, 0] — the cascade excludes its own seed by construction, so d0 receives no write; d1 is revived to episodic, d2 is written but gated out of revival, and d3, d4 are untouched. The figure invokes the cascade directly, which is the only way to exercise it: in shipped operation a recall of d0 would additionally apply the seed's own direct-retrieval write (a count increment and a base-level-history append) but would not fire the cascade at all (§4.2). We isolate the cascade here because what propagates along the graph is the behavior in question. A cascade write increments the reactivation count and refreshes the last-reactivated timestamp only; it does not alter the base-level activation history, so no neighbor's retention score changes.

Conjunctive active forgetting

Forgetting in Genesys is not a storage optimization; it is a retrieval-precision and hygiene mechanism. An append-only store accumulates one-off noise, superseded facts, and orphaned fragments whose only effect is to compete with genuine memories for the top-k — §6.8 quantifies, in a different setting, how expensive contaminated candidate sets are. The engine therefore forgets actively, but under a predicate designed to make wrongful deletion structurally impossible rather than merely unlikely. The forgetting sweep may hard-delete a node n (removing it and its incident edges, and reporting the pruned IDs to the caller) only when all of the following hold:

srest(n) < θf ∧ δ(n) = 0 ∧ ¬ pinned(n) ∧ σ(n) ≠ core ∧ vis(n) ≠ org, θf = 0.01(7)

The argument for conjunction. The multiplicative score and the conjunctive gate are complements. The product of Eq. (2) is intentionally harsh — it exists to rank, and a memory weak on any axis should rank low. Precisely because the score is harsh, it cannot be trusted as a deletion criterion on its own: a memory can be temporarily irrelevant (no recent queries touch it), rarely reactivated (activation decays as t−1/2), and still be structurally load-bearing — the fact that explains three other facts. Eq. (7) therefore demands simultaneous failure on every survival axis: informational (score below threshold), structural (causally orphaned — and orphanhood is measured on supportive degree, so even a single automatic related_to link is an absolute veto), and intentional (not pinned by the user, not promoted to core, not shared at organization scope). How the shipped configuration actually behaves follows from three code facts, and we state them plainly. First, the sweep performs no scoring of its own: it tests the currently-persisted score, and the background transition cycle refreshes that score only for active, episodic, and semantic nodes (§4.1); a node whose persisted score predates its orphanhood is judged on that stored value. Second, the score and orphanhood conditions are not independent under the shipped constants: orphanhood zeroes the connectivity factor, so any orphan rescored since it became an orphan has score exactly 0 and satisfies the threshold automatically — the nodes actually driven below θf are precisely orphaned active/episodic/semantic nodes. Third, a node that reaches dormant retains its last-persisted score and is not re-evaluated by the cycle, and a tagged node is never rescored at all, so a tagged orphan expires to dormant still carrying its creation default of 1.0; the taggeddormant→forgotten lifecycle therefore does not, by itself, prune under the shipped cycle. In the evaluated configuration, deletion is structurally gated: the operative protections are the orphan test and the intentional vetoes, with the score threshold binding only for orphans whose persisted score is stale. Whether the predicate should be restructured so the score condition is independent of orphanhood is an open design question (B1, §4.4).

The worked example makes the division of labor concrete: memory C in Table 1 sits at s ≈ 0.005 < θf, yet holds one supportive edge and is therefore not deletable. It rests — ranked low, fully retrievable, costing nothing but storage — until either a future recall lifts its activation (each recall appends a large t−1/2 term and triggers a cascade) or it genuinely loses its last connection. A low retention weight is a precondition of deletion, never a sentence; deletion requires that no currently recognized supportive dependency or association — causal or topical — qualifies the memory for retention protection (supersedes and contradicts edges, though meaningful, deliberately do not count). This is the mechanism by which Genesys avoids the catastrophic failure mode of scalar-threshold forgetting: silently deleting low-activation-but-embedded knowledge.

Conversely, the gate never blocks ranking: superseded and contradicted memories keep negative-type edges only, which count for neither force 2 nor orphanhood protection, so a corrected fact decays in rank and, once nothing supportive references it, becomes eligible for pruning — while the correction that superseded it carries the structure forward.

Open design questions

Field use and the code audit behind this paper surfaced design questions on which the shipped implementation takes a defensible but not obviously final position. We record them here, unresolved, rather than silently picking answers; the body text above describes only what ships.

  • B1 — deletion-predicate structure (§4.3). Whether the deletion predicate should be restructured so the score condition is independent of orphanhood — e.g. a deletion score that excludes connectivity paired with a separate orphan gate, a nonzero orphan connectivity value so the score threshold regains discriminative meaning, or an explicit reframing of the mechanism as a graph-structural deletion gate.
  • B2 — auto-link veto (§4.3). Whether machine-inferred related_to auto-links should retain an absolute, non-expiring deletion veto, versus distinguishing writer- or user-verified causal edges (absolute veto) from machine-inferred relatedness that expires, loses veto power when stale, requires periodic validation, or vetoes only above a confidence threshold.
  • B3 — dormancy shield (§4.1). Whether the lifetime reactivation-count dormancy shield should distinguish direct retrievals from cascade-propagated increments, use a rolling window or frequency-per-time instead of a lifetime count, decay over time, or act as a modifier rather than a categorical veto. A sibling integration question is whether the cascade should be invoked by the recall hot path at all — in the shipped release it is not (§4.2).
  • B4 — connectivity reference (§3.2). Whether connectivity should remain normalized against the graph-wide maximum causal degree κmax — under which unrelated growth elsewhere in the graph can lower a node's connectivity factor, and hence its lifecycle trajectory, with nothing about the node changing — or move to a percentile, capped, moving-average, fixed, or local-neighborhood reference.
  • B5 — supersession provenance (§4.1). Whether superseded-memory provenance (the obsolete node and/or its supersedes edge) should be exempted from hard deletion — e.g. tombstoned or archived — or remain subject to the ordinary retention policy as described here; any public description of amendment as “kept for audit” must match whichever ruling is made.
  • B6 — minimum-age / eligible-status guard (§4.3). The shipped predicate imposes no minimum node age. Because an active node orphaned by deletion of its sole supporting neighbor is rescored to (near) zero on the next background cycle, it can become deletion-eligible while seconds old and still query-relevant — a transient-orphan exposure that is currently bounded only by the auto-link veto (B2). Whether deletion should additionally require a minimum age since creation and membership in an eligible-status set is open.

Implementation

Genesys ships as genesys-memory, an open-source (AGPLv3) Python library with in-memory reference storage and a stdio MCP server; the engine is storage-agnostic and the same code runs against server-grade backends in hosted deployments. Figure 4 shows the architecture.

MCP TOOL SURFACE — 13 TOOLSmemory_store · memory_amend · memory_recall · memory_search · memory_traversememory_explain · pin_memory · unpin_memory · list_core_memories · delete_memorymemory_stats · set_core_preferences · promote_to_orgSCORING & LIFECYCLE ENGINEthree-force scores = R × C × Astatus FSMtags, not tiersconsolidationepisodic → semanticcascade reactivationBFS depth 2 · s(h) = 0.3ʰconjunctive forgettingscore ∧ orphan ∧ ¬pinned ∧ ¬core ∧ ¬orgPROVIDER PROTOCOLS — graph · vector · cache · embeddings · LLMSTORAGE — in-memory reference · server-grade backends, same engine, no code divergencesynchronous hot path — store: node + explicit edges onlyrecall: vector search + graph traversal + scoringASYNCBACKGROUNDembedding generationentity extractionLLM causal inferencecontradiction detectionconsolidationat-rest rescoringlifecycle + forgetting sweeps
Figure 4. System architecture: the MCP tool surface over the scoring/lifecycle engine, with all storage access behind provider protocols and heavy operations split onto asynchronous background paths.

Agent surface. The engine is exposed to agents over the Model Context Protocol, which matters architecturally: the memory system is a tool the model calls mid-conversation, so every read is on the critical path of a user-visible response, and the writer of a memory is an LLM that can be asked to supply structure (typed edges, categories, reasons) at write time rather than having all structure inferred after the fact. Agents interact through 13 tools: memory_store, memory_amend, memory_recall, memory_search, memory_traverse, memory_explain, pin_memory, unpin_memory, list_core_memories, delete_memory, memory_stats, set_core_preferences, and promote_to_org. Two design points matter to the model of §3–§4. memory_store accepts writer-specified typed edges, validated fail-fast before node creation, and additionally auto-links the new node to semantically similar existing memories with related_to edges — embedder-aware minimum similarity, capped at 3 auto-edges, de-duplicated against existing edges — so that ordinary use grows the supportive structure that both scoring and forgetting depend on. memory_amend records a correction as a new node with a supersedes edge to the old one; the old node's status is deliberately left unchanged — recall down-ranks superseded hits and the lifecycle demotes the stale node naturally, preserving provenance instead of editing history.

Legibility surface. memory_explain returns, per memory, the live per-force decomposition of Eq. (2) — relevance, connectivity, base activation — with the formula, the stability dial, and a staleness note on the persisted score. The retention weight is thereby documented to users as what it is: a ranking-and-lifecycle weight the user's own usage feeds, not a hidden deletion countdown.

Storage abstraction. No business logic imports a database client. All data access flows through provider protocols (graph storage, vector search, cache, embeddings, LLM); the library ships a zero-dependency in-memory implementation, and alternative backends implement the same protocols. This is a hard architectural rule, and it is what makes the benchmark configuration of §6 — the identical engine over a server-grade backend — possible without code divergence.

Hot path / background split. The synchronous path is minimal by rule: memory_store creates the node and its explicit edges, nothing else; memory_recall performs vector search, graph traversal, scoring, and the direct reactivation writes of §4.2. Everything heavy — embedding generation, entity extraction, LLM-based causal inference and consolidation, contradiction detection, at-rest score recomputation, lifecycle and forgetting sweeps — runs asynchronously in the background. The split reflects a division of the model's semantics: the forces of Eq. (2) that depend on the query (R) are computed at recall time, while the forces that depend only on history and structure (C, A at rest) are maintained in the background and merely read on the hot path. Agent-facing latency is therefore bounded by retrieval work, not by the cognitive machinery, and an LLM outage degrades enrichment (auto-inferred edges, consolidation) without ever blocking store or recall.

Evaluation

Benchmark and the frozen protocol

We evaluate on LoCoMo [9]: 10 multi-session conversations with 1,986 QA pairs, of which 1,540 remain after excluding Category 5 (adversarial), consistent with Mem0 and Zep, as ground-truth answers are unavailable for that category. Category identities and counts were verified against the LoCoMo source; because category labeling has been a locus of comparability disputes on this benchmark, we state the numeric-identifier-to-label mapping explicitly (it is implemented as the category-mapping constants of the public harness — see the Reproducibility Statement):

Table 3. LoCoMo numeric category identifiers, labels, and question counts under the frozen protocol (Category 5, adversarial, excluded; n = 1,540).

LoCoMo category ID1234
Labelmulti-hoptemporalopen-domainsingle-hop
n28232196841

Why freeze someone else's protocol. LoCoMo scores are only comparable under an identical answerer, judge, judge prompt, metric, and denominator — and the literature contains exactly one fully specified protocol among the systems we compare against: the Mem0 paper's [5]. Zep has no independent LoCoMo methodology; the Zep paper [13] evaluates DMR and LongMemEval, and every public Zep LoCoMo number we are aware of was produced by re-running Mem0's methodology. (Zep's LoCoMo figure moved publicly: an initially blogged 84% contained a denominator error — Category 5 excluded from the denominator but not the numerator; Mem0's recomputation gave 58.44 ± 0.20; Zep's own corrected, self-endorsed figure is 75.14 ± 0.17, which is the number we compare against.) Freezing the Mem0-paper protocol therefore buys comparability to both baselines simultaneously. We adopted it verbatim and never moved it:

Table 4. Frozen evaluation axes (never tuned at any point in the program).

AxisFrozen value
Answerergpt-4o-mini, temperature 0, ≤200 output tokens
Judgegpt-4o-mini, temperature 0, JSON-forced output
Judge promptMem0 accuracy_prompt verbatim (including its temporal-leniency clause); judge parse failures score wrong, never correct
MetricJ-score = judged-correct / total, overall and per category
Categories1–4 only; n = 1,540
DatasetLoCoMo-10, per-conversation user isolation
Reportingmean ± 1 std over 10 independent full runs

Three details of the frozen axes deserve comment, because each is a place where a system author could quietly gain or lose points. First, the judge prompt is Mem0's accuracy_prompt adopted verbatim, including its explicit temporal-leniency clause (same date or period counts correct regardless of format); an earlier internal harness omitted that clause, which is stricter than the yardstick on temporal questions and therefore non-comparable in the deflationary direction — non-comparability cuts both ways, and we corrected it. Second, judge responses are format-forced JSON and a parse failure scores wrong: a lenient parse fallback that defaults toward correct is a leniency the yardstick does not have, and we removed ours. Third, the answerer judging its own family (gpt-4o-mini on both sides) is not a deviation but the standard the published baselines were measured under; substituting a “more neutral” judge would break comparability, not improve it.

What remained vendor-controlled — as it is for every system evaluated on LoCoMo — is ingestion strategy, retrieval configuration (including k, which no version of the benchmark prescribes and every vendor sets), and the answer-side prompting, all constrained to dataset-generic content and disclosed in full in §6.3. To our knowledge, vendor-marketed LoCoMo numbers above these baselines use non-comparable judges or answerers and are excluded by these comparability rules. In particular, contemporary vendor-reported scores above 90 exist: Zep reports 94.7% (1,459/1,540) with a gpt-5.4 reader and judge (benchmark results page, updated 28 May 2026; 87 ms p50 / 155 ms p95 retrieval latency, 5,760 tokens per question end-to-end), Mem0 reports 92.5 on LoCoMo for its token-efficient configuration (at 6,956 tokens per query; 94.4 on LongMemEval at 6,787 tokens), and ByteRover reports 92.2% on a Gemini 3 curation-and-judging stack (best run: Gemini 3 Flash curation and judging, Gemini 3 Pro justification). Each of these was produced on a different answerer/judge stack; none is comparable to the frozen protocol used here, and none is comparable to the others. That three vendors now market 90-plus LoCoMo scores on three mutually incomparable stacks is itself the strongest available argument for the frozen-protocol discipline of this section — the comparison of Table 5 is frozen-protocol-relative, not timeless.

Main result

Table 5. LoCoMo J-scores under the identical frozen protocol. Mem0 and Zep are published figures under that protocol; Genesys is the certified 10-run mean.

SystemLoCoMo J
Mem0 (published) [5]66.9
Zep (corrected, self-endorsed) [13]75.14
Genesys (certified, 10-run mean ± std)85.55 ± 0.37
Estimated oracle-retrieval ceiling (§6.7)~94.9

Under the frozen protocol, Genesys (engine version 0.4.2 with the I3 retrieval stack, configuration in §6.3) certifies at 85.55 ± 0.37 (10 independent full runs; range 84.87–86.17), with per-run scores 84.87, 85.84, 85.71, 85.58, 85.26, 85.78, 85.52, 86.17, 85.52, 85.19 (run scores are shown rounded to two decimals; the certified mean and standard deviation are computed from the unrounded per-run artifacts archived by the harness). Each run answers and judges all 1,540 questions end-to-end against live recall from the production server code path. This is +10.4 pp over Zep and +18.7 pp over Mem0 under the identical yardstick (Table 5, Figure 5).

(A) LOCOMO J · FROZEN PROTOCOL02040608010066.9Mem0published75.14Zepcorrected85.55Genesys10-run mean± 0.37(B) THE 10 CERTIFIED RUNS · MEAN 85.55 ± 0.3785.55oracle ceiling ~94.9858789919395J-SCOREr01r02r03r04r05r06r07r08r09r10
Figure 5. (A) LoCoMo J-score under the frozen Mem0-paper protocol (gpt-4o-mini answerer and judge, temperature 0, n = 1,540, categories 1–4). Genesys bar shows the 10-run mean ± 1 std. (B) The 10 individual Genesys runs with the ±1σ band and the estimated oracle-retrieval ceiling (~94.9, §6.7) as reference. Run-to-run spread reflects the measured 5.4% answer-regeneration churn (§6.5).

Table 6. Per-category certified results versus the pre-program baseline (engine 0.4.2, session-level ingestion, k = 20). No category certifies below baseline; multi-hop is statistical parity. Open-domain (n = 96) is the least stable estimate and its delta should not be over-read.

CategorynCertified mean ± stdBaselineΔ
Single-hop84190.49 ± 0.5888.35+2.1
Temporal32181.28 ± 0.8564.49+16.8
Multi-hop28280.82 ± 1.0980.85−0.03 (parity)
Open-domain9670.42 ± 3.8757.29+13.1

Per-category results are in Table 6. The single-hop canary — a binding guardrail requiring single-hop J ≥ 87.3 on every run — held on all 10 runs (min 89.2). Four observations. Temporal (+16.8 pp) is the largest certified gain and the most mechanistically attributable: LoCoMo's temporal questions require resolving relative and session-implicit dates, and the gain arrived almost entirely with per-turn ingestion that normalizes event dates into explicit [event:] tags at write time (§6.4) — a retention-side fix, unrecoverable by retrieval-time machinery in our development runs, which is a small piece of direct evidence for the paper's thesis that structure at storage time beats search effort at query time. Open-domain (+13.1 pp) improved with retrieval depth and fusion but has n = 96 and ±3.87 certified spread; we flag it as the least stable estimate and do not build claims on it. Multi-hop is exact statistical parity with baseline (−0.03): the certified stack did not improve the hardest category, and development triage attributed its persistent failures predominantly to retrieval misses, wrong-instance ranking (the right entity's wrong occurrence outranking the right one), and multi-evidence assembly rather than to any mechanism the stack targets. We report the parity as-is rather than obscuring it in the overall gain. Single-hop (+2.1 pp on n = 841) is the volume category; its stability across all 10 runs is what the binding canary was designed to protect. We quantify what these same mechanisms cost in §6.6.

Certified configuration

All frozen axes as Table 4; the vendor-side configuration, disclosed in full:

  • Ingestion: one memory per conversation turn, verbatim, with resolved [event:] date tags and inline image captions.
  • Retrieval depth: k = 90. A single-run sweep measured k = 80 → 84.9, k = 90 → 85.5, k = 100 → 85.7; the +0.2 at k = 100 is inside the run-noise band, and k = 90 was certified with deeper k's distractor and token load flagged as the guardrail cost.
  • Fusion: hybrid BM25 + dense-vector retrieval fused by reciprocal-rank fusion [6] with krrf = 60; fusion only adds candidates and never displaces existing top results. It principally recovers exact-token and proper-noun misses.
  • Minimum-similarity floor: embedder-aware similarity threshold with backfill — if post-threshold results number fewer than k/2, candidates below threshold are backfilled so that a query never starves while memories exist. This repaired a genuine product bug (queries starved to as few as 2 results), not a benchmark tweak; the fix ships in the product. After the fix, questions retrieving <20 memories fell from 60 to 7, <10 from 29 to 0, and zero-retrieval questions from 1 to 0.
  • Query expansion: one additional recall call with an entity-focused rewrite, RRF-fused with the primary results.
  • Date-anchored rerank: for date-scoped questions only, retrieved turns re-rank by resolved event date, constrained not to perturb the [event:] pathway that carries the temporal gains.
  • Answer routing: a deterministic ordered-regex classifier assigns each question a terse answer prompt (1,066 questions) or a chain-of-thought prompt (474). Routing is answer-side prompting, not memory-side; the distribution was identical across the final development runs.

Token cost of k = 90. The certified run artifacts log neither per-question token counts nor the retrieved memory content, so the answerer-side cost of the k = 90 configuration was measured after the fact by a deterministic offline reconstruction of the exact per-question prompts (replaying the harness's pure ingestion and prompt-assembly path against the archived artifacts) followed by a tokenizer pass, not by estimation: the prompt delivered to the frozen answerer averages ≈6,080 input tokens per question, of which the memory-context block averages ≈5,790 tokens over a mean of 89.5 retrieved memories (median 90; 1,528 of 1,540 questions fill the full k = 90 cap). This puts the answerer's context budget essentially at Zep's published 5,760 tokens per question and below Mem0's 6,956 (§6.1): the k = 90 accuracy is not bought with an outsized token budget relative to the systems it is compared against.

Development progression and what moved the needle

Table 7 records the build history. Development-stage scores are single runs and carry the ~0.5–0.8 pp per-run noise measured in §6.5; they are history, not certified claims.

Table 7. Development progression (single runs except CERT). Single-run deltas below ~1 pp are within measured noise.

StageConfiguration addedOverall J
Baseline (0.4.2)session-level ingestion, k = 2080.06
R2a+ selective CoT answer routing81.7
R2b+ turn-level ingestion, [event:] dates, captions, k = 6084.3
R2c+ router rev-2 (image / enumeration patterns)83.96
R3+ hybrid RRF, similarity floor, query expansion, date rerank84.61
CERT+ k = 90 (from the k sweep)85.55 ± 0.37

Ranked by contribution: (1) per-turn ingestion with event-date normalization — the single largest mover, driving the temporal category from 64.49 to the low 80s; date-anchored answers require the ingest layer to resolve relative dates at write time, which no retrieval-time mechanism recovered. (2) The minimum-similarity floor fix, a real retrieval bug whose repair was the best per-unit yield of any retrieval component. (3) Hybrid RRF fusion. (4) Selective chain-of-thought routing — notably, routing CoT to all questions made results worse (net −10 on the affected runs): reasoning prompts on already-easy single-hop questions caused regressions, so a deterministic classifier applies CoT only where question shape warrants it. (5) Retrieval-depth sweep to k = 90.

Answer churn: the noise floor of temperature-0 evaluation

Temperature 0 is widely treated as determinism; in production LLM inference it is not, and for benchmark methodology the size of the residual nondeterminism matters more than its cause. We measured it directly. Re-running the byte-identical configuration — same prompts, same ingest, same k, temperature 0 — regenerates ~5.4% of answers differently per run: measured cleanly on a subset held byte-identical to baseline, 51 of 952 baseline-correct answers regressed in a re-run from regeneration alone, with no configuration difference of any kind. To locate the noise, we separately re-judged identical (question, gold, prediction) tuples under the frozen judge: 1 of 124 verdicts flipped (0.8%). The churn is answer-side, not judge-side — the generous judge is nearly deterministic on fixed inputs, while the answerer is not on regenerated ones — so no amount of re-judging removes it; only cross-run persistence analysis does.

Two consequences shaped the whole program. First, any single-run LoCoMo claim carries this noise; per-run net σ was ≈0.5–0.8 pp during development, so single-run deltas under ~1 pp are uninterpretable, and we certify only 10-run mean ± std. Second, the churn measurement invalidated our own original quality gate: a per-category gross-retention floor of 97% of baseline-correct answers fails a null run (expected retention under churn alone is ~94.6%), i.e. it measured churn, not harm. Its replacement — gating on cross-run persistent regressions — is described next.

The persistence gate G2-P: a disclosed failure

Net score can hide real substrate harm behind offsetting recoveries. To separate harm from churn, we pre-registered gate G2-P: for the certified configuration, a baseline-correct question counts as persistently regressed only if it is answered wrong in both runs of a run-pair (churn flips are approximately independent across runs, so double flips concentrate the substrate signal), followed by one frozen-judge re-pass that removes residual judge noise. The official measure joins all 45 pairs of the 10 certification runs.

Table 8. G2-P persistence gate at certification: judge-denoised persistent regressions versus baseline over all 45 run-pairs, against pre-registered budgets. The gate fails in every category and is disclosed as failed.

CategoryPersistent regressions, mean (range)RED budgetVerdict
Single-hop29.9 (23–38)≤ 21RED
Temporal16.5 (12–21)≤ 6RED
Multi-hop20.8 (16–26)≤ 7RED
Open-domain5.0 (2–8)≤ 2RED
Total72.2 (62–80)≤ 35RED

Budget derivation (fixed before measurement). The RED budgets were derived from a pessimistic 2.5% harm allowance on the 1,233 baseline-correct answers, applied per category to preserve the anti-masking intent of the gate it replaced, plus the expected double-flip noise floor implied by the churn measurement, 0.0542² (the double-flip probability) × base-correct per category. Concretely: single-hop (743 baseline-correct) 18.6 + 2.2 ⇒ ≤ 21; temporal (207) 5.2 + 0.6 ⇒ ≤ 6; multi-hop (228) 5.7 + 0.7 ⇒ ≤ 7; open-domain (55) 1.4 + 0.2 ⇒ ≤ 2; total ≤ 35 (the total budget is derived from the aggregate baseline-correct count, 0.025 × 1233 + 0.0542² × 1233 ≈ 34.4, where 0.0542² is again the double-flip probability, not by summing the independently rounded per-category ceilings). To keep the gate's later recalibration from reading as gate-shopping, the expected verdict was also written down before the measurement, from a cross-configuration persistence proxy: single-hop predicted to pass at ≈ 13, temporal / multi-hop / open-domain predicted RED at ≈ 17 / 23 / 5.

Table 8 is the measurement: the certified configuration persistently loses on average 72.2 of the baseline's 1,233 correct answers (5.9%) — roughly twice the pre-registered budget — and the prediction was confirmed for temporal, multi-hop, and open-domain while single-hop, predicted to pass, came in RED at about 2.3× its predicted level. The other side of the same join: persistent recoveries average 170.0 (range 162–180), for a net persistent gain of +97.8 — a 2.4:1 trade ratio.

Stated plainly: the certified configuration is net-better with a published trade, not strictly dominant. The ingestion and retrieval changes that produce the +16.8 pp temporal and +13.1 pp open-domain gains inherently re-rank what the answerer sees, and no configuration in the program came close to passing the self-imposed harm budgets. Under the pre-committed rules this is a formal gate failure, and we disclose it as one rather than waving it through or retro-fitting the budget. We would generalize the point beyond this paper: at a measured 5.4% churn floor, any substantive memory-system change will persistently lose some previously-correct answers, and an evaluation that reports only net gains will not surface that loss. The per-key ledgers behind Table 8 are reproducible from the archived run artifacts.

Estimated oracle-retrieval ceiling

How much of the residual wrong mass is winnable at all by better retrieval? The question matters because it separates two very different readings of an 85.55: “retrieval is leaving ten points on the table” versus “the frozen answerer and dataset cannot yield much more.” We identified the stable wrongs — questions answered wrong in ≥ 8 of the 10 certification runs, i.e. wrong for substrate reasons rather than churn: 150 in total (single-hop 53, temporal 40, multi-hop 36, open-domain 21) — and answered each from its gold evidence turns alone: perfect retrieval, with the answerer, answer prompt, and judge all frozen as in every other measurement. The oracle recovers 64.7% of the stable wrongs, implying an estimated ceiling of ~94.9 under the frozen protocol. (Ceiling arithmetic: the measured 64.7% recovery rate, extended to the full mean wrong mass of 14.45% of n, gives 85.55 + 0.647 × 14.45 ≈ 94.9; the extension assumes churn-driven wrongs are oracle-recoverable at no less than the stable-wrong rate — conservative, since churn wrongs are by definition answerable by the frozen answerer in some runs.) Two readings follow. About a third of the stable wrong mass is unwinnable even when the answerer is handed exactly the right evidence — the answerer fails to assemble the answer, or the gold itself is contestable — so no retrieval improvement of any kind can close that portion. And the certified 85.55 stands about 9.3 pp below the ceiling, a gap that is retrieval-precision-addressable in principle; whether it is addressable in practice is what §6.8 answers, negatively.

Negative results: three dead reranking designs

The oracle probe says the gap to the ceiling is retrieval-precision-addressable in principle. We then tested whether it is addressable in practice by the obvious mechanism — rerank the retrieved candidates so the answerer sees a sharper context — and report the three designs that failed, because the failure mode generalizes. The designs escalate in caution: an aggressive reranker that truncates the answer context to the top 15 candidates; a guarded variant truncating to 25; and finally a deliberately zero-information-loss design that removes nothing and only annotates the candidates it believes are evidence, so that in the worst case the answerer sees exactly what it saw before plus markings.

Table 9. Reranking designs evaluated post-certification. All reduced accuracy and were abandoned.

DesignNet Δ (pp)
Rerank, truncate answer context to top-15−2.4
Guarded rerank, truncate to top-25−2.9
Focus-highlighting (mark candidate evidence; remove nothing)−0.85

Even the zero-information-loss variant paid measurable collateral: merely marking memories, without removing any, flipped 2.7% of stably-correct questions to wrong — the answerer's attention is not neutral to annotations. The break-even arithmetic explains why the whole design class is dead under this protocol, independent of implementation quality: any reranking intervention exposes 1,317 currently-correct answers to perturbation in pursuit of 144 addressable wrongs, a 9.15:1 exposure ratio, so a design must recover wrongs at more than nine times the rate at which it disturbs corrects merely to break even. At the best recovery rate measured across the three designs (17.3% of addressable wrongs), even a hypothetically collateral-free reranker caps at +1.62 pp (~87.2), well short of the ceiling — and no measured design was remotely collateral-free. We publish these numbers because the negative space is load-bearing for interpreting the field: the same arithmetic bounds any competitor's retrieval-side polishing under this protocol, and it converts the headline from “what we reached” into “what is reachable.” Our conclusion, recorded as the closing finding of the program: 85.55 ± 0.37 is the honest capability of this system under the frozen comparable protocol, and the residual gap to the oracle ceiling is not capturable by retrieval-side engineering without knowing the answers.

A disclosed non-comparable probe isolates the answerer's share of the residual: with identical memories, retrieval, and frozen judge, swapping the answerer to gpt-4.1-mini yields 89.68 in a single run (+4.13 pp from the answerer alone). This number must never be compared to the Mem0/Zep figures — different answerer — and is reported only to show the residue is largely answerer-limited, not memory-limited.

Limitations and Threats to Validity

One benchmark, one protocol. All certified numbers are LoCoMo under one frozen protocol. LoCoMo is the standard long-conversation memory benchmark and the only one with published, protocol-matched competitor scores, but it is ten conversations from one generator, and generalization to other workloads is unestablished. The frozen protocol also inherits the known weaknesses of its judge: gpt-4o-mini with a deliberately generous prompt both answers and judges, so absolute scores are inflated for all systems measured under it; the comparison is meaningful, the absolute values less so.

The gate failure is real harm. G2-P (§6.6) is RED: relative to the pre-program baseline, the certified configuration persistently loses ~5.9% of answers the baseline got right. Users upgrading a memory system should expect trade surfaces, not pure gains, and our headline should be read with its published trade attached.

Small-n categories. Open-domain has n = 96 and a certified std of ±3.87; its per-category delta is the least stable estimate in Table 6 and should not be over-claimed. Small per-category differences between systems on this benchmark are generally within judge noise.

The benchmark exercises part of the engine. LoCoMo ingests a fixed conversation and answers questions shortly thereafter; it primarily measures ingestion, retrieval, and answer assembly. The lifecycle machinery of §4 — consolidation, dormancy, cascades, and conjunctive forgetting — operates on longer horizons than the benchmark exercises, so the evaluation supports the retrieval-facing claims directly and the lifecycle claims only indirectly (via the engine being the same system). Direct longitudinal evaluation of forgetting quality is future work, and we know of no public benchmark that measures it.

Forgetting-sweep prune counts. The number of nodes actually pruned by the conjunctive forgetting sweep during the certified benchmark runs was not separately instrumented at certification time. The code audit reflected in §4.1–§4.3 bounds what is possible: under the shipped cycle only orphaned active/episodic/semantic nodes can be driven below θf, the taggeddormant lifecycle prunes nothing by itself, and deletion is structurally gated on orphanhood. (The library's separate engine-benchmark harness precedes its sweep with an all-status rescore, which is broader than the shipped background cycle; every behavioral claim in this paper describes the shipped cycle.) No certified claim in this paper rests on score-thresholded pruning having contributed to the benchmark results.

Vendor-side degrees of freedom. Ingestion, retrieval configuration, and answer prompting are vendor-controlled on LoCoMo for every published system. Ours are disclosed in full (§6.3) and constrained to dataset-generic content, but the degrees of freedom exist, and single-run development choices (e.g. k = 90 over k = 100) were made inside the measured noise band.

Scoring heuristics. Several engine constants (force weights 0.7/0.3, the at-rest linear recency, the connectivity floor 0.1, cascade γ = 0.3) are design choices validated by field behavior and the benchmark, not individually ablated. The ACT-R base-level term is faithful to the literature; the composition around it is ours, and we have deliberately not claimed cognitive fidelity for the composite — only for the transcribed component (§3.3).

Pretraining exposure. LoCoMo has circulated publicly since 2024; we cannot exclude that the frozen answerer or judge saw benchmark text during pretraining. This threat applies equally to every system measured under the shared protocol — it perturbs absolute scores, not the comparison — but it is a reason, alongside judge generosity, not to read the absolute J-scores as task accuracy.

Ecological validity. LoCoMo conversations are synthetic dialogues between two personas, ingested in one pass and queried immediately. Real agent memory workloads are adversarial in different ways: interleaved corrections, multi-source contradictions, months-long idle periods, and users who ask for deletions. The engine's mechanisms target exactly these (supersession, contradiction edges, dormancy, conjunctive forgetting), but the benchmark does not measure them, and we do not claim it does.

Conclusion

Genesys treats agent memory as a retention-and-structure problem: one causal graph per user, a multiplicative retention score whose three forces (relevance, causal connectivity, ACT-R base-level activation) each hold veto power over rank, and a deletion predicate that is structurally gated — orphanhood together with explicit intentional vetoes (pinned, core, shared), the score threshold acting as a precondition that binds only on stale persisted scores — so that a single supportive edge protects a low-scoring memory and a hard delete requires that no recognized supportive dependency or association remain. The lifecycle (status FSM, episodic→semantic consolidation, cascade reactivation) operates on that one substrate by property updates, never by moving data between stores.

Under the only frozen, fully specified LoCoMo protocol shared with published baselines, the system certifies at 85.55 ± 0.37 over 10 full runs — +10.4 pp over Zep and +18.7 pp over Mem0 — with a measured 5.4% temperature-0 churn floor, an estimated ~94.9 oracle-retrieval ceiling under that protocol, three published dead ends, and one published failed gate: the certified configuration persistently trades ~72 previously-correct answers for ~170 new ones (2.4:1). We consider the disclosure methodology as much a contribution as the score. Benchmark claims in this area routinely rest on single runs, undisclosed configurations, and net deltas that can conceal persistent regressions behind recoveries; run-level statistics, pre-registered harm budgets, and published negative results are the cost of a number that can be trusted — and, we would argue, the minimum standard the field should hold memory systems to.

Reproducibility Statement

The evaluation harness is public at github.com/Astrix-Labs/locomo-harness: it implements the frozen protocol of Table 4 (answerer and judge configuration, the verbatim Mem0 judge prompt with parse-failure-scores-wrong semantics, category mapping, and the n = 1,540 denominator), the certified retrieval configuration of §6.3, and the run-level reporting (10 independent runs, mean ± std). The certified headline, the per-category table, the G2-P persistence ledgers, the oracle-ceiling probe, and the negative-result probes of §6.8 are all reproducible from archived per-run artifacts produced by the harness. The memory engine itself is open source (genesys-memory, AGPLv3); the scoring and lifecycle engine evaluated in this paper is the released version 0.4.2, installable immutably as pip install genesys-memory==0.4.2, and the harness is pinned at commit 2dc968b, so both the engine and the full evaluation pipeline resolve to fixed public artifacts. (The engine identifier “0.4.2” throughout this paper denotes that PyPI release; the retrieval stack and protocol that wrap it live in the harness at the commit above.) Figures 1 and 3 are generated by executing the released scoring and cascade implementations, not by re-plotting constants, and the figure-generation scripts accompany the figures.

References

  1. J. R. Anderson. How Can the Human Mind Occur in the Physical Universe? Oxford University Press, New York, 2007.
  2. J. R. Anderson, D. Bothell, M. D. Byrne, S. Douglass, C. Lebiere, and Y. Qin. An integrated theory of the mind. Psychological Review, 111(4):1036–1060, 2004.
  3. J. R. Anderson and C. Lebiere. The Atomic Components of Thought. Lawrence Erlbaum Associates, Mahwah, NJ, 1998.
  4. J. R. Anderson and L. J. Schooler. Reflections of the environment in memory. Psychological Science, 2(6):396–408, 1991.
  5. P. Chhikara, D. Khant, S. Aryan, T. Singh, and D. Yadav. Mem0: Building production-ready AI agents with scalable long-term memory. arXiv preprint arXiv:2504.19413, 2025.
  6. G. V. Cormack, C. L. A. Clarke, and S. Büttcher. Reciprocal rank fusion outperforms Condorcet and individual rank learning methods. In Proceedings of the 32nd International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR '09), Boston, MA, 2009.
  7. H. Ebbinghaus. Memory: A Contribution to Experimental Psychology. Teachers College, Columbia University, New York, 1913. Translated by H. A. Ruger and C. E. Bussenius; originally published as Über das Gedächtnis, Duncker & Humblot, Leipzig, 1885.
  8. B. J. Gutiérrez, Y. Shu, Y. Gu, M. Yasunaga, and Y. Su. HippoRAG: Neurobiologically inspired long-term memory for large language models. arXiv preprint arXiv:2405.14831, 2024. NeurIPS 2024.
  9. A. Maharana, D.-H. Lee, S. Tulyakov, M. Bansal, F. Barbieri, and Y. Fang. Evaluating very long-term conversational memory of LLM agents. arXiv preprint arXiv:2402.17753, 2024. ACL 2024.
  10. J. L. McClelland, B. L. McNaughton, and R. C. O'Reilly. Why there are complementary learning systems in the hippocampus and neocortex: Insights from the successes and failures of connectionist models of learning and memory. Psychological Review, 102(3):419–457, 1995.
  11. C. Packer, S. Wooders, K. Lin, V. Fang, S. G. Patil, I. Stoica, and J. E. Gonzalez. MemGPT: Towards LLMs as operating systems. arXiv preprint arXiv:2310.08560, 2023.
  12. J. S. Park, J. C. O'Brien, C. J. Cai, M. R. Morris, P. Liang, and M. S. Bernstein. Generative agents: Interactive simulacra of human behavior. arXiv preprint arXiv:2304.03442, 2023.
  13. P. Rasmussen, P. Paliychuk, T. Beauvais, J. Ryan, and D. Chalef. Zep: A temporal knowledge graph architecture for agent memory. arXiv preprint arXiv:2501.13956, 2025.
  14. W. Xu, Z. Liang, K. Mei, H. Gao, J. Tan, and Y. Zhang. A-MEM: Agentic memory for LLM agents. arXiv preprint arXiv:2502.12110, 2025.
  15. W. Zhong, L. Guo, Q. Gao, H. Ye, and Y. Wang. MemoryBank: Enhancing large language models with long-term memory. arXiv preprint arXiv:2305.10250, 2023.