第 9 章:エラーコードと適合性レベル

本章は CAP プロトコルの標準化エラーコード表、および実装が適合性レベルを宣言する方式を定義する。

9.1 エラーコード形式

エラーコードは E_ プレフィックスの大文字アンダースコアで命名する。エラーコード文字列自体が規範的である——本仕様の実装は MUST 本章定義に従い対応するエラーコード文字列を返却し、実装間の一貫した診断を可能にする。

エラー応答メッセージ構造:

ErrorBody {
  required error_code : string
  required message    : string
  optional details    : map<string, string>
  optional retry_after_ms : uint32
}
フィールド説明
error_code本章定義の標準エラーコード
message人間可読のエラー記述(言語固定なし、英語または日本語推奨)
detailsエラーの追加コンテキスト(違反した具体的フィールド等)
retry_after_msクライアントリトライの推奨待機時間、暫定的エラーにのみ意義あり

9.2 クレデンシャル関連エラーコード

Authorization_Descriptor および Trusted_Ticket の検証失敗シナリオに適用される。

エラーコードHTTP 等価発動条件適合性
E_DESCRIPTOR_NOT_FOUND404参照される descriptor_id が端末ローカルに見つからない端末 MUST
E_INVALID_STRUCTURE400クレデンシャル構造が §2.3 / §2.4 に適合しない端末/発行者 MUST
E_INVALID_SIGNATURE401署名検証失敗端末 MUST
E_VERIFICATION_KEY_INVALID401署名 key_id に対応する Verification_Key が未登録または失効済み端末 MUST
E_UNKNOWN_ISSUER401クレデンシャルの issuer_id が端末信頼リストに存在しない端末 MUST
E_DESCRIPTOR_REVOKED403Authorization_Descriptor が失効済み端末 MUST
E_TICKET_REVOKED403Trusted_Ticket が失効済み端末 MUST
E_DESCRIPTOR_EXPIRED403クレデンシャルが not_after を経過端末 MUST
E_DESCRIPTOR_NOT_YET_VALID403現在時刻が not_before より早い端末 MUST
E_TICKET_MALFORMED400JWS 解析失敗または typ 不正端末 MUST
E_DUPLICATE_DESCRIPTOR_ID409提出クレデンシャルが既保管クレデンシャル ID と衝突かつ内容不一致端末 MUST
E_VALIDITY_OUT_OF_RANGE400クレデンシャルの not_after - not_before が制限超過端末/発行者 MUST
E_REVOCATION_QUERY_TIMEOUT504オンライン失効照会タイムアウト端末 SHOULD

9.3 認可範囲エラーコード

クレデンシャルが合法だが認可範囲がマッチしないシナリオに適用される。

エラーコードHTTP 等価発動条件
E_SUBJECT_MISMATCH403クレデンシャル subject が要求者 fay_id と不一致
E_TERMINAL_MISMATCH403クレデンシャル terminal_id が現在端末と不一致
E_AUTHORIZATION_INSUFFICIENT403(resource, mode) にマッチする Grant が見つからない
E_RATE_LIMIT_EXCEEDED429constraints の頻度制限を超過
E_OUT_OF_TIME_WINDOW403現在時刻が constraints 時間ウィンドウ外
E_OUT_OF_GEO_FENCE403端末位置が constraints 地理フェンス外
E_UNSUPPORTED_CONSTRAINT400クレデンシャルが未識別の constraint キーを含む

9.4 リソースとセッションエラーコード

リソース占有、Session 状態関連のエラーに適用される。

エラーコードHTTP 等価発動条件
E_RESOURCE_BUSY409リソースが要求モードで既に占有されている(読み書きロックマトリクス違反)
E_RESOURCE_UNAVAILABLE503リソース現在利用不可(ハードウェア切断、ソフトウェア未起動等)
E_RESOURCE_NOT_FOUND404resource_id が存在しない
E_SESSION_NOT_FOUND404session_id が存在しない
E_SESSION_TERMINATED410Session 終了済み、操作継続不可
E_SESSION_LIMIT_EXCEEDED429§5.8 定義の Session 数量制限を超過
E_OS_INTEGRATION_FAILED500OS アクセス制御下発失敗

9.5 ハンドオーバー関連エラーコード

第 6 章で定義されたハンドオーバーフローに適用される。

