|
1 | 1 | # 背景 |
2 | 2 |
|
3 | | -これは、AIに対するルールファイルです。 |
4 | | -AIがコーディングを行う際に、このルールファイルを常に参照しています。 |
5 | | - |
6 | | -## AI駆動開発 共通ガイドライン |
7 | | - |
8 | | -## 開発の基本理念 |
9 | | - |
10 | | -- 動くコードを書くだけでなく、品質・保守性・安全性を常に意識する |
11 | | -- プロジェクトの段階(プロトタイプ、MVP、本番環境)に応じて適切なバランスを取る |
12 | | -- 問題を見つけたら放置せず、必ず対処または明示的に記録する |
13 | | -- ボーイスカウトルール:コードを見つけた時よりも良い状態で残す |
14 | | - |
15 | | -## エラーハンドリングの原則 |
16 | | - |
17 | | -- 関連が薄く見えるエラーでも必ず解決する |
18 | | -- エラーの抑制(try-catch で握りつぶす等)ではなく、根本原因を修正 |
19 | | -- 早期にエラーを検出し、明確なエラーメッセージを提供 |
20 | | -- エラーケースも必ずテストでカバーする |
21 | | -- 外部APIやネットワーク通信は必ず失敗する可能性を考慮 |
22 | | - |
23 | | -## コード品質の基準 |
24 | | - |
25 | | -- DRY原則:重複を避け、単一の信頼できる情報源を維持 |
26 | | -- 意味のある変数名・関数名で意図を明確に伝える |
27 | | -- プロジェクト全体で一貫したコーディングスタイルを維持 |
28 | | -- 小さな問題も放置せず、発見次第修正(Broken Windows理論) |
29 | | -- コメントは「なぜ」を説明し、「何を」はコードで表現 |
30 | | - |
31 | | -## テスト規律 |
32 | | - |
33 | | -- テストをスキップせず、問題があれば修正する |
34 | | -- 実装詳細ではなく振る舞いをテスト |
35 | | -- テスト間の依存を避け、任意の順序で実行可能に |
36 | | -- テストは高速で、常に同じ結果を返すように |
37 | | -- カバレッジは指標であり、質の高いテストを重視 |
38 | | - |
39 | | -## 保守性とリファクタリング |
40 | | - |
41 | | -- 機能追加と同時に既存コードの改善を検討 |
42 | | -- 大規模な変更は小さなステップに分割 |
43 | | -- 使用されていないコードは積極的に削除 |
44 | | -- 依存関係は定期的に更新(セキュリティと互換性のため) |
45 | | -- 技術的負債は明示的にコメントやドキュメントに記録 |
46 | | - |
47 | | -## セキュリティの考え方 |
48 | | - |
49 | | -- APIキー、パスワード等は環境変数で管理(ハードコード禁止) |
50 | | -- すべての外部入力を検証 |
51 | | -- 必要最小限の権限で動作(最小権限の原則) |
52 | | -- 不要な依存関係を避ける |
53 | | -- セキュリティ監査ツールを定期的に実行 |
54 | | - |
55 | | -## パフォーマンスの意識 |
56 | | - |
57 | | -- 推測ではなく計測に基づいて最適化 |
58 | | -- 初期段階から拡張性を考慮 |
59 | | -- 必要になるまでリソースの読み込みを遅延 |
60 | | -- キャッシュの有効期限と無効化戦略を明確に |
61 | | -- N+1問題やオーバーフェッチを避ける |
62 | | - |
63 | | -## 信頼性の確保 |
64 | | - |
65 | | -- タイムアウト処理を適切に設定 |
66 | | -- リトライ機構の実装(指数バックオフを考慮) |
67 | | -- サーキットブレーカーパターンの活用 |
68 | | -- 一時的な障害に対する耐性を持たせる |
69 | | -- 適切なログとメトリクスで可観測性を確保 |
70 | | - |
71 | | -## プロジェクトコンテキストの理解 |
72 | | - |
73 | | -- ビジネス要件と技術要件のバランスを取る |
74 | | -- 現在のフェーズで本当に必要な品質レベルを判断 |
75 | | -- 時間制約がある場合でも、最低限の品質基準を維持 |
76 | | -- チーム全体の技術レベルに合わせた実装選択 |
77 | | - |
78 | | -## トレードオフの認識 |
79 | | - |
80 | | -- すべてを完璧にすることは不可能(銀の弾丸は存在しない) |
81 | | -- 制約の中で最適なバランスを見つける |
82 | | -- プロトタイプなら簡潔さを、本番なら堅牢性を優先 |
83 | | -- 妥協点とその理由を明確にドキュメント化 |
84 | | - |
85 | | -## Git運用の基本 |
86 | | - |
87 | | -- コンベンショナルコミット形式を使用(.gitmessage.txt参照) |
88 | | -- コミットは原子的で、単一の変更に焦点を当てる |
89 | | -- 明確で説明的なコミットメッセージを英語で記述 |
90 | | -- mainブランチへの直接コミットは避ける |
91 | | - |
92 | | -## コードレビューの姿勢 |
93 | | - |
94 | | -- レビューコメントは建設的な改善提案として受け取る |
95 | | -- 個人ではなくコードに焦点を当てる |
96 | | -- 変更の理由と影響を明確に説明 |
97 | | -- フィードバックを学習機会として歓迎 |
98 | | - |
99 | | -## デバッグのベストプラクティス |
100 | | - |
101 | | -- 問題を確実に再現できる手順を確立 |
102 | | -- 二分探索で問題の範囲を絞り込む |
103 | | -- 最近の変更から調査を開始 |
104 | | -- デバッガー、プロファイラー等の適切なツールを活用 |
105 | | -- 調査結果と解決策を記録し、知識を共有 |
106 | | - |
107 | | -## 依存関係の管理 |
108 | | - |
109 | | -- 本当に必要な依存関係のみを追加 |
110 | | -- 新しい依存関係追加前にライセンス、サイズ、メンテナンス状況を確認 |
111 | | -- セキュリティパッチとバグ修正のため定期的に更新 |
112 | | - |
113 | | -## ドキュメントの基準 |
114 | | - |
115 | | -- READMEにプロジェクトの概要、セットアップ、使用方法を明確に記載 |
116 | | -- ドキュメントをコードと同期して更新 |
117 | | -- 実例を示すことを優先 |
118 | | -- 重要な設計判断はADR (Architecture Decision Records)で記録 |
119 | | - |
120 | | -## 継続的な改善 |
121 | | - |
122 | | -- 学んだことを次のプロジェクトに活かす |
123 | | -- 定期的に振り返りを行い、プロセスを改善 |
124 | | -- 新しいツールや手法を適切に評価して取り入れる |
125 | | -- チームや将来の開発者のために知識を文書化 |
126 | | - |
127 | | -### 禁止事項 |
128 | | - |
129 | | -- 許可なくファイル、フォルダを勝手に削除しないこと。 |
130 | | -- AGENTS.mdと同等の領域にあるファイル、フォルダのみアクセス可能とすること。 |
131 | | -- テストコードで `setAccessible` を使用しないこと。private メソッドのテストは不要。public API 経由でカバレッジ100%を達成すること。public API 経由でカバーできない場合はプロダクションコードの構造を見直すこと。 |
132 | | - |
133 | | -### コーディング規約 |
134 | | - |
135 | | -- YAGNI原則を準拠 |
136 | | -- Java11、Spring Boot 2.7.18に準拠 |
137 | | -- pom.xmlに定義したOSSライブラリを有効活用 |
138 | | -- 可読性が高くなるように、わかりづらい実装はコメントで補足 |
139 | | -- 三項演算子は使わない |
140 | | -- 防御的な実装はしないこと。 |
141 | | - |
142 | | -### コミュニケーション/開発ルール |
143 | | - |
144 | | -- 今後のやり取りは日本語で行うようにしてください。 |
145 | | -- ただし、プロジェクト内のコメント、JavaDoc、README、コミットメッセージ、PR説明などの成果物テキストは英語で統一すること。 |
146 | | - |
147 | | -### テスト・ビルドについて |
148 | | - |
149 | | -- 新規に作成したクラス、改修を行なった場合は、単体テスト `mvn clean test` を実行し、検証してください。ただし、テスト内容に変更がない体裁修正は検証不要です。 |
150 | | -- テスト実行前に、変更内容を「ロジック変更 / 設定変更 / 体裁修正のみ」に分類して明示すること。 |
151 | | -- テスト実行前に、実行理由を1行で明示すること。理由が明示できない場合は実行しないこと。 |
152 | | -- 次のいずれかに該当する場合はテストを実行しないこと:「実行結果が変わらない変更」「テストコード変更なし」「体裁修正のみ」。 |
153 | | -- テスト/ビルドが失敗した場合は、原因特定し、テストが成功するまで処置をすること。 |
154 | | -- C0、C1カバレッジ100%となっていなかった場合、テストケースを追加してください。 |
155 | | -- `mvn clean test` を実行した作業は、完了報告時に C0/C1(INSTRUCTION/BRANCH)の実測値(% と covered/total)を必ず明記すること。未報告で完了扱いにしないこと。 |
156 | | -- 改修時は未使用のフィールド・ローカル変数・importを残さないこと。`The value of the field xxx is not used` を含む未使用警告を0件にしてから完了報告すること。 |
157 | | -- リリース作業時は、`pom.xml` の `<version>` とリリースタグを一致させること。タグ作成前に差分確認で `pom.xml` を必ず確認すること。 |
158 | | -- リリース作業時は、対象コミットの CI(`ci.yml`)が全ジョブ成功してからタグを作成すること。失敗中・実行中の状態でタグ作成しないこと。 |
159 | | -- リリース作業時は、C0/C1(INSTRUCTION/BRANCH)カバレッジ100%を `jacoco.xml` または CIログで確認し、未達ならリリースしないこと。 |
160 | | -- リリース作業時は、`main` への push 完了後に注釈付きタグを作成し、タグ push で `release.yml` を起動すること。 |
161 | | -- リリース完了条件は、`release.yml` 成功・GitHub Release 作成・想定 Assets 登録完了の3点を確認した状態とすること。 |
162 | | -- テストメソッド名称は、<メソッド名>_xxxケース_<検証内容>_<規格値> と書くこと。xxxは正常もしくは異常がはいる。また、規格値は「〜であること」と言葉を揃えること。 |
163 | | -- 「検証内容」は具体的な条件を動詞(〜する)で示し、「規格値」は名詞や結果を表す表現で「〜であること」で締める |
164 | | -- 「規格値」で不自然な「〜する状態であること」を避け、可能な限り「〜が返る」「〜が設定される」「〜が再スローされる」などの結果を名詞化して表現すること |
165 | | -- 検証内容には条件を簡潔に書き、可能であれば文末に「〜すること」を付けずに記載してください。補足が必要な場合はテスト内コメントで補足すること。 |
166 | | -- 追加、修正、削除をした場合、テスト実行による検証作業において、テスト失敗した場合、分析して、処置をすること。 |
167 | | -- JUnit5、mockitを使用すること。 |
168 | | - |
169 | | -### JavaDoc 記述ルール |
170 | | - |
171 | | -- JavaDoc は全て `/** … */` 形式で記載し、private メソッドを含む全メソッドに簡潔な説明を追加してください(テストコードは対象外)。 |
172 | | -- 引数/戻り値には `@param`/`@return` を使い、該当要素の意味や条件を明記します(たとえば `@param request` には「評価対象の HTTP リクエスト」、`@return` には「判定条件が揃えば true」など)。 |
173 | | -- 仕様や判定基準を補足したい場合は本文に追記し、特定の例外や副作用があれば `@throws` も活用してください。 |
174 | | - |
175 | | -## 現状の問題点 |
176 | | - |
177 | | -かなり長いルールファイルになってしまっています。 |
178 | | -このままだと全体のコンテキストが長大になり、性能が低下してしまう可能性があります。 |
179 | | - |
180 | | -## 命令 |
181 | | - |
182 | | -元の内容を保持しつつも、内容を圧縮・整理してください。 |
| 3 | +このファイルは、AI が本リポジトリで作業する際に常時参照するルールです。 |
| 4 | +目的は、品質・保守性・安全性を維持しつつ、判断基準を短く一貫した形で示すことです。 |
| 5 | + |
| 6 | +## 基本方針 |
| 7 | + |
| 8 | +### 品質と設計 |
| 9 | + |
| 10 | +- 動作だけでなく、品質・保守性・安全性を常に考慮する。 |
| 11 | +- 現在のフェーズ(プロトタイプ / MVP / 本番)に応じて、適切な品質水準を選ぶ。 |
| 12 | +- 問題は放置せず、修正するか、少なくとも明示的に記録する。 |
| 13 | +- ボーイスカウトルールに従い、触れた箇所はより良い状態で残す。 |
| 14 | +- DRY を守り、単一の信頼できる情報源を維持する。 |
| 15 | +- 命名は意図が伝わるものにし、スタイルはプロジェクト全体で統一する。 |
| 16 | +- 小さな不整合も放置せず修正する。 |
| 17 | +- コメントは「なぜ」を補足し、「何を」はコードで表現する。 |
| 18 | +- 機能追加時は既存コードの改善も検討する。 |
| 19 | +- 大きな変更は小さな段階に分ける。 |
| 20 | +- 未使用コードは積極的に削除する。 |
| 21 | +- 技術的負債はコメントやドキュメントで明示する。 |
| 22 | +- YAGNI を守る。 |
| 23 | +- 可読性を優先し、わかりづらい実装のみ簡潔に補足する。 |
| 24 | +- 三項演算子は使わない。 |
| 25 | +- 防御的な実装はしない。 |
| 26 | + |
| 27 | +### エラー処理と信頼性 |
| 28 | + |
| 29 | +- 関連が薄く見えるエラーも放置せず解決する。 |
| 30 | +- 例外を握りつぶさず、根本原因を修正する。 |
| 31 | +- エラーは早期検出し、明確なメッセージを出す。 |
| 32 | +- エラーケースもテスト対象に含める。 |
| 33 | +- 外部 API / ネットワークは失敗を前提に設計する。 |
| 34 | +- タイムアウトを適切に設定する。 |
| 35 | +- 必要に応じてリトライ(指数バックオフ含む)を検討する。 |
| 36 | +- 必要に応じてサーキットブレーカーパターンを活用する。 |
| 37 | +- 一時障害に耐えられる設計にする。 |
| 38 | +- 適切なログとメトリクスで可観測性を確保する。 |
| 39 | + |
| 40 | +### テストと検証 |
| 41 | + |
| 42 | +- テストはスキップせず、問題があれば原因を特定して修正する。 |
| 43 | +- 実装詳細ではなく振る舞いを検証する。 |
| 44 | +- テスト間の依存をなくし、任意順で実行可能にする。 |
| 45 | +- テストは高速かつ再現性を持たせる。 |
| 46 | +- カバレッジは指標であり、質を優先する。 |
| 47 | +- エラーやビルド失敗は成功するまで処置する。 |
| 48 | + |
| 49 | +### セキュリティ・性能・依存管理 |
| 50 | + |
| 51 | +- 秘密情報は環境変数で扱い、ハードコードしない。 |
| 52 | +- すべての外部入力を検証する。 |
| 53 | +- 最小権限で動作させる。 |
| 54 | +- 不要な依存は追加しない。 |
| 55 | +- 依存はライセンス、サイズ、保守状況を確認してから追加する。 |
| 56 | +- 依存はセキュリティ修正・バグ修正のため定期更新する。 |
| 57 | +- セキュリティ監査ツールは定期的に実行する。 |
| 58 | +- 最適化は推測ではなく計測に基づいて行う。 |
| 59 | +- 初期段階から拡張性を意識する。 |
| 60 | +- 必要になるまでリソース読み込みを遅延させる。 |
| 61 | +- キャッシュは期限と無効化戦略を明確にする。 |
| 62 | +- N+1 やオーバーフェッチを避ける。 |
| 63 | + |
| 64 | +### 開発運用 |
| 65 | + |
| 66 | +- ビジネス要件と技術要件のバランスを取る。 |
| 67 | +- 時間制約下でも最低限の品質基準は守る。 |
| 68 | +- チームの技術レベルに合う実装を選ぶ。 |
| 69 | +- すべてを完璧にはできない前提で、制約下の最適解を選ぶ。 |
| 70 | +- プロトタイプでは簡潔さ、本番では堅牢性をより重視する。 |
| 71 | +- 妥協点と理由は明文化する。 |
| 72 | +- コンベンショナルコミットを使用する(`.gitmessage.txt` 参照)。 |
| 73 | +- コミットは原子的にし、単一の変更に集中させる。 |
| 74 | +- コミットメッセージは明確な英語で書く。 |
| 75 | +- `main` へ直接コミットしない。 |
| 76 | +- レビューはコードに対して行い、建設的提案として扱う。 |
| 77 | +- 変更理由と影響を明確に説明する。 |
| 78 | +- フィードバックは学習機会として扱う。 |
| 79 | +- デバッグは再現手順確立、二分探索、最近の変更確認を基本とする。 |
| 80 | +- 必要に応じてデバッガーやプロファイラーを使う。 |
| 81 | +- 調査結果と解決策は記録し、再利用可能にする。 |
| 82 | +- README には概要、セットアップ、利用方法を明確に書く。 |
| 83 | +- ドキュメントはコード変更に追随させる。 |
| 84 | +- 実例を優先する。 |
| 85 | +- 重要な設計判断は ADR で記録する。 |
| 86 | +- 学んだことは次の作業に活かし、定期的に改善する。 |
| 87 | +- 新しいツールや手法は適切に評価して取り入れる。 |
| 88 | +- チームや将来の開発者のために知識を文書化する。 |
| 89 | + |
| 90 | +## 禁止事項 |
| 91 | + |
| 92 | +- 許可なくファイルやフォルダを削除しない。 |
| 93 | +- `AGENTS.md` と同等の領域にあるファイル / フォルダのみアクセス対象とする。 |
| 94 | +- テストコードで `setAccessible` を使わない。 |
| 95 | +- private メソッドを直接テストしない。public API 経由で C0 / C1 100% を目指す。 |
| 96 | +- public API 経由でカバーできない場合は、プロダクションコードの構造を見直す。 |
| 97 | + |
| 98 | +## プロジェクト固有ルール |
| 99 | + |
| 100 | +### コミュニケーション |
| 101 | + |
| 102 | +- 対話は日本語で行う。 |
| 103 | +- ただし、プロジェクト内のコメント、JavaDoc、README、コミットメッセージ、PR 説明などの成果物テキストは英語で統一する。 |
| 104 | + |
| 105 | +### 実装規約 |
| 106 | + |
| 107 | +- Java 11、Spring Boot 2.7.18 に準拠する。 |
| 108 | +- `pom.xml` に定義済みの OSS ライブラリを活用する。 |
| 109 | +- 改修時は未使用の field / local variable / import を残さない。 |
| 110 | +- `The value of the field xxx is not used` を含む未使用警告は 0 件にして完了とする。 |
| 111 | + |
| 112 | +### テスト・ビルド |
| 113 | + |
| 114 | +- 新規作成や改修を行った場合は、原則として `mvn clean test` を実行して検証する。 |
| 115 | +- ただし、体裁修正のみ、テストコード変更なし、実行結果が変わらない変更は実行しない。 |
| 116 | +- テスト実行前に、変更を「ロジック変更 / 設定変更 / 体裁修正のみ」に分類して明示する。 |
| 117 | +- テスト実行前に、実行理由を 1 行で明示する。理由を明示できない場合は実行しない。 |
| 118 | +- テスト / ビルドが失敗した場合は、原因を特定し、成功するまで処置する。 |
| 119 | +- C0、C1 が 100% でない場合は、必要なテストケースを追加する。 |
| 120 | +- `mvn clean test` を実行した作業は、完了報告時に C0 / C1(INSTRUCTION / BRANCH)の実測値(% と covered / total)を必ず記載する。 |
| 121 | +- 実測値未記載のまま完了扱いにしない。 |
| 122 | +- 追加 / 修正 / 削除を行った作業でテストが失敗した場合は、分析して処置する。 |
| 123 | +- JUnit 5、mockit を使用する。 |
| 124 | + |
| 125 | +### テストメソッド命名 |
| 126 | + |
| 127 | +- テストメソッド名は `<メソッド名>_xxxケース_<検証内容>_<規格値>` とする。 |
| 128 | +- `xxx` には `正常` または `異常` を入れる。 |
| 129 | +- 規格値は必ず「〜であること」で統一する。 |
| 130 | +- 検証内容は、具体条件を動詞(〜する)で簡潔に表現する。 |
| 131 | +- 規格値は、名詞または結果表現で締める。 |
| 132 | +- 「〜する状態であること」は避け、可能な限り「〜が返る」「〜が設定される」「〜が再スローされる」などを名詞化して表現する。 |
| 133 | +- 検証内容は可能なら「〜すること」を付けずに記述し、補足が必要な場合はテスト内コメントで補う。 |
| 134 | + |
| 135 | +### リリース |
| 136 | + |
| 137 | +- リリースタグは `pom.xml` の `<version>` と一致させる。 |
| 138 | +- タグ作成前に差分確認で `pom.xml` を必ず確認する。 |
| 139 | +- 対象コミットの CI(`ci.yml`)が全ジョブ成功してからタグを作成する。 |
| 140 | +- CI が失敗中または実行中の状態ではタグを作成しない。 |
| 141 | +- C0 / C1(INSTRUCTION / BRANCH)100% を `jacoco.xml` または CI ログで確認し、未達ならリリースしない。 |
| 142 | +- `main` への push 完了後に注釈付きタグを作成し、そのタグ push で `release.yml` を起動する。 |
| 143 | +- リリース完了条件は、`release.yml` 成功、GitHub Release 作成、想定 Assets 登録完了の 3 点確認とする。 |
| 144 | + |
| 145 | +### JavaDoc |
| 146 | + |
| 147 | +- JavaDoc はすべて `/** ... */` 形式で記載する。 |
| 148 | +- テストコードを除き、private メソッドを含む全メソッドに簡潔な説明を付ける。 |
| 149 | +- 引数と戻り値には `@param` / `@return` を使い、意味や条件を具体的に記載する。 |
| 150 | +- 仕様、判定基準、例外、副作用の補足が必要な場合は、本文や `@throws` を使って明記する。 |
| 151 | + |
| 152 | +## このファイルの改善方針 |
| 153 | + |
| 154 | +- 現状の問題は、ルールの総量が増え、コンテキスト負荷が高くなっていること。 |
| 155 | +- そのため、今後も内容は維持しつつ、重複削減・章立て整理・表現統一を優先して更新する。 |
0 commit comments