149 lines
5.1 KiB
TypeScript
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);
|
|
});
|
|
});
|