
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.