コーディングエージェント向け DESIGN.md とは?

Ashley Innocent

Ashley Innocent

21 5月 2026

コーディングエージェント向け DESIGN.md とは?

Apidog エンタープライズ

オンプレミスデプロイ

SSO & RBAC

SOC 2 準拠

Apidog Enterpriseを見る

コーディングエージェントは、自信があり、高速ですが、指示されない限り、コードベースのアーキテクチャについて何も知りません。Claude CodeやCodexに曖昧なチケットを渡すと、コンパイルされ、簡単なテストに合格するコードを喜んで作成しますが、ドメイン層とHTTP層の境界を静かに侵害します。エージェントは設計ドキュメントを読んでいません。見ることのできるファイルを読み、パターンを照合し、推測しただけです。DESIGN.mdファイルは、エージェントが必ず参照する唯一の場所、つまりリポジトリ自体にアーキテクチャの意図を書き留めることで、この推測の問題を解決します。

TL;DR (要するに)

DESIGN.mdは、コードベースのアーキテクチャの意図、制約、設計上の決定をプレーンなMarkdown形式で記録するコミュニティ慣習のリポジトリファイルです。これにより、コーディングエージェント(Claude Code、Codex、Cursor)がシステムに適合するコードを生成し、システムと衝突するのを防ぎます。これは「なぜコードはこのように設計されているのか」に答え、AGENTS.mdは「どのようにビルドし、テストするのか」に答えます。

button

はじめに

コーディングエージェントを導入するすべてのチームが1週間以内に遭遇する失敗パターンがこれです。決済サービスに返金エンドポイントを追加するようエージェントに依頼すると、コントローラーからデータベースを直接呼び出し、ゲートウェイエラーを飲み込み、すでに存在する通貨タイプに気づかずに新しい通貨タイプを発明する動作するハンドラーが返ってきます。差分はきれいで、テストもパスします。しかし、アーキテクチャを知っているレビュアーだけが気づく3つの点で間違っています。エージェントはコーディングが下手なのではなく、あなたの頭の中、Notionのページ、または8ヶ月前のSlackスレッドにある決定事項を見落としているのです。

DESIGN.mdは、多くのチームがたどり着いた答えです。これは、リポジトリのルートにコミットされる単一のMarkdownファイルで、レイヤー化のルール、決して破ってはならない不変条件、意図的に選択したパターン、そして却下したパターンなど、システムに関する重要な事実をすべてのエージェントに伝えます。ベンダーの仕様でもなければ、それを所有する委員会もありません。これは、ARCHITECTURE.mdCONTRIBUTING.mdと同様に、慣習です。しかし、エージェントがすでに読んでいるツール固有の指示ファイルと自然に組み合わされ、APIやバックエンドの作業においては、作成できる最もレバレッジの高いドキュメントの一つです。

DESIGN.mdとは実際には何か

DESIGN.mdは、なぜあなたのコードがそのように見えるのかを記録したプレーンテキストです。何をするのか(それはREADME)、どう実行するのか(それはAGENTS.md)ではなく、新入社員に重要なものを触らせる前に、シニアエンジニアが初日に説明するであろう推論です。

どのファイルにもない会話を考えてみてください。「リクエストスレッドから決済ゲートウェイを呼び出すことはありません。ゲートウェイは負荷がかかるとタイムアウトするため、すべてアウトボックステーブルを経由します。」「金額は常に最小単位の整数カウントです。丸め誤差の事件の後、浮動小数点数を禁止しました。」「Account集約が残高の変更を所有しています。他は台帳に書き込みません。」これらは設計上の決定です。これらはソースコードを読むエージェントには見えません。なぜなら、ソースコードは決定そのものではなく、その理由も示さず、決定の結果を示すからです。エージェントはAccount.debit()が存在することを見ることができます。しかし、あなたが意図的にそれを唯一の書き込みパスにしたことを見ることはできないため、喜んで2番目のパスを追加するでしょう。

この慣習は、古くから確立されたプラクティスにルーツを持っています。ARCHITECTURE.mdパターン(Alex Kladovの広く引用されている著作で普及)は、コードベースの構造と不変条件を説明する高レベルのマップをリポジトリに含めるべきだと主張し、コードと行ごとに同期を保とうとはしません。アーキテクチャ決定記録(ADR)は、個々の決定とその理由を時系列で捉えます。DESIGN.mdは、そのようなドキュメントをコーディングエージェントを含む読者向けに作成したものです。簡潔で、宣言的で、意思決定指向であり、エージェントが実際に読み込む場所に配置されます。

