Bitemporal graph layer for Mnemo.
Inspired by Graphiti (repo,
paper). The model is the same:
every edge carries valid_from / valid_to (when the fact is
true in the world) plus recorded_at (when the system saw it),
so historical queries can ask "what did we believe at time T?"
without losing later corrections.
valid_from valid_to (None = still true)
^ ^
| fact validity |
+-----------------------+
|
+-- recorded_at (when we wrote the row)
Today this crate ships:
- The [
TemporalEdge] type and a [GraphStore] async trait. - A DuckDB-backed [
DuckGraphStore] that createsgraph_nodesandgraph_edgestables on first use and supports the round-trip- bitemporal
as_ofwalk needed by retrieval.
- bitemporal
- [
graph_expand] — bounded BFS that respectsas_offiltering and a maximum depth.
Edge extraction is out of scope for this crate. It is a bitemporal
STORAGE + QUERY layer: callers construct TemporalEdges and this crate
stores, closes and walks them. There is deliberately no LLM in it.
An extract() stub used to live here, always returning an empty Vec.
That is worse than absent: a caller cannot distinguish "found no
relations" from "not implemented", so wiring it in yields silent no-ops
forever. It was removed in favour of saying so (see #156).