{"record":{"id":"9e5283b7fe5768c4","repo":"zeroclaw-labs/zeroclaw","slug":"skill-source-must-be-a-directory","errorCode":null,"errorMessage":"Skill source must be a directory: {}","messagePattern":"Skill source must be a directory: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/skills/audit.rs","lineNumber":48,"sourceCode":"    }\n}\n\npub fn audit_skill_directory(skill_dir: &Path) -> Result<SkillAuditReport> {\n    audit_skill_directory_with_options(skill_dir, SkillAuditOptions::default())\n}\n\npub fn audit_skill_directory_with_options(\n    skill_dir: &Path,\n    options: SkillAuditOptions,\n) -> Result<SkillAuditReport> {\n    if !skill_dir.exists() {\n        bail!(\n            \"Skill source does not exist: {}\",\n            skill_dir.display().to_string()\n        );\n    }\n    if !skill_dir.is_dir() {\n        bail!(\n            \"Skill source must be a directory: {}\",\n            skill_dir.display().to_string()\n        );\n    }\n\n    let canonical_root = skill_dir\n        .canonicalize()\n        .with_context(|| format!(\"failed to canonicalize {}\", skill_dir.display().to_string()))?;\n    let mut report = SkillAuditReport::default();\n\n    let has_canonical = canonical_root.join(SKILL_MANIFEST_FILENAME).is_file();\n    let has_deprecated = SKILL_DEPRECATED_MANIFESTS\n        .iter()\n        .any(|name| canonical_root.join(name).is_file());\n    if !has_canonical && !has_deprecated {\n        report.findings.push(format!(\n            \"Skill root must include {SKILL_MANIFEST_FILENAME} (canonical) or one of {SKILL_DEPRECATED_MANIFESTS:?} (deprecated) for deterministic auditing.\",\n        ));","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/skills/audit.rs#L30-L66","documentation":"Error \"Skill source must be a directory: {}\" thrown in zeroclaw-labs/zeroclaw.","triggerScenarios":"Thrown at crates/zeroclaw-runtime/src/skills/audit.rs:48 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Point the skill source at a directory containing SKILL.md, not a file."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}