仕様駆動開発(SDD)

コードを書く前に仕様を固める。AIを使いこなす設計思想。

2025年7月登場

AWS Kiro

Spec → Design → Tasks → Implement の4フローを持つAgentic IDE(AIエージェントが主体的に作業を進めるコード編集環境)。VS Codeをベースにしており、慣れたエディタ操作のまま使えます。

2025年9月OSS公開

GitHub Spec Kit

Claude Code・Cursor・GitHub Copilot・Gemini CLIなど複数のAIツールに対応したOSSツールキット。ツールに依存せず、仕様から実装まで同じコマンド群で進められます。

SDDとは何か

2025年、AWSが「Kiro」をリリースし、GitHubが「Spec Kit」を公開しました。背景にあるのはAIコーディングの普及による新しい問題です。AIは1時間で数千行のコードを生成できますが、指示のブレや文脈の散逸が起きやすく、大きなプロジェクトで一貫性を保つことが困難になりました。

仕様駆動開発(Spec-Driven Development、以下 SDD)は、仕様書をソースオブトゥルース(source of truth、システムにとっての情報の唯一の正しい出どころ。仕様とコードが食い違ったときは仕様書を正とする)として扱う開発手法です。コードより先に「何を作るか」を文書化し、AIへの指示もその仕様を参照させます。

用語: ここで言う仕様書は、堅い設計書ではなく Markdown で書いた箇条書きレベルのもので構いません。大切なのは分量ではなく、「AIも人も同じ1つの文書を見て判断する」状態を作ることです。
Spec 仕様の文書化 Plan 技術設計 Tasks タスク分解 Implement 仕様参照で実装

解決する問題

得られる効果

二大ツールの比較: Spec Kit vs Kiro

Spec Kit(GitHub)
  • 形態: OSSツールキット(CLI + テンプレート)
  • 対応エディタ: Claude Code / Cursor / Gemini CLI
  • コマンド群:
    /specify /plan /tasks /implement
  • Constitution(プロジェクトの憲法にあたるファイル。使う言語や禁止事項などAIが常に守るべき原則を書き、全フェーズで参照させる)でガバナンスを定義
  • カスタマイズ自由度が高い
Kiro(AWS)
  • 形態: Agentic IDE(VSCodeベース、スタンドアロン)
  • 対応: Kiro IDE 単体で完結
  • フロー: Spec → Design → Tasks → Implement
  • Steering機能(プロジェクト共通の前提や規約をAIに常に効かせる仕組み。技術スタックや命名規則などを別ファイルに書いておくと、全フェーズで自動参照される)でプロジェクト全体のコンテキストを管理
  • Property-based テスト統合(仕様からテスト自動生成)
GitHub Spec Kit のリポジトリページ
GitHub Spec Kit のリポジトリ。README に導入手順とスラッシュコマンドの一覧があります。
出典: github.com/github/spec-kit
AWS Kiro の公式サイト
AWS Kiro の公式サイト。Spec を中心に据えた Agentic IDE として案内されています。
出典: kiro.dev

Spec Kit の導入手順

Spec Kit は Python 製の CLI ツールです。パッケージ管理ツール uv(Rust製の高速なPythonツール管理コマンド)経由での実行が公式で案内されています。以下は 2025年時点の README に基づく例です。コマンドや対応ツールは更新されるため、実行前に必ず公式 README で最新の手順を確認してください。

# specify コマンドを一時実行してプロジェクトを初期化する
# --ai で使うAIツールを指定(claude / cursor / copilot / gemini など)
uvx --from git+https://github.com/github/spec-kit.git specify init my-project --ai claude

# uv を使わない場合は pip でも導入できる
pip install git+https://github.com/github/spec-kit.git
specify init my-project --ai claude

初期化すると、/specify /plan /tasks /implement といったスラッシュコマンドが、指定したAIツール上で使えるようになります。

cc-sdd(国産CLIツール)

Claude Codeのカスタムコマンドとして実装したSDD再現ツールです。Spec Kitに近いアプローチで、既存のClaude Code環境にそのまま導入できます。

