AIが書く仕様書、どうレビューする?GitHub Spec Kitで出力される仕様書の詳細解説とレビュー方法

記事タイトルとURLをコピーする

AIが書く仕様書、どうレビューする?

こんにちは、サーバーワークスで生成AIの活用推進を担当している針生です。

今回は GitHub が公開している Spec Kit の /specify コマンドで出力される仕様書の詳細とレビュー方法について解説したいと思います。

Spec Kit を使い始めたものの、「/specify コマンドで出力される spec.md ってどんなルールで生成されてるの?」「出力された仕様書はどうレビューすればいいの?」と気になっている方も多いのではないでしょうか。

Spec Kit についての情報は、サーバーワークスエンジニアブログの Spec Kit に関する関連情報も参考にしてください。

blog.serverworks.co.jp

Spec Kit のワークフローをおさらい

まずは Spec Kit のワークフローを簡単におさらいしておきましょう。

ワークフローは5つのフェーズに分かれていて、それぞれに対応するコマンドがあります。

  1. /constitution → プロジェクトの原則を定義
  2. /specify → 仕様書を作成
  3. /plan → 技術的な実装計画を作成
  4. /tasks → タスクに分解
  5. /implement → 実装を実行

/specify コマンドの出力内容

/specify を実行すると、AI エージェントが spec.md ファイルを生成します。このファイルには「何を作るか」「なぜ作るか」が記述され、「どうやって作るか」は含まれません。

生成されるファイルの構造

.specify/
└─ specs/
   └─ 001-feature-name/
      ├─ spec.md          # メインの仕様書
      └─ checklists/
         └─ requirement.md

spec.md の主なセクション

セクション 内容
User Scenarios & Testing ユーザーシナリオ(Given/When/Then 形式の受け入れ基準)
Edge Cases エッジケースや例外的な状況の定義
Requirements 機能要件(FR-001 形式で番号付け)
Key Entities システムで扱うデータの概念的な構造
Success Criteria 測定可能な成功指標(SC-001 形式)
Assumptions 前提条件
Out of Scope スコープ外の機能

それぞれのセクションを詳しく見ていきましょう。

User Scenarios & Testing(ユーザーシナリオ)

ユーザー視点でのシナリオを Given/When/Then 形式で記述します。

Given/When/Then 形式とは、BDD(Behavior-Driven Development:振る舞い駆動開発)で広く使われるシナリオ記述のフォーマットです。

  • Given(前提条件): テスト開始時のシステムやユーザーの状態
  • When(操作): ユーザーが行うアクション
  • Then(期待結果): アクションの結果として期待される状態や動作

「商品を販売するサイトを構築したい」というリクエストで、実際に生成された例を見てみましょう。

### User Story 1 - 商品を閲覧する (Priority: P1)

顧客がサイトを訪問し、販売されている商品を一覧で閲覧し、
興味のある商品の詳細情報を確認できる。

**Why this priority**: 商品を見ることができなければ購入も発生しない。
サイトの最も基本的な機能であり、これだけでも商品カタログとしての
価値を提供できる。

**Independent Test**: 商品一覧ページにアクセスし、商品の画像・名前・価格が
表示され、クリックして詳細ページで説明文を確認できることをテスト。

**Acceptance Scenarios**:

1. **Given** 顧客がサイトにアクセスした状態, **When** 商品一覧ページを開く,
   **Then** 登録されている商品が画像・名前・価格とともに一覧表示される
2. **Given** 商品一覧が表示されている状態, **When** 任意の商品をクリック,
   **Then** 商品詳細ページに遷移し、商品画像・名前・価格・説明文・在庫状況が
   表示される
3. **Given** 商品が多数登録されている状態, **When** 商品一覧ページを開く,
   **Then** ページネーションにより適切な数ずつ商品が表示される

