TL;DR
- 仕様書が腐る原因は「変化率の異なる情報」を1ファイルに混ぜていること
- Requirements(不変)/ Design(計画)/ Tasks(現在) の3層に分離すれば、Documentation Drift を構造的に防げる
- AIエージェントへの指示は「どのファイルを読め」の一文で済み、コンテキスト精度が劇的に上がる
The Pain: ドキュメントが腐る問題
「仕様書を書こう」と決めても、開発が進むにつれてドキュメントとコードが乖離していく Documentation Drift が発生します。特にAI開発では実装速度が速いため、この乖離が致命傷になります。
前回の記事では「チャットログを仕様の拠り所にするのが根本原因」という話をしました。では仕様ファイルさえ書けば解決するのかというと、そう単純ではありません。
原因は、「不変なもの(Why)」と「可変なもの(How/Status)」を同じファイルに混ぜてしまっていることにあります。1つのファイルに「目的」「設計」「進捗」を全部書くと、更新頻度の違いからファイル全体が信用できなくなるのです。
ありがちなアンチパターン
| パターン | 何が起きるか |
|---|---|
巨大な SPEC.md に全部書く | 更新頻度が違う情報が混在し、古い部分が放置される |
| チャットログで仕様を共有 | セッション終了で揮発する |
| Issue本文だけで管理 | 長期的な要件がスレッドに埋もれる |
The Solution: 時間軸による3層分離
SDD(Spec Driven Development)では、ドキュメントを情報の「変化率(更新頻度)」に応じて3つに分離します。
| ファイル | 内容 | 時間軸 | 更新頻度 | 例 |
|---|---|---|---|---|
| Requirements.md | なぜやるのか (Why)、要件定義 | 過去・不変 | 低(月1回以下) | ビジネス目標、非機能要件 |
| Design.md | どう実現するか (How)、設計 | 未来・計画 | 中(週1回程度) | API設計、ER図、技術選定 |
| Tasks.md | いま何をしているか (Status)、進捗 | 現在・瞬時 | 高(毎日〜毎時間) | 未着手タスク、ブロッカー、完了報告 |
この分離の本質は 「更新頻度の異なる情報を異なるファイルに置く」 というシンプルな原則です。データベースの正規化と同じ発想で、ドキュメントの変更衝突を最小化します。
なぜ「3つ」なのか
2層(要件+タスク)だと、設計判断の経緯が残りません。4層以上にすると認知負荷が上がり、AIエージェントが参照すべきファイルを迷います。3層は「判断の根拠を追跡できる最小構成」です。
意思決定の記録をさらに厳密に管理したい場合は、意思決定ログと証拠管理の型も参考にしてください。
The Implementation: specディレクトリの構造
プロジェクトルートに spec/ ディレクトリを作成し、この3ファイルを配置します。
project-root/
├── spec/
│ ├── requirements.md # 変更しない「憲法」
│ ├── design.md # 議論して更新する「設計図」
│ └── tasks.md # 毎日書き換える「Todoリスト」
├── src/
└── ...
各ファイルの書き方テンプレート
requirements.md の例
# Requirements
## 目的
ユーザーが記事を検索し、3クリック以内に目的の記事へ到達できること。
## 非目的
- リアルタイム検索は対象外
- 多言語対応は Phase 2 以降
## 制約
- レスポンスタイム: p95 < 200ms
- 外部APIへの依存は最小限にすること
Issueテンプレートと組み合わせると、要件の解像度がさらに上がります。詳しくはIssueテンプレで要件解像度を上げる方法を参照してください。
tasks.md の例
# Tasks
## In Progress
- [ ] 検索APIのエンドポイント実装 (#42)
## Done
- [x] 検索インデックスの設計レビュー (#38)
## Blocked
- [ ] 全文検索ライブラリの選定 → Design.md の決定待ち
AIエージェントへの指示
この3層構造があれば、AIへの指示はワンライナーで済みます。
requirements.md の要件を満たすように、
design.md の設計に従って、
tasks.md の未完了タスクを1つ実行してください。
この一文だけで、AIはコンテキストの優先順位を正しく理解します。
- requirements.md = 絶対守るべき制約(変更不可)
- design.md = 提案して修正可能な案(議論の余地あり)
- tasks.md = 自分が埋めるべき空欄(即座に着手)
一枚岩 vs 3層分離の比較
| 観点 | 一枚岩 SPEC.md | 3層分離 spec/ |
|---|---|---|
| 更新衝突 | 頻発(全員が同じファイルを編集) | 最小限(変更対象が分離) |
| AIの文脈理解 | 長文から重要部分を推測 | ファイル単位で優先度が明確 |
| レビュー負荷 | 差分が大きく確認困難 | 変更ファイルだけ見ればよい |
| 新メンバーのオンボーディング | 全部読まないと全貌がわからない | requirements.md だけで概要把握 |
仕様品質を維持する運用のコツ
3層に分けても、ファイルの中身が曖昧なら意味がありません。仕様品質マネジメントの運用モデルで体系的に整理していますが、ここでは最低限押さえるべき3つのルールを紹介します。
- requirements.md は「判断可能」な粒度で書く: 「使いやすいUI」ではなく「3クリック以内に到達」のように、合否判定できる表現にする
- design.md は選択肢と棄却理由をセットで記録する: 後から「なぜこの設計なのか」を追えるようにする
- tasks.md は毎日棚卸しする: 完了タスクの放置が信頼性を下げる最大の原因
The Takeaway: 時間軸で分ければドキュメントは腐らない
- Requirements: ぶれない軸(過去の決定)
- Design: 柔軟な思考(未来の計画)
- Tasks: 確実な実行(現在の行動)
この3つを混ぜずに管理することで、AIエージェントは「迷子」にならず、常に正しい方向へ自律的に進むことができます。
仕様の「箱」が整ったら、次は人間の役割です。SDDの下で人間が担うべきは「コードを書くこと」ではなく「承認すること」。続きはHuman-in-the-loopワークフローで解説しています。
関連記事
