tulv.ing · an episodic-memory diagnostic

The Tulving X-Ray

We built a ruler for machine memory, pointed it at our own product first, and published the wound along with the fix. v2.0 · July 2026

Previous release: v1.1 (June 2026)

A smell of rain on hot pavement can hand you back an afternoon you hadn’t thought of in twenty years — who was there, what was said, the red sweater someone wore. That is episodic memory: not stored text, but a re-lived scene, reopened by the smallest key. Our machines converse for millions of tokens and still have nothing like it. This report measures the distance — starting with our own product.

In one minute. 1,264 planted-fact questions, five memory setups, one answering model — and a profile across seven kinds of remembering instead of a single score. What the film shows:
  1. Similarity retrieval is blind to the future — ours included. Ask “can I take the pottery class next Thursday?” and the answer lives in “Thursdays I coach football.” The two sentences don’t look alike, so retrieval never fetches the constraint. Our product: 0.52 on these questions. Raw context: 0.94. Same cliff across three question sets and two seeds.
  2. The compression isn’t the culprit. The selection is. A dumb summarizer that keeps everything scores 0.94 on the same questions.
  3. The model was never the bottleneck. When the evidence actually reaches it, it answers right 99% of the time. 101 of our product’s 111 errors were delivery failures, not thinking failures.
  4. Two “always-carry” rules recover most of it. Our Phase-0 candidate climbs to 0.88 on the blind spot, gives up nothing anywhere else, and posts the best overall result in the grid — on ~3% of raw’s tokens.
  5. The questions renew; the ruler doesn’t bend. A frozen-grammar rebuild reproduced last release’s score to the third decimal: 0.988 = 0.988. You can regenerate the whole exam and still compare versions.

1 · We almost fooled ourselves with our own scoreboard

Early on we kept one composite number, like everyone does. It told us our product and raw context were 0.6 points apart — a rounding error. It was technically true and completely misleading. The same data, split by kind of remembering, showed the product beating raw by 26 points on temporal questions while losing 43 points on future projection. One number had averaged a superpower and a blind spot into silence.

So this report is an X-ray, not a leaderboard. The composite still exists — in our internal regression logs, where it belongs.

The profile — seven kinds of remembering

Accuracy per criterion, primary-labeled probes. C2 is deliberately absent — it isn’t an accuracy, so it can’t share this axis; see “Where’s C2?” below.

Read the shape, not the average. The terracotta dashed line (our product) matches or beats raw everywhere — then falls off the C6 cliff.

2 · Seven kinds of remembering

The criteria come from the cognitive science of episodic memory — Endel Tulving’s territory. We turned them into functional probes; no claims about machine consciousness, just measurable behaviors. C1 binding: tying an episode’s what-where-when together. C2 single-exposure: things said once, not repeated. C3 instance discrimination: the red sweater axis — which of two similar episodes was it? C4 temporal structure: order, distance, resolving “tomorrow” into a date. C5 source monitoring: who said it, rumor vs confirmed, and an honest “you never told me.” C6 future projection: carrying yesterday’s constraints into tomorrow’s decision. C7 consolidation: the rule and the exception that broke it.

3 · The blind spot

Here is the whole finding in one exchange. The user once said: “Every Tuesday evening I’m at my mother’s — standing arrangement.” Weeks of chat later they ask: “Can I host the book club next Tuesday?” Retrieval searches for sentences that resemble the question — book clubs, hosting, evenings — and the one sentence that decides everything resembles none of it. It never gets fetched. The model, honestly and wrongly, answers that nothing stands in the way.

C6 — future projection: the cliff, and the fix

Grounded accuracy on future-projection probes. Grey dashes: the same questions asked with no conversation at all (0.30).

Everything beats the no-history line by +48 to +70 points — these questions genuinely require memory. Carriers keep C6 (raw 0.94, summarizer 0.94); similarity selection drops it (0.52); the candidate recovers most of it (0.88).

Three details we want on the record. The failures are not hallucinations — the model reports it was never told, which is the correct answer to the wrong context. The cliff is architectural, not bad luck: it replicated at 0.35, 0.48 and 0.52 across three sets and two generation seeds. And the candidate’s remaining gap is not smeared around — it concentrates in one measured cell, constraint questions with no weekday word and free-form phrasing (0.44 vs raw’s 1.00). That cell is Phase 1’s numeric target, pinned before we write a line of it.

4 · Whose fault is each error?

Every run records whether the answer’s evidence sentences were actually present in what we handed the model. That one bit splits every error into two very different diseases: the memory layer didn’t deliver, or the model fumbled what it was given.

Delivery loss vs model loss

Wrong answers attributed, per setup (1,168 evidence-bearing probes).

With evidence present, every setup answers ≥0.99. The next points live in memory engineering, not in waiting for smarter models. Raw’s 103 errors are pure reading failures — its evidence is always on the page.

5 · The luxury and the constraint

One honest caveat about that raw 0.94: it isn’t memory. It’s a frontier model re-reading a 1.17-million-token history on every question — a luxury simulation that costs 31,399 input tokens per request and exists only for models with huge context windows attached to generous invoices.

