spec-runner 1.1.17 → 1.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/spec-runner/templates/.claude/agents/code-reviewer.md +2 -8
- package/spec-runner/templates/.claude/agents/design-reviewer.md +6 -12
- package/spec-runner/templates/.claude/agents/impact-analyzer.md +4 -9
- package/spec-runner/templates/.claude/agents/test-runner.md +6 -10
- package/spec-runner/templates/.claude/rules/coding.md +28 -79
- package/spec-runner/templates/.claude/rules/design-docs.md +18 -17
- package/spec-runner/templates/.claude/rules/harness-formats.md +4 -4
- package/spec-runner/templates/.claude/rules/sub-agent-delegation.md +1 -1
- package/spec-runner/templates/.claude/skills/architecture-definition/SKILL.md +3 -3
- package/spec-runner/templates/.claude/skills/architecture-skill-development/SKILL.md +39 -13
- package/spec-runner/templates/.claude/skills/commit/SKILL.md +1 -1
- package/spec-runner/templates/.claude/skills/design-change/SKILL.md +18 -11
- package/spec-runner/templates/.claude/skills/design-change/references//345/275/261/351/237/277/347/257/204/345/233/262/343/203/201/343/202/247/343/203/203/343/202/257/343/203/252/343/202/271/343/203/210.md +30 -37
- package/spec-runner/templates/.claude/skills/docs-driven-seed/SKILL.md +6 -9
- package/spec-runner/templates/.claude/skills/docs-driven-seed/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253.md +1 -1
- package/spec-runner/templates/.claude/skills/existing-project-to-docs/SKILL.md +13 -6
- package/spec-runner/templates/.claude/skills/harness-engineering/SKILL.md +9 -11
- package/spec-runner/templates/.claude/skills/simple-seed/SKILL.md +7 -10
- package/spec-runner/templates/.claude/skills/simple-seed/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/202/267/343/202/271/343/203/206/343/203/240/345/205/250/344/275/223/344/277/257/347/236/260.md +33 -0
- package/spec-runner/templates/.claude/skills/simple-seed/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/270/200/350/246/247.md +15 -0
- package/spec-runner/templates/.claude/skills/test-driven-development/SKILL.md +20 -19
- package/spec-runner/templates/.github/agents/code-reviewer.agent.md +2 -8
- package/spec-runner/templates/.github/agents/design-reviewer.agent.md +6 -12
- package/spec-runner/templates/.github/agents/impact-analyzer.agent.md +4 -9
- package/spec-runner/templates/.github/agents/test-runner.agent.md +6 -10
- package/spec-runner/templates/.github/instructions/coding.instructions.md +27 -78
- package/spec-runner/templates/.github/instructions/design-docs.instructions.md +18 -17
- package/spec-runner/templates/.github/instructions/harness-formats.instructions.md +4 -4
- package/spec-runner/templates/.github/instructions/sub-agent-delegation.instructions.md +1 -1
- package/spec-runner/templates/.github/skills/architecture-definition/SKILL.md +3 -3
- package/spec-runner/templates/.github/skills/architecture-skill-development/SKILL.md +37 -11
- package/spec-runner/templates/.github/skills/commit/SKILL.md +1 -1
- package/spec-runner/templates/.github/skills/design-change/SKILL.md +18 -11
- package/spec-runner/templates/.github/skills/design-change/references//345/275/261/351/237/277/347/257/204/345/233/262/343/203/201/343/202/247/343/203/203/343/202/257/343/203/252/343/202/271/343/203/210.md +30 -37
- package/spec-runner/templates/.github/skills/docs-driven-seed/SKILL.md +6 -9
- package/spec-runner/templates/.github/skills/docs-driven-seed/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253.md +1 -1
- package/spec-runner/templates/.github/skills/existing-project-to-docs/SKILL.md +13 -6
- package/spec-runner/templates/.github/skills/harness-engineering/SKILL.md +10 -12
- package/spec-runner/templates/.github/skills/simple-seed/SKILL.md +7 -10
- package/spec-runner/templates/.github/skills/simple-seed/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/202/267/343/202/271/343/203/206/343/203/240/345/205/250/344/275/223/344/277/257/347/236/260.md +33 -0
- package/spec-runner/templates/.github/skills/simple-seed/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/270/200/350/246/247.md +15 -0
- package/spec-runner/templates/.github/skills/test-driven-development/SKILL.md +20 -19
|
@@ -34,18 +34,25 @@ Phase 5: architecture contract 化
|
|
|
34
34
|
|
|
35
35
|
## Phase 3: 概要設計の draft 化
|
|
36
36
|
|
|
37
|
-
1.
|
|
38
|
-
2. `docs/02_
|
|
37
|
+
1. `docs/02_概要設計/システム全体俯瞰.md` を作る
|
|
38
|
+
2. `style: ddd` の場合: UC から集約・境界コンテキストを整理し `docs/02_概要設計/ドメインモデル.md` を draft する
|
|
39
39
|
3. 必要なら ADR 候補も洗い出す(配置先は `90_ADR/全体/` / `ドメイン/` / `UC/` / `DB/`)
|
|
40
40
|
4. ユーザーに確認・承認を得る
|
|
41
41
|
|
|
42
42
|
## Phase 4: 詳細設計の draft 化
|
|
43
43
|
|
|
44
|
+
`style: ddd` の場合:
|
|
45
|
+
|
|
44
46
|
1. ドメインごとにビジネスルール・集約を整理し `docs/03_詳細設計/01_ドメイン/{ドメイン名}.md` を draft する
|
|
45
47
|
2. UC ごとに `docs/03_詳細設計/02_ユースケース/UC-{日本語名}.md` を draft する
|
|
46
48
|
3. DB・外部サービスの仕様が必要なら `docs/03_詳細設計/03_DB・外部サービス/` を作る
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
|
|
50
|
+
`style: layered` の場合:
|
|
51
|
+
|
|
52
|
+
1. UC ごとに `docs/03_詳細設計/01_ユースケース/UC-{日本語名}.md` を draft する
|
|
53
|
+
2. DB・外部サービスの仕様が必要なら `docs/03_詳細設計/02_DB・外部サービス/` を作る
|
|
54
|
+
|
|
55
|
+
各ファイルの `maps_to` に対応コードとテストを入れる。ユーザーに確認・承認を得る。
|
|
49
56
|
|
|
50
57
|
## Phase 5: architecture contract 化
|
|
51
58
|
|
|
@@ -55,6 +62,6 @@ Phase 5: architecture contract 化
|
|
|
55
62
|
|
|
56
63
|
## 原則
|
|
57
64
|
|
|
58
|
-
-
|
|
59
|
-
- docs
|
|
65
|
+
- 既存コードを正として観測する。推測する場合は明示する
|
|
66
|
+
- docs は最初から完璧を目指さず draft として起こす
|
|
60
67
|
- `maps_to` と `depends_on` を使って後続変更に耐える形へ整える
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: harness-engineering
|
|
3
|
-
description:
|
|
3
|
+
description: skills・rules・agents・テンプレートを改善・保守するメタスキル。手戻り・ルール不足・責務の曖昧さ・テンプレート重複が繰り返し発生したときに使う。通常の機能実装や TDD には使わない。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# harness-engineering
|
|
7
7
|
|
|
8
|
-
skills・rules・agents
|
|
9
|
-
**主目的の作業を先に進め、再利用価値のある改善が必要なときだけ使う。**
|
|
8
|
+
skills・rules・agents・テンプレートを改善するためのメタスキル。主目的の作業を先に進め、再利用価値のある改善が必要なときだけ使う。
|
|
10
9
|
|
|
11
10
|
## 使うタイミング
|
|
12
11
|
|
|
@@ -24,8 +23,7 @@ skills・rules・agents・テンプレートを改善するためのメタスキ
|
|
|
24
23
|
- アプリケーションコードに対する TDD
|
|
25
24
|
- 単なる言い回しの微調整で済む変更
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
TDD は `test-driven-development` スキルに従い、対象プロダクトのコード品質を上げるために行う。
|
|
26
|
+
TDD はこのスキルの対象ではない。TDD は `test-driven-development` スキルに従い、対象プロダクトのコード品質を上げるために行う。
|
|
29
27
|
|
|
30
28
|
## 全体フロー
|
|
31
29
|
|
|
@@ -68,7 +66,7 @@ Phase 4: 影響範囲の反映確認
|
|
|
68
66
|
|
|
69
67
|
## Phase 3: skill / rule / agent / template の修正
|
|
70
68
|
|
|
71
|
-
ファイルを作成・修正する前に
|
|
69
|
+
ファイルを作成・修正する前に `.github/instructions/harness-formats.instructions.md` を読み、フォーマットを確認する。
|
|
72
70
|
|
|
73
71
|
1. 対象ファイルを特定する
|
|
74
72
|
2. 意図が変わらない最小差分で修正する
|
|
@@ -93,13 +91,13 @@ Phase 4: 影響範囲の反映確認
|
|
|
93
91
|
- Claude / Copilot の対応ファイルに反映漏れがないか
|
|
94
92
|
- 今回限りのノイズをルール化していないか
|
|
95
93
|
- skill 名・起動条件・使いどころを変更した場合、`CLAUDE.md` の記述と一致しているか
|
|
96
|
-
- `CLAUDE.md` が肥大化していないか(20行超えたら `instructions/` や `skills/` へ移動を検討する)
|
|
94
|
+
- `CLAUDE.md` が肥大化していないか(20 行超えたら `instructions/` や `skills/` へ移動を検討する)
|
|
97
95
|
- docs 構造・命名規則・node_id 体系に影響する変更の場合、`design-docs.instructions.md` と整合しているか
|
|
98
96
|
|
|
99
97
|
## 原則
|
|
100
98
|
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
99
|
+
- ハーネス改善は常時実行しない。必要なときだけ行う
|
|
100
|
+
- 主目的の作業を優先する
|
|
101
|
+
- 最小変更で改善する
|
|
102
|
+
- 新しい skill の追加は慎重に行う
|
|
103
|
+
- TDD の責務を skill 改善と混同しない
|
|
@@ -5,10 +5,8 @@ description: レイヤードアーキテクチャ / CRUD 中心のプロジェ
|
|
|
5
5
|
|
|
6
6
|
# simple-seed
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
**このスキルをそのまま使い続けない。`architecture-skill-development` で自プロジェクト専用スキルに育てることを前提とする。**
|
|
8
|
+
> レイヤードアーキテクチャ / CRUD 中心のプロジェクト向けの docs 正本開発フロー(種)。`architecture.yaml` の `style: layered` で使う。DDD が必要なプロジェクトは `docs-driven-seed` を使う。
|
|
9
|
+
> このスキルは種。`architecture-skill-development` でプロジェクト専用スキルに育てる。
|
|
12
10
|
|
|
13
11
|
## 全体フロー
|
|
14
12
|
|
|
@@ -33,7 +31,7 @@ Phase 5: TDD → 実装
|
|
|
33
31
|
|
|
34
32
|
## Phase 2: 概要設計
|
|
35
33
|
|
|
36
|
-
テンプレート:
|
|
34
|
+
テンプレート: `templates/02_概要設計/`
|
|
37
35
|
|
|
38
36
|
1. 要件定義からユースケースを洗い出す(Query / Command を意識)
|
|
39
37
|
2. テンプレートをコピーして `docs/02_概要設計/ユースケース一覧.md` を作る
|
|
@@ -55,7 +53,7 @@ docs/02_概要設計/
|
|
|
55
53
|
## Phase 3: ADR(必要時のみ)
|
|
56
54
|
|
|
57
55
|
1. 設計判断が必要な場合だけ ADR を作る
|
|
58
|
-
2.
|
|
56
|
+
2. 提案時に必ず 3 案を比較する。ドキュメントには採用案と採用理由のみ記録する
|
|
59
57
|
3. ファイル名は `mmdd-{日本語タイトル}.md`、配置先は対象フォルダ
|
|
60
58
|
|
|
61
59
|
| 対象 | 配置先 |
|
|
@@ -68,7 +66,7 @@ docs/02_概要設計/
|
|
|
68
66
|
|
|
69
67
|
## Phase 4: 詳細設計
|
|
70
68
|
|
|
71
|
-
|
|
69
|
+
UC → DB・外部サービス の順に設計する。
|
|
72
70
|
|
|
73
71
|
### 4-1. ユースケース
|
|
74
72
|
|
|
@@ -100,6 +98,5 @@ docs/03_詳細設計/02_DB・外部サービス/
|
|
|
100
98
|
|
|
101
99
|
## 原則
|
|
102
100
|
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
- **`maps_to` は必ず設定する。パス推定に頼らない**
|
|
101
|
+
- ドメイン層は持たない。ビジネスロジックは UC / サービス層で表現する
|
|
102
|
+
- `maps_to` は必ず設定する。パス推定に頼らない
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
spec_runner:
|
|
3
|
+
node_id: overview.system_context
|
|
4
|
+
kind: overview_design
|
|
5
|
+
depends_on:
|
|
6
|
+
- overview.use_case_list
|
|
7
|
+
maps_to:
|
|
8
|
+
- src/
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# システム全体俯瞰
|
|
12
|
+
|
|
13
|
+
## コンポーネント全体図
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
graph LR
|
|
17
|
+
User([ユーザー])
|
|
18
|
+
subgraph システム
|
|
19
|
+
{フロントエンド}
|
|
20
|
+
{バックエンド}
|
|
21
|
+
end
|
|
22
|
+
Ext([{外部サービス}])
|
|
23
|
+
|
|
24
|
+
User --> {フロントエンド}
|
|
25
|
+
{フロントエンド} --> {バックエンド}
|
|
26
|
+
{バックエンド} --> Ext
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 外部インターフェース
|
|
30
|
+
|
|
31
|
+
| 外部システム | 方向 | プロトコル | 概要 |
|
|
32
|
+
|------------|------|----------|------|
|
|
33
|
+
| {外部システム名} | 受信 / 送信 | {HTTP / gRPC など} | {概要} |
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
spec_runner:
|
|
3
|
+
node_id: overview.use_case_list
|
|
4
|
+
kind: overview_design
|
|
5
|
+
depends_on:
|
|
6
|
+
- requirement.要件定義
|
|
7
|
+
maps_to:
|
|
8
|
+
- docs/03_詳細設計/01_ユースケース/
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ユースケース一覧
|
|
12
|
+
|
|
13
|
+
| UC ID | UC名 | 種別 | 概要 |
|
|
14
|
+
|-------|------|------|------|
|
|
15
|
+
| UC-{番号} | {UC名} | Command / Query | {概要} |
|
|
@@ -9,13 +9,13 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
|
|
|
9
9
|
|
|
10
10
|
テストを先に書く。失敗するのを確認する。通る最小のコードを書く。
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
テストが失敗するのを見ていないなら、そのテストが正しいものを検証しているか分からない。
|
|
13
13
|
|
|
14
14
|
## いつ使うか
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
常に使う: 新機能・バグ修正・リファクタリング・振る舞い変更
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
例外(ユーザーに確認する): 使い捨てプロトタイプ・生成コード・設定ファイル
|
|
19
19
|
|
|
20
20
|
## 鉄の掟
|
|
21
21
|
|
|
@@ -28,7 +28,7 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
|
|
|
28
28
|
|
|
29
29
|
## テスト戦略:テストピラミッド
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
実装前にどのテスト種別を書くかを決める。迷ったら単体テストから始める。
|
|
32
32
|
|
|
33
33
|
```
|
|
34
34
|
/\
|
|
@@ -55,7 +55,7 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
|
|
|
55
55
|
|
|
56
56
|
### 結合テスト(Integration)
|
|
57
57
|
|
|
58
|
-
**対象:** 複数モジュールの連携、DB・キャッシュ・外部APIとの境界
|
|
58
|
+
**対象:** 複数モジュールの連携、DB・キャッシュ・外部 API との境界
|
|
59
59
|
|
|
60
60
|
**書くとき:**
|
|
61
61
|
- DB へのクエリ・永続化
|
|
@@ -91,7 +91,7 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
|
|
|
91
91
|
| バグ修正 | 最小レベルで再現テスト | — |
|
|
92
92
|
|
|
93
93
|
**バグ修正の場合:** バグを再現できる最も低いレベルのテストを書く。
|
|
94
|
-
単体で再現できるなら単体、DBが絡むなら結合。E2E で初めて再現するバグは、単体・結合に落とし込めないか検討する。
|
|
94
|
+
単体で再現できるなら単体、DB が絡むなら結合。E2E で初めて再現するバグは、単体・結合に落とし込めないか検討する。
|
|
95
95
|
|
|
96
96
|
## テスト実行コマンド
|
|
97
97
|
|
|
@@ -145,7 +145,7 @@ test("ある入力に対して期待する出力を返す", () => {
|
|
|
145
145
|
|
|
146
146
|
### Verify RED - 失敗するのを確認する
|
|
147
147
|
|
|
148
|
-
|
|
148
|
+
> 必須。絶対に省略しない。
|
|
149
149
|
|
|
150
150
|
`@test-runner` エージェントに委任して実行する。
|
|
151
151
|
|
|
@@ -164,7 +164,7 @@ test("ある入力に対して期待する出力を返す", () => {
|
|
|
164
164
|
|
|
165
165
|
### Verify GREEN - 通るのを確認する
|
|
166
166
|
|
|
167
|
-
|
|
167
|
+
> 必須。
|
|
168
168
|
|
|
169
169
|
`@test-runner` エージェントに委任して実行する。
|
|
170
170
|
|
|
@@ -178,8 +178,8 @@ test("ある入力に対して期待する出力を返す", () => {
|
|
|
178
178
|
|
|
179
179
|
### REFACTOR - 整理する
|
|
180
180
|
|
|
181
|
-
Greenの後にのみ: 重複削除・命名改善・ヘルパ抽出。
|
|
182
|
-
テストは常にGreenを維持する。新しい挙動は追加しない。
|
|
181
|
+
Green の後にのみ: 重複削除・命名改善・ヘルパ抽出。
|
|
182
|
+
テストは常に Green を維持する。新しい挙動は追加しない。
|
|
183
183
|
|
|
184
184
|
### 繰り返す
|
|
185
185
|
|
|
@@ -189,12 +189,12 @@ Greenの後にのみ: 重複削除・命名改善・ヘルパ抽出。
|
|
|
189
189
|
|
|
190
190
|
- **最小**: 1つの振る舞いだけ。「and」が入るなら分割する
|
|
191
191
|
- **明確**: テスト名が挙動を説明する
|
|
192
|
-
- **意図が見える**: 望ましいAPIの使い方が伝わる
|
|
192
|
+
- **意図が見える**: 望ましい API の使い方が伝わる
|
|
193
193
|
|
|
194
194
|
## テストのコメント
|
|
195
195
|
|
|
196
196
|
テストコメントの規約は同梱のコーディング規約ファイルの「テストコメント規約」に従う。
|
|
197
|
-
GREEN / REFACTORフェーズで書く実装コードにもビジネスロジックの意図をコメントする。
|
|
197
|
+
GREEN / REFACTOR フェーズで書く実装コードにもビジネスロジックの意図をコメントする。
|
|
198
198
|
|
|
199
199
|
## テスト構成
|
|
200
200
|
|
|
@@ -256,18 +256,19 @@ tests/
|
|
|
256
256
|
|------|------|
|
|
257
257
|
| 「簡単すぎてテスト不要」 | 簡単でも壊れる。テストは30秒 |
|
|
258
258
|
| 「あとでテストする」 | すぐ通るテストは何も証明しない |
|
|
259
|
-
| 「今回だけTDDを飛ばす」 | 合理化である。止めること |
|
|
260
|
-
| テスト前にコードを書いた | コードを削除し、TDDで最初からやり直す |
|
|
259
|
+
| 「今回だけ TDD を飛ばす」 | 合理化である。止めること |
|
|
260
|
+
| テスト前にコードを書いた | コードを削除し、TDD で最初からやり直す |
|
|
261
261
|
| テストが最初から通る | 既存挙動をテストしている。テストを修正する |
|
|
262
262
|
| なぜ失敗したか説明できない | テストが正しいか再検討する |
|
|
263
263
|
| 全部 E2E で書いた | ピラミッドが逆転している。単体・結合に落とし込む |
|
|
264
264
|
| 全部モックだらけ | 結合が強すぎる。または結合テストを書くべき |
|
|
265
265
|
|
|
266
|
-
|
|
266
|
+
どれか 1 つでも当てはまるなら: コードを削除し、TDD で最初からやり直す。
|
|
267
267
|
|
|
268
268
|
## 完了時のレビュー
|
|
269
269
|
|
|
270
|
-
|
|
270
|
+
実装完了後、以下のエージェントを**同時に**起動してレビューする:
|
|
271
|
+
- `@design-reviewer` — 設計書⇔実装の整合性チェック
|
|
271
272
|
- `@code-reviewer` — コーディング規約への適合チェック
|
|
272
273
|
|
|
273
274
|
## 検証チェックリスト
|
|
@@ -285,13 +286,13 @@ tests/
|
|
|
285
286
|
- [ ] モック方針がテスト種別に合っている
|
|
286
287
|
- [ ] エッジケースとエラーをカバーした
|
|
287
288
|
|
|
288
|
-
すべてにチェックできないならTDDを飛ばしている。やり直すこと。
|
|
289
|
+
すべてにチェックできないなら TDD を飛ばしている。やり直すこと。
|
|
289
290
|
|
|
290
291
|
## 詰まったとき
|
|
291
292
|
|
|
292
293
|
| 問題 | 解決 |
|
|
293
294
|
|------|------|
|
|
294
|
-
| どうテストすべきか分からない | 望むAPIを書き、まずアサーションを書く。ユーザーに相談する |
|
|
295
|
+
| どうテストすべきか分からない | 望む API を書き、まずアサーションを書く。ユーザーに相談する |
|
|
295
296
|
| どのテスト種別か迷う | 単体から始める。単体で書けないなら結合を検討する |
|
|
296
297
|
| テストが複雑すぎる | 設計が複雑すぎる。インターフェースを簡素化する |
|
|
297
298
|
| 何でもモック必須 | 結合が強すぎる。依存性注入を使う。または結合テストで書く |
|
|
@@ -302,7 +303,7 @@ tests/
|
|
|
302
303
|
|
|
303
304
|
```
|
|
304
305
|
本番コード → 先にテストが存在し、失敗している
|
|
305
|
-
それ以外 → TDDではない
|
|
306
|
+
それ以外 → TDD ではない
|
|
306
307
|
```
|
|
307
308
|
|
|
308
309
|
ユーザーの許可なしに例外はない。
|