@k2works/claude-code-booster 5.1.0 → 6.1.0

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.
Files changed (16) hide show
  1. package/lib/assets/.claude/skills/migrating-ai-dlc/SKILL.md +243 -0
  2. package/lib/assets/.claude/skills/migrating-ai-dlc/evals/evals.json +60 -0
  3. package/lib/assets/.claude/skills/migrating-ai-dlc/references/artifact-templates.md +258 -0
  4. package/lib/assets/.claude/skills/migrating-ai-dlc/scripts/aidlc_check.py +372 -0
  5. package/lib/assets/CLAUDE.md +23 -1
  6. package/lib/assets/docs/index.md +37 -37
  7. package/lib/assets/docs/log.md +15 -0
  8. package/lib/assets/docs/reference/AI-DLC/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211.md +782 -0
  9. package/lib/assets/docs/reference/AI-DLC/347/224/250/350/252/236/351/233/206.md +207 -0
  10. package/lib/assets/docs/reference/index.md +6 -0
  11. package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211_AI-DLC/347/211/210.md +981 -0
  12. package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211_AI-DLC/347/211/210.md +1167 -0
  13. package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211_AI-DLC/347/211/210.md +793 -0
  14. package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211_AI-DLC/347/211/210.md +492 -0
  15. package/lib/assets/gulpfile.js +2 -2
  16. package/package.json +1 -1
