Bitemporal queries — Separate belief from reality.
Every fact carries valid time and record time. One query answers what the robot believed at decision time — and what was actually true. No other agent-memory system does this out of the box.
Four steps, four visuals — from the world asserting facts to a bad pick getting blocked.
STEP 01 · ARCHITECTURE
Sensors and systems stream facts in on the left; robots and LLM agents query “as of time T” on the right. In the middle: one binary, one file.
The world
Any sensor or system

Erubus
intervals · decay · bitemporal
STEP 02 · THE DATA MODEL
Each source asserts fact-triples with a start time and an open end. When the camera misses a move, the graph keeps both intervals — what was believed, and what was recorded late.
1 · SOURCES ASSERT
vision:cam1
frequent · half-life 12s
rfid:gate
rare · always correct
erp:wms
never decays · wrong 40%
2 · FACTS ON INTERVALS
(pallet-7, at, bay-3) [t=0 → ?] conf 1.0 ↓ half-life 12s
(pallet-7, at, bay-9) [t=6 → ?] recorded late — camera missed it
3 · DECISIONS GATED
STEP 03 · TRUST PROFILES
A fresh camera reading is gold; a 60-second-old one is a guess. The ERP never decays — and that eternal confidence is exactly what makes it dangerous. Confidence is computed, not stored.
The camera is trusted most when fresh and least when stale; the ERP never decays — which is exactly why the graph must not take it at face value. Below the gate, decisions re-scan instead of act.
STEP 04 · THE GATE
The pallet moves at t=6 and the camera misses it. Scrub past it: first the belief is right, then it's a confident lie, then confidence decays below 0.5 and the gate blocks the pick.
BELIEF
bay-3
REALITY
bay-9
CONFIDENCE
0.315
PICK BLOCKEDconfidence below 0.5 — re-scan triggered
Interval, source, confidence, decay. Nothing hidden, nothing eternal.
Microseconds, measured
No LLM, no network
One embedded SQLite file
One Rust binary
True over intervals
Decays with age
Per-source trust profiles
30× kill -9, invariants hold
Every fact carries valid time and record time. One query answers what the robot believed at decision time — and what was actually true. No other agent-memory system does this out of the box.
Microsecond point queries, no LLM call in the write path. Graphiti needs Neo4j and an LLM to write a fact; Erubus needs a file.
Cameras, RFID gates, ERPs — each source carries its own trust profile and half-life. A system-of-record lagging physical reality can be wrong 40% of the time; the graph knows not to trust it.
Confidence decays with age. Gate decisions on effective confidence and a 20-second-stale belief triggers a re-scan instead of a failed pick.
CASE STUDY · CARGO RUN — DEMO
A pallet moves. The camera misses it. The robot drives to the wrong bay on a 20-second-stale belief — and nothing in its memory could have warned it.
One bitemporal query separates what the robot believed at decision time from what was actually true — and decayed confidence gates the pick before it fails.
13.8% → 0.2% wrong picks. 4.15 → 0.81 cost per decision. Every failure explainable, after the fact.
“belief at decision (t=20) = bay-3, effective confidence 0.056 · reality at decision (t=20) = bay-9 — a threshold of 0.5 would have blocked the pick.”
Same fact stream, same decisions, only the query policy differs. Baseline acts on the latest belief — what a plain KV store gives you. Erubus gates on decayed confidence and re-scans below threshold.
WRONG PICKS · 8,085 DECISIONS
Same fact stream, same decisions — only the query policy differs.
50-pallet warehouse sim
same fact stream, same decisions
Baseline: latest belief
13.8% wrong picks, cost 4.15
Best TTL (age-only)
0.3% wrong picks, cost 0.96
Erubus confidence gate
0.3% wrong picks, cost 0.86
8 seeds × ~1,011 decisions
8,085 decisions total
World: inspection
Erubus 3.5% vs Mem0 3.7% — a tie, published as-is
World: shared-zone
Erubus 21.0% vs Mem0 21.5% — fresh wrong beliefs, a tie
crashtest: 30× kill -9
temporal invariants survive
A temporal knowledge graph for AI agents and robots. One Rust binary, embedded SQLite, no services to operate. Every fact is true over an interval, not forever — queries are always “as of time T”.
They store facts as if eternal, and Graphiti needs Neo4j plus an LLM call just to write. An embodied agent's memory goes stale, and acting on stale belief causes real failures. Erubus models that directly — and writes need only a file.
XTDB has the bitemporal semantics, but no robot will run a JVM. Erubus is a single static binary with microsecond point queries.
Measured over 8,085 simulated warehouse decisions: 13.8% wrong picks acting on latest belief vs 0.3% with confidence gating — at a fifth of the cost per decision. The same trace replayed through Mem0's OSS build (mem0ai 2.0.13, offline): gating on its relevance score still left 10.3% wrong picks, because that score measures similarity, not staleness. See the docs for the full table.
cargo run -- serve exposes HTTP(S); cargo run -- mcp speaks MCP over stdio, so any LLM agent becomes a client. cargo run -- observe streams this machine's processes in as facts.
