diff --git a/apps/server/src/orchestration-v2/SubagentProjection.test.ts b/apps/server/src/orchestration-v2/SubagentProjection.test.ts index 9b3ebfc02f62..29deb33a3ae6 100644 --- a/apps/server/src/orchestration-v2/SubagentProjection.test.ts +++ b/apps/server/src/orchestration-v2/SubagentProjection.test.ts @@ -393,6 +393,51 @@ it("exposes the provider failure rather than a progress message from the failed assert.isNull(result.messageId); }); +it("keeps the final report of a run that failed after its turn ended", () => { + const { projection, run } = taskFixture(); + const failedRun = { ...run, status: "failed" as const }; + const artifacts = makeSubagentConversationArtifacts({ + messageId: MessageId.make("report"), + turnItemId: TurnItemId.make("report"), + threadId: parentThreadId, + rootNodeId: NodeId.make("root"), + providerThreadId: null, + providerTurnId: null, + nativeItemRef: null, + role: "assistant", + text: "Review complete: no blocking issues.", + ordinal: 1, + now: childCreatedAt, + }); + if (artifacts.turnItem.type !== "assistant_message") throw new Error("Expected assistant item"); + const failure = { + class: "unknown" as const, + message: "Connection failed repeatedly", + code: null, + retryable: false, + }; + const result = subagentResultForRun( + { + ...projection, + messages: [{ ...artifacts.message, runId: run.id }], + turnItems: [ + { ...artifacts.turnItem, runId: run.id }, + { + ...artifacts.turnItem, + id: TurnItemId.make("error"), + ordinal: 2, + type: "error", + runId: run.id, + failure, + }, + ], + }, + failedRun, + ); + assert.include(result.text, failure.message); + assert.include(result.text, "Review complete: no blocking issues."); +}); + it("orders a task's assistant messages by turn item, not by timestamps", () => { const { projection, run } = taskFixture(); const at = DateTime.makeUnsafe("2026-07-24T10:05:00.000Z"); diff --git a/packages/provider-core/src/server/subagentProjection.ts b/packages/provider-core/src/server/subagentProjection.ts index 62145567f665..699067abb3e6 100644 --- a/packages/provider-core/src/server/subagentProjection.ts +++ b/packages/provider-core/src/server/subagentProjection.ts @@ -227,8 +227,16 @@ export function subagentResultForRun( .filter((item) => item.runId === run.id && item.type === "error") .toSorted((left, right) => right.ordinal - left.ordinal)[0] : undefined; + const reportBeforeFailure = + failure !== undefined && turnItem !== null && turnItem.ordinal < failure.ordinal + ? (message?.text ?? turnItem.text) + : undefined; const text = - (failure?.type === "error" ? failure.failure.message : undefined) ?? + (failure?.type === "error" + ? reportBeforeFailure === undefined + ? failure.failure.message + : `${failure.failure.message}\n\nLast assistant message before the run failed:\n\n${reportBeforeFailure}` + : undefined) ?? message?.text ?? turnItem?.text ?? (run.status === "completed"