Appendix B: テンプレ集

本書で扱う判断・合意を「再利用可能な形式」にするためのテンプレートです。必要に応じてチーム向けに最小改変して使ってください。

記入例(完成形)が必要な場合は Appendix D を参照してください。

使い分け(要求→要件→仕様→設計→テスト)

本書では、対象を「要求/要件/仕様/設計」に分けます(定義は 00. この本の使い方 を参照)。

テンプレは、各段階の成果物(合意の型)に対応しています。

区分 何を決めるか 代表成果物 テンプレ
要求 なぜやるか(目的・課題・KPI) Needs/Goals の整理 B-1
要件 何を満たすべきか(Shall) Requirements 一覧、スコープ、非機能の最小合意 B-2
仕様 どう振る舞うか(外部観測) 受け入れ条件、例外系、エラー、外部I/Fの振る舞い B-3(任意: B-10, B-12, B-13, B-14, B-16)
設計 どう作るか(内部構造) S/D/V、設計アウトライン、Change Drivers、ADR B-4〜B-7(任意: B-9/B-10, B-15)
テスト どこをどう守るか テスト配分(単体/統合/E2E) B-8
横断 漏れ/矛盾を早期に見つける 要件→仕様→設計→テストの対応 B-11(任意)

B-1. 要求(Needs / Goals)整理テンプレ(目的・課題・KPI)

目的: 「なぜやるか」を目的と測定(KPI)として固定し、後続の要件・仕様の判断軸にする。

# 要求(Needs / Goals): <テーマ>

## 背景/課題(As-Is)

- 何が起きているか(事実):
- 誰が困っているか:
- 放置するとどうなるか(損失/機会損失):

## 目的(Goals / To-Be)

- 目標状態(業務/体験):
- 期限(いつまでに):

## KPI(測定)

| 指標 | 現状 | 目標 | 測定方法 | 備考 |
| --- | --- | --- | --- | --- |
|  |  |  |  |  |

## スコープ/非ゴール

- 含む:
- 含まない(非ゴール):

## 制約/前提

- 予算/期限:
- 体制/運用:
- 既存システム/外部I/F:

B-2. 要件(Requirements / Shall)テンプレ(約束の一覧)

目的: 実装方法に依存しない「約束(Shall)」を列挙し、スコープと非機能の最小合意を取る。

# 要件(Requirements / Shall): <対象>

## スコープ

- 含む:
- 含まない(非ゴール):

## 機能要件(Shall)

| ID | Shall(要件) | 根拠(要求/KPI) | 優先度 | 備考 |
| --- | --- | --- | --- | --- |
| R-1 |  |  | Must/Should/Could |  |
| R-2 |  |  |  |  |

## 非機能(最小合意)

- 性能:
- 可用性:
- セキュリティ/権限:
- 監査/ログ:
- 運用(アラート/リトライ/バックアップ):

## 未決/リスク

- 未決事項:
- リスク:

B-3. 仕様(Specification / Behavior)テンプレ(外部観測の振る舞い)

目的: 外部から観測できる振る舞い(入力/出力、状態遷移、エラー)を曖昧さなく定義し、実装と独立した検証基準にする。

# 仕様(Specification / Behavior): <対象>

## 参照(要求/要件)

- 要求: <リンク/ID>
- 要件: <リンク/ID>

## 外部I/F(観測できる面)

- UI:
- API:
- 外部連携(通知等):

## 受け入れ条件(Given/When/Then)

- Given: <前提>
  - When: <操作/イベント>
  - Then: <期待結果観測できる形で>

## 例外系/失敗時の振る舞い(Behavior)

- 認可失敗:
- 存在しない/不正入力:
- 競合(同時更新):
- 外部I/F失敗(通知等):

## 観測点(何をもって合否判定するか)

- 画面表示:
- API レスポンス(ステータス、エラー形式):
- 監査/ログ(必要なら):

## テスト観点(仕様から導出)

- 単体テストで守る振る舞い:
- 統合テストで守る契約(境界):
- E2E で守る導線:

B-4. S/D/V 採点表(依存関係トップ 10)

目的: 依存関係の「痛み」を半定量で把握し、手当(境界/契約/テスト投資)の優先順位を付ける。

