## Problem The Claude Code skills run the CLI through a bash-substitution prefix: ``` !`plannotator annotate $ARGUMENTS` ``` `apps/skills/claude/plannotator-annotate/SKILL.md:12`, and the same shape at line 12 of `plannotator-review` and `plannotator-last`. That expands before the model sees anything, and `$ARGUMENTS` lands in argv unquoted and unparsed. So any invocation where I tack a few words of context onto the slash command dies: ``` /plannotator-annotate and give me the URL for it -> File not found: and /plannotator-annotate the aim doc -> File not found: the ``` Bare invocation isn't better, it just prints usage: ``` /plannotator-annotate -> Usage: plannotator annotate <file.md | file.txt | file.html | https://... | folder/> ... ``` I hit this five times across three sessions before giving up and typing "use plannotator annotate for this, skill isn't working per se" so the agent would run the binary itself. Which works fine, and is what `apps/skills/core/` already tells the agent to do. ## Why it's shaped this way I'm fairly sure this is deliberate. #872 ("restore `/plannotator-*` bash execution on Claude Code") put the bang prefix back specifically so the slash command executes the binary directly instead of depending on the model to make the Bash call. That tradeoff makes sense on its own terms. The cost is that the argument slot only accepts a literal path, and nothing tells you that. `apps/skills/core/plannotator-annotate/SKILL.md` doesn't have the problem, since it uses a fenced bash block and instructs the agent to launch the command. So Codex gets the forgiving behavior and Claude Code gets the strict one, which is a surprising split once you notice it. ## Possible fixes Roughly in order of how invasive they are: 1. Have `annotate` skip leading/trailing args it can't resolve as a path or URL and use the first one that resolves. Fixes it for every host at once. 2. Keep the bang prefix but only forward the first whitespace-delimited token of `$ARGUMENTS`. Cheap, still strict, at least stops "and give me the URL for it" from being fatal. 3. Make the error actionable. `File not found: and` gives no hint that the real problem is the shape of the slash command. Naming the resolved path and mentioning that only a path or URL is accepted would have saved me most of those retries. 4. Drop the bang for the `claude/` variant and match `core/`, accepting the model dependency that #872 was trying to avoid. I'd lean toward 1 plus 3 since they help regardless of host, but happy to go whichever way you'd want it. ## Environment - plannotator 0.25.1 (latest release), verified against `main` at `0935cf08` - Claude Code on macOS - Skill at `~/.claude/skills/plannotator-annotate/`, identical to `apps/skills/claude/` on main apart from `disable-model-invocation: true`