Post #1 · Bi-temporal semantics

Why your agent needs
two kinds of time

Here is a question class that sounds exotic and is actually everywhere:

“As of March 1 — before we corrected the record — what did we believe about this account?”

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).

valid time → 0 40 60 100 belief at tt₁ p = 1 · vt [0, 100) correct(p=2, vt=[40,60)) belief at tt₂ p = 1 p = 2 p = 1 tt₁ stays queryable forever: as_of_tt = tt₁ still returns the top row, byte-identical
A correction never overwrites. It closes the old belief in transaction time and opens a new one — carving the corrected interval while preserving the remainder. Both rows remain queryable, each under its own 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:

pinned before the correction
1 version
entity_history(uid="n605",
  as_of_tt=1783612870…)
current beliefs
3 versions
entity_history(uid="n605")
# carved: before/corrected/after

This 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-RAGstatic-RAGtext-to-Cypher
all task families (dev, n=22)0.41 0.090.050.18
correction probes0.67 0.000.000.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.

📎 Everything above carries determinism receipts (git SHA, config SHA, suite SHA, model strings) and regenerates from a clean checkout — see the technical report. The probe demo runs deterministically in the guided GUI, and here is a real rendered trace with verifier-badged claims.

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.