Agent-First Development

レビューと品質管理

はじめに

エージェントが生成するコードの量が増えるほど、レビューの方法も変わる必要がある。すべてを手動でレビューするのは非現実的だし、すべてを自動化に任せるのはリスクがある。

本モジュールでは、「人間はどこに集中すべきか」「何を自動化すべきか」を明確にし、効率的かつ安全な品質管理の方法を学ぶ。

Golden Principles: 意見のある機械的ルール

Golden Principles とは

チームで合意した「絶対に守るべきルール」を、機械的に検証可能な形で定義したもの。人間の好みや慣習ではなく、品質に直結するルールに絞る。

例: raica バックエンドの Golden Principles

# docs/conventions/golden-principles.md

## 1. Domain Purity
domain/ パッケージは外部ライブラリに依存しない。
検証: tests/architecture/domain_deps_test.go

## 2. Boundary Validation
外部入力は API 層で検証し、domain 型に変換する。
domain 層に生の string/int を渡さない。
検証: 型システム + custom linter

## 3. Error Context
エラーは必ず wrap し、何をしようとしたかのコンテキストを含める。
検証: custom linter (errwrap-check)

## 4. Auth on Patient Data
患者データにアクセスする API は必ず auth middleware を通す。
検証: tests/architecture/auth_coverage_test.go

## 5. Timeout on External Calls
外部 API 呼び出しと DB クエリには必ず timeout 付き context を使う。
検証: custom linter (timeout-check)

なぜ Golden Principles が重要か

  1. レビューの判断基準が明確になる: 「これは Golden Principle に違反しているか?」
  2. エージェントの自動修正が可能: 機械的に検出 → エラーメッセージに修正方法
  3. チーム内の議論が減る: 合意済みのルールとして参照できる
  4. スケールする: チームやコードベースが大きくなっても一貫性を保てる

品質スコアリング

ドメインごとの品質基準

すべてのコードに同じ品質基準を適用するのは非効率。ドメインのリスクレベルに応じて基準を変える。

高リスク(厳格な品質管理):
  - 患者データの処理
  - 認証・認可ロジック
  - 請求計算
  - データマイグレーション

中リスク(標準的な品質管理):
  - API ハンドラ
  - ビジネスロジック
  - データアクセス層

低リスク(軽い品質管理):
  - 内部ツール
  - 開発用スクリプト
  - ドキュメント生成

品質チェックリスト

## 高リスクドメインのレビューチェックリスト

### 自動チェック(CI で実行)
- [ ] 全テストが通る
- [ ] lint エラーがない
- [ ] 構造テストが通る
- [ ] セキュリティスキャンが通る
- [ ] テストカバレッジ 80% 以上

### 人間のレビュー(必須)
- [ ] ビジネスロジックが仕様と一致しているか
- [ ] エッジケースが考慮されているか
- [ ] 患者データのアクセス制御が適切か
- [ ] パフォーマンスに問題がないか
- [ ] 既存機能への影響を確認したか

Continuous Garbage Collection

Tech Debt の蓄積を防ぐ

エージェントが生成するコードは、個々には正しくても、時間が経つと一貫性が失われていく。定期的なクリーンアップが必要。

Cleanup Agent の活用

定期的にエージェントにクリーンアップを依頼する:

# 週次のクリーンアップタスク

# 1. 未使用の import / 変数の削除
claude "src/ 内の未使用の import と変数を削除してください"

# 2. エラーメッセージの改善
claude "src/api/handlers/ 内のエラーメッセージを確認し、
修正方法のヒントが含まれていないものを改善してください"

# 3. ドキュメントの整合性チェック
claude "CLAUDE.md と docs/ の内容が実際のコードと一致しているか確認し、
不一致があれば修正してください"

Golden Principles に基づく定期チェック

# 月次の Golden Principles 監査
claude "docs/conventions/golden-principles.md に記載されたルールが
すべて機械的に検証されているか確認してください。
検証がないルールがあれば、テストまたは linter ルールを追加してください。"

パターンの統一

# 類似コードのパターン統一
claude "src/api/handlers/ 内のエラーレスポンスの書き方を確認してください。
pkg/response.Error() を使わずに直接書いているものがあれば、
統一してください。"

エージェント生成コードのレビュー方法

人間のレビューが価値を発揮する場面

1. Correctness(正しさ)

エージェントの出力: コンパイルが通り、テストも通る
人間の判断: 「だが、このビジネスロジックは仕様と異なる」

例:
- 保険の自己負担率の計算ロジックが制度と合っていない
- ページネーションの cursor が重複レコードを返す可能性がある
- 並行処理で race condition が発生する設計になっている

2. Architecture(設計)

エージェントの出力: 動くコードが生成された
人間の判断: 「だが、この設計では将来の変更が困難になる」

例:
- 今は 1 種類だが将来複数になる概念がハードコードされている
- パフォーマンスがスケールしない設計
- 他のモジュールとの整合性が取れていない

3. Security(セキュリティ)

エージェントの出力: 機能が正しく動作する
人間の判断: 「だが、セキュリティ上の懸念がある」

例:
- SQL インジェクションの可能性
- 認可チェックの漏れ
- 個人情報のログ出力

レビューで指摘しないこと

