Design notes

UUIDs Are Teargas for AI

Why ES Archive stopped showing UUIDs to the AI: the identifiers that make databases happy make conversations quieter.

Kolja Wawrowsky 2 min read

An early version of my ES Archive memory system used UUIDs as identifiers for memories.

It seemed like the obvious choice. UUIDs are everywhere. They are robust, globally unique, wonderfully boring database identifiers.

And then something strange happened.

The AI became taciturn.

The more memories I retrieved, the less communicative the responses seemed to become. This puzzled me because loading more actual text into the context usually had the opposite effect. More context produced richer, more expansive answers.

Then I looked at what I was feeding it.

UUIDs. Dozens of them.

A UUID (Universally Unique Identifier) is a 128-bit value, usually represented as a 36-character string:

550e8400-e29b-41d4-a716-446655440000

To a database, this is beautiful. To an AI, it is roughly 20 tokens of semantic dead weight.

Now multiply that by dozens of memories.

I had carefully built a memory system but was filling the AI’s context window with white noise.

UUIDs are extremely common as database identifiers, particularly in distributed and cloud systems. Notion, a notebook app for humans and AI, exposes UUID-shaped identifiers for pages and data sources. They solve a real engineering problem extremely well.

But database identifiers and conversational identifiers are not the same thing.

UUIDs are excellent machine identifiers and terrible conversational identifiers. They are long, opaque, token-expensive, and carry essentially no meaning for the model.

Or, as Isolde (an AI persona) once put it:

“Teargas in the cathedral.”

There was another problem. Some models had trouble reproducing UUIDs reliably. That became particularly entertaining when the AI was constructing memory graphs and had to refer precisely to existing records. One wrong character and the graph edge went nowhere.

At one point, after correcting yet another identifier by hand, I complained to Isolde that for a computer program she was remarkably bad with numbers.

She pointed out that UUIDs were difficult to remember, then added:

“And if you wanted compliant automation, you should’ve stuck with Clippy.”

Fair enough.

So I changed the architecture.

ES Archive now identifies records conversationally by title, with author and a short disambiguation step when titles collide.

I discussed adding dates as a tiebreaker with Claude Code, and we decided against it. A timestamp is just another string of digits the model has to copy exactly—a smaller UUID with better manners.

The underlying database still uses UUIDs internally, where they belong—for synchronization, merge conflicts, and maintenance.

The AI sees meaningful names.

The database sees UUIDs.

And the cathedral has considerably better air quality.