tinyhumansai/openhuman · error

{} worker exited before readiness handshake

Error message

{} worker exited before readiness handshake

What it means

The pool worker's stdout hit EOF (Ok(Ok(None))) before the first ready line arrived — the worker process died during startup. The launch itself succeeded; the failure is inside the worker (import error, missing interpreter, crash before the handshake print).

Source

Thrown at src/openhuman/runtime/pool/worker.rs:172

                .await
                .map_err(|_| {
                    anyhow::anyhow!("{} worker protocol connection timed out", launch.lang.id())
                })?
                .context("accepting isolated worker protocol connection")?;
            let (reader, writer) = tokio::io::split(stream);
            (Box::new(writer), Box::new(reader), Some(token))
        } else {
            (
                Box::new(child_stdin.context("worker stdin missing")?),
                Box::new(stdout),
                None,
            )
        };
        let mut lines = BufReader::new(reader).lines();

        let ready_line = match tokio::time::timeout(HANDSHAKE_TIMEOUT, lines.next_line()).await {
            Ok(Ok(Some(line))) => line,
            Ok(Ok(None)) => bail!(
                "{} worker exited before readiness handshake",
                launch.lang.id()
            ),
            Ok(Err(error)) => {
                return Err(error).context("reading worker handshake");
            }
            Err(_) => bail!("{} worker readiness handshake timed out", launch.lang.id()),
        };
        let ready: PoolReadyLine = serde_json::from_str(&ready_line)
            .with_context(|| format!("parsing worker ready line: {ready_line}"))?;
        if !ready.ready {
            bail!(
                "{} worker failed to start: {}",
                launch.lang.id(),
                ready.error.unwrap_or_else(|| "unknown".to_string())
            );
        }
        if ready.protocol != Some(PROTOCOL_VERSION) {

View on GitHub (pinned to 7491200858)

Solutions

  1. Inspect the worker's stderr and the core log for the crash reason
  2. Verify the language runtime install is intact (re-provision it)
  3. Relaunch the pool so a fresh worker spawns
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/openhuman/runtime/pool/worker.rs:172 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/7c5ee0965111d15b. Report an issue: GitHub.