"The code doesn't match human stylistic preferences, and that's okay."

以下は Golden Principles に含まれない限り、レビューで指摘すべきではない:

  • 変数名の好み(明確であれば OK)
  • コードの書き順(ロジックが正しければ OK)
  • コメントの量(過不足がなければ OK)
  • 空行の入れ方

これらをチームとして統一したいなら、linter ルールとして機械化する。人間のレビューで繰り返し指摘するのは、レビュアーとレビュイーの両方の時間の無駄だ。

Agent-to-Agent Review

コンセプト

エージェントが生成したコードを、別のエージェントにレビューさせる。

# Agent A が実装
claude "患者検索 API を実装して"

# Agent B がレビュー
claude "src/api/handlers/patient_search.go を以下の観点でレビューして:
1. Golden Principles (docs/conventions/golden-principles.md) への準拠
2. 既存パターンとの一貫性 (src/api/handlers/medication.go と比較)
3. エッジケースの考慮
4. エラーメッセージの品質"

活用場面

  • 低リスクドメイン: Agent-to-Agent Review + CI で十分な場合がある
  • 中リスクドメイン: Agent-to-Agent Review → 人間が最終確認
  • 高リスクドメイン: Agent-to-Agent Review + 人間の詳細レビュー

注意点

  • Agent-to-Agent Review は補助的なもの。高リスクな変更では人間のレビューを省略しない
  • レビュー観点を明確に指定する。漫然と「レビューして」だけでは有効ではない
  • エージェントのレビューは「パターン準拠の確認」に最も価値がある

味(Taste)をツールに組み込む

「味」とは

チームが大切にする品質基準のうち、明文化しにくいもの。例えば:

  • 「このレベルの抽象化は早すぎる」
  • 「ここは将来の拡張を見越して interface にすべき」
  • 「このエラーメッセージは運用時に役立たない」

味をツールに変換する

「味」を感じるたびに、それをルールとして定式化できないか考える:

味: 「エラーメッセージが雑だ」
  ↓ 定式化
ルール: 「エラーメッセージには (1) 何をしようとしたか、(2) 何が失敗したか、
        (3) 可能なら修正のヒント を含めること」
  ↓ 機械化
Linter: エラーメッセージの最小文字数チェック + コンテキスト変数の有無チェック

味: 「抽象化が早すぎる」
  ↓ 定式化
ルール: 「interface は 2 つ以上の実装が存在するか、テストでモックが必要な場合のみ定義する」
  ↓ 文書化
docs/conventions/when-to-use-interfaces.md に記載

すべてを機械化する必要はない

機械化のコストが高い「味」は、ドキュメントに記載する。重要なのは「暗黙の了解」のまま放置しないこと。

# docs/conventions/code-taste.md

## エラーハンドリング
- エラーメッセージは「原因特定 → 修正」のサイクルを支援する
- "invalid input" だけでは不十分。何が、なぜ invalid かを含める

## 抽象化のタイミング
- "Rule of Three": 同じパターンが 3 回出現したら抽象化を検討する
- それまでは具象のまま保つ(早すぎる抽象化は避ける)

## テストの粒度
- 公開 API をテストする。内部実装の詳細をテストしない
- テスト名は「何がどうなるか」を日本語で書く

Try This: レビュープロセスの改善

Exercise 1: Golden Principles の策定

チームで以下のワークショップを行う:

  1. 過去 1 ヶ月の PR レビューコメントを収集する
  2. 繰り返し指摘されているパターンを特定する
  3. そのうち機械化できるものを Golden Principles として定義する
  4. テストまたは linter ルールとして実装する

Exercise 2: レビューコメントの分類

直近 10 件の PR レビューコメントを以下に分類する:

カテゴリあるべき対応
自動化可能「import の順序が違う」linter で検出
パターン準拠「既存の形式と異なる」Agent Review で検出
設計判断「この抽象化は早すぎる」人間のレビュー
ビジネス正しさ「この計算式は制度と異なる」人間のレビュー

自動化可能なものが多ければ、フィードバックループに改善余地がある。

Exercise 3: Agent-to-Agent Review の試行

  1. エージェントにコードを生成させる
  2. 別のセッションで、そのコードをレビューさせる
  3. レビュー結果を人間の目で評価する
  4. 有用な指摘と的外れな指摘を分類し、レビュープロンプトを改善する

Exercise 4: 品質ドメインの分類

プロジェクトのモジュールを高・中・低リスクに分類する:

  1. 各モジュールのリスクレベルを判定する
  2. リスクレベルに応じたレビュープロセスを定義する
  3. 高リスクモジュールの Golden Principles を優先的に整備する

まとめ

エージェント生成コードの品質管理原則:

  1. Golden Principles: 機械的に検証可能な「絶対ルール」を定義する
  2. リスクベースのレビュー: ドメインのリスクに応じてレビュー密度を変える
  3. Continuous Garbage Collection: 定期的にクリーンアップして一貫性を保つ
  4. 人間は判断に集中: 正しさ、設計、セキュリティに人間のレビューを集中させる
  5. 味をツールに変換: 暗黙の品質基準を明文化し、可能なら機械化する
  6. スタイルにこだわらない: 動作の正しさ > コードのスタイル

次のステップ