# Knowing, Remembering, Vaguely: An Agent-Native Database (PlatypusDB)

> Source: <https://pentad.ai/PLRN/020/>
> Published: 2026-07-20 20:15:31+00:00

# Knowing, Remembering, Exactly, Vaguely: An Agent-Native Database

The world does not speak. Only we do. The world can, once we have programmed ourselves with a language, cause us to hold beliefs. But it cannot propose a language for us to speak.

— Richard Rorty,

The Contingency of Language(1986)

## Abstract

**PlatypusDB is an agent-native, bitemporal event database**: Gleam (OTP)
control plane over a Zig data plane, in-process with WunderOS. Custom-built, not
assembled, for agentic workloads inside WunderOS. The Merkle WAL *is* the
database. Graph, vector, versioned-tree, image, and analogy views derive from
it. Datalog queries and rules read it crisply. VSA resonance reads it fuzzily.
The whole database replays deterministically and is fuzzed by a
TigerBeetle-style VOPR. PlatypusDB is one write path, two clocks, zero glue
code.

The [“agents just need a filesystem”](https://www.amplifypartners.com/blog-posts/file-systems-for-agents)
proponents are right about the axis: agents want the database nearby, inside the
harness or agentic OS, removing an authority boundary. If the database is part
of the agent’s execution substrate, a write, a derived inference, a tool action,
and a replay checkpoint can share one ordering and one failure model. But they
are wrong about the organ: agents need two clocks kept, fuzzy recall, and
provable provenance. A filesystem does none of it.

Agentic memory has a particular shape: both crisp and fuzzy at once, it is layered, cryptographic, and bitemporal. Since that shape is not a subset of any general-purpose database, we built a database that fits the shape precisely. We embed it in WunderOS. We call that shape “holographic” and “hierarchical”, which require explanation.

This note discharges that burden, in part, and offers the accounting that our
choice obliges: what would not fit; why the pressures that produce the shape are
each survivable alone and not survivable together; what *hierarchical* and
*holographic* mean precisely as non-decorative terms, and what the agent-native
database does not yet do.

The world that PlatypusDB exists to support is this one:

Nothing an agent has seen, said, or done is lost. It can be found again whether you, or another agent, remember it exactly or only vaguely. And what was found, when, and on whose authority can be, under color of external audit, proved afterwards.

In WunderOS, an agent’s memory makes retrievability, uncertainty, temporal position, and authority coexist in one auditable history. That is a world of new requirements. It is worth asking why so few new databases have been built to meet it.

## 1. The choice that has no good third option

You have data, so you need a database, and there are two ways to get one.

First. Use a database that already exists. You inherit decades of optimization,
a body of operational knowledge, a hiring pool, a manual, and a working system
very much sooner than you would otherwise have it. You also inherit a shape you
chose but did not necessarily want. If your problem is one the database was made
for, this is not a cost, and for almost every project ever undertaken it is not
a cost, which is why almost every project ever undertaken has correctly taken
this option. *But if your problem is not one the database was made for, the
shape is a cost you pay every day*, in glue, in impedance, and in the features
you quietly decide not to build because the database will not fit them. All in
all, this is what smart people do.

Second. Build a database that fits your problem: nothing in it you do not need, everything in it that you do, arranged as you need it. You get the fit. You also own the whole thing, forever, including the parts that are boring, and including the parts that are boring and hard, of which a database has an irritatingly large number. All in all, this is what unbalanced people do.

There is no third option, and there is no way to have both. Every account of
this trade that presents it as a temporary difficulty, to be dissolved by a
sufficiently clever architecture, is offered by someone who’s paid for neither
side of it. *The thing you give up does not stop existing because you gave it
up.*

Being unbalanced, I chose that WunderOS would build. What follows is the
accounting. This is the second database I have built. The first was
[Stardog](https://stardog.com/). So my estimate of what building costs is not a
guess. (The key difference that matters: Stardog is a general purpose *database
system* and PlatypusDB was built *for WunderOS specifically*.)

## 2. An assemblage is not a database

I said there is no third option but I didn’t say that people generally know or appreciate this. They generally don’t. The move nobody defends and everybody, at least lately, makes is to assemble one, i.e., to bodge it up out of parts, i.e., out of other databases.

There is a graph in the problem, so Neo4j. There is a log, so Postgres with a time-series extension. There are embeddings, so pgvector, or a dedicated vector store if the embeddings are load-bearing. There is an audit requirement, so an append-only table somewhere with a trigger on it. Then Python to hold the four of them together.

This is not a database. This is Frankenstein’s monster’s database. *This is four
databases and a prayer*.

Each of the four keeps its own clock, holds its own account of what a fact is, implements its own durability model, and has its own opinion about when a write has happened. The glue owns none of these questions and is obliged to reconcile all of them.

Every seam is a place where the two clocks of [PLRN-018](/PLRN/018) can come
apart, and nothing in the assemblage is in a position to notice when they have,
because noticing would require some component to hold both clocks at once, and
no component does. When the audit arrives and asks what the system believed at
the moment it acted, the assemblage cannot answer, not because the information
was destroyed but because it was distributed across four stores that were never
obliged to agree about what time it was.

That is the operational failure. The philosophical failure underneath it is the one that produces it, and it is worth stating because it is what makes the operational failure feel like bad luck rather than bad design.

*A database-assemblage assumes that one of its four descriptions is the real one
and that the others are indexes over it.* Usually the relational store is
elected to the role, because it is the one with the schema, and a schema looks
like an ontology if you do not look too closely. The graph is then a view of the
tables, the vectors are a lossy summary of the text in the tables, and the log
is what happened to the tables.

This owes everything to the idea that data storage is a mirror of reality: there is a way the domain really is, one vocabulary describes it correctly, and the other vocabularies are approximations of that one. But the world does not propose a schema. The domain does not tell you which of your descriptions is the true one, because it is not in the business of having descriptions.

What is left when you give up this idea is not relativism and not despair. It is a working distinction between the log and its redescriptions. The log is what happened: an append-only record of facts asserted, retracted, derived, and observed, each with its provenance and its two timestamps. Graph, tree, vector, tier, index: these are redescriptions of the log, each one useful for something, none of them the picture. A database built on that principle looks different from one built on the other principle. The rest of this note is what it looks like.

But what really makes the difference between an assemblage and a single system with many parts? Surely I’m simply putting my thumb on the conceptual scale?

The difference is the one between a chimera and a platypus. Frankenstein’s
creature is parts of other bodies, taken from where they grew, sutured, and
animated from outside. It has more than one origin and no single account of
itself, which is why it comes apart under load and why it is always, in the end,
the seams that fail. A platypus also looks assembled (the bill, tail, webbed
feet, eggs, venom, a sense for electric fields) and it’s very much *not*. It is
one naturally evolved animal, descended once, responsively ultimately to
environmental pressures, whose parts grew together and share a bloodstream. The
resemblance to a committee’s work is entirely in the eye of a viewer who
expected mammals to be shaped some other way.

PlatypusDB has many organs and one origin. Every one of them is a redescription
of the same log, keyed by the same content hashes, carrying the same two clocks,
covered by the same chain. *That is a claim about descent through environmental
pressure rather than about features*. It’s also the one claim in this note that
a feature list cannot settle in either direction.

## 3. The pressures are survivable one at a time

In my view, there are 14 (!) properties of the enterprise agent problem that produce the database shape that I describe here. Yeah, I know: 14 is a lot; but it wasn’t me who made the enterprise a complicated place.

We will take them one at a time, because taken one at a time each of them can be answered by something that already exists. I concede that as generously as it can be conceded. Then, for each, I will describe what WunderOS does about it, because a pressure named and not answered is just complaining.

The pressures are arranged in 4 groups: what agents emit, what agents recall, what agents do, and what enterprises demand of them. The last group is the largest, which is not padding. An agent in a bank is a different problem from an agent on a laptop, and most of the difference lands there.

### 3.1 What agents emit

**1. Agents talk a lot.** They emit at machine rate and they emit constantly:
observations, tool calls, intermediate conclusions, retractions of intermediate
conclusions. The write path has to accept this at a budget measured in
microseconds, and it has to accept it at fleet scale, that is, from many agents
at once.

This alone is an ingest problem, and ingest problems have known answers.

WunderOS takes the write at the only price that works, which is no price beyond
the append. A fact lands in a 4 KB row, 31 rows fill a bank, and the bank goes
to disk through `io_uring`

with `O_DIRECT`

as a page-aligned append behind an
explicit durability barrier (§7). There is no index to update on the way in,
because the summary that makes a row findable is computed by superposing what
the row already contains (§4.2). The write path does not maintain a structure;
it appends one.

**2. You can’t know in advance what is text, context, subtext.** An agent’s
memory is not a schema you can design, because the thing that turns out to
matter six months from now is not a thing you knew to have a column for
([PLRN-015](/PLRN/015)) six months ago. At this point the addled or the
scoundrelous reach for “metadata”, and right-thinking people reach for a gun.
You cannot know what to index because you cannot know what will be recalled, not
to a certainty.

This alone is a document-store problem, and document stores exist.

WunderOS fixes the shape of a fact and leaves its vocabulary open. Five slots, subject, predicate, object, context, lineage; and a Lexicon that registers new predicates at runtime rather than at schema-design time. The structure is closed so that the physics can be constant-time, and the vocabulary is open so that the domain can arrive later, which is the only division of the problem that survives contact with a domain that evolves, fast and continuous.

**3. Agents not only read but they also see.** An enterprise agent’s day is
screenshots, scanned invoices, architecture diagrams, a photograph of a
whiteboard, a chart whose numbers appear nowhere in the text around it. Treating
those as attachments to the real memory is how you lose them, because the pixels
are the evidence, and the thing somebody asks about six months later is what was
*in* the diagram.

This alone is a multimodal-embedding problem, and CLIP with a vector store next to it exists.

WunderOS captures the image verbatim and admits it to the same substrate
everything else lives in. An Image is a first-class SOCL-slot filler rather than
an attachment with a caption. Image lands in the same Groove algebra text lands
in, so a text query and an image query are the same operation over the same
bytes, and late fusion combines them without either having to agree with the
other in advance (§6). *Native* here means what it says: no second store, no
second clock, no join. VSA is a hoot.

Three pressures, one write path. The fact, the unknown predicate, and the image all become the same thing on the way in, a bundle of slots in a page-aligned row, and the store never branches on which of the three it was. An assemblage branches three times, into an ingest pipeline, a document store, and an embedding service, each with its own opinion about when the write happened.

### 3.2 What agents recall

**4. Recall should be crisp when you remember well and fuzzy when you remember
badly.** Sometimes you know the identifier and want the row, exactly, and a
near miss is worthless. Sometimes you remember only that there was something
about a counterparty in the spring, and you want the system to do what a favored
colleague would do, which is to produce a handful of plausible things and let
you recognize the one you meant. Both of these are retrieval. They want opposite
machinery.

This alone is answered by running a vector index next to an inverted index, which everybody does.

WunderOS runs both out of one row. Of a row’s 4 KB, 2048 bytes are the superposed bundle that answers the fuzzy question and 48 are the relational fingerprints that answer the crisp one (§6). Two indexes agree with each other eventually; these two cannot disagree at all, because they are not two copies of anything.

**5. We remember by association, which is temporal and spatial before it is
semantic.** We do not recall by domain sense. We recall by adjacency: the thing
that happened just before; the thing that came up in the same conversation; the
way the light was when she said that she was dying; the thing that shares a
cause with the thing we are looking for, even when no relation in the domain
model connects them. WunderOS implements this as spreading activation over four
kinds of edge: temporal, taken from ULID adjacency; structural, since the
Pentad’s subject-predicate-object core is already a directed graph; associative,
taken from the lineage antecedents in the trace log and from Pentad VSA
resonance; and abstractive, taken from membership in a cluster of summaries.
Activation spreads, competitors are laterally inhibited, and what lights up is
returned.

This alone is a graph problem, and graph databases exist.

WunderOS builds that graph per query and then throws it away (§4.4). WunderOS retrieval, codename Erregung, takes the anchors, spreads activation across the four kinds of edge to a bounded depth, laterally inhibits the competitors, and returns what lit up, having added no persistent state whatever. The graph a graph database would maintain forever is here a description produced on demand, because nothing reads it often enough to earn its perpetual maintenance.

**6. Enterprise domains are too large to have been seen.** No agent has met
every case in a real enterprise domain, and the case that matters is regularly
one it has not met. What it has instead is a case that is *structurally* the
same and locally different: this counterparty X is to this instrument Y as that
one A was to that other one B.

Recall by adjacency will not find it, because nothing adjacent connects them. Recall by similarity will not find it either, because the surface features differ. The correspondence is nowhere else but in the structure.

This alone is what you would ask a language model to do, and language models do it.

They do it without provenance, without a calibrated confidence, and without any
account of which stored facts licensed the transfer, which is fine right up
until somebody asks. They’re also hella costly. PlatypusDB answers with
first-class Analogy support (again, thank you, VSA). `analogy/3`

as an evaluable
Gleamalog predicate that returns answers *with confidence*, composing into the
same provenance layer as crisp derivations by way of a confidence semiring (§6).
A graded analogical answer and a crisp deductive one can then appear in one
proof without either quietly laundering the other.

Three ways of remembering, one set of bytes and one algebra. Crisp and fuzzy come out of the same row. Association and analogy are both operations on the same Grooves that row is built from, one spreading across edges and the other binding across structure. The assemblage buys a vector store, a graph database, and a frontier model, and gets three systems that cannot cite each other.

### 3.3 What agents do

**7. Agents guess and must be able not to have guessed.** An agent that plans
may explore branches it will not take. It drafts, it tries, it discovers that the
third option was wrong, and the memory of an abandoned attempt must not be
indistinguishable from the memory of a decision. The exploration also has to be
isolated: two branches explored at once cannot see each other’s writes, or the
comparison between them means nothing.

This alone is a transactions problem, and every database built since the 1970s has isolation levels and savepoints.

WunderOS hands the agent a branch rather than a transaction, forking a copy-on-write view of the thick-fact substrate, letting the agent read and mutate it in isolation, and then either merges it back or discards it, at which point the abandoned branch has left nothing behind (§4.7).

A transaction is a promise about a write. A branch is a place to think. Banks need the former; agents in banks the latter.

**8. Agents cannot afford to keep looking.** An agent that must notice when
something changes has two options: re-ask its question on a timer or be told
again in the future. Polling is what you build when the store cannot call you
back, and it is wrong in both directions at once, too slow to catch what matters
and too expensive to run at the rate that would catch it. An enterprise agent
watching a position, a queue, or a counterparty’s exposure needs the store to
hold the question open and push the difference.

This alone is a materialized-view problem, and Materialize, Feldera, and every CDC pipeline ever built exist.

PlatypusDB holds the question open with a standing-query capability, codenamed
Nabla. Any PlatypusDB query may register as *standing* and return a lease, whose
result then arrives as an incrementally maintained delta stream
([PLRN-010](/PLRN/010), §6). What the shelf will not sell is the second half:
resonance and optimal-transport similarity maintained incrementally under a
calibrated bound, so that a standing *fuzzy* query has a stated error rate
rather than a hope.

**9. Some answers to agent questions are about the shape of the whole.** Which
entities cluster, which is central, which is anomalous against the rest. These
are mostly not questions an agent asks directly as opposed to things it needs to
know anyway. They are questions WunderOS, hence PlatypusDB, has to answer on the
agent’s behalf in order to serve the ones it does ask, because a cheap dynamic
clustering is what lets retrieval decide where to look. The alternative is to
resolve a structural question by calling a frontier model, at a network hop and
a token bill and an answer nobody can check, once per question, in the hot path.
An unacceptably luxurious violation of frugality in our view.

This alone is a graph-analytics problem, and GraphBLAS, Stardog, and Neo4j GDS exist.

PlatypusDB runs it internally, as semiring kernels on its SIMD-powered systolic compute facility (codenamed Herzschlag) with Grafiklog as the graph-shaped surface over it (§9). A structural question becomes a masked matrix operation over memory that is already resident, which is the difference between a clustering that runs when retrieval needs it and one that runs nightly and is stale by morning.

Speculate, watch, compute over the shape: three things an agent does rather than three things it stores, and all three are the same substrate under different verbs. A branch is the store forked. A lease is a query held open over it. A semiring kernel is arithmetic across what it holds. Each is cheap because none of them is a separate system with a separate copy of the data, and in the assemblage all three are exactly separate copies, each with its own lag.

### 3.4 What enterprises demand

**10. Enterprises are pack rats, necessarily.** Nothing is deleted, because in a
regulated enterprise the thing you delete is surely the thing you will be asked
about, under threat of audit no less. So retraction in PlatypusDB is an event
rather than a mutation ([PLRN-007](/PLRN/007)): *a retracted fact carries the
ULID of the event that retracted it, its bytes are never touched again, and the
question “what did we believe on the 14th?” remains answerable on the 15th and
thereafter*.

This alone is a temporal-table problem, and temporal tables exist.

WunderOS never touches those bytes again, and that is the whole mechanism. The
retracted fact keeps its place in the log and its position in the Merkle chain,
so the state of belief on any past day is read rather than reconstructed. A
temporal table gives you the history of a row. This gives you the history of a
*claim*, which includes the claim that an earlier claim was wrong.

**11. Enterprises require agentic properties that only first-class
cryptography gives.** Tamper-evidence, non-repudiation, proof of who owned a
fact and who acted on it. Not a log of these things, which is a claim about
them, but the properties themselves, constructed rather than asserted
([PLRN-006](/PLRN/006), [PLRN-014](/PLRN/014)). Every bank of facts carries a
Merkle footer chained to its predecessor, every row carries the identity of the
principal accountable for it, and verification recomputes the chain rather than
consulting a table that says the chain was fine.

This alone is a ledger problem, and ledgers exist.

PlatypusDB constructs the properties instead of asserting them. Every bank carries a Merkle footer chained to its predecessor and every row carries the principal accountable for it, so verification recomputes the chain rather than consulting a table that reports the chain was fine. The distinction is the entire point: a ledger bolted to one store covers that store, and the agent’s answer came from all of them.

**12. There should be two clocks.** When a fact became true, and when the system
came to know it. An agent acts on the second and is judged on the first
(described in detail in [PLRN-018](/PLRN/018)).

This alone is a bitemporal problem, and there is a literature.

WunderOS keeps both clocks on every row, in the same envelope as the content hash and the accountable principal, agent or human. Late observations and corrections arrive as new events at their own observation time without disturbing the event time of what they correct, so the question an audit actually asks, which is what you knew at the moment you acted, is a read rather than an argument.

**13. You want to know how the agent got here, not just where here is.** Not the
state but the history of the state: what we believed before the correction,
which sequence of writes produced this configuration, what changed between the
run that worked and the run that did not, and whether two runs that claim to
agree have in fact arrived at the same place. Never lose a byte, and keep the
tree of how we got here.

Git taught a generation of engineers to expect this of their code and then nobody gave it to them for their data, so they bolt on git, or Dolt, or Noms, or they hand-roll event sourcing with a snapshot table on the side, and it becomes the fifth member of the assemblage, with its own clock, its own notion of a commit, and no relation whatever to the audit chain.

This alone is a versioned-store problem, and versioned stores exist.

PlatypusDB derives the version DAG from the log instead of keeping one beside it. It makes a commit the Merkle root of a tree of twigs over the ULID-ordered references that constitute a state, so two runs reaching the same state produce the same root, a diff skips every subtree whose hash matches, and a branch copies nothing (§4.6). Because it is derived, it is also droppable: lose the versioned-history and you rebuild it, which is not a sentence anybody can say about the git repository they bolted onto a database.

**14. Enterprises outlive their agents’ hosts.** A regulated institution’s
retention obligation is measured in years and its tolerance for losing a machine
is zero. The memory has to survive the host, and it has to survive it *per
agent*, because the unit an enterprise restores is not “the database” but one
tenant’s history, and restoring more than that is itself a compliance failure.

This alone is a backup problem, and S3 with a snapshot cron exists.

Kaltlager is the PlatypusDB answer, and it is the one mechanism in this note that is roadmap rather than built. As of publication, the ADR is ratified, and no code has landed. The design mirrors durable S3-resident artifacts off-host per agent, so that the recovery unit matches the isolation unit instead of cutting across it. What a snapshot cron cannot give back is the property that matters, since the bytes return but the chain proving they are the bytes that were written does not, unless the thing you mirrored was the chain. I note the gap here loudly rather than otherwise, because honesty is its own reward (§12.2).

### 3.5 Where that leaves us

Five demands, and they are the ones that turn a good store into a provable one. Retraction, the chain, the two clocks, and the version DAG are one discipline at four altitudes: never destroy, always attribute, and make the proof a recomputation rather than a claim. Durability at scale is that discipline carried past the host, which is why it cannot be satisfied by copying files. What has to survive is not the data but the evidence.

**Every one of these pressures has, considered in isolate, a separate answer but
the answers do not compose, which is the only reason we built PlatypusDB.**

Bitemporal retraction over a document store whose schema you cannot fix, indexed both crisply and fuzzily, holding images in the same algebra as the text, with association by adjacency and transfer by structure across all of it, forkable into speculative branches that leave nothing behind when abandoned, queryable on standing order with a calibrated bound on what the standing query misses, computable over as a whole without leaving the store, versioned so that every state has a name and a history, mirrored off-host per tenant, at agent write rates, under a cryptographic chain that has to cover every one of the above or it covers nothing: this is not a database plus five extensions.

The cryptographic chain is the clearest case. It cannot be bolted to one of the
four stores, because a chain that covers the relational rows and not the vectors
proves nothing about what the agent actually retrieved. It has to cover the log,
which means there has to *be* a log, one log, that everything else is a
redescription of. Once you have committed to that, you have committed to
building the database proper, because no existing database will consent to being
a redescription of somebody else’s log.

## 4. The hologram and the hash

I’ve alluded a few times to VSA and, even more obliquely, to some physical storage properties of PlatypusDB. The earliest, boring name of the database I’m describing here was “HHS”: hierarchical, holographic storage. Still true, but too dull to go on with. But it means what it says, and the sense is literal rather than metaphorical.

### 4.1 The Groove and three single-instruction operations

The fundamental atom of PlatypusDB storage is a `Groove`

: a 16,384-bit binary
hypervector, 2KB, aligned to 64 bytes so that it loads in a single machine
instruction. Every concept, every relation, and every fact in the system is
ultimately a Groove. (Why “groove”? Because of the [Mystic Writing
Pad](https://news.yale.edu/2024/02/09/fresh-impression-freuds-mystic-writing-pad).
No, really.) Three operations are defined on them, and each is a single
instruction on modern hardware.

*Binding*combines two Grooves into a third that resembles neither, and is how structure is represented.*Bundling*superposes many Grooves into one, by accumulating them and taking a majority vote bit by bit, and is how sets are represented.*Resonance*is Hamming distance, and is how similarity is measured.

Again, VSA is very cool stuff. The consequences of bundling are what the “HHS” part is about.

### 4.2 The Profile is a summary you can search

A fact in WunderOS is a Pentad, i.e., a 5-tuple: subject, predicate, object,
context, lineage ([PLRN-003](/PLRN/003)). The row that holds it carries a bundle
of those 5 slots VSA-superposed together. So the row already contains a summary
of itself, and a query Groove can be tested against that summary without the
query having to know which slot it might match.

31 rows are collected into a bank, and the bank carries a Profile Vector, which
is the bundle of the 31 rows’ bundles. The Profile has the property that makes
the whole design work: **a query resonates with the Profile if and only if it
resonates with at least one of the 31 facts inside, with high probability, the
false-positive rate bounded by the dimensionality of the vector, which is
massive, rather than by anything about the data.**

So the summary of a bank answers the question “could anything in here match?” in
a single Hamming distance (SIMD `_mm512_popcnt_epi64`

), without loading a single
fact. Sweeping a slab means one instruction per bank to produce a short list,
and the full scan of 31 facts runs only against banks the Profile has already
admitted. The summary is searchable. That is the entire trick, and everything
else in this section follows from it.

### 4.3 What the metaphor doesn’t claim and what it does

Now the honest statement of the metaphor, because the metaphor can be overclaimed and the overclaim is rather tempting, much like eating dessert first and then skipping right to drinks.

A hologram cut in half does not give you half an image. It gives you the whole image, degraded. What it loses is fidelity, not coverage. The Bank Profile has exactly this property. It cannot reconstruct any individual fact, and if you want a fact you must go and read it. What it can do is tell you whether something like your query is in there, over the whole contents of the bank, at once. It degrades in fidelity rather than in coverage, and that is why the name is accurate rather than ornamental.

But it holds within a level and not across the store. A row does not contain a
lossy image of the slab. The database is holographic at every level; *it is not
holographic across levels*. Alas this is a strictly weaker claim than the one
the name invites, but it is the true one. It’s also the more interesting one,
*because the weakness is what forces the hierarchy*.

### 4.4 Two graphs, neither of them privileged

As described, PlatypusDB maintains several projections at once without electing any of them to be the real one. Two of them are worth naming, because they differ in a way the theory predicts and the practice confirms. The system has more than one graph, which is the point rather than an embarrassment.

Erregung, the spreading-activation surface, constructs its graph *per query and
throws it away*. The adjacency is built at query time from the rows near the
anchors, bounded by the nearest clusters, propagated to a depth of three, and
discarded. It adds no persistent state at all. Its graph is not a thing the
database keeps; rather, it’s a description PlatypusDB can produce on demand.

Blätterwald, the exact-retrieval surface, *keeps its forest*, and its forest is
also a graph: LsmGraph, per-predicate log-structured merge trees, flushed to a
first level, compacted upward with vertex-aware merges and tombstones, published
through a manifest by CAS so that readers hold refcounted snapshots of a
consistent state.

Two graphs, two projections over one log, with opposite lifetimes. What
PlatypusDB lacks is not a graph but a *privileged* graph. The question that
decides the lifetime of a projection is not *what the data really is*, which is
not a question, except grammatically, but, as already stated, *whether the read
path it serves pays for its perpetual maintenance*. Spreading activation does
not, so its graph is ephemeral. Exact [Gleamalog](/PLRN/019) does, so its
forest is materialized. The lifetime of a description is an engineering
consequence of what reads it.

This is my entire argument against the agent assemblage, and it is worth landing
here rather than in the abstract. The amateur reaches for Neo4j because there is
a graph in the problem. But you do not need *a* graph. You need two, with
different lifetimes, projected over one log that keeps one clock, one lexicon,
and one provenance chain. Bought separately, they are two databases with two
clocks and two opinions about what a fact is, and you will reconcile those
opinions, forever, in Python. That’s just no way to live yr life.

### 4.5 A projection is cheap when content is its own name

Which raises the question of how any of this is affordable, and the answer is
the underlying mechanism. *A projection is cheap when it is keyed by the hash of
what it projects.* The anti-mirror architecture is not a free lunch that fell
out of good taste. It is paid for by BLAKE3.

Content-addressing runs through PlatypusDB at four altitudes.

- A symbol’s Groove is BLAKE3 of the symbol’s bytes, so
`(alice, parent, bob)`

names the same vector on every host and replay is deterministic rather than merely repeatable. - A row’s
`content_hash`

is BLAKE3 of its subject, predicate, object, and context, deliberately excluding lineage, so successive assertions of the same fact share a name and chain into revisions: supersession*is*content-addressing, since the identity of a fact is its content and its history is the sequence of writes that shared that identity. - A bank’s Merkle footer chains to its predecessor, so tamper-evidence is a recomputation rather than a table that says the chain was fine.
- And two other surfaces, the trace sidestore and the blob store, use
content-addressing
*as their durability model*in place of a write-ahead log, because a hash both verifies the bytes and makes replay idempotent, which is what a log is for.

The memory tiers themselves are not content-addressed. They use the mitosis-snapshot model, and it is worth saying so plainly, because content-addressing here is used exactly where replay-idempotence is worth more than write throughput and nowhere else. It is a choice, not a religion.

### 4.6 Even the agent’s history is a redescription

Versioned agent history (codenamed Astwerk) is where the choice answers pressure
#13 (“Agents cannot afford to keep looking.”). A commit is the Merkle root of a
tree of fixed-size twigs over the ULID-ordered set of references that
constitutes a state. Two runs that reach the same state produce the same root,
so state-equality is a hash comparison and deduplication is structural rather
than negotiated. A diff compares roots from the top down and skips any subtree
whose hash matches, without reading a leaf. A branch is `O(metadata)`

and copies
nothing. History is immortal by default, which is affordable only because
commits that share unchanged twigs share the stored nodes: a commit costs what
changed, not what exists. The design goal was to be Git-shaped, and not depend
on actual git.

Astwerk is itself a projection. It is derived, rebuildable from the log, and
droppable. Lose Astwerk and you rebuild it; lose the log and you have lost
everything. This is the doctrine of §2 arriving at its least comfortable case
and holding. **Even agentic history is a redescription.** In the assemblage, git
is a store, with its own clock and its own commits and no relation to the audit
chain. Here the version DAG is one more description of the one log, which is
precisely why it can be thrown away.

Rollback then has three altitudes that compose rather than compete: truncate the log, which is physical and total; append a retraction, which is logical, additive, and destroys nothing; or re-point a HEAD at a commit, which is structural and non-destructive. An assemblage keeps these in three different systems, if it has them at all.

### 4.7 Somewhere to be wrong

Astwerk versions and names the states an agent has been in. Gabelung is how an agent comes to be in a state it has not committed to.

An agent that plans needs somewhere to be wrong cheaply. It forks a copy-on-write view of the thick-fact substrate, reads through it as though it were the store, writes into it in isolation, and then either merges it back or drops it. The fork copies nothing at the moment it is taken, and pages diverge only where the branch writes, which is what makes forking several at once an ordinary move rather than a special occasion.

Isolation is the part that earns its keep. Two branches explored concurrently
cannot observe each other’s writes, so a comparison between them is a comparison
of two hypotheses rather than of two hypotheses plus whatever leaked between
them. That is, it’s important not only in WunderOS to *manage the bytes* but
also to manage isolation between *cognitive contexts*. Try doing that simply in
stock sqlite.

And an abandoned branch leaves nothing behind: no tombstone, no retraction event, no entry in the log, because nothing about it was ever in the log. This is the one place in PlatypusDB where forgetting is total and correct, again, a choice, not religion. The discipline everywhere else is that nothing is deleted, and the reason that discipline is not violated here is that a speculation was never a fact. WunderOS allows agents to be wrong safely.

Which completes the altitudes of §4.6. Truncate the log; append a retraction; re-point a HEAD; or abandon a branch that never reached one. The first three are things done to history. The fourth is what keeps a hypothesis out of history to begin with, and it is the one an assemblage cannot express at all, because four stores with four clocks have no shared notion of a write that has not happened yet.

## 5. Hierarchy is what you add when a hologram saturates

VSA superposition has bounded capacity, as does every physical system. This is
not an implementation limit; *it is what superposition is*. Bundle too many
vectors into one and the contribution of any single constituent falls below the
noise floor, and the summary stops answering the question it was built to
answer. A hologram of everything is a hologram of nothing.

So the fan-in has to be bounded, and the bound is where the design turns into arithmetic. The bank holds 31 facts, because 31 is conveniently \(2^5-1\), so the majority-vote threshold is exactly 16, so the binarized Profile is bit 4 of each accumulator slice and can be extracted with no arithmetic whatever. The number is chosen by the physics of superposition and paid for in free instructions.

Increasing 31 to 63 is under evaluation and would move the threshold to bit 5, at the same price.

Given a bounded hologram, hierarchy is the only way to get scale, and it is sufficient:

- Bundle 5 slots into a row.
- Bundle 31 into a Bank Profile.
- Cluster the Bank Profiles into partitions and keep the centroids, which are themselves bundles.

A search descends the levels, refining fidelity as it goes, and the same
operation runs at every level, because the same operation is all there is. You
get scale out of a bounded-capacity hologram by stacking bounded-capacity
holograms. That is the self-similar tree of [PLRN-012](/PLRN/012), instantiated
in PlatypusDB storage rather than in control.

So *hierarchical* and *holographic* are not two properties of PlatypusDB
database that happen to sit next to each other because they ornament it. They
are one property and the precondition that forces it.

Four levels, of which three are levels of summary, since the atom summarizes
nothing. And here the word “hierarchical” finds its second sense, which is a
consequence of the first rather than a pun on it: *the levels of summary are
also levels of containment, and every one of them lands on an alignment
boundary*.

That is not two facts about the store. It is one fact, and the picture is the argument.

**In PlatypusDB, the semantic hierarchy and the physical hierarchy are the same
hierarchy.**

This is the argument of §2 cashed at the level of bytes. When the structure of
the summaries and the structure of the pages are the same structure, *a summary
sweep is a scan of cache-resident memory and a durable write is a page-aligned
append*. Neither pays for the other. Or you can play Frankenstein’s database
game and bolt four stores together and every level of summary you want costs you
a serialization and a hop.

“Hierarchical” also carries a third sense, which is the one people usually expect it to carry, and which I have left until last because it is the least interesting of the three: the agentic memory tiers.

Working, episodic, procedural, semantic, institutional, and the substrate’s description of itself, with compliance running across all of them as an aspect rather than sitting in one of them as a tier. They differ in scope, in lifetime, and in what makes a thing in them true.

The last of these (self-describing substrate) is the database describing its own schema. The physics predicates are queryable facts, re-etched each boot; tenant predicates register at runtime through the Lexicon and are queryable the moment they exist. An agent asks what predicates it knows through the same path it asks anything else. That is, while I don’t want to attack text-to-query-language problem, part of why that’s a hard problem is implicit schemas and murky schema semantics: not mistakes that PlatypusDB is willing to make.

One of them is worth stating because it is the anti-mirror discipline applied to the agent itself. Working memory is a materialized view, not a tier of storage. It is recomputed from the episodic chain at the start of a session and updated incrementally within it. Episodic is the source of truth. If working memory is corrupted, that is cache invalidation and not data loss. Even the agent’s own live picture of what it knows is a projection, and the projection is disposable.

There is one more family of structures, which references into the hierarchy rather than sitting inside it, and which I mention here only and describe in full in a future research note.

When the unit of meaning will not fit in a single Groove, because it is a
paragraph, or a scene with many participants, or a standing query pattern
waiting to be matched, it is held as a `WaxCloud`

: *a weighted point cloud of 32
Grooves*, compared to other clouds by Optimal Transport rather than by Hamming
distance. `WaxGraph`

, `WaxScene`

, and `SceneProfile`

are its siblings, sharing a
self-describing header whose kind byte selects the shape of the body. They are
orthogonal to the hierarchy of this section, so will appear later in a future
research note.

## 6. Two ways of remembering from the same bytes

The two kinds of recall in §3 are served by two read paths, and the paths are explicitly disjoint.

The fuzzy path is agentic recall: resonance against profiles and rows, spreading activation through Erregung, and a late fusion that combines the ranked results of several independent surfaces without any of them having to agree in advance. This is remembering badly and arriving anyway.

The crisp path is exact retrieval under Gleamalog ([PLRN-019](/PLRN/019)),
navigating by fingerprint index through the per-predicate forest. It reads no
vectors at all. A missing fingerprint is a dead end, and a dead end is the
correct answer rather than a noise-recovery problem to be solved. If you know
what you are looking for, then approximation is not a service.

What makes this one database rather than two is that both paths read the same
bytes. A row is 4 KB. 2048 of those bytes are the superposed bundle,
which is the fuzzy organ. 48 of them are relational fingerprint columns, which
are the crisp organ. The rest is the identity envelope: the ULIDs, the content
hash, the Merkle anchor, the accountable principal, the retraction and
retirement memos, the world-time instant. One page. One store. Both kinds of
remembering, and the same provenance chain over both, *which is the thing the
assemblage cannot offer at any price*.

The same two paths serve pixels. An image arrives as a first-class slot filler
rather than as an attachment: preprocessed, hashed for exact identity, embedded,
and bundled into a row with the same shape as every other row. The crisp path
finds an image by fingerprint, exactly, the way it finds a fact. The fuzzy path
finds it by resonance against a text query, because query and image resolve into
one algebra before either is compared, and late fusion combines what the
surfaces return without requiring them to agree in advance about which modality
answered. *Native* means there is no second store to keep in step, and so no
second clock, and no seam at which the two could come to disagree about what was
captured.

Both paths can also be held open. A query registered as *standing* returns a
lease instead of an answer, and its result arrives afterward as deltas
maintained incrementally as the log grows. Standing is an orthogonal modifier
rather than a third path: anything either path can express, a lease can express,
because the lease reuses the same planner and the same per-clause dispatch.

The half with no counterpart on the shelf is the fuzzy one, resonance and optimal-transport similarity as incremental circuit operators, under a conformal bound that turns a standing approximate query into one carrying a calibrated recall guarantee. An agent watching for something it can only describe vaguely gets told when it appears, and gets told how often that promise will fail it.

One operation here is not remembering at all, and the difference is worth marking rather than leaving to be inferred. Analogy is transfer: given a case and a correspondence, produce the term that completes it. Mechanically it is binding and unbinding in the algebra the two read paths already use, sampled repeatedly and scored, so it costs about what the rest of the substrate costs, i.e., not very much.

Semantically it is a different act. Retrieval returns something that was stored.
Analogy returns something that was not. That is why it returns a confidence, and
why the confidence composes into the provenance layer as a semiring instead of
being reported next to it: *an answer nobody stored has to arrive saying so*.

The alignment discipline of §5 recurs in the forest without having been designed
twice. Its blocks are 8 KB, and its tables are laid out so that a block maps to
one or two device sectors exactly. The same idea as a 4 KB row on one `O_DIRECT`

page, arrived at a second time because the constraint that produced it the first
time has not changed.

## 7. Inspiration where we found it

The spirit of PlatypusDB as a database is, as far as I’ve been able to make it, “what would happen if we built something TigerBeetley for enterprise agents instead of ledgers?” A note that argues against assembling other people’s databases into a new one ought to be candid about whose discipline it borrowed. Everything is sized. Memory is never heap-allocated on the hot path. The failure modes are enumerated in a table, with a detection and a recovery for each, which is the difference between a system whose failures you have thought about and a system whose failures you will meet at the most inopportune time.

## 8. Why WunderOS is deterministic and to whom it matters most

The borrowed discipline that matters most is the one that turns every claim in
§3 from an assertion into something an auditor can check. A fact is retained
*under threat of audit*, and the threat is not only answered by keeping the
bytes. Bytes prove that something is stored, not that the answer the system gave
is the answer its stored state entails. **What answers the threat of audit is
that the whole system, including its embedded database, replays
deterministically**: the same log prefix yields the same authoritative state and
the same account of how a query reached its result, so “what did we believe on
the 14th, and why did we believe it” is recomputed rather than testified to.

**Determinism is not a feature beside the others**. It is the warrant under all
fourteen. Bitemporal retraction is worth having only if replaying to a past
instant lands on the same state twice. The Merkle chain proves the bytes were
not altered; determinism proves the bytes, replayed, produce the answer that was
given. Provenance is just a story until the derivation that produced it runs
again and produces it again; then it’s a *proof of fidelity to what really
happened*. Then you can just check it instead of trusting some nice words on a
web site. Every audit-facing property in §3.4 is a claim about the past that has
to survive recomputation in the present, including re-recomputation in any
arbitrary future. Recomputation is proof only if it is deterministic.

That determinism is not just asserted either. It is fuzzed.

WunderOS contains exactly a VOPR in the TigerBeetle sense: **a simulator that
drives the data plane under a seeded, replayable schedule, injecting the faults
a real machine inflicts, including clock drift, torn writes, a crash at each
durability boundary, storage faults at each I/O point, and checking a registry
of invariants at every tick.** A failing seed reproduces the failure exactly,
because the seed *is* the schedule. The corpus of known-bad seeds replays on
every change to the data plane, and a regression on any one of them fails the
build; nightly, the seed budget widens and its origin rotates, so the harness
explores schedules this month it did not explore last. Crash recovery is checked
backend-symmetrically: the same invariants must hold on real `io_uring`

and on
the deterministic storage simulator, and two runs of the same seed and
crash-point must produce bit-identical durable bytes.

The honest edge: the invariant set is not yet complete. Some checks are full-strength: a mitosis write is atomic or it is caught, the version DAG’s adjacency is verified structurally. But some are still happy-path stubs with their full versions filed and pending. The simulator does not model every concurrency semantic of the real kernel, and the scenarios that depend on those run against the real backend rather than pretend the simulator covers them. The claim is not that the fuzzer has proved the database correct. It is that the database and indeed the whole system was built to be deterministically replayable, that the determinism is itself under adversarial test, and that the gaps in that test are enumerated rather than hidden. That’s the same posture §12 takes toward everything else.

## 9. Gleam, Zig, and no server

PlatypusDB is, true to its eponym, a viciously hybrid thing and it’s hybrid in one last sense, which is that it is written in two languages, and the seam between them is governed by a rule rather than by taste.

The control plane (“the server”) is Gleam on the BEAM and OTP: supervision,
actors, lifecycles, and the algorithms. The data plane is a Zig side-car:
layout, SIMD, `io_uring`

, transport, and, on the roadmap, DPDK on a DPU. The
rule is that Zig owns storage and transport and Gleam owns the algorithm, and it
is enforced rather than encouraged.

The trace substrate is an indicative worked example. Zig holds a per-tenant lock-free ring and three functions that push, drain, and report a position, and it holds no policy at all. Gleam holds the routing, the tracer processes, the watchdog, the supervision tree, and the soundness harness. When the rule is followed, each language is doing the thing it is good at, and when it is broken you get physics in the control plane or policy in the hot path, and both are visible immediately.

PlatypusDB’s Systolic Compute Engine (Herzschlag) is a second worked example and the harder one, because what gets split is a computation rather than a buffer. It is the “square-shaped compute” engine: bulk-synchronous epochs, tile ownership, semiring kernels running in Zig where the arithmetic belongs, with Gleam holding the epoch boundaries, the tile assignment, and a conformance harness that checks the fast backend against a reference implementation it can afford to let be slow. Grafiklog is a compute surface over Herzschlag, graph analytics in GraphBLAS’s conceptual vocabulary—that is, matrix-shaped data, semirings, masked operation, transitive closure—without inheriting that C API’s habit of passing descriptors and accumulators as out-parameters.

This belongs in a note about a database rather than one about compute because the analytics never leave. A clustering that decides where retrieval should look is computed over resident memory, in the same process, inside the same epoch, and it is available to the next query rather than to the next batch window. Ship the graph out to a compute engine instead and you have bought a fifth member of the assemblage, with its own copy of the data and its own opinion about how stale that copy may be.

In PlatypusDB, there is no separate database process per se. That database is embedded directly in WunderOS, because the operating system is the process, and a control plane that has to cross a socket in order to remember something is not as low-latent as it could be.

*This is the one architectural decision in the note that would be obviously
wrong for a general-purpose database and is obviously right for this one, which
is as good an illustration as any of what “fit” means in §1*.

It is also the one place where this note’s claim narrows. Everywhere else
PlatypusDB is *agent-native*, which is a claim about shape: the system is shaped
to fit the specific problems agents pose. Here it is *WunderOS-native*, which is
a claim about a seam: the database is inside the process rather than across a
socket from it. The first claim would survive being wrong about the second.

## 10. Gartenhaus: somebody else’s truth

One WunderOS service reaches outward from the embedded database. WunderOS
uniquely has an institutional memory tier, that is, enterprise agents
exist in an institutional setting, and institutions know things, which its
agents, too, need to know. Codename Gartenhaus, it’s the institutional memory
tier: *a VSA-native materialized view over the customer’s own system of record,
that is, over a Databricks Lakehouse, Snowflake, ServiceNow, Salesforce, etc.*
It’s VSA-native precisely because I didn’t want to invest in teaching agents to
write SQL; life is too short for text-to-SQL as a side quest.

But Agentic AI can’t be allowed to fail because we didn’t sort out the data silo
problem. Its status is the interesting part. Institutional memory is
authoritative to *believe* rather than authoritative to *persist*. Neither
PlatypusDB nor WunderOS owns those facts, cannot vouch for them, and have no
business pretending to. PlatypusDB holds (yep, you guessed it) a rebuildable
projection of somebody else’s truth and marks it as such (then makes that view
available to agents by direct injection into their context window), which is the
correct relation to have to a database you do not own, and which an assemblage
has no vocabulary to express.

Operational details of Institutional Memory, Compliance Memory, and Social Memory (how WunderOS does agentic sociality) tiers will appear in future research notes.

## 11. What we ship so that agentic developers don’t have to

The 14 pressures of §3 are about the shape of PlatypusDB, that is, the environmental pressures that shaped it so distinctly. There is a second, humbler category I describe here briefly: scaffolding a team building agentic apps would build by hand, on top of a harness or agentic OS like WunderOS, before agents can safely use it.

A multi-agent workflow say, aninvoice reconciliation, a support escalation, a compliance review) is a dossier or a case file filled out by several hands over time. On a bare store that dossier is a convention: agents pass strings to one another, or hand-roll context-scoped query patterns, and the shape of the case lives in nobody’s schema and everybody’s memory. Sounds like chaos to me.

WunderOS Fallakte makes the dossier a first-class, entirely optional, object of
the system. A case file is opened against a versioned case-type with a sealed
set of typed slots; a write to a slot outside the schema is rejected at write
time; each slot validates against its declared cardinality and its own checks;
and the case carries a lifecycle state machine, so `open → in-review → resolved`

is enforced rather than hoped for, and `close`

is terminal.

The question “what slots were filled in this case, by whom, when, in what order” becomes a query rather than archaeology across the substrate. You get it without the workflow layer having invented a private schema language the database cannot see.

This is not a pressure that forced the database into being. It is the tax an assemblage still owes after it is assembled, and paying it once, inside the database, is cheaper than making every workflow pay it in glue.

## 12. What this does not do and who should not want it

A note like this one belongs to a genre with bad habits, and the worst of them is that the limitations arrive as a modest paragraph at the end, after reams of capability, phrased so that each one sounds like a roadmap item rather than a thing that is missing. What follows is more than that: what we don’t yet do and haven’t yet proved.

### 12.1 The laptop case conceded

There is a good argument going around that SQLite is enough for local agent memory, and for the case it describes it is entirely correct. One process coordinating a few agents, reading often and writing less so, offline, in WAL mode, with the whole memory in a file you can copy, and crucially never under credible threat of audit. That workload does not want a database like this one.

The network latency you avoid by not having a server is real latency, actually avoided. Nothing in §3 contradicts any of it, and §1 conceded the general form of the point already, which is that almost every project should take the store that already exists.

So the honest statement is not that using SQLite is wrong. It is that “agent
memory” names two problems that happen to share a phrase. One of them is a file.
The other is an evidentiary record, written concurrently by many agents, read
adversarially by an auditor, answering questions in a vocabulary nobody fixed in
advance. *If your problem is the first one, this note is not an argument against
your file*, and building what we built in order to solve it would be a plain
mistake.

### 12.2 What is not built

Kaltlager, as §3.4, #14, says at length: PlatypusDB is durable on its host and not yet durable off it, that is, the S3 object-storage storage tier is unimplemented. Its design is ratified and binding but no code has landed, so every claim in this note about surviving the host machine is, as of publication time, a claim about a design.

Another gap should be noted, too. WaxCloud, the weighted point cloud of §5, ships, and clouds are compared by optimal transport today, which means PlatypusDB also has m-tree indexes. But the certified distance that was meant to sit underneath that comparison is dormant behind a disabled flag. So cloud similarity is currently the provisional entropic embedding rather than the certified bound the design calls for, and any statement about cloud-comparison quality should be read as resting on the former. This, too, is a matter of time and sorting out a cloud-friendly Matlab compute-place.

### 12.3 What is not proved

Cross-modal retrieval quality is an honest soft spot, and it is soft-gated intentionally. The claim that a text query recalls the right image at useful rates rests on CLIP-family behavior that we have committed to further stress-testing before treating as settled. If that experiment fails, the capture and storage decisions of §6 survive and the retrieval-quality claim does not, at least not without someone having another good idea. I would rather name the experiment than describe the feature as though the experiment had already returned.

The theory under the analogy engine is directional rather than settled. Its own
design document marks the structural correspondences it rests on as design
intuitions rather than theorems, which is the correct marking and worth
repeating here. The engine’s confidence is calibrated against measured outcomes
on a disjoint test split, which is a real guarantee and a narrow one:
calibration tells you the confidence is honest. *It does not tell you the
mechanism is the right one.* That work remains after encountering real tenant
data, that is, WunderOS design partners phase.

## 13. Why there are so few new agentic databases

The requirement cluster is new. It is three years old at the outside. Most good databases are 20 to 50 years old, and the best of them were designed in a world where a fact was something a person typed, at human speed, into a form somebody had designed in advance, on the assumption that the set of things worth recording was known before the recording began. Every one of those assumptions is now false. They were not incidental assumptions.

The industry’s response to new requirements has been to assemble old databases and write glue code, and that response is not stupid. It is the correct response if you believe the new requirement cluster is primarily a variation on an old one. Most new requirements are.

The mistake is not the assembling. The mistake is the belief about the new requirements.

Building a mature, general-purpose database system is, at best, a 5-year job that most teams are right to decline, for three reasons:

- most teams have a problem that an existing database fits,
- the teams that do not have such a problem usually discover this too late to do anything about it, and
- because a team that builds its own store and is wrong about needing to has destroyed itself for nothing.

I want to be clear that the decline is usually correct. I did not decline. The alternative was to ship a shape that does not fit the problem and then call the misfit a roadmap.

## 14. The dividends of fit

Fit has a dividend, and it is worth one concrete instance, because the argument has otherwise been about what fit costs.

WunderOS UX has an operator’s time-travel debugger, which we call Lightstand, that scrubs a running agent’s execution backward and forward, inspects what it believed at any past instant, intervenes, or branches its history and runs the alternative.

A debugger like that over a live agentic workload is normally a large program with a data model of its own: it has to capture execution history, index it by time, keep it consistent with the state it describes, and reconstruct any past moment on demand.

Built on PlatypusDB it needed none of that, because the database already is that data model. The attributed history is the log. The past instant is an as-of read, a coordinate the whole system exposes rather than a trick Lightstand plays. Branching the history is a copy-on-write fork. Replaying it is deterministic by construction.

What was left to build was the scrubber UX and the screens, about three days work, because the hard three-quarters had been paid for once, at the bottom, and every surface over the database draws on the same account. That is what §1 meant by fit, stated as a delivery date instead of a principle.

None of this amounts to a claim that the old stores are bad, or that the people who use them are foolish, or that we have found the way the data really is and they have not. There is no way the data really is. The old vocabulary was built for other purposes and it was very good for them, and it remains very good for them, and on the day our problem stops being unusual it will be good for our problem, too, and that day may come.

Until then, what we need is a different tool.

The proper analogy is with the invention of new tools to take the place of old tools.

— Richard Rorty,

The Contingency of Language(1986)

The claim of this note is smaller than it sounds and the work is harder than it looks, and I would rather state it that way round than the other way.

## 15. Related notes

The hypervector substrate, its algebra, and the approximate-match semantics that
the fuzzy path depends on, are [PLRN-001](/PLRN/001). The Pentad, and the case for
representing a fact in 5 slots rather than three, is
[PLRN-003](/PLRN/003). Provenance constructed rather than observed is
[PLRN-006](/PLRN/006), and the sealed identity and earned capability that make the
accountable-principal column mean something are
[PLRN-014](/PLRN/014). Append-only with retraction, which is why a fact’s bytes are
never touched after they are written, is [PLRN-007](/PLRN/007). The self-similar
tree of §5 is [PLRN-012](/PLRN/012), and this note is its instantiation in
storage. Why the schema cannot be fixed in advance is
[PLRN-015](/PLRN/015). The social tier, and what it means to remember who said
what, is [PLRN-017](/PLRN/017), and the perspectival account of truth that it rests
on is [PLRN-013](/PLRN/013). The two clocks are
[PLRN-018](/PLRN/018). The crisp read path and its semantics are
[PLRN-019](/PLRN/019). Standing queries, the lease abstraction, and the
incremental evaluation that the fuzzy half of §3.3 leans on are
[PLRN-010](/PLRN/010).

The engineering discipline of §7, and in particular the doctrine that a system’s failure modes should be enumerated before they are encountered, is TigerBeetle’s. Spreading activation over an episodic-semantic memory graph follows SYNAPSE, read against REMem’s per-category evaluation, which disagrees with it about where the gains are. Binary spatter codes and the capacity limits of superposition are Pentti Kanerva’s. The log-structured merge tree is O’Neil, Cheng, Gawlick, and O’Neil (1996), and the tombstone-and-reclamation discipline in the forest’s compaction follows Lethe.

## A note on method

Written in conversation with Claude Opus 4.8 (Anthropic) as structured
interlocutor. The motives, ideas, claims, framing, architectural commitments and
*taste*, or lack thereof, are mine.

Kendall Clark · k@pentad.ai

Great Falls, Virginia

20 July 2026
