Hmbown/CodeWhale · error · anyhow::Error

this mutation requires async execute (network I/O)

Error message

this mutation requires async execute (network I/O)

What it means

Guard in execute_sync: it handles only local mutations (install/import/remove/trust without network) and bails for requests that require network I/O, directing them to the async execute path. It fires when a caller invoked the synchronous executor with a SkillMutationRequest variant (typically remote install/update) that performs network operations, which sync execution cannot support.

Source

Thrown at crates/tui/src/skills/mutation.rs:438

            remove_skill(resolved.id, expected_digest.or(Some(resolved.digest)), ctx)
        }
        SkillMutationRequest::Trust {
            skill_id,
            expected_digest,
        } => trust_skill(skill_id, expected_digest, ctx),
        SkillMutationRequest::TrustByName {
            name,
            scope,
            expected_digest,
        } => {
            let resolved = resolve_owned_skill_by_name(ctx, &name, scope)?;
            let digest = expected_digest.unwrap_or(resolved.digest);
            trust_skill(resolved.id, digest, ctx)
        }
        SkillMutationRequest::InstallRemote { .. }
        | SkillMutationRequest::Update { .. }
        | SkillMutationRequest::UpdateByName { .. } => {
            bail!("this mutation requires async execute (network I/O)")
        }
    }
}

#[derive(Debug)]
struct ResolvedOwnedSkill {
    id: AuditedSkillId,
    digest: String,
}

fn resolve_owned_skill_by_name(
    ctx: &MutationContext<'_>,
    name: &str,
    scope: Option<SkillTargetScope>,
) -> Result<ResolvedOwnedSkill> {
    // Match SkillRegistry::get — users may pass frontmatter/dir forms
    // (Hello_World) while audit stores the folded canonical key (hello-world).
    let canonical = normalize_skill_name_for_lookup(name);

View on GitHub (pinned to 0c42157ee5)

Solutions

  1. Route the mutation through the async execute() entry point instead of execute_sync
  2. Only call execute_sync for purely local mutations (remove/trust/local import)
  3. Refactor the caller to detect network-dependent requests before choosing the sync path
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at crates/tui/src/skills/mutation.rs:438 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20). Data as JSON: /api/errors/361aaaf4fc91f730. Report an issue: GitHub.