requesting-code-review: Claude Code rewrites the example's `awk '{print $1}'` when the skill gets arguments

Author: errmakovCreated Sep 17, 2026Updated Sep 17, 2026
  • 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

  1. Copy skills/requesting-code-review/SKILL.md unmodified into a project's .claude/skills/requesting-code-review/.
  2. Invoke it with arguments, e.g. /requesting-code-review Task 2 verification function.
  3. Look at the skill text delivered to the model. I captured the API request with a local stub by pointing ANTHROPIC_BASE_URL at 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.