エラーコードHTTP 等価発動条件
E_HANDOVER_INVALID_SOURCE400source_session_id が存在しないまたは状態がハンドオーバー不可
E_HANDOVER_INVALID_TARGET400target_credential 検証失敗
E_HANDOVER_REJECTED_BY_POLICY403ポリシー評価がハンドオーバー拒否
E_HANDOVER_FAILED_AT_RELEASE500ハンドオーバー過程中ソース Session 解放失敗
E_HANDOVER_FAILED_AT_ACQUIRE500ハンドオーバー過程中対象 Session 作成失敗
E_HANDOVER_TIMEOUT504ハンドオーバータイムアウト
E_HANDOVER_IN_PROGRESS409リソースに進行中のハンドオーバーあり、新規要求拒否
E_HANDOVER_RETRY_LIMIT429リトライ回数が制限超過

9.6 プロトコルとシステムエラーコード

エラーコードHTTP 等価発動条件
E_PROTOCOL_VERSION_UNSUPPORTED400メッセージ version フィールドが実装でサポートされない
E_INVALID_MESSAGE400プロトコルメッセージ形式が §2.6 に適合しない
E_INTERNAL_ERROR500端末内部エラー(詳細を露出しない)
E_NOT_IMPLEMENTED501実装が当該オプション能力を提供していない
E_STORAGE_FULL507端末クレデンシャル保管満杯

9.7 エラーコード拡張

実装は MAY カスタムエラーコードを定義するが、MUST:

  1. E_VENDOR_<vendor_name>_<code> 命名形式を使用する(E_VENDOR_ACME_QUOTA_EXCEEDED 等)
  2. 本章定義の標準エラーコードと衝突しない
  3. 実装ドキュメントでセマンティクスを明示する

iFay_Runtime は未識別のカスタムエラーコード受領時、SHOULD E_INTERNAL_ERROR として処理する。

9.8 適合性レベル宣言

実装は MUST 以下の方式で満たす適合性レベルを宣言する。

9.8.1 適合性宣言構造

ConformanceClaim {
  required protocol_version : string                  // "1.0.0" または "draft" 等
  required levels           : array<ConformanceLevel> (len 1..3)
  optional optional_features : array<string>
  optional vendor_extensions : array<string>
}

ConformanceLevel = enum["terminal", "issuer", "runtime"]
フィールド説明
protocol_version実装が遵守する CAP プロトコルバージョン番号
levels実装が満たす適合性レベル(§0.5 を参照)
optional_features実装がサポートするオプション能力(aggregated_heartbeatai_model_handover_policy 等)
vendor_extensions実装がサポートするベンダー拡張能力

9.8.2 宣言公開チャネル

実装は SHOULD 以下のチャネルで ConformanceClaim を公開する:

  1. 製品ドキュメントで明示的に宣言
  2. 特定の照会インタフェースで返却(具体的インタフェースは実装で定義)
  3. SDK パッケージメタデータで宣言

9.8.3 適合性テスト

CAP プロトコルの適合性テストスイート(Conformance Test Suite)は補助資産としてプロジェクトが維持するが、本仕様の規範的範囲には含まれない。任意の実装は SHOULD 対応する適合性レベルのテストスイートに合格するが、MUST テストスイートを正しさの唯一の保証として依存しない。

9.9 エラーコード使用推奨

実装は SHOULD 以下のエラーコード使用原則に従う:

  1. 最も具体的なエラーコードを優先選択:例えば E_TICKET_REVOKEDE_TICKET_MALFORMED より優先(両者が分析過程で出現可能性がある場合でも)
  2. エラーコードを通じて内部詳細を露出しない:エラー message フィールドで鍵フィンガープリント、内部 ID 等の機微情報露出を回避
  3. details フィールドで診断補助を提供:例えば details["field"] = "not_after" で具体的にどのフィールドが不適合かを示す
  4. 暫定的エラーは retry_after_ms を使用:例えば E_RESOURCE_BUSYE_HANDOVER_IN_PROGRESS

9.10 エラーコードと schema.json の同期

schema/{version}/schema.json は MUST 完全なエラーコード列挙定義を含み、本章と一貫性を保つ。本章のエラーコードリスト更新時、schema.json は MUST 同期更新する。