採点の目安(例):

  • S(統合強度): 1=独立、3=時々同時変更、5=常に同時変更/同時デプロイ
  • D(距離): 1=同一モジュール、3=同一リポジトリ別パッケージ、5=別サービス/別組織/ネットワーク越し
  • V(変動性): 1=ほぼ固定、3=四半期で変わる、5=週次で変わる/不確実性が高い
| # | 依存元 | 依存先 | 依存の内容 | S(1-5) | D(1-5) | V(1-5) | コメント(観測/根拠) | 手当案 |
| ---: | --- | --- | --- | ---: | ---: | ---: | --- | --- |
| 1 |  |  |  |  |  |  |  |  |
| 2 |  |  |  |  |  |  |  |  |
| 3 |  |  |  |  |  |  |  |  |
| 4 |  |  |  |  |  |  |  |  |
| 5 |  |  |  |  |  |  |  |  |
| 6 |  |  |  |  |  |  |  |  |
| 7 |  |  |  |  |  |  |  |  |
| 8 |  |  |  |  |  |  |  |  |
| 9 |  |  |  |  |  |  |  |  |
| 10 |  |  |  |  |  |  |  |  |

補助質問:

  • 同時変更が必要になる原因は何か(データ構造、仕様、例外処理、認可など)
  • 距離が大きい場合、契約(インターフェース/スキーマ/契約テスト)は十分か
  • 変動性が高い場合、抽象化は「固定化」になっていないか

B-5. 設計(Design / Structure)アウトラインテンプレ(境界・構造)

目的: 仕様を満たすための内部構造(境界、責務、依存方向、データモデル)を最小で定義する。

# 設計(Design / Structure): <対象>

## 参照(要求/要件/仕様)

- 要求:
- 要件:
- 仕様:

## 構造(境界と責務)

- domain:
- usecases:
- adapters:

## 依存方向(ルール)

- 依存の向き:
- 例外(許可する参照):

## データモデル

- 論理(概念/エンティティ):
- 物理(DB テーブル/インデックス/制約):

## 重要アルゴリズム/ルール

- 何をどこで計算するか(例: 期限判定、権限判定):

## トレードオフ

- 得るもの:
- 失うもの:

## テスト戦略への影響

- 単体/統合/E2E の主な対象:

B-6. 変更理由(Change Drivers)整理テンプレ(任意)

目的: 「なぜ今変えるのか」を先に揃え、設計変更の正当化(後付け)を避ける。

# Change Drivers: <変更のテーマ>

## 背景(何が起きているか)

- 事象(観測):
- 影響(価値/運用/コスト):
- 期限(いつまでに):

## ドライバー(何が変更を必要にしているか)

| ドライバー | 内容 | 強さ(低/中/高) | 根拠 |
| --- | --- | --- | --- |
| 変動性(V) |  |  |  |
| 距離(D) |  |  |  |
| 統合強度(S) |  |  |  |
| 運用要件 |  |  |  |
| チーム/組織 |  |  |  |

## 対応方針(案)

- 何を変える:
- 変えないこと(非ゴール):
- テスト戦略への影響:
- ADR が必要か:

B-7. ADR テンプレ(Context / Decision / Consequences)

# ADR: <短いタイトル>

- Status: proposed | accepted | superseded
- Date: YYYY-MM-DD
- Deciders: <意思決定者/関係者>
- Scope: <対象範囲モジュール/機能/チーム>

## Context

- 背景:
- 問題:
- 制約(要件/非機能/運用):
- 既存の選択(As-Is):

## Decision

- 採用する決定:
- 理由(S/D/V、複雑性、テスト戦略との整合):

## Consequences

- 得られる効果:
- 失うもの/トレードオフ:
- 後続タスク:
- 見直し条件(いつ再評価するか):

B-8. テスト配分テンプレ(単体/統合/E2E)

# テスト配分: <対象機能/導線>

## 方針(ねらい)

- 価値導線:
- 主要リスク:
- 許容できない障害:

## 配分

| レベル | ねらい | 対象 | 備考 |
| --- | --- | --- | --- |
| 単体 | コアの振る舞い保護 | 純粋ロジック / 変換 / ルール | 実装詳細への依存を避ける |
| 統合 | 境界の契約保護 | API / DB / 認可 / 外部連携 | 失敗時の動作も含める |
| E2E | 価値導線の保護 | 主要ユーザーフロー(少数) | 不安定要因を最小化 |

