{"record":{"id":"739ac01646853496","repo":"Hmbown/CodeWhale","slug":"owned-skill-path-does-not-exist","errorCode":null,"errorMessage":"owned skill path {} does not exist","messagePattern":"owned skill path (.+?) does not exist","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/skills/mutation.rs","lineNumber":304,"sourceCode":"    let anchor = owned_anchor(ctx.workspace, ctx.home, target)?;\n    validate_owned_target_chain(anchor, &expected, true)?;\n    Ok(expected)\n}\n\n/// Validate a real direct child of an already validated owned skills root.\n/// Returns false only when a missing child is permitted.\nfn validate_owned_child(skills_dir: &Path, child: &Path, require_existing: bool) -> Result<bool> {\n    if child.parent() != Some(skills_dir) {\n        bail!(\n            \"refusing to mutate path {} outside direct owned root {}\",\n            child.display(),\n            skills_dir.display()\n        );\n    }\n    let exists = checked_real_directory(child)?;\n    if !exists {\n        if require_existing {\n            bail!(\"owned skill path {} does not exist\", child.display());\n        }\n        return Ok(false);\n    }\n\n    let canonical_root = fs::canonicalize(skills_dir).with_context(|| {\n        format!(\n            \"failed to resolve owned skill root {}\",\n            skills_dir.display()\n        )\n    })?;\n    let canonical_child = fs::canonicalize(child)\n        .with_context(|| format!(\"failed to resolve owned skill path {}\", child.display()))?;\n    if canonical_child.parent() != Some(canonical_root.as_path()) {\n        bail!(\n            \"owned skill path {} escapes direct root {}\",\n            child.display(),\n            skills_dir.display()\n        );","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/skills/mutation.rs#L286-L322","documentation":"validate_owned_child found the child path absent while require_existing is true, i.e. a mutation that presupposes an installed skill (update/remove/trust) was pointed at a package directory that no longer exists. The audit state is stale: the skill was deleted or never installed in this root. The missing child path is the input at fault; absence is permitted when require_existing is false (install path).","triggerScenarios":"Thrown at crates/tui/src/skills/mutation.rs:304 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Re-run a skills scan so the registry reflects what is actually on disk","Install the skill if it was never present in this root","Use the correct scope so the existing installation is found"],"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-14T00:17:10.932Z"}