どれを選ぶか: 既存環境にClaude Code / Cursorが入っているなら Spec Kit から始めるのがコストゼロで最速です。新規にIDE環境を作るならKiroが一番統合されています。

仕様の書き方: EARS形式

EARS(Easy Approach to Requirements Syntax、要件記述の簡易アプローチ)は、2009年に Alistair Mavin らが提唱した要件記述フォーマットです(原論文の題名は "Easy Approach to Requirements Syntax (EARS)")。ふつうの文章で書くと「速く」「正しく」など解釈の幅が残りますが、EARS は文の型を数種類に絞ることで曖昧さを減らします。この「解釈の幅を残さない」性質がAIへの指示と相性がよく、SDD実践者の間で広く使われています。

初学者向けの読み方: EARS は難しく見えますが、覚えることは「前提(Given)・きっかけ(When)・結果(Then)を分けて書く」という一点だけです。まずはこの3つを埋める練習から始めれば十分です。

3つのパターン

下の表は代表的な3つの型です。まずは一番上の「条件付き動作」だけ使えれば、TODOアプリ程度の仕様は書けます。

パターン構文用途
条件付き動作 Given [前提] When [操作] Then [結果] ユーザー操作の結果を表現
状態依存 While [状態] [システムは][動作]する 継続的な状態中の動作を表現
イベント駆動 When [イベント] The [システムは][動作]する 単発イベントへの反応を表現

spec.mdの実例(TODOアプリ)

実際の仕様書ファイル spec.md はこのような見た目になります。見出しで機能を区切り、その下に受け入れ基準(AC=Acceptance Criteria、実装が満たすべき合否ライン)を EARS 形式の箇条書きで並べます。1件目は正常系、2件目は空欄エラー、3件目はEnterキー操作を定義しています。

# TODOアプリ 仕様書(EARS形式)
# 見出し(##)で機能ごとに区切り、その下に受け入れ基準を並べる

## タスク追加

- Given テキスト入力欄に1文字以上入力している
  When ユーザーが「追加」ボタンを押す
  Then そのテキストを持つTODOがリストの末尾に追加される

- When ユーザーが空のテキスト入力欄で「追加」ボタンを押す
  The システムはTODOを追加せず、
      エラーメッセージ「タスク名を入力してください」を表示する

- While テキスト入力欄にフォーカスがある
  When ユーザーがEnterキーを押す
  The システムはボタン押下と同じ追加処理を実行する

悪い例と良い例(1文ずつ対比)

要件そのものの書き方を、あいまいな文とEARS形式で比べます。なぜEARSの方が良いのかを右側の下に添えました。

あいまいな要件

「タスク名が空でも、うまくエラーにしてほしい。」

→ 「うまく」が何を指すか不明。エラーの出し方(メッセージ?例外?無視?)も、いつ判定するのかも読み手任せ。人によってもAIのセッションによっても実装が変わります。

EARS形式の要件

「When ユーザーが空のテキスト入力欄で『追加』ボタンを押す/The システムはTODOを追加せず、エラーメッセージ『タスク名を入力してください』を表示する」

→ きっかけ(空欄で追加押下)と結果(追加しない+固定文言を表示)が1文で確定。テストにそのまま写せるので、実装の正否を機械的に判定できます。これが「良い」理由です。

指示のしかたも比べる

要件が定まったら、AIへの指示も仕様を参照させる形にします。

仕様を参照しない指示

「TODOアプリを作ってください。追加・削除・完了ができるやつで。」

→ AIの解釈次第。エラー処理の有無もフィルター機能の要否も不明で、次のセッションでは別物ができます。

仕様を参照させる指示

「specs/spec.md を読んで、AC-01 の受け入れ基準を満たすように addTodo 関数を実装してください。」

→ 判断基準が仕様書に固定されるので、何度指示しても同じ結果に収束します。

生成AI時代に注目される理由

AIコーディングツールが普及する前、仕様書の「費用対効果」は低く見られがちでした。小規模プロジェクトなら口頭確認で済む、というのが実態でした。

