GitHub ActionsのClaude自動レビューでコメントしてくれない問題とその対処法

GitHub ActionsのClaude自動レビューでコメントしてくれない問題とその対処法

Github Actions + Claude Codeの運用でPRコメント投稿に失敗していた問題に遭遇しました。原因と解決方法を紹介します。
2026.09.17

ベルリンオフィスの小西です。

最近、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は「権限がないのか」と解釈して、別の方法で勝手にリトライを試みます。

  1. gh pr comment --body '...' → 改行+#でブロック
  2. cat > /tmp/file + gh pr comment --body-file → file redirectでブロック
  3. Write /tmp/file → 作業ディレクトリ外でブロック
  4. Write ./file → Write権限なしでブロック
  5. 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つ:

  1. ##見出し禁止 + **太字**使用の指示 : 改行+#パターンを回避
  2. gh pr commentでの投稿を明示的に指示 : 指示がないとClaudeがテキスト出力だけで終わる場合がある
  3. 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_turnspermission_denials_count などの実行統計をログに出力してくれます。これらの数値が膨らんでいたらその分実行時間とコストがかかっているということなので、こまめにログを確認したほうがいいということですね。

参考


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AI白書

関連記事