【要約】AI に「新規コードのテストを別タスクに切り出すな」と教えた話、test 専用ブランチで pytest が永久に通らない問題 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
Codens Purpleを利用する開発チームが、AIによるタスク分解の不備によりCIが失敗し続ける問題に直面した。AIが並列処理を優先して実装とテストを別ブランチに分けた結果、テスト用ブランチに実装コードが存在せず、CIが失敗し続けた。具体的には以下の問題が発生した。
- ・AIが「並列化」を優先し、テストを別タスクに切り出した。
- ・各タスクは独立したブランチで実行されるため、テスト用ブランチには実装変更が含まれない。
- ・pytestが対象関数を見つけられず、CIがリトライを繰り返して失敗した。
- ・テストなしの実装コードがmainにマージされ、カバレッジが低下するリスクが生じた。
// Approach
開発者はAIのタスク分割ロジックを修正するため、プロンプトエンジニアリングによる制約の追加を行った。AIがタスクを分割する際の指示文(analyze prompt)を、実行モデルの制約に即した内容へ書き換えた。具体的な手法は以下の通りである。
- ・「新しい挙動のテストは実装と同じタスクで行う」という禁止ルールを追加した。
- ・"Add tests for..." というタイトルを禁止する「Title Heuristic」を導入した。
- ・Few-shot Exampleを更新し、実装とテストを同一タスクの対象ファイルとして明示的に示した。
- ・既存コードへの回帰テスト(backfill)は例外として許可する条件を明記した。
// Result
プロンプトの修正により、AIエージェントによるタスク分解の精度が向上し、同種の失敗が再発しなくなった。AIは「Fix X and add tests」という形式でタスクを統合するようになった。具体的な成果は以下の通りである。
- ・テストなしの実装がマージされるリスクを排除できた。
- ・CIのPartial failure(部分的な失敗)による実行全体の停止を防げた。
- ・「禁止」と「許可」を併記したことで、AIの過剰な修正(overcorrect)も防げた。
Senior Engineer Insight
> AIエージェントの設計において、人間との「常識の乖離」を埋める作業は不可欠だ。人間は隣のブランチを見れるが、AIエージェントは隔離された環境で動く。この実行モデルの制約をプロンプトで明示しなければ、効率化のための並列化が逆にシステムの信頼性を損なう。プロンプトは単なる指示ではなく、エージェントの実行環境の仕様書として扱うべきだ。特に、禁止事項だけでなく例外を明記する設計は、運用コストを抑える上で極めて重要である。