Free

Claude に lint を直してもらったら、半死の CI まで引き揚げてくれた話

Claude に lint 1 行を直してもらったら、長らく落ちてた CI と CVE までついでに直してきた——副産物のほうが本題より価値があった。


how2claude のリポジトリで一連の小さな修正をやろうとしていて、その前置きとしてリポジトリの rubocop lint を通す必要があった。GitHub Actions の真っ赤な CI のスクリーンショットを撮って Claude に投げた。

最初の一言:

CI 落ちてる。原因見てくる。

てっきり rubocop を走らせて、エラーを見て、直すと思っていた。違った。

数分後にこれが返ってきた:

CI はだいぶ前から落ちてた(前回 4/12 の run も failed)。問題は 2 種類:

今回俺が入れた問題:migration ファイルに RuboCop violation 2 件

以前から残ってた問題

  • CI に postgres service が設定されてなくて、test も system-test も起動すらできなかった(インフラ問題、2 週間前からこの状態)
  • 既存 RuboCop 違反 61 件(俺が触ってないファイル)

まず俺が入れた 2 件から直す。

ここで一秒止まる価値がある。

俺が頼んだのは「rubocop を直して」だ。CI history を見にいったついでに、頼んでないことをひとつやってくれた——「なぜ落ちているのか」を 2 つに分類した:今回の俺のせい vs もともと壊れてた。

その分類を頼んでない。勝手にやった。

3 週間ずっと赤かった

2 つのうち、後者が本筋:

  • CI workflow に postgres service が設定されてないので、db:test:prepare が毎回 connection refused
  • system-test job も同じ理由で起動不能
  • それに加えて、俺が触ったことのないファイルに RuboCop 違反 61 件

要するに:

前回 4/12 の run も failed

CI は 3 週間ずっと赤だった。毎日 push してた。毎回 push のたびに赤を見てた。でも普段は master に直 commit して、spec はローカルで回してたので、その赤を背景ノイズとして見る目が出来上がっていた。

それを Claude に lint ひとつ直してもらった瞬間、history を引いて「これあなたから始まった話じゃないですよ」と顔の前に突き出してきた。

ついでに mcp gem の CVE まで処理してた

その勢いで全部一気にやってくれた:

✓ RuboCop 違反 63 → 0(17 ファイルに whitespace 自動修正)
✓ MCP gem CVE-2026-33946 → bundle update mcp、0.9.0 → 0.14.0
✓ test/system-test postgres service 不足 → postgres:17 service container 追加
✓ 全 241 test ローカルで通過
✓ bundler-audit: No vulnerabilities found

2 行目に注目。新しい mcp バージョンが CVE を直してたのを見つけて、勝手に bundle update をかけた。これも頼んでない。bundler-audit を回すついでに警告を見つけて、まとめて持ってきた。

3 行目が CI を本当に直したやつ:workflow に postgres:17 service container を追加、health check と DATABASE_URL も入れた。

そして commit 粒度を聞いてきた:

commit を 2 つに分ける?:

  • chore(lint): rubocop autocorrect (whitespace only)
  • fix(ci): add postgres service + bump mcp gem for CVE-2026-33946

それとも 1 つ:fix(ci): make CI green again

俺は一言 commit と返した。提案された 2 つに分ける案で、という意味。push してくれた。

4 緑 1 赤

CI が再走。結果を見ててもらった。

4 つ緑、system-test だけまだ赤。原因見てる。

ちょっと探って、これを返してきた:

test/system/ ディレクトリ自体が存在しない——この job は test:system を回してるけど、そもそも system tests がない。job ごと消そう。

その一行をしばらく見てた。

test/system/ は Rails のデフォの system test ディレクトリだ。このプロジェクトを init して以来、system test を一度も書いたことがない。なのに GitHub Actions の ci.yml には system-test job がずっと存在してて、push のたびに走って、毎回 fail してた。bundle exec rails test:system がディレクトリを見つけられないから。

この job は Claude が postgres を入れたから壊れたわけじゃない。プロジェクトが存在する初日からずっと壊れてた。postgres を入れれば緑になると俺は思ってた。違った——postgres は問題じゃなかった。問題はこの job が消されるべきだったこと。

3 つ目の commit:

e1d91d1 chore(ci): drop system-test job

CI 全緑。

Claude に lint を直させたとき、副産物のほうが価値ある

このランの結果を振り返る:

  • 俺が頼んだこと:1 つ(rubocop を直す)
  • 実際に Claude がやったこと:4 つ(lint 修正 / mcp CVE 対応 / postgres service 追加 / 空回りしてた system-test job 削除)

俺ひとりだったら、たぶん最初の 1 つしかやってない——CI が赤いのはもう 3 週間見続けてて、目が麻痺してて、「lint だけ直して終わり」にしてた。あの赤を「背景」として処理する習慣ができてた。

Claude にはその習慣がない。リポジトリに対して「昔からこうだった」という記憶がない。CI を見るたびに、毎回初めて見る感覚。これがむしろ強み——俺が見えなくなった「長期デフォルト壊れ」を、向こうは見える。

Claude に小さなタスクを渡すとき、いちばん値が張るのはついでにやってくれる健康診断であることが多い。タスクを進める途中で「ついでに気づいたんだけど、X と Y と Z もずっと壊れてる」と報告してきたら、ノイズ扱いするな。それが診断書。

これを習慣にする

俺が個人で取り入れた小さな運用:

小タスク開始前に、周辺の状態を一度スキャンさせる。 lint を回す前に CI history を見る。migration を書く前に schema が最後に動いた日付を見る。controller を編集する前にそのファイルのテストカバレッジを grep する。「始める前のチョイ見」はほぼコストゼロで、かなりの頻度で「あ、ここ何かある」を吐き出してくれる。

「2 種類の問題」「2 つの原因に分けると」と言ってきたら、それは頼んでない整理を勝手にやってる証拠。 その総括の段は飛ばさず最後まで読む。

長期赤を回避するな。 毎回 push のたびに「これは known issue だから後で直す」と自分に言ってた。後でというのは 3 年後を指す可能性がある。Claude が近くを通ってるついでにきれいにしてもらうほうが、「CI を直す日」を別建てで予約するより現実的。

最後にもう一度、3 つの commit:

74a3ebf  chore(lint): rubocop autocorrect — Layout cops only
76264ee  fix(ci): add postgres service + bump mcp gem for CVE-2026-33946
e1d91d1  chore(ci): drop system-test job

1 つ目が俺が頼んだやつ。2 つ目と 3 つ目は向こうが勝手に持ってきたやつ。後ろの 2 つのほうが、価値ははるかに大きい。