## 禁止事項(例)

- E2E の増やし過ぎ(時間・不安定さで破綻)
- 単体テストで外部 I/O を扱う(統合で検証する)
- モック過多(設計の境界が崩れている兆候)

B-9. 相互作用マップテンプレ(変更シナリオ→波及→観測→制約候補)(任意)

目的: 複雑性を「相互作用」として扱い、設計の焦点(制約/境界)を作る。章 02 の手順を成果物として残すためのテンプレ。

# 相互作用マップ: <テーマ>

## 変更シナリオ

- 例: <期限ルールの変更>
- 例: <権限モデルの拡張>
- 例: <外部I/F通知の失敗が顕在化>

## 波及先(UI/API/DB/外部I/F/運用/テスト)

- UI:
- API:
- DB:
- 外部I/F:
- 運用:
- テスト:

## 観測点(何をもって合否判定するか)

- UI:
- API:
- ログ/監査:
- その他:

## 制約/最小手当(候補)

- 例: ルールを domain に集約し、重複実装を禁止する
- 例: 失敗時の期待(継続/停止、検知、再送)を仕様として固定する
- 例: エラー形式(code)を固定し、境界で整形する

## 次アクション(S/D/V とテスト配分への接続)

- S/D/V 採点対象(トップ 3):
- テスト配分(単体/統合/E2E)で守る契約:

B-10. エラーコードカタログテンプレ(code/message/HTTP/運用)(任意)

目的: 境界(例: HTTP)で返す失敗理由を「契約」として固定し、UI/テスト/運用の相互作用を減らす。章 04(エラーの扱い)と章 05-06(テスト)に接続する。

# エラーコードカタログ: <対象(例: タスク割り当て API)>

## エラー一覧

| code | message(利用者向け) | 起点(境界) | HTTP | 再試行可否 | 監査/ログ | 備考 |
| --- | --- | --- | --- | --- | --- | --- |
| forbidden | 権限がありません | 認可 | 403 | No | 失敗理由を記録 | |
| not_found | 対象が見つかりません | 参照 | 404 | No | 対象IDを記録 | |
| conflict | 競合が発生しました | 同時更新 | 409 | Yes/No | 相関IDを記録 | 楽観ロック等 |
| invalid | 入力が不正です | 入力検証 | 400 | No | 最小限を記録 | 個人情報を出さない |

## 運用方針

- ログに出す項目(相関ID、actor、対象ID、code):
- 監査ログの記録範囲/保持期間:
- 再試行する場合の上限/間隔(必要なら):

B-11. トレーサビリティマップ(要求→要件→仕様→設計→テスト)(任意)

目的: 「この Shall は、どの仕様/設計/テストで担保するか」を見える化し、漏れ(未実装/未検証)を早期に発見する。

運用方針(最小):

  • すべてを網羅しない(トップ要件/主要導線から始める)
  • 仕様(B-3)とテスト配分(B-8)を更新したら、対応行も更新する(PR の一部にする)
  • 「リンク/ID で追える」粒度にする(文章の再掲はしない)
  • 仕様(受け入れ条件)を ID(例: AC-1)で参照したい場合は B-12 を併用する
# トレーサビリティ: <対象(例: タスク割り当て + 通知)>

| 要件ID | Shall(要約) | 仕様(受け入れ条件/観測点) | 設計(境界/ADR/エラーcode等) | テスト(単体/統合/E2E) | 状態 | 備考 |
| --- | --- | --- | --- | --- | --- | --- |
| R-1 |  |  |  |  | 未/一部/完了 |  |
| R-2 |  |  |  |  |  |  |

B-12. 受け入れ条件(AC)ID 管理テンプレ(任意)

目的: 受け入れ条件(Given/When/Then)を ID 化し、要件/テスト/障害調査の会話コストを下げる。B-3(仕様)と B-11(トレーサビリティ)に接続する。

