A record of where every AI memory came from.
Lineleaf sits beside your AI application and records how each artifact was derived. When a source changes, it tells you exactly what else must change — and proves what did.
Source lineage
Every time your application turns one thing into another — a message into a memory, a memory into an embedding — it tells Lineleaf with one call. That call becomes an edge: parent, child, operation, model and time.
Lineleaf keeps identifiers and fingerprints. The content stays in your stores.
“I live in Vancouver.”
Memory · mem0:mem_7f2a
location = Vancouver
extract · 18:04:15
Embedding · pgvector:emb_3310
[0.12, −0.48, …] 1536-d
embed · 18:04:16
Summary · postgres:sum_0912
Lives in Vancouver · vegetarian
summarize · 18:05:40
See everything a change will touch — before it touches anything.
A change starts as a dry run. Lineleaf walks the descendants across every store and proposes an action for each one. Nothing executes until you approve the plan.
Source · chat:turn_331
A person told the assistant “I live in Vancouver.” Five records were derived from it.
Descendants · 5
Also feeds the summary: mem0:mem_51d0 · diet = vegetarian
Invalidation plans
An erasure is not one delete. The plan lists every descendant and what should happen to it: delete what was derived only from the source, rebuild what still has other valid parents, purge caches, warn agents.
When a store can’t guarantee deletion, the plan says so instead of pretending. Scope is fixed when you approve — if it grows, execution stops and asks again.
Plan · gmail:msg_8812 · user erasure · dry run
- 01Revisedgmail:msg_8812
- 02Removedmem0:mem_19c4
- 03Removedpgvector:emb_5521
- 04Stalesearch:idx_ab12 — store cannot confirm deletes; flagged for review
- 05Rebuildpostgres:usr_42
- 06Rebuildpostgres:sum_0912
- 07Removedredis:ans_88
- 08Stalelanggraph:plan_17
- 09Stalecalendar-agent:out_204
Rebuilding partial artifacts
A summary built from several sources isn’t wrong when one of them changes — it’s partially stale. Deleting it would throw away what’s still true.
Lineleaf marks it for rebuild and records the new parents on the receipt, so you can show the old fact no longer contributes.
Cleanup receipts
When a plan runs, each adapter reports what it did. Lineleaf writes those results into a receipt where every line commits to the one before it — so the record can’t be quietly edited.
Partial outcomes stay visible: a store that couldn’t confirm a delete appears as “needs review”, not “done”.

Explainability
“Why did the agent say that?” should be a lookup, not an investigation. why() returns the path from any artifact back to its sources: each operation, model, time and how much each parent contributed.
It also reports freshness — whether anything on that path has since changed.

Help us decide what ships first.