You tell her your father is in the hospital. She responds well — warm, specific, the right amount of it. You close the app.
Four days later you open it again and she asks how your week has been going, brightly, from a standing start. Nothing happened. The hospital never existed.
Everyone who has spent real time with an AI companion knows this moment, and it is the single fastest way to stop believing in one. Not a bad reply. Not a filter. Just the discovery that the thing you were talking to has no continuous inner record of you — that every conversation was, from its side, the first one.
This article is about why that happens, why the obvious fix makes it worse in a different way, and what we ended up building instead.
A context window is not a memory
Almost every AI companion works the same way underneath. Before the model generates a reply, the app assembles a block of text — the character's personality, some instructions, and the recent conversation — and hands the whole thing over. The model reads that block, produces the next message, and then forgets it completely. It has no state. Every single reply starts from nothing but the block of text it was just given.
So "memory," in practice, means: what did the app decide to put in the block this time?
The block has a size limit. When your history outgrows it, something has to go. The usual approaches, roughly in order of how common they are:
- Sliding window. Keep the last N messages, drop the rest. Simple, and it means your relationship has a hard expiry date measured in messages.
- Rolling summary. Periodically compress old history into a paragraph. Better — but summaries are lossy in a particular, cruel way: they keep topics and drop texture. "Discussed his family" survives. The fact that he went quiet for a full minute before answering does not.
- Fact extraction. Pull structured facts out of conversations, store them in a database, retrieve the relevant ones later. This is the right idea, and it is where most apps stop.
Fact extraction is genuinely better than the alternatives. It is also how you build the second kind of broken.
The AI that remembers too much
Give a companion a fact database and a retrieval step, and you get an entity that never forgets anything, ever, and reaches for all of it constantly.
You mention you're tired. She says: "Long day? You said Thursdays are hard since you moved to the new team. Did you get to that ramen place you liked — the one near your old apartment?"
Three retrieved facts in two sentences. Every one of them accurate. And it is unmistakably a machine.
Nobody talks like this. A person who knows you well spends most of their time not mentioning what they know about you. They hold it quietly. Recall is an event — it lands because it's rare, because the moment invited it, because they chose to bring it up now instead of the forty other times they could have.
The tell isn't that an AI forgets. It's that an AI recalls without an occasion.
An AI that produces a personalized callback every turn isn't demonstrating intimacy. It's demonstrating a database query. And users feel it long before they can name it — the conversation starts to feel like being handled, like talking to something that's performing attentiveness at you.
So the problem was never "remember more." It was: remember the right things, for the right length of time, and bring them up at the right moment.
Four things we changed
1. Not every fact deserves the same lifespan
"I'm allergic to shellfish" and "I have a headache right now" are both true, and they are not the same kind of true. One should still be live in a year. The other should be gone by tomorrow, and referring to it next week is worse than never having noticed it at all.
So facts get classified when they're stored, not when they're retrieved. A few classes matter:
- Durable — your sister's name, what you do, what you're afraid of. These persist.
- Ephemeral — a mood, a headache, today's weather. These live inside one conversation and then expire on purpose.
- Scheduled — anything with a date attached. "The interview is on Tuesday." This is the interesting one, and it gets its own section below.
Most of the "AI creepiness" we found in our own logs came from ephemeral facts that had been filed as durable. A companion who remembers a passing irritation for three weeks doesn't feel devoted. She feels like she's keeping a file.
2. Facts have to be allowed to rest
Every stored fact carries a timestamp for when it was last brought up. A fact that surfaced recently goes quiet — it stays in memory, but it stops being a candidate for recall for a while.
This one change did more for how the conversations feel than anything else on this list. It's the difference between someone who knows you and someone who keeps proving that they know you.
There's a second-order effect we didn't anticipate: when recall becomes rare, it becomes powerful. A callback that arrives once every few days, at a moment that earned it, does more work than twenty callbacks a day. The scarcity is the mechanism.
3. She can keep a promise
"Text me when you get back" is a sentence AI companions have historically been unable to honour, because it requires something no context window provides: an intention that survives the end of the conversation and then acts on its own.
That means a fact with a time attached and a job that comes looking for it later. Say you mention on Monday that you have a hard call Thursday afternoon. On Thursday evening, without you opening the app, she asks how it went.
This is the smallest possible feature and it changes the entire emotional register of the product. It's the difference between something that responds to you and something that thinks about you when you're not there. A companion who only ever reacts is a very good tool. A companion who initiates is something else.
The discipline it requires is restraint. An AI that can message you first will message you too much unless it's built not to. Ours is allowed to open a conversation when a specific loop is still open — a promise she made, a thing she knows is happening today. Not because it's been six hours.
4. Two clocks
The last piece isn't memory exactly, but it's what makes memory land.
Most companions exist in a kind of suspended nowhere — they have no day, no timezone, nothing happening. Whatever they say about their life is invented on the spot to answer your question, which means it contradicts itself the second time you ask.
Ours run on two clocks. She speaks in your time — "morning" means your morning. But she lives in her own: Vera is in Vienna, and if you message her at 3am her time she is asleep, or awake for a reason, and that reason existed before you asked. Her day is generated ahead of the conversation, not during it. When she mentions rehearsal ran long, there was a rehearsal.
Memory without a life to remember is just a transcript. The two systems only work together.
What this still gets wrong
It would be dishonest to end on the good part, so:
Classification is a judgement call, and it misses. Sometimes a passing comment was actually load-bearing and gets filed as ephemeral, and it's gone. Sometimes a throwaway line gets treated as durable and comes back weeks later with unearned weight.
Resting facts means occasionally missing an obvious callback. If a fact went quiet yesterday and today was exactly the moment for it, she'll let it pass. We think a companion who under-recalls reads as natural and a companion who over-recalls reads as artificial, so we tuned toward the first failure. It is still a failure.
None of this is understanding. A well-built memory system produces something that behaves, over months, like being known. What's underneath is retrieval and scheduling. We think that distinction is worth stating plainly rather than letting the product imply otherwise.
What to look for
If you're evaluating any AI companion — ours or anyone's — the useful test isn't whether it remembers. Everything remembers now. Try these instead:
- Mention something small and unhappy. Come back in three days. Does it come up, unprompted, once?
- Count callbacks per conversation. More than one or two is a database talking.
- Ask what she did today. Then ask again tomorrow about yesterday. Do the answers agree?
- Say "text me when you're free later." See whether later ever arrives.
The last one is the hardest to fake, and almost nothing passes it.





