Here is a question class that sounds exotic and is actually everywhere:
Auditors ask it about trades. Safety teams ask it about moderation decisions. Scientists ask it about datasets revised after the analysis shipped. Anyone who has debugged an ML feature store has asked it through gritted teeth. And if your agent’s data layer is a snapshot, a vector index, or a plain property graph, the question is not merely hard — it is unrepresentable. The information needed to answer it was destroyed at write time.
Evolution is not correction
The fix is old, from temporal databases: store two time axes per fact. Valid time is when the fact held in the world. Transaction time is when the store believed it. With both, two very different updates stop being conflated: evolution — “the collaboration ended in June” (the world changed; the old belief was right while it lasted) — and correction — “it never included Bob; fix it” (the world didn’t change; we were wrong, and the record of our error is itself data).
as_of_tt.In TGMS, every query
operator takes an as_of_tt argument, so time travel is just a
parameter — deterministic, no LLM involved:
entity_history(uid="n605", as_of_tt=1783612870…)
entity_history(uid="n605")
# carved: before/corrected/afterThis behavior is protected by the metamorphic test we consider the signature property of the whole system: any result pinned to a past belief state is byte-identical before and after later corrections. Getting it to pass flushed out two real leaks — result digests that included current-belief metadata, and version rows whose belief-closure timestamps quietly revealed the future.
Measuring the gap
Claims about representability deserve measurements. So the TGMS benchmark generator does something slightly evil: it injects corrections into the store before computing any gold answers, then emits paired “correction probes” — the same question pinned before the correction versus under current beliefs. The two gold answers provably differ. Then we run the full system and three honest baselines (same models, temperature 0, same answer contract, same repair budgets): vector-RAG over serialized events, static-graph RAG over the latest snapshot, and text-to-Cypher against the same events in a vanilla property graph.
| exact match · Qwen2.5-14B (local, 24 GB GPU) | TGMS | vector-RAG | static-RAG | text-to-Cypher |
|---|---|---|---|---|
| all task families (dev, n=22) | 0.41 | 0.09 | 0.05 | 0.18 |
| correction probes | 0.67 | 0.00 | 0.00 | 0.00 |
Two things worth noticing. The pooled gap (+36 points over static-graph RAG, 95% CI [0.18, 0.59] by paired bootstrap) is the expected story: computation over structure beats retrieval when questions compose time. But the probe row is the interesting one — zeros across every baseline, at every model size we tried. That is not a capability gap that scaling fixes; the baselines’ inputs simply do not contain the belief history. Meanwhile TGMS scores 0.67 on probes with a 7B model and a 14B model. The bi-temporal advantage is model-size-independent, because the model isn’t doing the temporal work.
Why this matters beyond graphs
The deeper pattern: agent memory that can be corrected must record its own belief history, or its verifier will bless answers grounded in retracted facts. TGMS applies this to its own summarization layer — memory digests record the transaction time they were computed at, and any correction quarantines digests whose window it touches. If you are building agent memory of any kind, that invalidation rule transfers directly.