Build log · April 2026 · Jarvis
Why Jarvis forgets on purpose.
The decay function I'm using to expire long-term memory, and what broke the first three times I tried it.
The first version of Jarvis remembered everything. Every email I'd asked it to summarise, every commitment I'd made out loud on a call, every passing thought I'd dictated into the iOS share sheet at midnight. It was, on paper, the kind of memory I thought I wanted. In practice it was a hoarder's basement: nothing was ever lost, and as a result nothing could be found.
The second version forgot too aggressively. I'd built a hard 30-day cutoff, the assumption being that anything older than a month was probably stale. It turned out I'd casually deleted the context I needed most: the slow-burning commitments, the running notes on a project I checked in on every six weeks, the half-formed essay I'd been chewing on since February.
The third version had a manual "pin" button, and I never pressed it. Of course I didn't. The whole point of an AI chief-of-staff is to not have to do its filing for it.
§ 01The shape of the function
Decay, but weighted by how often I come back.
The version I'm running now treats every memory as having a half-life, and modifies that half-life every time the memory gets touched. A note I haven't looked at in six weeks decays toward the floor. A note I revisited yesterday gets its clock reset. The retrieval pipeline reads decay as a soft signal; older memories aren't deleted, they're just less likely to surface unprompted.
The exact curve doesn't matter much; what matters is that access is the input, not creation date. Things I keep coming back to are, by definition, things I should keep coming back to. The system gets to learn that without me having to tell it.
The interesting question, it turns out, isn't what to remember. It's what to allow yourself to lose.
§ 02What I broke along the way
Three failure modes worth recording.
Failure one: the cliff. My first decay function was effectively a step. Memories were "live" until they crossed a threshold, then they fell off. Retrieval got jumpy: a memory I'd seen yesterday would vanish overnight. Smoothing the curve fixed that.
Failure two: the eternal Slack thread. I'd indexed messages from a noisy channel and they kept refreshing their own decay clocks because the channel itself was busy. The fix was to weight access by intent: a deliberate retrieval counts; an incidental scroll-by doesn't.
Failure three: the silent prune. I had no logging on what was decaying out of reach. When I noticed a memory missing, I had no way to recover it. Now there's a "graveyard" view: read-only, never used, but a comfort to know it exists.
The system is small. Maybe forty lines of Python around a SQLite table. The interesting part isn't the code, it's the disposition: the willingness to let the assistant forget things, and to trust that the things worth keeping will surface again because I'll reach for them again. That's been the whole arc of this project, really. Every rewrite has been about giving it less to do.