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