コードを書く前に仕様を固める。AIを使いこなす設計思想。
Spec → Design → Tasks → Implement の4フローを持つAgentic IDE(AIエージェントが主体的に作業を進めるコード編集環境)。VS Codeをベースにしており、慣れたエディタ操作のまま使えます。
Claude Code・Cursor・GitHub Copilot・Gemini CLIなど複数のAIツールに対応したOSSツールキット。ツールに依存せず、仕様から実装まで同じコマンド群で進められます。
2025年、AWSが「Kiro」をリリースし、GitHubが「Spec Kit」を公開しました。背景にあるのはAIコーディングの普及による新しい問題です。AIは1時間で数千行のコードを生成できますが、指示のブレや文脈の散逸が起きやすく、大きなプロジェクトで一貫性を保つことが困難になりました。
仕様駆動開発(Spec-Driven Development、以下 SDD)は、仕様書をソースオブトゥルース(source of truth、システムにとっての情報の唯一の正しい出どころ。仕様とコードが食い違ったときは仕様書を正とする)として扱う開発手法です。コードより先に「何を作るか」を文書化し、AIへの指示もその仕様を参照させます。
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ツール上で使えるようになります。
Claude Codeのカスタムコマンドとして実装したSDD再現ツールです。Spec Kitに近いアプローチで、既存のClaude Code環境にそのまま導入できます。
EARS(Easy Approach to Requirements Syntax、要件記述の簡易アプローチ)は、2009年に Alistair Mavin らが提唱した要件記述フォーマットです(原論文の題名は "Easy Approach to Requirements Syntax (EARS)")。ふつうの文章で書くと「速く」「正しく」など解釈の幅が残りますが、EARS は文の型を数種類に絞ることで曖昧さを減らします。この「解釈の幅を残さない」性質がAIへの指示と相性がよく、SDD実践者の間で広く使われています。
下の表は代表的な3つの型です。まずは一番上の「条件付き動作」だけ使えれば、TODOアプリ程度の仕様は書けます。
| パターン | 構文 | 用途 |
|---|---|---|
| 条件付き動作 | Given [前提] When [操作] Then [結果] |
ユーザー操作の結果を表現 |
| 状態依存 | While [状態] [システムは][動作]する |
継続的な状態中の動作を表現 |
| イベント駆動 | When [イベント] The [システムは][動作]する |
単発イベントへの反応を表現 |
実際の仕様書ファイル spec.md はこのような見た目になります。見出しで機能を区切り、その下に受け入れ基準(AC=Acceptance Criteria、実装が満たすべき合否ライン)を EARS 形式の箇条書きで並べます。1件目は正常系、2件目は空欄エラー、3件目はEnterキー操作を定義しています。
# TODOアプリ 仕様書(EARS形式) # 見出し(##)で機能ごとに区切り、その下に受け入れ基準を並べる ## タスク追加 - Given テキスト入力欄に1文字以上入力している When ユーザーが「追加」ボタンを押す Then そのテキストを持つTODOがリストの末尾に追加される - When ユーザーが空のテキスト入力欄で「追加」ボタンを押す The システムはTODOを追加せず、 エラーメッセージ「タスク名を入力してください」を表示する - While テキスト入力欄にフォーカスがある When ユーザーがEnterキーを押す The システムはボタン押下と同じ追加処理を実行する
要件そのものの書き方を、あいまいな文とEARS形式で比べます。なぜEARSの方が良いのかを右側の下に添えました。
「タスク名が空でも、うまくエラーにしてほしい。」
→ 「うまく」が何を指すか不明。エラーの出し方(メッセージ?例外?無視?)も、いつ判定するのかも読み手任せ。人によってもAIのセッションによっても実装が変わります。
「When ユーザーが空のテキスト入力欄で『追加』ボタンを押す/The システムはTODOを追加せず、エラーメッセージ『タスク名を入力してください』を表示する」
→ きっかけ(空欄で追加押下)と結果(追加しない+固定文言を表示)が1文で確定。テストにそのまま写せるので、実装の正否を機械的に判定できます。これが「良い」理由です。
要件が定まったら、AIへの指示も仕様を参照させる形にします。
「TODOアプリを作ってください。追加・削除・完了ができるやつで。」
→ AIの解釈次第。エラー処理の有無もフィルター機能の要否も不明で、次のセッションでは別物ができます。
「specs/spec.md を読んで、AC-01 の受け入れ基準を満たすように addTodo 関数を実装してください。」
→ 判断基準が仕様書に固定されるので、何度指示しても同じ結果に収束します。
AIコーディングツールが普及する前、仕様書の「費用対効果」は低く見られがちでした。小規模プロジェクトなら口頭確認で済む、というのが実態でした。
AIが変えたのは「生産速度」です。Claude CodeやGitHub Copilotは1時間で数百〜数千行のコードを出力します。人間がレビューしきれない速度でコードが積み上がると、仕様の曖昧さが即座に技術的負債になります。
| 観点 | 仕様なし | SDD(仕様あり) |
|---|---|---|
| AI出力の一貫性 | セッションごとに解釈が変わる | spec.mdを参照させるため再現性が高い |
| レビューの基準 | 「なんとなく正しい」 | 受け入れ基準(AC-xx)で合否が明確 |
| 手戻りコスト | 実装後に要件漏れが発覚 | 実装前に仕様で検出できる |
| チームでの分業 | 口頭合意が分散 | spec.mdが全員の参照先になる |
SDDの本質は「何を決めるか(仕様)」を人間が担当し、「どう実装するか(コード)」をAIが担当する境界の明確化です。仕様書のない環境では、AIが「何を作るか」まで判断し始め、人間がその出力を追認する構造になりがちです。
node -v を実行してバージョンが表示されれば準備完了です)サンプルフォルダ(sample/)を使って、SDDフローを体験してください。以降の「AIに指示する」場面は、お使いのAIコーディングツール(例えば Claude Code / Cursor / GitHub Copilot / Gemini CLI など)のどれでも同じプロンプトで進められます。プロンプト文はツール共通で使えます。
なぜ最初に構造を見るのか: どこに仕様(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
specs/spec.md を開き、受け入れ基準(AC-01〜AC-07)を確認してください。
特に AC-01 と AC-02 が「空文字の拒否」と「追加後リセット」を定義しているか確認します。
「空文字でのTODO追加を拒否し、エラーを表示する」が spec.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; // 作成日時 }
なぜ tasks.md を見るのか: 仕様と設計を、AIに一度に渡すには大きすぎることがあります。tasks.md は作業を小さな単位に割り、それぞれがどの受け入れ基準(AC)に対応するかを明示します。1タスク=1指示にすると、AIの出力を検証しやすくなります。specs/tasks.md を開き、Task 1〜5 のそれぞれが「どの受け入れ基準に対応しているか」を確認してください。Task 1 は AC-01・AC-02 に対応しています。
なぜここでAIに任せるのか: 「何を作るか」は仕様書で確定済みなので、「どう書くか」はAIに委ねられるからです。お使いのAIコーディングツール(例えば Claude Code なら統合ターミナルで、Cursor や Copilot ならチャット欄で)に、次のプロンプトをそのまま渡してください。プロンプトはツール共通で使えます。
specs/spec.md と specs/tasks.md を読んで、 Task 1(addTodo 関数)を src/todo.ts に実装してください。 AC-01 と AC-02 の受け入れ基準を必ず満たすようにしてください。
なぜテストするのか: 仕様(AC)を満たしているかを、目視でなく機械的に確かめるためです。ターミナルコマンドはどのツールでも同じです。まだ依存パッケージを入れていなければ最初に npm install を実行してから、テストを走らせてください。
# 依存パッケージの導入(初回のみ) npm install # テストを実行する(npm test でも npx vitest run でも可) npx vitest run
成功時は各テストの左に緑のチェックが並び、末尾に Test Files 1 passed のように表示されます。失敗時は該当行が赤くなり、expected ... to be ... のように「期待した値」と「実際の値」の差分が出ます。失敗表示が出ても壊れたわけではなく、どのACが未達かを教えてくれている状態です。
テストファイルの各 it() には「AC-01:」などのラベルが付いており、どの受け入れ基準に対応しているかが分かるようになっています。
TDD・BDD・ATDD・SDDは対立する手法ではなく、対象とするレイヤーが異なります。
| 手法 | 対象レイヤー | 主な文書 | 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 のレイヤーを同時に担っています。
TODOアプリのハンズオンを終えたら、以下のステップで独自の仕様を書いて実装まで進めてください。
以下のどれか一つを選んでください。
受け入れ基準(AC-01〜AC-05)を最低 5 件書いてください。各 AC は Given/When/Then または When/The の形式で記述します。
# [アプリ名] 仕様書 ## [機能名] ### AC-01: [タイトル] - Given [前提条件] When [ユーザーの操作] Then [期待される結果]
spec.md を元に、必要なインターフェースと関数の一覧を書いてください。実装の詳細ではなく「何が必要か」だけを書きます。
interface [モデル名] { id: string; // ...フィールドを列挙 } // 必要な関数の一覧(シグネチャのみ) add[モデル名](items: [モデル名][], data: Omit<[モデル名], 'id'>): [モデル名][] delete[モデル名](items: [モデル名][], id: string): [モデル名][]
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 の番号はそのまま残し、内容を更新してください。
「このプロジェクトで AI が守るべきルール」を書きます。具体的には、使用する言語・フレームワーク(TypeScript / Vitest など)、禁止事項(any 型の使用禁止、push による配列変更禁止)、ファイル配置のルール(src/ と test/ の対応)などです。内容が多いほど AI の出力が安定しますが、まず 10 行から始めてください。
Spec Kit は Claude Code・Cursor などの既存エディタへの追加ツールです。OSSで設定の自由度が高い一方、自分でファイルを整備する必要があります。Kiro は AWS が提供する IDE 自体で、SDD フローが最初から組み込まれています。既にClaude Code を使っているなら Spec Kit が導入コストゼロです。新環境を構築するなら Kiro のほうがセットアップが楽です。
関数 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週以降 | 「仕様書ありとなしで手戻りはどう変わったか」を数値化して共有する |