Zep alternative — how contradictions are handled
Zep invalidates the older fact.
Enovari leaves both
open until someone writes why.
Zep builds a temporal graph and gives every fact four
timestamps, so when a newer statement arrives the older one can be marked no
longer valid. Enovari does not perform that step. It opens a contradiction
row, leaves it unresolved, and both notes stay in the store
— and settling it later is a deliberate act with a written reason
attached, not a side effect of saving something. That is the whole
difference, and it is a real disagreement about what a memory is for.
Every claim about Zep below carries the page it was read from and the day,
and quotes Zep’s own words wherever the argument turns on them.
You told it one thing in March and the opposite in August. What should it believe in September?
help.getzep.com/facts · help.getzep.com/how-graph-creation-works · read 2026-09-07, re-checked 2026-09-14
Conflicting AI memories
One fact, two futures.
- 12 MARYou tell it the deploy target is the staging box.
- 27 AUGYou tell it the deploy target is the customer’s VPC.
Zep — the older fact is closed off
Each extracted fact is compared to existing edges: duplicates merge, and
contradictions invalidate older facts rather than leaving conflicting truths side
by side.
help.getzep.com/how-graph-creation-works ·
read 2026-09-07, re-checked 2026-09-14
The old fact is not deleted by that step. It keeps four timestamps —
created_at, valid_at, invalid_at,
expired_at — and the agent is handed the window it was true in:
(2024-11-14 02:03:58+00:00 - present)
. Zep hedges it in their worked
example, where Zep attempts to invalidate
the older fact. Two of those
four timestamps exist to record when Zep found out, separately from when the thing
was true — a bi-temporal model Enovari does not have.
help.getzep.com/facts · read 2026-09-07, re-checked 2026-09-14
Enovari — both stay, and the argument is filed
Neither note is closed, dated out, or marked superseded. A contradiction
row is opened with a status of unresolved, and both notes stay in
the store until a person or an agent settles it on purpose.
Settling it is a named act. The resolver takes three verbs —
dismiss (both valid), supersede_a,
supersede_b — it rejects anything else, and it will not take
the call at all without a written explanation. Blank does not count, and neither
does a space. Superseding is available here. It is just never something the
software did while you were not looking.
ld_resolve_contradiction — the published
tool contract and the shipping resolver · read 2026-09-07
Neither of these is the safe one. Zep’s answer gives an agent one current fact and the dates it held for, which is what you want when the world genuinely moved on and the newer statement is simply correct. Ours gives an agent two facts and no ruling, which is what you want when the disagreement is the interesting part — when one of the two is a mistake somebody has to notice, not a fact the world simply moved past.
Cost of holding contradictions open
What our answer costs.
A row nobody closes stays open. In the whole shipping build there is exactly one statement that changes a contradiction’s status, and it is the resolver — so something has to call it, and nothing else ever will. Holding a disagreement open is only a virtue if somebody eventually walks up to it, and the design does nothing to make anybody walk up to it. Calling an untended pile “preserved history” would be a nicer word for a backlog.
A contradiction you file by hand can only ever be dismissed. When a
person or an agent files one deliberately, it is stored as a self-pair — the
row points at the same note twice. There is no second memory to keep, so the two
supersede verbs have nothing to act on: the resolver refuses the call and
leaves the row open rather than marking it resolved and doing nothing. That
is the right refusal and it is still a limit. Superseding works on the
disagreements the store found by itself; on the ones you raised, your only verb is
dismiss.
ld_contradict ·
ld_resolve_contradiction · read 2026-09-07
Nothing decides at the moment of writing. An agent that reads two contradictory memories has to do something about it, and Enovari will not have done it in advance. Between the write that disagreed and the resolution that settles it, the store answers with both notes and no ruling — and that gap is as long as nobody is looking. If what you need is one current answer carrying the window it was true in, without anyone being asked, Zep is built for that and this is not.
Zep publishes a limit of its own in the same spirit — on matching entities
it says Entity resolution is best-effort
and that it prefers to
under-merge
rather than fuse the wrong two things.
help.getzep.com/how-graph-creation-works
· read 2026-09-07, re-checked 2026-09-14
All three items above are the same fault seen from three sides: this design moves work onto a person. That is the invoice, and it does not come with a discount. What it buys is a store in which a supersession is a verb somebody chose and a reason somebody wrote, or it does not happen. The exception: a note marked short-lived, or given an expiry date, is archived once it lapses.