ADRと契約を用いてAI生成コードの不変条件を強制する
本記事では、アーキテクチャ決定記録(ADR)とRFC 2119キーワードを使用してAI生成コードの不変条件を強制する方法を紹介します。アーキテクチャの決定を不変条件として記録し、AIエージェントに参照させ、決定論的なチェックで違反を防ぐ方法を説明します。
Zarar Siddiqiは2026年6月30日、AI生成コードにおいて不変条件を強制する方法についての記事を公開しました。不変条件はドメイン駆動設計に由来し、システムが有効な状態であるために常に真でなければならないルールです。しかし、大規模言語モデル(LLM)は一見正しいように見えて、暗黙の制約に違反するコードを生成することがあります。そのため、不変条件をAIが無視できない形でエンコードする必要があります。
この記事では、アーキテクチャ決定記録(ADR)とRFC 2119キーワードという2つの手法を提案しています。ADRはアーキテクチャの決定を不変条件として記録するためのものです。効果的に使用するには、記録すべき決定を認識し、実際に記録し、AIエージェントにそれを不変条件として扱わせる必要があります。著者は、ADR自動提案スキルを使用して、「X vs Y」の比較や新しい依存関係の導入など、アーキテクチャの転換点を識別します。このスキルは記録自体は行わず、ユーザーに/adrコマンドの使用を促します。コマンドは、コンテキスト、決定、選択肢、結果を含むADRファイルを作成し、インデックスページを維持します。
AIエージェントにADRを参照させるために、著者は決定論的なフック(check-adrs.sh)を追加しました。これはコード生成の停止時に実行され、変更されたファイルがADRのスコープ内にあるか、そのADRがセッション中に開かれたかを確認します。開かれていない場合はコードをブロックします。
振る舞い要件には、RFC 2119キーワード(SHALL、MUSTなど)とGherkinシナリオ(given/when/then)を使用します。例えば、「システムは注文完了時に履行レコードをSHALL作成し、各レコードはMUST一意の識別子を持つ」といった具合です。著者はOpenSpecツールを使用して仕様を自動生成し、実装が逸脱した場合に書き換えることで、仕様とコードの同期を維持します。同様に、AIエージェントがコード生成前に仕様を参照することを保証する必要があります。
要約すると、ADRとRFC 2119仕様は異なる側面から同じ問題を解決します。ADRはアーキテクチャの決定を固定し、仕様はコードの振る舞いを固定します。両方とも、エージェントが実際に参照することを決定論的なチェックで保証する必要があり、プロンプトに頼るだけでは不十分です。これらのチェックは浅く、ルールが参照されたかどうかのみを確認し、コードが実際にルールを守っているかの判断は人間とテストに委ねられます。不変条件を散文から強制可能なチェックに移行することで、モデルの記憶への信頼を減らし、コードベースの安定した状態を維持できます。