{"record":{"id":"5499b46925776202","repo":"Hmbown/CodeWhale","slug":"skill-was-imported-locally-spec-spec-and-can","errorCode":null,"errorMessage":"skill was imported locally (spec '{spec}') and cannot be updated from a registry; re-import or remove it first","messagePattern":"skill was imported locally \\(spec '(.+?)'\\) and cannot be updated from a registry; re-import or remove it first","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/skills/mutation.rs","lineNumber":580,"sourceCode":"            \"skill content changed since audit (expected {expected}, found {current}); \\\n             re-review before mutating\"\n        );\n    }\n    Ok(Some(current))\n}\n\nfn ensure_remote_updatable(skill_dir: &Path) -> Result<()> {\n    let marker_path = skill_dir.join(install::INSTALLED_FROM_MARKER);\n    let body = fs::read_to_string(&marker_path)\n        .with_context(|| format!(\"failed to read {}\", marker_path.display()))?;\n    let value: serde_json::Value = serde_json::from_str(&body)\n        .with_context(|| format!(\"malformed {}\", install::INSTALLED_FROM_MARKER))?;\n    let spec = value\n        .get(\"spec\")\n        .and_then(|v| v.as_str())\n        .unwrap_or_default();\n    if !install::is_registry_updatable_spec(spec) {\n        bail!(\n            \"skill was imported locally (spec '{spec}') and cannot be updated from a registry; \\\n             re-import or remove it first\"\n        );\n    }\n    Ok(())\n}\n\nasync fn install_remote(\n    source: InstallSource,\n    target: SkillTargetScope,\n    ctx: &MutationContext<'_>,\n) -> Result<SkillMutationReceipt> {\n    let skills_dir = prepare_owned_target(ctx.workspace, ctx.home, target)?;\n    let anchor = owned_anchor(ctx.workspace, ctx.home, target)?;\n\n    let outcome = install::install_with_registry(\n        source,\n        &skills_dir,","sourceCodeStart":562,"sourceCodeEnd":598,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/skills/mutation.rs#L562-L598","documentation":"ensure_remote_updatable reads the INSTALLED_FROM_MARKER inside the skill package and finds it records a local import source rather than a registry spec. Locally imported skills have no registry origin to update from, so update_skill refuses: the correct lifecycle is to re-import (replacing content) or remove and reinstall. The local-import marker in the skill directory is the input at fault.","triggerScenarios":"Thrown at crates/tui/src/skills/mutation.rs:580 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Re-import the skill from its local source to refresh it","Remove the skill, then install it from the registry if a registry copy is wanted","Edit the local source directory directly and re-import"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}