Skip to content

コンセプト

このガイドでは、OpenSpecの背後にあるコアな考え方と、それらがどのように組み合わさるかについて説明します。実際の使い方については、入門ガイドワークフローを参照してください。

哲学

OpenSpecは4つの原則を中心に構築されています:

fluid not rigid         — no phase gates, work on what makes sense
iterative not waterfall — learn as you build, refine as you go
easy not complex        — lightweight setup, minimal ceremony
brownfield-first        — works with existing codebases, not just greenfield

なぜこれらの原則が重要なのか

柔軟であり、固定的ではない。 従来の仕様システムは、段階に縛られます:まず計画し、次に実装し、そして完了です。OpenSpecはより柔軟で、作業にとって合理的な順序で成果物を作成できます。

反復的であり、ウォーターフォールではない。 要件は変わります。理解は深まります。当初は良いように思えたアプローチも、コードベースを実際に見た後には合わなくなるかもしれません。OpenSpecはこの現実を受け入れています。

簡単であり、複雑ではない。 一部の仕様フレームワークは、広範なセットアップ、厳格な形式、または重厚なプロセスを必要とします。OpenSpecは邪魔をしません。数秒で初期化し、すぐに作業を開始し、必要な場合にのみカスタマイズします。

既存コードベース優先。 ほとんどのソフトウェア作業は、ゼロから構築するものではありません。既存のシステムを変更するものです。OpenSpecのデルタベースアプローチにより、新しいシステムを説明するだけでなく、既存の動作への変更を容易に指定できます。

全体像

OpenSpec は、作業を2つの主要な領域に整理します:

┌────────────────────────────────────────────────────────────────────┐
│                        openspec/                                   │
│                                                                    │
│   ┌─────────────────────┐      ┌───────────────────────────────┐   │
│   │       specs/        │      │         changes/              │   │
│   │                     │      │                               │   │
│   │  真実の源           │◄─────│  提案された変更               │   │
│   │  システムの現在の    │ merge│  各変更 = 1つのフォルダ       │   │
│   │  動作               │      │  アーティファクト + デルタを   │   │
│   │                     │      │  含む                         │   │
│   └─────────────────────┘      └───────────────────────────────┘   │
│                                                                    │
└────────────────────────────────────────────────────────────────────┘

Specs(仕様) は真実の源です — システムの現在の動作を記述します。

Changes(変更) は提案された修正です — マージする準備ができるまで、個別のフォルダに格納されます。

この分離が重要です。競合なしに複数の変更を並行して作業できます。メインの仕様に影響を与える前に変更をレビューできます。また、変更をアーカイブすると、そのデルタは真実の源にきれいにマージされます。

Specs(仕様)

Specs(仕様)は、構造化された要件とシナリオを使用して、システムの動作を記述します。

構造

openspec/specs/
├── auth/
│   └── spec.md           # 認証動作
├── payments/
│   └── spec.md           # 支払い処理
├── notifications/
│   └── spec.md           # 通知システム
└── ui/
    └── spec.md           # UIの動作とテーマ

ドメインごとに仕様を整理します — システムにとって意味のある論理的なグループです。一般的なパターン:

  • 機能領域別: auth/, payments/, search/
  • コンポーネント別: api/, frontend/, workers/
  • bounded context別: ordering/, fulfillment/, inventory/

仕様のフォーマット

仕様は要件を含み、各要件にはシナリオがあります:

markdown
# Auth Specification

## Purpose
アプリケーションの認証とセッション管理。

## Requirements

### Requirement: User Authentication
システムは、ログイン成功時にJWTトークンを発行するものとする(SHALL)。

#### Scenario: Valid credentials
- GIVEN 有効な資格情報を持つユーザー
- WHEN ユーザーがログインフォームを送信する
- THEN JWTトークンが返される
- AND ユーザーはダッシュボードにリダイレクトされる

#### Scenario: Invalid credentials
- GIVEN 無効な資格情報
- WHEN ユーザーがログインフォームを送信する
- THEN エラーメッセージが表示される
- AND トークンは発行されない

### Requirement: Session Expiration
システムは、30分間の非アクティブ後にセッションを期限切れにするものとする(MUST)。

#### Scenario: Idle timeout
- GIVEN 認証済みセッション
- WHEN アクティビティなしで30分が経過する
- THEN セッションは無効化される
- AND ユーザーは再認証が必要となる

主要な要素:

