Problem
skills/audit/context/audit.md (claude-memory 0.13.3) gives its discovery and check commands as
bash "${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/<script>.sh" (7 occurrences). The harness
substitutes ${CLAUDE_PLUGIN_ROOT} in the SKILL.md body it renders, but context/audit.md is read
later with the Read tool, so the literal variable reaches the Bash tool. There it is unset:
$ echo "root=[${CLAUDE_PLUGIN_ROOT:-unset}]"
root=[unset]
Run as written, each command resolves to /skills/audit/scripts/... and fails. In the run that
found this, discovery only worked after the model set the variable by hand. A less careful run
would skip discovery, M2, RD1, or N1, or fall back to a bare find ., which the file itself warns
misses user-scope surfaces.
Where seen
/playbooks:repo-sweep next, claude-memory step, against melodic-software/.github
(sweep PR melodic-software/.github#153), Claude Code on WSL2.
Suggested fix
Have the spoke files avoid the variable: either give the script paths relative to the skill
directory and state in SKILL.md (where substitution runs) the absolute directory they resolve
against, or route every check through audit-spine.sh, whose path SKILL.md already renders
substituted. Worth checking the plugin's other spoke files for the same pattern.
🤖 Generated with Claude Code
Problem
skills/audit/context/audit.md(claude-memory 0.13.3) gives its discovery and check commands asbash "${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/<script>.sh"(7 occurrences). The harnesssubstitutes
${CLAUDE_PLUGIN_ROOT}in the SKILL.md body it renders, butcontext/audit.mdis readlater with the Read tool, so the literal variable reaches the Bash tool. There it is unset:
Run as written, each command resolves to
/skills/audit/scripts/...and fails. In the run thatfound this, discovery only worked after the model set the variable by hand. A less careful run
would skip discovery, M2, RD1, or N1, or fall back to a bare
find ., which the file itself warnsmisses user-scope surfaces.
Where seen
/playbooks:repo-sweep next,claude-memorystep, againstmelodic-software/.github(sweep PR melodic-software/.github#153), Claude Code on WSL2.
Suggested fix
Have the spoke files avoid the variable: either give the script paths relative to the skill
directory and state in SKILL.md (where substitution runs) the absolute directory they resolve
against, or route every check through
audit-spine.sh, whose path SKILL.md already renderssubstituted. Worth checking the plugin's other spoke files for the same pattern.
🤖 Generated with Claude Code