{"record":{"id":"d51c77ba243f6e95","repo":"coleam00/Archon","slug":"claude-skill-unreachable-length-1-s","errorCode":null,"errorMessage":"Claude skill${unreachable.length === 1 ? '' : 's'} not found in an enabled Claude-native skill directory: ${unreachable.join(', ')}. Install ${unreachable.length === 1 ? 'it' : 'them'} under ${installLocation}.${containerNote}","messagePattern":"Claude skill(.+?) not found in an enabled Claude-native skill directory: (.+?)\\. Install (.+?) under (.+?)\\.(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/providers/src/claude/provider.ts","lineNumber":552,"sourceCode":"        );\n\n        if (unreachable.length > 0) {\n          const enabledRoots = [\n            ...(skillSearch.includeProject ? ['project-local .claude/skills/'] : []),\n            ...(skillSearch.includeUser ? ['the effective Claude config directory skills/'] : []),\n          ];\n          const installLocation =\n            enabledRoots.length > 0\n              ? enabledRoots.join(' or ')\n              : 'an enabled Claude setting source (effective settingSources currently enables none)';\n          const containerNote = skillSearch.isContainer\n            ? ' Container workflows cannot use host user-global skills.'\n            : '';\n          getLog().error(\n            { nodeId: nodeConfig.nodeId, unreachable, skillSearch },\n            'claude.declared_skills_unreachable'\n          );\n          throw new Error(\n            `Claude skill${unreachable.length === 1 ? '' : 's'} not found in an enabled Claude-native skill directory: ${unreachable.join(', ')}. Install ${unreachable.length === 1 ? 'it' : 'them'} under ${installLocation}.${containerNote}`\n          );\n        }\n\n        getLog().warn(\n          { nodeId: nodeConfig.nodeId, missing, skillSearch },\n          'claude.declared_skills_unresolved'\n        );\n        warnings.push({\n          code: 'claude_skills_unresolved',\n          message: `Claude skill${missing.length === 1 ? '' : 's'} not found on disk: ${missing.join(', ')}. This is expected for Claude's built-in skills and for plugin-qualified names (plugin:skill), which the SDK resolves itself. If you meant an installed skill, check the name — an unknown name is ignored rather than loaded.`,\n        });\n      }\n    }\n  }\n\n  // allowed_tools → tools. `Skill` is re-added only on the workflow path, which\n  // is the only one that narrows `options.skills`; adding it for a non-workflow","sourceCodeStart":534,"sourceCodeEnd":570,"githubUrl":"https://github.com/coleam00/Archon/blob/0773b9745896ef0612e709c80845a0f7db315b19/packages/providers/src/claude/provider.ts#L534-L570","documentation":"applyNodeConfig validates that every skill explicitly declared on an AI node resolves to an enabled Claude-native skill directory. Declared skills are supposed to be node-scoped and explicitly installed; if a declared skill is not reachable, the provider throws rather than silently dropping it, because an unknown name would just be ignored by the SDK.","triggerScenarios":"A workflow node names a skill under `skills:` that is not installed under the enabled Claude skill directory (installLocation), or the workflow runs inside a container where only host user-global skills exist and container isolation blocks them.","commonSituations":"Typo in the skill name; skill installed in a project dir that is not enabled; running containerized workflows that reference host user-global skills (explicitly unsupported); skill removed after the workflow was authored.","solutions":["Install the named skill under the reported installLocation (enabled Claude-native skill directory).","For container runs, install the skill into the container image — container workflows cannot use host user-global skills.","Fix the skill name in the workflow YAML to match an installed skill."],"exampleFix":"// before (workflow YAML)\nskills: [code-review]\n// error: skill not found in enabled directory\n// after: install it first\ncp -r my-skills/code-review ~/.claude/skills/\nskills: [code-review]  # now resolves","handlingStrategy":"validation","validationCode":"import { fs, path } from '...';\nconst dir = path.join(process.env.HOME!, '.claude', 'skills');\nfor (const s of node.skills ?? []) {\n  if (!fs.existsSync(path.join(dir, s, 'SKILL.md'))) {\n    throw new Error(`skill '${s}' not installed under ${dir}`);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  await provider.sendQuery(...);\n} catch (e) {\n  if (e.message.includes('not found in an enabled Claude-native skill directory')) {\n    // install the listed skills or fix the node's skill names\n  }\n  throw e;\n}","preventionTips":["Keep skills installed under the enabled directory before running workflows referencing them.","Validate skill names in workflow YAML against the installed directory in CI.","For container runs, bake required skills into the image — host user-global skills are unavailable."],"tags":["claude","skills","provider","configuration"],"backgroundTag":"declared-skill-not-found","analyzedSha":"0773b9745896ef0612e709c80845a0f7db315b19","analyzedAt":"2026-09-01T02:28:07.064Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}