v0.21.0.md
docs/release-notes/v0.21.0.md
Tesserae v0.21.0 — layered agent memory
<!-- translations:start -->
한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch
<!-- translations:end -->
Released 2026-07-20 · PyPI · GitHub release · pip install --upgrade tesserae==0.21.0
No human remembers everything, and no agent's context window fits everything. This release gives Tesserae a layered, per-agent knowledge base — the biggest feature since the engine spine. Every agent grows its own memory, that memory is periodically distilled into a bounded higher-level layer, and managers see only the distilled layer of their reports, recursively up an org tree. Entirely opt-in and additive.
The idea
Expertise isn't a partition of facts — it's a weighting over shared facts, deepening where an agent actually works. So instead of one giant graph or N fragmented ones, Tesserae keeps three layers over one substrate:
- L0 — the project graph you already have, unchanged and byte-idempotent. The compile now mints one
Agentnode per observed agent plusperformed_byedges — raw attribution, zero LLM cost. - L1 — one distilled artifact per agent (
.tesserae/agents/<key>/distilled.graph.json), bounded to a single 48k read so an agent can load its whole memory in one call. - L2' — manager rollups: distilling an agent that has reports carries the best of its reports' notes verbatim (LLM re-summarization depth capped at 1 — never a paraphrase of a paraphrase), recursing to any depth.
What you can do
tesserae agents init # discover agents, propose the org registry
tesserae agents set-parent <child> <manager>
export TESSERAE_AGENT_DISTILL=1
tesserae distill # every agent, leaves first, managers last
Then every graph-reading MCP tool takes an agent= argument: a worker key (own raw experience plus own distilled notes), a manager key (a federation of the reports' distilled layers only — raw never leaks up), or org (the whole team, zero config). New tools agent_view_explain (who knows what, and how stale) and drill_down (resolve a distilled note back to raw evidence, audit-logged) round it out.
Forgetting that never deletes
The user's "forget" decomposes into absorb (fold a decayed finding into a distillate that cites it) and demote (drop to a title+ref line in the agent's index) — age alone never makes knowledge invisible, and everything stays reachable via drill_down / include_superseded. Every promotion, demotion, and absorption is written to a ledger and surfaced by tesserae lint, so shrinkage is visible before it costs a decision, never discovered after.
The growth loop
Per-agent harness dirs with a generated purpose.md; per-agent extraction-guidance streams (steer one agent without touching others); opt-in cross-agent semantic bridges; per-agent topic maps; and subagent promotion, so a reviewer subagent's runs accumulate into the reviewer agent's own expertise. When TESSERAE_AGENT_DISTILL is set, tesserae refresh consolidates automatically — but only for agents under memory pressure (raw recall no longer fitting one read), the MemGPT-style trigger.
Determinism held throughout
The project graph stays byte-idempotent; distilled artifacts are deterministic given their declared inputs. Time is always the corpus clock — the newest instant in the sessions themselves — never wall-clock; node identity never depends on LLM wording; and a lint probe rejects the timestamp/counter-shaped metadata that has broken byte-idempotence before.