これが機能するのには2つの特性があります。リポジトリ内に存在するため、エージェントはコードを読むのと同じツールでそれを読み込みます。プラグインやAPI呼び出しは不要です。そして、それは意図に関するものであるため、ファイルが移動しても有用性を保ちます。パッケージ名を変更するとREADMEのスクリーンショットは古くなりますが、「ドメインロジックはウェブフレームワークをインポートしない」というルールは依然として真です。

DESIGN.md vs AGENTS.md vs CLAUDE.md vs README

これらのファイルは、人々を混乱させるほど重複していますが、一つにまとめるのが間違いであるほど異なります。簡潔に言えば、READMEは人間のオンボーディング用、AGENTS.mdはエージェントの運用契約、CLAUDE.mdはClaude固有の指示ファイルであり、DESIGN.mdはこれらすべてが恩恵を受けるアーキテクチャ上の推論です。

AGENTS.mdは現在、広く採用されている実際のフォーマットです。agents.mdプロジェクトでは、「コーディングエージェントをガイドするためのシンプルでオープンなフォーマット」と説明されており、数万のプロジェクトで利用され、Linux FoundationのAgentic AI Foundationの下で管理されています。その役割は運用上のもので、ビルド手順、テストコマンド、コードスタイル、コミット規約など、新しいチームメイトが作業を滞りなく進めるために伝えるような事項です。AnthropicのClaude Codeのメモリに関するドキュメントによると、CLAUDE.mdはClaude専用に同様の指示の役割を果たします。ドキュメントでは、すでにAGENTS.mdがある場合、@AGENTS.mdでそれをインポートするCLAUDE.mdを作成し、両方のツールが単一の真実のソースを読み込むようにすることも推奨しています。

これらの説明に欠けているものに注目してください。それは深いアーキテクチャ上の根拠です。AGENTS.mdCLAUDE.mdは短く保たれるように調整されています。Claude Codeのドキュメントでは、長いファイルはコンテキストを消費し、モデルがそれらに従う信頼性を低下させるため、CLAUDE.mdを200行未満に保つことを明示的に推奨しています。真のアーキテクチャの説明、境界、不変条件、却下された代替案、データモデルのルールなどは、肥大化させずにそこに収めることはできません。そのため、代わりにそれを参照します。DESIGN.mdが深いドキュメントとなり、AGENTS.md / CLAUDE.mdは単一行でそれを指し示します。

ファイル 対象読者 何に答えるか 寿命 / 変更頻度 長さ
README.md 人間(ユーザー、新規コントリビューター) これは何か、どうやって始めるか 機能に応じて変更
AGENTS.md あらゆるコーディングエージェント ここでどうビルド、テスト、リント、コミットするか ツールに応じて変更 短(運用向け)
CLAUDE.md Claude Code専用 AGENTS.mdと同じ、加えてClaude固有のルール ツールに応じて変更 短(約200行未満)
DESIGN.md エージェント + エンジニア + レビュアー なぜシステムはこのように設計されているのか;決して破ってはならないものは何か アーキテクチャに応じて変更(稀) 中、決定事項が密集

これらの関係は補完的であり、競合するものではありません。Claude + Codexを使用する環境でのクリーンなセットアップは次のようになります。人間向けのREADME.md。ビルド/テスト/スタイルに関するAGENTS.md@AGENTS.mdにClaude専用の2行を追加したCLAUDE.md。そして、アーキテクチャを保持するDESIGN.mdAGENTS.mdからリンクされ、すべてのエージェントがオンデマンドでそれをロードします。重複はなく、各ファイルには一つの役割があります。これらのファイル間でClaudeのコンテキストを構造化する方法についてさらに詳しく知りたい場合は、Claude Codeワークフローで実際のメモリモデルについて解説しています。

DESIGN.mdに何を含めるべきか(テンプレート付き)

DESIGN.mdは、エージェントがコードから推測できない質問に答えるべきです。システムの形状、どの単一ファイルにも現れないルール、そして意図的に下した決定などです。宣言的に記述してください。各セクションは、エッセイではなく、レビュアーが強制するルールのように読めるべきです。

以下を網羅してください:

以下に、現実的な決済APIサービス向けに書かれた完全なテンプレートを示します。これをコピーし、該当しない部分を削除し、残りを埋めてください。

# DESIGN.md: 決済APIサービス

このファイルは、アーキテクチャの意図と、その背後にある決定を記録します。
コードを生成または変更する前にこれを読んでください。変更がここにあるルールと衝突する場合は、回避策を講じるのではなく、作業を中止して問題を指摘してください。

## システム形状

