CR-NEXUS-051 Implementation Plan
Spec: docs/spec/CR-NEXUS-051_ERROR_CLASSIFICATION_SPECIFICATION.md (v1.1.1) Status: Phase 3 Approve(実装フェーズ移行可能) Created: 2025-01-06
1. 実装対象ファイルの責務
1.1 src/nexuscore/core/errors.py
責務:
- 例外階層の定義(NexusCoreError とそのサブクラス)
classify_error()関数の実装(エラー分類ロジック)convert_http_error_to_nexus_error()関数の実装(例外変換)- 分類不能エラー時のフォールバック処理(3.4.2 Step 1-4)
依存関係:
retry_utils.pyに依存しない(循環禁止)- 標準ライブラリのみ使用(
logging,typing)
実装要件:
- 分類処理中の例外を捕捉し、
"unexpected"として扱う(3.4.3) - すべての入力に対して少なくとも
"unexpected"を返すことを保証(3.4.3) - 分類結果をログに記録(5.3 AU-1)
1.2 src/nexuscore/core/retry_utils.py
責務:
- リトライ可否の判定(3.3.1)
- リトライの有限性保証(3.3.2 SHALL要件)
- Backoff 戦略の適用(3.3.3 意味論レベル)
- Unexpected エラーのリトライ禁止(3.3.4)
- 分類不能エラー時のフォールバックフック(3.4.2)
依存関係:
errors.pyのclassify_error()を使用(一方向依存)- 設定値は外部から注入可能にする(固定値禁止)
実装要件:
- 最大リトライ回数の上限を設定可能にする
- Backoff 戦略は意味論レベルで実装(増加型/一定/待機なし)
unexpectedカテゴリのエラーはリトライしない- 設定値(最大回数、待機時間、指数係数等)は外部注入を前提
2. 依存方向
errors.py
↓ (classify_error を使用)
retry_utils.py
循環依存の禁止:
errors.pyはretry_utils.pyを import しないretry_utils.pyはerrors.pyのclassify_error()のみ使用
3. 設定値の置き場所
3.1 設定値の分類
エラー分類関連(errors.py):
- ログレベル設定(INFO/WARNING)
- 分類不能エラー時のログ設定
リトライ関連(retry_utils.py):
- 最大リトライ回数(エラー種別ごと)
- Backoff 戦略のパラメータ(増加型の係数、一定間隔の値等)
- エラー種別ごとの推奨戦略マッピング
3.2 設定値の注入方法
方針: 設定値は関数/クラスのパラメータとして注入可能にする
errors.py:
classify_error()は設定不要(純粋関数)- ログ設定はモジュールレベルの logger を使用(既存の仕組みを利用)
retry_utils.py:
retry_with_context()関数のパラメータとして設定値を注入- デフォルト値は提供するが、外部から上書き可能
- エラー種別ごとの設定は
RetryConfigクラスまたは dict で管理
3.3 設定値のデフォルト
注意: Spec では具体的な数値は定義されていないため、実装時に適切なデフォルト値を設定する。
推奨デフォルト(実装時の参考):
- 最大リトライ回数: 3回(エラー種別ごとに設定可能)
- 増加型待機戦略の初期待機時間: 1.0秒(エラー種別ごとに設定可能)
- 増加型待機戦略の係数: 2.0(指数バックオフの底、設定可能)
重要: これらのデフォルト値は Spec の一部ではなく、実装詳細である。
4. 実装差分分析
4.1 errors.py の既存実装との差分
既存実装の状態:
- ✅ 例外階層は定義済み
- ✅
classify_error()は基本的に実装済み - ✅
convert_http_error_to_nexus_error()は実装済み
追加・修正が必要な箇所:
- 分類不能エラー時のフォールバック処理(3.4.2):
- Step 1: 安全な分類結果の返却(既に
"unexpected"を返しているが、明示的に処理を追加) - Step 2: エラーログの記録(warning レベル、分類失敗の理由を含める)
- Step 3: 上位へのエラー伝播(
UnexpectedSystemErrorとして伝播、既に実装済み) - Step 4: 監視・アラート(ログに記録、監視機構へのフック)
- Step 1: 安全な分類結果の返却(既に
- 分類処理中の例外捕捉(3.4.3):
classify_error()内で例外が発生した場合、"unexpected"を返す- 入力検証(
Noneチェック等)
- ログ記録の強化(5.3 AU-1):
- 分類結果を
logger.info()で記録 - 誤分類の疑いがある場合は
logger.warning()で警告
- 分類結果を
4.2 retry_utils.py の既存実装との差分
既存実装の状態:
- ✅
retry_with_context()は実装済み - ✅ 指数バックオフは実装済み(固定実装)
- ⚠️ リトライ可否の判定は部分的に実装(
invalid_outputが含まれていない) - ⚠️
unexpectedエラーのリトライ禁止が明示されていない - ⚠️ Backoff 戦略が固定実装(意味論レベルでの抽象化が必要)
追加・修正が必要な箇所:
- リトライ可否の判定ルール(3.3.1):
invalid_outputをリトライ可能に追加unexpectedをリトライ不可として明示的に禁止
- リトライの有限性保証(3.3.2):
- 既に
max_retriesで制御されているが、SHALL 要件として明示 - 無限リトライループの可能性を完全に排除
- 既に
- Backoff 戦略の抽象化(3.3.3):
- 増加型待機戦略(長/中/短)
- 一定待機戦略
- 待機なし再試行
- エラー種別ごとの戦略マッピングを設定可能にする
- Unexpected エラーのリトライ禁止(3.3.4):
unexpectedカテゴリのエラーは即座にリトライを停止
- 分類不能エラー時のフォールバックフック(3.4.2):
- 分類不能エラーが発生した場合の処理フローを追加
5. テスト設計
5.1 テストファイル構成
ファイル: tests/core/test_errors.py
テストカテゴリ:
- カスタム例外の分類(8テスト)
- メッセージベースの分類(13テスト)
- 型名ベースの分類(2テスト)
- フォールバック(3テスト)
- 変換関数テスト(9テスト)
- 例外階層テスト(3テスト)
- エッジケーステスト(6テスト)
- 新規: 分類不能エラー時のフォールバック(3テスト)
- 新規: リトライ可否判定(7テスト)
- 新規: Backoff 戦略(6テスト)
- 新規: Unexpected エラーのリトライ禁止(3テスト)
合計: 45テスト(Spec 要件)+ 新規19テスト = 64テスト
5.2 テスト設計のポイント
分類不能エラーのテスト:
classify_error()が例外を発生させた場合- エラーオブジェクトが
Noneの場合 - 不正な形式のエラーオブジェクトの場合
リトライ可否判定のテスト:
- 各エラー種別のリトライ可否を確認
unexpectedは必ずリトライ不可
Backoff 戦略のテスト:
- 増加型待機戦略(長/中/短)の動作確認
- 一定待機戦略の動作確認
- 待機なし再試行の動作確認
- エラー種別ごとの戦略マッピング確認
6. 実装手順
Step 1: errors.py の拡張
- 分類不能エラー時のフォールバック処理を追加(3.4.2)
- 分類処理中の例外捕捉を追加(3.4.3)
- ログ記録の強化(5.3 AU-1)
Step 2: retry_utils.py の拡張
- リトライ可否判定ルールの修正(3.3.1)
- Backoff 戦略の抽象化(3.3.3)
- Unexpected エラーのリトライ禁止(3.3.4)
- 設定値の注入可能化
Step 3: テストの実装
- 既存テストの確認・修正
- 新規テストの追加(分類不能、リトライ可否、Backoff 戦略)
Step 4: 統合テスト
- LLM API呼び出し → エラー発生 → 分類 → リトライのワークフロー確認
7. 実装時の注意事項
7.1 後方互換性
- 既存の
retry_with_context()のシグネチャは維持 - 既存の呼び出し元が動作することを確認
7.2 パフォーマンス要件
- 分類処理は1ms以内(5.1 PR-1)
- 文字列マッチングは
in演算子を使用(5.1 PR-2)
7.3 拡張性
- 新しいエラーカテゴリの追加は10行以内(5.2 EX-1)
- 設定値の注入により、将来の拡張に対応
8. 完了条件
errors.pyが Spec v1.1.1 の要件を満たすretry_utils.pyが Spec v1.1.1 の要件を満たす- テストが45ケース以上(Spec 要件)+ 新規テストを実装
- テストカバレッジが98%以上
- 後方互換性が維持されている
- パフォーマンス要件を満たす
- 設定値が外部注入可能になっている
9. 関連ドキュメント
- Spec:
docs/spec/CR-NEXUS-051_ERROR_CLASSIFICATION_SPECIFICATION.md(v1.1.1) - Phase 3 Review:
ガバナンス/review_packets/RP-NEXUS-051_PHASE25_INDEPENDENT_REVIEW_v2.md - Decision Log:
判断ログ/判断ログ.md