各ユーザーストーリーには以下の要素が含まれます。

  • Priority(優先度): P1/P2/P3/P4 などの優先度ラベル
  • Why this priority: なぜその優先度なのかの説明
  • Independent Test: 独立してテストできることの確認
  • Acceptance Scenarios: Given/When/Then 形式の受け入れ基準

この形式で書くことで、受け入れ基準が明確になり、テストケースへの変換も容易になります。

Edge Cases(エッジケース)

例外的な状況や境界条件を定義します。

### Edge Cases

- 在庫切れの商品を購入しようとした場合、どのように対応するか?
  → カートに追加不可とし、商品詳細ページで「在庫切れ」と表示する
- カートに商品を入れた後、別の顧客が同じ商品を購入して在庫がなくなった場合は?
  → 購入手続き時に在庫を再確認し、不足があれば通知する
- 購入手続き中にセッションが切れた場合は?
  → カート情報は一定期間保持し、再度ログインまたはアクセス時に復元を試みる
- 支払い処理が途中で失敗した場合は?
  → エラーメッセージを表示し、再試行を促す。注文は確定しない

エッジケースを事前に洗い出すことで、実装漏れを防げます。

Functional Requirements(機能要件)

機能要件は FR-001 形式で番号付けされます。

### Functional Requirements

- **FR-001**: システムは商品一覧ページで、商品の画像・名前・価格を
  表示できなければならない
- **FR-002**: システムは商品詳細ページで、商品の画像・名前・価格・説明文・
  在庫状況を表示できなければならない
- **FR-003**: 顧客は商品をカートに追加できなければならない
- **FR-004**: 顧客はカート内の商品の数量を変更できなければならない
- **FR-005**: 顧客はカートから商品を削除できなければならない
- **FR-006**: システムはカートの合計金額をリアルタイムで
  計算・表示しなければならない

番号付けにより、後続の plan.md や tasks.md で要件をトレースしやすくなります。

Key Entities(主要エンティティ)

システムで扱うデータの概念的な構造を定義します。

### Key Entities

- **商品(Product)**: 販売される品目。名前、説明、価格、画像、カテゴリ、
  在庫数を持つ
- **カテゴリ(Category)**: 商品の分類。名前と所属する商品のリストを持つ
- **カート(Cart)**: 顧客の購入予定商品を一時的に保持する。
  カート項目のリストを持つ
- **カート項目(Cart Item)**: カート内の個別商品と数量の組み合わせ
- **注文(Order)**: 確定した購入情報。配送先、支払い方法、注文商品、
  合計金額、注文日時、ステータスを持つ
- **顧客(Customer)**: 購入者。氏名、メールアドレス、配送先住所、電話番号を持つ

Success Criteria(成功指標)

測定可能で技術に依存しない成功指標を SC-001 形式で定義します。

### Measurable Outcomes

- **SC-001**: 顧客が商品一覧から商品詳細ページに遷移するまで3秒以内に
  完了できる
- **SC-002**: 顧客がカートに商品を追加してから購入完了まで5分以内に
  完了できる
- **SC-003**: 初めて訪問した顧客の80%以上が、商品一覧から目的の商品を
  30秒以内に見つけられる
- **SC-004**: 注文確定後1分以内に確認メールが顧客に届く
- **SC-005**: カートに追加した顧客のうち、60%以上が購入完了まで到達する
  (カート放棄率40%以下)
- **SC-006**: 100件以上の商品が登録されていても、商品一覧ページの表示が
  3秒以内に完了する

「スムーズに」「快適に」といった曖昧な表現ではなく、数値で測定できる形にすることがポイントです。

Assumptions(前提条件)

仕様の前提となる条件を明記します。

## Assumptions

- 物理商品のみを扱う(配送が必要、デジタル商品は対象外)
- ゲスト購入を許可する(会員登録なしで購入可能)
- 支払い方法は一般的なオンライン決済手段を想定
- 日本国内向けサービスとして、日本語・日本円のみ対応
- 管理者向けの商品登録・注文管理機能は別途検討が必要
- SSL/TLSによる通信の暗号化は前提とする