@@ -0,0 +1,981 @@
1
+ ---
2
+ type: Reference
3
+ title: "コーディングとテストガイド(AI-DLC 版)"
4
+ description: "AI-DLC(AI-Driven Development Lifecycle)の Construction フェーズにおけるコーディングとテストの手法。TDD の三原則を AI が実行し人が承認ゲートで検証する Bolt 実装フロー、ステップ計画、AI 生成コードとテストのレビュー観点、ソース束縛レビュー、テスト戦略の水準、リファクタリングとガードレール、技術的負債(quick-cement)の管理、本プロジェクトの開発スキルへの適用方法をまとめる。"
5
+ tags: [reference]
6
+ status: stable
7
+ generated: { by: claude-code/claude-fable-5-1, at: 2026-09-12T05:50:00Z }
8
+ sources:
9
+ - id: coding-testing-guide
10
+ resource: ./コーディングとテストガイド.md
11
+ title: コーディングとテストガイド(XP 版)
12
+ author: human:kakimomokuri
13
+ - id: aidlc-guide
14
+ resource: ./AI-DLC導入ガイド.md
15
+ title: AI-DLC 導入ガイド
16
+ author: claude-code/claude-fable-5-1
17
+ - id: aidlc-paper
18
+ resource: https://prod.d13rzhkk8cj2z0.amplifyapp.com/aidlc.pdf
19
+ title: AI-Driven Development Lifecycle (AI-DLC) Method Definition
20
+ author: human:raja-sp
21
+ - id: aidlc-workflows
22
+ resource: https://github.com/awslabs/aidlc-workflows
23
+ title: awslabs/aidlc-workflows(User Guide)
24
+ author: org:awslabs
25
+ verified:
26
+ - { by: human:kakimomokuri, at: 2026-09-12T06:25:42Z }
27
+ ---
28
+
29
+ # コーディングとテストガイド(AI-DLC 版)
30
+
31
+ ## 概要
32
+
33
+ このガイドは、[コーディングとテストガイド](コーディングとテストガイド.md)(XP 版)を AI-DLC の原則で読み替えたものです。AI-DLC の背景と用語は [AI-DLC 導入ガイド](AI-DLC導入ガイド.md) を、Bolt の計画は [リリース・イテレーション計画ガイド(AI-DLC 版)](リリース・イテレーション計画ガイド_AI-DLC版.md) を、実装の契約となるストーリーは [ユースケース作成ガイド(AI-DLC 版)](ユースケース作成ガイド_AI-DLC版.md) を参照してください。
34
+
35
+ XP 版との最大の違いは、**Red-Green-Refactor を回すのが AI で、各サイクルの成果物を検証するのが人** になることです。AI-DLC の論文は、設計技法を方法論の中核に置くと述べ、DDD・BDD・TDD それぞれのフレーバーがあると明記しています。本ガイドは **TDD フレーバー** の AI-DLC です。TDD の三原則・テストピラミッド・リファクタリングの規律は XP 版から変えません。変わるのは、誰がコードを書き、誰が何を検証するかです。
36
+
37
+ | 観点 | XP 版 | AI-DLC 版 |
38
+ | :--- | :--- | :--- |
39
+ | コードを書く | 開発者(ペア) | AI が生成し、開発者が全行を理解して検証する |
40
+ | TODO リスト | 開発者が作る | AI がチェックボックス付きのステップ計画として書き、人が承認する |
41
+ | Red-Green-Refactor | 開発者が回す | AI が回し、サイクルごと(または Bolt ごと)に人が承認ゲートで検証する |
42
+ | 単位 | イテレーション(1〜4 週間) | Bolt(時間〜日) |
43
+ | コードレビュー | ペア・プルリクエスト | 承認ゲート。レビュアーエージェントの指摘を材料に人が判断する |
44
+ | 品質チェック | コミット前に開発者が実行 | AI が実行し結果を分析、人が確認する |
45
+ | コミット | 開発者 | 承認ゲート通過後に人が行う(または人の承認のもとで AI が行う) |
46
+ | ふりかえり | イテレーション末 | Bolt 末。判断と学びをガードレールにする |
47
+ | 儀式 | ペアプログラミング | Mob Construction(同じ部屋・共有画面で技術判断) |
48
+
49
+ ---
50
+
51
+ ## 基本原則
52
+
53
+ ### TDD の三原則(変えない)
54
+
55
+ 1. **失敗するテストを書くまで、プロダクションコードを書いてはならない**
56
+ 2. **失敗するテストは、失敗するのに十分なだけ書く**
57
+ 3. **現在失敗しているテストを成功させる以上のプロダクションコードを書いてはならない**
58
+
59
+ AI は「一度にたくさん書く」ことが得意なため、放っておくと三原則を破ります。テストを書かずに実装を生成する、失敗を確認せずに次へ進む、テストが要求する以上の機能を先回りして実装する、といった振る舞いです。AI-DLC 版では、三原則を **AI への指示(ガードレール)** として明示し、承認ゲートで守られているかを検証します。
60
+
61
+ ### AI-DLC における追加原則
62
+
63
+ | 原則 | 内容 |
64
+ | :--- | :--- |
65
+ | AI が実行し、人が検証する | AI がサイクルを回し、人は各ゲートで成果物を検証・承認する |
66
+ | コードは全行理解する | AI が書いたコードでも、理解していないコードはマージしない |
67
+ | 検証は損失関数 | 早い段階のゲートで誤りを刈り取る。ウォーキングスケルトンで AI の出力品質を確かめてからゲート密度を決める |
68
+ | 品質基準を引き上げる | 生成コストが下がった分、テスト・静的解析・ドキュメントの水準を上げる |
69
+ | 修正はガードレールにする | 人が AI の振る舞いを修正した内容は `CLAUDE.md`・`PROJECT.md`・スキルに反映し、同じ修正を繰り返さない |
70
+
71
+ ### Red-Green-Refactor サイクル(AI-DLC 版)
72
+
73
+ ```plantuml
74
+ @startuml
75
+ title Red-Green-Refactor サイクル(AI が回し、人が検証する)
76
+
77
+ [*] --> Red
78
+ state Red {
79
+ [*] --> テストを書く
80
+ テストを書く : AI が失敗するテストを書き
81
+ テストを書く : 失敗を確認して報告する
82
+ }
83
+ Red --> Green : 最小限の実装
84
+
85
+ state Green {
86
+ [*] --> テストが通る
87
+ テストが通る : AI が最小限のコードを書き
88
+ テストが通る : テストが通ることを確認する
89
+ }
90
+ Green --> Refactor : テスト成功
91
+
92
+ state Refactor {
93
+ [*] --> リファクタリング
94
+ リファクタリング : AI が重複を除去し設計を改善
95
+ リファクタリング : テストが通り続けることを確認
96
+ }
97
+ Refactor --> Gate : サイクル完了
98
+
99
+ state Gate {
100
+ [*] --> 人が検証
101
+ 人が検証 : コードを全行理解する
102
+ 人が検証 : テストが契約(受入条件)を表すか確認
103
+ }
104
+ Gate --> Red : 承認・次のテスト
105
+ Gate --> Refactor : 変更依頼
106
+ Gate --> [*] : ステップ完了
107
+
108
+ note right of Red
109
+ テストが本当に失敗したか
110
+ AI に報告させる
111
+ end note
112
+
113
+ note right of Gate
114
+ ゲート密度は
115
+ ウォーキングスケルトンの
116
+ 結果で決める
117
+ end note
118
+ @enduml
119
+ ```
120
+
121
+ ---
122
+
123
+ ## Bolt 開発フロー
124
+
125
+ ### 全体プロセス
126
+
127
+ XP 版のイテレーション開発フローを Bolt に置き換えます。TODO リストは AI が書くステップ計画、コードレビューは承認ゲート、受け入れは Deployment Unit の検証になります。
128
+
129
+ ```plantuml
130
+ @startuml
131
+ title Bolt 開発プロセス
132
+
133
+ start
134
+
135
+ partition "Bolt 開始" {
136
+ :Unit のストーリーと受入条件を AI に渡す;
137
+ :AI がステップ計画を書く;
138
+ :人が計画を承認する(承認ゲート);
139
+ }
140
+
141
+ repeat
142
+ partition "TDD 実装サイクル(AI)" {
143
+ :ステップを 1 つ選ぶ;
144
+ repeat
145
+ :失敗テスト作成(Red);
146
+ :最小実装(Green);
147
+ :リファクタリング(Refactor);
148
+ :品質チェック(テスト・Lint・静的解析);
149
+ if (品質 OK?) then (yes)
150
+ else (no)
151
+ :AI が修正案を提示;
152
+ endif
153
+ repeat while (ステップ内のテスト完了?)
154
+ }
155
+ partition "承認ゲート(人)" {
156
+ :コードを全行理解する;
157
+ :レビュアーの指摘を確認する;
158
+ if (承認?) then (yes)
159
+ :コミット;
160
+ :チェックボックスを完了にする;
161
+ else (no)
162
+ :変更依頼(AI が修正して再提示);
163
+ endif
164
+ }
165
+ repeat while (全ステップ完了?)
166
+
167
+ partition "Bolt 完了" {
168
+ :Deployment Unit として検証;
169
+ :Bolt 終了報告;
170
+ :判断と学びをガードレールに反映;
171
+ }
172
+
173
+ stop
174
+ @enduml
175
+ ```
176
+
177
+ ### 承認ゲートの密度
178
+
179
+ Bolt の最初のステップ(ウォーキングスケルトン)のゲートを通過した時点で、残りのステップをどう進めるかを 1 回だけ決めます。
180
+
181
+ | 選択 | 内容 | 向いている場合 |
182
+ | :--- | :--- | :--- |
183
+ | 各サイクルでゲート | Red-Green-Refactor ごとに人が検証する | 初めてのコードベース、AI の出力品質が未知、規制対象 |
184
+ | 各ステップでゲート | ステップ(複数サイクル)ごとに人が検証する | 通常の Bolt。既定の密度 |
185
+ | 自律実行 | 失敗時と Bolt 完了時だけ人が検証する | ウォーキングスケルトンの品質が十分、確認必須の操作を含まない |
186
+
187
+ 自律実行を選んでも、次の場合は必ず停止して人に判断を求めます。
188
+
189
+ - テストが失敗し、AI の修正案でも通らない
190
+ - 新規ファイル作成・スキーマ変更・外部ライブラリ導入・セキュリティ・本番環境に関わる操作
191
+ - AI が置いた仮定が未確認
192
+ - 計画に無いステップが必要になった
193
+
194
+ ---
195
+
196
+ ## アプローチ戦略
197
+
198
+ ### インサイドアウト vs アウトサイドイン
199
+
200
+ XP 版の選択フローはそのまま有効です。AI-DLC 版では、選択の結果を **AI に明示的に指示** します。AI は指示がなければ全層を一度に生成しようとするためです。
201
+
202
+ ```plantuml
203
+ @startuml
204
+ title 実装アプローチ選択フロー(AI-DLC 版)
205
+
206
+ start
207
+
208
+ :ユーザーストーリーと Unit を分析;
209
+
210
+ if (ブラウンフィールド?) then (はい)
211
+ :AI にコードを静的・動的モデルへ昇格させる;
212
+ :人がモデルを検証;
213
+ endif
214
+
215
+ if (基本 CRUD 実装済み?) then (はい)
216
+ if (ドメインロジックが複雑?) then (はい)
217
+ :ドメインモデル中心;
218
+ #lightgreen:アウトサイドイン推奨;
219
+ note right
220
+ 受入テストからスタート
221
+ AI にモックで層を降りさせる
222
+ end note
223
+ else (いいえ)
224
+ :シンプルな機能追加;
225
+ #lightblue:どちらでも可;
226
+ endif
227
+ else (いいえ)
228
+ :貧血ドメインモデル;
229
+ #yellow:インサイドアウト推奨;
230
+ note right
231
+ データ層から開始
232
+ AI に層ごとにゲートを置く
233
+ end note
234
+ endif
235
+
236
+ :アプローチを Bolt 計画に明記し AI に指示;
237
+
238
+ stop
239
+ @enduml
240
+ ```
241
+
242
+ ### インサイドアウトアプローチ
243
+
244
+ データベース層から順に上位層へ進めます。AI には **層ごとに 1 ステップ** として計画させ、層の境界を承認ゲートにします。
245
+
246
+ ```plantuml
247
+ @startuml
248
+ title インサイドアウトアプローチ(AI-DLC 版)
249
+
250
+ participant "人(ゲート)" as human
251
+ participant "AI" as ai
252
+ participant "データベース層" as db
253
+ participant "インフラ層" as infra
254
+ participant "ドメイン層" as domain
255
+ participant "サービス層" as service
256
+ participant "プレゼンテーション層" as ui
257
+
258
+ == ステップ 1: データベース ==
259
+ ai -> db: テーブル定義テスト → 実装
260
+ ai -> human: スキーマを提示(確認必須)
261
+ human --> ai: 承認
262
+
263
+ == ステップ 2: インフラストラクチャ ==
264
+ ai -> infra: リポジトリテスト → 実装
265
+ ai -> human: 永続化の方式を提示
266
+ human --> ai: 承認
267
+
268
+ == ステップ 3: ドメイン ==
269
+ ai -> domain: ビジネスロジックテスト → 実装
270
+ ai -> human: ドメインモデルとの整合を提示
271
+ human --> ai: 承認
272
+
273
+ == ステップ 4: サービス ==
274
+ ai -> service: ユースケーステスト → 実装
275
+ ai -> human: トランザクション境界を提示
276
+ human --> ai: 承認
277
+
278
+ == ステップ 5: プレゼンテーション ==
279
+ ai -> ui: UI テスト → 実装
280
+ ai -> human: 受入条件との対応を提示
281
+ human --> ai: 承認
282
+ @enduml
283
+ ```
284
+
285
+ ### アウトサイドインアプローチ
286
+
287
+ 受入テストから始めて内側へ進めます。AI にはモックで外側から降りさせ、**モックを実装に置き換えるタイミング** を承認ゲートにします。
288
+
289
+ ```plantuml
290
+ @startuml
291
+ title アウトサイドインアプローチ(AI-DLC 版)
292
+
293
+ participant "人(ゲート)" as human
294
+ participant "AI" as ai
295
+ participant "受け入れテスト" as at
296
+ participant "プレゼンテーション層" as ui
297
+ participant "サービス層" as service
298
+ participant "ドメイン層" as domain
299
+ participant "インフラ層" as infra
300
+
301
+ == ステップ 1: 受け入れテスト ==
302
+ ai -> at: 受入条件から受け入れテストを生成
303
+ ai -> human: 受入条件との対応を提示
304
+ human --> ai: 承認(契約の確定)
305
+
306
+ == ステップ 2: UI 実装 ==
307
+ ai -> ui: UI テスト → 実装(サービスはモック)
308
+ ai -> human: 画面動作を提示
309
+
310
+ == ステップ 3: サービス実装 ==
311
+ ai -> service: 統合テスト → 実装(ドメインはモック)
312
+ ai -> human: モックを実装に置き換える境界を提示
313
+ human --> ai: 承認
314
+
315
+ == ステップ 4: ドメイン実装 ==
316
+ ai -> domain: ドメインテスト → 実装(インフラはモック)
317
+ ai -> human: ドメインモデルとの整合を提示
318
+ human --> ai: 承認
319
+
320
+ == ステップ 5: インフラ実装 ==
321
+ ai -> infra: 永続化テスト → 実装
322
+ ai -> human: 受け入れテストが実データで通ることを提示
323
+ human --> ai: 承認(Deployment Unit へ)
324
+ @enduml
325
+ ```
326
+
327
+ ### ブラウンフィールドでの前処理
328
+
329
+ 既存コードに手を入れる場合、AI に直接コードを渡すのではなく、まず **静的モデル(コンポーネント・責務・関係)と動的モデル(主要ユースケースの相互作用)に昇格** させ、人が検証してから変更に入ります。変更対象を「既存の ○○ と同じ方式で」と参照させることで、コードベースの規約から外れた生成を防ぎます。
330
+
331
+ ---
332
+
333
+ ## TDD 実装の詳細手順
334
+
335
+ ### 1. ステップ計画(TODO リストの AI-DLC 版)
336
+
337
+ XP 版の TODO リストは、AI が書く **チェックボックス付きのステップ計画** になります。[AI-DLC 導入ガイド](AI-DLC導入ガイド.md#7-プロンプトパターン) のプロンプト骨格で書かせます。
338
+
339
+ ```markdown
340
+ あなたは経験豊富なソフトウェアエンジニアです。
341
+ docs/requirements/<project>/stories.md のストーリー「ユーザー登録」と受入条件を参照し、
342
+ 実装のステップをチェックボックス付きの Markdown 計画として
343
+ docs/development/<project>/bolt_<n>_plan.md に書いてください。
344
+
345
+ 規約:
346
+ - テスト駆動開発の三原則に従う。テストを書き、失敗を確認してから実装する
347
+ - アプローチはインサイドアウト。層ごとに 1 ステップにする
348
+ - 各ステップは 1 回のやり取りで完結する粒度にする
349
+ - 人の確認が必要なステップ(新規ファイル、スキーマ変更、ライブラリ追加、
350
+ セキュリティ)にはその旨を注記する
351
+ - 既存の apps/<project>/src/.../Order.java と同じ規約で書く
352
+ - 置いた仮定は計画の末尾に列挙する
353
+ 計画ができたらレビューと承認を求め、承認後に 1 ステップずつ実行し、
354
+ 完了したステップのチェックボックスを更新してください。
355
+ ```
356
+
357
+ ```markdown
358
+ ## Bolt 3 計画:ユーザー登録(AI が作成、人が承認)
359
+
360
+ - [ ] 1. User エンティティ
361
+ - [ ] 1.1 必須フィールドの検証(Red → Green → Refactor)
362
+ - [ ] 1.2 メールアドレスの形式検証
363
+ - [ ] 1.3 パスワードの強度チェック ※ハッシュ方式は要確認
364
+ - [ ] 2. UserRepository
365
+ - [ ] 2.1 save() ※テーブル追加(スキーマ変更)のため要確認
366
+ - [ ] 2.2 findByEmail()
367
+ - [ ] 2.3 existsByEmail()
368
+ - [ ] 3. UserService
369
+ - [ ] 3.1 register()
370
+ - [ ] 3.2 重複チェック
371
+ - [ ] 4. UserController
372
+ - [ ] 4.1 POST /users ※既存の OrderController と同じ規約
373
+ - [ ] 4.2 バリデーションとエラーハンドリング
374
+
375
+ ### AI の仮定
376
+ - パスワードのハッシュには既存の依存関係にある BCrypt を使う(要確認)
377
+ - メールアドレスの一意性は DB 制約とアプリ側の両方で担保する(要確認)
378
+ ```
379
+
380
+ 計画の検証観点は次のとおりです。
381
+
382
+ | 観点 | 確認内容 |
383
+ | :--- | :--- |
384
+ | 三原則 | 各ステップがテストから始まる順序になっているか |
385
+ | 粒度 | 1 ステップが 1 回のやり取りで完結するか。大きすぎるステップはないか |
386
+ | 確認ポイント | 確認必須の操作に注記があるか |
387
+ | 参照 | 既存実装・規約・ドメイン用語を参照しているか |
388
+ | 仮定 | 列挙された仮定に答えたか。答えていない仮定で AI が進んでいないか |
389
+ | スコープ | ストーリーに無い機能を先回りしていないか |
390
+
391
+ ### 2. Red フェーズ(AI が失敗するテストを書く)
392
+
393
+ AI にテストを書かせ、**実行して失敗したことを報告させます**。「テストを書きました」だけで進ませません。
394
+
395
+ ```java
396
+ // UserTest.java(AI が生成)
397
+ @Test
398
+ void ユーザー作成時に必須フィールドが検証される() {
399
+ // Given
400
+ String email = "test@example.com";
401
+ String password = "SecurePass123!";
402
+ String name = "山田太郎";
403
+
404
+ // When
405
+ User user = new User(email, password, name);
406
+
407
+ // Then
408
+ assertThat(user.getEmail()).isEqualTo(email);
409
+ assertThat(user.getName()).isEqualTo(name);
410
+ // パスワードはハッシュ化されている
411
+ assertThat(user.getPassword()).isNotEqualTo(password);
412
+ }
413
+
414
+ @Test
415
+ void 無効なメールアドレスで例外が発生する() {
416
+ // Given
417
+ String invalidEmail = "invalid-email";
418
+
419
+ // When/Then
420
+ assertThrows(IllegalArgumentException.class, () -> {
421
+ new User(invalidEmail, "password", "name");
422
+ });
423
+ }
424
+ ```
425
+
426
+ ```text
427
+ AI の報告例:
428
+ テストを 2 件追加し実行しました。結果: 2 件失敗(User クラスが存在しないためコンパイルエラー)。
429
+ 次のステップで最小限の実装に進みます。
430
+ ```
431
+
432
+ 人の検証観点は次のとおりです。
433
+
434
+ - テストは **受入条件を表しているか**。実装の都合ではなく振る舞いを検証しているか
435
+ - 本当に失敗したか。失敗の理由は想定どおりか
436
+ - 1 つのテストが 1 つのことを検証しているか
437
+ - テスト名がドメイン用語で振る舞いを説明しているか
438
+
439
+ ### 3. Green フェーズ(AI が最小限の実装を書く)
440
+
441
+ AI は「先回りして完成形を書く」傾向があります。**現在失敗しているテストを通す以上のコードを書かない** ことを指示し、検証します。
442
+
443
+ ```java
444
+ // User.java(AI が生成した最小実装)
445
+ public class User {
446
+ private String email;
447
+ private String password;
448
+ private String name;
449
+
450
+ public User(String email, String password, String name) {
451
+ if (!isValidEmail(email)) {
452
+ throw new IllegalArgumentException("無効なメールアドレス");
453
+ }
454
+ this.email = email;
455
+ this.password = hashPassword(password);
456
+ this.name = name;
457
+ }
458
+
459
+ private boolean isValidEmail(String email) {
460
+ return email != null && email.contains("@");
461
+ }
462
+
463
+ private String hashPassword(String password) {
464
+ // 最小実装。ハッシュ方式は Refactor で確定(要確認の仮定)
465
+ return "hashed_" + password;
466
+ }
467
+
468
+ // getters...
469
+ }
470
+ ```
471
+
472
+ 人の検証観点は次のとおりです。
473
+
474
+ - テストが要求する以上の機能(未テストの分岐・将来用のフィールド・汎用化)が入っていないか
475
+ - 「仮の実装」に印が付いているか。AI が仮の実装を本実装として扱っていないか
476
+ - 全テストが通ったことを AI が報告しているか(新しいテストだけでなく既存テストも)
477
+
478
+ ### 4. Refactor フェーズ(AI が設計を改善する)
479
+
480
+ AI に重複の除去と設計改善をさせ、**テストが通り続けること** を確認させます。設計判断(値オブジェクトの抽出・ライブラリの採用)は承認ゲートで人が決めます。
481
+
482
+ ```java
483
+ // User.java(リファクタリング後。値オブジェクトへの分割は人が承認)
484
+ public class User {
485
+ private final Email email;
486
+ private final Password password;
487
+ private final Name name;
488
+
489
+ public User(String email, String password, String name) {
490
+ this.email = new Email(email);
491
+ this.password = new Password(password);
492
+ this.name = new Name(name);
493
+ }
494
+
495
+ // getters...
496
+ }
497
+
498
+ // Email.java(値オブジェクト)
499
+ public class Email {
500
+ private static final Pattern VALID_EMAIL_PATTERN =
501
+ Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$");
502
+
503
+ private final String value;
504
+
505
+ public Email(String value) {
506
+ if (value == null || !VALID_EMAIL_PATTERN.matcher(value).matches()) {
507
+ throw new IllegalArgumentException("無効なメールアドレス: " + value);
508
+ }
509
+ this.value = value;
510
+ }
511
+
512
+ public String getValue() {
513
+ return value;
514
+ }
515
+ }
516
+
517
+ // Password.java(値オブジェクト。BCrypt の採用は仮定を確認して承認)
518
+ public class Password {
519
+ private static final int MIN_LENGTH = 8;
520
+ private final String hashedValue;
521
+
522
+ public Password(String rawPassword) {
523
+ validate(rawPassword);
524
+ this.hashedValue = BCrypt.hashpw(rawPassword, BCrypt.gensalt());
525
+ }
526
+
527
+ private void validate(String password) {
528
+ if (password == null || password.length() < MIN_LENGTH) {
529
+ throw new IllegalArgumentException(
530
+ "パスワードは" + MIN_LENGTH + "文字以上必要です"
531
+ );
532
+ }
533
+ }
534
+
535
+ public boolean matches(String rawPassword) {
536
+ return BCrypt.checkpw(rawPassword, hashedValue);
537
+ }
538
+ }
539
+ ```
540
+
541
+ 人の検証観点は次のとおりです。
542
+
543
+ - リファクタリングで振る舞いが変わっていないか(テストが同じまま通っているか)
544
+ - ドメインモデル設計(`docs/design/`)と整合しているか。AI が独自のモデルを作っていないか
545
+ - 抽出した値オブジェクト・クラスの名前がドメイン用語集と一致しているか
546
+ - コードベースの既存規約(パッケージ構成・命名・例外の扱い)に従っているか
547
+
548
+ ### 5. 承認ゲートでの検証
549
+
550
+ サイクル(またはステップ)が終わったら、人が承認ゲートで検証します。「コードを全行理解する」がここの規律です。
551
+
552
+ ```plantuml
553
+ @startuml
554
+ title 承認ゲートでの検証手順
555
+
556
+ start
557
+ :AI の完了報告を読む
558
+ (追加したテスト・実装・実行結果・仮定);
559
+ :差分を全行読む;
560
+ if (理解できない箇所がある?) then (yes)
561
+ :AI に説明させる;
562
+ if (説明で納得できる?) then (yes)
563
+ else (no)
564
+ :変更依頼(簡潔に書き直す);
565
+ stop
566
+ endif
567
+ endif
568
+ :テストが受入条件を表しているか確認;
569
+ :三原則が守られたか確認
570
+ (テストが先か、最小実装か、先回りがないか);
571
+ :レビュアーエージェントの指摘を確認;
572
+ if (承認できる?) then (yes)
573
+ :承認・コミット;
574
+ else (no)
575
+ :変更依頼(理由を明記);
576
+ :修正内容をガードレール候補として記録;
577
+ endif
578
+ stop
579
+ @enduml
580
+ ```
581
+
582
+ ---
583
+
584
+ ## 品質チェックリスト
585
+
586
+ ### 承認ゲート前の必須確認事項
587
+
588
+ XP 版の「コミット前の必須確認事項」は、AI-DLC 版では **AI が実行し、結果を報告** します。人は報告を確認し、必要に応じて自分でも実行します。
589
+
590
+ ```bash
591
+ # AI が実行し、結果を承認ゲートで報告する
592
+ # 1. テスト実行
593
+ ./gradlew test # または npm test
594
+
595
+ # 2. コードフォーマット
596
+ ./gradlew spotlessApply # または npm run format
597
+
598
+ # 3. 静的解析
599
+ ./gradlew check # または npm run lint
600
+
601
+ # 4. ビルド確認
602
+ ./gradlew build # または npm run build
603
+
604
+ # 5. カバレッジ確認
605
+ ./gradlew jacocoTestReport # または npm run test:coverage
606
+ ```
607
+
608
+ AI の報告には、実行したコマンド・結果・失敗があればその分析と修正案を含めさせます。「テストは通っています」という要約だけの報告は受け付けません。
609
+
610
+ ### 品質基準
611
+
612
+ XP 版の基準はそのまま使い、AI-DLC 版では **引き上げる** 方向で運用します。生成コストが下がった分、基準を緩める理由はなくなります。
613
+
614
+ | 項目 | 基準 | 必須/推奨 | AI-DLC での補足 |
615
+ | :--- | :--- | :--- | :--- |
616
+ | テストカバレッジ | 80% 以上 | 必須 | テスト戦略の水準に応じて 90% 以上も検討 |
617
+ | 循環的複雑度 | 10 以下 | 必須 | AI は分岐を増やしやすい。超えたら分割を指示 |
618
+ | メソッドの行数 | 20 行以下 | 推奨 | |
619
+ | クラスの行数 | 200 行以下 | 推奨 | AI は 1 クラスに詰め込みやすい |
620
+ | 重複コード | 0% | 必須 | AI は既存コードを探さず似た実装を生成しやすい。既存実装の参照を指示 |
621
+ | コンパイラ警告 | 0 個 | 必須 | |
622
+ | Linter 警告 | 0 個 | 必須 | |
623
+ | 未使用コード | 0 個 | 必須 | AI が先回りで書いた未使用のメソッド・フィールドは削除 |
624
+
625
+ ### AI 生成コードに固有の検証観点
626
+
627
+ | 観点 | 症状 | 対処 |
628
+ | :--- | :--- | :--- |
629
+ | 先回り実装 | テストされていない分岐・将来用のオプション引数・汎用化 | 削除。三原則をガードレールに追加 |
630
+ | 同型テスト | 実装をなぞるだけで振る舞いを検証しないテスト(実装をコピーした期待値) | 受入条件から期待値を書き直す |
631
+ | 過剰なモック | 検証対象までモックにして何も検証していない | モックは境界だけに限定する |
632
+ | 既存の無視 | 既存のユーティリティ・値オブジェクト・規約を使わず新規に作る | 既存実装を参照させる。ブラウンフィールドは静的モデルを先に渡す |
633
+ | 幻覚 API | 存在しないライブラリのメソッドや設定を使う | ビルド・型チェックで検出。依存関係の追加は確認必須 |
634
+ | 例外の握りつぶし | catch して何もしない、汎用例外で包む | エラーハンドリング方針をガードレールにする |
635
+ | 秘密情報の混入 | テストデータに本物らしい鍵・個人情報 | AI に渡す範囲を In/Out リストで制限する |
636
+
637
+ ### ソース束縛レビュー
638
+
639
+ 参照実装は、コード生成のレビューを **変更したソースファイルの一覧** に束縛します。レビュー後に未申告の変更があれば完了を拒否します。本プロジェクトでは次で代替します。
640
+
641
+ - AI に、ステップで作成・変更・削除したファイルの一覧を完了報告に含めさせる
642
+ - 人は `git diff --stat` と突き合わせ、報告に無い変更があれば理由を問う
643
+ - 承認後に AI が追加の変更をした場合は、再度ゲートを通す
644
+
645
+ ---
646
+
647
+ ## コミット規約
648
+
649
+ ### コミットメッセージフォーマット
650
+
651
+ XP 版の Conventional Commits 形式はそのまま使います。
652
+
653
+ ```text
654
+ <type>(<scope>): <subject>
655
+
656
+ <body>
657
+
658
+ <footer>
659
+ ```
660
+
661
+ ### タイプ一覧
662
+
663
+ | タイプ | 説明 | 例 |
664
+ | :--- | :--- | :--- |
665
+ | feat | 新機能追加 | `feat(auth): ユーザー認証機能を追加` |
666
+ | fix | バグ修正 | `fix(api): NullPointerException を修正` |
667
+ | docs | ドキュメント変更 | `docs(readme): インストール手順を更新` |
668
+ | style | コードスタイル変更 | `style: インデントを修正` |
669
+ | refactor | リファクタリング | `refactor(user): User クラスを値オブジェクトに分割` |
670
+ | test | テスト追加・修正 | `test(user): ユーザー登録のテストを追加` |
671
+ | chore | ビルド・ツール変更 | `chore(gradle): 依存関係を更新` |
672
+
673
+ ### コミット単位と AI-DLC の追加規約
674
+
675
+ - **1 コミット = 1 論理的変更**(XP 版と同じ)
676
+ - ステップ計画の項目単位でコミットする
677
+ - **承認ゲートを通過してからコミットする**。未承認の生成物はコミットしない
678
+ - ビルドが通る状態でコミットする
679
+ - AI が生成したコミットには、AI の関与を footer に記す(本プロジェクトでは `Co-Authored-By` 行)
680
+ - コミットメッセージの body に、対応するストーリー・ステップ番号と、ゲートで確認した仮定を書く
681
+
682
+ ```text
683
+ feat(user): User エンティティに値オブジェクトを導入
684
+
685
+ Bolt 3 ステップ 1.1〜1.3。受入条件 AC-01, AC-02 に対応。
686
+ パスワードのハッシュは既存依存の BCrypt を採用(ゲートで確認済み)。
687
+
688
+ Co-Authored-By: Claude <noreply@anthropic.com>
689
+ ```
690
+
691
+ ---
692
+
693
+ ## テストの種類と戦略
694
+
695
+ ### テストピラミッド
696
+
697
+ XP 版のテストピラミッドはそのまま使います。AI-DLC 版では、**テスト戦略の水準** によって各層の量を調整します。
698
+
699
+ ```plantuml
700
+ @startuml
701
+ skinparam defaultTextAlignment center
702
+
703
+ rectangle "E2E テスト\n(10%)" as e2e #LightCoral
704
+
705
+ rectangle "統合テスト\n(30%)" as integration #LightSalmon
706
+
707
+ rectangle "単体テスト\n(60%)" as unit #LightGreen
708
+
709
+ e2e -[hidden]down-> integration
710
+ integration -[hidden]down-> unit
711
+
712
+ note right of e2e
713
+ ユーザーシナリオ
714
+ 受入条件から AI が生成
715
+ 実行時間: 遅い
716
+ end note
717
+
718
+ note right of integration
719
+ モジュール間連携
720
+ Unit 間の契約テスト
721
+ 実行時間: 中程度
722
+ end note
723
+
724
+ note right of unit
725
+ 個別機能のテスト
726
+ Red フェーズで AI が生成
727
+ 実行時間: 高速
728
+ end note
729
+ @enduml
730
+ ```
731
+
732
+ ### テスト戦略の水準
733
+
734
+ 計画で選んだテスト戦略に従って、AI に生成させるテストの量と種類を指示します。
735
+
736
+ | 水準 | 単体 | 統合 | E2E・性能・セキュリティ | 目安 | 向いている場面 |
737
+ | :--- | :--- | :--- | :--- | :--- | :--- |
738
+ | Minimal | 受入条件ごとに 1 テスト。全コンポーネントに正常系 1 件 | 欠陥再現に必要な場合のみ | なし | 5〜15 件 | PoC、学習、小さな欠陥修正 |
739
+ | Standard | コンポーネントごとに 5〜8 件 | 主要な境界 | NFR が明示する場合のみ | 単体 75%・統合 20%・E2E 5% | 通常の機能開発 |
740
+ | Comprehensive | コンポーネントごとに 10〜15 件 | すべての境界 | すべて | 全種類 | 規制対象、監査が必要な機能 |
741
+
742
+ 本番機能のテスト戦略は Standard 未満にしません。
743
+
744
+ ### テスト作成のベストプラクティス
745
+
746
+ #### 1. AAA パターン(Arrange-Act-Assert)
747
+
748
+ ```java
749
+ @Test
750
+ void 商品の在庫が減少する() {
751
+ // Arrange(準備)
752
+ Product product = new Product("商品A", 10);
753
+ int orderQuantity = 3;
754
+
755
+ // Act(実行)
756
+ product.reduceStock(orderQuantity);
757
+
758
+ // Assert(検証)
759
+ assertThat(product.getStock()).isEqualTo(7);
760
+ }
761
+ ```
762
+
763
+ #### 2. テストの命名規則
764
+
765
+ ```java
766
+ // パターン1: 日本語での説明的な名前
767
+ @Test
768
+ void 在庫が不足している場合は注文できない() { }
769
+
770
+ // パターン2: Given-When-Then 形式
771
+ @Test
772
+ void given在庫10個_when15個注文_then在庫不足例外() { }
773
+
774
+ // パターン3: メソッド名_条件_期待結果
775
+ @Test
776
+ void reduceStock_在庫不足_IllegalStateException() { }
777
+ ```
778
+
779
+ 命名規則はプロジェクトで 1 つに決め、ガードレールとして AI に指示します。AI は指示がなければ既存テストの命名をまねますが、混在していると揺れます。
780
+
781
+ #### 3. テストデータの準備
782
+
783
+ ```java
784
+ // テストフィクスチャの使用
785
+ public class UserTestFixture {
786
+ public static User createDefaultUser() {
787
+ return new User(
788
+ "test@example.com",
789
+ "password123",
790
+ "テストユーザー"
791
+ );
792
+ }
793
+
794
+ public static User createUserWithEmail(String email) {
795
+ return new User(
796
+ email,
797
+ "password123",
798
+ "テストユーザー"
799
+ );
800
+ }
801
+ }
802
+ ```
803
+
804
+ AI にはフィクスチャの存在を伝え、テストごとにデータ生成コードを重複させないよう指示します。
805
+
806
+ #### 4. AI 生成テストのレビュー観点
807
+
808
+ | 観点 | 確認内容 |
809
+ | :--- | :--- |
810
+ | 受入条件との対応 | 各テストがどの受入条件を検証するか説明できるか |
811
+ | 期待値の出所 | 期待値が仕様(受入条件・業務ルール)から来ているか。実装の出力をコピーしていないか |
812
+ | 境界値 | 拡張(例外条件)と境界値がテストされているか |
813
+ | 独立性 | テスト間に順序依存・共有状態がないか |
814
+ | 可読性 | テストを読めば振る舞いが分かるか。AI 特有の冗長なコメントや不要なセットアップがないか |
815
+ | モックの範囲 | 境界(外部サービス・DB)だけをモックし、検証対象はモックしていないか |
816
+
817
+ ---
818
+
819
+ ## リファクタリングパターン
820
+
821
+ ### よく使うリファクタリング手法
822
+
823
+ XP 版の手法はそのまま AI に指示できます。手法名で指示すると精度が上がります。
824
+
825
+ | パターン | 適用場面 | AI への指示例 |
826
+ | :--- | :--- | :--- |
827
+ | メソッド抽出 | 長いメソッドの分割 | 「検証ロジックを `validate` メソッドに抽出して」 |
828
+ | 変数抽出 | 複雑な式の簡略化 | 「この条件式を意図が分かる名前の変数に抽出して」 |
829
+ | クラス抽出 | 責務の分離 | 「メールアドレスを値オブジェクト `Email` として抽出して」 |
830
+ | メソッド移動 | 適切なクラスへの配置 | 「この計算は `Order` の責務なので移動して」 |
831
+ | 条件記述の分解 | 複雑な条件式の整理 | 「if の条件を業務ルール名のメソッドにして」 |
832
+ | ループの分割 | 単一責任の原則適用 | 「集計と通知を別のループに分けて」 |
833
+
834
+ ### リファクタリング実施のタイミング
835
+
836
+ 1. **Rule of Three(3 回ルール)**
837
+
838
+ - 1 回目: そのまま実装
839
+ - 2 回目: 重複に気づくが我慢
840
+ - 3 回目: リファクタリング実施
841
+ - AI は重複を検出しやすいが、**既存コードを探さず** 4 回目・5 回目の重複を生むことも多い。承認ゲートで「同じことをするコードが既にないか」を確認する
842
+
843
+ 2. **コードの臭い(Code Smells)を検知したとき**
844
+
845
+ - 長すぎるメソッド(20 行以上)
846
+ - 大きすぎるクラス(200 行以上)
847
+ - 長すぎるパラメータリスト(4 個以上)
848
+ - データの群れ(同じ引数の組み合わせ)
849
+ - スイッチ文の重複
850
+ - AI に静的解析の結果を渡し、臭いの一覧と対処案を出させる。適用するかは人が決める
851
+
852
+ ### 設計判断は人が持つ
853
+
854
+ リファクタリングのうち **設計判断を伴うもの**(集約の境界、値オブジェクトの抽出、アーキテクチャパターンの適用、ライブラリの採用)は、AI が提案し人が承認します。AI の提案には選択肢とトレードオフを含めさせ、判断の結果は ADR に記録します。
855
+
856
+ ---
857
+
858
+ ## 継続的な改善
859
+
860
+ ### Bolt ふりかえりでの確認項目
861
+
862
+ XP 版のイテレーションふりかえりを Bolt ふりかえりに置き換え、AI-DLC の指標を加えます。
863
+
864
+ ```markdown
865
+ ## Bolt ふりかえりテンプレート
866
+
867
+ ### Keep(継続すること)
868
+ - [ ] TDD サイクルを AI に守らせた
869
+ - [ ] 承認ゲートでコードを全行理解した
870
+ - [ ] 品質基準を維持した
871
+
872
+ ### Problem(問題点)
873
+ - [ ] 変更依頼が多かったステップとその原因
874
+ - [ ] AI が三原則を破った場面
875
+ - [ ] 人の検証時間がボトルネックになった箇所
876
+ - [ ] 技術的負債の発生箇所
877
+
878
+ ### Try(次に試すこと)
879
+ - [ ] ガードレールへの追加(CLAUDE.md・PROJECT.md・スキル)
880
+ - [ ] ゲート密度の調整
881
+ - [ ] プロンプト骨格の改善
882
+
883
+ ### 数値指標
884
+ - テストカバレッジ: ___%
885
+ - ビルド成功率: ___%
886
+ - 承認ゲート通過数: ___ / 変更依頼数: ___(手戻り率 ___)
887
+ - リードタイム(ステップ計画承認 → Deployment Unit 検証): ___ 時間
888
+ - 欠陥流出数: ___ 件
889
+ - ガードレールに追加した項目: ___ 件
890
+ ```
891
+
892
+ ### 修正をガードレールにする
893
+
894
+ 人が AI の振る舞いを修正したら、同じ修正を次の Bolt で繰り返さないよう、修正内容をガードレールとして残します。参照実装の「自己学習ガードレール」に相当します。
895
+
896
+ | 修正の種類 | 反映先 |
897
+ | :--- | :--- |
898
+ | 全プロジェクト共通の規律(三原則、命名、例外の扱い) | `CLAUDE.md` または `ai-agent-guidelines` スキル |
899
+ | このプロジェクト固有の規約(パッケージ構成、既存ユーティリティ、テストフィクスチャ) | 各スキルの `PROJECT.md` |
900
+ | 特定のストーリー・Unit に関する判断 | Bolt 計画の「AI の仮定」欄と `docs/journal/` |
901
+ | 技術的意思決定 | ADR |
902
+
903
+ ### 技術的負債の管理
904
+
905
+ AI-DLC の論文は、AI が生成したコードが硬直化して将来の変更を妨げる状態を **quick-cement(即席セメント)** と呼び、人の検証をそれを防ぐ損失関数と位置づけています。生成が速いほど負債も速く積み上がるため、XP 版の対処フローに「AI 由来の負債」の識別を加えます。
906
+
907
+ ```plantuml
908
+ @startuml
909
+ title 技術的負債の対処フロー(AI-DLC 版)
910
+
911
+ start
912
+
913
+ :技術的負債の識別;
914
+ note right
915
+ - 承認ゲートで発見
916
+ - 静的解析ツールの警告
917
+ - レビュアーエージェントの指摘
918
+ - パフォーマンス問題
919
+ end note
920
+
921
+ if (AI 由来の負債?) then (yes)
922
+ :原因をガードレールに反映;
923
+ note right
924
+ 先回り実装、既存の無視、
925
+ 仮の実装の放置 など
926
+ end note
927
+ endif
928
+
929
+ if (緊急度は?) then (高)
930
+ :即座に対処;
931
+ #red:ホットフィックス;
932
+ elseif (影響範囲は?) then (大)
933
+ :次の Bolt で対処;
934
+ #yellow:計画的リファクタリング;
935
+ else (小)
936
+ :バックログに追加;
937
+ #lightgreen:継続的改善;
938
+ endif
939
+
940
+ :対処結果の記録;
941
+ note right
942
+ - 対処内容
943
+ - 所要時間
944
+ - 学習事項(ジャーナルへ)
945
+ end note
946
+
947
+ stop
948
+ @enduml
949
+ ```
950
+
951
+ ---
952
+
953
+ ## 本プロジェクトの開発スキルへの適用
954
+
955
+ 本プロジェクトの開発スキルは XP 版のガイドを前提にしています。AI-DLC 版で運用する場合の読み替えは次のとおりです。
956
+
957
+ | スキル | XP 版の運用 | AI-DLC 版の読み替え |
958
+ | :--- | :--- | :--- |
959
+ | `orchestrating-development` | TDD ワークフローの案内 | Bolt 開発フロー(ステップ計画 → サイクル → 承認ゲート → Bolt 完了)として案内。ゲート密度の選択を最初に行う |
960
+ | `developing-backend` | インサイドアウトの TDD | AI がステップ計画を書き、層ごとに承認ゲートを置く。三原則をプロンプトに明示 |
961
+ | `developing-frontend` | アウトサイドインの TDD | 受入テストの承認を契約の確定とし、モックを実装に置き換える境界をゲートにする |
962
+ | `developing-review` | マルチパースペクティブレビュー | 承認ゲートの材料として実行。AI 生成コード固有の観点(先回り・同型テスト・過剰モック・既存の無視)を加える。参照実装の architecture-reviewer に相当 |
963
+ | `git-commit` | Conventional Commits | 承認ゲート通過後にのみ実行。body にストーリー・ステップ・確認した仮定を記す |
964
+ | `operating-qt` | SonarQube による品質管理 | 品質基準を引き上げる根拠として使う。臭いの一覧を AI に渡して対処案を出させる |
965
+ | `creating-adr` | 技術的意思決定の記録 | リファクタリングの設計判断・ライブラリ採用を記録 |
966
+ | `closing-iteration` | ふりかえりと報告 | Bolt ふりかえり(本章)と、修正のガードレール反映 |
967
+ | `ai-agent-guidelines` | 実行ガイドライン | TDD の三原則・全行理解・仮の実装の明示をガードレールとして追記 |
968
+
969
+ ---
970
+
971
+ ## まとめ
972
+
973
+ コーディングとテストは、よいソフトウェアを作るための最も基本的で重要な活動です。AI-DLC ではコードを書くのが AI になりますが、TDD を中心とした規律の目的は変わりません。
974
+
975
+ 1. **品質の作り込み** - AI にテストを先に書かせ、失敗を確認させてから実装させる
976
+ 2. **設計の改善** - リファクタリングは AI に、設計判断は人に
977
+ 3. **変更容易性** - テストによる安全網。AI が生成したコードほど安全網が要る
978
+ 4. **ドキュメント性** - テストが受入条件と結びついた仕様書として機能する
979
+ 5. **人の理解** - コードを全行理解し、理解できないものはマージしない
980
+
981
+ これらの実践により、AI の速度を活かしながら「変更を楽に安全にできて役に立つソフトウェア」の実現を目指します。