Skip to content

Time: what held, and what mem7 believed

Since 03/10/2026 (mem7 0.8), every memory is a series of versions with two time axes:

Axis Columns Question it answers
Valid time valid_from, valid_to When did this hold in the world?
Transaction time tx_from, tx_to When did mem7 believe it?

A plain memory store/read works as before: a fact holds from the moment it is written, and reads return what mem7 believes now of what holds now.

Writing

memory_store takes two optional arguments, a date (2026-03-20, midnight UTC) or an RFC3339 time:

  • valid_from: when the fact starts to hold. In the past, it corrects history.
  • valid_to: when it stops holding.

A new version ends the versions it overlaps, and keeps what they said outside its own period:

2026-02-15  store event7:host "Railway"                      Railway    [02-15, …)
2026-03-20  store event7:host "Cloudflare"                   Railway    [02-15, 03-20)  Cloudflare [03-20, …)
2026-04-12  store event7:host "local only" valid_from=04-05  … Cloudflare [03-20, 04-05)  local only [04-05, …)

The last line is a correction of the past: what mem7 believed on 04-11 (Cloudflare until today) is no longer believed, but is still readable as_of that day.

memory_forget stops believing a key; it does not erase the past: a read as_of an earlier moment still sees it.

Reading

memory_recall, memory_search, memory_context and memory_list take:

  • valid_at: what held at that moment ("where was event7 on March 1st?")
  • as_of: what mem7 believed at that moment ("what did we know on April 11th?")

Both together: what mem7 believed on one day about another. A version with an explicit validity shows a Valid: from → to line (recall, search) or valid_from / valid_to / tx_from / tx_to fields (context); memory_history lists each write with the validity it declared.

Storage

The markdown workspace stays the source of truth: a store entry carries valid_from / valid_to when the caller gave them, under the hash chain. The index keeps every version; an index built before versions (one row per key) is rebuilt from the markdown when mem7 starts, keeping embeddings.

Out of scope for now: detecting that two different keys contradict each other.