Benchmark · Memory
TemporalStore memory benchmark: LOCOMO & LongMemEval_s
Full LOCOMO (1,539 QA) and LongMemEval_s (500) run through the Rust TemporalStore backend with an all open-source stack — a qwen2.5 reader and an all-MiniLM-L6-v2 encoder answering every query — plus how the published OpenViking / VikingMem-class systems frame the same benchmarks.
Why TemporalStore wins — even when the scores look similar
This benchmark isolates the memory layer on one shared OSS stack. Where a test fits inside a single retrieval budget (LOCOMO), both systems return the same context and the shared reader produces byte-identical answers — a tie. That convergence is a property of small inputs, not evidence the systems are equivalent. Separation shows up where production lives — long, multi-session histories:
| Why it holds at scale | TemporalStore | Flat vector-retrieval baseline |
|---|---|---|
| Temporal validity | Tracks when each fact was true; supersedes stale ones. | Returns “most similar” chunks regardless of recency — surfaces outdated facts (fails knowledge-update & temporal questions). |
| Serving engine | One time-aware index for memory, features & control-state — no separate vector DB. | Vector DB + LLM extraction pipeline bolted together. |
| Memory model | Typed, governed, replayable (ContextNode / Event / Entity / Summary + access control + ContextPack replay). | Opaque similarity chunks. |
| Quality ceiling | Reader-bound, not memory-bound: same memory, 1.5B→7B nearly doubled accuracy (0.42→0.86). | Weaker retrieval caps quality earlier at scale. |
Setup & fairness contract
Every pipeline — TemporalStore and the OpenViking-style baseline — runs through one shared OSS stack, so the only variable is the memory backend.
| Dimension | Value (shared by both systems) |
|---|---|
| Reader model | qwen2.5:1.5b and qwen2.5:7b via ollama; answers every query (candidate-hybrid, no deterministic fallback). |
| Encoder | sentence-transformers/all-MiniLM-L6-v2 (384-d), identical for both. |
| Backend | Rust TemporalStore context_workflow_harness. |
| Budget | same-session 0.70 · cross-session 0.45 · summary 0.25 · entity 0.35 · event 0.80; reader ctx 12k/4k chars; ≤96 output tokens. |
| Datasets | LOCOMO locomo10.json (10 conv, 1,539 QA); LongMemEval_s cleaned (500). Full, real artifacts. |
| Hardware | WSL Ubuntu 22.04, 16 vCPU, CPU-only (no GPU). |
| Scoring | Deterministic answer-term coverage — no LLM judge; identical for both systems. |
reader_open_source_calls > 0 with no fallback.TemporalStore measured results
Retrieval hit@k, recall@k, token reduction and latency are storage-layer properties; reader-hit is the OSS reader answering from retrieved memory.
| Config (n) | hit@k | recall@k | MRR | reader-hit | token red. | src→retr tokens | retr p50/p95 | reader p50/p95 |
|---|---|---|---|---|---|---|---|---|
| 1.5b · LOCOMO (1,539) | 0.986 | 0.986 | 0.538 | 0.416 | 82.4% | 35,809→6,304 | 29.6 / 49.5 ms | 8.34 / 12.08 s |
| 1.5b · LongMemEval_s (500) | 0.980 | 0.980 | 0.836 | 0.534 | 97.3% | 92,695→2,486 | 116 / 164 ms | 8.98 / 12.05 s |
| 7b · LOCOMO (200) | 0.995 | 0.995 | 0.586 | 0.855 | 76.6% | 26,017→6,091 | 18.4 / 33.6 ms | 26.8 / 32.4 s |
Head-to-head vs an OpenViking-style baseline
An OpenViking-style flat source-retrieval baseline, reimplemented on the identical OSS stack. M = TemporalStore, B = baseline.
| Benchmark (n) | hit@k M/B | MRR M/B | reader-hit M/B | token red. M/B | retr p95 M/B |
|---|---|---|---|---|---|
| 1.5b · LOCOMO (1,539) | 0.986 / 0.981 | 0.538 / 0.533 | 0.416 / 0.416 | 82.4 / 82.4% | 49 / 73 ms |
| 1.5b · LongMemEval_s (500) | 0.980 / 0.810 | 0.836 / — | 0.534 / 0.208 | 97.3 / 97.2% | 164 / 2,704 ms |
| 7b · LOCOMO (200) | 0.995 / 0.990 | 0.586 / 0.581 | 0.855 / 0.855 | 76.6 / 76.6% | 34 / 38 ms |
Answer quality is reader-bound
Retrieval is near-ceiling at 1.5b; on the same TemporalStore memory, a bigger reader roughly doubles LOCOMO answer accuracy.
| Reader | reader-hit | MRR | retrieval hit@k |
|---|---|---|---|
| qwen2.5:1.5b (n=1,539) | 0.416 | 0.538 | 0.986 |
| qwen2.5:7b (n=200) | 0.855 | 0.586 | 0.995 |
LongMemEval_s by question type (1.5b)
| Question type | n | retrieval hit@k | reader-hit |
|---|---|---|---|
| single_session_user | 70 | 1.000 | 1.000 |
| multi_session | 133 | 0.992 | 0.654 |
| single_session_assistant | 56 | 0.982 | 0.500 |
| temporal_reasoning | 133 | 0.970 | 0.398 |
| knowledge_update | 78 | 1.000 | 0.269 |
| single_session_preference | 30 | 0.867 | 0.267 |
Why we benchmark against OpenViking / VikingMem — not the whole field
OpenViking and VikingMem position themselves as the state of the art: each claims to beat the broader field of memory products, not just a full-context baseline. Zep bills itself as “the new state of the art in agent memory”; Mem0 reports double-digit accuracy gains over prior systems; MemOS reports leading OmniMemEval across 14 commercial memory products.
Those systems all frame their own comparison the same way — their memory vs a full-context baseline, scored by a GPT-4o LLM judge. Their figures below are their own, cited to source — and because they use an LLM judge and stronger agents, they are not directly comparable to the deterministic, tiny-OSS-model numbers above; the comparable axes are token efficiency and latency.
| System | LOCOMO | LongMemEval | tokens/query | efficiency claim | judge |
|---|---|---|---|---|---|
| Mem0 (event/entity/operator) | 92.5 | 94.4 | ~6.9k vs 25k+ | 90% token / 91% latency vs OpenAI Memory | GPT-4o |
| Zep | — | 90.2 | ~1.6k vs ~115k | 28.9s→2.58s (~90% lower) | GPT-4o |
| MemOS (OS / skills) | 88.83 | 89.20 | — | 35.24% token savings | LLM judge |
| Memori | 87.0 | — | 721 (2.8%) | token-efficiency leader | LLM judge |
| Long-context (GPT-5-mini, independent) | 92.85 | 82.4 | full (~100k) | memory cheaper only after ~10–20 turns | — |
Sources: Mem0, Zep, MemOS, Memori, Beyond the Context Window.
Claude-as-judge — quality under a real LLM judge
The results above use a deterministic answer-term scorer (a lower bound). The competitor papers score with an LLM judge (GPT-4o). We re-scored a paired sample with Claude as the judge (0–10 rubric, correct := score ≥ 6). The OSS reader is unchanged for both arms, so Claude is the evaluator, not the reader.
| Dataset (n) | TemporalStore | OpenViking | TS / OV mean |
|---|---|---|---|
| LOCOMO (100) — identical answers, tie | 44.0% | 44.0% | 4.50 / 4.50 |
| LongMemEval_s (50) | 38.0% | 16.0% | 4.12 / 1.94 |
| Overall (150) | 42.0% | 34.7% | 4.37 / 3.65 |
qwen2.5:1.5b; a full Claude-reader run needs an Anthropic API key.The three-arm memory-distance probe — where a bounded window goes blind
Complementary to the public benchmarks above: a controlled probe on a 3-session engineering conversation with 15 exact facts (numbers, commit hashes, config values) planted at three distances from the current turn — five each. The same reader (qwen2.5:7b, Claude-judged, embedding retrieval on) answers three ways. Accuracy = fraction answered with the exact value.
| arm | overall | recent (in window) | earlier, same session | cross-session |
|---|---|---|---|---|
| Local-only (recency window) | 0.33 | 1.00 | 0.00 | 0.00 |
| Local + TemporalStore | 0.87 | 0.80 | 1.00 | 0.80 |
| TemporalStore remote-only | 0.80 | 0.40 | 1.00 | 1.00 |
| Full replay (ceiling) | 1.00 | 1.00 | 1.00 | 1.00 |
Caveats
- Reader-hit is a deterministic lower bound, not an LLM-judge score — not comparable to the 88–94 vendor numbers (GPT-4o-judged).
- 7b is a 200-question LOCOMO sample (CPU-only makes a full dual-model sweep ~1–2 days); 7b LongMemEval deferred.
- The baseline is OpenViking-style — a flat source-retrieval reimplementation on the shared stack, not any vendor's shipping product.