Claude Media
claude-code-actionでAJV検証エラーが起きたときの切り分け方

claude-code-actionでAJV検証エラーが起きたときの切り分け方

claude-code-actionのログに出るAJVのコード断片は、エラーの本文ではないと報告されています。本当のエラーを表に出す手順と、効果があった回避策を示します。

このTipsでできること

anthropics/claude-code-action@v1のレビューが数十秒で終わり、ログにAJV(JSON Schemaの検証ライブラリ)のコード断片が並ぶことがあります。この断片を読み込んでも、原因には届きません。

GitHubのIssueでは、同じ見た目の失敗が別々の原因で起きたと報告されています。認証エラー、クレジット残高不足、廃止済みモデルへの404、claude_argsの指定ミスなどです。

この記事は、2026年1月に#852で報告されたSDK更新直後の事例を起点にします。扱うのは、断片の読み方、本当のエラーを表に出す設定、効果の報告があった回避策です。原因を4系統に分けて見分ける手順は、「SDK execution error」でclaude-code-actionが落ちる原因と対処法にあります。

どんなエラーが出るか

失敗したランは、次のような短い結果と例外を残します。

{
  "type": "result",
  "subtype": "success",
  "is_error": true,
  "duration_ms": 261,
  "num_turns": 1,
  "total_cost_usd": 0,
  "permission_denials": []
}
SDK execution error: 14 |     depsCount: ${Q},
15 |     deps: ${$}}`};var Mj={keyword:"dependencies",type:"object",schemaType:"object", ...
error: Claude Code process exited with code 1
      at $ (.../node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs:19:7668)

is_errorはtrueなのにsubtypeはsuccessで、num_turnsは1です。#892の報告者も、この矛盾した表示とtotal_cost_usd: 0を特徴として挙げています。

コスト0が示すのは、課金される応答まで進まなかったことです。認証に失敗したリクエストも0ドルで終わります。「APIに届く前に落ちた」とは言い切れません。#852では実際に、クラッシュの前に401が記録されていました。

スタックトレースのkeyword:"dependencies"は、AJVが持つdependenciesキーワードの検証コードです。claude-code-actionは@anthropic-ai/claude-agent-sdkを使っています。sdk.mjsはminify済みで配布されるため、変数名が1〜2文字に潰れた断片がそのまま例外メッセージに出ます。

#852のタイトルは「SDK 0.2.15 causes AJV validation error」です。SDK 0.2.9のランは3分53秒で成功し、0.2.15のランは26秒で失敗したと書かれています。この対比が、SDKの更新を疑う根拠になりました。

断片は原因ではないという報告

2026年7月、#892に別の見立てが届きました。報告者は、ログの圧縮コードは子プロセスが落ちた位置の周辺を実行環境のBunが表示しているだけで、実際のエラーではないと述べています。AJVや認証処理の内部を読み解こうとして、1日を費やしたとも書いています。

この報告者の原因は、claude_argsに入れた--output-format jsonでした。フラグを外すと初回の実行から動いたそうです。--model、--max-turns、--allowedToolsは残しても問題なかったとあります。

Claude Code v2.1.289のclaude --helpでは、このフラグは次のように説明されています。

claude --help | grep -A4 -e '--output-format <format>'
  --output-format <format>              Output format (only works with --print):
                                        "text" (default), "json" (single
                                        result), or "stream-json" (realtime
                                        streaming) (choices: "text", "json",
                                        "stream-json")

出力形式を変える指定は、--printと組み合わせる項目として説明されています。アクションの内部がどの形式でCLIと通信しているかは、この出力からは分かりません。報告者はアクション側の通信がstream-jsonだと説明しています。自分のclaude_argsに出力形式の指定があるなら、真っ先に外して試す価値があります。

AJVの名前が出るエラーは、--json-schemaに渡したスキーマが原因の場合もあります。そちらはClaude Code --json-schemaエラーの直し方で扱っています。

本当のエラーを表に出す手順

手順

ログの断片から離れて、原因を出す順番

  1. 1

    結果JSONで失敗の型を見る

    duration_msが数百ミリ秒、total_cost_usdが0なら、モデルの応答に進む前に子プロセスが終了しています。今回の切り分けはここから始まります。

  2. 2

    子プロセスのエラーを出す

    7月の報告者は、ステップにenv: DEBUG_CLAUDE_AGENT_SDK: "1"を足すと、子プロセスの最後のメッセージがログに出るようになったと書いています。show_full_output: trueだけでは、子プロセスが起動直後に落ちた場合は出力が空だったそうです。

  3. 3

    出たエラーで分岐する

    401 Invalid bearer tokenなら認証です。Credit balance is too lowなら残高です。not_found_errorならモデルIDです。出力形式の指定が原因なら、claude_argsを見直します。

  4. 4

    どれにも当たらないときだけ版を固定する

    CLIの実行ファイルを固定する方法は、後の節で扱います。

show_full_output: trueは、Claudeの全メッセージとツール実行結果をログに出します。action.ymlには、シークレットが含まれうること、GitHub Actionsのログが公開される場合があることを警告する説明が付いています。公開リポジトリでは、デバッグの間だけ有効にします。

- uses: anthropics/claude-code-action@v1
  env:
    DEBUG_CLAUDE_AGENT_SDK: "1"
  with:
    anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
    prompt: "Review this pull request"

同じ見た目で報告された別々の原因

Issueのコメントを時系列に並べると、断片は同じでも原因が違います。

時期条件報告された内容
2026年1月23日条件claude_code_oauth_token、show_full_output: true報告された内容401 Invalid bearer tokenが記録されていた。anthropic_api_keyに替えて解消したと投稿
2026年2月2日条件SDK 0.2.22・0.2.25・0.2.29のSHA固定報告された内容どれも同じ失敗。最小構成でも再現したと報告
2026年2月4日条件SDK 0.2.31を含むリリース、anthropic_api_key報告された内容再発したと報告
2026年2月23日条件@v1が導入するClaude Codeがv2.1.49になった日報告された内容以前は動いていた複数のリポジトリで同じ失敗が始まったと報告。ログには「Claude Code initialized」の後に結果JSONが出ていた
2026年3月10日条件@betaに替えて実行報告された内容Credit balance is too lowが読めた。残高を直すとv1とbetaの両方で動いたと報告
2026年5月20日条件既定モデルがclaude-sonnet-4-20250514報告された内容not_found_errorの404が圧縮コードに隠れていた。--modelで現行のモデルIDを指定して解消
2026年7月9日条件claude_argsに--output-format json報告された内容フラグを外して解消

5月の報告では、@v1では圧縮コードしか出ず、@betaでは404が結果JSONに読める形で出たと書かれています。ただし7月の報告者は、@betaはmode: tagのような別の入力体系で、promptを使う自動化構成では動かないと述べています。原因の切り分けに@betaを使えるのは、タグ起動のワークフローに限られそうです。

2月3日の#892には、claude_argsを外すと動いたというコメントもあります。この報告者の構成はanthropic_api_key、track_progress: true、additional_permissionsだけでした。

別の報告者は、リポジトリの.mcp.jsonにMongoDBやSalesforceなど複数のMCPサーバー定義があり、それが検証の失敗を招いているのではと推測しています。ただしこれは推測の段階で、スレッドでは裏付けられていません。claude_argsや.mcp.jsonを疑うときは、最小の構成から1項目ずつ足して、落ちる項目を探します。

2月7日のコメントには「トークンのクレジットを足す必要があった」とあり、4日後に「クレジットはあるのに同じエラーが出る」という返信が付いています。残高が原因のケースと、そうでないケースが混ざっていたことが分かります。

版を固定しても直らなかった報告

最初に試したくなるのは、アクションやSDKの版を戻すことです。スレッドには、効いた報告と効かなかった報告が並んでいます。

くらべる

何を固定するか

直らなかった報告

アクションやSDKの版

SDKが^0.2.9を指定するv1.0.30にピン留めしたところ、別の例外が出たそうです。直近2つのリリースを順に試した報告もあり、LinuxとmacOS(arm)のどちらでも解消しませんでした。#892ではSHA固定(SDK 0.2.25)でも落ちています。一方でSHA固定が効いたという報告もあり、2月6日と2月23日に投稿されています。

解決した報告

Claude Code CLIの実行ファイル

npmで@anthropic-ai/claude-code@2.1.18を入れ、path_to_claude_code_executableで指す方法です。2026年2月4日に報告者の一人が解決したと投稿し、同月28日には別のコメントが確実な修正として再掲しています。

回避策: CLIの実行ファイルを固定する

path_to_claude_code_executableは、アクションによる自動インストールを飛ばして、指定した実行ファイルを使う入力です。バンドルされるSDKではなく、CLI本体の版を固定する点が、SDKだけを戻す対処と違います。報告された設定は次のとおりです。

- name: Install a pinned Claude Code version
  run: |
    sudo rm -f /usr/local/bin/claude
    npm install -g @anthropic-ai/claude-code@<動作確認済みのバージョン>
    CLAUDE_BIN=$(which claude)
    echo "CLAUDE_PATH=$CLAUDE_BIN" >> $GITHUB_ENV
 
- name: Run Claude Code Action
  uses: anthropics/claude-code-action@v1
  with:
    anthropic_api_key: ${{ secrets.key }}
    path_to_claude_code_executable: ${{ env.CLAUDE_PATH }}

action.ymlの説明には、古い版を使うと、アクションが新しいClaude Codeの機能を使い始めたときに問題が出うるという警告があります。この入力は、特定の問題をデバッグするときや、特殊な環境向けとされています。

固定した版には、将来のアクションやCLI側の修正が届きません。2026年2月の報告で使われた2.1.18をそのまま写すと、それ以降の修正も受け取れなくなります。自分の環境で動いた比較的新しい版を選び、番号の理由をコメントに残しておくと、固定したまま放置されるのを避けやすくなります。

アクションのパラメータ全体はGitHub ActionsのパラメータとCLI引数をClaude Codeで渡すにまとめています。

認証方式を替える前にキーを単体で確かめる

action.ymlでは、claude_code_oauth_tokenがanthropic_api_keyの代替として定義されています。docs/usage.mdにも入力として載っているため、#852には「入力が正規なのに、替えないと動かないのはバグではないか」という指摘が付きました。

認証方式を替えて解決した報告がある一方、OAuthトークンで最小構成にしてもSHA固定のまま同じ失敗が出た報告があります。替えること自体を最初の対処にするより、キーが有効かどうかを先に見るほうが早く済みます。

APIキーは、ワークフローを介さずローカルの端末で確かめられます。#852の報告者は、api.anthropic.com/v1/messagesへ直接curlする方法を使っています。

curl https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{"model":"claude-sonnet-4-20250514","max_tokens":100,"messages":[{"role":"user","content":"Hello, Claude!"}]}'

無効なキーでは、invalid x-api-keyというメッセージのauthentication_errorが返ります。このコマンドのモデルIDは報告者が使ったものです。5月の報告では、このIDがすでに404を返しています。自分で試すときは、現行のモデルIDに替えます。

ワークフローのSecretsに登録した値と、手元のcurlに使った値が同じ文字列かどうかも見ます。コピー漏れや改行の混入が原因になることがあります。

CLI本体のログインに関する認証エラー(OAuth token revokedなど)は、経路が別です。ローカルの再ログインで直る種類は「OAuth token revoked」の対処にあります。導入時の認証設定はClaude CodeをGitHub Actionsに組み込むで確認できます。

まとめ

ログのAJV断片は原因ではなく、子プロセスが落ちた位置の表示だと報告されています。まずDEBUG_CLAUDE_AGENT_SDKで本当のエラーを出し、認証・残高・モデルID・claude_argsのどれに当たるかを決めます。

CLIの実行ファイル固定は、どれにも当たらないときの手段です。固定する版は、動作を確かめた新しめの番号にします。

この記事を共有:XはてブLinkedIn