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);