AIが変えたのは「生産速度」です。Claude CodeやGitHub Copilotは1時間で数百〜数千行のコードを出力します。人間がレビューしきれない速度でコードが積み上がると、仕様の曖昧さが即座に技術的負債になります。

仕様があると何が変わるか

観点仕様なしSDD(仕様あり)
AI出力の一貫性 セッションごとに解釈が変わる spec.mdを参照させるため再現性が高い
レビューの基準 「なんとなく正しい」 受け入れ基準(AC-xx)で合否が明確
手戻りコスト 実装後に要件漏れが発覚 実装前に仕様で検出できる
チームでの分業 口頭合意が分散 spec.mdが全員の参照先になる

人間とAIの境界を引く

SDDの本質は「何を決めるか(仕様)」を人間が担当し、「どう実装するか(コード)」をAIが担当する境界の明確化です。仕様書のない環境では、AIが「何を作るか」まで判断し始め、人間がその出力を追認する構造になりがちです。

現場での体感: spec.mdが1ページあるだけで、Claude Codeへの指示が「これを作って」から「AC-03を実装して」に変わります。後者は検証可能で、再現性があります。

準備と気をつけること

始めるための準備

よくある落とし穴

仕様過多トラップ: 最初から完璧な仕様を書こうとして、仕様書だけで数日かかるケースがあります。まず「追加・完了・削除」の3機能だけ書いて動かす、という最小構成から始めてください。
仕様作成コストの過大見積もり: 受け入れ基準を5〜7件書くのに慣れれば30分以内に収まります。コーディングに入る前の30分投資で、後工程の手戻りが減ります。
AI出力との照合不足: spec.mdを渡してもAIが仕様外の機能を追加することがあります。実装後に受け入れ基準を1件ずつ確認する時間を確保してください。テストを先に書く(TDD)と照合が自動化できます。

ハンズオン: お手元のAIツールでTODOアプリを実装する

サンプルフォルダ(sample/)を使って、SDDフローを体験してください。以降の「AIに指示する」場面は、お使いのAIコーディングツール(例えば Claude Code / Cursor / GitHub Copilot / Gemini CLI など)のどれでも同じプロンプトで進められます。プロンプト文はツール共通で使えます。

初学者向け: このハンズオンのゴールは「仕様書(spec.md)を根拠にAIへ指示し、テストで合否を確かめる」という一連の流れを一度体験することです。コードを1行も書けなくても、仕様を読む→指示する→テストする、の順に進めれば完了できます。
1

フォルダ構造を確認する

なぜ最初に構造を見るのか: どこに仕様(specs/)とコード(src/)とテスト(test/)があるかを把握しておくと、後の指示先を迷わないためです。sample/ フォルダをお好みのエディタ(VS Code / Cursor など)で開いてください。

sample/
  specs/
    spec.md       # ← まずここから読む
    plan.md
    tasks.md
  src/
    todo.ts
  test/
    todo.test.ts
  .claude/
    CLAUDE.md
    commands/implement.md
  CONSTITUTION.md
2

spec.mdを読む(EARS形式で要件を確認)

specs/spec.md を開き、受け入れ基準(AC-01〜AC-07)を確認してください。

特に AC-01 と AC-02 が「空文字の拒否」と「追加後リセット」を定義しているか確認します。

AC-01 の内容を確認する

「空文字でのTODO追加を拒否し、エラーを表示する」が spec.md に記載されています。この基準がテストと実装の両方の根拠になります。

3

plan.md で型定義と設計方針を確認する

なぜ plan.md を見るのか: spec.md が「何を作るか」なら、plan.md は「どんな部品(型と関数)で作るか」の設計メモです。実装前にデータの形を決めておくと、AIの出力がブレにくくなります。specs/plan.md を開き、Todo インターフェース(データの型の定義)と純粋関数(同じ入力なら必ず同じ出力を返し、外部の状態を変えない関数)の一覧を確認してください。

// TODO 1件を表すデータの型
interface Todo {
  id: string;       // 一意の識別子
  text: string;     // タスクの本文
  status: 'active' | 'completed';  // 未完了 / 完了 のどちらか
  createdAt: Date;  // 作成日時
}
4

tasks.md でタスクを確認する

