tinyhumansai/openhuman · error · anyhow::Error

failed to load catalog: {e}

Error message

failed to load catalog: {e}

What it means

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.

Source

Thrown at src/openhuman/skills/catalog/tools.rs:190

    /// `ApprovalGate` (#3993). On an interactive chat turn the user sees an
    /// inline approval card and approves before anything is written; on
    /// background/cron turns (no `APPROVAL_CHAT_CONTEXT`) the gate is bypassed,
    /// matching every other external-effect tool.
    fn external_effect(&self) -> bool {
        true
    }

    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {
        let entry_id = args
            .get("entry_id")
            .and_then(|v| v.as_str())
            .ok_or_else(|| anyhow::anyhow!("missing required argument `entry_id`"))?;

        tracing::debug!(entry_id = %entry_id, "[tool][skill_registry] install");

        let catalog = ops::browse_catalog(false)
            .await
            .map_err(|e| anyhow::anyhow!("failed to load catalog: {e}"))?;

        let entry = catalog.iter().find(|e| e.id == entry_id).ok_or_else(|| {
            anyhow::anyhow!(
                "skill '{entry_id}' not found in catalog. \
                     Run skill_registry_browse first to refresh."
            )
        })?;

        match ops::install_from_catalog(&self.workspace_dir, entry).await {
            Ok(outcome) => Ok(ToolResult::success(serde_json::to_string(&json!({
                "url": outcome.url,
                "stdout": outcome.stdout,
                "stderr": outcome.stderr,
                "new_skills": outcome.new_skills,
            }))?)),
            Err(e) => Ok(ToolResult::error(format!(
                "Failed to install skill '{entry_id}': {e}"
            ))),

View on GitHub (pinned to 7491200858)

Solutions

  1. Retry — remote catalog fetches are network-dependent
  2. Check connectivity to the catalog source
  3. Inspect `{e}` for fetch vs parse failure
  4. Clear/redownload the catalog cache if corrupt
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/openhuman/skills/catalog/tools.rs:190 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/d5c56862a8fe7198. Report an issue: GitHub.