Skip to content

Fix case-sensitive tool ID comparison in pruning logic - #115

Merged
Tarquinen merged 2 commits into
masterfrom
fix/case-insensitive-tool-id-matching
Dec 11, 2025
Merged

Fix case-sensitive tool ID comparison in pruning logic#115
Tarquinen merged 2 commits into
masterfrom
fix/case-insensitive-tool-id-matching

Conversation

@Tarquinen

Copy link
Copy Markdown
Collaborator

Summary

  • Fix case-sensitive tool ID comparison that could cause re-processing of already pruned tools when IDs appeared with different casing from different providers
  • Improve lookup performance by using a Set with O(1) lookups instead of O(n) array includes() calls

Details

The pruning logic in janitor.ts was using case-sensitive includes() checks to determine if a tool call ID had already been pruned. This could fail if the same tool call ID was received with different casing (e.g., from different API providers), causing unnecessary re-processing.

This fix normalizes all IDs to lowercase before comparison and uses a Set for efficient lookups.

Previously, tool call IDs were compared using case-sensitive includes() checks,
which could cause re-processing of already pruned tools if the same ID appeared
with different casing from different providers.

This change normalizes IDs to lowercase before comparison using a Set for
efficient O(1) lookups instead of O(n) array includes() calls.
@Tarquinen
Tarquinen merged commit 42f3116 into master Dec 11, 2025
1 check passed
@Tarquinen
Tarquinen deleted the fix/case-insensitive-tool-id-matching branch December 11, 2025 16:46
Ther-zh added a commit to Ther-zh/opencode-dynamic-context-pruning that referenced this pull request Aug 31, 2026
Real-session replay (fork-1.json) showed prompt guidance alone is not
enough: after one good large merge (Opencode-DCP#113: -88.8K/+15.3K), the model fell
back to folding a single poll message (Opencode-DCP#114: -121/+453) and writing a
merge summary 2.6x larger than what it replaced (Opencode-DCP#115: -6.7K/+17.5K).
Both are net-positive context growth - the exact anti-pattern.

Add a hard code-level gate: when compress.enforceSummaryShrink is on
(default true), the range compress tool rejects any compression whose
summary tokens are not strictly smaller than the tokens it replaces
(raw messages + consumed child block summaries). The model must rewrite
a much more condensed summary or merge existing blocks instead.

Adds config key, range-utils helper, tool integration, and unit test.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant