Skip to content

test(ci): autofix の確かめ(マージしない) - #242

Closed
masseater wants to merge 6 commits into
mainfrom
test/autofix-deploy-key
Closed

masseater wants to merge 6 commits into
mainfrom
test/autofix-deploy-key

Conversation

@masseater

Copy link
Copy Markdown
Owner

autofix が deploy key で push し、pull_request の check が付くかを確かめる。確かめたら閉じる。

masseater and others added 6 commits October 25, 2026 23:10
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 が読めないため。どちらかの検査を緩めることになる。
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 を動かす前に明示的なエラーで止める。
RetryDelayExceededError の message フィールドが number 型になっていたため、
openai-codex-retry.ts で待ち時間を説明する文字列を渡す箇所が TS2322 で
typecheck に落ち、verify が失敗していた。message は人が読む説明文なので
string 型に戻す。
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.

1 participant