なぜ tasks.md を見るのか: 仕様と設計を、AIに一度に渡すには大きすぎることがあります。tasks.md は作業を小さな単位に割り、それぞれがどの受け入れ基準(AC)に対応するかを明示します。1タスク=1指示にすると、AIの出力を検証しやすくなります。specs/tasks.md を開き、Task 1〜5 のそれぞれが「どの受け入れ基準に対応しているか」を確認してください。Task 1 は AC-01・AC-02 に対応しています。

5

AIアシスタントに実装させる

なぜここでAIに任せるのか: 「何を作るか」は仕様書で確定済みなので、「どう書くか」はAIに委ねられるからです。お使いのAIコーディングツール(例えば Claude Code なら統合ターミナルで、Cursor や Copilot ならチャット欄で)に、次のプロンプトをそのまま渡してください。プロンプトはツール共通で使えます。

specs/spec.md と specs/tasks.md を読んで、
Task 1(addTodo 関数)を src/todo.ts に実装してください。
AC-01 と AC-02 の受け入れ基準を必ず満たすようにしてください。
ポイント: 「specs/spec.md を読んで」という一文を必ず先頭に入れてください。これがないとAIが独自解釈で実装を始めます。仕様を先に読ませることが、どのツールでも共通の勘所です。
6

テストで受け入れ基準を検証する

なぜテストするのか: 仕様(AC)を満たしているかを、目視でなく機械的に確かめるためです。ターミナルコマンドはどのツールでも同じです。まだ依存パッケージを入れていなければ最初に npm install を実行してから、テストを走らせてください。

# 依存パッケージの導入(初回のみ)
npm install

# テストを実行する(npm test でも npx vitest run でも可)
npx vitest run

成功時は各テストの左に緑のチェックが並び、末尾に Test Files 1 passed のように表示されます。失敗時は該当行が赤くなり、expected ... to be ... のように「期待した値」と「実際の値」の差分が出ます。失敗表示が出ても壊れたわけではなく、どのACが未達かを教えてくれている状態です。

テストファイルの各 it() には「AC-01:」などのラベルが付いており、どの受け入れ基準に対応しているかが分かるようになっています。

テストが失敗した場合の確認ポイント
  • ValidationError をthrowしているか(AC-01)
  • 空白のみの文字列も拒否しているか(trim() を使っているか)
  • 元の配列を変更していないか(push ではなくスプレッド演算子を使っているか)

関連手法との位置づけ

TDD・BDD・ATDD・SDDは対立する手法ではなく、対象とするレイヤーが異なります。

SDD 仕様・プロジェクト方向性 BDD / ATDD 振る舞い・受け入れ基準 TDD ユニット・コードレベル
手法対象レイヤー主な文書AIとの相性
TDD ユニット・関数レベル テストコード テスト生成に向く
BDD 振る舞い・シナリオ Given/When/Then シナリオ テストシナリオ生成
ATDD 受け入れ基準 受け入れテスト 受け入れテスト自動化
SDD プロジェクト全体の方向性 spec.md / CONSTITUTION.md AIの一貫性確保・指示の根拠

実践では「SDD(仕様)→ BDD/ATDD(受け入れ基準)→ TDD(ユニットテスト)」の順に上から下へと具体化していきます。このハンズオンの spec.md は SDD レイヤー、test/todo.test.ts は TDD と ATDD のレイヤーを同時に担っています。

参考資料

演習課題: SDD で仕様から実装まで体験する

TODOアプリのハンズオンを終えたら、以下のステップで独自の仕様を書いて実装まで進めてください。

A

題材を選ぶ

以下のどれか一つを選んでください。

  • メモ帳アプリ(追加・編集・削除・検索)
  • タイマー(開始・一時停止・リセット・ラップ)
  • 体重ログ(記録・グラフ表示・週平均)
B

spec.md を EARS 形式で書く

受け入れ基準(AC-01〜AC-05)を最低 5 件書いてください。各 AC は Given/When/Then または When/The の形式で記述します。

# [アプリ名] 仕様書

## [機能名]

