From 44062b7976013d5dd9380c6472be9e8f99af0fea Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Tue, 12 May 2026 01:30:20 -0500 Subject: [PATCH] fix(compaction): clarify serialized tail context --- packages/opencode/src/session/compaction.ts | 8 +++++++- packages/opencode/test/session/compaction.test.ts | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts index bcf5874bab..0362a4f541 100644 --- a/packages/opencode/src/session/compaction.ts +++ b/packages/opencode/src/session/compaction.ts @@ -531,7 +531,13 @@ export const layer: Layer.Layer< type: "text", metadata: { compaction_tail: true }, synthetic: true, - text: ["", tail, ""].join("\n\n"), + text: [ + "The conversation history before this point was compacted into the summary above.", + "The following messages are the latest conversation turns after that summarized history.", + "", + tail, + "", + ].join("\n\n"), }) } diff --git a/packages/opencode/test/session/compaction.test.ts b/packages/opencode/test/session/compaction.test.ts index e8f0daa1e7..a3cf05a915 100644 --- a/packages/opencode/test/session/compaction.test.ts +++ b/packages/opencode/test/session/compaction.test.ts @@ -1123,7 +1123,7 @@ describe("session.compaction.process", () => { expect(result).toBe("continue") expect(last?.info.role).toBe("user") - expect(last?.parts.some((part) => part.type === "text" && part.text.includes("recent-conversation-tail"))).toBe(true) + expect(last?.parts.some((part) => part.type === "text" && part.text.includes("latest-messages"))).toBe(true) expect(all.some((msg) => msg.info.role === "assistant" && msg.info.summary)).toBe(true) expect( all.some( @@ -1400,14 +1400,14 @@ describe("session.compaction.process", () => { expect(head).not.toContain("and this one too") expect(prompt).not.toContain("keep this turn") expect(prompt).not.toContain("and this one too") - expect(prompt).not.toContain("recent-conversation-tail") + expect(prompt).not.toContain("latest-messages") expect(prompt).not.toContain("What did we do so far?") const tail = (yield* ssn.messages({ sessionID: session.id })).find( (item) => item.info.role === "user" && item.parts.some((part) => part.type === "text" && part.synthetic), ) expect(JSON.stringify(tail?.parts)).toContain("keep this turn") expect(JSON.stringify(tail?.parts)).toContain("and this one too") - expect(JSON.stringify(tail?.parts)).toContain("recent-conversation-tail") + expect(JSON.stringify(tail?.parts)).toContain("latest-messages") }).pipe(withCompaction({ llm: stub.layer })) }, { git: true },