tinyhumansai/openhuman · error · anyhow::Error

missing required argument `entry_id`

Error message

missing required argument `entry_id`

What it means

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.

Source

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

    fn permission_level(&self) -> PermissionLevel {
        PermissionLevel::Write
    }

    /// Installing a skill mutates the user's local skill set and fetches a
    /// remote `SKILL.md`, so it routes through the process-global
    /// `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,

View on GitHub (pinned to 7491200858)

Solutions

  1. Take the exact entry_id from a prior skill_registry_browse result
  2. Ensure it is passed as a JSON string
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at src/openhuman/skills/catalog/tools.rs:184 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/2c3d1ad8da44839e. Report an issue: GitHub.