{"record":{"id":"d5c56862a8fe7198","repo":"tinyhumansai/openhuman","slug":"failed-to-load-catalog-e","errorCode":null,"errorMessage":"failed to load catalog: {e}","messagePattern":"failed to load catalog: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/skills/catalog/tools.rs","lineNumber":190,"sourceCode":"    /// `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,\n                \"stderr\": outcome.stderr,\n                \"new_skills\": outcome.new_skills,\n            }))?)),\n            Err(e) => Ok(ToolResult::error(format!(\n                \"Failed to install skill '{entry_id}': {e}\"\n            ))),","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/skills/catalog/tools.rs#L172-L208","documentation":"Loading the skill catalog (`ops::browse_catalog`) failed while resolving an install request. The entry_id was already read, but fetching/reading the catalog errored — remote catalog unreachable, cache unreadable, or parse failure, detailed by `{e}`. Install cannot match the id without the catalog.","triggerScenarios":"Thrown at src/openhuman/skills/catalog/tools.rs:190 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Retry — remote catalog fetches are network-dependent","Check connectivity to the catalog source","Inspect `{e}` for fetch vs parse failure","Clear/redownload the catalog cache if corrupt"],"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-14T05:17:10.506Z"}