Out of Scope(スコープ外)

今回の実装に含めない機能を明確にします。

## Out of Scope

- サブスクリプション(定期購入)モデル
- 複数販売者のマーケットプレイス機能
- アフィリエイトプログラム
- クーポン・割引コード機能
- 多言語対応
- 複数通貨対応

スコープ外を明記することで、機能の肥大化を防ぎ、実装の焦点を明確にできます。

レビューのベストプラクティス

さて、ここからが本題です。生成された仕様書はどうレビューすればいいのでしょうか?

1. /clarify コマンドで曖昧な点を解消する

/specify の直後に /clarify を実行することを強くおすすめします!

このコマンドを実行すると、仕様の曖昧な部分が自動的に特定されて、構造化された質問が提示されます。

質問に回答すると、仕様書が自動的に更新されます。

2. 「テスターの視点」でレビューする

Spec Kit のテンプレートには「テスターのように考えろ」という指針があります。曖昧な要件は「テスト可能で曖昧でない」というチェック項目で不合格となるべき、という考え方ですね。

レビュー時には以下を自問してみてください。

  • この要件は具体的なテストケースに変換できるか?
  • 複数の解釈が可能な表現はないか?
  • 数値や条件が明確に定義されているか?

「ユーザーがスムーズにログインできる」よりも「ユーザーが30秒以内にログインを完了できる」の方が、明確にテスト可能です。

3. 最初の出力を最終版として扱わない

これは重要なポイントです。

AI との対話を、仕様を明確化し質問する機会として活用しましょう。最初の出力をそのまま受け入れるのではなく、積極的に質問や修正を行うことで、より良い仕様書ができあがります。

仕様ファイルは Markdown なので、手動で編集することもできます。

4. 実装詳細の混入を防ぐ

仕様書(spec.md)には「What(何を)」と「Why(なぜ)」のみを含め、「How(どうやって)」は /plan フェーズまで持ち越します。

ただ、気をつけないと実装詳細が混入することがあります。たとえば、要素のサイズや色、特定のライブラリ名などが紛れ込んでいないか確認してください。

こうした分離を保つことで、技術的な選択が変わっても仕様書は安定したまま維持できます。

5. 仕様が不十分なまま次のフェーズに進まない

これは Spec Kit を使う上で最も重要な原則かもしれません。

悪い仕様は、悪い計画となり、悪いコードになります。

仕様に曖昧な点や不足があるまま /plan フェーズに進むと、その問題は増幅されて実装まで引き継がれます。手戻りのコストは後になるほど大きくなるため、仕様の段階で徹底的にレビューし、問題を解消しておくことが重要です。

推奨ワークフロー

最後に、推奨ワークフローをまとめておきます。

1. /specify を実行
   ↓
   spec.md が生成される
   ↓
2. spec.md をレビュー
   ↓
3. /clarify を実行
   ↓
4. 必要に応じてAIと対話しながら修正・追記
   ↓
5. /plan に進む

まとめ

  • spec.md は「何を」「なぜ」に焦点を当て、「どうやって」は含まない
  • /clarify コマンドで曖昧さを解消できる
  • 最初の出力を最終版として扱わず、積極的に対話する
  • 仕様が不十分なまま次のフェーズに進まない(悪い仕様 → 悪い計画 → 悪いコード)

Spec Kit を使っていて感じているのは、AI に「よしなにやって」とお願いするのではなく、仕様という形で意図を明確に伝えることの大切さです。最初は面倒に感じるかもしれませんが、結果的に手戻りが減り、期待通りのものができあがる確率が格段に上がります。

ぜひ皆さんも試してみてください!

この記事の内容をまとめたイラスト

針生 泰有(執筆記事の一覧)

サーバーワークスで生成AIの活用推進を担当