From ac55c05c3047978bd86052e7cb78f85b25568705 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Thu, 27 Aug 2026 23:01:07 -0400 Subject: [PATCH] fix(core): correct compaction history direction (#45698) --- .changeset/compaction-history-direction.md | 5 +++++ packages/core/src/session/compaction.ts | 2 +- packages/core/test/session-compaction.test.ts | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .changeset/compaction-history-direction.md diff --git a/.changeset/compaction-history-direction.md b/.changeset/compaction-history-direction.md new file mode 100644 index 00000000000..b5db7813475 --- /dev/null +++ b/.changeset/compaction-history-direction.md @@ -0,0 +1,5 @@ +--- +"@opencode-ai/core": patch +--- + +Correct the compaction prompt to point existing summaries at the conversation history that follows them. diff --git a/packages/core/src/session/compaction.ts b/packages/core/src/session/compaction.ts index c04e13bca4b..60259d8ea6a 100644 --- a/packages/core/src/session/compaction.ts +++ b/packages/core/src/session/compaction.ts @@ -215,7 +215,7 @@ const select = ( export const buildPrompt = (input: { readonly previousSummary?: string; readonly context: readonly string[] }) => [ input.previousSummary - ? `Update the anchored summary below using the conversation history above.\nPreserve still-true details, remove stale details, and merge in the new facts.\n\n${input.previousSummary}\n` + ? `Update the anchored summary below using the conversation history below.\nPreserve still-true details, remove stale details, and merge in the new facts.\n\n${input.previousSummary}\n` : "Create a new anchored summary from the conversation history.", SUMMARY_TEMPLATE, "The following is the conversation history:", diff --git a/packages/core/test/session-compaction.test.ts b/packages/core/test/session-compaction.test.ts index c2167485f31..c3a3ba6f6ee 100644 --- a/packages/core/test/session-compaction.test.ts +++ b/packages/core/test/session-compaction.test.ts @@ -143,6 +143,13 @@ test("compaction prompt requires the checkpoint headings in order", () => { expect(prompt).toContain("Keep every section, even when empty.") }) +test("compaction points an existing summary to the following history", () => { + const prompt = SessionCompaction.buildPrompt({ previousSummary: "Previous summary", context: ["Recent history"] }) + + expect(prompt.split("\n", 1)[0]).toBe("Update the anchored summary below using the conversation history below.") + expect(prompt).not.toContain("conversation history above") +}) + it.effect("auto compaction reserves a buffer below the prompt ceiling", () => Effect.gen(function* () { const compaction = yield* SessionCompaction.Service