{"record":{"id":"b2df8fe848f9e717","repo":"zeroclaw-labs/zeroclaw","slug":"duplicate-tool-name-plugin-conflicts-with-an","errorCode":null,"errorMessage":"duplicate tool name: plugin '{}' conflicts with an existing tool","messagePattern":"duplicate tool name: plugin '(.+?)' conflicts with an existing tool","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-hardware/src/tool_registry.rs","lineNumber":90,"sourceCode":"                }\n                println!(\"[registry] loaded built-in: {}\", name);\n                tools.insert(name, tool);\n            }\n        }\n\n        // `datasheet` used to register here, gated on an Aardvark adapter being\n        // present at startup. That adapter support is gone, so the gate could\n        // never be satisfied and the registration is removed with it. The\n        // `datasheet` module itself is retained: no production entrypoint reaches\n        // this registry, because the CLI and daemon build hardware tools through\n        // `peripherals::create_peripheral_tools`, so registering the tool belongs\n        // with that factory rather than here.\n\n        // ── 2. User plugins ───────────────────────────────────────────────\n        let plugins = scan_plugin_dir();\n        for plugin in plugins {\n            if tools.contains_key(&plugin.name) {\n                anyhow::bail!(\n                    \"duplicate tool name: plugin '{}' conflicts with an existing tool\",\n                    plugin.name\n                );\n            }\n            println!(\n                \"[registry] loaded plugin: {} (v{})\",\n                plugin.name, plugin.version\n            );\n            tools.insert(plugin.name, plugin.tool);\n        }\n\n        // ── 3. Startup summary ────────────────────────────────────────────\n        println!(\"[registry] {} tools available\", tools.len());\n\n        {\n            let reg = devices.read().await;\n            let mut aliases = reg.aliases();\n            aliases.sort_unstable(); // deterministic log order","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-hardware/src/tool_registry.rs#L72-L108","documentation":"Error \"duplicate tool name: plugin '{}' conflicts with an existing tool\" thrown in zeroclaw-labs/zeroclaw.","triggerScenarios":"Thrown at crates/zeroclaw-hardware/src/tool_registry.rs:90 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rename the plugin tool so it does not conflict with an existing registered tool name."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}