Three agent-memory threads this week, one missing field A developer building in public for 21 days discovered that every major agent memory API—including Mem0, Zep, Letta, and OpenAI's Assistants—is missing a lifecycle state field to mark facts as superseded rather than deleted. The gap causes agents to confidently re-apply outdated user preferences because the memory system provides no signal that a stored fact is no longer active. The developer proposes adding a "state" field with values like "live," "superseded," or "retired" to preserve historical context while preventing stale data from influencing agent behavior. I'm 21 days into building in public on dev.to. Three different threads I joined this week started in completely different places — one was a Welcome Thread first-comment about agent design, one was an X-driven side conversation about memory and sycophancy, one was a same-day launch post from a solo dev in Accra shipping his own memory API. All three converged on the same gap. Every agent memory API I touched this week — including the one I build against in my own stack — is missing the same field: a lifecycle state. Store → retrieve → delete. That's the entire API surface for most agent memory services. Mem0, Zep, Letta, OpenAI's Assistants memory, the new AgentRAM, the userMemories layer I work with directly. Three verbs, plus search, plus tenancy. The model handles "this fact exists" beautifully. It handles "remove this fact" beautifully. What it doesn't handle — and what every agent eventually faceplants on — is "this fact used to be true but isn't anymore." Concrete example from my own builds. Two months ago a user told the agent "I prefer X." The agent dutifully stored it. Today the same user is operating under different constraints, but the memory entry is still in the store, still load-bearing, and the agent obediently re-applies the old preference because it has no signal that the entry is stale. The behavioral result looks identical to a sycophancy failure: the agent confidently asserts an outdated belief because the memory said so. But it isn't a sycophancy problem. The model isn't wrong about what's in memory. The memory itself is wrong about what's still active. This is a temporal concern, not a semantic one. You can't fix it with better embeddings or richer chunking. You fix it with state. The shape I keep landing on: { key: "user pref:layout", value: "compact", state: "live" | "superseded" | "retired", superseded by: