AIコーディングエージェントが繰り返し問題を引き起こす理由(そしてその解決策)

Zheshi Du
AIコーディングエージェントが繰り返し問題を引き起こす理由(そしてその解決策)カバー

チェックアウトフローの追加をエージェントに依頼しました。エージェントは実装し、あなたは次のタスクへ移りました。2時間後、ログインページが機能しなくなっていることに気づきました。エージェントはそれをまったく把握していませんでした。

これはモデルの問題ではありません。検証の問題です。そして、AIエージェントを大規模に活用しているすべてのチームで起きていることです。

見覚えのあるパターン

典型的な流れはこうです。エージェントが何かをビルドし、テストが通り(あるいはテスト自体が存在せず)、機能が完成したと報告します。あなたは次のタスクへ移ります。エージェントはコンテキストウィンドウが圧縮された状態で動作しており、1時間前にビルドしたものの全体像をもはや把握していません。

そして関連する箇所を変更します。ロジックが変わります。インポートが壊れます。フォームの送信が止まります。エージェントはそれに気づきません。最初から監視していなかったからです。

気づいたときには、デグレードは3セッション分も積み重なっており、原因の追跡が困難になっています。

これはエージェントのバグではありません。大規模言語モデルの仕組みに組み込まれた構造的な制約です。

AIエージェントがデグレードを起こしやすい理由

すべてのAIコーディングエージェント(Claude Code、Cursor、Cline、Codexなど)はコンテキストウィンドウの中で動作しています。そのウィンドウにはサイズの上限があります。セッションが長くなるにつれて、モデルは新しい指示のためのスペースを確保するために古い情報を圧縮します。

2時間前に与えた要件はまだウィンドウ内にあるかもしれませんし、ないかもしれません。エージェント自身にもわかりません。

これにより、AIエージェントを使って開発するすべてのチームに共通する3つの障害パターンが生まれます。

要件のドリフト。エージェントはセッション序盤に伝えた制約を忘れ、微妙に間違ったものをビルドします。コードは正しく見えます。機能は単体では動作します。しかしエージェントがもはや覚えていないルールに違反しています。

サイレントデグレード。エージェントが機能Bをビルドする際、機能Aをこっそり壊します。機能Aを監視するテストがなければ、ユーザーが発見するまであなたもエージェントも気づきません。

完了の幻覚。エージェントがタスクを完了と報告します。コードを書き、コンパイルが通り、関数も存在します。しかし実際のユーザーがそのページに遷移すると、何も動きません。エージェントは一度もアプリを実際に実行していなかったのです。

この3つの障害パターンは複合します。エージェントのセッションが長くなるほど、いずれかが発生する可能性は高まり、回復はより困難になります。

従来のテストツールではこの問題を解決できない理由

自然な対応策としてテストを追加することが考えられます。Playwrightをセットアップし、Cypressのスペックを書き、CIで実行します。

開発者がテストを書く場合には効果的です。しかし、セッション途中に自律エージェントとリアルタイムのフィードバックループを確立しようとする場合には、うまく機能しません。

その理由:

  • 誰かがテストを書かなければなりません。エージェントがテストコードも書いている場合、機能とそのテストという2つのものを同期させ続ける必要があります。コンテキストが圧縮されると、どちらかが崩れます。
  • CIは事後的に実行されます。パイプラインがデグレードを検出する頃には、エージェントはすでに先へ進んでいます。3タスク分の進捗を巻き戻すのは非常に手間がかかります。
  • モックは嘘をつきます。多くのテスト環境ではデータベース、API、ブラウザをモックします。モックは通過します。実際のアプリは失敗します。そのギャップは本番環境でしか現れません。

本当に必要なのは、エージェントがセッション途中に自ら呼び出せるツールです。実際のアプリを実行し、即座に結果を報告するものです。

正しいメンタルモデル:フィードバックループとしての検証

こう考えてみてください。人間の開発者はコードを書き、ブラウザで実行し、動作するかどうかを確認します。この「書く、実行する、確認する、修正する」という密なループが品質を高く保つ秘訣です。

AIエージェントにはそのループが欠けています。エージェントはコードを書いて、動くと思い込みます。ブラウザを実行しません。出力を確認しません。コードの形から完成を推測するだけで、実際に動作するアプリの挙動からではありません。

