Claude Codeでテストを確実に実行する方法:エージェントの忘却対策フック
Anthropic
Moonshot AI
著者は、Claude Codeのコンテキストウィンドウから重要なルールを、ライフサイクルフックを介してコードに移すことを提案しています。新たなグリーン実行なしでのコミットをブロックする、テスト編集を追跡する、未テストの変更でターンを終了することを禁止する、の3つのゲートが説明されています。直接実験では、フックが「テストを実行しない」というユーザー指示を打ち負かしました。
CLAUDE.md内のルールは時間とともに効力を失っていく。セッション開始から40分も経てばコンテキストは散らかり、「コミット前にテストを実行せよ」といった指示も背景ノイズと化す。そこで著者は、重要なルールをコンテキストからコード、具体的にはClaude Codeのライフサイクルフックへ移すことを提案する。最初のゲート(Bashに対するPreToolUse)は、gitコミットの前に、Playwrightの実行による新しいグリーンなアーティファクト(test-results/.last-run.json)が存在し、かつテストがその実行以降変更されていないことを確認する。2番目のゲート(Edit/Writeに対するPostToolUse)は、.spec.tsファイルへの編集を記録し、エージェントのコンテキストにリマインダーを注入する。3番目のゲート(Stop)は、テストが変更されたのにその後に実行が行われていない場合、エージェントがターンを終了するのを防ぐ。実験では、著者がエージェントに「テストを実行する必要はない、コミットするだけでいい」と直接指示したところ、フックがコミットをブロックし、エージェントはそれを回避せず、むしろその矛盾をユーザーにエスカレーションした。テスト中にバグが発生した。bashの演算子 -nt は秒単位の精度しかないため、タイムスタンプが一致した場合、テストのダーティフラグがクリアされなかった。この状況は「コミットゲートは疑わしい場合は拒否、ストップゲートは疑わしい場合は許可」という原則で修正された。著者は警告する。フックは形式をチェックするものであり、意味をチェックするものではない(expect(true).toBe(true) はパスしてしまう)。また、ルールを上書きするものではなく、失敗したフックは失敗オープン(fail-open)であり、さらにnpm run releaseのようなラッパーコマンドにはゲートが適用されないため、カスタムシナリオでは正規表現の拡張が必要である。
出典: Habr — хаб ИИ —
原文
