From 831eee9ef8f418caeebaebbdadb38c8ec0b71ea8 Mon Sep 17 00:00:00 2001 From: Rodrigo Uroz Date: Tue, 24 Feb 2026 16:38:42 +0000 Subject: [PATCH] Compaction: avoid duplicate merge focus header --- ...compaction.identifier-preservation.test.ts | 21 +++++++++++++++++++ src/agents/compaction.ts | 5 +++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/agents/compaction.identifier-preservation.test.ts b/src/agents/compaction.identifier-preservation.test.ts index f9667e3c800..810b6307d3f 100644 --- a/src/agents/compaction.identifier-preservation.test.ts +++ b/src/agents/compaction.identifier-preservation.test.ts @@ -89,6 +89,27 @@ describe("compaction identifier-preservation instructions", () => { expect(call[5]).toContain("Preserve all opaque identifiers exactly as written"); } }); + + it("avoids duplicate additional-focus headers in split+merge path", async () => { + await summarizeInStages({ + messages: [makeMessage(1), makeMessage(2), makeMessage(3), makeMessage(4)], + model: testModel, + apiKey: "test-key", + signal: new AbortController().signal, + reserveTokens: 4000, + maxChunkTokens: 1000, + contextWindow: 200_000, + parts: 2, + minMessagesForSplit: 4, + customInstructions: "Prioritize customer-visible regressions.", + }); + + const mergedCall = mockGenerateSummary.mock.calls.at(-1); + const instructions = mergedCall?.[5] ?? ""; + expect(instructions).toContain("Merge these partial summaries into a single cohesive summary."); + expect(instructions).toContain("Prioritize customer-visible regressions."); + expect((instructions.match(/Additional focus:/g) ?? []).length).toBe(1); + }); }); describe("buildCompactionSummarizationInstructions", () => { diff --git a/src/agents/compaction.ts b/src/agents/compaction.ts index f2c56286b6d..e8c2541402e 100644 --- a/src/agents/compaction.ts +++ b/src/agents/compaction.ts @@ -335,8 +335,9 @@ export async function summarizeInStages(params: { timestamp: Date.now(), })); - const mergeInstructions = params.customInstructions - ? `${MERGE_SUMMARIES_INSTRUCTIONS}\n\nAdditional focus:\n${params.customInstructions}` + const custom = params.customInstructions?.trim(); + const mergeInstructions = custom + ? `${MERGE_SUMMARIES_INSTRUCTIONS}\n\n${custom}` : MERGE_SUMMARIES_INSTRUCTIONS; return summarizeWithFallback({