From 9b6275e4c043228f3a7ca95cb4a3a7ff8aba3823 Mon Sep 17 00:00:00 2001 From: Matt Rubens <2600+mrubens@users.noreply.github.com> Date: Mon, 21 Sep 2026 20:40:59 -0400 Subject: [PATCH] [Fix] Shell exit codes are always missing from task transcripts and the completion check --- .../opencode-server-completion-gate.test.ts | 35 +++++++++++++++++++ .../lib/harnesses/opencode-server/harness.ts | 2 ++ 2 files changed, 37 insertions(+) diff --git a/apps/worker/src/sandbox-server/lib/harnesses/__tests__/opencode-server-completion-gate.test.ts b/apps/worker/src/sandbox-server/lib/harnesses/__tests__/opencode-server-completion-gate.test.ts index 1034c74ca2..56a83afcec 100644 --- a/apps/worker/src/sandbox-server/lib/harnesses/__tests__/opencode-server-completion-gate.test.ts +++ b/apps/worker/src/sandbox-server/lib/harnesses/__tests__/opencode-server-completion-gate.test.ts @@ -481,6 +481,41 @@ describe('OpenCode harness completion check', () => { } }); + it("reads the exit code the way OpenCode's shell tool reports it", async () => { + const { client, harness, completed } = await startTask(); + + try { + await client.emit({ + type: 'message.part.updated', + properties: { + part: { + id: 'prt_call_1', + sessionID: 'ses_1', + messageID: 'msg_1', + type: 'tool', + tool: 'bash', + callID: 'call_1', + state: { + status: 'completed', + input: { command: 'pnpm vitest run' }, + output: 'Tests 1 failed | 11 passed (12)', + // OpenCode 1.18 shell tool metadata: `exit`, not `exitCode`. + metadata: { exit: 1, truncated: false }, + }, + }, + }, + }); + await completeTurn(client, 'msg_1', 'Removed the guard. Tests pass.'); + + await vi.waitFor(() => expect(completed()).toHaveLength(1)); + expect( + mockRequestTaskCompletionCheck.mock.calls[0]![1].commands[0], + ).toMatchObject({ command: 'pnpm vitest run', exitCode: 1 }); + } finally { + harness.dispose(); + } + }); + it('marks a run stale when the code changed after it, however it was changed', async () => { const { client, harness, completed } = await startTask(); const diffAt = (code: string) => ({ diff --git a/apps/worker/src/sandbox-server/lib/harnesses/opencode-server/harness.ts b/apps/worker/src/sandbox-server/lib/harnesses/opencode-server/harness.ts index 249f815e08..ee5178bf3e 100644 --- a/apps/worker/src/sandbox-server/lib/harnesses/opencode-server/harness.ts +++ b/apps/worker/src/sandbox-server/lib/harnesses/opencode-server/harness.ts @@ -869,6 +869,8 @@ function extractOpenCodeExitCode( return ( asFiniteNumber(metadata.exitCode) ?? + // OpenCode's shell tool (1.18) reports the code as `metadata.exit`. + asFiniteNumber(metadata.exit) ?? asFiniteNumber(metadata.code) ?? asFiniteNumber(outputRecord?.exitCode) ?? asFiniteNumber(outputRecord?.code) ??