階層化されており、依存関係は内側のみを指します。

  http (handlers, DTOs)  ->  app (use cases)  ->  domain (entities,
  invariants)  <-  infra (db, gateway clients)

- `domain/`は`http/`、`app/`、または任意のフレームワークからのインポートを一切持ちません。
- `infra/`は`domain/`または`app/`で宣言されたインターフェースを実装します。
- `http/`はデータベースや決済ゲートウェイを直接操作しません。
  `app/`のユースケースを呼び出します。

## 不変条件(常に保持されるべき)

- 台帳エントリは一度書き込まれると変更できません。修正は新しい相殺エントリであり、更新や削除ではありません。
- 口座残高は台帳エントリから導出され、コードが直接設定できる可変フィールドとして保存されません。
- 金額は最小単位(セント)の整数カウントとISO-4217通貨コードで構成されます。浮動小数点数は決して使用せず、単一の操作で複数の通貨を混合しないでください。
- 外部決済ゲートウェイへのすべての呼び出しは、`idempotency_key`によって冪等です。リトライによって二重課金されてはなりません。
- 明示的な`OverdraftPolicy`がその口座に許可しない限り、残高がマイナスになることはありません。

## 主要な決定と根拠

- **ゲートウェイ呼び出しのアウトボックスパターン。** ハンドラーは、ビジネス変更と同じDBトランザクションで意図行を書き込み、その後ワーカーがゲートウェイを呼び出します。根拠: ゲートウェイは負荷がかかるとタイムアウトし、インラインで処理するとリクエストの遅延とエラー処理が不明確になりました。リクエストハンドラーからゲートウェイを呼び出さないでください。
- **集約ごとの単一書き込みパス。** `Account.post_entry()`のみが台帳に書き込みます。根拠: 2番目の書き込みパスが2025年3月の残高ずれを引き起こしました。新しい動作は集約のメソッドとして追加し、新しいクエリとして追加しないでください。
- **台帳のみのイベントソーシング。** システムの残りの部分はCRUDです。根拠: 金額については完璧な監査証跡が必要であり、それ以外の部分での完全なイベントソーシングはコストが高すぎました。

## 却下された代替案(再導入禁止)

- 集約間のORM遅延読み込みは、N+1問題と不明確なトランザクション境界を引き起こしました。リポジトリは完全にロードされた集約を返します。
- 残高をその場で更新される列として保存することは禁止されています。残高ずれのインシデントを参照してください。残高は常に導出されます。
- レジストリから取得した汎用`Money`ライブラリは使用しません。独自の`domain/money.py`を使用してください。
- リクエストスレッドからの加盟店への同期Webフックは、ブロックしてサイレントに失敗します。通知キューを使用してください。

## データとドメインのルール

- すべてのタイムスタンプはUTCであり、timestamptzとして保存され、エッジでRFC 3339形式にフォーマットされます。素朴な日時型が関数境界を越えることはありません。
- IDはアプリ層で生成されるULIDであり、DBのオートインクリメントは使用しません。
- ソフトデリートは使用されません。レコードはアクティブであるか、明示的なユースケースによってアーカイブテーブルに移動されます。
- マルチテナント: すべてのクエリは`tenant_id`でスコープされます。テナントスコープのないリポジトリメソッドはバグです。

## APIコントラクトの信頼できる情報源

- `api/openapi.yaml`にあるOpenAPI 3.1仕様が権威です。
  リクエスト/レスポンスタイプはそこから生成されます。`http/generated/`内の生成されたタイプを手動で編集しないでください。
- 新規または変更されたエンドポイント: まず`api/openapi.yaml`を更新し、その後再生成し、実装します。仕様は、コード変更前にApidogで設計およびレビューされます。
- エラー応答はRFC 9457(problem+json)に準拠します。共有の`problem()`ヘルパーを使用してください。アドホックなエラー形状を考案しないでください。

## 新規コードの配置場所

- 新しいエンドポイント: ルートは`http/routes/`、DTOは`http/dto/`、ユースケースは`app/usecases/`、ドメインロジックは`domain/`に配置します。
- 新しい外部統合: クライアントは`infra/clients/`、インターフェースは`app/ports/`に配置します。
- 横断的関心事(認証、ロギング、冪等性): ミドルウェアは`http/middleware/`に配置し、ハンドラーにインラインで記述しないでください。

## 範囲外 / 触らないで

- `http/generated/`: OpenAPIから再生成されるため、編集は失われます。
- `legacy/billing_v1/`: 凍結されており、移行中です。拡張しないでください。
- `migrations/`: 適用済みのマイグレーションを編集しないでください。新しいものを追加してください。

