stablyai/orca · error · Error

did not emit readiness within ms

Error message

${name} did not emit readiness within ${startupTimeoutMs}ms:
${logResult.stdout}${logResult.stderr}

What it means

Thrown by waitForReady when the deadline (Date.now() + startupTimeoutMs) elapses while the container is still running but has not produced a complete ready contract in its logs. hasCompleteReadyContract never matched: it requires 'Orca server ready\n' plus a Pairing URL/guidance line, or at least one orca_server_ready JSON object.

Solutions

  1. Increase startupTimeoutMs passed to waitForReady.
  2. Inspect the appended logs to see how far startup progressed and which ready line is missing.
  3. Confirm ORCA_PAIRING_ADDRESS/ORCA_SERVE_PORT and ORCA_READY_JSON match the mode expected by hasCompleteReadyContract.
  4. Check for stdout buffering inside the container (use line-buffered output or stdbuf).

Example fix

// before
const stdout = await waitForReady(name, startupTimeoutMs)
// after
const stdout = await waitForReady(name, startupTimeoutMs + 60_000)
// and confirm ORCA_READY_JSON=1 when expecting JSON readiness
Defensive patterns

Strategy: retry

Validate before calling

const startupTimeoutMs = Math.max(options.startupTimeoutMs ?? 60_000, 120_000)
// pass the larger value into waitForReady so slow first boots are tolerated

Type guard

function isReady(stdout) { return hasCompleteReadyContract(stdout) }

Try / catch

let stdout
try {
  stdout = await waitForReady(name, startupTimeoutMs)
} catch (err) {
  if (/did not emit readiness/.test(err.message)) {
    stdout = await waitForReady(name, startupTimeoutMs + 60_000) // one bounded retry
  } else {
    throw err
  }
}

Prevention

When it happens

Trigger: Container stays alive past startupTimeoutMs but the app is slow to bind, ORCA_READY_JSON mode mismatch, or readiness output is going to a stream not captured, so hasCompleteReadyContract keeps returning false.

Common situations: Slow first boot (cold AppImage extraction), startupTimeoutMs too low, app waiting on a network/address that never resolves, ORCA_PAIRING_ADDRESS misconfigured so pairing guidance is never printed, logs buffered and not flushed.

Understand the failure class

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/69bc96b235ff06a6. Report an issue: GitHub.

Appendix: source

Thrown at config/scripts/run-headless-linux-pairing-docker.mjs:297

  while (Date.now() < deadline) {
    const logResult = docker(['logs', name], { allowFailure: true })
    const stdout = `${logResult.stdout}${logResult.stderr}`
    if (hasCompleteReadyContract(stdout)) {
      return stdout
    }
    const running = docker(['inspect', '-f', '{{.State.Running}}', name], {
      allowFailure: true
    }).stdout.trim()
    if (running === 'false') {
      const containerLogs = docker(['logs', name], { allowFailure: true })
      throw new Error(
        `${name} exited before readiness:\n${containerLogs.stdout}${containerLogs.stderr}`
      )
    }
    await new Promise((resolveWait) => setTimeout(resolveWait, 100))
  }
  const logResult = docker(['logs', name], { allowFailure: true })
  throw new Error(
    `${name} did not emit readiness within ${startupTimeoutMs}ms:\n${logResult.stdout}${logResult.stderr}`
  )
}

function hasCompleteReadyContract(stdout) {
  if (
    stdout.includes('Orca server ready\n') &&
    (stdout.includes('\nPairing URL: ') || stdout.includes('\nPairing guidance: '))
  ) {
    return true
  }
  return readyJsonObjects(stdout).length > 0
}

function validateReady(logs, mode, expectedHost, options = {}) {
  if (mode === 'human') {
    assert(
      (logs.match(/^Orca server ready$/gm) ?? []).length === 1,

View on GitHub (pinned to 1136503c6a)