coleam00/Archon · error · Error
Claude skill${unreachable.length === 1 ? '' : 's'} not found
Error message
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} What it means
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.
Source
Thrown at packages/providers/src/claude/provider.ts:552
);
if (unreachable.length > 0) {
const enabledRoots = [
...(skillSearch.includeProject ? ['project-local .claude/skills/'] : []),
...(skillSearch.includeUser ? ['the effective Claude config directory skills/'] : []),
];
const installLocation =
enabledRoots.length > 0
? enabledRoots.join(' or ')
: 'an enabled Claude setting source (effective settingSources currently enables none)';
const containerNote = skillSearch.isContainer
? ' Container workflows cannot use host user-global skills.'
: '';
getLog().error(
{ nodeId: nodeConfig.nodeId, unreachable, skillSearch },
'claude.declared_skills_unreachable'
);
throw new Error(
`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}`
);
}
getLog().warn(
{ nodeId: nodeConfig.nodeId, missing, skillSearch },
'claude.declared_skills_unresolved'
);
warnings.push({
code: 'claude_skills_unresolved',
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.`,
});
}
}
}
// allowed_tools → tools. `Skill` is re-added only on the workflow path, which
// is the only one that narrows `options.skills`; adding it for a non-workflowView on GitHub (pinned to 0773b97458)
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.
Example fix
// before (workflow YAML) skills: [code-review] // error: skill not found in enabled directory // after: install it first cp -r my-skills/code-review ~/.claude/skills/ skills: [code-review] # now resolves
Defensive patterns
Strategy: validation
Validate before calling
import { fs, path } from '...';
const dir = path.join(process.env.HOME!, '.claude', 'skills');
for (const s of node.skills ?? []) {
if (!fs.existsSync(path.join(dir, s, 'SKILL.md'))) {
throw new Error(`skill '${s}' not installed under ${dir}`);
}
} Try / catch
try {
await provider.sendQuery(...);
} catch (e) {
if (e.message.includes('not found in an enabled Claude-native skill directory')) {
// install the listed skills or fix the node's skill names
}
throw e;
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- claude_skills_unresolved
- Node '${node.id}': unknown provider '${provider}'. Registere
- No chat in context
- Gitea API error: ${String(response.status)} ${response.statu
- Gitea API error: ${String(response.status)}
AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01).
Data as JSON: /api/errors/d51c77ba243f6e95.
Report an issue: GitHub.