- Reconstruct native tool-calling sequences using reverse-unfolding mechanism - Strictly use atomic grouping for safe native tool output trimming - Add comprehensive test coverage for unfolding logic and issue drafts - READMEs and docs synced (v1.4.1)
1.9 KiB
1.9 KiB
Async Context Compression Progress Mapping
Discovered: 2026-03-10
Context
Applies to plugins/filters/async-context-compression/async_context_compression.py once the inlet has already replaced early history with a synthetic summary message.
Finding
compressed_message_count cannot be recalculated from the visible message list length after compression. Once a summary marker is present, the visible list mixes:
- preserved head messages that are still before the saved boundary
- one synthetic summary message
- tail messages that map to original history starting at the saved boundary
Solution / Pattern
Store the original-history boundary on the injected summary message metadata, then recover future progress using:
original_count = covered_until + len(messages_after_summary_marker)target_progress = max(covered_until, original_count - keep_last)
When the summary-model window is too small, trim newest atomic groups from the summary input so the saved boundary still matches what the summary actually covers.
Gotchas
- If you trim from the head of the summary input, the saved progress can overstate coverage and hide messages that were never summarized.
- Status previews for the next context must convert the saved original-history boundary back into the current visible view before rebuilding head/summary/tail.
inlet(body["messages"])andoutlet(body["messages"])can both represent the full conversation while using different serializations:- inlet may receive expanded native tool-call chains (
assistant(tool_calls) -> tool -> assistant) - outlet may receive a compact top-level transcript where tool calls are folded into assistant
<details type="tool_calls">blocks
- inlet may receive expanded native tool-call chains (
- These two views do not share a safe
compressed_message_countcoordinate system. If outlet is in the compact assistant/details view, do not persist summary progress derived from its top-level message count.