stablyai/orca · error
[plain-node-entry-guard] daemon-entry.js was killed by ${res
Error message
[plain-node-entry-guard] daemon-entry.js was killed by ${result.signal} under plain Node. What it means
The smoke-loaded daemon-entry.js process was terminated by an OS signal (result.signal is non-null), but the spawn itself did not error and the process did not time out (those cases are checked first at lines 193 and 201). This means an external force killed the process — e.g., an OOM killer, a CI runner resource cull, or a manual kill — rather than a controlled exit or the plugin's own timeout mechanism.
Source
Thrown at config/build-plugins/plain-node-entry-guard.ts:208
async function smokeLoadDaemonEntry(outputDir: string, timings: SmokeTimings): Promise<void> {
const entryPath = join(outputDir, 'daemon-entry.js')
const result = await runDaemonEntry(entryPath, timings)
if (result.error) {
throw new Error(
`[plain-node-entry-guard] could not smoke-load daemon-entry.js under plain Node: ` +
`${result.error.message}`
)
}
// Almost always means the daemon stopped rejecting an empty argv and started
// listening instead.
if (result.timedOut) {
throw new Error(
`[plain-node-entry-guard] daemon-entry.js did not exit within ${timings.timeoutMs}ms on an ` +
`empty argv under plain Node, so the smoke killed it.`
)
}
if (result.signal) {
throw new Error(
`[plain-node-entry-guard] daemon-entry.js was killed by ${result.signal} under plain Node.`
)
}
const stderr = result.stderr
if (/Cannot find module|MODULE_NOT_FOUND/.test(stderr)) {
throw new Error(
`[plain-node-entry-guard] daemon-entry.js failed to load under plain Node:\n${stderr}`
)
}
if (result.status === 0 || !stderr.includes(DAEMON_USAGE_PREFIX)) {
throw new Error(
`[plain-node-entry-guard] daemon-entry.js did not reject an empty argv under plain Node ` +
`(expected a non-zero exit and the "${DAEMON_USAGE_PREFIX}" error, got exit ` +
`${result.status}). stderr:\n${stderr}`
)
}
}
View on GitHub (pinned to 1136503c6a)
Solutions
- Check the signal name in the error — SIGKILL typically means OOM; check `dmesg` or CI runner logs for OOM killer activity.
- Increase available memory for the build runner, or reduce concurrency so the smoke test has headroom.
- If the signal is reproducible only on specific runners, profile daemon-entry.js memory usage at startup to identify a memory regression in the module graph.
Defensive patterns
Strategy: try-catch
Validate before calling
// Check available memory before running the smoke test on CI
import { freemem, totalmem } from 'os'
function assertSufficientMemoryForSmoke() {
const freeMB = freemem() / 1024 / 1024
if (freeMB < 512) {
console.warn(`Low memory (${freeMB}MB free) — smoke test may be OOM-killed`)
}
} Try / catch
// Distinguish OOM from real failures
try {
await smokeLoadDaemonEntry(outputDir, timings)
} catch (error) {
if (error.message.includes('killed by SIGKILL')) {
console.error('Likely OOM — check CI runner memory limits')
}
throw error
} Prevention
- Ensure CI runners have sufficient memory for the daemon smoke test (the module graph includes native modules).
- Avoid running multiple memory-intensive builds concurrently on the same runner.
- Monitor CI for intermittent SIGKILL failures which indicate resource pressure.
When it happens
Trigger: The Node process running daemon-entry.js was killed by SIGKILL (OOM killer on memory-constrained CI runners), SIGTERM (container orchestration), or another external signal. Since the plugin's own timeout path (line 201) is checked first, this fires only when the signal arrives from outside the plugin's timeout escalation.
Common situations: CI runners with tight memory limits where daemon-entry.js's module graph (including native modules) exceeds the cgroup limit. Containerized build environments with aggressive OOM policies. Concurrent builds competing for resources.
Related errors
- [plain-node-entry-guard] could not smoke-load daemon-entry.j
- [plain-node-entry-guard] daemon-entry.js did not exit within
- [plain-node-entry-guard] daemon-entry.js failed to load unde
- [plain-node-entry-guard] daemon-entry.js did not reject an e
- [plain-node-entry-guard] "${entryName}" reaches chunk "${chu
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/d0e1e93898e3ed33.
Report an issue: GitHub.