') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat: enable staleToolResultPrune by default on headless, desktop, and CLI by Astro-Han · Pull Request #621 · apache/maka · GitHub
Skip to content

feat: enable staleToolResultPrune by default on headless, desktop, and CLI - #621

Merged
Astro-Han merged 4 commits into
mainfrom
feat/481-stale-prune-default-on
Jul 7, 2026
Merged

feat: enable staleToolResultPrune by default on headless, desktop, and CLI#621
Astro-Han merged 4 commits into
mainfrom
feat/481-stale-prune-default-on

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Enable staleToolResultPrune (prior-turn oversized tool-result pruning) by default on headless Harbor cells and in the shared buildDefaultContextBudgetPolicy used by desktop and the CLI. This completes the tool-result prune pipeline that #498 started: activeToolResultPrune already trims oversized results within the current turn, but without stale prune the full results re-enter the request on every subsequent turn when history is rebuilt from runtime events, re-spending the tokens active prune saved.

Why

Active and stale prune are the same invariant applied at two sites — oversized tool results (default 2048 estimated tokens) never re-enter model computation in full; they are archived and replaced with placeholders. #498 enabled the within-turn half by default; this PR enables the cross-turn half so the invariant holds across multi-turn sessions (desktop conversations, continuation-enabled benchmark runs).

Both sites share the same archive wiring and the stale prune degrades safely: it only prunes results that archived successfully with a matching hash, and keeps originals (counting archiveWriteFailures) otherwise. The most recent minRecentTurnsFull turns (default 2) always keep full results.

Refs #481

Scope

Changed:

  • headless harbor-cell.ts: pruneEnabled default ?? false?? true; staleToolResultPrune.minRecentTurnsFull now set explicitly (stale env → MAKA_CONTEXT_MIN_RECENT_TURNS → 2) so the runtime protection window matches the policy snapshot and desktop default instead of the runtime's internal ?? 1 fallback (review finding)
  • headless harbor-cell.test.ts: default-on/explicit-off coverage for stale prune, minRecentTurnsFull fallback/override coverage, adjusted active-prune explicit-off expectations, both-off empty case
  • runtime context-budget-policy.ts: buildStaleToolResultPrunePolicy from "explicit on required" to default-on with explicit off/false opt-out, mirroring buildActiveToolResultPrunePolicy
  • desktop __tests__/context-budget-policy.test.ts: new staleToolResultPrune suite (default-on, opt-out ×2, truthy values, malformed-value rejection, threshold env, min-recent-turns fallback/override, MAKA_CONTEXT_BUDGET=off)

Not included:

Verification

  • npm run -w @maka/headless test: 736 pass / 0 fail / 1 skipped
  • npm run -w @maka/desktop test: 2190 pass / 0 fail
  • npm run -w @maka/runtime test: 951 pass / 0 fail
  • npm run typecheck: clean
  • TDD: new default-on tests observed red before the flips, green after
  • External review: codex (xhigh) round 1 found the minRecentTurnsFull mismatch (fixed in 399e239b), round 2 clean; GLM-5.2 (xhigh) P3-only, both addressed (contract tests + disclosure below)

User-facing impact

  • Desktop/CLI: prior-turn tool results over 2048 estimated tokens are replaced with archive placeholders when rebuilding history; the 2 most recent turns keep full results. Opt out with MAKA_CONTEXT_STALE_TOOL_RESULT_PRUNE=off.
  • Headless: Harbor runs that didn't set MAKA_CONTEXT_STALE_TOOL_RESULT_PRUNE see a behavior change; existing A/B profiles that toggle it explicitly are unaffected.

Reviewer notes

  • Four commits, one per rollback dimension: headless flip, runtime flip (desktop/CLI share the builder), the protection-window fix, and the env-contract tests.
  • Env parsing semantics change on the runtime builder: previously only the literal on enabled stale prune and any other value silently disabled; now standard truthy booleans (true/1/yes/enabled) also enable, and malformed values throw at policy-build time instead of silently disabling. This aligns with activeToolResultPrune and the other parseOptionalBoolean knobs; the throw is fail-loud at backend construction (no catch in desktop main.ts), same as the existing knobs — no new risk category.
  • Headless previously had a latent mismatch even with explicit MAKA_CONTEXT_STALE_TOOL_RESULT_PRUNE=on: the policy snapshot reported minRecentTurnsFull: 2 while the runtime protected only 1 turn. The explicit default fixes both the default-on path and that pre-existing divergence (slightly less aggressive pruning than before).

@Astro-Han
Astro-Han merged commit 0bc1a2d into mainJul 7, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the feat/481-stale-prune-default-on branch July 7, 2026 16:15
Sign up for freeto 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

@Astro-Han