## 迷ったとき

要求された変更が上記のルールを破る必要がある場合、正しい対応は、沈黙してルールを回避するのではなく、その旨を伝え、最小限の設計整合性のある代替案を提案することです。

最後のセクションは、見た目以上に重要です。要求が設計と衝突した場合にエージェントにどうすべきかを伝えることで、そのファイルは受動的なドキュメントから能動的なガードレールへと変わります。これがなければ、制約にぶつかったエージェントはそれを回避し、その回避策を出荷する傾向があります。

コーディングエージェントはどのようにDESIGN.mdを実際に消費するか

エージェントは特別なDESIGN.mdパーサーを持っていません。彼らは他のファイルと同様に、ファイルツールで読み込み、その内容をコンテキストとして扱うことで消費します。したがって、それを読み込むメカニズムが重要であり、ツールによって若干異なります。

信頼できるパターンは、各エージェントが起動時にすでに読み込んでいる指示ファイルからDESIGN.mdを参照することです。Claude Codeの場合、それはCLAUDE.mdです。メモリに関するドキュメントでは、@pathインポート構文が記述されており、@DESIGN.mdはセッション開始時にファイルをコンテキストに展開します。AGENTS.mdエコシステムの場合、AGENTS.mdにそれを指し示す行を追加します(「アーキテクチャと設計ルール: DESIGN.mdを参照。構造変更の前に読んでください」)。ディレクトリツリーを辿るエージェントは、最も近いAGENTS.mdを検出し、ポインタを見て、アーキテクチャに関わる作業の場合にDESIGN.mdをプルします。どちらの方法でもコンテンツを複製することはありません。短い運用ファイルを短く保ち、詳細なファイルには詳細を記述します。

これらのツールがどのように動作するかに関する3つの実用的な注意点:

第一に、エージェントはそのファイルを強制的なルールとしてではなく、コンテキストとして扱います。Claude Codeのドキュメントは、CLAUDE.mdの内容はモデルが従おうとするガイダンスであり、厳格な制約ではないと明言しています。これは、そこから参照するすべてに当てはまります。そのため、テンプレートではすべてをテスト可能な絶対的なものとして記述し、明示的な「迷ったとき」の指示を追加しています。曖昧な記述はプレッシャーの下で無視されがちですが、明確なルールはより頻繁に守られます。

第二に、長さと構造は順守度に影響します。モデルは読者と同じように構造をスキャンするため、ヘッダーと箇条書きは段落よりも優れています。3ページの建築哲学の塊はざっと読まれるだけですが、明確な見出しの下にある10の明確な不変条件は利用されます。散文のためではなく、検索のために記述してください。

第三に、このファイルは生成だけでなく、レビューの経済性も変えます。エージェントが部分的に無視したとしても、レビュアーが違反したルールを指摘すれば、エージェントは一度の修正でそれを直します(「これはDESIGN.mdの単一書き込みパスのルールに違反しています」)。書かれた決定に基づいて修正を行うこのフィードバックループこそが、多くの真の価値が生まれる場所です。独自のエージェントハーネスを構築するチームは、まさにこれに依存しています。独自のClaude Codeを構築するを参照して、そのループが自律的なフローにどのように組み込まれるかを確認してください。

アンチパターンと陳腐化させない方法

DESIGN.mdを無価値にする最も速い方法は、Wikiページのように書くことです。陳腐化した設計ファイルは、存在しないよりも悪いです。なぜなら、エージェントと人間の両方がそれを信頼し、誤解を招くからです。以下を避けてください。

健康的なDESIGN.mdは、短く、密度の高く、宣言的で、所有され、トリガーに基づいてレビューされます。もしあなたのものが長く、物語的で、最後に触られたのが1年前であれば、エージェントはフィクションを読んでいることになります。

APIおよびバックエンドコードベースのためのDESIGN.md

ここでこのファイルが真価を発揮します。APIおよびバックエンドサービスには、エージェントが最も苦手とする、目に見えない高コストな制約がまさに存在します。コントラクト境界、トランザクションセマンティクス、冪等性、データ整合性、レイヤー化などです。これらはどれも単一のファイルから明らかになるものではなく、誤って実装すると、本番環境や金銭に影響するバグを引き起こします。

これらのAPI固有の事項をDESIGN.mdに記述することで、バックエンドチケットにおけるエージェントの出力品質が飛躍的に向上します。

