A PROJECT BY DIFRASAI

Erubus

that knows

when it's lying.

rust · embedded sqlite · µs queries ↓

ERUBUS

How it works — watch a belief go stale.

Four steps, four visuals — from the world asserting facts to a bad pick getting blocked.

STEP 01 · ARCHITECTURE

Erubus sits between the world and your agents.

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

vision:cam1camera stream
rfid:gatecheckpoint reads
erp:wmssystem of record
FACTS
Erubus core

Erubus

intervals · decay · bitemporal

AS-OF T
Robotsgated picks
LLM agentsvia MCP
HTTP clientsserve mode
Auditsbitemporal replay
Backupsone-file snapshot

STEP 02 · THE DATA MODEL

Facts live on intervals, not forever.

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.

PIPELINE

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

effective_confidence < 0.5block & re-scanelseact

STEP 03 · TRUST PROFILES

Every source earns its own decay curve.

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.

TRUST PROFILES · CONFIDENCE OVER AGEconf(t) = 0.5^(t/half-life)
1.00.50.00s30s60sgate = 0.5erp:wms (wrong 40%)rfid:gatevision:cam1

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

Decisions get gated — drag time and watch.

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.

LIVE · BITEMPORAL QUERYas of t=20s
belief · cam1reality

BELIEF

bay-3

REALITY

bay-9

CONFIDENCE

0.315

PICK BLOCKEDconfidence below 0.5 — re-scan triggered

Every answer comes with a receipt you can inspect.

Interval, source, confidence, decay. Nothing hidden, nothing eternal.

POINT QUERY

Microseconds, measured

WRITE PATH

No LLM, no network

STORAGE

One embedded SQLite file

RUNTIME

One Rust binary

FACTS

True over intervals

CONFIDENCE

Decays with age

SOURCES

Per-source trust profiles

CRASH SAFETY

30× kill -9, invariants hold

Capabilities

01

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.

RESULTSas-of T2 timelines0 lies
02

Control-loop speed Fast enough to sit inside the loop.

Microsecond point queries, no LLM call in the write path. Graphiti needs Neo4j and an LLM to write a fact; Erubus needs a file.

RESULTSµs queries1M facts0 services
03

Observe everything The world, streamed in as facts.

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.

RESULTS3 sourceshalf-liveslive stream
04

Confidence decay Stale belief gets blocked, not obeyed.

Confidence decays with age. Gate decisions on effective confidence and a 20-second-stale belief triggers a re-scan instead of a failed pick.

RESULTS0.3% wrong−79% costgated

CASE STUDY · CARGO RUN — DEMO

The Challenge

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.

The Solution

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.

The Results

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.”
Output — cargo run --release -- demo

Measured, not vibes.

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

baseline · latest belief13.8%
best TTL · age-only0.3%
erubus · confidence gate0.2%

Same fact stream, same decisions — only the query policy differs.

Run the eval yourself
EVAL RUNBOOK6 phases · validated
  • 50-pallet warehouse sim

    same fact stream, same decisions

    ready
  • Baseline: latest belief

    13.8% wrong picks, cost 4.15

    ready
  • Best TTL (age-only)

    0.3% wrong picks, cost 0.96

    ready
  • Erubus confidence gate

    0.3% wrong picks, cost 0.86

    ready
  • 8 seeds × ~1,011 decisions

    8,085 decisions total

    done
  • World: inspection

    Erubus 3.5% vs Mem0 3.7% — a tie, published as-is

    measured
  • World: shared-zone

    Erubus 21.0% vs Mem0 21.5% — fresh wrong beliefs, a tie

    measured
  • crashtest: 30× kill -9

    temporal invariants survive

    done

Common questions

What is Erubus?+

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

Why not Zep, Mem0, or Graphiti?+

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.

Why not XTDB?+

XTDB has the bitemporal semantics, but no robot will run a JVM. Erubus is a single static binary with microsecond point queries.

Does it actually reduce errors?+

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.

How do agents connect?+

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.

Give your agent a memory that admits what it doesn't know.

cargo run --release -- demoRead the specs
✓ Crash-safe (30× kill -9)✓ fsck temporal invariants✓ Consistent snapshots✓ MCP native
Erubus