{"record":{"id":"7c5ee0965111d15b","repo":"tinyhumansai/openhuman","slug":"worker-exited-before-readiness-handshake","errorCode":null,"errorMessage":"{} worker exited before readiness handshake","messagePattern":"(.+?) worker exited before readiness handshake","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/runtime/pool/worker.rs","lineNumber":172,"sourceCode":"                .await\n                .map_err(|_| {\n                    anyhow::anyhow!(\"{} worker protocol connection timed out\", launch.lang.id())\n                })?\n                .context(\"accepting isolated worker protocol connection\")?;\n            let (reader, writer) = tokio::io::split(stream);\n            (Box::new(writer), Box::new(reader), Some(token))\n        } else {\n            (\n                Box::new(child_stdin.context(\"worker stdin missing\")?),\n                Box::new(stdout),\n                None,\n            )\n        };\n        let mut lines = BufReader::new(reader).lines();\n\n        let ready_line = match tokio::time::timeout(HANDSHAKE_TIMEOUT, lines.next_line()).await {\n            Ok(Ok(Some(line))) => line,\n            Ok(Ok(None)) => bail!(\n                \"{} worker exited before readiness handshake\",\n                launch.lang.id()\n            ),\n            Ok(Err(error)) => {\n                return Err(error).context(\"reading worker handshake\");\n            }\n            Err(_) => bail!(\"{} worker readiness handshake timed out\", launch.lang.id()),\n        };\n        let ready: PoolReadyLine = serde_json::from_str(&ready_line)\n            .with_context(|| format!(\"parsing worker ready line: {ready_line}\"))?;\n        if !ready.ready {\n            bail!(\n                \"{} worker failed to start: {}\",\n                launch.lang.id(),\n                ready.error.unwrap_or_else(|| \"unknown\".to_string())\n            );\n        }\n        if ready.protocol != Some(PROTOCOL_VERSION) {","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/runtime/pool/worker.rs#L154-L190","documentation":"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).","triggerScenarios":"Thrown at src/openhuman/runtime/pool/worker.rs:172 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Inspect the worker's stderr and the core log for the crash reason","Verify the language runtime install is intact (re-provision it)","Relaunch the pool so a fresh worker spawns"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}