agent-ecosystem/test/shared/utils/teamLaunchFailureReason.test.ts

149 lines
5.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
hasUnsafeProvisionedButNotAliveRuntimeEvidence,
hasUnsafeProvisionedButNotAliveRuntimeEvidenceWithSpawnContext,
isBootstrapConfirmedProvisionedButNotAliveFailure,
} from '@shared/utils/teamLaunchFailureReason';
describe('teamLaunchFailureReason', () => {
it('treats runtime process candidates as unsafe provisioned-but-not-alive evidence', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidence({
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason: 'CLI process exited (code 1) - team provisioned but not alive',
launchState: 'failed_to_start',
livenessKind: 'runtime_process_candidate',
runtimeDiagnostic:
'OpenCode runtime process detected, but teammate bootstrap is not confirmed',
runtimeDiagnosticSeverity: 'warning',
status: 'error',
})
).toBe(true);
});
it('treats permission-blocked runtime liveness as unsafe provisioned-but-not-alive evidence', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidence({
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason: 'CLI process exited (code 1) - team provisioned but not alive',
launchState: 'failed_to_start',
livenessKind: 'permission_blocked',
runtimeDiagnostic: 'runtime is waiting for permission approval',
runtimeDiagnosticSeverity: 'warning',
status: 'error',
})
).toBe(true);
});
it('keeps process-table-unavailable registered metadata safe for bootstrap healing', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidence({
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason: 'CLI process exited (code 1) - team provisioned but not alive',
launchState: 'failed_to_start',
livenessKind: 'registered_only',
runtimeDiagnostic: 'runtime pid could not be verified because process table is unavailable',
runtimeDiagnosticSeverity: 'warning',
status: 'error',
})
).toBe(false);
});
it('treats missing liveness without process-table evidence as unsafe', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidence({
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason: 'CLI process exited (code 1) - team provisioned but not alive',
launchState: 'failed_to_start',
status: 'error',
})
).toBe(true);
});
it('keeps missing liveness safe when process-table evidence is explicit', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidence({
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason:
'CLI process exited (code 1) - team provisioned but not alive; process table unavailable',
launchState: 'failed_to_start',
status: 'error',
})
).toBe(false);
});
it('uses spawn process-table evidence for registered runtime metadata without diagnostics', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidenceWithSpawnContext(
{
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason:
'CLI process exited (code 1) - team provisioned but not alive; process table unavailable',
launchState: 'failed_to_start',
status: 'error',
},
{
livenessKind: 'registered_only',
runtimeDiagnosticSeverity: 'warning',
}
)
).toBe(false);
});
it('uses spawn process-table evidence for runtime metadata without liveness or diagnostics', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidenceWithSpawnContext(
{
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason:
'CLI process exited (code 1) - team provisioned but not alive; process table unavailable',
launchState: 'failed_to_start',
status: 'error',
},
{
runtimeDiagnosticSeverity: 'warning',
}
)
).toBe(false);
});
it('keeps registered runtime metadata unsafe when runtime diagnostics contradict spawn proof', () => {
expect(
hasUnsafeProvisionedButNotAliveRuntimeEvidenceWithSpawnContext(
{
bootstrapConfirmed: true,
hardFailure: true,
hardFailureReason:
'CLI process exited (code 1) - team provisioned but not alive; process table unavailable',
launchState: 'failed_to_start',
status: 'error',
},
{
livenessKind: 'registered_only',
runtimeDiagnostic: 'Runtime heartbeat is not alive',
runtimeDiagnosticSeverity: 'warning',
}
)
).toBe(true);
});
it('recognizes runtime-diagnostic-only provisioned-but-not-alive failures', () => {
expect(
isBootstrapConfirmedProvisionedButNotAliveFailure({
bootstrapConfirmed: true,
hardFailure: true,
launchState: 'failed_to_start',
runtimeDiagnostic: 'CLI process exited (code 1) - team provisioned but not alive',
status: 'error',
})
).toBe(true);
});
});