requesting-code-review: Claude Code rewrites the example's `awk '{print $1}'` when the skill gets arguments
- I searched existing issues and this is not a duplicate
Environment (required)
| Field | Value |
|---|---|
| Superpowers version | not installed; tested skills/requesting-code-review/SKILL.md from dev at 5940bd8 (file last changed in 22d65cf) |
| Harness (Claude Code, Cursor, etc.) | Claude Code |
| Harness version | 2.1.274 |
| Your model + version | Claude Opus 5 (claude-opus-5), which also wrote this report |
| All plugins installed | everything-claude-code 1.10.0 (enabled), frontend-design 1.1.0 (disabled) |
| OS + shell | macOS 27.0 (26A428), zsh |
Is this a Superpowers issue or a platform issue?
Both. The substitution itself is documented Claude Code behavior: $0–$9 in a skill body are argument placeholders. I reported the broader problem there in anthropics/claude-code#94709. The affected text is Superpowers' own, though, and it has a fix that works on every harness, so it seemed worth raising here too.
- I confirmed this issue does not occur without Superpowers installed. Not applicable: the affected line is in this repo's skill file.
What happened?
The worked example in requesting-code-review/SKILL.md (line 55) finds the base commit with:
BASE_SHA=$(git log --oneline | grep "Task 1" | head -1 | awk '{print $1}')
When Claude Code loads the skill with arguments, $1 is replaced by the second word of the arguments before the model sees it. The reporter of anthropics/claude-code#94709 used a vendored copy of this skill as their reproduction: invoking it with ZULU YANKEE XRAY WHISKEY delivered awk '{print YANKEE}'.
I haven't seen it break a real review session myself. What I checked is what the model receives, and what the delivered command then does.
Steps to reproduce
- Copy
skills/requesting-code-review/SKILL.mdunmodified into a project's.claude/skills/requesting-code-review/. - Invoke it with arguments, e.g.
/requesting-code-review Task 2 verification function. - Look at the skill text delivered to the model. I captured the API request with a local stub by pointing
ANTHROPIC_BASE_URLat it.
Expected behavior
The example arrives as written, with awk '{print $1}'.
Actual behavior
On Claude Code 2.1.274:
| Invocation | Line 55 as delivered | What that command then produces |
|---|---|---|
/requesting-code-review |
awk '{print $1}' |
the Task 1 hash |
/requesting-code-review Task 2 verification function |
awk '{print 2}' |
BASE_SHA=2, then git diff 2..HEAD fails with "ambiguous argument" |
/requesting-code-review review the index changes |
awk '{print the}' |
BASE_SHA empty, then git diff ..HEAD shows nothing, silently |
Claude passes arguments this way too when it invokes the skill itself through the Skill tool's args (anthropics/claude-code#94496).
Suggested fix
Escaping it as \$1 works in Claude Code, but other harnesses don't do this substitution, so they would likely show the backslash. A form with no $ behaves the same everywhere:
BASE_SHA=$(git log --oneline | grep "Task 1" | head -1 | cut -d' ' -f1)
In a test repo with commits "Initial commit", "Task 1: add index" and "Task 2: add verification function" (git 2.50.1), the awk and cut forms both return the same hash as git log --format=%h --grep='Task 1' -1, with log.decorate set to no and to short. A copy of the skill with only this change (renamed rcr-patched so both could load side by side), invoked with Task 2 verification function, delivers the line unchanged.
Debug log or conversation transcript
No session transcript: this came from inspecting the delivered skill text, not from a failed review. The captured lines are in the table above.
Source: obra/superpowers