2.5 KB · updated 2026-07-31 · md

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_chunk counted 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.