From 954a1d70052cc8bfa2728e7da408adbb6ddcd824 Mon Sep 17 00:00:00 2001 From: Bikkies Date: Fri, 10 Apr 2026 14:50:56 +1000 Subject: [PATCH] fix: use reference identity instead of length check for assembled view - Compare assembled.messages !== sourceMessages instead of length, so engines that rewrite content without changing array count are respected - Add test for same-count-different-reference assembly --- .../tool-result-context-guard.test.ts | 20 ++++++++++++++++++- .../tool-result-context-guard.ts | 6 +----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/agents/pi-embedded-runner/tool-result-context-guard.test.ts b/src/agents/pi-embedded-runner/tool-result-context-guard.test.ts index 48f25c9b61b..113878beca0 100644 --- a/src/agents/pi-embedded-runner/tool-result-context-guard.test.ts +++ b/src/agents/pi-embedded-runner/tool-result-context-guard.test.ts @@ -392,7 +392,25 @@ describe("installContextEngineLoopHook", () => { expect(transformed).toBe(compactedView); }); - it("returns the source messages when the assembled view has the same length", async () => { + it("returns the assembled view when the engine rewrites content without changing count", async () => { + const agent = makeGuardableAgent(); + const rewrittenView = [makeUser("rewritten-1"), makeUser("rewritten-2")]; + const engine = makeMockEngine({ + assemble: async () => ({ messages: rewrittenView, estimatedTokens: 0 }), + }); + installHook(agent, engine); + + const initial = [makeUser("first"), makeToolResult("call_1", "r")]; + await callTransform(agent, initial); + + const withNew = [...initial, makeToolResult("call_2", "r2")]; + const transformed = await callTransform(agent, withNew); + + // Same count (2) but different array reference — engine's view should be used + expect(transformed).toBe(rewrittenView); + }); + + it("returns the source when the engine returns the same array reference", async () => { const agent = makeGuardableAgent(); const engine = makeMockEngine(); installHook(agent, engine); diff --git a/src/agents/pi-embedded-runner/tool-result-context-guard.ts b/src/agents/pi-embedded-runner/tool-result-context-guard.ts index 2624bfc8a6c..14fbb3d48c5 100644 --- a/src/agents/pi-embedded-runner/tool-result-context-guard.ts +++ b/src/agents/pi-embedded-runner/tool-result-context-guard.ts @@ -239,11 +239,7 @@ export function installContextEngineLoopHook(params: { tokenBudget, model: modelId, }); - if ( - assembled && - Array.isArray(assembled.messages) && - assembled.messages.length !== sourceMessages.length - ) { + if (assembled && Array.isArray(assembled.messages) && assembled.messages !== sourceMessages) { lastAssembledView = assembled.messages; return assembled.messages; }