From 637d7b4728fa91df39180945133ea9420c062513 Mon Sep 17 00:00:00 2001 From: Pandadadadazxf <2273529713@qq.com> Date: Sat, 14 Mar 2026 08:40:38 +0800 Subject: [PATCH] Compaction: preserve tail sections when reserved suffix exceeds cap When suffix.length >= maxChars, slice(0, maxChars) kept the head (preserved turns) and dropped the tail (workspace rules, diagnostics). Use slice(-maxChars) to preserve the critical tail instead. Made-with: Cursor --- .../pi-extensions/compaction-safeguard.test.ts | 18 ++++++++++++++++++ .../pi-extensions/compaction-safeguard.ts | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/agents/pi-extensions/compaction-safeguard.test.ts b/src/agents/pi-extensions/compaction-safeguard.test.ts index 6dd00385ef9..61c56270cb8 100644 --- a/src/agents/pi-extensions/compaction-safeguard.test.ts +++ b/src/agents/pi-extensions/compaction-safeguard.test.ts @@ -329,6 +329,24 @@ describe("compaction-safeguard summary budgets", () => { expect(capped).toContain("None.\n\n## Tool Failures"); expect(capped).not.toMatch(/None\.## Tool Failures/); }); + + it("preserves tail sections when suffix exceeds cap (workspace rules, diagnostics over preserved turns)", () => { + const criticalTail = + "\n\n## Tool Failures\n- exec: failed\n\n\nfoo.ts\n\n\n" + + "\n## Session Startup\nRead AGENTS.md\n"; + const preservedTurns = + "## Recent turns preserved verbatim\n- User: x\n- Assistant: y\n" + + "x".repeat(MAX_COMPACTION_SUMMARY_CHARS); + const oversizedSuffix = preservedTurns + criticalTail; + + const capped = capCompactionSummaryPreservingSuffix("short body", oversizedSuffix); + + expect(capped.length).toBeLessThanOrEqual(MAX_COMPACTION_SUMMARY_CHARS); + expect(capped).toContain(""); + expect(capped).toContain("## Tool Failures"); + expect(capped).toContain(""); + expect(capped).toContain("## Session Startup"); + }); }); describe("computeAdaptiveChunkRatio", () => { diff --git a/src/agents/pi-extensions/compaction-safeguard.ts b/src/agents/pi-extensions/compaction-safeguard.ts index 838cc1c7a04..0a2aeac39a3 100644 --- a/src/agents/pi-extensions/compaction-safeguard.ts +++ b/src/agents/pi-extensions/compaction-safeguard.ts @@ -270,7 +270,8 @@ function capCompactionSummaryPreservingSuffix( return capCompactionSummary(`${summaryBody}${suffix}`, maxChars); } if (suffix.length >= maxChars) { - return suffix.slice(0, maxChars); + // Preserve tail (workspace rules, diagnostics) over head (preserved turns). + return suffix.slice(-maxChars); } const bodyBudget = Math.max(0, maxChars - suffix.length); const cappedBody = capCompactionSummary(summaryBody, bodyBudget);