AIが夜中にコードを直す、その設計判断の話
AIエージェントに夜間のコード巡回を任せる。アイデアとしては面白いが、実際に設計しようとすると「どこまで自前で実装するか」という判断が必ず発生する。
Qiitaに投稿されたYuji Naramoto氏の記事は、まさにその判断を丁寧に記録したものだ。Claude Codeのスキルとしてnight-patrolを設計する際、修正ロジックをスキル内に全部書くのか、既存スキルに委譲するオーケストレーターに徹するのか。その選択の理由と、その結果どうなったかが具体的にまとめられている。
「誰もやりたくない仕事」は夜も積み上がる
記事が出発点として挙げる課題は、開発チームなら身に覚えがあるものばかりだ。
- PRのレビュー待ちが何日も放置される
// TODO: あとで直すが何ヶ月も残り続ける- lint警告が数百件積み上がり、もはや誰も見ていない
- スキップされたテストの理由を誰も覚えていない
どれも「誰かがやれば片付く」が「誰もやりたくない」類の仕事だ。そしてこういう技術的負債は、人間が寝ている間にも静かに積み上がり続ける。ならばAIに夜間巡回させて、検出・修正・PRまで自動化してしまおう、というのがnight-patrolの発想だ。
3つの設計案と、採用されなかった理由
記事では設計の選択肢を3つに整理している。
A案:修正ロジックをnight-patrol内に全部書く
夜間用に最適化しやすく、外部依存が少ない。ただし「昼のワークフローと品質基準が分岐する」「既存の実装スキルと重複する」という問題が生じる。
B案:CI/cronから既存の汎用スクリプトを呼ぶだけ
運用はシンプル。しかしTriageや依存解析といった判断をスクリプトで書くのは現実的に辛い。
C案:既存スキル(dev-flow)に委譲するオーケストレーター
昼夜で品質ゲートが完全に同一になり、責務分離がきれい。dev-flow側の変更に引きずられるリスクはあるが、それは管理できる問題だ。
採用されたのはC案。その決め手は「夜間用という理由で品質基準を下げたくなかった」という一言に集約されている。
「昼と夜で同じ基準を通す」という発想の鋭さ
ここが記事全体の核心だと思う。
もしnight-patrol内に修正ロジックを自前実装すると、夜用に「少し甘い基準」を作りたくなる誘惑が生まれる。結果として、夜に通ったPRが昼のレビュー基準で落ちる事態が発生する。朝レポートを見た人間が「このPRは本当にdevにマージしていいのか」と毎回迷うことになれば、自動化の意味がない。
だからnight-patrolは「何を直すか」だけを担当し、「どう直すか」は昼も使っているdev-flowに委譲する構造にした。
night-patrol (何を直すか)
├── Phase 1: Scan
├── Phase 2: Triage
├── Phase 3: Execute → dev-flow に委譲
└── Phase 4: Report
dev-flow (どう直すか / 昼と同じ実装ワークフロー)
├── dev-issue-analyze
├── dev-kickoff → plan → implement → validate → evaluate
├── git-pr
└── pr-iterate → pr-review → pr-fix
この分離により、夜間の修正PRも昼のコードレビュー基準・テスト基準・validateを同じ経路で通ることが自動的に保証される。
Triageが出力するバッチプランもよくできている。ファイルの重複はスクリプトで機械的に検出し、論理的な依存関係だけをLLMに判定させるハイブリッド設計だ。「全部LLMに任せる」でも「全部スクリプト」でもなく、得意な方に寄せる、という割り切りが実用的だ。
ガードは1つではなく重ねる
オーケストレーターとして責務を絞った分、ブレーキ設計は自前で持つ。記事では6つのガードを重ねている。
| ガード | 何を防ぐか | デフォルト |
|---|---|---|
| 破壊的変更検出 | public API変更、DBマイグレーション | issueスキップ |
| 1 issue変更行数上限 | 巨大修正の混入 | 500行超過でスキップ |
| denylistパス | .env、migrations/等の保護 | glob指定 |
| denylistラベル | do-not-autofix等 | ラベル指定 |
| denylist issue番号 | 人間が手動対応したいもの | 番号指定 |
| 累積変更量上限 | ブランチ全体の差分爆発 | 2000行で残り全スキップ |
特に着目したいのが「累積変更量上限」だ。1 issue単位で500行を上限にしていても、10 issueあれば理論上5000行の差分が生まれうる。それを防ぐため、ブランチ全体の累積上限を2000行として別途設けている。単独ガードは必ずすり抜けがある、という前提で設計されている点が信頼できる。
実務への示唆:「自前で抱え込まない」を設計判断に組み込む
この記事から引き出せる実務的な教訓は、AIエージェント設計に限らない。
昼のワークフローと品質基準を揃えられるか。揃えられない設計は、運用フェーズで必ず剥がれる。夜間バッチのためにゆるい基準を作ると、それがそのまま技術的負債になる。
「何をやるか」と「どうやるか」を分離できるか。分離できるなら、既存の信頼できる実装に委譲するのが素直な選択だ。自前実装は管理コストも乗っかってくる。
ガードを1つではなく重ねられるか。自律的に動くものを設計するなら、単独のガードはすり抜け前提で考えた方がいい。
AIエージェントを「便利なツール」として雑に使い始める段階から、「継続的に信頼できる運用」に移行しようとするなら、こういう設計の細部が効いてくる。night-patrolの設計ドキュメントは、その移行期に参照できる具体的な事例として価値がある。
自前で全部抱え込まないことが、結果として朝レポートの信頼性を安定させた。そういう種類の話だ。