運用方針(最小):

  • すべての条件を ID 化しない(主要導線から始める)
  • ID は「参照のための鍵」として扱い、番号の振り直しを避ける(履歴と追跡性を優先する)
  • テスト名や PR の説明に ID を含めると、レビューの往復が減る(例: AC-3: 期限超過表示
# 受け入れ条件(AC): <対象(例: タスク割り当て + 通知)>

| AC ID | 要件ID | Given(前提) | When(操作/イベント) | Then(期待結果/観測点) | 例外系/エラーcode | 推奨テスト | 備考 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| AC-1 | R-1 |  |  |  |  | E2E/統合/単体 |  |
| AC-2 |  |  |  |  |  |  |  |

B-13. 認可(Authorization)ルール表テンプレ(任意)

目的: 認可ルール(役割/所有者/操作)を表形式で合意し、仕様・設計・テストの前提を揃える。B-3(仕様)と B-10(エラーcode)と B-8(テスト配分)に接続する。

運用方針(最小):

  • UI の表示制御に依存しない(サーバ側で必ず強制する)
  • 「誰が」「何に」「何をできるか」を最小の語彙で固定し、例外(代理、管理者権限等)は備考に逃がさない
  • 監査/ログは、成功だけでなく失敗(forbidden 等)も追跡できる粒度にする(個人情報をログに出さない)
# 認可(Authorization)ルール: <対象(例: タスク管理)>

## 役割/属性(最小)

- role:
  - admin:
  - user:
- 属性(例):
  - owner(`resource.ownerId == actorId`):
  - assignee(`resource.assigneeId == actorId`):

## ルール表

| 操作ID | 操作(Action) | 対象(Resource) | 許可条件(Role/属性) | 失敗時(code/HTTP) | 監査/ログ | 推奨テスト | 備考 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| AUTHZ-1 | assign_task | task | admin のみ | forbidden/403 | actor/taskId/code/相関ID | 統合/単体 | |
| AUTHZ-2 | update_status | task | assignee のみ | forbidden/403 | actor/taskId/code/相関ID | 統合/単体 | 状態遷移ルールは別途 |

B-14. API 契約テンプレ(HTTP/エラー/冪等性)(任意)

目的: HTTP API の入出力・エラー・冪等性を「契約」として固定し、UI/API/テスト(統合)の相互作用を減らす。B-10(エラーcode)/B-12(AC-ID)/B-13(認可)に接続する。

運用方針(最小):

  • 「成功の形」と同じくらい「失敗の形(code/HTTP)」を固定する(曖昧なまま実装しない)
  • 冪等性(二重送信)と同時更新(競合)の扱いを契約に含める(フレーク・運用負債の主要因)
  • 互換性を崩す変更(破壊的変更)は、移行計画とセットで扱う(ADR を残す)
# API 契約: <対象(例: タスク割り当て API)>

## 関連(要求/要件/受け入れ条件)

- 要件ID: (例) R-1, R-2
- AC ID: (例) AC-1, AC-2

## エンドポイント

- method/path: `POST /api/...`
- operationId(任意):
- 認証/認可: (例) admin のみ(B-13参照)

## Request

- headers:
  - (任意) `Idempotency-Key`:
- params:
  - `taskId`:
- body(例):
  - `assigneeId`:

## Response(Success)

- status: `200` / `201` / `204`
- body(例):
  - `taskId`:
  - `assigneeId`:
  - `assignedAt`:

## Response(Error)

最小形式(例):

- `{ "code": "<reason>", "message": "<user-facing>" }`

| code | HTTP | 条件(いつ起きるか) | 再試行可否 | 備考 |
| --- | --- | --- | --- | --- |
| forbidden | 403 | 認可失敗 | No | B-13 |
| not_found | 404 | 対象なし | No | |
| invalid | 400 | 入力不正 | No | |
| conflict | 409 | 競合/状態不整合 | Yes/No | 同時更新方針を固定 |

## 冪等性(二重送信)/同時更新(競合)

- 冪等性の方針:
- 同時更新の方針(例: 楽観ロックで `409`):

## ログ/監査(最小)

- 監査/ログに含める項目(相関ID、actor、対象ID、code):
- 個人情報はログに出さない:

B-15. データ整合性/同時更新(競合)テンプレ(任意)

目的: 整合性制約(invariant)と同時更新(競合)時の方針を合意し、仕様・設計・テストの前提を揃える。B-3(仕様)/B-10(エラーcode)/B-8(テスト配分)に接続する。

運用方針(最小):

  • 「何を同一トランザクションで守るか」を明文化する(守れないなら、観測と復旧をセットにする)
  • 競合(同時更新)の扱いを曖昧にしない(後勝ち/排他/楽観ロックのいずれかを選ぶ)
  • DB 制約(UNIQUE/FK 等)で守るものと、アプリケーションで守るものを分ける
# データ整合性/同時更新: <対象(例: タスク割り当て)>

## 不変条件(Invariant)

| ID | 不変条件(守るべきこと) | 破ると何が起きるか | 守る場所(domain/DB/両方) | 備考 |
| --- | --- | --- | --- | --- |
| I-1 |  |  |  |  |
| I-2 |  |  |  |  |

## 整合性境界(トランザクション)

- 同一トランザクションで成立させるもの(例: タスク更新 + 監査ログ記録):
- 結果整合でよいもの(例: 外部通知の到達):

## 同時更新(競合)方針

- 方針: 後勝ち / 排他 / 楽観ロック
- 競合時の外部挙動: `conflict/409`(または同等)
- 再試行: Yes/No(上限、間隔、誰が再試行するか)

## DB 物理(任意)

- UNIQUE 制約:
- FK/参照整合性:
- バージョン列(楽観ロック):
- インデックス:

## テスト観点(最小)

- 単体: 不変条件(ルール)を純粋関数で守る
- 統合: DB 制約と競合時の挙動(`409`/code)を守る

B-16. 外部I/F失敗時設計テンプレ(リトライ/再送/監視)(任意)

目的: 外部I/F(通知等)の失敗・遅延を前提に、業務継続/停止、再送、監視、手動復旧を「仕様として」固定する。B-3(仕様)/B-10(エラーcode)/B-8(テスト配分)に接続する。

運用方針(最小):

  • 「失敗したらどうなるか」を、成功時と同じ精度で決める(曖昧なまま実装しない)
  • 再試行は「誰が/どこで/何回まで/どの間隔で」を固定する(無限リトライ禁止)
  • 二重実行を前提に、冪等性(重複抑止)と観測点(ログ/メトリクス/アラート)をセットにする
# 外部I/F失敗時設計: <対象(例: メール通知)>

## 前提/非ゴール

- 外部I/F: <通知/決済/認証など>
- 失敗が業務に与える影響: <継続/停止/遅延の許容>
- 非ゴール(例):
  - 厳密な exactly-once を目指さない
  - 外部サービスの SLA を自系で保証しない

## 失敗分類(観測できること)

| code(運用) | 失敗種別 | 例 | 再試行 | 期待する挙動(仕様) | 観測点(ログ/メトリクス) | 備考 |
| --- | --- | --- | --- | --- | --- | --- |
| EXT-1 | TIMEOUT |  | Yes/No |  |  |  |
| EXT-2 | 5XX |  |  |  |  |  |
| EXT-3 | 4XX |  |  |  |  |  |
| EXT-4 | RATE_LIMIT |  |  |  |  |  |

## 失敗時の業務継続(同期/非同期)

- 「業務結果」と「外部I/F結果」を分離する: <する/しない>
- 失敗時の外部挙動(API/UI):
  - code/HTTP(任意):
  - ユーザー表示:
- 停止させる条件(例: 決済失敗は業務失敗):
  - <条件>

## 再試行/再送方針

- 自動再試行: Yes/No
  - 回数上限:
  - 間隔(バックオフ):
  - 誰が再試行するか(アプリ/ジョブ/キュー):
- 手動再送: Yes/No
  - 起点(管理画面/運用スクリプト):
  - 権限:
  - 手順:
- 冪等性/重複抑止:
  - 冪等性キー(例: `Idempotency-Key`/`dedupeKey`):
  - 重複判定の単位(例: `(taskId, notificationType)`):

## 永続化/キュー(任意)

- 記録するもの(例: 通知要求、送信結果、試行回数、最終エラー):
- 状態(例): pending -> sending -> sent / failed
- DLQ/保管先:
- 保持期間/クリーンアップ:

## 監視/アラート(最小)

- 失敗率:
- 滞留(未送信)件数:
- 遅延時間:
- アラート先/対応SLO:
- 相関ID(トレース):

## テスト観点(最小)

- 単体: 再試行可否の判定(失敗分類)を純粋関数で守る
- 統合: 失敗時に「再送起点」が記録され、アラート条件を満たすと検知できる