TestSprite CLIはそのループを補完します。エージェントがセッション途中に自ら呼び出せるツールを提供し、ライブブラウザ上で実際のエンドツーエンドのフローを実行して、エージェントが即座に読み取り対処できる構造化されたレポートを返します。

ループに人間は不要です。CIの待ち時間もありません。エージェントはコードを書き、TestSpriteを呼び出し、結果を読み、問題を修正し、同じセッション内で作業を続けます。

TestSpriteの実際の動作

ショッピングサイトを例に挙げます。チェックアウトフローのビルドをエージェントに依頼します。タスク完了を報告する前に、エージェントはTestSpriteを呼び出します。処理の流れは以下のとおりです。

  1. TestSpriteはクラウド上で実際のブラウザを起動します
  2. テストアカウントでアプリにログインします
  3. 商品を検索し、カートに追加し、チェックアウトへ進み、支払い情報を入力し、注文を送信します
  4. 正しい注文番号とともに注文確認ページが実際に表示されたことを確認します

いずれかのステップが失敗した場合(カートボタンが反応しない、支払いフォームがエラーを返す、確認ページが空白のまま)、TestSpriteは失敗箇所を正確に記録します。スクリーンショット、DOMの状態、根本原因の仮説、そして推奨する修正内容です。

これらすべてがエージェントに返され、エージェントはレポートを読んでその場で問題を修正します。

フロー全体が実際のインフラ上で動作します。モックではありません。シミュレーションでもありません。実際のユーザーが辿るのと同じ経路です。

複利的なメリット:永続的なメモリとしてのテスト

長時間実行されるエージェントセッションにおいて、最も重要な部分をご紹介します。

TestSpriteが正常に検証したすべての動作は、拡張し続けるテストスイートに蓄積されます。エージェントがログイン機能の動作を初めて証明した時点で、そのテストは保存されます。チェックアウトがエンドツーエンドで初めて確認された時点で、そのテストも保存されます。

こうして検証済みの動作がコンテキストウィンドウの外に保存されます。エージェントのメモリは縮小・圧縮されることがありますが、テストスイートは変わりません。テストスイートには、プロジェクトが実行すべきことの完全な履歴が保持されており、その要件数はいかなるコンテキストウィンドウにも収まらないほど膨大なものとなります。

以降のすべての変更は、テストスイート全体に対して検証されます。セッション1で正しいと証明されたものが、セッション4で壊れた場合、TestSpriteは直ちにそれを検出します。エージェントは次の作業に進む前に問題を修正します。

進捗がなし崩しになることはなくなります。要件がいつの間にか変質することもなくなります。エージェントは、ただ忙しくなるのではなく、着実に向上していきます。

1分以内に始める

セットアップはコマンド3つで完了します:

npm install -g @testsprite/cli

testsprite config set-key YOUR_API_KEY

testsprite agent install

最後のコマンドは、TestSpriteをエージェントのツールリストに登録します。登録後は、エージェントが自律的にTestSpriteを呼び出します。追加のコマンドを実行する必要はありません。セッションの実行中はポータルを確認するだけで、生成されたすべてのテスト、レコーディング、根本原因の分析がログに記録され、ブラウズ可能な状態で提供されます。

月150クレジットの無料プランをご用意しています。実際のプロジェクトにTestSpriteを導入し、検証レイヤーを備えた環境でエージェントのパフォーマンスを確認するには十分な量です。

まとめ

AIコーディングエージェントがプロダクトを壊してしまうのは、コーディング能力が低いからではありません。自分が構築したものが実際に動作しているかを確認する手段がなく、すでに正しいと証明したことを記憶しておく仕組みもないからです。

TestSprite CLIは、その両方を実現します。障害をその発生直後に検知するリアルタイムのフィードバックループと、いかなるコンテキストウィンドウよりも長く維持される検証済み動作の永続的な記録です。

AIエージェントを使って高速に開発することの代償として、リグレッションを甘受する必要はありません。適切な検証レイヤーがあれば、リグレッションは例外的な事象となり、あなたのもとに届く前に検出・修正されます。

はじめる:github.com/TestSprite/testsprite-cli