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