ソフトウェア要件仕様書(SRS)
Software Requirements Specification
| 項目 | 内容 |
|---|---|
| 文書番号 | SRS-2026-001 |
| プロジェクト名 | Substack記事自動配信システム |
| バージョン | 1.0.0 |
| 作成日 | 2026-05-24 |
| 最終更新日 | 2026-05-24 |
| 作成者 | 山田 太郎(プロジェクトオーナー) |
| レビュー者 | Claude Code(AI開発アシスタント) |
| 承認者 | 山田 太郎 |
| 準拠規格 | IEEE 29148:2018 / ISO 25010:2023 |
| 機密区分 | 社外秘 |
変更履歴
| バージョン | 日付 | 変更内容 | 変更者 |
|---|---|---|---|
| 1.0.0 | 2026-05-24 | 初版作成 | 山田 太郎 |
目次
- はじめに
- 全体的な説明
- 外部インターフェース要件
- 機能要件
- 非機能要件(品質要件)
- 制約条件
- 用語集
- 付録
1. はじめに
1.1 目的
本文書は「Substack記事自動配信システム」のソフトウェア要件を定義する。本文書は開発者(Claude Code)への指示書として機能し、開発・テスト・検収の基準となる。
1.2 スコープ(対象範囲)
対象: - Substack APIを使った記事の自動スケジュール投稿機能 - メール購読者リストの管理機能 - 投稿パフォーマンス(開封率・クリック率)の可視化ダッシュボード
対象外(スコープ外): - 記事の文章自動生成(AIライティング) - 有料購読者の課金管理 - 他のSNS(Twitter/X、Instagram等)への連携
1.3 定義・略語
| 用語 | 定義 |
|---|---|
| Substack | ニュースレター配信プラットフォーム(https://substack.com) |
| API | Application Programming Interface。システム間の連携インターフェース |
| スケジュール投稿 | 指定した日時に自動的に記事を公開する機能 |
| 開封率 | 配信したメールを開封した購読者の割合(%) |
| ダッシュボード | 複数の情報をまとめて表示する管理画面 |
| CRUD | Create(作成)・Read(読取)・Update(更新)・Delete(削除)の4操作 |
1.4 参照文書
| 文書名 | 場所 |
|---|---|
| Substack API公式ドキュメント | https://substack.com/api |
| MASTER_CLAUDE.md(プロジェクト設定) | プロジェクトルート |
| テスト計画書(TP-2026-001) | /docs/test-plan.md |
2. 全体的な説明
2.1 製品の概要
本システムは、個人ブロガー・コンテンツクリエイターが Substack での記事配信を効率化するためのWebアプリケーションである。
解決する課題: - 毎週手動で記事を投稿する作業が煩雑 - 投稿のパフォーマンスデータが Substack の管理画面では見づらい - 複数の記事を一括でスケジュール管理できない
提供する価値: - 記事を事前に複数本作成してまとめてスケジュール設定できる - 開封率・クリック率をグラフで直感的に把握できる - 投稿の最適な曜日・時間帯をデータから提案してくれる
2.2 ユーザー像(ペルソナ)
ユーザーA:個人ブロガー(主要ユーザー)
| 項目 | 内容 |
|---|---|
| 名前 | 田中 花子(仮名) |
| 職業 | フリーランスライター |
| 技術スキル | 非エンジニア。スマートフォンとPCは日常的に使用 |
| 利用頻度 | 週1〜2回 |
| 主な目的 | 記事を事前に書いて自動投稿したい |
| 不安・懸念 | 「難しい設定は嫌。間違えて記事が消えたら困る」 |
ユーザーB:メディア運営者(サブユーザー)
| 項目 | 内容 |
|---|---|
| 名前 | 鈴木 一郎(仮名) |
| 職業 | 小規模メディア運営 |
| 技術スキル | 基本的なWebサービスは使える |
| 利用頻度 | 毎日 |
| 主な目的 | 複数ライターの記事を一元管理したい |
| 不安・懸念 | 「誤投稿のリスクを最小化したい」 |
2.3 動作環境
| 環境 | 要件 |
|---|---|
| 対応ブラウザ | Chrome 120以上、Firefox 120以上、Safari 17以上 |
| デバイス | PC(Windows/Mac)、タブレット(iPad)、スマートフォン(iOS/Android) |
| インターネット接続 | 必須(オフライン動作は対象外) |
| Substackアカウント | 必須(無料プラン以上) |
2.4 制約・前提条件
- Substack APIの利用制限(レートリミット:100リクエスト/時間)に従う
- ユーザーのSubstack APIキーを安全に保管する必要がある
- 個人情報保護法(日本)および GDPR(EU)に準拠する
3. 外部インターフェース要件
3.1 ユーザーインターフェース(UI)
| ID | 要件 | 優先度 |
|---|---|---|
| UI-001 | ダッシュボードはPC・スマートフォン両方で正常に表示されること(レスポンシブデザイン) | Must |
| UI-002 | 主要操作(記事作成・スケジュール設定・公開)は3クリック以内で完了できること | Must |
| UI-003 | エラーが発生した場合、ユーザーが理解できる日本語のメッセージを表示すること | Must |
| UI-004 | 削除・公開などの取り消せない操作の前に確認ダイアログを表示すること | Must |
| UI-005 | ローディング中はスピナーまたはプログレスバーを表示すること | Should |
| UI-006 | ダークモード・ライトモードの切り替えができること | Could |
3.2 外部システムインターフェース
| ID | 連携先 | 用途 | 認証方式 |
|---|---|---|---|
| EXT-001 | Substack API v1 | 記事の投稿・取得・削除 | APIキー(Bearer Token) |
| EXT-002 | Google Analytics 4 | アクセス解析データ取得 | OAuth 2.0 |
| EXT-003 | SendGrid(メール) | システム通知メール送信 | APIキー |
3.3 データインターフェース
| ID | データ | 形式 | 方向 |
|---|---|---|---|
| DAT-001 | 記事データ | JSON(UTF-8) | 双方向 |
| DAT-002 | 購読者リスト | CSV / JSON | 入力 |
| DAT-003 | パフォーマンスデータ | JSON | 入力 |
| DAT-004 | エクスポートデータ | CSV / Excel | 出力 |
4. 機能要件
記述ルール: 各要件は「システムは〜できること」「ユーザーは〜できること」の形式で記述する。
4.1 機能グループ:認証・アカウント管理
FR-AUTH-001:ユーザー登録
概要: 新規ユーザーがアカウントを作成できる
詳細要件: - システムはメールアドレスとパスワードによる登録を提供すること - パスワードは8文字以上、英数字混在を必須とすること - 登録後、確認メールを送信すること - メール確認が完了するまでログインを制限すること
受け入れ基準(Acceptance Criteria):
Given: 未登録のメールアドレスを入力した
When: 必須項目を入力して「登録」ボタンを押した
Then: 確認メールが届き、リンクをクリックするとログインできる
優先度: Must(必須) 依存関係: なし
FR-AUTH-002:Substack APIキー連携
概要: ユーザーが自分のSubstack APIキーを登録できる
詳細要件:
- システムはAPIキーの入力フォームを提供すること
- 入力されたAPIキーの有効性をSubstack APIで検証すること
- APIキーは暗号化してデータベースに保存すること(平文保存禁止)
- APIキーは画面上でマスク表示(sk-****...****)すること
受け入れ基準:
Given: 有効なSubstack APIキーを入力した
When: 「接続テスト」ボタンを押した
Then: 「接続成功」メッセージと自分のSubstackアカウント名が表示される
Given: 無効なAPIキーを入力した
When: 「接続テスト」ボタンを押した
Then: 「APIキーが無効です。Substackの設定画面で確認してください」と表示される
優先度: Must(必須) 依存関係: FR-AUTH-001
4.2 機能グループ:記事管理
FR-ART-001:記事の作成・編集
概要: ユーザーが記事を作成・編集できる
詳細要件: - システムはリッチテキストエディタ(見出し・太字・リスト・画像挿入対応)を提供すること - 自動保存機能(30秒ごと)を提供すること - 下書き保存・プレビュー表示ができること - 記事に対してタグ(最大10個)を設定できること
受け入れ基準:
Given: 記事を作成中にブラウザが閉じた
When: 再度ページを開いた
Then: 最後の自動保存時点の内容が復元されている
優先度: Must(必須) 依存関係: FR-AUTH-002
FR-ART-002:スケジュール投稿
概要: ユーザーが記事の公開日時を指定して予約投稿できる
詳細要件: - 公開日時は分単位で指定できること - 指定できる日時は現在時刻の15分後以降とすること - スケジュール済み記事の一覧を表示できること - スケジュールのキャンセル・変更ができること(公開5分前まで) - 公開完了時にメール通知を送信すること
受け入れ基準:
Given: 2026-06-01 09:00 にスケジュール設定した記事がある
When: 2026-06-01 09:00 になった
Then: Substack上で記事が公開され、ユーザーに完了メールが届く
Given: 公開予定の10分前にスケジュールをキャンセルした
When: 公開予定時刻になった
Then: 記事は公開されず、ステータスが「下書き」に戻る
優先度: Must(必須) 依存関係: FR-ART-001、FR-AUTH-002
FR-ART-003:記事の一括インポート
概要: CSVまたはMarkdownファイルから複数記事を一括登録できる
詳細要件: - CSVファイル(タイトル・本文・公開日時・タグ列)のインポートを提供すること - インポート前にプレビュー確認画面を表示すること - エラーがある行のみ表示してユーザーに修正を促すこと - 一度に最大100件まで登録できること
優先度: Should(推奨) 依存関係: FR-ART-001
4.3 機能グループ:ダッシュボード・分析
FR-DASH-001:パフォーマンスダッシュボード
概要: 記事ごとの開封率・クリック率をグラフで表示する
詳細要件: - 過去30日間・90日間・1年間の期間切り替えができること - 記事ごとの開封率・クリック率・購読者増減を表示すること - 折れ線グラフ・棒グラフの切り替えができること - データをCSVでエクスポートできること - データは1時間ごとに自動更新されること
受け入れ基準:
Given: 過去30日間のデータを表示している
When: 「90日間」ボタンを押した
Then: 3秒以内にグラフが更新され、90日間のデータが表示される
優先度: Should(推奨) 依存関係: FR-AUTH-002
FR-DASH-002:最適投稿時間の提案
概要: 過去データから最も開封率が高い曜日・時間帯を提案する
詳細要件: - 過去10件以上の投稿データがある場合に提案を表示すること - 曜日別・時間帯別の開封率ヒートマップを表示すること - 提案は「推奨:火曜日 午前8時〜10時(平均開封率 42%)」の形式で表示すること
優先度: Could(あれば良い) 依存関係: FR-DASH-001
4.4 機能要件一覧(サマリー)
| ID | 機能名 | 優先度 | フェーズ |
|---|---|---|---|
| FR-AUTH-001 | ユーザー登録 | Must | Phase 1 |
| FR-AUTH-002 | Substack APIキー連携 | Must | Phase 1 |
| FR-ART-001 | 記事の作成・編集 | Must | Phase 1 |
| FR-ART-002 | スケジュール投稿 | Must | Phase 1 |
| FR-ART-003 | 記事の一括インポート | Should | Phase 2 |
| FR-DASH-001 | パフォーマンスダッシュボード | Should | Phase 2 |
| FR-DASH-002 | 最適投稿時間の提案 | Could | Phase 3 |
優先度の定義: - Must:Phase 1で必ず実装。これがなければシステムとして成立しない - Should:Phase 2で実装。ユーザー価値を大きく高める - Could:Phase 3以降。あれば良いが、なくても支障なし - Won't:今回は実装しない
5. 非機能要件(品質要件)
ISO 25010:2023 の品質特性に基づいて定義する。
5.1 パフォーマンス効率性
| ID | 要件 | 測定方法 | 合格基準 |
|---|---|---|---|
| NFR-PERF-001 | ページ初期表示速度 | Lighthouse計測 | LCP(最大コンテンツ描画)3秒以内 |
| NFR-PERF-002 | API応答速度 | 負荷テスト | 同時10ユーザー時、95%のリクエストが2秒以内 |
| NFR-PERF-003 | スケジュール実行精度 | 自動テスト | 指定時刻の±2分以内に投稿が実行される |
5.2 信頼性
| ID | 要件 | 測定方法 | 合格基準 |
|---|---|---|---|
| NFR-REL-001 | 稼働率 | 監視ツール | 月間99%以上(計画外停止は月4.4時間以内) |
| NFR-REL-002 | データ損失防止 | バックアップ確認 | 記事データは1日1回バックアップ、7日間保持 |
| NFR-REL-003 | スケジュール失敗時の対応 | テスト | 投稿失敗時はリトライ3回後にメール通知 |
5.3 セキュリティ
| ID | 要件 | 測定方法 | 合格基準 |
|---|---|---|---|
| NFR-SEC-001 | 通信の暗号化 | SSL証明書確認 | 全通信をHTTPS(TLS 1.2以上)で暗号化 |
| NFR-SEC-002 | APIキーの保護 | コードレビュー | APIキーはAES-256で暗号化してDB保存。ログに出力しない |
| NFR-SEC-003 | 認証セキュリティ | ペネトレーションテスト | ブルートフォース対策(5回失敗で30分ロック) |
| NFR-SEC-004 | 入力値検証 | 自動テスト | SQLインジェクション・XSS攻撃に対して防御できること |
5.4 使用性(ユーザビリティ)
| ID | 要件 | 測定方法 | 合格基準 |
|---|---|---|---|
| NFR-USE-001 | 習得容易性 | ユーザーテスト | 初回利用者が説明なしで主要機能を10分以内に使えること |
| NFR-USE-002 | エラー回復性 | ユーザーテスト | エラー発生時、ユーザーが3分以内に回復できること |
| NFR-USE-003 | アクセシビリティ | axe-core計測 | WCAG 2.1 AA基準を満たすこと |
5.5 保守性
| ID | 要件 | 測定方法 | 合格基準 |
|---|---|---|---|
| NFR-MAIN-001 | テストカバレッジ | CI/CDレポート | ユニットテストカバレッジ80%以上 |
| NFR-MAIN-002 | コードドキュメント | コードレビュー | 全公開関数にJSDocコメントを記述すること |
| NFR-MAIN-003 | 環境構築時間 | 計測 | READMEに従って30分以内に開発環境を構築できること |
6. 制約条件
6.1 技術的制約
| 制約 | 理由 |
|---|---|
| フロントエンド:React 19 + TypeScript | 既存の開発環境に合わせる |
| バックエンド:Node.js(Express) | チームの技術スタック |
| データベース:PostgreSQL | 既存インフラ |
| Substack APIレートリミット:100req/時 | Substack側の制限。超過時は自動的に待機する |
6.2 ビジネス制約
| 制約 | 内容 |
|---|---|
| 開発予算 | Claude Code利用料含め月5万円以内 |
| リリース目標 | Phase 1:2026年7月末 |
| 対応言語 | 日本語のみ(多言語対応はPhase 3以降) |
6.3 法的・規制上の制約
| 制約 | 根拠 |
|---|---|
| 個人情報(購読者メールアドレス)の取り扱い | 個人情報保護法(日本) |
| EUユーザーのデータ処理 | GDPR(EU一般データ保護規則) |
| Substack利用規約の遵守 | Substack Terms of Service |
7. 用語集
| 用語 | 定義 |
|---|---|
| SRS | Software Requirements Specification(ソフトウェア要件仕様書) |
| Must | MoSCoW優先度:必須要件。これがなければシステムとして成立しない |
| Should | MoSCoW優先度:推奨要件。重要だが必須ではない |
| Could | MoSCoW優先度:あれば良い要件 |
| Won't | MoSCoW優先度:今回は実装しない |
| LCP | Largest Contentful Paint。ページ表示速度の指標 |
| WCAG | Web Content Accessibility Guidelines。Webアクセシビリティの国際基準 |
| TLS | Transport Layer Security。通信暗号化プロトコル |
| AES-256 | Advanced Encryption Standard 256bit。暗号化アルゴリズム |
8. 付録
付録A:ユースケース図(テキスト版)
[ユーザー] → (ログイン)
[ユーザー] → (記事を作成する)
[ユーザー] → (スケジュールを設定する)
[ユーザー] → (パフォーマンスを確認する)
[ユーザー] → (APIキーを設定する)
[スケジューラー(自動)] → (記事を自動投稿する)
[スケジューラー(自動)] → (パフォーマンスデータを取得する)
[Substack API] ← (記事投稿リクエスト)
[Substack API] → (パフォーマンスデータ)
付録B:データモデル(概要)
Article(記事)
├── id: UUID
├── title: String(最大200文字)
├── body: Text(HTML形式)
├── status: Enum(draft / scheduled / published / failed)
├── scheduled_at: DateTime(nullable)
├── published_at: DateTime(nullable)
├── tags: String[](最大10個)
├── created_at: DateTime
└── updated_at: DateTime
User(ユーザー)
├── id: UUID
├── email: String(暗号化)
├── substack_api_key: String(AES-256暗号化)
├── substack_publication_url: String
├── created_at: DateTime
└── updated_at: DateTime
ArticlePerformance(パフォーマンス)
├── id: UUID
├── article_id: UUID(Article参照)
├── open_rate: Float(0.0〜1.0)
├── click_rate: Float(0.0〜1.0)
├── subscriber_count: Integer
└── recorded_at: DateTime
付録C:Claude Codeへの引き渡し手順
本SRSをClaude Codeに渡す際は、以下の手順で行う:
ステップ1:CLAUDE.mdの確認
このプロジェクトのCLAUDE.mdを読んで、プロジェクトの設定を確認してください。
ステップ2:SRSの読み込み
SRS-2026-001(SRS_sample_substack_v1.md)を読んで、
以下を確認してください:
1. 理解できない要件はありますか?
2. 矛盾している要件はありますか?
3. 実装が技術的に困難な要件はありますか?
確認できたら、Phase 1(Must要件)の実装計画を提示してください。
ステップ3:実装開始
SRS Phase 1のFR-AUTH-001(ユーザー登録)から実装を開始してください。
実装前に以下を確認します:
- [ ] 受け入れ基準を理解した
- [ ] 依存する要件(なし)を確認した
- [ ] テストケースを先に書く(TDD)
ドキュメント承認
| 役割 | 氏名 | 署名 | 日付 |
|---|---|---|---|
| プロジェクトオーナー | 山田 太郎 | ____ | 2026-05-24 |
| 開発担当(Claude Code) | AI | 自動承認 | 2026-05-24 |
本文書はIEEE 29148:2018「Systems and software engineering — Life cycle processes — Requirements engineering」に準拠して作成されました。
© 2026 山田 太郎. All rights reserved.