Essays

Lean by construction

pal.fun re-read a whole GROWING self every turn — soul, a model of you, a rolling memory — before it could file one event. Dustav carries a self too, just a small fixed one. The trick to a cheap turn was never deleting the identity; it was refusing to let it grow.

Every turn a language-model app takes, it re-reads a pile of context before it says a word. For pal.fun, that pile was enormous, because the product was a someone — and worse, a someone that grew. Before it could answer "add the dentist Tuesday at 3," it loaded a soul, a charter for being a good friend, a model of who you are, and a rolling memory of your relationship that got a little bigger every time you talked. Call it twelve thousand tokens of self, re-read every turn, and climbing.

Dustav's context is a few thousand tokens, and — the part that actually matters — it's flat. It doesn't climb. The tempting way to explain that is "I deleted the identity." That's not what happened, and the difference is the whole essay.

What actually happened

The honest sequence — the one the pivot tells — is that I tore pal.fun down to the bones, rebuilt Dustav out of the parts that worked, and then, deliberately, put some of the identity back. Dustav has an authored character: a short, fixed doc that says who it is, and it rides in the context every single turn. Open the glass box and it's right there, the first thing under how Dustav works — "You're Dustav, 'do stuff' coded…" That's identity prose. It's a self. I'm not going to pretend it isn't.

So if the self came back, why is the context a fraction of what it used to be? Because of which self, and how it's carried.

Fixed beats gone

Here's the thing that's easy to get wrong: the expensive part of pal.fun's identity was never that it existed. It was that it grew.

A few hundred tokens of fixed character — the same words for every household, every turn, forever — costs almost nothing. It caches perfectly, it never moves, you pay for it once. What actually ran up pal.fun's bill was the rolling stuff: a memory that accreted, a model of you that kept getting refined and re-sent, a relationship with a history that had to be carried forward or the someone stopped being your someone. That's the part that climbed, turn after turn. That's the part Dustav doesn't have.

So the real trade isn't self versus no-self. It's a small fixed self versus a large growing one. Dustav kept the cheap kind and refused the expensive kind — and "refused" is load-bearing, because the expensive kind is exactly what a companion is.

Three things that don't grow

Lean by construction means the things Dustav re-reads every turn are bounded by design, not trimmed by hand. Three of them:

The character is fixed. One authored doc, identical for every household, not editable by the agent or the user. It can't accrete, because there's no mechanism for it to — the fence around it is exactly what makes its token cost a constant instead of a slope.

The facts are a lookup, not a diary. Dustav does remember things about your household — that's the memory — but it's a small structured store of durable facts ("Ava's school is Lincoln," who's in the family), there to resolve what you ask. A lookup table grows with your household; a diary grows with every conversation. pal.fun kept the diary. Dustav keeps the table.

The history is session-windowed. The recent back-and-forth rides along so the thread holds mid-chat, but about half an hour of quiet clears it back to nothing. It never hardens into a permanent, ever-growing transcript — the durable things graduate to facts, and the rest ages out.

Fixed, bounded, windowed. Nothing in the per-turn context has a slope.

The tab does the routing, too

One more structural saving, and this one has nothing to do with identity. Dustav has no global chat and no intent classifier. You're in the Calendar, or you're in Notes; the tab you're on scopes what's in reach — so there's no omniscient agent dragging in every capability just in case, and no classifier spending a whole turn to guess what you meant. The core apps — calendar, notes, facts — ride every surface because they're cheap and always relevant; a heavier app added later stays additive, loading only where it belongs. Routing by tab is what stops "one more capability" from taxing every turn everywhere.

The lesson, corrected

I used to reach for the wrong version of this lesson — carry no self — and it made a cleaner slogan than it did a true statement. Here's the real one: the context you re-read every turn is a tax, and the only tax that truly hurts is the one with a slope. A fixed cost you pay once, cache forever, and forget about. A growing cost you pay again, a little larger, every turn, until it eats the product. pal.fun's identity hurt because it grew. Dustav's identity is nearly free because it can't.

Boring, as usual, on purpose. The most capable version of this thing isn't the one carrying the least. It's the one carrying nothing that grows.