### AC-01: [タイトル]
- Given [前提条件]
  When [ユーザーの操作]
  Then [期待される結果]
C

plan.md に型定義を書く

spec.md を元に、必要なインターフェースと関数の一覧を書いてください。実装の詳細ではなく「何が必要か」だけを書きます。

interface [モデル名] {
  id: string;
  // ...フィールドを列挙
}

// 必要な関数の一覧(シグネチャのみ)
add[モデル名](items: [モデル名][], data: Omit<[モデル名], 'id'>): [モデル名][]
delete[モデル名](items: [モデル名][], id: string): [モデル名][]
D

AIアシスタントに実装させて検証する

spec.md と plan.md が揃ったら、お使いのAIコーディングツール(Claude Code / Cursor / GitHub Copilot / Gemini CLI など)に以下のように指示してください。プロンプトはツール共通です。

specs/spec.md と specs/plan.md を読んで、
AC-01 と AC-02 を満たす関数を src/[ファイル名].ts に実装してください。
実装後に Vitest でテストが通ることを確認してください。
検証のポイント: テストをグリーンにするだけでなく、「仕様に書いていない機能が追加されていないか」も確認してください。過剰実装は後の手戻りの原因になります。

よくある質問

仕様を書くのに何時間かかりますか?

受け入れ基準 5〜7 件を EARS 形式で書くには、初回は 1〜2 時間かかります。2 回目以降は 30 分以内になるのが一般的です。「完璧な仕様を書こうとしない」のが最大のコツです。コードを書き始めたら判明する部分は後から加筆します。

仕様が変わったときはどうしますか?

spec.md を先に更新してから実装を変えます。この順番が重要です。逆(コードを変えてから spec.md を更新)だと、仕様書がコードの後追いになり、ソースオブトゥルースとしての機能を失います。仕様変更のたびに AC の番号はそのまま残し、内容を更新してください。

CONSTITUTION.md には何を書けばいいですか?

「このプロジェクトで AI が守るべきルール」を書きます。具体的には、使用する言語・フレームワーク(TypeScript / Vitest など)、禁止事項(any 型の使用禁止、push による配列変更禁止)、ファイル配置のルール(src/ と test/ の対応)などです。内容が多いほど AI の出力が安定しますが、まず 10 行から始めてください。

Spec Kit と Kiro はどう違いますか?

Spec Kit は Claude Code・Cursor などの既存エディタへの追加ツールです。OSSで設定の自由度が高い一方、自分でファイルを整備する必要があります。Kiro は AWS が提供する IDE 自体で、SDD フローが最初から組み込まれています。既にClaude Code を使っているなら Spec Kit が導入コストゼロです。新環境を構築するなら Kiro のほうがセットアップが楽です。

小規模プロジェクトでも SDD は必要ですか?

関数 1〜2 本の小さな実装なら仕様書は不要です。SDD が効果を発揮するのは「複数の機能がある」「AI セッションをまたぐ」「複数人が触る」のいずれかに当てはまる場合です。「2 日以上かかりそうな開発」を一つの目安にしてください。

チームへの導入ガイド

個人での習得が済んだら、チームへ広げる段階です。仕様書を書く文化は一日では定着しません。

導入ステップ

フェーズ期間やること
試験導入 1〜2週 新規機能1件だけ spec.md を書いて実装する。チームに強制しない
テンプレート整備 3週 spec.md・plan.md・tasks.md のひな形をリポジトリに置く。CONSTITUTION.md を合意して配置する
ルール化 4〜6週 「新機能は spec.md が必須」をPRルールに加える。CI でファイルの存在チェックを入れる
振り返り 6週以降 「仕様書ありとなしで手戻りはどう変わったか」を数値化して共有する
抵抗への対応: 「仕様を書く時間がない」という声には、「spec.md がないと AI への指示を毎回説明し直す時間が発生する」という現実を示すのが有効です。仕様書は手間ではなく、AI との協業コストを下げるインフラです。

次に読む

もう片方の開発原則も確認しましょう

GUIDE TOP
ガイドトップに戻る
TDD と SDD の入口ページ
TDD
テスト駆動開発を見る →
Red → Green → Refactor