バックエンドの作業では具体的な効果が得られます。レイヤー違反が減り、予期せぬインラインゲートウェイ呼び出しがなくなり、一貫したエラーおよびページネーションの形状が実現し、エージェントがスキーマを推測するのではなくOpenAPI仕様を指示されたため、契約に準拠したハンドラーが生成されます。エージェントは発明をやめ、準拠し始めます。エージェントが作成したAPIも動作させたい場合、契約と設計の組み合わせにより、ツールとエージェントは既知のインターフェースに対してテストできます。Apidogをダウンロードすると、設計優先のワークスペース、DESIGN.mdが指し示すOpenAPIエクスポート、および生成されたエンドポイントが実際に契約に合致しているかを確認するためのMCPサーバーとAIエージェントデバッガーが提供されます。

結論

よくある質問

DESIGN.mdAGENTS.mdのような公式標準ですか?

いいえ。AGENTS.mdは、Linux FoundationのAgentic AI Foundationの下で管理されている、明確に定義され広く採用されているフォーマットです。DESIGN.mdは、ARCHITECTURE.mdやADRと同じ系列の、単一の所有者や仕様を持たないコミュニティ慣習です。準拠すべき標準ではなく、適応する有用なパターンとして扱ってください。

AGENTS.mdCLAUDE.mdをすでに持っている場合でも、DESIGN.mdは必要ですか?

もしあなたのアーキテクチャに自明でない制約があるなら、はい、必要です。AGENTS.mdCLAUDE.mdは短く運用的に保つことを意図しており、Claude CodeのドキュメントではCLAUDE.mdを約200行未満に保つことを推奨しています。深いアーキテクチャ上の根拠は、肥大化させずにそこに収めることはできず、順守度を損なうため、DESIGN.mdに記述して参照します。運用ファイル自体については、AGENTS.mdファイルの書き方を参照してください。

DESIGN.mdARCHITECTURE.mdとどう違うのですか?

主に意図と対象読者が異なります。ARCHITECTURE.mdは、コードベースをマッピングする人間向けコントリビューターを対象とした古い慣習です。DESIGN.mdは、コーディングエージェントを含む読者向けに書かれた同じアイデアであり、より宣言的で、決定と不変条件に焦点を当て、エージェントの指示ファイルから明示的に参照されることでコンテキストに読み込まれます。多くのチームは1つのファイルと1つの名前を使用しますが、原則は同じです。

DESIGN.mdはどのくらいの長さにするべきですか?

エージェントが繰り返し間違える決定をカバーするのに十分な長さで、すべての行が存在する価値があるほど短くするべきです。包括的であるよりも、決定が凝縮されている方が優れています。チュートリアルのように読めたり、コードを再記述している場合は削除してください。不変条件と根拠に焦点を絞った2〜4ページは、エージェントがじっくり読まない15ページの物語よりも優れています。

エージェントに実際に読ませるにはどうすればよいですか?

エージェントが起動時にすでに読み込むファイルからそれを参照します。Claude Codeの場合、CLAUDE.mdから@DESIGN.mdでインポートします。AGENTS.mdエコシステムの場合、AGENTS.mdに、構造変更の前にDESIGN.mdを読むようにエージェントに指示するポインタ行を追加します。全体を短いファイルに貼り付けず、運用ファイルを短く保つために参照してください。

エージェントは常にDESIGN.mdに従いますか?

いいえ、そしてそのことを考慮して設計する必要があります。エージェントの指示ファイルは、モデルが従おうとするコンテキストであり、強制される設定ではありません。ルールは明確な絶対的なものとして記述し、「競合を指摘し、回避しない」という明確な指示を追加し、レビューサイクルに依存してください。DESIGN.mdで違反したルールを指摘することで、最初のパスで見落とされた場合でも、迅速かつ正確な修正が得られます。

DESIGN.mdは特にAPI契約の問題に役立ちますか?

大いに役立ちます。その最も価値の高いバックエンドでの利用法は、OpenAPI仕様が権威であり、そのファイル名を指定することで、エージェントがスキーマを発明したり生成された型を手動で編集したりする代わりに、契約に準拠するようにすることです。Apidogのようなツールでまずその契約を設計することで、エージェントはあなたのDESIGN.mdが直接指し示すことができる明確なターゲットを得られます。

DESIGN.mdはリポジトリのどこに置くべきですか?

リポジトリのルートに、README.mdAGENTS.mdの隣に置くべきです。そうすることで、エージェントも人間も検索することなく見つけられます。モノレポの場合、システム全体のルール用のルートDESIGN.mdと、ローカルアーキテクチャ用のパッケージごとのDESIGN.mdがうまく機能します。これは、エージェントがディレクトリツリーで最も近いAGENTS.mdを読み込む方法を反映しています。

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる