From bdbbfa97789ac244546804e2cd5c04a4c5f53abb Mon Sep 17 00:00:00 2001 From: can1357 Date: Sat, 6 Jun 2026 20:54:00 +0200 Subject: [PATCH] fix(eval): surfaced subagent abort reason - Used `||` so empty stderr no longer masks the real abort reason. --- .../src/eval/__tests__/agent-bridge.test.ts | 21 +++++++++++++++++++ .../coding-agent/src/eval/agent-bridge.ts | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/coding-agent/src/eval/__tests__/agent-bridge.test.ts b/packages/coding-agent/src/eval/__tests__/agent-bridge.test.ts index 08bf08401..2d8662ad5 100644 --- a/packages/coding-agent/src/eval/__tests__/agent-bridge.test.ts +++ b/packages/coding-agent/src/eval/__tests__/agent-bridge.test.ts @@ -231,6 +231,27 @@ describe("runEvalAgent", () => { }); await expect(runEvalAgent({ prompt: "fail" }, { session: makeSession() })).rejects.toThrow("boom"); }); + + it("surfaces the abort reason when an aborted subagent has empty stderr", async () => { + // An aborted subagent returns exitCode 1 with stderr "" and error + // undefined; the real reason lives in abortReason. The bridge must not + // collapse the failure message to "" (which the Python prelude renders as + // the info-free "bridge call '__agent__' failed"). + mockAgents(); + vi.spyOn(taskExecutor, "runSubprocess").mockImplementation(async options => + singleResult(options, { + exitCode: 1, + output: "", + stderr: "", + aborted: true, + abortReason: "Subagent runtime limit exceeded (task.maxRuntimeMs=1000)", + }), + ); + + await expect(runEvalAgent({ prompt: "hello" }, { session: makeSession() })).rejects.toThrow( + "Subagent runtime limit exceeded (task.maxRuntimeMs=1000)", + ); + }); }); describe("agent() through eval runtimes", () => { diff --git a/packages/coding-agent/src/eval/agent-bridge.ts b/packages/coding-agent/src/eval/agent-bridge.ts index a97f6c98e..e114c59d8 100644 --- a/packages/coding-agent/src/eval/agent-bridge.ts +++ b/packages/coding-agent/src/eval/agent-bridge.ts @@ -280,7 +280,7 @@ export async function runEvalAgent(args: unknown, options: EvalAgentBridgeOption if (result.exitCode !== 0 || result.error) { const failureMessage = - result.error ?? result.stderr ?? result.abortReason ?? `agent() subagent '${agentName}' failed.`; + result.error || result.stderr || result.abortReason || `agent() subagent '${agentName}' failed.`; throw new ToolError(failureMessage); }