v0.24.0.md
docs/release-notes/v0.24.0.md
Tesserae v0.24.0 — the full sleep cycle: forget by disuse, discover connections
<!-- translations:start -->
한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch
<!-- translations:end -->
Released 2026-07-22 · PyPI · GitHub release · pip install --upgrade tesserae==0.24.0
v0.23 gave the engine a sleep cycle that compressed memory during idle rest. But consolidation in a brain isn't only compression — it also prunes what you never revisit and links memories that turn out to be related. This release adds those two operations, so the daemon's idle cycle now runs all three.
1 · Forget by disuse (LRU)
Until now, a finding's decay was based on its age. That systematically buries old, rarely-seen gotchas — exactly the ones you most need when they recur. Now every meaningful read records access: search, ask, query, context, node_context, drill_down, session-finding lookups, and agent-scoped reads all stamp last_accessed_at into the memory sidecar.
The consolidation pass then decays by retrieval recency, not creation age. Knowledge you keep hitting stays sharp; knowledge you never revisit slowly fades and is absorbed or demoted during the sleep cycle — true LRU forgetting. (A finding is still never deleted; it's folded into the distillate that cites it, reachable via agents drill.)
2 · Discover new connections
Sleep also replays memories and links distant ones. The new associate pass runs during consolidation: it uses embeddings to find related — not identical — nodes across different agents within a project and adds shares_concept_with connections between them. Discovered links accumulate across cycles and are traversable by search, Personalized PageRank, and federated queries, so an agent can reach relevant knowledge it never explicitly linked.
Determinism held
Both operations write only to the sidecar — access state to the node_memory store, discovered links to an accumulating .tesserae overlay that's merged in memory at read time. graph.json is never touched, so the compile stays byte-identical. Discovered links are embedding-based (and thus machine-dependent), which is exactly why they live in the overlay and never in the deterministic graph. Association is gated on a real embedding backend (pip install "tesserae[semantic]") and is a quiet no-op without one.
The cycle, now complete
export TESSERAE_AGENT_DISTILL=1
tesserae engine # idle → compress · forget-by-disuse · associate
Nothing new to configure — the three operations run inside the existing idle consolidation tick, under the compile gate, never blocking a recompile. Full detail: