Skip to content

fix(ci): autofix の起動直後に Claude の token と残量を確かめ、走れない理由を出して止める - #237

Closed
masseater wants to merge 4 commits into
mainfrom
fix/autofix-auth-preflight
Closed

masseater wants to merge 4 commits into
mainfrom
fix/autofix-auth-preflight

Conversation

@masseater

@masseater masseater commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

autofix が verify の失敗で起動したとき、まず Claude の token と残量を確かめるようにした。直せたら修正コミットを deploy key で push し、その head に必須の check が付く。直せないときはその理由をログに出して終わる。

  • 原因 1: 認証は通っていた。ANTHROPIC_API_KEY が空なのは claude-code-action の仕様で、実際には CLAUDE_CODE_OAUTH_TOKEN で動いている。直近 40 件の run は、どれも token のサブスクが 7 日の上限に達して You've hit your weekly limit で止まっていた。
  • 原因 2: autofix のジョブには verify ジョブにある vp run hydrate:model-data が無く、gitignore された model data が無いままだった。そのため Claude が直しても vp run verify が通らず、コミットまで進めなかった。
  • 原因 3(autofix が push した修正コミットに必須チェック commits が付かず、PR が BLOCKED のまま残る #241): autofix は GITHUB_TOKEN で push していたので、pull_request の workflow が起動せず、必須の commits が付かないまま PR が BLOCKED に残っていた。
  • 変更
    • checkout の直後に .github/scripts/claude-preflight.sh を動かす。secret が空なら Claude を呼ばずに落ちる。401 なら拒まれたこと、429 なら認証は通ったが上限で走れないことを ::error:: に出して止める。
    • Claude がコミットせずに終わったときと失敗したときは、Claude の答えを ::error:: に出す。
    • autofix に model data の生成を足した。tools/checks/autofix-environment.test.ts が、autofix の準備の step が verify ジョブと同じかを確かめる。
    • push は、Claude を動かす job とは別の job で、このリポジトリだけに書ける deploy key(AUTOFIX_DEPLOY_KEY)を使って行う。secret が空なら Claude を動かす前に止める。claude/fix-verify-* の枝への push でも verify・commits・up-to-date が走る。
  • 確かめ(わざと型エラーを入れた枝。確かめのあと PR を閉じて枝を消した)
    • PR test: autofix の確かめ(マージしない) #238: 40191508404 は週の上限で走れないことを約 25 秒で出して止まった。40195459535 は失効した token で 401 で止まった。40195547051 は残量のある token で修正 f262de0 をコミットした。
    • PR test(ci): autofix の確かめ(マージしない) #242(deploy key の push): verify 40203229489 の失敗で autofix 40203366936 が起動し、修正 8b2561e を push した。その head で pull_request の verify 40207396566・commits 40207396552・up-to-date 40207396568 がすべて success になり、PR は MERGEABLE / CLEAN になった。

Closes #241

autofix が failure で終わる原因は、ANTHROPIC_API_KEY が空なことではない。
claude-code-action は claude_code_oauth_token を受け取ると、ANTHROPIC_API_KEY を空のまま
CLAUDE_CODE_OAUTH_TOKEN で動く。token は認証されていた。直近 40 件の run はどれも、
token のサブスクが 7 日の上限に達していて、Claude が 1 ターン目に
「You've hit your weekly limit」を返して止まっていた。依存の導入と toolchain の準備に
約 80 秒かけた後で is_error だけが出るので、原因が読めなかった。

checkout の直後に .github/scripts/claude-preflight.sh を動かし、Claude Code に 1 回答えさせる。
secret が空なら Claude を呼ばずに落ちる。401 なら token が拒まれたことを、429 なら
認証は通ったがサブスクの上限で走れないことと、解除の時刻を ::error:: に出して止める。
API を直接呼ばず CLI を使うのは、サブスクの OAuth token は Claude Code からの呼び出しでないと
受け付けられないため。

認証は今の CLAUDE_CODE_OAUTH_TOKEN(Claude サブスクの setup-token)のまま使う。
従量課金の API キーに替えると課金が発生するが、サブスクの token なら追加の費用がかからないため。
Claude がコミットせずに終わると、ログには「Claude did not commit a fix」しか残らなかった。
claude-code-action は Claude の出力を伏せるので、直せなかった理由をどこからも読めなかった。
確かめに使った run では、Claude は 14 ターン動いて成功で終わったのにコミットがなく、
理由が分からなかった。

コミットがないときと Claude が失敗したときは、claude-execution-output.json の最後の result を
::error:: に入れる。複数行の答えも annotation に収まるよう、%・CR・LF を GitHub の書式で
エスケープする。
確かめの run で Claude は 14 ターン、約 24 分動いたが、コミットせずに終わった。
libs/ai/src/providers/data/ は gitignore されていて、verify ジョブだけが
`vp run hydrate:model-data` で生成している。autofix のジョブは verify のセットアップを
写したときにこの step を落としていたので、Claude が直しても `vp run verify` が通らず、
「通るまで繰り返してからコミットする」という指示どおりにコミットまで進めなかった。

autofix に同じ step を足した。2 つのワークフローの準備手順がまたずれないよう、
tools/checks/autofix-environment.test.ts が、verify ジョブの checkout から verify の
実行までの step と、autofix の target から Claude までの step(if を除く)が同じかを確かめる。
composite action にまとめなかったのは、zizmor が `./` の参照に self-repository の指摘を出し、
推奨の `$/` は actionlint 1.7.12 が読めないため。どちらかの検査を緩めることになる。
@masseater
masseater force-pushed the fix/autofix-auth-preflight branch from 840cc4a to 2d2afbb Compare October 25, 2026 14:10
autofix は GITHUB_TOKEN で push していたので、push しても pull_request の workflow が
起動せず、必須の commits が付かないまま PR が BLOCKED に残っていた(#241)。
GITHUB_TOKEN が起こしたイベントでは workflow_dispatch 以外の workflow が走らないため。

- push には、このリポジトリだけに書ける deploy key(secret AUTOFIX_DEPLOY_KEY)を使う。
  GitHub App はブラウザでの作成が要り、ここでは作れない。deploy key は gh だけで作れ、
  権限がこのリポジトリに閉じ、release の Homebrew tap と同じ形で使える。
- Claude を動かす job からは書き込み権限を外し、push は別の job で、deploy key で
  checkout してから行う。Claude が書き換えた環境(PATH や git の設定)に鍵を渡さないため。
  Claude の commit は bundle で渡し、失敗した commit の子孫であることを確かめてから push する。
- push で pull_request の check が走るので、verify と up-to-date の workflow_dispatch はやめた。
- main の失敗を直す claude/fix-verify-* の枝は、PR を GITHUB_TOKEN で開くので
  pull_request が起動しない。この枝への push で verify・commits・up-to-date を走らせ、
  同じ head に必須の check を付ける。新しい枝の push では before が無いので、commits は
  main との merge base から検査する。deploy は main の push だけで動かす。
- deploy key の push では actor が github-actions[bot] にならず、verify 側の actor の条件では
  autofix 自身の修正の失敗で autofix が繰り返し起動しうる。失敗した commit の author が
  autofix なら、起動直後に理由を出して止める。
- secret AUTOFIX_DEPLOY_KEY が空なら、Claude を動かす前に明示的なエラーで止める。
@masseater

Copy link
Copy Markdown
Owner Author

autofix の CI 自体を消す方針にしたため、認証を直すこの PR は閉じる。削除は #251。

@masseater masseater closed this Oct 27, 2026
@masseater
masseater deleted the fix/autofix-auth-preflight branch October 27, 2026 06:35
masseater added a commit that referenced this pull request Oct 27, 2026
verify が落ちたときに Claude を動かして修正を push する仕組みだった。
push した commit には必須 check が付かず(#241)、認証を直す #237 も
deploy key・preflight・専用テストと足し続ける形になっていた。
直す対象ごと要らないと判断し、足すのをやめて消す。

main に残っていた autofix の参照は autofix.yml と verify.yml の autofix job、
ci-telemetry の needs だけで、専用の script・テスト・docs は無い。
autofix だけが使っていた Actions secret AUTOFIX_DEPLOY_KEY と
CLAUDE_CODE_OAUTH_TOKEN は他の workflow が使わないので別途消す。

Msa-Merge: 68a43e05-afaa-4095-9756-f6fc5b69030e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

autofix が push した修正コミットに必須チェック commits が付かず、PR が BLOCKED のまま残る

1 participant