{"record":{"id":"2c3d1ad8da44839e","repo":"tinyhumansai/openhuman","slug":"missing-required-argument-entry-id","errorCode":null,"errorMessage":"missing required argument `entry_id`","messagePattern":"missing required argument `entry_id`","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/skills/catalog/tools.rs","lineNumber":184,"sourceCode":"    fn permission_level(&self) -> PermissionLevel {\n        PermissionLevel::Write\n    }\n\n    /// Installing a skill mutates the user's local skill set and fetches a\n    /// remote `SKILL.md`, so it routes through the process-global\n    /// `ApprovalGate` (#3993). On an interactive chat turn the user sees an\n    /// inline approval card and approves before anything is written; on\n    /// background/cron turns (no `APPROVAL_CHAT_CONTEXT`) the gate is bypassed,\n    /// matching every other external-effect tool.\n    fn external_effect(&self) -> bool {\n        true\n    }\n\n    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {\n        let entry_id = args\n            .get(\"entry_id\")\n            .and_then(|v| v.as_str())\n            .ok_or_else(|| anyhow::anyhow!(\"missing required argument `entry_id`\"))?;\n\n        tracing::debug!(entry_id = %entry_id, \"[tool][skill_registry] install\");\n\n        let catalog = ops::browse_catalog(false)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"failed to load catalog: {e}\"))?;\n\n        let entry = catalog.iter().find(|e| e.id == entry_id).ok_or_else(|| {\n            anyhow::anyhow!(\n                \"skill '{entry_id}' not found in catalog. \\\n                     Run skill_registry_browse first to refresh.\"\n            )\n        })?;\n\n        match ops::install_from_catalog(&self.workspace_dir, entry).await {\n            Ok(outcome) => Ok(ToolResult::success(serde_json::to_string(&json!({\n                \"url\": outcome.url,\n                \"stdout\": outcome.stdout,","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/skills/catalog/tools.rs#L166-L202","documentation":"The skill-registry install tool was called without a usable `entry_id` string — missing, non-string, or empty after trimming. The install flow needs the catalog entry id to look up and fetch the remote SKILL.md, so the guard fires before the approval gate or any fetch occurs.","triggerScenarios":"Thrown at src/openhuman/skills/catalog/tools.rs:184 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Take the exact entry_id from a prior skill_registry_browse result","Ensure it is passed as a JSON string"],"exampleFix":null,"handlingStrategy":"validation","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"}