Our earlier published runs show what happens without the luxury. For a frontier model, retrieval adds about +3 points over raw. For a 7-8B open model, raw collapses — 0.60 — and the same retrieval is worth +22 points, roughly seven times the value. And on a 32k-context model the question isn’t quality at all: a long raw history simply doesn’t fit — the request is refused — while retrieval’s few hundred tokens run fine. For small and cheap models, a memory layer isn’t an optimization. It’s the difference between running and not running.

6 · What it costs

Quality vs tokens — log scale

Composite (internal metric, shown for cost context only) vs measured mean input tokens per request.

Top-left is the good corner. The candidate posts the grid’s best composite at 898 tokens per request — ~3% of raw. The oracle’s 135 tokens mark the theoretical floor.

setupin tok/reqout tok/reqwhat the outputs say
raw context31,399512long context, long answers
oracle (evidence only)135243the floor, both directions
tulbase (free tier)52,706898pays twice: bloated in, verbose out
TUL 2.0 (product)647343lean context → lean answers: 33-38% fewer output tokens than raw
TUL 2.1 Phase-0898317
no-history control†94790no conversation at all → longest answers: pure speculation

† not a memory system — the ablation twin from §3, shown here because its output length is the purest measure of what a model does when it has nothing to be grounded in: it talks more, not less.

A side-finding we didn’t expect: memory layers save on the output side too. Focused context produces focused answers — raw pads its replies (512), the bloating summarizer pads harder (898), and the no-history control speculates longest of all (790 tokens of guesswork per answer). Token bills have two sides; most memory benchmarks only ever report one.

A necessary footnote: we can’t — and don’t — touch the model’s answers. A context layer controls only what the model reads, never what it writes. The output savings above are a side effect of focused context, not a lever we hold, and we won’t promise them. What we can actually offer is narrower and more valuable: keeping the model grounded in the right context — and with it, a lower risk of confident hallucination.

7 · Why you can trust it

pre-registeredrenewable-but-comparablehidden held-outno LLM judgeembedded ablationdelivery-vs-model split

Every run’s hypotheses and pass/fail thresholds go into an append-only registry before the run — and the failures ship. Two of five pre-registered expectations failed this time. Consolidation probes (C7) hit ceiling for every system: that axis doesn’t discriminate yet, and its rows carry that caveat until we harden it. And our oracle — which always holds the evidence — lost to retrieval on temporal questions, because our oracle render lacks date stamps. That failure became a finding: how evidence is stamped matters as much as whether it arrives.

Against memorization and self-deception: new question sets embed the old ones byte-identically (this rebuild reproduced the previous composite, 0.988 = 0.988), a private held-out split is generated from a seed that exists in exactly one place — a password manager — and every future-projection probe runs a no-history twin, so if the questions were answerable from general knowledge, the twin would say so (it says 0.30). Scoring is deterministic; where word-matching frays we publish three layers — automatic, widened, hand-read — instead of quietly stretching a lexicon.

8 · The numbers

setupC1C3C4C5C6C7
raw context0.8091.0000.8440.9730.9440.990
oracle1.0001.0000.9600.9810.9840.990
tulbase (free)*0.9400.979
TUL 2.00.8050.9721.0000.9840.5171.000
TUL 2.1 Phase-00.8050.9941.0000.9860.8771.000

* the free tier ran only the new families in v2.0 (logged amendment); its full v1.1 profile (composite 0.991) is in the run registry. One more row worth reading: C1 — episode binding — is nobody’s strength. Every long-context arm sits at 0.805-0.809 while the oracle hits 1.000. Dilution damages binding, and retrieval doesn’t repair it. Open problem — for the field, and for us.

Where’s C2? Deliberately missing from the chart and the table, for two honest reasons. First, it’s a different kind of number: C2 has no questions of its own — it’s a slice, the accuracy difference between facts planted once and facts deliberately repeated, measured across the other families’ probes. A delta of “+4pp” next to accuracies like “0.944” would be apples beside oranges. Second, this release’s C2 signal is weak and confounded: repeated plantings only exist in our longer conversations, so exposure and conversation length move together. What we measured — raw gains +4.2pp from repetition, the memory systems roughly 0 (their carriers were near ceiling on those subtypes) — is directional at best, and we’d rather label it that than dress it up. A cleaner C2 design (repetition varied within a single length regime) is on the v2.1 list.

9 · Honest limitations

Single answering model in this release (gpt-5-mini); weak-model X-rays are next, and §5 explains why we expect them to be less forgiving. Hand-read scoring layers are single-reader. “Where” means conversation-space — sessions and threads, not physical rooms. Two probe kinds use a structured answer format, trading a little naturalness for fully deterministic scoring; the trade is disclosed in the probe notes. The C2 exposure slice is weak signal, confounded with conversation length — directional only. And these are functional probes inspired by Tulving; the phenomenology stays with him.

10 · What’s next

Everything is open: the generator, the runner, the public set, this report. Regenerate the exam, run your own system, audit our losses. Especially our losses.

Tulving liked to say that episodic memory is mental time travel — the only machine we know that runs in both directions. Ours still mostly runs backward. The interesting engineering, and maybe the interesting question about minds, is in the forward gear.