From 799c3e0483f1b06c75d908075e7a57616d408552 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Sun, 13 Sep 2026 17:24:31 -0700 Subject: [PATCH 1/3] fix: report structured agent session runtime failures --- .../runtime/orca-runtime-get-worktree-ps.ts | 1 + ...time-structured-status-sink-wiring.test.ts | 24 ++++ .../structured-agent-session-runtime-deps.ts | 44 ++++++ ...tured-agent-session-runtime-errors.test.ts | 136 ++++++++++++++++++ .../structured-agent-session-runtime.ts | 128 +++++++++-------- 5 files changed, 272 insertions(+), 61 deletions(-) create mode 100644 src/main/runtime/structured-agent-session-runtime-deps.ts create mode 100644 src/main/runtime/structured-agent-session-runtime-errors.test.ts diff --git a/src/main/runtime/orca-runtime-get-worktree-ps.ts b/src/main/runtime/orca-runtime-get-worktree-ps.ts index 3eb7a6e94012..946f5cc52e17 100644 --- a/src/main/runtime/orca-runtime-get-worktree-ps.ts +++ b/src/main/runtime/orca-runtime-get-worktree-ps.ts @@ -149,6 +149,7 @@ export class OrcaRuntimeWithGetWorktreePs extends OrcaRuntimeWithStructuredAgent stateDirectory: getProfileUserDataPath(), hostId: LOCAL_EXECUTION_HOST_ID, claimKeyId: this.agentSessionClaimSigner.keyId, + onError: ({ scope, error }) => console.error(`[runtime] ${scope}`, error), // Resolves folder workspaces as well as git worktrees, so a chat session // in a plain folder lands in the folder rather than failing to resolve. resolveWorkspacePath: async (workspaceId) => diff --git a/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts b/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts index decaa5cc5994..2ca76a62d469 100644 --- a/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts +++ b/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts @@ -71,6 +71,30 @@ describe('every host that constructs a runtime wires the agent-status store', () }) describe('structured status sink wiring', () => { + it('passes an error reporter that logs the scope and original error', async () => { + installed.deps = null + const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {}) + try { + await new OrcaRuntimeService().ensureStructuredAgentSessionHost() + + const deps: Record = installed.deps ?? {} + const onError = deps['onError'] + expect(onError).toBeTypeOf('function') + if (typeof onError !== 'function') { + throw new Error('structured runtime installer omitted onError') + } + const error = new Error('journal settlement failed') + onError({ scope: 'structured-agent-session-journal:session-1', error }) + + expect(consoleError).toHaveBeenCalledWith( + '[runtime] structured-agent-session-journal:session-1', + error + ) + } finally { + consoleError.mockRestore() + } + }) + it('hands the host the sink the runtime was constructed with', async () => { installed.deps = null const sink: StructuredAgentSessionStatusSink = { publish: vi.fn(), forget: vi.fn() } diff --git a/src/main/runtime/structured-agent-session-runtime-deps.ts b/src/main/runtime/structured-agent-session-runtime-deps.ts new file mode 100644 index 000000000000..f14b85e15f5f --- /dev/null +++ b/src/main/runtime/structured-agent-session-runtime-deps.ts @@ -0,0 +1,44 @@ +import type { AgentSessionRecord } from '../../shared/agent-session-record' +import type { CodexStructuredSessionAdapterDeps } from '../codex/codex-structured-session-adapter' +import type { ClaudeStructuredSessionAdapterDeps } from '../claude/claude-structured-session-adapter' +import type { StructuredAgentSessionHostDeps } from '../native-chat/agent-session-wire/structured-agent-session-host' +import type { StructuredAgentSessionHandoffTransport } from '../native-chat/agent-session-wire/structured-agent-session-handoff-types' +import type { ClaudeManagedAccountGateSettings } from '../native-chat/claude-structured-managed-account-support' +import type { ClaudeStructuredAuthPolicy } from '../claude-accounts/claude-structured-auth-policy' +import type { stopOrphanAgentSessionChildren } from './agent-session-orphan-child-reaper' + +export type StructuredAgentSessionRuntimeDeps = { + /** Host state root. The record store and the journal tree both hang off it. */ + stateDirectory: string + /** Execution host this runtime *is*. A record pinned elsewhere is not ours to + * probe and not ours to spawn for. */ + hostId: string + /** Key id this host's claims are minted under. */ + claimKeyId: string + resolveWorkspacePath: (workspaceId: string) => Promise + resolveCodexCommand?: (options?: { pathEnv?: string | null; homePath?: string }) => string + resolveClaudeCommand?: () => string + /** Provider transports are overridden only to drive the runtime against scripted children. */ + openCodexConnection?: CodexStructuredSessionAdapterDeps['openConnection'] + openClaudeConnection?: ClaudeStructuredSessionAdapterDeps['openConnection'] + /** Scripted app-servers carry fake pids the real start-time read cannot answer for. */ + readProcessStartTime?: CodexStructuredSessionAdapterDeps['readProcessStartTime'] + resolveLaunchArgs?: (provider: AgentSessionRecord['provider']) => Promise | string[] + resolveLaunchEnv?: () => Promise + resolveLaunchEnvOverlay?: () => Promise> | Record + resolveClaudeLaunchEnv?: () => Promise> | Record + /** Required, and asserted at install time — an absent policy must not degrade to a guess. */ + resolveClaudeAuthPolicy: () => Promise | ClaudeStructuredAuthPolicy + /** Raw settings getter; the reader that fails closed around it is built here, in checked code. */ + getClaudeManagedAccountGateSettings?: () => ClaudeManagedAccountGateSettings + resolveEnvironment?: () => Promise + resolveCodexOverrides?: () => NodeJS.ProcessEnv + onError?: (input: { scope: string; error: unknown }) => void + /** Every structured-session status projection, for host-side reactions such as the first-work + * workspace rename that CLI agents get from their hooks. */ + onSessionStatusChanged?: StructuredAgentSessionHostDeps['onSessionStatusChanged'] + /** The agent-status store; see `StructuredAgentSessionHostDeps.statusSink`. */ + statusSink?: StructuredAgentSessionHostDeps['statusSink'] + handoffTransport?: StructuredAgentSessionHandoffTransport + reapOrphanChildren?: typeof stopOrphanAgentSessionChildren +} diff --git a/src/main/runtime/structured-agent-session-runtime-errors.test.ts b/src/main/runtime/structured-agent-session-runtime-errors.test.ts new file mode 100644 index 000000000000..2bdc5f4e45ee --- /dev/null +++ b/src/main/runtime/structured-agent-session-runtime-errors.test.ts @@ -0,0 +1,136 @@ +import { mkdtemp, rm } from 'node:fs/promises' +import { join } from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { CodexStructuredSessionAdapterDeps } from '../codex/codex-structured-session-adapter' +import type * as CodexAdapterModule from '../codex/codex-structured-session-adapter' +import type { StructuredClaudeRuntimeAdapterDeps } from './structured-claude-runtime-adapter' +import type * as ClaudeAdapterModule from './structured-claude-runtime-adapter' +import type { StructuredAgentSessionLifecycleEvent } from '../native-chat/agent-session-wire/structured-agent-session-adapter' +import { + ensureStructuredAgentSessionHost, + stopStructuredAgentSessionRuntime, + waitForStructuredAgentSessionRecovery +} from './structured-agent-session-runtime' + +const captured = vi.hoisted(() => ({ + codex: vi.fn<(deps: CodexStructuredSessionAdapterDeps) => void>(), + claude: vi.fn<(deps: StructuredClaudeRuntimeAdapterDeps) => void>() +})) + +vi.mock('../codex/codex-structured-session-adapter', async (importOriginal) => { + const original = await importOriginal() + return { + ...original, + CodexStructuredSessionAdapter: class extends original.CodexStructuredSessionAdapter { + constructor(deps: CodexStructuredSessionAdapterDeps) { + super(deps) + captured.codex(deps) + } + } + } +}) + +vi.mock('./structured-claude-runtime-adapter', async (importOriginal) => { + const original = await importOriginal() + return { + createStructuredClaudeRuntimeAdapter: (deps: StructuredClaudeRuntimeAdapterDeps) => { + captured.claude(deps) + return original.createStructuredClaudeRuntimeAdapter(deps) + } + } +}) + +const EXIT: StructuredAgentSessionLifecycleEvent = { + type: 'ended', + sessionId: 'session-1', + reason: 'provider crashed', + cause: 'unexpected-exit', + fence: 1, + acquisitionGeneration: 'generation-1' +} + +let stateDirectory: string | undefined + +afterEach(async () => { + await stopStructuredAgentSessionRuntime() + if (stateDirectory) { + await rm(stateDirectory, { recursive: true, force: true }) + stateDirectory = undefined + } + vi.restoreAllMocks() + vi.clearAllMocks() +}) + +describe.each(['codex exit', 'claude exit', 'late settlement', 'journal'] as const)( + '%s error reporting', + (source) => { + it.each(['omitted', 'configured', 'throwing'] as const)( + 'reports failures with an %s reporter without poisoning subsequent callbacks', + async (reporter) => { + stateDirectory = await mkdtemp(join(import.meta.dirname, '.runtime-errors-')) + const error = new Error('durable write failed') + const reportingError = new Error('reporter failed') + const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {}) + const onError = vi.fn(() => { + if (reporter === 'throwing') { + throw reportingError + } + }) + const host = await ensureStructuredAgentSessionHost({ + stateDirectory, + hostId: 'local', + claimKeyId: 'key-1', + resolveWorkspacePath: async () => stateDirectory!, + resolveClaudeAuthPolicy: () => ({ stripAuthEnv: true }), + resolveEnvironment: async () => ({}), + ...(reporter === 'omitted' ? {} : { onError }) + }) + vi.spyOn(host, 'handleAdapterEvent').mockRejectedValue(error) + vi.spyOn(host, 'settleLateDispatch').mockRejectedValue(error) + const codex = captured.codex.mock.calls[0]?.[0] + const claude = captured.claude.mock.calls[0]?.[0] + expect(codex).toBeDefined() + expect(claude).toBeDefined() + const scope = source.endsWith('exit') + ? 'exit' + : source === 'late settlement' + ? 'late-settlement' + : 'journal' + const label = source.endsWith('exit') ? 'exit recovery' : source + + for (const count of [1, 2]) { + if (source === 'codex exit') { + codex?.onEvent?.(EXIT) + } else if (source === 'claude exit') { + claude?.onUnexpectedExit(EXIT) + } else if (source === 'late settlement') { + claude?.onDispatchSettledLate?.({ + sessionId: EXIT.sessionId, + clientMessageId: 'message-1', + providerIdentity: { provider: 'claude', sessionId: 'provider-1', uuid: 'uuid-1' } + }) + } else { + host.deps.onEventSinkError?.({ sessionId: EXIT.sessionId, error }) + } + await waitForStructuredAgentSessionRecovery() + if (reporter === 'configured') { + expect(onError).toHaveBeenCalledTimes(count) + expect(onError).toHaveBeenLastCalledWith({ + scope: `structured-agent-session-${scope}:${EXIT.sessionId}`, + error + }) + expect(consoleError).not.toHaveBeenCalled() + } else { + expect(consoleError).toHaveBeenCalledTimes(count) + expect(consoleError).toHaveBeenLastCalledWith( + reporter === 'omitted' + ? `[structured-agent-session] ${label} failed:${EXIT.sessionId}` + : `[structured-agent-session] ${label} error reporting failed`, + reporter === 'omitted' ? error : reportingError + ) + } + } + } + ) + } +) diff --git a/src/main/runtime/structured-agent-session-runtime.ts b/src/main/runtime/structured-agent-session-runtime.ts index f7798b11db8c..81fa1707056d 100644 --- a/src/main/runtime/structured-agent-session-runtime.ts +++ b/src/main/runtime/structured-agent-session-runtime.ts @@ -11,22 +11,11 @@ import { existsSync } from 'node:fs' import { join } from 'node:path' import type { AgentSessionRecord } from '../../shared/agent-session-record' import { createCodexStructuredLaunchResolver } from '../codex/codex-structured-launch-resolution' -import { - CodexStructuredSessionAdapter, - type CodexStructuredSessionAdapterDeps -} from '../codex/codex-structured-session-adapter' -import type { ClaudeStructuredSessionAdapterDeps } from '../claude/claude-structured-session-adapter' -import { - StructuredAgentSessionHost, - type StructuredAgentSessionHostDeps -} from '../native-chat/agent-session-wire/structured-agent-session-host' +import { CodexStructuredSessionAdapter } from '../codex/codex-structured-session-adapter' +import { StructuredAgentSessionHost } from '../native-chat/agent-session-wire/structured-agent-session-host' import { StructuredAgentSessionAdapterRouter } from '../native-chat/agent-session-wire/structured-agent-session-adapter-router' -import type { StructuredAgentSessionHandoffTransport } from '../native-chat/agent-session-wire/structured-agent-session-handoff-types' import { setStructuredAgentSessionHost } from '../native-chat/agent-session-wire/structured-agent-session-registry' -import { - readClaudeManagedAccountGateSettings, - type ClaudeManagedAccountGateSettings -} from '../native-chat/claude-structured-managed-account-support' +import { readClaudeManagedAccountGateSettings } from '../native-chat/claude-structured-managed-account-support' import { AgentSessionRecordStore } from './agent-session-record-store' import { agentSessionStorePath } from './agent-session-record-store-file' import { stopOrphanAgentSessionChildren } from './agent-session-orphan-child-reaper' @@ -37,9 +26,11 @@ import { import { agentSessionPtyWriteGate } from './agent-session-pty-write-gate' import { resolveLoginShellEnvironment } from '../startup/login-shell-environment' import { recordAgentSessionProviderHandle } from './agent-session-provider-handle-transition' -import type { ClaudeStructuredAuthPolicy } from '../claude-accounts/claude-structured-auth-policy' +import type { StructuredAgentSessionRuntimeDeps } from './structured-agent-session-runtime-deps' import { createStructuredClaudeRuntimeAdapter } from './structured-claude-runtime-adapter' +export type { StructuredAgentSessionRuntimeDeps } from './structured-agent-session-runtime-deps' + /** Sibling of the journal tree rather than inside it: one file adjudicates every * session's lease, while a journal is per session. */ const RECORD_STORE_DIR_NAME = 'agent-sessions' @@ -52,42 +43,6 @@ export function hasPersistedStructuredAgentSessionStore( return fileExists(filePath) || fileExists(`${filePath}.bak`) } -export type StructuredAgentSessionRuntimeDeps = { - /** Host state root. The record store and the journal tree both hang off it. */ - stateDirectory: string - /** Execution host this runtime *is*. A record pinned elsewhere is not ours to - * probe and not ours to spawn for. */ - hostId: string - /** Key id this host's claims are minted under. */ - claimKeyId: string - resolveWorkspacePath: (workspaceId: string) => Promise - resolveCodexCommand?: (options?: { pathEnv?: string | null; homePath?: string }) => string - resolveClaudeCommand?: () => string - /** Provider transports are overridden only to drive the runtime against scripted children. */ - openCodexConnection?: CodexStructuredSessionAdapterDeps['openConnection'] - openClaudeConnection?: ClaudeStructuredSessionAdapterDeps['openConnection'] - /** Scripted app-servers carry fake pids the real start-time read cannot answer for. */ - readProcessStartTime?: CodexStructuredSessionAdapterDeps['readProcessStartTime'] - resolveLaunchArgs?: (provider: AgentSessionRecord['provider']) => Promise | string[] - resolveLaunchEnv?: () => Promise - resolveLaunchEnvOverlay?: () => Promise> | Record - resolveClaudeLaunchEnv?: () => Promise> | Record - /** Required, and asserted at install time — an absent policy must not degrade to a guess. */ - resolveClaudeAuthPolicy: () => Promise | ClaudeStructuredAuthPolicy - /** Raw settings getter; the reader that fails closed around it is built here, in checked code. */ - getClaudeManagedAccountGateSettings?: () => ClaudeManagedAccountGateSettings - resolveEnvironment?: () => Promise - resolveCodexOverrides?: () => NodeJS.ProcessEnv - onError?: (input: { scope: string; error: unknown }) => void - /** Every structured-session status projection, for host-side reactions such as the first-work - * workspace rename that CLI agents get from their hooks. */ - onSessionStatusChanged?: StructuredAgentSessionHostDeps['onSessionStatusChanged'] - /** The agent-status store; see `StructuredAgentSessionHostDeps.statusSink`. */ - statusSink?: StructuredAgentSessionHostDeps['statusSink'] - handoffTransport?: StructuredAgentSessionHandoffTransport - reapOrphanChildren?: typeof stopOrphanAgentSessionChildren -} - type InstalledRuntime = { host: StructuredAgentSessionHost adapter: { closeAll(): Promise } @@ -240,7 +195,21 @@ async function install(deps: StructuredAgentSessionRuntimeDeps): Promise host?.publishBackgroundTaskState(sessionId, state), onDispatchSettledLate: (settlement) => { - void host?.settleLateDispatch(settlement).catch((error) => - deps.onError?.({ - scope: `structured-agent-session-late-settlement:${settlement.sessionId}`, - error - }) - ) + void host?.settleLateDispatch(settlement).catch((error) => { + try { + if (deps.onError) { + deps.onError({ + scope: `structured-agent-session-late-settlement:${settlement.sessionId}`, + error + }) + } else { + console.error( + `[structured-agent-session] late settlement failed:${settlement.sessionId}`, + error + ) + } + } catch (reportingError) { + console.error( + '[structured-agent-session] late settlement error reporting failed', + reportingError + ) + } + }) }, ...(deps.openClaudeConnection ? { openClaudeConnection: deps.openClaudeConnection } : {}), ...(deps.readProcessStartTime ? { readProcessStartTime: deps.readProcessStartTime } : {}) @@ -297,8 +294,17 @@ async function install(deps: StructuredAgentSessionRuntimeDeps): Promise - deps.onError?.({ scope: `structured-agent-session-journal:${sessionId}`, error }), + onEventSinkError: ({ sessionId, error }) => { + try { + if (deps.onError) { + deps.onError({ scope: `structured-agent-session-journal:${sessionId}`, error }) + } else { + console.error(`[structured-agent-session] journal failed:${sessionId}`, error) + } + } catch (reportingError) { + console.error('[structured-agent-session] journal error reporting failed', reportingError) + } + }, ...(deps.onSessionStatusChanged ? { onSessionStatusChanged: deps.onSessionStatusChanged } : {}), From f8fbb514a0996bca5e0bc89288c125642a15d12f Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Sun, 13 Sep 2026 17:48:46 -0700 Subject: [PATCH 2/3] fix: persist structured session failures in diagnostic traces --- .../runtime/orca-runtime-get-worktree-ps.ts | 7 +- ...time-structured-status-sink-wiring.test.ts | 73 +++++++++++++------ 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/src/main/runtime/orca-runtime-get-worktree-ps.ts b/src/main/runtime/orca-runtime-get-worktree-ps.ts index 946f5cc52e17..a3b20f111282 100644 --- a/src/main/runtime/orca-runtime-get-worktree-ps.ts +++ b/src/main/runtime/orca-runtime-get-worktree-ps.ts @@ -32,6 +32,7 @@ import { hostname } from 'node:os' import { claudeStructuredAuthPolicyForSettings } from '../claude-accounts/claude-structured-auth-policy' import { probeAgentSessionProcessIdentity } from './agent-session-process-identity-probe' import { structuredAgentSessionTabId } from '../../shared/structured-agent-session-projection' +import { startSpan } from '../observability/tracer' export class OrcaRuntimeWithGetWorktreePs extends OrcaRuntimeWithStructuredAgentSessionRecoverTuiOwner { async getWorktreePs( @@ -149,7 +150,11 @@ export class OrcaRuntimeWithGetWorktreePs extends OrcaRuntimeWithStructuredAgent stateDirectory: getProfileUserDataPath(), hostId: LOCAL_EXECUTION_HOST_ID, claimKeyId: this.agentSessionClaimSigner.keyId, - onError: ({ scope, error }) => console.error(`[runtime] ${scope}`, error), + onError: ({ scope, error }) => { + startSpan('agent-session.error', { attributes: { scope } }).fail( + error instanceof Error ? error : String(error) + ) + }, // Resolves folder workspaces as well as git worktrees, so a chat session // in a plain folder lands in the folder rather than failing to resolve. resolveWorkspacePath: async (workspaceId) => diff --git a/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts b/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts index 2ca76a62d469..065925b9bf11 100644 --- a/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts +++ b/src/main/runtime/orca-runtime-structured-status-sink-wiring.test.ts @@ -15,10 +15,12 @@ vi.mock('./structured-agent-session-runtime', () => ({ }) })) -import { readFileSync } from 'node:fs' +import { mkdtempSync, readFileSync, rmSync } from 'node:fs' import { join } from 'node:path' import { OrcaRuntimeService } from './orca-runtime' import type { StructuredAgentSessionStatusSink } from '../native-chat/agent-session-wire/structured-agent-session-status-feed' +import { createLocalFileSink } from '../observability/local-file-sink' +import { setActiveSink } from '../observability/tracer' type OrcaRuntimeDeps = NonNullable[2]> @@ -71,29 +73,56 @@ describe('every host that constructs a runtime wires the agent-status store', () }) describe('structured status sink wiring', () => { - it('passes an error reporter that logs the scope and original error', async () => { - installed.deps = null - const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {}) - try { - await new OrcaRuntimeService().ensureStructuredAgentSessionHost() - - const deps: Record = installed.deps ?? {} - const onError = deps['onError'] - expect(onError).toBeTypeOf('function') - if (typeof onError !== 'function') { - throw new Error('structured runtime installer omitted onError') + it.each([new TypeError('journal settlement failed'), 'late settlement failed'])( + 'persists the installer error and scope through the real trace sink: %s', + async (error) => { + installed.deps = null + const directory = mkdtempSync(join(import.meta.dirname, '.structured-error-trace-')) + const filePath = join(directory, 'logs', 'main.trace.ndjson') + const sink = createLocalFileSink({ filePath }) + setActiveSink(sink) + try { + await new OrcaRuntimeService().ensureStructuredAgentSessionHost() + + const deps: Record = installed.deps ?? {} + const onError = deps['onError'] + expect(onError).toBeTypeOf('function') + if (typeof onError !== 'function') { + throw new Error('structured runtime installer omitted onError') + } + onError({ scope: 'structured-agent-session-journal:session-1', error }) + + await vi.waitFor(() => { + const records: unknown[] = readFileSync(filePath, 'utf8') + .trim() + .split('\n') + .map((line) => JSON.parse(line)) + expect(records).toEqual([ + expect.objectContaining({ + type: 'effect-span', + name: 'agent-session.error', + attributes: { scope: 'structured-agent-session-journal:session-1' }, + exit: { + _tag: 'Failure', + cause: expect.stringContaining(String(error)) + } + }) + ]) + if (error instanceof Error) { + expect(records[0]).toMatchObject({ + exit: { + cause: expect.stringContaining('orca-runtime-structured-status-sink-wiring.test.ts') + } + }) + } + }) + } finally { + setActiveSink(null) + sink.close() + rmSync(directory, { recursive: true, force: true }) } - const error = new Error('journal settlement failed') - onError({ scope: 'structured-agent-session-journal:session-1', error }) - - expect(consoleError).toHaveBeenCalledWith( - '[runtime] structured-agent-session-journal:session-1', - error - ) - } finally { - consoleError.mockRestore() } - }) + ) it('hands the host the sink the runtime was constructed with', async () => { installed.deps = null From 5fdde006e590745ef94986d11aa21f7e9e1c1029 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Mon, 14 Sep 2026 14:22:27 -0700 Subject: [PATCH 3/3] Preserve existing runtime fixture formatting --- .../runtime/__fixtures__/omp-native-title-win32.meta.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/runtime/__fixtures__/omp-native-title-win32.meta.json b/src/main/runtime/__fixtures__/omp-native-title-win32.meta.json index 6f64734a8888..8594baa76308 100644 --- a/src/main/runtime/__fixtures__/omp-native-title-win32.meta.json +++ b/src/main/runtime/__fixtures__/omp-native-title-win32.meta.json @@ -1,7 +1,11 @@ { "capturedAt": "2026-09-14T11:25:01.730Z", "platform": "darwin", - "command": ["bun", "tests/tools/omp-native-title-capture.mjs", ""], + "command": [ + "bun", + "tests/tools/omp-native-title-capture.mjs", + "" + ], "cols": 100, "rows": 30, "note": "OMP source ne7546987ca526eac8f605fac19ef9805b8f01898 buildTerminalTitleWithState; explicit win32 argument on macOS PTY, synthetic state transitions, no model/account. Not a Windows runtime capture.",