1
0 Comments

We Almost Shipped a Bad Memory Expiry System (Fixed TTLs Don't Work)

Early design question for Lumi: how long should a saved memory stay "active" before it's considered stale?

The obvious answer is a fixed expiry, memories older than X days get deprioritized or dropped. Simple to build, simple to explain. Almost shipped exactly this.

Problem: some facts should never expire (someone's writing style, a core project constraint) and some should expire fast (a temporary blocker, a decision that got reversed two days later). A flat TTL is wrong for roughly half of what people actually store, just in opposite directions.

What we moved to instead: memories carry a status, not just an age. Active, superseded, or explicitly time-bound, set at save time or updated later, rather than inferred purely from a clock. Retrieval weighs relevance and status together instead of just recency.

The harder unsolved piece: detecting when something's implicitly superseded, the user made a new decision that contradicts an old one but never explicitly said "forget the old one." Right now that mostly needs an explicit update. Automatically inferring supersession without false-positiving on things that are still true is the part I don't have a clean answer for yet.

Anyone else building memory/retrieval systems solved this well? Genuinely stuck on the implicit-contradiction detection part.

on August 27, 2026