
GitHub ActionsのClaude自動レビューでコメントしてくれない問題とその対処法
ベルリンオフィスの小西です。
最近、GitHub上でPRを作成するとClaudeが自動でコードレビューしてくれる仕組みを運用しています。これには claude-code-action というAnthropic公式のGitHub Actionを使っていて、GitHub ActionsからClaude Codeを実行してPRレビューやIssue対応を自動化できます。
ある日「Claudeがレビュー内容を生成している(= ログに出力されてる)のに、PRにコメントが投稿されない」という問題に遭遇しました。ジョブ自体は success で終わるので原因特定に地味に時間がかかりました。今回はこの原因調査と解決策を共有します。
環境
- GitHub Actions +
anthropics/claude-code-action@v1 - AWS Bedrock経由(OIDC認証)
- モデル:
us.anthropic.claude-sonnet-5
何が起きていたか
PRが作成されると claude-code-action が起動し、Claudeがレビュー内容を生成するところまでは正常に動きます(GH Actionsログも正常に終了)。ただ、最終的にPRへのコメント投稿が行われない。
show_full_output: true を有効にしてログを確認すると、以下の状態でした。
permission_denials_count: 9: 9回のパーミッション拒否が発生num_turns: 17: 17ターンも消費- Claudeがコメント投稿のために様々な方法を試みるが、すべてブロックされている
原因: BashセキュリティヒューリスティクスによるMarkdown見出しの誤検知
Claude Code CLIには、Bashコマンドの実行前にコマンド文字列を静的解析するセキュリティチェック機能が組み込まれています。プロンプトインジェクション対策として、ユーザー入力がシェル経由で実行されるのを防ぐ目的のものです。
問題は、Claudeが gh pr comment --body '...' でレビューコメントを投稿しようとした際に発生してます。コメント本文にMarkdownの見出し(##)が含まれると、validateQuotedNewline というヒューリスティクスが反応します。
gh pr comment 1 --body '<details>
...
## レビューチェックリスト ← ここでブロック
...
'
エラーメッセージはこう:
"Newline followed by # inside a quoted argument can hide arguments from path validation"
シェルでは # 以降がコメントとして解釈される場合があるため、引数のバリデーションを回避する攻撃パターンとみなされるわけです。
なぜ設定で回避できないのか
このヒューリスティクスはパーミッションモジュールの手前で動作します。
Bash AST Parser(ここでブロック)← 回避不可
|
[ショートサーキット]
|
Permissions Module(allowedToolsはここで効く)
つまり --allowedTools を設定しても、--permission-mode bypassPermissions にしても、このチェックは通過できません。
この問題はClaude Codeの既知のissueとして報告されています。
Claudeのリトライ挙動
ブロックされるとClaudeには permission_denied として返ります。Claudeは「権限がないのか」と解釈して、別の方法で勝手にリトライを試みます。
gh pr comment --body '...'→ 改行+#でブロックcat > /tmp/file+gh pr comment --body-file→ file redirectでブロックWrite /tmp/file→ 作業ディレクトリ外でブロックWrite ./file→ Write権限なしでブロックgh pr comment --body '...'(##を**太字**に変更)→ 成功する場合もある
ちなみに gh pr comment の代わりに gh api 経由でコメント投稿を試してみましたが、結局リクエストボディにMarkdownの ## が含まれる限りダメでした。
最終的に成功するかはClaudeが生成するMarkdownのフォーマット次第です。結果が不安定になります(問題なくコメントしてくれる時もある)。
解決策: プロンプトに「##を使うな」と書く
結局はプロンプトにフォーマットルールを追加して解決しました。
prompt: |
You are reviewing PR #${{ github.event.pull_request.number }} in ${{ github.repository }}.
Please review this pull request and provide feedback on:
- Code quality and best practices
- Potential bugs or issues
- Performance considerations
- Security concerns
Organize all detailed feedback within a single collapsed section
using a <details> and <summary> tag.
Be constructive and helpful in your feedback.
IMPORTANT FORMATTING RULES:
- Do NOT use markdown headings (##, ###). Use **bold text** instead for section titles.
- This is required to avoid shell escaping issues when posting comments.
After completing your review, you MUST post the review as a comment
on this PR using `gh pr comment`.
主な変更点は3つ:
##見出し禁止 +**太字**使用の指示 :改行+#パターンを回避gh pr commentでの投稿を明示的に指示 : 指示がないとClaudeがテキスト出力だけで終わる場合がある- PR番号・リポジトリ名の明示 : detached HEADで
gh pr viewが失敗する対策
修正前後の比較
| 指標 | 修正前 | 修正後 |
|---|---|---|
| permission_denials | 9 | 0 |
| num_turns | 17 | 5 |
| cost | $0.69 | $0.15 |
| duration | 125秒 | 48秒 |
| コメント投稿 | されなかった | 成功 |
コストは約78%、所要時間は約62%削減できました。よかった。
ワークフロー全体の定義(参考)
ワークフロー全体のYAML
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
claude-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v5
with:
fetch-depth: 1
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-east-1
- name: Run Claude Code Review
id: claude-review
uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
claude_args: |
--model us.anthropic.claude-sonnet-5
--allowedTools "Bash(gh pr view:*),Bash(gh pr list:*),Bash(gh pr diff:*),Bash(gh pr comment:*),Bash(gh api:*),Bash(git diff:*),Bash(git log:*),Bash(git show:*),Bash(git fetch:*),Bash(git show-ref:*)"
prompt: |
You are reviewing PR #${{ github.event.pull_request.number }} in ${{ github.repository }}.
Please review this pull request and provide feedback on:
- Code quality and best practices
- Potential bugs or issues
- Performance considerations
- Security concerns
Organize all detailed feedback within a single collapsed section
using a <details> and <summary> tag.
Be constructive and helpful in your feedback.
**Important: Translate all your feedback into Japanese before posting.**
IMPORTANT FORMATTING RULES:
- Do NOT use markdown headings (##, ###). Use **bold text** instead for section titles.
- This is required to avoid shell escaping issues when posting comments.
After completing your review, you MUST post the review as a comment
on this PR using `gh pr comment`.
補足: Bashセキュリティヒューリスティクスで注意すべきその他のパターン
改行+# 以外にも、以下のパターンがブロック対象になるようです。
- バッククォート(
`): コマンド置換と判定。Markdownのコードブロックも該当の可能性あり $(...): コマンド置換- リダイレクト(
>、>>、<): ファイル書き換え - ブレース展開(
{a,b}): パス難読化 - 複合コマンド(
;、&&の一部パターン): 静的解析不能
claude-code-action でBashツール経由の出力が期待通りに動かない場合は、出力内容にこれらのパターンが含まれていないか確認してみてください。
補足: OIDC認証の変更点
直接的には関連しませんが、2026年7月15日以降に作成されたGitHubリポジトリでは、OIDCトークンの sub クレームに immutable subject が自動的に有効化されるようになっています(GitHubダッシュボードのOIDC設定画面で確認)。
- 通常の
sub:repo:owner/repo-name:ref:refs/heads/main - immutable
sub:repo:owner@12345/repo-name@67890:ref:refs/heads/main
IAMロールの信頼ポリシーでimmutable形式に合わせる必要があります。
{
"Condition": {
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:owner@12345/repo-name@67890:*"
}
}
}
GitHub側のOIDC設定は Settings → Actions → General → "OIDC configuration" で確認できます。
まとめ
claude-code-action はデフォルトで num_turns や permission_denials_count などの実行統計をログに出力してくれます。これらの数値が膨らんでいたらその分実行時間とコストがかかっているということなので、こまめにログを確認したほうがいいということですね。








