v0.20.2.md
docs/release-notes/v0.20.2.md
Tesserae v0.20.2 — the model reads everything now
<!-- translations:start -->
한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch
<!-- translations:end -->
Released 2026-07-14 · PyPI · GitHub release · pip install --upgrade tesserae==0.20.2
The second half of the long-session fix. v0.20.1 removed the 300-turn import cap so full conversation history reaches the store; this release fixes the consumption side, so every LLM that reads that history actually reads all of it — regardless of total length.
What was still wrong after 0.20.1
- Session excerpts truncated to fit: past a 24,000-character horizon per project, summaries dropped whole sessions with "…more sessions omitted for length" — the model never saw them.
- One unbounded prompt: the summary narrative and agent-decision mining each sent everything in a single LLM call — on a busy window, bigger than any context window.
max_turns_per_chunkcounted turns, not size: thirty turns can carry one 500KB tool dump; session-graph extraction chunks could still overflow.
What changed
New tesserae/llm_chunking.py: a deterministic block packer and a map-reduce runner sized to a conservative context budget (48,000 chars ≈ 12k tokens; TESSERAE_LLM_CHUNK_CHARS to tune). Every LLM consumer of session history now iterates budget-sized chunks — PART i/N map calls, then a hierarchical merge — with truncation markers gone, a single oversized turn line-splitting across chunks instead of overflowing, and small inputs keeping the exact old single-call path.
--max-turns remains a scan memory guard only — it no longer bounds what the model reads.
Verified against the requirement directly: 600KB of session history → 82 bounded calls (max prompt 7,525 chars under an 8,000-char test budget) → one merged narrative with every session accounted for. The acceptance test plants a decision in the last session beyond the old truncation horizon — it fails on the pre-fix code.