{"record":{"id":"c1ff30165bf48b27","repo":"zeroclaw-labs/zeroclaw","slug":"manifest-exec-binary-not-found","errorCode":null,"errorMessage":"manifest exec binary not found: {}","messagePattern":"manifest exec binary not found: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-hardware/src/loader.rs","lineNumber":207,"sourceCode":"    let canonical_plugin_dir = plugin_dir.canonicalize().map_err(|e| {\n        ::zeroclaw_log::record!(\n            WARN,\n            ::zeroclaw_log::Event::new(module_path!(), ::zeroclaw_log::Action::Fail)\n                .with_outcome(::zeroclaw_log::EventOutcome::Failure)\n                .with_attrs(::serde_json::json!({\n                    \"plugin_dir\": plugin_dir.display().to_string(),\n                    \"error\": format!(\"{}\", e),\n                })),\n            \"cannot canonicalize plugin dir\"\n        );\n        anyhow::Error::msg(format!(\n            \"cannot canonicalize plugin dir {}: {e}\",\n            plugin_dir.display()\n        ))\n    })?;\n    let raw_binary_path = plugin_dir.join(&manifest.exec.binary);\n    if !raw_binary_path.exists() {\n        anyhow::bail!(\n            \"manifest exec binary not found: {}\",\n            raw_binary_path.display()\n        );\n    }\n    let binary_path = raw_binary_path.canonicalize().map_err(|e| {\n        ::zeroclaw_log::record!(\n            WARN,\n            ::zeroclaw_log::Event::new(module_path!(), ::zeroclaw_log::Action::Fail)\n                .with_outcome(::zeroclaw_log::EventOutcome::Failure)\n                .with_attrs(::serde_json::json!({\n                    \"binary_path\": raw_binary_path.display().to_string(),\n                    \"error\": format!(\"{}\", e),\n                })),\n            \"cannot canonicalize plugin binary path\"\n        );\n        anyhow::Error::msg(format!(\n            \"cannot canonicalize binary path {}: {e}\",\n            raw_binary_path.display()","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-hardware/src/loader.rs#L189-L225","documentation":"The manifest's `binary` value is joined onto the plugin directory and must exist on disk; when it does not, `load_one_plugin` bails with the joined path it actually looked up. Comparing that path against where the binary really lives shows exactly what is off. This is the first of the filesystem checks — parse and field validation have already passed.","triggerScenarios":"`binary = \"bin/tool\"` while the built artifact sits at `target/release/tool`; the executable was never built or copied; a typo or wrong casing in the path on a case-sensitive filesystem.","commonSituations":"CI checkouts where plugin binaries are not built yet; plugin folders moved without updating tool.toml; Windows-style backslash paths in the manifest on Linux.","solutions":["Build or copy the executable to the path shown in the error (relative to the plugin directory)","Fix the `binary` value in tool.toml to the correct relative path","Match exact file-name casing on case-sensitive filesystems"],"exampleFix":"# before\n[exec]\nbinary = \"bin/tool\"   # no such file\n# after\n[exec]\nbinary = \"target/release/zeroclaw-tool-read-sensors\"","handlingStrategy":"validation","validationCode":"let binary = plugin_dir.join(&manifest.exec.binary);\nif !binary.exists() {\n    anyhow::bail!(\"binary missing at {} — build it before scanning plugins\", binary.display());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Build plugin binaries before the loader scans the directory (order your build scripts accordingly)","Keep binary paths in tool.toml relative to the plugin dir and stable across machines","On case-sensitive filesystems, double-check exact file-name casing"],"tags":["hardware","plugin","manifest","file-not-found","loader"],"backgroundTag":"file-not-found","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}