{"record":{"id":"95f27b0ce48d0571","repo":"Hmbown/CodeWhale","slug":"skill-name-exists-in-both-project-and-global-c","errorCode":null,"errorMessage":"skill '{name}' exists in both project and global CodeWhale roots; specify --project or --global","messagePattern":"skill '(.+?)' exists in both project and global CodeWhale roots; specify --project or --global","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/skills/mutation.rs","lineNumber":509,"sourceCode":"                    && s.source_kind == SkillSourceKind::CompatibleExternal\n            }) {\n                bail!(\n                    \"skill '{name}' exists only in a compatible external root; \\\n                     import it with /skills (refusing to write external harness directories)\"\n                );\n            }\n            bail!(\"skill '{name}' not found in CodeWhale-owned project/global roots\");\n        }\n        [only] => {\n            let DigestState::Known(digest) = &only.digest else {\n                bail!(\"skill '{name}' has unknown package digest; refusing mutation\");\n            };\n            Ok(ResolvedOwnedSkill {\n                id: only.id.clone(),\n                digest: digest.clone(),\n            })\n        }\n        _ => bail!(\n            \"skill '{name}' exists in both project and global CodeWhale roots; \\\n             specify --project or --global\"\n        ),\n    }\n}\n\nfn find_audited_skill(\n    ctx: &MutationContext<'_>,\n    skill_id: &AuditedSkillId,\n) -> Result<(AuditedSkill, PathBuf)> {\n    let snap = scan_with_configured(\n        ctx.workspace,\n        ctx.home,\n        ctx.configured_skills_dir,\n        SkillAuditMode::Compatible,\n        None,\n    );\n    let skill = snap","sourceCodeStart":491,"sourceCodeEnd":527,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/skills/mutation.rs#L491-L527","documentation":"resolve_owned_skill_by_name found the skill in both the project and the global CodeWhale-owned roots and no explicit scope was given. Mutating would be ambiguous (which copy?), so it refuses and asks the caller to disambiguate. The unscoped name targeting a dual-installed skill is the input at fault.","triggerScenarios":"Thrown at crates/tui/src/skills/mutation.rs:509 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Re-run with --project or --global to select the target root","Remove one of the two installations if only one copy is wanted","Use the skill id for that specific root instead of the bare name"],"exampleFix":null,"handlingStrategy":"validation","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"}