An agent pointed at a data catalog re-reads the whole thing on every run, because it has nowhere to put what it learned last time. Palimpsest gives it somewhere: it reads DataHub through the official MCP server, writes down only what changed, and hands the conclusion back to the catalog as a link.
When the catalog contradicts a memory, the old belief is not overwritten. It is superseded, kept, and linked to the evidence that replaced it — which is what everything below is showing you, out of the same database an agent reads.
what it believes, and what it used to
Pick a dataset. The claim with the green rule is what the agent believes now; everything beneath it is what it believed before, in the order it stopped believing it. Click a buried claim to read why the consolidator judged the two incompatible.
loading…
the block an agent pastes before touching this dataset
loading…
Served by GET /subjects/{urn}/brief — facts first, the episodes
under them second, and what changed last. Same text the CLI prints.
what a second look costs
Three consecutive passes over the same eight datasets, verbatim from
examples/.
Between the second and the third, ownership of customers was reassigned in DataHub.
$ palimpsest cycle --limit 8 # memory starts empty Scanned 8 datasets. Wrote 42 observations (0 of them changes), skipped 0 unchanged (0%). Consolidated 42 episodes into 42 new facts (0 reinforced, 0 contradictions). $ palimpsest scan --limit 8 # nothing changed in the catalog Scanned 8 datasets. Wrote 0 observations, skipped 42 unchanged (100% of everything seen). $ palimpsest cycle --limit 8 # someone reassigns `customers` Scanned 8 datasets. Wrote 1 observation (1 of them a change), skipped 41 unchanged (98%). customers / ownership was: customers is owned by b2fd91.ORG_DATA_PLATFORM. now: customers is owned by bob.
Reading the catalog costs the same every time. What collapses to zero is everything downstream of the read — no embeddings, no writes, no model calls — because the agent already knew the other 41 things.
the loop closing
Not as a description — descriptions are written by people, and an agent that
clobbers one gets switched off within the week. As an institutionalMemory link,
where DataHub already puts further reading, pointing at the audit endpoint so what a reader
sees can never be a stale copy of what the agent thinks.
customers in DataHub after palimpsest publish. The agent's
link sits under Resources next to one a person added in January, and the owner reads
bob — which is what the memory believes, because that is where it read it.$ palimpsest publish linked urn:li:dataset:(urn:li:dataPlatform:dbt,…order_entry.customers,PROD) Agent memory — 5 beliefs, 5 revisions (latest 2026-08-05) … 8 dataset(s) now link back to the agent's memory. $ # DataHub's own answer, asked what is attached to `order_details`: [ { "url": "https://cloud.getdbt.com/accounts/107298/jobs/872519/docs/", "description": "Documentation Link", "createStamp": { "actor": "urn:li:corpuser:__datahub_system" } }, { "url": "…/palimpsest/subjects/urn:li:dataset:(…order_details,PROD)/beliefs", "description": "Agent memory — 6 beliefs", "createStamp": { "actor": "urn:li:corpuser:palimpsest" } } ]
The first element is dbt's own documentation link, which was on that dataset before any of this ran. The aspect is replaced wholesale on write, so existing elements have to be read back and rewritten alongside the new one — and that is the proof that they were: somebody else's link is still there.
the cluster behind this page, right now
Episodes, facts and their vectors share one transaction boundary in CockroachDB, so the consolidator supersedes a belief and writes its contradiction row atomically. A memory that can half-change its mind is worse than one that cannot change it at all.