diff --git a/src/main/services/team/provisioning/TeamProvisioningOpenCodeRuntimeEvidencePolicy.ts b/src/main/services/team/provisioning/TeamProvisioningOpenCodeRuntimeEvidencePolicy.ts index 30ce8949..13e9d308 100644 --- a/src/main/services/team/provisioning/TeamProvisioningOpenCodeRuntimeEvidencePolicy.ts +++ b/src/main/services/team/provisioning/TeamProvisioningOpenCodeRuntimeEvidencePolicy.ts @@ -185,7 +185,7 @@ export function isMaterializedOpenCodeSessionId(sessionId: unknown): boolean { return false; } const trimmed = sessionId.trim(); - return trimmed.length > 0 && !trimmed.startsWith('failed:'); + return trimmed.length > 0 && !trimmed.toLowerCase().startsWith('failed:'); } export function hasMaterializedOpenCodeRuntimeForBootstrap( @@ -372,8 +372,8 @@ export function hasOpenCodeRuntimeHandle( const runtimeSessionId = (value as { runtimeSessionId?: unknown }).runtimeSessionId; const runtimeEvidenceSessionId = (value as { sessionId?: unknown }).sessionId; const sessionId = - (typeof runtimeSessionId === 'string' && runtimeSessionId.trim().length > 0) || - (typeof runtimeEvidenceSessionId === 'string' && runtimeEvidenceSessionId.trim().length > 0); + isMaterializedOpenCodeSessionId(runtimeSessionId) || + isMaterializedOpenCodeSessionId(runtimeEvidenceSessionId); return runtimePid || sessionId; } @@ -401,8 +401,7 @@ export function hasOpenCodeRuntimeEntryHandle( typeof value.runtimePid === 'number' && Number.isFinite(value.runtimePid) && value.runtimePid > 0; - const runtimeSessionId = - typeof value.runtimeSessionId === 'string' && value.runtimeSessionId.trim().length > 0; + const runtimeSessionId = isMaterializedOpenCodeSessionId(value.runtimeSessionId); return pid || runtimePid || runtimeSessionId || hasOpenCodeRuntimeLivenessMarker(value); } diff --git a/test/main/services/team/TeamProvisioningOpenCodeRuntimeEvidencePolicy.test.ts b/test/main/services/team/TeamProvisioningOpenCodeRuntimeEvidencePolicy.test.ts index a226818b..90f37cc1 100644 --- a/test/main/services/team/TeamProvisioningOpenCodeRuntimeEvidencePolicy.test.ts +++ b/test/main/services/team/TeamProvisioningOpenCodeRuntimeEvidencePolicy.test.ts @@ -128,6 +128,9 @@ describe('TeamProvisioningOpenCodeRuntimeEvidencePolicy', () => { expect(hasOpenCodeRuntimeHandle({ runtimeSessionId: ' session-1 ' })).toBe(true); expect(hasOpenCodeRuntimeHandle({ sessionId: 'session-2' })).toBe(true); expect(hasOpenCodeRuntimeHandle({ runtimePid: 0, sessionId: ' ' })).toBe(false); + expect(hasOpenCodeRuntimeHandle({ sessionId: 'failed:session-2' })).toBe(false); + expect(hasOpenCodeRuntimeHandle({ runtimeSessionId: 'FAILED:session-3' })).toBe(false); + expect(hasOpenCodeRuntimeEntryHandle({ runtimeSessionId: 'failed:entry-session' })).toBe(false); expect(hasOpenCodeRuntimeLivenessMarker({ livenessKind: 'runtime_process_candidate' })).toBe( true ); @@ -195,6 +198,7 @@ describe('TeamProvisioningOpenCodeRuntimeEvidencePolicy', () => { ); expect(isMaterializedOpenCodeSessionId('runtime-session')).toBe(true); expect(isMaterializedOpenCodeSessionId('failed:runtime-session')).toBe(false); + expect(isMaterializedOpenCodeSessionId('FAILED:runtime-session')).toBe(false); expect(hasMaterializedOpenCodeRuntimeForBootstrap(result.members.Builder)).toBe(true); expect(isRecoverableOpenCodeBootstrapPendingLaunchResult(result, 'Builder')).toBe(true);