要素目的
## Purposeこの仕様のドメインの高レベルな説明
### Requirement:システムが持つべき特定の動作
#### Scenario:要件の具体的な実行例
SHALL/MUST/SHOULD要件の強度を示すRFC 2119キーワード

なぜこのように仕様を構造化するのか

要件は「何を」 — 実装を指定せずに、システムがすべきことを述べます。

シナリオは「いつ」 — 検証可能な具体的な例を提供します。良いシナリオは:

  • テスト可能である(自動テストを書ける)
  • ハッピーパスとエッジケースの両方をカバーする
  • Given/When/Then または同様の構造化フォーマットを使用する

RFC 2119キーワード(SHALL, MUST, SHOULD, MAY)は意図を伝えます:

  • MUST/SHALL — 絶対的な要件
  • SHOULD — 推奨されるが、例外が存在する
  • MAY — オプション

仕様とは何か(そうでないもの)

仕様は動作契約であり、実装計画ではありません。

良い仕様の内容:

  • ユーザーや下流システムが依存する観測可能な動作
  • 入力、出力、エラー条件
  • 外部の制約(セキュリティ、プライバシー、信頼性、互換性)
  • テストまたは明示的に検証可能なシナリオ

仕様で避けるべきもの:

  • 内部のクラス/関数名
  • ライブラリやフレームワークの選択
  • ステップごとの実装詳細
  • 詳細な実行計画(これらは design.mdtasks.md に属する)

簡単なテスト:

  • 実装が外部から見える動作を変更せずに変更できる場合、それはおそらく仕様に属さない。

軽量に保つ:段階的な厳密さ

OpenSpecは官僚主義を避けることを目指します。変更を検証可能にするのに必要な最も軽いレベルを使用します。

ライト仕様(デフォルト):

  • 短い動作優先の要件
  • 明確な範囲と非目標
  • 少数の具体的な受入チェック

フル仕様(より高いリスクの場合):

  • チーム横断またはリポジトリ横断の変更
  • API/契約の変更、移行、セキュリティ/プライバシーの懸念
  • 曖昧さが高コストな再作業を引き起こす可能性のある変更

ほとんどの変更はライトモードにとどめるべきです。

人間 + エージェントのコラボレーション

多くのチームでは、人間が探索し、エージェントがアーティファクトを草案します。意図的なループは以下の通りです:

  1. 人間が意図、コンテキスト、制約を提供する。
  2. エージェントこれを動作優先の要件とシナリオに変換する。
  3. エージェントは実装の詳細を design.mdtasks.md に保持し、spec.md には書かない。
  4. 検証は実装前に構造と明確さを確認する。

これにより、仕様は人間にとって読みやすく、エージェントにとって一貫性のあるものになります。

Changes(変更)

変更は、システムへの提案された修正であり、理解と実装に必要なすべてを含むフォルダとしてパッケージ化されます。

変更の構造

openspec/changes/add-dark-mode/
├── proposal.md           # なぜ、何を
├── design.md             # どのように(技術的アプローチ)
├── tasks.md              # 実装チェックリスト
├── .openspec.yaml        # 変更メタデータ(オプション)
└── specs/                # デルタ仕様
    └── ui/
        └── spec.md       # ui/spec.md の変更内容

各変更は自己完結しています。以下を含みます:

  • アーティファクト — 意図、設計、タスクを捉える文書
  • デルタ仕様 — 追加、変更、削除される内容の仕様
  • メタデータ — この特定の変更のためのオプションの設定

なぜ変更はフォルダなのか

変更をフォルダとしてパッケージ化することにはいくつかの利点があります:

  1. すべてが一か所に。 提案、設計、タスク、仕様がすべて一つの場所にあります。異なる場所を探し回る必要はありません。

  2. 並行作業。 複数の変更が競合せずに同時に存在できます。fix-auth-bug が進行中でも add-dark-mode に取り組めます。

  3. クリーンな履歴。 アーカイブされると、変更は完全なコンテキストを保持したまま changes/archive/ に移動します。何が変更されたかだけでなく、なぜ変更されたかを振り返って理解できます。

  4. レビューしやすい。 変更フォルダはレビューしやすいです — 開いて、提案を読み、設計を確認し、仕様のデルタを確認します。

Artifacts(アーティファクト)

アーティファクトは、作業を導く変更内の文書です。

アーティファクトのフロー

