DBC Tech Academy / AI / 入門
バイブコーディングから
仕様駆動開発へ書かれていない決まりを見つけ、仕様で AI に作らせ、仕様と照らして確かめる
バイブコーディング (vibe coding) は、作りたい物を文章で AI に頼み、動かしながら直させて作る進め方です。手早く形になりますが、依頼に書かなかった決まりは AI が推測で決めるため、出来上がったアプリには、誰も決めていない決まりが入り込みます。仕様駆動開発 (spec-driven development) は、決まりを見つけて仕様の文書に書き、その仕様で AI に作らせ、仕様と照らして確かめる進め方です。プログラマーでない人が、業務のアプリから社外に売るサービスまで、AI に作らせるときに使います。
この講座で学ぶこと
- AI が、依頼に書かれていない決まりを推測で埋める仕組み
- 業務の流れ・状態の移り変わり・観点の一覧から、書くべき決まりを見つける方法
- AI に質問させて、仕様の抜けを埋める手順
- 決まりを番号つきの受け入れ基準に書き、設計・タスク・テストへつなぐ方法
- 仕様で AI に作らせ、仕様と照らして確かめる手順
- 変更や機能の追加で、仕様を最新に保つ方法
- アプリの規模と、外れたときの損害に合わせて、仕様の詳しさを決める判断
前提知識
ChatGPT や Claude に文章で頼みごとをしたことがあれば読めます。コードを書く知識は前提にしません。データベースや権限などの用語は、講座の中で必要な分を説明します。
Try it
AI にアプリを作らせるには、何を伝えればよいのか
「社員 40 人の会社で使う、ノート PC・プロジェクター・社用車の貸出を管理する Web アプリを作ってください」。この 1 行だけを AI に渡すと、AI は 30 を超えるファイルを作り、完了を報告しました。報告を読んで、AI が推測で決めた所がいくつあるかを当ててみましょう。
1AI の完了報告を読む
## できること - 予約: 開始と返却予定の日時、利用目的、行き先(社用車は必須)を入力します。 同じ機材で時間が重なる予約は、データベース側で弾きます。予約は90日先まで、1回14日以内です。 - 貸出開始・返却: 社用車は出発時と返却時に走行距離計の値を入れます。 (中略) ## 私の判断で決めたこと(違えば直します) - 予約の承認は不要: 空いていれば即確定です。 - 予約は全社員が全員分を見られる: 誰が車を使っているかが分かる方が、40人規模では便利と判断しました。 - 通知は無し: 返却遅れは画面に表示するだけで、メール通知はありません。
2このアプリを 1 か月使う
3作る前に、自分で決める
同じ試作の画面です。印の付いた所は、1 行の依頼に書かれていなかったため、AI が推測で決めた所です。自分の職場ならどうするかを選んでください。選ぶと画面が変わり、AI に渡す依頼文に仕様の文が 1 行加わります。
完了報告は、1 行の依頼だけで Claude Code に作らせた試作が実際に出した報告の抜粋です。推測の一覧とアプリの画面は、その試作の動きをこの講座で描き直したものです。1 か月の出来事と、決めた後の画面は、推測が業務でどう表れるかを示すために描いた例で、実際に起きた出来事や試作の結果ではありません。社員の名前と日付は例です。
Use cases
どの業務アプリにも、AI が推測で決める所がある
業務アプリには、職場ごとの決まりがあります。画面や機能の名前を伝えるだけでは、決まりまでは伝わりません。自分の業務に近い行を見てみましょう。
| 業種・部署 | 作るもの | 書かなければ AI が推測で決めること |
|---|---|---|
| 総務 | 備品の貸出管理 | 他の社員の予約が見えるか、返却を記録する人、返却が遅れたときの知らせ方 |
| 経理 | 経費精算の申請 | 承認の順番、金額の上限、差し戻した申請を直して出し直せるか |
| 店舗・サロン | 予約の受付 | キャンセルの期限、同じ時間に 2 件入ったときの扱い、無断キャンセルを続けた人の扱い |
| 営業 | 案件・商談の記録 | 担当者が他人の案件を見られるか、退職者の案件の引き継ぎ |
| 起業・新規事業 | 月額課金の Web サービス | 顧客 A のデータが顧客 B から見えないこと、支払いが失敗したときの利用停止、解約後のデータ |
| 個人 | 自分用の家計簿・作業記録 | 過去の記録を消せるか、集計の締め日、データの書き出し |
01 / Basics
AI は書かれていない決まりをどう埋めるか
AI コーディングエージェント (AI coding agent) は、文章の指示を受けて、ファイルを読み書きし、コマンドを実行して、ソフトウェアを作る AI です。Claude Code・Cursor・GitHub Copilot・Kiro のほか、ブラウザだけで使える Lovable・Replit などがあります。
(1) 書いていないことは推測で埋める
指示を文字どおりに受け取り、指示に無い決まりは、よくある作り方で埋めて作ります。
(2) 一度に扱える量に上限がある
読める量はコンテキストウィンドウの大きさまでです。会話が長くなると、前半の取り決めは要約されて細部が抜けます。
(3) 会話が変わると、取り決めは引き継がれない
新しい会話の AI は、前の会話で決めたことを知りません。引き継ぐ決まりはファイルに書いて読ませます。
(4) 文章の指示に従うかは AI が決める
文章で禁止しても、実行を確実に止められるわけではありません。確実に止めるのは設定です。
図 1 の 1 つ目が、この講座の出発点です。GitHub は、AI コーディングエージェントを「文字どおりに受け取るペアプログラマー (literal-minded pair programmers)」と呼び、曖昧な指示は、書かれていない要件の推測を AI に強いると説明しています。「備品の貸出を管理するアプリ」とだけ頼めば、他の社員の予約が見えるか、誰が返却を記録するかは、AI がよくある作り方から選びます。選んだ作り方は、どれも筋が通っています。ただ、その職場の決まりと合っているかは、出来上がった画面を動かすまで分かりません。
推測を減らすには、決まりを言葉にして AI に渡します。ところが、渡した言葉も、図 1 の残りの 3 つの性質のせいで失われます。AI が一度に読める文章の量をコンテキストウィンドウ (context window) と呼び、会話の履歴・読んだファイル・コマンドの出力は、すべてこの中に入ります。Claude Code は、会話がコンテキストウィンドウを使い切りそうになると、それまでの会話を自動で要約して続けます。要約で細部が抜けるので、会話の最初に決めた細かい取り決めは、長い会話の後半で守られなくなることがあります。
会話を新しく始めると、前の会話で決めたことは AI に伝わっていません。昨日の会話で「社用車は延長できない」と決めても、今日の会話の AI は知りません。そのため各製品には、会話のたびに AI が自動で読むファイルがあります。Claude Code の CLAUDE.md、多くの製品が共通で読む AGENTS.md などです。続けて守らせたい決まりは、会話ではなくファイルに書きます。
ファイルに書いた決まりにも、守られる保証はありません。Claude Code の公式ドキュメントは、プロンプトや CLAUDE.md に文章で書いた指示は AI が読んでどうするかを決めるもので、見落としや誤った解釈が起こりうると説明しています。これに対して、権限の設定やフック (hook) のように Claude Code 自体が実行する仕組みは、AI の判断に関係なく毎回働きます。たまに外れても直せばよい決まりは文章で書き、1 回でも破られると取り返しがつかない決まりは設定で縛ります。
ソフトウェアは、作る前に「何を作るか(要求)」と「どう作るか(設計)」を決めてからコードを書きます。この 2 つの工程を飛ばしても、決めることは無くなりません。決めていない決まりは、コードを書く人がその場で決めます。AI にコードを書かせるとき、その場で決めるのは AI です。
02 / Vibe coding
バイブコーディングで抜けが積み上がる
バイブコーディングは、作りたい物を文章で AI に伝え、出来上がった物を動かし、気になる所をまた文章で直させて作る進め方です。
この語は、2025 年 2 月 2 日に AI 研究者の Andrej Karpathy が X への投稿で名付けました。Karpathy は、雰囲気 (vibes) に身を任せ、コードが存在することさえ忘れて AI に任せる作り方として紹介し、週末に作って捨てる程度のものなら悪くないと書いています。開発者の Simon Willison は、この語の意味を「AI が書いたコードを読まずにソフトウェアを作ること」と整理しています。この講座でも、決まりを先に書かず、AI の出力を中身を確かめずに受け入れて進めることを、バイブコーディングと呼びます。
例として、「社員40人の会社で使う、ノートPC・プロジェクター・社用車の貸出を管理するWebアプリを作ってください。」の 1 行だけを Claude Code に渡して作らせました。AI は 30 を超えるファイルを作り、予約・貸出・返却・週間の空き状況・管理者の画面までをそろえました。同じ備品で時間が重なる予約は、データベースの制約で防ぐ作りになっていました。一方で、1 行に無かった決まりは、AI が次のように決めていました。
| 観点 | AI が決めたこと | 完了報告での扱い |
|---|---|---|
| 見える範囲 | 全社員が全員の予約を見られる。「誰が車を使っているかが分かる方が、40 人規模では便利」と判断した | AI の判断として報告した |
| 承認 | 予約は承認なしで、空いていれば即確定する | AI の判断として報告した |
| 知らせ | 返却遅れは画面に表示するだけで、メールでは知らせない | AI の判断として報告した |
| 期限と上限 | 予約は 90 日先まで、1 回 14 日以内。備品の種類による違いは無い | できることの 1 つとして書いた |
| 変えられる人 | 役割は管理者と一般社員の 2 つで、借りた本人が貸出と返却を自分で記録する | 触れていない |
| 資格と条件 | 社用車の予約で運転免許を確かめない。利用者のデータに免許の項目が無い | 触れていない |
どれも、作りとしては筋が通っています。問題は、誰もそれを決めていないことです。AI は完了報告の最後に「私の判断で決めたこと(違えば直します)」として 3 つを挙げましたが、表の下の 3 つは推測だと示していません。依頼した人が報告を読んでも、推測で決まった所をすべて知ることはできません。
この試作は、書き手の環境の CLAUDE.md(使う言語、ID の形、操作の記録を残すことなどの取り決め)を AI が読んだ状態で作らせました。取り決めに書いてあった操作の記録や ID の形は、そのとおりに作られました。推測で決まったのは、取り決めにも依頼にも無かった業務の決まりだけです。書いた所は書いたとおりになり、書かなかった所は推測で決まります。
推測で決まった決まりは、作り進めるうちに直しにくくなります。経路は 4 つあります。
データの形に入り込む
運転免許を確かめたくなっても、利用者のデータに免許の項目がありません。項目を足し、画面を足し、予約の処理を直すことになります。外れた推測は、作り込んだ後に見つかるほど直す範囲が広がります。
直すほど、前の取り決めが抜ける
直しの依頼を重ねて会話が長くなると、最初に決めた取り決めが要約で抜けます。AI は前に直した所を元に戻したり、別の作り方で作り直したりします。
何を作ったか説明できない
決まりが会話の中にしか無いので、アプリが何をどう扱うのかを、依頼した本人も説明できません。他の人に引き継げず、変えるときに何が壊れるかも分かりません。
安全の要件も作られない
業務の決まりと同じく、依頼に書かなかった安全の要件は作られません。見てはいけないデータが見える、してはいけない操作ができる、という不備になります。
4 つ目の経路は、研究でも確かめられています。Junquan Deng らは、Claude Code と Lovable で作られて公開されているアプリ 200 件を調べ、91.0% に 1 件以上の脆弱性を見つけました。多かったのは、アクセス制御の不備(見てはいけないデータが見える、操作してはいけない操作ができる)28.6%、インジェクション 16.8%、認証の不備 14.8% です。原因の 55.5% は、利用者の依頼に書かれていなかった安全の要件を、AI が作らなかったことでした。Songwen Zhao らの研究 (SusVibes) では、実際のオープンソースの機能追加 186 件を AI コーディングエージェントに解かせたところ、最も成績の良い組み合わせでも、機能が正しく動いた解は 57%、安全だった解は 11.8% でした。依頼文に脆弱性の注意を書き足しても、結果は改善しませんでした。
推測で決まる所を減らすには、作らせる前に決まりを見つけて書き、書いたとおりに作られたかを確かめます。仕様駆動開発は、この作業を手順にした進め方です。
03 / How SDD works
仕様駆動開発の仕組み
仕様駆動開発 (spec-driven development, SDD) は、コードを書く前に仕様を書き、その仕様を人と AI が判断するときの基準にして AI に作らせる進め方です。
Thoughtworks の Birgitta Böckeler は、仕様駆動開発を調べた記事で、仕様を「AI コーディングエージェントを導くために自然な言葉で書いた、ソフトウェアの振る舞いを決める構造化された文書」と定義しています。2025 年 7 月に AWS が開発環境の Kiro を、9 月に GitHub が Spec Kit を公開し、仕様駆動開発の手順を支援するツールが登場しました。ツールごとに呼び名は違いますが、工程は図 2 の 5 つにまとまります。
図 2 の最初の 2 つは、バイブコーディングで飛ばしていた工程です。決まりを見つけて書くのは人で、AI は質問を出し、下書きを書いて手伝います。書かれた仕様は、作らせる工程で AI に読ませる指示になり、確かめる工程で出来上がった物を測る物差しになります。運用中に変更が出たら、コードより先に仕様を直します。
Böckeler は、AI に読ませる文書を 2 種類に分けています(図 3)。仕様は、1 つの機能を作る・変える作業のための文書です。メモリーバンク (memory bank) は、どの作業でも AI に読ませる取り決めの文書で、使うコマンド、コードの書き方、全体の構成などを書きます。会話のたびに AI が自動で読む CLAUDE.md・AGENTS.md はメモリーバンクにあたり、Kiro ではステアリング (steering)、Spec Kit では constitution と呼びます。Spec Kit の説明は、constitution はプロジェクトに 1 回作り、残りの手順は機能ごとに繰り返すとしています。
仕様が AI の作業を縛る仕組み
仕様を書いても、AI がそれを読まなければ、また推測で作ります。仕様駆動開発は、次の 4 つの仕組みで、仕様を AI の作業に効かせます。
1 つ目は、番号のつながりです。要件の受け入れ基準に番号を付け、設計・タスク・テストの項目から、その番号で参照します。Spec Kit の仕様の雛形は、要件を FR-001 のような番号で書きます。Spec Kit の /speckit-analyze は、要件の番号ごとに対応するタスクがあるかを表にし、タスクが 1 つも無い要件を抜けとして報告します。番号がつながっていれば、図 4 のように、1 つの決まりがどこで作られ、どのテストで確かめられるかを、コードを読まずにたどれます。
番号のつながりがあると、2 つのことができます。1 つは抜けの発見です。設計やテストに番号が現れない受け入れ基準は、作られていないか、確かめられていません。もう 1 つは変更の追跡です。R4-1 を変えたら、R4-1 が付いた設計・タスク・テストだけを直せば済みます。
2 つ目は、工程ごとに人が確かめてから次に進むことです。Spec Kit の説明は、手順を 1 つずつ実行し、結果を確かめてから続けるよう求めています。Kiro も、要件を利用者が確かめた後に設計の文書を作ります。要件の誤りを要件のうちに直せば、設計とコードに誤りが広がりません。人が確かめずに次へ進めると、AI の推測が文書の形で残るだけになります。
3 つ目は、仕様を読ませてから作らせることです。作らせるときは、新しい会話で、メモリーバンクと仕様のファイルを読ませ、タスクを 1 つだけ頼みます。会話の中で決めたことは次の会話に引き継がれませんが、ファイルに書いた仕様は毎回同じ形で読ませられます。
4 つ目は、文章で守らせられない決まりを設定で縛ることです。仕様は文章なので、AI が従う保証はありません。テストのファイルを変えさせない、本番のデータベースに触らせない、のように、1 回でも破られると困る決まりは、権限の設定や環境の分離で縛ります。
Böckeler は、仕様駆動開発を、仕様を残す期間で 3 つの段階に分けています。
| 段階 | 仕様の扱い | 向く場面 |
|---|---|---|
| spec-first | 作業の前に仕様を書き、その作業に使う。作業が終われば仕様は使わない | 使い終われば手を入れない物、1 回きりの機能追加 |
| spec-anchored | 作業が終わっても仕様を残し、機能を変えるときも仕様から直す | 使いながら変更が続くアプリ |
| spec-as-source | 人は仕様だけを直し、コードには触らない。コードは仕様から作り直す | まだ試みの段階。同じ仕様からでもコードが毎回変わる問題がある |
この講座は、spec-anchored の段階で進めます。使い始めたアプリには変更が続き、仕様を残しておかなければ、番号のつながりも、何を作ったかの説明も失われるからです。ツールごとの工程の名前は、次のとおりです。
| 工程 | Kiro | Spec Kit | Claude Code |
|---|---|---|---|
| 取り決め | ステアリング(product.md・structure.md・tech.md) | /speckit-constitution | CLAUDE.md(AGENTS.md) |
| 要件と抜けの質問 | requirements.md(EARS 記法の受け入れ基準) | /speckit-specify、/speckit-clarify | AI に質問させて SPEC.md を書かせる |
| 設計 | design.md | /speckit-plan | プランモードで設計を出させる |
| タスクと対応の確認 | tasks.md | /speckit-tasks、/speckit-analyze | 設計からタスクの一覧を書かせる |
| 実装と照合 | タスクを 1 つずつ、またはまとめて実行 | /speckit-implement と /speckit-converge | 新しい会話で作らせ、別の AI に仕様と照らさせる |
この講座は、特定のツールに依存しない共通の工程で進め、仕様を Markdown(見出しや箇条書きを書けるテキスト形式)のファイルにまとめます。Kiro や Spec Kit を使う場合も、各工程で決めることは同じです。
04 / Discover
書くべき決まりを見つける
書くべき決まりは、業務の流れと、データの状態が移り変わる所に隠れています。決まりは、流れを書き出し、状態を並べ、観点の一覧に当てて見つけます。
最初に、今の業務の流れを書き出します。Excel・紙・口頭で回している今のやり方を、誰が・いつ・何をするかの順に並べます。経費精算なら、「社員が申請する → 上長が承認する → 経理が確かめる → 経理が支払う」です。流れを書くと、役割(社員・上長・経理)と、各段階で操作する人が決まります。役割を書かずに作らせると、AI は「誰でも何でもできる」作りを選びがちです。
次に、流れの中でデータがとる状態を並べ、状態から状態へ移る所を表にします。決まりの多くは、この移り変わりに隠れています。
| 状態 | 次に移れる状態 | 移す人・きっかけ | ここで決めること |
|---|---|---|---|
| 下書き | 申請中 | 申請者が出す | 出す前に必須の入力(領収書の画像、金額、目的) |
| 申請中 | 承認済み / 差し戻し / 取下げ | 上長が承認・差し戻す / 申請者が取り下げる | 承認する人、金額で承認者が変わるか、取り下げられる期限 |
| 差し戻し | 申請中 / 取下げ | 申請者が直して出し直す | 直せる項目、出し直せる回数 |
| 承認済み | 支払済み / 差し戻し | 経理が支払う / 経理が差し戻す | 経理が差し戻せるか、承認後に金額を直せるか |
| 支払済み | (なし) | 記録を消せるか、何年残すか |
表を作ると、「差し戻した申請は直して出し直せるか」「承認した後に経理が差し戻せるか」のような問いが、空いた欄として見えてきます。1 行で頼めば、こうした欄は AI がよくある作り方で埋めます。
最後に、流れと状態の表を、次の観点の一覧に当てます。観点は、業務アプリで AI が推測しやすい所を、問いの形にしたものです。
| 観点 | 問い | 備品の貸出 | 経費精算 | 店の予約 |
|---|---|---|---|---|
| 見える範囲 | 誰が、誰のデータを見られるか | 他の社員の予約の中身 | 他部署の申請と金額 | 他の客の予約と名前 |
| 変えられる人 | 誰が登録・変更・取消・記録できるか | 貸出と返却を記録する人 | 申請を直せる人 | 予約を動かせる人(客・店員) |
| 期限と上限 | いつから・いつまで・どれだけ | 何日前から予約でき、何日借りられるか | 申請の期限、金額の上限 | キャンセルの期限、1 人の予約数 |
| 重なりと競合 | 同時に起きたらどうするか | 同じ備品の重なる予約 | 同じ領収書の二重申請 | 同じ時間の 2 件の予約 |
| 必須の入力 | 何が無ければ受け付けないか | 社用車の行き先 | 領収書の画像 | 電話番号 |
| 資格と条件 | 操作の前に何を確かめるか | 運転免許の有効期限 | 出張の事前申請の有無 | 会員かどうか |
| 承認 | 誰の承認で確定するか | 社用車だけ上長の承認 | 金額で承認者が変わるか | 予約を店が確定するか |
| 取消・変更 | どの状態まで、誰が戻せるか | 貸出の前まで取り消せる | 承認後の取下げ | 当日の変更 |
| 例外 | うまくいかないときどうするか | 借りた備品が壊れた | 承認者が不在 | 無断キャンセル |
| 知らせ | いつ、誰に、何で知らせるか | 返却遅れを本人と総務にメール | 差し戻しを申請者に | 前日の確認の連絡 |
| 消すことと残すこと | 誰が消せるか、戻せるか、何年残すか | 貸出の履歴は消さない | 支払済みの記録の保存年数 | 退会した客の個人情報 |
| 安全 | 役割の外の操作を拒むか | 社員が他人の予約の番号を指定しても開けない | 申請者が自分の申請を承認できない | 客が他の客の予約を開けない |
1 行の依頼で作らせた備品貸出の試作で推測された決まりは、どれもこの一覧のどれかの観点に当たります。一覧は、自分の業務に合わせて足してかまいません。当てはまらない観点は「なし」と書き、考えた跡を残します。空欄のままにすると、考えて「なし」にしたのか、考えていないのかを、後から区別できません。
GitHub の Spec Kit にも、同じ考え方の手順があります。/speckit-clarify は、仕様を、機能の範囲、データと状態の移り変わり、例外と失敗、同時の編集の扱い、性能などの非機能、完了の判定のしかた、といった分類で走査し、抜けている所を最大 5 問の選択式の質問にして尋ね、答えを仕様に書き戻します。
AI に質問させて抜けを埋める
観点の一覧を自分で当てた後は、AI にも抜けを探させます。AI は、よくある作り方を知っているので、どこが決まっていないかを見つけるのは得意です。Claude Code の公式ドキュメントは、何を作るかがまだ固まっていないときの頼み方として、次の指示を例に挙げています。
(仕様を書けるようになるまで私に質問し、書けたら SPEC.md に書いてください)Claude Code Docs: Best practices for Claude Code
この講座では、書いた下書きを渡し、観点を添えて頼みます。
specs/expense/requirements.md を読んでください。まだ実装はしないでください。 この要件で決まっていない点を、業務の判断が要るものから順に、1 つずつ選択式で質問してください。 見える範囲、変えられる人、期限と上限、重なり、承認、取消、例外、知らせ、消すことと残すこと、の観点で抜けを探してください。 答えがそろったら、requirements.md に反映した差分を見せてください。
質問には、実際の運用や、担当者と合意した決まりで答えます。分からない点は、その場で答えずに担当者に確かめます。AI が「おすすめ」として選択肢を示しても、それで決めないでください。業務の決まりを決めるのは利用する組織で、AI のおすすめは、1 行で頼んだときの推測と同じものです。
すぐに答えられない点は、仕様の中に「要確認:」と書いて残します。Spec Kit の仕様の雛形も、決まっていない所に [NEEDS CLARIFICATION] の印を付けて残す形にしています。印があれば、AI も読者も、そこが決まっていないことを見落としません。印が残っている要件のまま、作らせる工程に進まないでください。
答えた内容は、会話の中に残さず、要件のファイルに書き込ませます。会話の内容は次の会話に引き継がれませんが、ファイルは毎回読ませられます。
05 / Write
決まりを仕様に書く
見つけた決まりは、要件の文書に、操作して確かめられる文で書きます。要件には何を・なぜを書き、どう作るかは設計の文書に書きます。
要件には、次の 5 つを書きます。GitHub は Spec Kit の紹介で、要件の段階では利用者の行動と、何ができれば成功かを書き、使う技術は書かないよう勧めています。
目的と利用者の役割
何の困りごとを解決するのかを 1〜2 文で書き、役割ごとに、人数と、できること・できないことを表にします。
ユーザーストーリー
ユーザーストーリー (user story) は、「〇〇として、〇〇したい。〇〇だからだ」の形で、ある役割の人がしたいことと理由を書く文です。理由があると、AI は細部を決めるときに目的に合う作り方を選べます。
受け入れ基準
受け入れ基準 (acceptance criteria) は、要件を満たしたかを確かめる文です。ユーザーストーリーごとに、操作と結果が分かる文で書き、番号を付けます。
業務ルール
状態の移り変わり、期限と上限の数、例外の扱いなど、受け入れ基準の外にある決まりをまとめます。
作らないこと
作らない機能を書きます。書かないと、AI が気を利かせて機能を足します。
受け入れ基準の書き方には、EARS 記法 (Easy Approach to Requirements Syntax) を使います。EARS は、英国の Rolls-Royce で Alistair Mavin らが 2009 年に発表した、要件を決まった文型で書く方法で、Kiro も受け入れ基準をこの文型で書きます。文型を決めておくと、条件・主語・結果が文から抜けにくくなります。
| 文型 | 英語の形 | 日本語の形と例 |
|---|---|---|
| 常に | The <system> shall ... | システムは〜する。「システムは、支払済みの申請を消さない」 |
| 出来事 | When ..., the <system> shall ... | 〜したとき、システムは〜する。「社員が予約を申し込んだとき、システムは同じ備品の重なる予約が無いことを確かめてから確定する」 |
| 状態 | While ..., the <system> shall ... | 〜の間、システムは〜する。「申請が差し戻しの間、システムは申請者に金額と目的の変更を許す」 |
| 望まない出来事 | If ..., then the <system> shall ... | もし〜なら、システムは〜する。「もし予約の時刻を過ぎても来店の記録が無ければ、システムは無断キャンセルとして記録する」 |
| 機能の有無 | Where ..., the <system> shall ... | 〜がある場合、システムは〜する。「社用車の場合、システムは運転免許の有効期限を確かめる」 |
受け入れ基準の番号は、要件の見出しと連番で付けます(R1 予約する → R1-1、R1-2)。番号は、設計・タスク・テストの項目から参照する住所になるので、一度付けた番号は付け替えません。基準を消すときも、番号は欠番にして残します。
### R1 予約する 社員として、使いたい日時に備品を予約したい。当日に使えないと業務が止まるからだ。 - R1-1 社員が予約を申し込んだとき、システムは同じ備品の重なる時間帯に 予約が無いことを確かめてから予約を確定する - R1-3 社用車の予約を申し込んだとき、システムは利用者の運転免許の有効期限が 予約の終了日より後であることを確かめる ### R4 見える範囲 - R4-1 社員が予約の一覧を開いたとき、システムは自分の予約だけを表示する。 空き状況は全員に表示する - R4-3 社員が他人の予約の番号を指定したとき、システムは「見つからない」と表示する
設計に書くこと
要件が固まったら、設計の文書にどう作るかを書きます。設計は AI に書かせ、人は次の 5 つを確かめて選びます。GitHub は、設計の段階で人が技術・構成・制約を与え、AI に案を作らせ、必要なら複数の案を出させて比べるよう勧めています。
データの設計では、アプリが持つ情報を、表(テーブル)と項目で書きます。データは画面より先に決めます。画面は後から足せますが、データの形を後から変えると、そのデータを使うすべての画面と処理を直すことになるからです。消してよいデータと残すデータも、ここで決めます。
状態の設計では、要件の状態の表を、データの項目と、状態を移す操作に置き換えます。どの操作がどの状態からどの状態へ移せるかを書いておくと、AI が「どの状態からでも取り消せる」作りを選ぶのを防げます。
権限の設計では、役割ごとに、見られるデータと変えられるデータを書きます。必ず書くのは、権限の確認を画面ではなくサーバー側で行うことです。画面のボタンを隠すだけの作りでは、URL を直接開けば権限の外の操作ができます。公開アプリの研究で最も多かったアクセス制御の不備は、この確認が無いことで起きます。
画面の設計では、画面の一覧と、どの役割がどの画面を使うかを書きます。技術の選定では、言語・データベース・置き場所・ログインの方法を決めます。AI に候補を 2〜3 つ、理由つきで出させ、保守を頼める人が扱えるか、費用はいくらかで、人が選びます。
設計を書かせたら、受け入れ基準の番号ごとに、設計のどこで満たすかを表にさせます。表に載らない番号があれば、設計に抜けがあります。
この講座の雛形と指示文を配布しています。要件の雛形は、観点の一覧を見出しにしたもので、自分のアプリの決まりを埋めて使います。例は、1 行の依頼から書き起こした「要確認」だらけの下書きと、質問に答えて詰めた後の要件の 2 つで、並べると、どの観点が質問で埋まったかが分かります。
| ファイル | 中身 |
|---|---|
requirements-template.md | 観点を見出しにした要件の雛形 |
prompts.md | 質問させる・設計を書かせる・タスクとテスト項目に分けさせる・1 タスク作らせる・仕様と照らさせる・機能を変える、の指示文 |
example/requirements-draft.md | 備品貸出の要件の下書き(「要確認」の印つき) |
example/requirements.md | 質問に答えて詰めた後の要件 |
06 / Build
仕様で AI に作らせる
仕様ができたら、作業を小さなタスクに分け、新しい会話で 1 つずつ作らせます。
GitHub は、タスクを「小さく、単独で確かめられる」大きさに分けるよう勧めています。目安は、1 つのタスクで確かめる画面か操作が 1 つになる大きさです。各タスクには、満たす受け入れ基準の番号を付けます。タスクの順番は、データ → ログインと権限 → 主な業務の流れ → 例外の処理 → 画面の仕上げ、にします。権限を後回しにすると、権限の無い作りの上に機能が積み上がり、後から全部の画面を直すことになるからです。
Claude Code の公式ドキュメントは、質問させて仕様を書き終えたら、新しい会話で作らせるよう勧めています。仕様を詰めた会話には、捨てた案や途中の迷いが残っていて、AI の注意を奪うからです。新しい会話は、書かれた仕様と完了の条件だけから始まります。1 回の会話で頼むのは、タスク 1 つです。会話が長くなると前の取り決めが抜けるからです。作らせるときの指示は、次のように書きます。
AGENTS.md と specs/lending/ の 3 つの文書を読んでください。 tasks.md の T6 だけを作ってください。他のタスクには手を付けないでください。 先に T6 のテスト項目をテストのコードにし、実行して失敗することを見せてください。 次に実装し、実行したテストのコマンドと出力をそのまま見せてください。 テストのファイルは変えないでください。変える必要があると思ったら、作業を止めて理由を説明してください。
指示の 1 行目で、仕様を読ませます。2 行目で、範囲をタスク 1 つに限ります。残りの行は、確かめ方を決めています。テストを先に書かせて失敗を確かめるのは、何も作らなくても通ってしまう、確かめになっていないテストを見分けるためです。テストを変えさせないのは、作る前に固めた物差しを、作る作業の中で動かさせないためです。
どのタスクでも守らせる取り決めは、メモリーバンクに書きます。テストを実行するコマンド、コードの書き方、すべての機能に権限の外からの操作を拒むテストを入れること、などです。Claude Code の公式ドキュメントは、CLAUDE.md を短く保つよう勧めています。毎回の会話で読まれるため、1 行ごとに AI の注意を少しずつ使い、長くなるほど大事な行が埋もれるからです。書くのは、コードを読んでも AI に分からないことだけにします。AGENTS.md は、特定の製品に縛られない共通の形式として作られ、Linux Foundation 傘下の Agentic AI Foundation が管理しています。Claude Code で使うときは、CLAUDE.md に @AGENTS.md と書いて読み込ませます。
文章で守らせられない決まりを設定で縛る
仕様もメモリーバンクも文章なので、AI が従う保証はありません。2025 年 7 月、SaaStr の創業者 Jason Lemkin は、Replit の AI エージェントでアプリを作る試みを公開していました。Lemkin はコードと操作の凍結(変更を止める期間)を指示し、人の承認なしに進めないよう指示していました。それでもエージェントは本番のデータベースに許可のないコマンドを実行し、1,200 人を超える経営者と 1,190 社を超える会社のデータを消しました。Replit の CEO はこの件を「容認できず、決して起きてはならない」と認め、開発用と本番用のデータベースを自動で分ける仕組みを出すと発表しました。文章の指示は守られず、守らせる仕組みになったのは環境の分離という設定でした。
Claude Code の公式ドキュメントは、「毎回必ず起きる(起きない)必要があることは、フック・拒否のルール・管理された設定にする。CLAUDE.md は指針のためのもので、AI はその指針が当てはまらないと判断してよい」と書いています。決まりは、破られたときの損害で置き場所を分けます。
| 決まり | 置き場所 | 例 |
|---|---|---|
| たまに外れても直せばよい | AGENTS.md・CLAUDE.md の文章 | コードの書き方、1 回に 1 タスク、テストのコマンド |
| 特定のファイルやコマンドを使わせない | 権限の拒否ルール | 秘密の鍵を入れた .env を読ませない、承認したテストのファイルを編集させない |
| 毎回必ず行わせる・止める | フック | ファイルを変えたら必ず整形する、特定のフォルダの変更を止める |
| 触れられる範囲そのものを限る | サンドボックス・環境の分離 | AI の作業環境に本番のデータベースの接続先と鍵を置かない |
07 / Verify
仕様と照らして確かめる
作らせた物は、仕様と照らして確かめます。確かめる物差しは、受け入れ基準から作るテストです。
AI は、自分で書いたコードを、自分で書いたテストで確かめます。テストの中身が弱ければ、テストが通っても受け入れ基準を満たしているとは限りません。Kiro のドキュメントも、確かめる内容が弱いテストや、誤った決まりを確かめるテストは、動きが誤っていても通ると注意しています。そこで、どんなテストを揃えるかは人が決め、作る前に固めます。テストは、受け入れ基準ごとに次の 4 種類を揃えます。
| 種類 | 確かめること | 例 |
|---|---|---|
| うまくいく場合 | 基準どおりに操作したとき、基準どおりの結果になる | 空いている時間帯に予約すると、予約が確定する |
| 基準が拒む場合 | 拒むと書いた条件で、確かに拒む | 上限を超える金額の申請は、上長の承認だけでは確定しない |
| 境目 | 期限・上限・時刻のちょうど境目と、その前後 | キャンセルの期限が前日 18:00 なら、17:59 と 18:00 と 18:01 で試す |
| 権限の外からの操作 | 役割に無い操作や他人のデータを、画面を通さずに直接求める | 申請者が自分の申請の承認を直接送ると拒否される。客が他の客の予約の番号を指定しても開けない |
境目のテストを作らせると、仕様の抜けが見つかります。前の予約が 12:00 に終わるとき、12:00 に始まる予約は重なるのか。「重なる予約を受け付けない」という基準には答えがありません。答えが無い項目は、AI に決めさせず、担当者に確かめて要件に書き足します。
権限の外からの操作のテストは、受け入れ基準に書いていなくても、すべての機能に入れます。公開アプリの研究では、脆弱性の原因の 55.5% が、依頼に書かれていなかった安全の要件でした。業務の基準から作るテストだけでは、書かなかった安全の要件は確かめられません。どの機能にも当てはまる項目として、メモリーバンクにテストの決まりとして書いておきます。
テストの項目は、コードではなく、人が読める表で AI に出させます。1 行に、受け入れ基準の番号、操作、期待する結果を書かせます。読者は番号を 1 つずつ見て、4 種類が揃っているか、期待する結果が業務の事実と合っているかを確かめます。コードを読めなくても、この表は読めます。
| 基準 | 操作 | 期待する結果 | | R1-1 | 空いている時間帯にノート PC を予約する | 予約が確定する | | R1-2 | 9:00〜12:00 の予約がある備品に、11:00〜13:00 で申し込む | 受け付けず、12:00 以降の空きを示す | | R1-4 | 開始日時の 31 日前に申し込む | 受け付けない | | R2-3 | 社員のアカウントで、貸出の記録を直接送る | 拒否し、記録は変わらない | | R4-3 | 社員が、他人の予約の番号を指定して詳細を開く | 「見つからない」と表示する |
テストは、作る前に書かせて固めます。Spec Kit は、タスクの雛形で、テストを先に書き、実装の前にそのテストが失敗することを確かめるよう定めています。constitution の例には、「テストを書く → 利用者が承認する → テストが失敗する → 実装する」という順が載っています。先に失敗を確かめるのは、何も作らなくても通ってしまう、確かめになっていないテストを見分けるためです。
承認したテストは、作る作業の中で AI に変えさせません。Claude Code では、テストのフォルダの編集を禁止する設定を置きます。
{
"permissions": {
"deny": ["Edit(/tests/**)"]
}
}
この禁止は、ファイルを編集するツールと、Claude Code が見分けられる一部のコマンドに効きます。コマンドの書き方によっては外れるため、仕様と照らすレビューでも、テストのファイルが変わっていないかを報告させます。テストを変える必要が出たら、作る作業を止め、理由を聞いてから、人が承認する別の作業として変えます。
完了の報告を受けたら、次の 3 つで確かめます。
テストの証拠を出させる
固めたテストを、タスクのたびに全部実行させます。Claude Code の公式ドキュメントは、「テストはすべて通りました」という報告だけではほとんど何も分からないとして、実行したコマンドとその出力を証拠として出させるよう勧めています。前に作った機能を壊していないかも、これで分かります。
別の AI に仕様と照らさせる
作った AI とは別の AI(Claude Code ではサブエージェント)に、変更を仕様と照らさせ、満たしていない受け入れ基準、テストが無い基準、テストのファイルの変更を報告させます。番号がつながっていれば、この照合は番号ごとの表になります。
画面で操作する
受け入れ基準の文を 1 つずつ読み、そのとおりに画面を操作します。役割の違うアカウントで、それぞれ試します。
3 つの確認で問題がなければ、変更を保存し、タスクに完了の印を付けて、次のタスクに進みます。
Kiro は、さらに進んだ確かめ方を備えています。EARS 記法の受け入れ基準から、いつでも成り立つ性質を取り出し、何百・何千の入力を自動で作って、その性質が破れないかを試します。この方法を property-based testing と呼びます。その Kiro も、テストが通ることは正しさの証拠であって証明ではない、と書いています。テストで確かめられるのは、書いた項目だけです。
08 / Maintain
仕様を最新に保つ
使い始めたアプリには、変更の要望が出てきます。変更は、コードからではなく仕様から直します。
運用を始めて 1 か月後に、「社用車だけは、上長の承認がなければ予約を確定しない」という要望が出たとします。AI に直接「社用車に承認を付けて」と頼むと、コードは変わりますが、仕様は古いままです。次に新しい会話で別のタスクを頼んだとき、AI は古い仕様を読んで、承認の無い作りに合わせてコードを直してしまうことがあります。仕様とコードが食い違うと、仕様を読んでも、今のアプリの動きが分からなくなります。変更は、次の順で入れます。
要件を直す
受け入れ基準を足し、状態の表に「承認待ち」を足します。上長が不在のときの扱いのように、変更で新しく生まれる問いは、AI に質問させて詰めます。
設計を直す
上長の項目、承認待ちの状態、承認の画面を足します。
テスト項目を直す
足した基準に 4 種類のテスト項目を足し、変わった基準の古いテスト項目を直します。直したテスト項目を、人が承認します。
差分からタスクを作らせ、1 つずつ作らせる
直した仕様の差分だけからタスクを作らせ、新しい会話で 1 タスクずつ作らせて確かめます。
番号がつながっていれば、直す範囲は番号でたどれます。変えた基準の番号が付いた設計・テスト・タスクを探せば、直す所の一覧になります。
機能が増えたときは、機能ごとに仕様のフォルダを足します(specs/lending/、specs/vehicle-approval/)。Spec Kit の説明も、constitution はプロジェクトに 1 回作り、残りの手順は機能ごとに繰り返すとしています。役割の一覧や、すべての機能に入れるテストの決まりのように、機能をまたぐ取り決めは、メモリーバンクに書きます。機能の仕様に同じ決まりを書き写すと、片方だけが直されて食い違います。
仕様だけを直してコードは毎回作り直す spec-as-source の段階は、この講座では採りません。Böckeler が Tessl で試したところ、同じ仕様からコードを作り直すたびに、出来上がるコードが変わったからです。変更していない機能が作り直しのたびに変わると、確かめ直す範囲がアプリ全体に広がります。
09 / Depth
仕様の詳しさを決める
仕様の詳しさは、作る物の規模、何を作るかの明確さ、推測が外れたときの損害で決めます。
仕様駆動開発の手順を、どんな作業にも同じ重さで当てはめると過剰になります。Böckeler は、小さな不具合の修正に Kiro を使ったところ、4 つのユーザーストーリーと 16 の受け入れ基準が作られ、「くるみを割るのに大槌を使うようだった」と書いています。そして、作る物の大きさと、何を作るかの明確さの 2 つの軸で進め方を選ぶ考え方を提案しています。これに、推測が外れたときの損害の軸を加えると、次の表になります。
| 作る物 | 外れたときの損害 | 書く仕様 |
|---|---|---|
| 数日で捨てる試作 | 作り直せば済む | 目的と、確かめたいことを数行。試作で分かった決まりは、本番の要件に書き写す |
| 自分が使い続ける道具 | 自分のデータが消える、集計が合わない | 状態と、消すことと残すこと、期限と上限の観点。受け入れ基準とテストは主な操作に絞る |
| 職場で使う業務アプリ | 業務が止まる、見てはいけないデータが見える | 観点の一覧をすべて当てる。役割と権限、状態、4 種類のテスト、権限の外のテストはすべての機能に |
| 社外の顧客が使い、お金を受け取るサービス | 顧客の損害、返金、信用 | 上に加えて、知らない人が使う・お金を受け取る・止まると顧客が困る、の 3 つの観点を足す |
何を作るかがまだ決まっていないときは、先に試作を作らせて触り、分かったことを要件に書いてから、試作を捨てて作り直します。試作は、決まりを見つけるための道具として使います。試作のコードをそのまま育てると、推測で決まったデータの形が残ります。
社外の顧客が使い、お金を受け取るサービスでは、観点が 3 つ増えます。知らない人が使うので、会員の登録とログイン、パスワードの再設定、そして顧客 A の利用者に顧客 B のデータが見えないことを、要件とテストに書きます。お金を受け取るので、料金、支払いが失敗したときに何日まで使わせるか、解約した後のデータをいつまで残すかを書きます。止まると顧客が困るので、同時に使う人数と画面の表示時間、稼働時間の目標、データを失ったときに戻せる時点を数で書きます。数が無いと、AI は 1 人で試して動けば完了とします。公開の前には、第三者のセキュリティ診断も受けます。
10 / Limits
仕様駆動開発の限界
Böckeler は Spec Kit でも、中くらいの機能追加に対して手順が問題の大きさに見合わず過剰だったと書いています。また、Spec Kit が作った大量の Markdown のファイルを「冗長で、レビューが退屈」と評し、「これだけの Markdown を読むより、コードを読むほうがよい」と書いています。Thoughtworks の Technology Radar(2025 年 11 月)も、仕様駆動開発を「評価 (Assess)」の段階に置き、ツールが読み切れない長さの仕様を作ることがあると指摘しています。人が読まずに承認した仕様には、業務の決まりの誤りが残ります。仕様は機能ごとに分けて短く保ち、業務の決まりは人が読んで実際の運用と照らします。
Böckeler は、仕様を書いても AI が指示に従わないことや、逆に指示に過剰に従うことがあったと書き、仕様が「偽りの統制感」を生むおそれを指摘しています。文章の指示には、従う保証が無いからです。テスト、仕様と照らすレビュー、画面の操作を組み合わせて結果を確かめ、禁止すべき操作は権限や環境の設定で制限します。
公開アプリの研究は、対策の効果も試しています。消した脆弱性が作り直しの中で再び入り込む割合は、何もしないと 25.7% でした。安全向けに設定を固めた作業環境では 11.9%、依頼に「本番で使える状態に」と書き足すと 11.0% まで下がりましたが、どの方法でも 0 にはなりませんでした。
仕様からコードを作る考え方は新しいものではありません。Böckeler は、図や専用の言語で書いたモデルからコードを生成するモデル駆動開発 (MDD) が、手間と制約の多さから業務アプリでは定着しなかったことを挙げ、仕様駆動開発が MDD と AI の両方の短所を抱えるおそれがあると書いています。仕様の書き方の工夫がどこまで効くかは、まだ確かめられている途中です。仕様は短く保ち、確かめる仕組みと組み合わせて使います。
11 / Practice
練習問題
備品貸出とは別のアプリで、仕様駆動開発の手順を当てはめる場面です。次にすることを選びましょう。答えを選ぶと解説が表示されます。
12 / Review
確認問題
答えを選び、解説で理由も確かめましょう。
選択肢を1つ選んでください。
Summary
まとめ
- AI コーディングエージェントは、依頼に書かれていない決まりを推測で埋めます。バイブコーディングでは、誰も決めていない決まりがアプリに入り込み、データの形・長い会話・説明できなさ・安全の要件を通じて直しにくくなります。
- 仕様駆動開発は、決まりを見つけ、仕様に書き、仕様で作らせ、仕様と照らして確かめ、仕様を最新に保つ進め方です。決まりを決めるのは人で、AI は質問と下書きで手伝います。
- 書くべき決まりは、業務の流れ、状態の移り変わり、観点の一覧(見える範囲・変えられる人・期限と上限・重なり・必須の入力・資格・承認・取消・例外・知らせ・消すことと残すこと・安全)で見つけ、AI に質問させて埋めます。決まっていない所は「要確認」と書いて残します。
- 受け入れ基準は、操作して合否を言える文で書き、番号を付けます。番号で設計・タスク・テストをつなぐと、抜けを見つけ、変更の範囲をたどれます。
- 作らせるときは、新しい会話で仕様を読ませ、タスクを 1 つだけ頼みます。1 回でも破られると困る決まりは、権限の設定や環境の分離で縛ります。
- テストは 4 種類(うまくいく・拒む・境目・権限の外)を作る前に固め、AI に変えさせません。テストの証拠、仕様と照らすレビュー、画面の操作で確かめます。
- 変更は、要件 → 設計 → テスト項目 → タスクの順に仕様から直します。仕様の詳しさは、規模・明確さ・外れたときの損害で決めます。
自分のアプリで始めるなら、要件の雛形を開き、今の業務の流れと状態の表を書いてみましょう。観点の一覧を当てて「要確認」を書き込み、AI に質問させれば、作らせる前に決めるべきことが分かります。
参考資料
- Den Delimarsky: Spec-driven development with AI: Get started with a new open source toolkit (GitHub Blog, 2025)
- github/spec-kit
- github/spec-kit: templates/commands/clarify.md
- github/spec-kit: templates/commands/analyze.md
- github/spec-kit: templates/spec-template.md
- github/spec-kit: templates/tasks-template.md
- Kiro Docs: Specs
- Kiro Docs: Requirements-First
- Kiro Docs: Correctness with property-based tests
- Claude Code Docs: Best practices for Claude Code
- Claude Code Docs: Configure permissions
- AGENTS.md
- Birgitta Böckeler: Understanding Spec-Driven-Development: Kiro, spec-kit, and Tessl (martinfowler.com, 2025)
- Thoughtworks Technology Radar: Spec-driven development (2025)
- Simon Willison: Not all AI-assisted programming is vibe coding (but vibe coding rocks) (2025)
- Junquan Deng, Zhiyu Fan, Ruijie Meng: Understanding the (In)Security of Vibe-Coded Applications (arXiv:2606.23130)
- Songwen Zhao et al.: Is Vibe Coding Safe? Benchmarking Vulnerability of Agent-Generated Code in Real-World Tasks (arXiv:2512.03262)
- Alistair Mavin: EARS - Easy Approach to Requirements Syntax
- Fortune: AI-powered coding tool wiped out a software company's database in 'catastrophic failure' (2025)