proposal ──────► specs ──────► design ──────► tasks ──────► implement
    │               │             │              │
   なぜ            何を          どのように      取るべき
 + 範囲          変更内容       アプローチ      ステップ

アーティファクトは互いに構築されます。各アーティファクトは次のものにコンテキストを提供します。

アーティファクトの種類

Proposal(proposal.md

提案は、意図範図アプローチを高レベルで捉えます。

markdown
# Proposal: Add Dark Mode

## Intent
ユーザーは、夜間使用時の目の疲れを軽減し、システムの設定に合わせるためのダークモードオプションを要望しています。

## Scope
対象範囲内:
- 設定のテーマ切り替え
- システム設定の検出
- localStorageに設定を保存

対象範囲外:
- カスタムカラーテーマ(将来の作業)
- ページごとのテーマ上書き

## Approach
テーマ付けにはCSSカスタムプロパティを使用し、状態管理にはReactコンテキストを使用します。初回読み込み時にシステム設定を検出し、手動での上書きを許可します。

提案を更新するタイミング:

  • 範囲の変更(狭めること、拡大すること)
  • 意図が明確になる(問題のより良い理解)
  • アプローチが根本的に変化する

Specs(specs/ 内のデルタ仕様)

デルタ仕様は、現在の仕様に対して何が変更されるかを記述します。以下の Delta Specs を参照してください。

Design(design.md

設計は技術的アプローチアーキテクチャの決定を捉えます。

markdown
# Design: Add Dark Mode

## Technical Approach
テーマの状態は、プロップドリリングを避けるためReactコンテキストで管理します。
CSSカスタムプロパティにより、クラスの切り替えなしにランタイムで切り替えが可能になります。

## アーキテクチャの決定

### 決定:ReduxではなくContextの選択
テーマの状態管理にReact Contextを使用する理由:
- 単純なバイナリ状態(ライト/ダーク)
- 複雑な状態遷移が不要
- Reduxの依存関係を追加しない

### 決定:CSSカスタムプロパティ
CSS-in-JSではなくCSS変数を使用する理由:
- 既存のスタイルシートと連携可能
- ランタイムオーバーヘッドなし
- ブラウザネイティブのソリューション

## データフロー
```
ThemeProvider (コンテキスト)


ThemeToggle ◄──► localStorage


CSS Variables (適用先: :root)
```

## ファイル変更
- `src/contexts/ThemeContext.tsx`(新規)
- `src/components/ThemeToggle.tsx`(新規)
- `src/styles/globals.css`(変更済み)

デザインを更新すべきタイミング:

  • 実装の過程で、そのアプローチが機能しないことが判明した場合
  • より良い解決策が見つかった場合
  • 依存関係や制約が変更された場合

タスク(tasks.md

タスクは実装チェックリストです。チェックボックス付きの具体的なステップです。

markdown
# タスク

## 1. テーマインフラストラクチャ
- [ ] 1.1 ライト/ダーク状態を持つThemeContextを作成
- [ ] 1.2 色のためのCSSカスタムプロパティを追加
- [ ] 1.3 localStorage永続化を実装
- [ ] 1.4 システム設定の検出を追加

## 2. UIコンポーネント
- [ ] 2.1 ThemeToggleコンポーネントを作成
- [ ] 2.2 設定ページにトグルを追加
- [ ] 2.3 ヘッダーにクイックトグルを追加

## 3. スタイリング
- [ ] 3.1 ダークテーマのカラーパレットを定義
- [ ] 3.2 コンポーネントをCSS変数を使用するよう更新
- [ ] 3.3 アクセシビリティのためのコントラスト比をテスト

タスクのベストプラクティス:

  • 関連するタスクを見出しの下にグループ化する
  • 階層的な番号付け(1.1、1.2など)を使用する
  • タスクは1回のセッションで完了できる程度の小ささを保つ
  • 完了したタスクにチェックを入れる

デルタ仕様

デルタ仕様は、OpenSpecがグリーンフィールド開発ではなく、ブラウンフィールド開発に適応するための重要な概念です。仕様全体を再記述するのではなく、何が変更されるかを記述します。

フォーマット

markdown
# 認証のデルタ

## 追加された要件

### 要件: 二要素認証
システムはTOTPベースの二要素認証を**must**サポートする。

#### シナリオ: 2FA登録
- GIVEN 2FAが有効になっていないユーザー
- WHEN ユーザーが設定で2FAを有効にする
- THEN 認証アプリのセットアップ用にQRコードが表示される
- AND ユーザーは有効化前にコードで検証する必要がある

#### シナリオ: 2FAログイン
- GIVEN 2FAが有効なユーザー
- WHEN ユーザーが有効な資格情報を送信する
- THEN OTPチャレンジが提示される
- AND 有効なOTPの後にのみログインが完了する

## 変更された要件

### 要件: セッションの有効期限
システムは15分間の非アクティブ後にセッションを期限切れに**must**する。
(以前:30分)

#### シナリオ: アイドルタイムアウト
- GIVEN 認証済みセッション
- WHEN アクティビティなしで15分が経過する
- THEN セッションが無効になる

## 削除された要件

### 要件: ログイン状態を保持
(2FAに代わり廃止。ユーザーは各セッションで再認証する必要がある。)

デルタセクション

セクション意味アーカイブ時の処理
## 追加された要件新しい動作メイン仕様に追加
## 変更された要件変更された動作既存の要件を置換
## 削除された要件廃止された動作メイン仕様から削除

なぜフル仕様ではなくデルタなのか

明確さ。 デルタは正確に何が変更されるかを示します。フル仕様を読むと、現在のバージョンとの差分を頭の中で比較する必要があります。

競合の回避。 2つの変更が同じ仕様ファイルに影響を与えることができます。異なる要件を変更する限り、競合しません。

レビュー効率。 レビュアーは変更のみを確認し、変更されていないコンテキストは確認しません。重要なことに集中できます。

ブラウンフィールドへの適合。 ほとんどの作業は既存の動作を変更します。デルタは変更を第一級のものとし、後付けにしません。

スキーマ

スキーマは、ワークフローの成果物の種類とその依存関係を定義します。

スキーマの仕組み

yaml
# openspec/schemas/spec-driven/schema.yaml
name: spec-driven
artifacts:
  - id: proposal
    generates: proposal.md
    requires: []              # 依存関係なし、最初に作成可能

  - id: specs
    generates: specs/**/*.md
    requires: [proposal]      # 作成前にproposalが必要

  - id: design
    generates: design.md
    requires: [proposal]      # specsと並行して作成可能

  - id: tasks
    generates: tasks.md
    requires: [specs, design] # specsとdesignの両方が先に必要

成果物は依存関係グラフを形成します:

                    proposal
                   (ルートノード)

         ┌─────────────┴─────────────┐
         │                           │
         ▼                           ▼
      specs                       design
   (requires:                  (requires:
    proposal)                   proposal)
         │                           │
         └─────────────┬─────────────┘


                    tasks
                (requires:
                specs, design)

依存関係は有効化であり、ゲートではありません。 何を作成可能かを示すものであり、次に何を作成しなければならないかを示すものではありません。必要なければdesignをスキップできます。specsはdesignの前後に作成できます。どちらもproposalにのみ依存します。

組み込みスキーマ

spec-driven(デフォルト)

仕様駆動開発のための標準ワークフロー:

proposal → specs → design → tasks → implement

最適:実装前に仕様に合意したい、ほとんどの機能開発。

カスタムスキーマ

チームのワークフローに合わせたカスタムスキーマを作成:

bash
# 新規作成
openspec schema init research-first

# 既存のスキーマをフォーク
openspec schema fork spec-driven research-first

カスタムスキーマの例:

yaml
# openspec/schemas/research-first/schema.yaml
name: research-first
artifacts:
  - id: research
    generates: research.md
    requires: []           # まず調査を行う

  - id: proposal
    generates: proposal.md
    requires: [research]   # 調査に基づいた提案

  - id: tasks
    generates: tasks.md
    requires: [proposal]   # specs/designをスキップし、直接タスクへ

カスタムスキーマの作成と使用の詳細については、カスタマイズを参照してください。

アーカイブ

アーカイブは、変更のデルタ仕様をメイン仕様にマージし、変更を履歴として保存することで、変更を完了させます。

アーカイブ時に何が起こるか

アーカイブ前:

openspec/
├── specs/
│   └── auth/
│       └── spec.md ◄────────────────┐
└── changes/                         │
    └── add-2fa/                     │
        ├── proposal.md              │
        ├── design.md                │ マージ
        ├── tasks.md                 │
        └── specs/                   │
            └── auth/                │
                └── spec.md ─────────┘


アーカイブ後:

openspec/
├── specs/
│   └── auth/
│       └── spec.md        # 2FA要件を含むようになった
└── changes/
    └── archive/
        └── 2025-01-24-add-2fa/    # 履歴として保存
            ├── proposal.md
            ├── design.md
            ├── tasks.md
            └── specs/
                └── auth/
                    └── spec.md

アーカイブプロセス

  1. デルタをマージする。 各デルタ仕様セクション(追加/変更/削除)が対応するメイン仕様に適用される。

  2. アーカイブに移動する。 変更フォルダは日付プレフィックス付きでchanges/archive/に移動し、時系列順に並べられる。

  3. コンテキストを保存する。 すべての成果物はアーカイブに完全に残る。変更がなぜ行われたかを理解するために、いつでも振り返ることができる。

アーカイブが重要な理由

クリーンな状態。 アクティブな変更(changes/)は進行中の作業のみを表示する。完了した作業は邪魔にならない。

監査証跡。 アーカイブはすべての変更の完全なコンテキストを保存する。何が変更されたかだけでなく、なぜ変更されたかを説明する提案、どのように変更されたかを説明する設計、行われた作業を示すタスクを含む。

仕様の進化。 変更がアーカイブされるにつれて、仕様は有機的に成長する。各アーカイブはデルタをマージし、時間とともに包括的な仕様を構築する。

すべてがどのように組み合わさるか

┌──────────────────────────────────────────────────────────────────────────────┐
│                              OPENSPECフロー                                   │
│                                                                              │
│   ┌────────────────┐                                                         │
│   │  1. 変更を     │  /opsx:propose(コア)または /opsx:new(拡張)           │
│   │     開始する    │                                                         │
│   └───────┬────────┘                                                         │
│           │                                                                  │
│           ▼                                                                  │
│   ┌────────────────┐                                                         │
│   │  2. 成果物を   │  /opsx:ff または /opsx:continue(拡張ワークフロー)      │
│   │     作成する    │  proposal → specs → design → tasks を作成               │
│   │                │  (スキーマの依存関係に基づく)                          │
│   └───────┬────────┘                                                         │
│           │                                                                  │
│           ▼                                                                  │
│   ┌────────────────┐                                                         │
│   │  3. タスクを   │  /opsx:apply                                            │
│   │     実装する    │  タスクを進め、チェックを入れる                         │
│   │                │◄──── 学んだことに基づいて成果物を更新                    │
│   └───────┬────────┘                                                         │
│           │                                                                  │
│           ▼                                                                  │
│   ┌────────────────┐                                                         │
│   │  4. 作業を     │  /opsx:verify(オプション)                             │
│   │     検証する    │  実装が仕様と一致するか確認する                          │
│   └───────┬────────┘                                                         │
│           │                                                                  │
│           ▼                                                                  │
│   ┌────────────────┐     ┌──────────────────────────────────────────────┐    │
│   │  5. 変更を     │────►│  デルタ仕様がメイン仕様にマージされる          │    │
│   │     アーカイブ  │     │  変更フォルダがarchive/に移動される           │    │
│   │     する        │     │  仕様は更新された信頼できる情報源となる       │    │
│   └────────────────┘     └──────────────────────────────────────────────┘    │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

良性サイクル:

  1. 仕様は現在の動作を記述する
  2. 変更は修正を提案する(デルタとして)
  3. 実装は変更を現実にする
  4. アーカイブはデルタを仕様にマージする
  5. 仕様は新しい動作を記述する
  6. 次の変更は更新された仕様に基づいて構築する

用語集

用語定義
Artifact変更内のドキュメント(提案、設計、タスク、またはデルタ仕様)
Archive変更を完了し、そのデルタをメイン仕様にマージするプロセス
Changeシステムへの提案された変更。アーティファクトを含むフォルダとしてパッケージ化される
Delta spec現在の仕様に対して変更(追加/変更/削除)を記述する仕様
Domain仕様の論理的なグループ(例:auth/payments/
Requirementシステムが持つべき特定の動作
Scenario要件の具体的な例。通常、Given/When/Then形式で記述される
Schemaアーティファクトの種類とその依存関係の定義
Specシステムの動作を記述する仕様。要件とシナリオを含む
Source of truth現在合意された動作を含むopenspec/specs/ディレクトリ

次のステップ

  • Getting Started - 実践的な最初のステップ
  • Workflows - 一般的なパターンと各パターンの使用タイミング
  • Commands - コマンドの完全なリファレンス
  • Customization - カスタムスキーマの作成とプロジェクトの設定