{
  "checked_on": "2026-10-01",
  "description": "Versioned public error knowledge base used by GAIP Integration Repair: HTTP (RFC 9110, RFC 6585, RFC 9457), JSON-RPC 2.0, A2A 1.0, MCP 2025-11-25 and the published API errors of OpenAI, Anthropic, Google Gemini, AWS Bedrock, Azure OpenAI and Mistral AI.",
  "entries": [
    {
      "checked_on": "2026-09-28",
      "code": "400",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Read the response body; RFC 9457 problem details (type/title/detail) usually name the offending field.",
        "Validate the request against the supplier's published schema.",
        "Resend once corrected."
      ],
      "http_status": 400,
      "id": "http.400",
      "likely_owner": "caller",
      "meaning": "The server cannot or will not process the request because of a client error (malformed syntax, invalid framing or content).",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.1",
      "type": "Bad Request"
    },
    {
      "checked_on": "2026-09-28",
      "code": "401",
      "default_for_status": true,
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Read WWW-Authenticate for the expected scheme (and resource_metadata for OAuth-protected MCP servers).",
        "Obtain or refresh a credential through the documented flow.",
        "Retry once; a second 401 means the credential is wrong or revoked."
      ],
      "http_status": 401,
      "id": "http.401",
      "likely_owner": "caller",
      "meaning": "The request lacks valid authentication credentials for the target resource; the response carries WWW-Authenticate.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.2",
      "type": "Unauthorized"
    },
    {
      "checked_on": "2026-09-28",
      "code": "402",
      "default_for_status": true,
      "diagnosis": "BILLING_REQUIRED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Check the account's billing status and credit balance with the supplier.",
        "Do not retry until billing is resolved."
      ],
      "http_status": 402,
      "id": "http.402",
      "likely_owner": "caller",
      "meaning": "Reserved by HTTP; APIs use it for exhausted prepaid credit or billing problems.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.3",
      "type": "Payment Required"
    },
    {
      "checked_on": "2026-09-28",
      "code": "403",
      "default_for_status": true,
      "diagnosis": "FORBIDDEN",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Compare token scopes with those the operation requires.",
        "Check plan, region and IP allow-lists.",
        "Ask the supplier to grant the permission; do not retry until granted."
      ],
      "http_status": 403,
      "id": "http.403",
      "likely_owner": "caller",
      "meaning": "The server understood the request but refuses to fulfil it; re-authenticating will not help.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.4",
      "type": "Forbidden"
    },
    {
      "checked_on": "2026-09-28",
      "code": "404",
      "default_for_status": true,
      "diagnosis": "NOT_FOUND",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Re-read the supplier's current card or spec for the live URL.",
        "Check base-path versioning and resource ids.",
        "Report to the supplier if the URL is still published."
      ],
      "http_status": 404,
      "id": "http.404",
      "likely_owner": "caller",
      "meaning": "The origin server did not find a current representation for the target resource.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.5",
      "type": "Not Found"
    },
    {
      "checked_on": "2026-09-28",
      "code": "405",
      "default_for_status": true,
      "diagnosis": "METHOD_NOT_ALLOWED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Read the Allow header.",
        "Use POST for JSON-RPC endpoints; check a redirect did not turn POST into GET.",
        "Resend with a permitted method."
      ],
      "http_status": 405,
      "id": "http.405",
      "likely_owner": "caller",
      "meaning": "The method is known but not supported by the target resource; the Allow header lists valid methods.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.6",
      "type": "Method Not Allowed"
    },
    {
      "checked_on": "2026-09-28",
      "code": "406",
      "default_for_status": true,
      "diagnosis": "NOT_ACCEPTABLE",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Check the Accept header; MCP Streamable HTTP requires both application/json and text/event-stream on POST.",
        "Resend with an acceptable media type."
      ],
      "http_status": 406,
      "id": "http.406",
      "likely_owner": "caller",
      "meaning": "No representation matches the request's Accept/Accept-* headers.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.7",
      "type": "Not Acceptable"
    },
    {
      "checked_on": "2026-09-28",
      "code": "407",
      "default_for_status": true,
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "This is the caller's egress proxy, not the supplier: configure proxy credentials.",
        "Retry once after the proxy accepts the connection."
      ],
      "http_status": 407,
      "id": "http.407",
      "likely_owner": "caller",
      "meaning": "A proxy between caller and supplier requires the caller to authenticate (Proxy-Authenticate header).",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.8",
      "type": "Proxy Authentication Required"
    },
    {
      "checked_on": "2026-09-28",
      "code": "408",
      "default_for_status": true,
      "diagnosis": "REQUEST_TIMEOUT",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Retry on a fresh connection.",
        "Reduce or stream the request body."
      ],
      "http_status": 408,
      "id": "http.408",
      "likely_owner": "network",
      "meaning": "The server did not receive a complete request within the time it was prepared to wait.",
      "provider": "HTTP",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.9",
      "type": "Request Timeout"
    },
    {
      "checked_on": "2026-09-28",
      "code": "409",
      "default_for_status": true,
      "diagnosis": "CONFLICT",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Fetch current state.",
        "If this was a retried create, check the first attempt did not succeed.",
        "Rebase on the current version (If-Match) and resend once."
      ],
      "http_status": 409,
      "id": "http.409",
      "likely_owner": "caller",
      "meaning": "The request conflicts with the current state of the target resource.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.10",
      "type": "Conflict"
    },
    {
      "checked_on": "2026-09-28",
      "code": "410",
      "default_for_status": true,
      "diagnosis": "GONE",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Stop calling this URL.",
        "Find the replacement in the supplier's current card/spec or changelog (run Supplier Watch)."
      ],
      "http_status": 410,
      "id": "http.410",
      "likely_owner": "caller",
      "meaning": "The resource is no longer available at the origin and this is likely permanent.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.11",
      "type": "Gone"
    },
    {
      "checked_on": "2026-09-28",
      "code": "411",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Send Content-Length (or ensure the client does not strip it).",
        "Resend once."
      ],
      "http_status": 411,
      "id": "http.411",
      "likely_owner": "caller",
      "meaning": "The server refuses the request without a defined Content-Length.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.12",
      "type": "Length Required"
    },
    {
      "checked_on": "2026-09-28",
      "code": "412",
      "default_for_status": true,
      "diagnosis": "PRECONDITION_FAILED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Re-read the resource to obtain the current ETag.",
        "Reapply the change and resend once."
      ],
      "http_status": 412,
      "id": "http.412",
      "likely_owner": "caller",
      "meaning": "A condition in the request headers (If-Match, If-Unmodified-Since) evaluated to false.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.13",
      "type": "Precondition Failed"
    },
    {
      "checked_on": "2026-09-28",
      "code": "413",
      "default_for_status": true,
      "diagnosis": "PAYLOAD_TOO_LARGE",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Find the documented size limit.",
        "Send files by reference or split the batch."
      ],
      "http_status": 413,
      "id": "http.413",
      "likely_owner": "caller",
      "meaning": "The request content is larger than the server is willing or able to process.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.14",
      "type": "Content Too Large"
    },
    {
      "checked_on": "2026-09-28",
      "code": "414",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Move large parameters into a POST body.",
        "Resend once."
      ],
      "http_status": 414,
      "id": "http.414",
      "likely_owner": "caller",
      "meaning": "The target URI is longer than the server is willing to interpret.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.15",
      "type": "URI Too Long"
    },
    {
      "checked_on": "2026-09-28",
      "code": "415",
      "default_for_status": true,
      "diagnosis": "UNSUPPORTED_MEDIA_TYPE",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Send Content-Type: application/json for JSON APIs.",
        "Check declared input modes/media types."
      ],
      "http_status": 415,
      "id": "http.415",
      "likely_owner": "caller",
      "meaning": "The content is in a format not supported by the target resource for this method.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.16",
      "type": "Unsupported Media Type"
    },
    {
      "checked_on": "2026-09-28",
      "code": "416",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Re-read the resource length and request a valid range."
      ],
      "http_status": 416,
      "id": "http.416",
      "likely_owner": "caller",
      "meaning": "None of the requested ranges overlap the selected representation.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.17",
      "type": "Range Not Satisfiable"
    },
    {
      "checked_on": "2026-09-28",
      "code": "417",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Remove 'Expect: 100-continue' or send the body directly.",
        "Resend once."
      ],
      "http_status": 417,
      "id": "http.417",
      "likely_owner": "caller",
      "meaning": "The Expect request header could not be met.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.18",
      "type": "Expectation Failed"
    },
    {
      "checked_on": "2026-09-28",
      "code": "421",
      "default_for_status": true,
      "diagnosis": null,
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Open a new connection for this host (do not reuse a coalesced HTTP/2 connection).",
        "Check SNI/Host headers match the target."
      ],
      "http_status": 421,
      "id": "http.421",
      "likely_owner": "network",
      "meaning": "The request was directed at a server unable to produce a response for this scheme and authority (often connection reuse across hosts).",
      "provider": "HTTP",
      "retry_guidance": "Retry once on a new connection to the correct host.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.20",
      "type": "Misdirected Request"
    },
    {
      "checked_on": "2026-09-28",
      "code": "422",
      "default_for_status": true,
      "diagnosis": "VALIDATION_FAILED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Read the validation errors (field path and rule).",
        "Compare against the current schema; a release may have added a required field.",
        "Fix and resend once."
      ],
      "http_status": 422,
      "id": "http.422",
      "likely_owner": "caller",
      "meaning": "The content type and syntax are understood but the instructions cannot be processed (validation failure).",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.21",
      "type": "Unprocessable Content"
    },
    {
      "checked_on": "2026-09-28",
      "code": "426",
      "default_for_status": true,
      "diagnosis": "UNSUPPORTED_PROTOCOL",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Read the Upgrade header (for example TLS/1.2 or HTTP/2).",
        "Upgrade the client transport and resend."
      ],
      "http_status": 426,
      "id": "http.426",
      "likely_owner": "caller",
      "meaning": "The server refuses to perform the request using the current protocol (Upgrade header names the required one).",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.22",
      "type": "Upgrade Required"
    },
    {
      "checked_on": "2026-09-28",
      "code": "500",
      "default_for_status": true,
      "diagnosis": "SUPPLIER_SERVER_ERROR",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Retry idempotent calls with backoff.",
        "Report to the supplier with the request id if it persists."
      ],
      "http_status": 500,
      "id": "http.500",
      "likely_owner": "supplier",
      "meaning": "The server encountered an unexpected condition that prevented it from fulfilling the request.",
      "provider": "HTTP",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.1",
      "type": "Internal Server Error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "501",
      "default_for_status": true,
      "diagnosis": "NOT_IMPLEMENTED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Use an operation the supplier declares.",
        "Ask the supplier whether support is planned."
      ],
      "http_status": 501,
      "id": "http.501",
      "likely_owner": "supplier",
      "meaning": "The server does not support the functionality required to fulfil the request.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.2",
      "type": "Not Implemented"
    },
    {
      "checked_on": "2026-09-28",
      "code": "502",
      "default_for_status": true,
      "diagnosis": "BAD_GATEWAY",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Retry with backoff.",
        "Check the supplier status page; report persistent 502s with Server/Via headers."
      ],
      "http_status": 502,
      "id": "http.502",
      "likely_owner": "supplier",
      "meaning": "A gateway or proxy received an invalid response from the upstream server.",
      "provider": "HTTP",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.3",
      "type": "Bad Gateway"
    },
    {
      "checked_on": "2026-09-28",
      "code": "503",
      "default_for_status": true,
      "diagnosis": "SERVICE_UNAVAILABLE",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Honour Retry-After.",
        "Check the status page.",
        "Fail over for time-critical work."
      ],
      "http_status": 503,
      "id": "http.503",
      "likely_owner": "supplier",
      "meaning": "The server is temporarily unable to handle the request (overload or maintenance); Retry-After may say when to retry.",
      "provider": "HTTP",
      "retry_guidance": "Honour Retry-After when present; otherwise back off exponentially (1 s base, 30 s cap, 3 attempts).",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.4",
      "type": "Service Unavailable"
    },
    {
      "checked_on": "2026-09-28",
      "code": "504",
      "default_for_status": true,
      "diagnosis": "GATEWAY_TIMEOUT",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Check for completion via a status endpoint.",
        "Retry once with an idempotency key.",
        "Use asynchronous submit-and-poll for long work."
      ],
      "http_status": 504,
      "id": "http.504",
      "likely_owner": "supplier",
      "meaning": "A gateway did not receive a timely response from the upstream server; the work may still have completed.",
      "provider": "HTTP",
      "retry_guidance": "Check whether the first attempt took effect, then retry once with an idempotency key and a longer timeout.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.5",
      "type": "Gateway Timeout"
    },
    {
      "checked_on": "2026-09-28",
      "code": "505",
      "default_for_status": true,
      "diagnosis": "UNSUPPORTED_PROTOCOL",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Configure the client for HTTP/1.1 or HTTP/2 as the supplier supports."
      ],
      "http_status": 505,
      "id": "http.505",
      "likely_owner": "caller",
      "meaning": "The server does not support the major HTTP version used in the request.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.6",
      "type": "HTTP Version Not Supported"
    },
    {
      "checked_on": "2026-09-28",
      "code": "425",
      "default_for_status": true,
      "diagnosis": null,
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Disable 0-RTT early data for this request.",
        "Retry once."
      ],
      "http_status": 425,
      "id": "http.425",
      "likely_owner": "network",
      "meaning": "The server is unwilling to process a request that might be replayed (TLS 1.3 early data).",
      "provider": "HTTP",
      "retry_guidance": "Retry once after the TLS handshake completes (do not send as early data).",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc8470.html#section-5.2",
      "type": "Too Early"
    },
    {
      "checked_on": "2026-09-28",
      "code": "428",
      "default_for_status": true,
      "diagnosis": "PRECONDITION_FAILED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Fetch the resource ETag.",
        "Resend with If-Match."
      ],
      "http_status": 428,
      "id": "http.428",
      "likely_owner": "caller",
      "meaning": "The origin requires the request to be conditional (If-Match) to prevent lost updates.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc6585.html#section-3",
      "type": "Precondition Required"
    },
    {
      "checked_on": "2026-09-28",
      "code": "429",
      "default_for_status": true,
      "diagnosis": "RATE_LIMITED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Stop sending and honour Retry-After.",
        "Read RateLimit-* headers for the window.",
        "Add client-side throttling; request more quota if sustained."
      ],
      "http_status": 429,
      "id": "http.429",
      "likely_owner": "caller",
      "meaning": "The caller sent too many requests in a given time (rate limiting); Retry-After may say how long to wait.",
      "provider": "HTTP",
      "retry_guidance": "Honour Retry-After when present (give up automatically if it exceeds 300 s); otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc6585.html#section-4",
      "type": "Too Many Requests"
    },
    {
      "checked_on": "2026-09-28",
      "code": "431",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Remove oversized cookies or headers (large tokens, trace baggage).",
        "Resend once."
      ],
      "http_status": 431,
      "id": "http.431",
      "likely_owner": "caller",
      "meaning": "A header field, or all headers together, are too large.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc6585.html#section-5",
      "type": "Request Header Fields Too Large"
    },
    {
      "checked_on": "2026-09-28",
      "code": "451",
      "default_for_status": true,
      "diagnosis": "FORBIDDEN",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Do not retry or route around the restriction.",
        "Contact the supplier for the applicable jurisdiction."
      ],
      "http_status": 451,
      "id": "http.451",
      "likely_owner": "supplier",
      "meaning": "Access is denied as a consequence of a legal demand.",
      "provider": "HTTP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc7725.html#section-3",
      "type": "Unavailable For Legal Reasons"
    },
    {
      "checked_on": "2026-09-28",
      "code": "507",
      "default_for_status": true,
      "diagnosis": "SUPPLIER_SERVER_ERROR",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Retry later with backoff.",
        "Report to the supplier if persistent."
      ],
      "http_status": 507,
      "id": "http.507",
      "likely_owner": "supplier",
      "meaning": "The server cannot store the representation needed to complete the request.",
      "provider": "HTTP",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc4918.html#section-11.5",
      "type": "Insufficient Storage"
    },
    {
      "checked_on": "2026-09-28",
      "code": "511",
      "default_for_status": true,
      "diagnosis": null,
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "The caller's network, not the supplier, is intercepting: complete network sign-in or use another network.",
        "Retry once."
      ],
      "http_status": 511,
      "id": "http.511",
      "likely_owner": "network",
      "meaning": "An intercepting network (captive portal) requires authentication before access.",
      "provider": "HTTP",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc6585.html#section-6",
      "type": "Network Authentication Required"
    },
    {
      "checked_on": "2026-09-28",
      "code": "application/problem+json",
      "diagnosis": null,
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Read 'type' and look it up in the supplier's documentation; it identifies the problem class.",
        "Use 'detail' for the occurrence-specific explanation and 'instance' as the reference to report.",
        "Treat extension members (for example 'errors' or 'invalid-params') as the field-level list to fix."
      ],
      "id": "http.problem_details",
      "likely_owner": "caller",
      "meaning": "RFC 9457 Problem Details body: 'type' (URI identifying the problem type, default about:blank), 'title', 'status', 'detail' and 'instance' describe the error in a machine-readable way.",
      "message_patterns": [
        "application/problem\\+json",
        "about:blank"
      ],
      "provider": "HTTP",
      "requires_pattern": true,
      "retry_guidance": "Follow the retry guidance for the HTTP status in 'status'.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9457.html",
      "type": "Problem Details for HTTP APIs"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32700",
      "diagnosis": "JSONRPC_PARSE_ERROR",
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Serialise with a JSON library and send UTF-8.",
        "Check a proxy did not truncate the body."
      ],
      "id": "jsonrpc.32700",
      "jsonrpc_code": -32700,
      "likely_owner": "caller",
      "meaning": "Invalid JSON was received by the server.",
      "provider": "JSON_RPC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Parse error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32600",
      "diagnosis": "JSONRPC_INVALID_REQUEST",
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Send jsonrpc: \"2.0\", a string method, an id and params as an object or array."
      ],
      "id": "jsonrpc.32600",
      "jsonrpc_code": -32600,
      "likely_owner": "caller",
      "meaning": "The JSON sent is not a valid Request object.",
      "provider": "JSON_RPC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Invalid Request"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32601",
      "diagnosis": "JSONRPC_METHOD_NOT_FOUND",
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Check the method name against the protocol version the server speaks.",
        "Call a discovery method (tools/list or the agent card)."
      ],
      "id": "jsonrpc.32601",
      "jsonrpc_code": -32601,
      "likely_owner": "caller",
      "meaning": "The method does not exist or is not available.",
      "provider": "JSON_RPC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Method not found"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32602",
      "diagnosis": "JSONRPC_INVALID_PARAMS",
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Read error.data for the failing field.",
        "Match params to the declared schema."
      ],
      "id": "jsonrpc.32602",
      "jsonrpc_code": -32602,
      "likely_owner": "caller",
      "meaning": "Invalid method parameter(s).",
      "provider": "JSON_RPC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Invalid params"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32603",
      "diagnosis": "JSONRPC_INTERNAL_ERROR",
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Retry idempotent calls with backoff.",
        "Report with the JSON-RPC id and timestamp."
      ],
      "id": "jsonrpc.32603",
      "jsonrpc_code": -32603,
      "likely_owner": "supplier",
      "meaning": "Internal JSON-RPC error.",
      "provider": "JSON_RPC",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Internal error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32000..-32099",
      "diagnosis": null,
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Check the protocol (A2A, MCP) and look up the specific code.",
        "Read error.message and error.data."
      ],
      "id": "jsonrpc.server_error_range",
      "likely_owner": "supplier",
      "meaning": "Reserved for implementation-defined server errors; protocols such as A2A and MCP assign specific meanings inside this range.",
      "provider": "JSON_RPC",
      "retry_guidance": "Look the code up for the specific protocol before retrying.",
      "retryable": false,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Server error"
    },
    {
      "aliases": [
        "TaskNotFoundError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32001",
      "diagnosis": "A2A_TASK_NOT_FOUND",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Use the exact task id returned by SendMessage.",
        "Poll within the agent's retention window; resubmit if expired."
      ],
      "grpc_status": "NOT_FOUND",
      "http_status": 404,
      "id": "a2a.TaskNotFoundError",
      "jsonrpc_code": -32001,
      "likely_owner": "caller",
      "meaning": "The task id does not correspond to an existing or accessible task (invalid, expired or purged).",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "TaskNotFoundError"
    },
    {
      "aliases": [
        "TaskNotCancelableError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32002",
      "diagnosis": "A2A_TASK_NOT_CANCELABLE",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Call GetTask to read the final state instead of cancelling."
      ],
      "grpc_status": "FAILED_PRECONDITION",
      "http_status": 400,
      "id": "a2a.TaskNotCancelableError",
      "jsonrpc_code": -32002,
      "likely_owner": "caller",
      "meaning": "The task cannot be canceled (already COMPLETED, FAILED, CANCELED or REJECTED, or cancel unsupported).",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "TaskNotCancelableError"
    },
    {
      "aliases": [
        "PushNotificationNotSupportedError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32003",
      "diagnosis": "A2A_PUSH_NOT_SUPPORTED",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Check capabilities.pushNotifications.",
        "Poll with GetTask or stream instead."
      ],
      "grpc_status": "FAILED_PRECONDITION",
      "http_status": 400,
      "id": "a2a.PushNotificationNotSupportedError",
      "jsonrpc_code": -32003,
      "likely_owner": "caller",
      "meaning": "The agent does not support push notifications.",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "PushNotificationNotSupportedError"
    },
    {
      "aliases": [
        "UnsupportedOperationError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32004",
      "diagnosis": "A2A_UNSUPPORTED_OPERATION",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Compare the call with the agent card capabilities.",
        "Use a supported alternative (SendMessage instead of streaming)."
      ],
      "grpc_status": "FAILED_PRECONDITION",
      "http_status": 400,
      "id": "a2a.UnsupportedOperationError",
      "jsonrpc_code": -32004,
      "likely_owner": "caller",
      "meaning": "The requested operation or an aspect of it is not supported by this agent.",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "UnsupportedOperationError"
    },
    {
      "aliases": [
        "ContentTypeNotSupportedError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32005",
      "diagnosis": "A2A_CONTENT_TYPE_NOT_SUPPORTED",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Read the skill inputModes / defaultInputModes.",
        "Convert the part to a supported media type."
      ],
      "grpc_status": "INVALID_ARGUMENT",
      "http_status": 400,
      "id": "a2a.ContentTypeNotSupportedError",
      "jsonrpc_code": -32005,
      "likely_owner": "caller",
      "meaning": "A media type in the message parts or artifact is not supported by the agent or skill.",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "ContentTypeNotSupportedError"
    },
    {
      "aliases": [
        "InvalidAgentResponseError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32006",
      "diagnosis": "A2A_INVALID_AGENT_RESPONSE",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Capture the raw response.",
        "Report it to the supplier as a protocol defect."
      ],
      "grpc_status": "INTERNAL",
      "http_status": 500,
      "id": "a2a.InvalidAgentResponseError",
      "jsonrpc_code": -32006,
      "likely_owner": "supplier",
      "meaning": "The agent returned a response that does not conform to the specification.",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Retry once; a repeated invalid response is a supplier defect.",
      "retryable": true,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "InvalidAgentResponseError"
    },
    {
      "aliases": [
        "ExtendedAgentCardNotConfiguredError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32007",
      "diagnosis": "A2A_EXTENDED_CARD_NOT_CONFIGURED",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Use the public agent card.",
        "Only request the extended card when capabilities.extendedAgentCard is true."
      ],
      "grpc_status": "FAILED_PRECONDITION",
      "http_status": 400,
      "id": "a2a.ExtendedAgentCardNotConfiguredError",
      "jsonrpc_code": -32007,
      "likely_owner": "caller",
      "meaning": "The agent has no extended agent card configured although one was requested.",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "ExtendedAgentCardNotConfiguredError"
    },
    {
      "aliases": [
        "ExtensionSupportRequiredError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32008",
      "diagnosis": "A2A_EXTENSION_SUPPORT_REQUIRED",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Read capabilities.extensions for entries with required: true.",
        "Implement and declare the extension, then retry once."
      ],
      "grpc_status": "FAILED_PRECONDITION",
      "http_status": 400,
      "id": "a2a.ExtensionSupportRequiredError",
      "jsonrpc_code": -32008,
      "likely_owner": "caller",
      "meaning": "The agent requires an extension marked required: true in its card, and the client did not declare support.",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "ExtensionSupportRequiredError"
    },
    {
      "aliases": [
        "VersionNotSupportedError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32009",
      "diagnosis": "A2A_VERSION_NOT_SUPPORTED",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Read supportedInterfaces[].protocolVersion on the agent card.",
        "Send a version the agent supports and retry once."
      ],
      "grpc_status": "FAILED_PRECONDITION",
      "http_status": 400,
      "id": "a2a.VersionNotSupportedError",
      "jsonrpc_code": -32009,
      "likely_owner": "caller",
      "meaning": "The A2A protocol version specified in the request is not supported by the agent.",
      "note": "JSON-RPC, gRPC and HTTP+JSON mappings per the A2A 1.0 error code mappings table.",
      "protocol": "A2A",
      "provider": "A2A",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/#332-error-handling",
      "type": "VersionNotSupportedError"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32002",
      "diagnosis": "MCP_RESOURCE_NOT_FOUND",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Call resources/list or resources/templates/list and use an exact URI."
      ],
      "id": "mcp.resource_not_found",
      "jsonrpc_code": -32002,
      "likely_owner": "caller",
      "meaning": "The requested resource URI is not available on this MCP server.",
      "protocol": "MCP",
      "provider": "MCP",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/resources#error-handling",
      "type": "Resource not found"
    },
    {
      "aliases": [
        "URL_ELICITATION_REQUIRED",
        "URLElicitationRequiredError"
      ],
      "checked_on": "2026-09-28",
      "code": "-32042",
      "diagnosis": "MCP_URL_ELICITATION_REQUIRED",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Show the user the elicitation URL and domain and obtain consent; never pre-fetch it.",
        "After completion, retry the original request once."
      ],
      "id": "mcp.url_elicitation_required",
      "jsonrpc_code": -32042,
      "likely_owner": "caller",
      "meaning": "URLElicitationRequiredError: the request cannot be processed until the user completes the URL-mode elicitation(s) listed in error.data.elicitations.",
      "protocol": "MCP",
      "provider": "MCP",
      "retry_guidance": "Retry the original request once, after the user has completed the elicitation (or notifications/elicitation/complete arrives).",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation#error-handling",
      "type": "URLElicitationRequiredError"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32602",
      "diagnosis": "MCP_TOOL_NOT_FOUND",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Call tools/list and use an exact tool name.",
        "Validate arguments against the tool's inputSchema."
      ],
      "id": "mcp.unknown_tool",
      "jsonrpc_code": -32602,
      "likely_owner": "caller",
      "meaning": "Protocol error for an unknown tool name or a malformed tools/call request.",
      "message_patterns": [
        "unknown tool",
        "tool .{0,60}not found",
        "no such tool"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools#error-handling",
      "type": "Unknown tool"
    },
    {
      "checked_on": "2026-09-28",
      "code": "-32602",
      "diagnosis": "PROTOCOL_VERSION_MISMATCH",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Read error.data.supported.",
        "Initialize again with a supported version."
      ],
      "id": "mcp.unsupported_protocol_version",
      "jsonrpc_code": -32602,
      "likely_owner": "caller",
      "meaning": "The server does not support the protocolVersion requested in initialize (error.data lists supported and requested versions).",
      "message_patterns": [
        "unsupported protocol version"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/lifecycle#error-handling",
      "type": "Unsupported protocol version"
    },
    {
      "aliases": [
        "isError"
      ],
      "checked_on": "2026-09-28",
      "code": "isError",
      "diagnosis": "MCP_TOOL_ERROR",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Read result.content[].text for the actionable message.",
        "Adjust the arguments and call once more."
      ],
      "id": "mcp.tool_execution_error",
      "likely_owner": "caller",
      "meaning": "Tool execution error: the call succeeded at protocol level but result.isError is true (API failure, input validation or business-logic error).",
      "message_patterns": [
        "is_?error[\\\"': ]+true",
        "\\bisError\\b"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools#error-handling",
      "type": "Tool execution error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "HTTP 400 MCP-Protocol-Version",
      "diagnosis": "PROTOCOL_VERSION_MISMATCH",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Send MCP-Protocol-Version with the version negotiated during initialize.",
        "Retry once."
      ],
      "http_status": 400,
      "id": "mcp.http_bad_protocol_version_header",
      "likely_owner": "caller",
      "meaning": "Streamable HTTP: the server MUST answer 400 when the MCP-Protocol-Version header is invalid or unsupported.",
      "message_patterns": [
        "mcp-protocol-version",
        "unsupported protocol version",
        "invalid protocol version"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#protocol-version-header"
    },
    {
      "checked_on": "2026-09-28",
      "code": "HTTP 400 MCP-Session-Id missing",
      "diagnosis": "BAD_REQUEST",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Store the MCP-Session-Id returned with InitializeResult.",
        "Send it on every subsequent request."
      ],
      "http_status": 400,
      "id": "mcp.http_session_required",
      "likely_owner": "caller",
      "meaning": "Streamable HTTP: servers that require a session SHOULD answer 400 to requests (other than initialize) without MCP-Session-Id.",
      "message_patterns": [
        "session[- ]id.{0,20}(required|missing)",
        "missing (mcp-)?session",
        "no valid session"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#session-management"
    },
    {
      "checked_on": "2026-09-28",
      "code": "HTTP 404 MCP-Session-Id",
      "diagnosis": "MCP_SESSION_EXPIRED",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Send a new InitializeRequest without MCP-Session-Id.",
        "Use the new session id and retry the request once."
      ],
      "http_status": 404,
      "id": "mcp.http_session_expired",
      "likely_owner": "caller",
      "meaning": "Streamable HTTP: the server terminated the session; requests carrying that MCP-Session-Id get 404 and the client MUST start a new session.",
      "message_patterns": [
        "session (not found|expired|terminated|unknown)",
        "mcp-session-id",
        "invalid session"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Re-initialize (new InitializeRequest without a session id), then retry the request once.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#session-management"
    },
    {
      "checked_on": "2026-09-28",
      "code": "HTTP 405 GET",
      "diagnosis": "METHOD_NOT_ALLOWED",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Use POST for requests; do not rely on a standalone GET stream.",
        "Poll or use per-request SSE responses instead."
      ],
      "http_status": 405,
      "id": "mcp.http_get_no_sse",
      "likely_owner": "caller",
      "meaning": "Streamable HTTP: the server does not offer a server-initiated SSE stream at this endpoint and answers GET with 405.",
      "message_patterns": [
        "\\bget\\b.{0,40}(not allowed|not supported)",
        "sse.{0,30}not (supported|offered)"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#listening-for-messages-from-the-server"
    },
    {
      "checked_on": "2026-09-28",
      "code": "HTTP 403 Origin",
      "diagnosis": "FORBIDDEN",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Call from a server-side client (no browser Origin) or an origin the supplier allows."
      ],
      "http_status": 403,
      "id": "mcp.http_invalid_origin",
      "likely_owner": "caller",
      "meaning": "Streamable HTTP: the server MUST answer 403 when an Origin header is present and invalid (DNS-rebinding protection).",
      "message_patterns": [
        "\\borigin\\b.{0,40}(invalid|not allowed|forbidden)",
        "invalid origin"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#security-warning"
    },
    {
      "checked_on": "2026-09-28",
      "code": "HTTP 401 WWW-Authenticate resource_metadata",
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Read resource_metadata from WWW-Authenticate and fetch the Protected Resource Metadata.",
        "Complete the OAuth flow with the listed authorization server (outside this route) and send the bearer token.",
        "Retry once."
      ],
      "http_status": 401,
      "id": "mcp.http_unauthorized",
      "likely_owner": "caller",
      "meaning": "MCP authorization: the protected server answers 401 with WWW-Authenticate pointing to its OAuth Protected Resource Metadata.",
      "message_patterns": [
        "resource_metadata",
        "oauth-protected-resource"
      ],
      "protocol": "MCP",
      "provider": "MCP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization"
    },
    {
      "aliases": [
        "ConnectionClosed"
      ],
      "checked_on": "2026-09-28",
      "code": "-32000",
      "diagnosis": "CONNECTION_RESET",
      "evidence": "SDK_SOURCE",
      "family": "MCP",
      "fix_steps": [
        "Reconnect and re-initialize the session.",
        "For SSE streams, resume with Last-Event-ID where supported."
      ],
      "id": "mcp.sdk_connection_closed",
      "jsonrpc_code": -32000,
      "likely_owner": "network",
      "meaning": "SDK-defined ConnectionClosed: the transport closed before a response arrived.",
      "note": "Defined by the official MCP SDKs (ErrorCode.ConnectionClosed), not by the core specification.",
      "protocol": "MCP",
      "provider": "MCP",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/types.ts",
      "type": "ConnectionClosed"
    },
    {
      "aliases": [
        "RequestTimeout"
      ],
      "checked_on": "2026-09-28",
      "code": "-32001",
      "diagnosis": "TIMEOUT",
      "evidence": "SDK_SOURCE",
      "family": "MCP",
      "fix_steps": [
        "Raise the per-request timeout or reset it on progress notifications.",
        "Retry once."
      ],
      "id": "mcp.sdk_request_timeout",
      "jsonrpc_code": -32001,
      "likely_owner": "network",
      "meaning": "SDK-defined RequestTimeout: no response arrived within the client's request timeout.",
      "note": "Defined by the official MCP SDKs (ErrorCode.RequestTimeout); in A2A the same number means TaskNotFoundError.",
      "protocol": "MCP",
      "provider": "MCP",
      "retry_guidance": "Check whether the request took effect, then retry once with a longer timeout; use progress notifications for long tools.",
      "retryable": true,
      "spec_url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/types.ts",
      "type": "RequestTimeout"
    },
    {
      "checked_on": "2026-09-28",
      "code": "invalid_api_key",
      "default_for_status": true,
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the key and the OpenAI-Organization/OpenAI-Project headers.",
        "Clear cached credentials or generate a new key.",
        "Retry once."
      ],
      "http_status": 401,
      "id": "openai.invalid_api_key",
      "likely_owner": "caller",
      "meaning": "Invalid Authentication / Incorrect API key provided: the key is wrong, revoked or for another organization/project.",
      "message_patterns": [
        "incorrect api key provided",
        "invalid authentication"
      ],
      "provider": "OPENAI",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "invalid_request_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "401 organization membership",
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Create or join an organization in the account settings.",
        "Retry after membership is active."
      ],
      "http_status": 401,
      "id": "openai.no_organization",
      "likely_owner": "caller",
      "meaning": "You must be a member of an organization to use the API.",
      "message_patterns": [
        "must be a member of an organization"
      ],
      "provider": "OPENAI",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "401 IP not authorized",
      "diagnosis": "FORBIDDEN",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Send from an allow-listed IP or update the allowlist."
      ],
      "http_status": 401,
      "id": "openai.ip_not_authorized",
      "likely_owner": "caller",
      "meaning": "The request IP does not match the project's IP allowlist.",
      "message_patterns": [
        "ip.{0,20}not authorized"
      ],
      "provider": "OPENAI",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "unsupported_country_region_territory",
      "default_for_status": true,
      "diagnosis": "FORBIDDEN",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the supported countries list; do not route around the restriction."
      ],
      "http_status": 403,
      "id": "openai.unsupported_region",
      "likely_owner": "caller",
      "meaning": "Country, region, or territory not supported.",
      "message_patterns": [
        "country, region, or territory not supported"
      ],
      "provider": "OPENAI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "model_not_found",
      "default_for_status": true,
      "diagnosis": "NOT_FOUND",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the model id against the models list available to the project.",
        "Use an available model and retry once."
      ],
      "http_status": 404,
      "id": "openai.model_not_found",
      "likely_owner": "caller",
      "meaning": "The model does not exist or the key has no access to it.",
      "message_patterns": [
        "the model .{0,80} does not exist"
      ],
      "note": "Error code as returned in the API error object; the error-codes guide covers the 404 class via NotFoundError.",
      "provider": "OPENAI",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "invalid_request_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "context_length_exceeded",
      "diagnosis": "CONTEXT_LENGTH_EXCEEDED",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Count tokens before sending and trim or summarise history.",
        "Lower max_output_tokens / max_tokens.",
        "Use a model with a larger context window."
      ],
      "http_status": 400,
      "id": "openai.context_length_exceeded",
      "likely_owner": "caller",
      "meaning": "The prompt plus requested output exceeds the model's maximum context length.",
      "message_patterns": [
        "maximum context length is",
        "context_length_exceeded",
        "exceeds the context window"
      ],
      "note": "Returned as error.code in a 400 invalid_request_error body.",
      "provider": "OPENAI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "invalid_request_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "invalid_request_error",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Read error.param and error.message.",
        "Fix the named parameter and resend once."
      ],
      "http_status": 400,
      "id": "openai.invalid_request",
      "likely_owner": "caller",
      "meaning": "The request is malformed or has missing/invalid parameters (error.param names the field).",
      "provider": "OPENAI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "invalid_request_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "400 invalid service_tier",
      "diagnosis": "BAD_REQUEST",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Select an allowed service_tier or change project settings."
      ],
      "http_status": 400,
      "id": "openai.invalid_service_tier",
      "likely_owner": "caller",
      "meaning": "The requested service tier is not allowed for this project.",
      "message_patterns": [
        "requested service tier is not allowed"
      ],
      "provider": "OPENAI",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "aliases": [
        "tokens",
        "requests"
      ],
      "checked_on": "2026-09-28",
      "code": "rate_limit_exceeded",
      "default_for_status": true,
      "diagnosis": "RATE_LIMITED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Pace requests; honour Retry-After and x-ratelimit-* headers.",
        "Batch or queue requests; request a higher limit if sustained."
      ],
      "http_status": 429,
      "id": "openai.rate_limit_exceeded",
      "likely_owner": "caller",
      "meaning": "Rate limit reached for requests or tokens per minute.",
      "message_patterns": [
        "rate limit reached for"
      ],
      "provider": "OPENAI",
      "retry_guidance": "Honour Retry-After when present (give up automatically if it exceeds 300 s); otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts.",
      "retryable": true,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "requests"
    },
    {
      "checked_on": "2026-09-28",
      "code": "slow_down",
      "diagnosis": "RATE_LIMITED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Reduce request rate.",
        "Increase traffic gradually."
      ],
      "http_status": 429,
      "id": "openai.slow_down",
      "likely_owner": "caller",
      "meaning": "Request rate increased too quickly (type rate_limit_error).",
      "provider": "OPENAI",
      "retry_guidance": "Honour Retry-After; reduce the rate and ramp up gradually (the guide suggests at most 50% every 15 minutes at 1M TPM).",
      "retryable": true,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "rate_limit_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "insufficient_quota",
      "diagnosis": "QUOTA_EXHAUSTED",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check plan and billing details; add credit or raise the quota.",
        "Resume only after the limit is lifted."
      ],
      "http_status": 429,
      "id": "openai.insufficient_quota",
      "likely_owner": "caller",
      "meaning": "You exceeded your current quota: the plan/billing quota is exhausted.",
      "message_patterns": [
        "exceeded your current quota"
      ],
      "note": "HTTP 429 but not a rate limit: do not back off and retry.",
      "provider": "OPENAI",
      "retry_guidance": "Not transient: retrying will keep failing until billing or limits change.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "credit_balance_exhausted",
      "diagnosis": "QUOTA_EXHAUSTED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Add credits in billing settings.",
        "Resume only after the limit is lifted."
      ],
      "http_status": 429,
      "id": "openai.credit_balance_exhausted",
      "likely_owner": "caller",
      "meaning": "Prepaid credit balance exhausted.",
      "provider": "OPENAI",
      "retry_guidance": "Not transient: retrying will keep failing until billing or limits change.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "organization_spend_limit_exceeded",
      "diagnosis": "QUOTA_EXHAUSTED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Increase or remove the organization spend limit.",
        "Resume only after the limit is lifted."
      ],
      "http_status": 429,
      "id": "openai.organization_spend_limit_exceeded",
      "likely_owner": "caller",
      "meaning": "Organization spend limit reached.",
      "provider": "OPENAI",
      "retry_guidance": "Not transient: retrying will keep failing until billing or limits change.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "project_spend_limit_exceeded",
      "diagnosis": "QUOTA_EXHAUSTED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Adjust the project spend limit.",
        "Resume only after the limit is lifted."
      ],
      "http_status": 429,
      "id": "openai.project_spend_limit_exceeded",
      "likely_owner": "caller",
      "meaning": "Project spend limit reached.",
      "provider": "OPENAI",
      "retry_guidance": "Not transient: retrying will keep failing until billing or limits change.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "organization_usage_limit_exceeded",
      "diagnosis": "QUOTA_EXHAUSTED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Request a higher approved usage limit or contact support.",
        "Resume only after the limit is lifted."
      ],
      "http_status": 429,
      "id": "openai.organization_usage_limit_exceeded",
      "likely_owner": "caller",
      "meaning": "Organization usage limit reached.",
      "provider": "OPENAI",
      "retry_guidance": "Not transient: retrying will keep failing until billing or limits change.",
      "retryable": false,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "checked_on": "2026-09-28",
      "code": "server_error",
      "default_for_status": true,
      "diagnosis": "SUPPLIER_SERVER_ERROR",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Retry after a brief wait.",
        "Check the status page if it persists."
      ],
      "http_status": 500,
      "id": "openai.server_error",
      "likely_owner": "supplier",
      "meaning": "Issue on OpenAI's servers while processing the request.",
      "provider": "OPENAI",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "server_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "server_is_overloaded",
      "default_for_status": true,
      "diagnosis": "PROVIDER_OVERLOADED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Honour Retry-After and retry.",
        "Reduce concurrency during peaks."
      ],
      "http_status": 503,
      "id": "openai.server_is_overloaded",
      "likely_owner": "supplier",
      "meaning": "Model temporarily overloaded (type service_unavailable_error).",
      "message_patterns": [
        "overloaded"
      ],
      "provider": "OPENAI",
      "retry_guidance": "Transient capacity problem: honour Retry-After if present, otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts; ramp traffic back gradually.",
      "retryable": true,
      "spec_url": "https://developers.openai.com/api/docs/guides/error-codes",
      "type": "service_unavailable_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "invalid_request_error",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Read error.message for the offending field.",
        "Fix and resend once."
      ],
      "http_status": 400,
      "id": "anthropic.invalid_request_error",
      "likely_owner": "caller",
      "meaning": "There was an issue with the format or content of the request (also returned when a spend limit is reached).",
      "provider": "ANTHROPIC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "invalid_request_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "authentication_error",
      "default_for_status": true,
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the x-api-key header value.",
        "Create a new key if revoked; retry once."
      ],
      "http_status": 401,
      "id": "anthropic.authentication_error",
      "likely_owner": "caller",
      "meaning": "There is an issue with the API key (malformed, revoked or expired).",
      "provider": "ANTHROPIC",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "authentication_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "billing_error",
      "default_for_status": true,
      "diagnosis": "BILLING_REQUIRED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Fix billing details in the console.",
        "Retry after billing is resolved."
      ],
      "http_status": 402,
      "id": "anthropic.billing_error",
      "likely_owner": "caller",
      "meaning": "There is an issue with billing or payment information.",
      "provider": "ANTHROPIC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "billing_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "permission_error",
      "default_for_status": true,
      "diagnosis": "FORBIDDEN",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check workspace and key permissions for the model or feature."
      ],
      "http_status": 403,
      "id": "anthropic.permission_error",
      "likely_owner": "caller",
      "meaning": "The API key does not have permission to use the specified resource.",
      "provider": "ANTHROPIC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "permission_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "not_found_error",
      "default_for_status": true,
      "diagnosis": "NOT_FOUND",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the model id or resource id and endpoint path."
      ],
      "http_status": 404,
      "id": "anthropic.not_found_error",
      "likely_owner": "caller",
      "meaning": "The requested resource was not found.",
      "provider": "ANTHROPIC",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "not_found_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "conflict_error",
      "default_for_status": true,
      "diagnosis": "CONFLICT",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Re-read the resource state and resend once."
      ],
      "http_status": 409,
      "id": "anthropic.conflict_error",
      "likely_owner": "caller",
      "meaning": "The request conflicts with the current state of the resource (concurrent modification or duplicate unique value).",
      "provider": "ANTHROPIC",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "conflict_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "request_too_large",
      "default_for_status": true,
      "diagnosis": "PAYLOAD_TOO_LARGE",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Send large files via the Files API or by reference.",
        "Split the request."
      ],
      "http_status": 413,
      "id": "anthropic.request_too_large",
      "likely_owner": "caller",
      "meaning": "The request exceeds the maximum allowed number of bytes (32 MB for the Messages API).",
      "provider": "ANTHROPIC",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "request_too_large"
    },
    {
      "checked_on": "2026-09-28",
      "code": "rate_limit_error",
      "default_for_status": true,
      "diagnosis": "RATE_LIMITED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Honour the retry-after header and anthropic-ratelimit-* headers.",
        "Ramp traffic gradually; a spend-cap 429 needs a limit change, not a retry."
      ],
      "http_status": 429,
      "id": "anthropic.rate_limit_error",
      "likely_owner": "caller",
      "meaning": "The organization hit a rate limit (or a usage tier / workspace spend cap).",
      "provider": "ANTHROPIC",
      "retry_guidance": "Honour Retry-After when present (give up automatically if it exceeds 300 s); otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts. A tier spend-cap 429 has no retry-after header and is not transient.",
      "retryable": true,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "rate_limit_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "api_error",
      "default_for_status": true,
      "diagnosis": "SUPPLIER_SERVER_ERROR",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Retry with exponential backoff.",
        "Report the request-id if it persists."
      ],
      "http_status": 500,
      "id": "anthropic.api_error",
      "likely_owner": "supplier",
      "meaning": "An unexpected error occurred internal to Anthropic's systems.",
      "provider": "ANTHROPIC",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "api_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "timeout_error",
      "default_for_status": true,
      "diagnosis": "GATEWAY_TIMEOUT",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Use streaming for long requests (and avoid large max_tokens without streaming).",
        "Use the Message Batches API for bulk work."
      ],
      "http_status": 504,
      "id": "anthropic.timeout_error",
      "likely_owner": "supplier",
      "meaning": "The request timed out while processing.",
      "provider": "ANTHROPIC",
      "retry_guidance": "Retry once; for long generations use streaming or the Message Batches API instead of one blocking call.",
      "retryable": true,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "timeout_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "overloaded_error",
      "default_for_status": true,
      "diagnosis": "PROVIDER_OVERLOADED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Back off with jitter and retry.",
        "Ramp traffic gradually; sharp increases can also trigger acceleration 429s."
      ],
      "http_status": 529,
      "id": "anthropic.overloaded_error",
      "likely_owner": "supplier",
      "meaning": "The API is temporarily overloaded (high traffic across users).",
      "provider": "ANTHROPIC",
      "retry_guidance": "Transient capacity problem: honour Retry-After if present, otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts; ramp traffic back gradually.",
      "retryable": true,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "overloaded_error"
    },
    {
      "checked_on": "2026-09-28",
      "code": "invalid_request_error: prompt is too long",
      "diagnosis": "CONTEXT_LENGTH_EXCEEDED",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Count tokens with the token-counting endpoint before sending.",
        "Trim or summarise conversation history, or lower max_tokens.",
        "Use a model with a larger context window."
      ],
      "http_status": 400,
      "id": "anthropic.prompt_too_long",
      "likely_owner": "caller",
      "meaning": "The input tokens (plus max_tokens) exceed the model's context window; returned as a 400 invalid_request_error.",
      "message_patterns": [
        "prompt is too long",
        "input length and `?max_tokens`? exceed context limit",
        "exceed(s)? (the )?context (limit|window)"
      ],
      "note": "The error page lists the invalid_request_error type; the message text is as observed in published API responses.",
      "provider": "ANTHROPIC",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://platform.claude.com/docs/en/api/errors",
      "type": "invalid_request_error"
    },
    {
      "aliases": [
        "invalid_request",
        "parameter_unknown"
      ],
      "checked_on": "2026-09-28",
      "code": "INVALID_ARGUMENT",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the request against the API reference (field names, model-specific parameters).",
        "Resend once corrected."
      ],
      "grpc_status": "INVALID_ARGUMENT",
      "http_status": 400,
      "id": "gemini.invalid_argument",
      "likely_owner": "caller",
      "meaning": "The request payload is malformed or contains invalid or unknown parameters.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "INVALID_ARGUMENT"
    },
    {
      "aliases": [
        "failed_precondition"
      ],
      "checked_on": "2026-09-28",
      "code": "FAILED_PRECONDITION",
      "diagnosis": "FORBIDDEN",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Enable billing / check account prerequisites in Google AI Studio.",
        "Check regional availability."
      ],
      "grpc_status": "FAILED_PRECONDITION",
      "http_status": 400,
      "id": "gemini.failed_precondition",
      "likely_owner": "caller",
      "meaning": "A prerequisite is not met (for example billing not enabled, or the free tier is unavailable in the caller's region).",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "FAILED_PRECONDITION"
    },
    {
      "aliases": [
        "out_of_range"
      ],
      "checked_on": "2026-09-28",
      "code": "OUT_OF_RANGE",
      "default_for_status": true,
      "diagnosis": "BAD_REQUEST",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Validate parameter values and limits."
      ],
      "grpc_status": "OUT_OF_RANGE",
      "http_status": 416,
      "id": "gemini.out_of_range",
      "likely_owner": "caller",
      "meaning": "A request parameter is outside the valid range.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "OUT_OF_RANGE"
    },
    {
      "aliases": [
        "authentication"
      ],
      "checked_on": "2026-09-28",
      "code": "UNAUTHENTICATED",
      "default_for_status": true,
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the x-goog-api-key header or key parameter.",
        "Create a new key and retry once."
      ],
      "grpc_status": "UNAUTHENTICATED",
      "http_status": 401,
      "id": "gemini.unauthenticated",
      "likely_owner": "caller",
      "meaning": "The API key is missing, invalid or expired.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "UNAUTHENTICATED"
    },
    {
      "aliases": [
        "payment_required"
      ],
      "checked_on": "2026-09-28",
      "code": "PAYMENT_REQUIRED",
      "default_for_status": true,
      "diagnosis": "BILLING_REQUIRED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Add credits or enable auto-reload."
      ],
      "grpc_status": "PAYMENT_REQUIRED",
      "http_status": 402,
      "id": "gemini.payment_required",
      "likely_owner": "caller",
      "meaning": "The prepaid credit balance is depleted.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "PAYMENT_REQUIRED"
    },
    {
      "aliases": [
        "permission_denied"
      ],
      "checked_on": "2026-09-28",
      "code": "PERMISSION_DENIED",
      "default_for_status": true,
      "diagnosis": "FORBIDDEN",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check key restrictions and project access.",
        "Authenticate correctly for tuned models."
      ],
      "grpc_status": "PERMISSION_DENIED",
      "http_status": 403,
      "id": "gemini.permission_denied",
      "likely_owner": "caller",
      "meaning": "The API key does not have permission for this resource (for example a tuned model it does not own).",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "PERMISSION_DENIED"
    },
    {
      "aliases": [
        "not_found",
        "model_not_found"
      ],
      "checked_on": "2026-09-28",
      "code": "NOT_FOUND",
      "default_for_status": true,
      "diagnosis": "NOT_FOUND",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the model name and API version (v1 vs v1beta).",
        "Use an available model and retry once."
      ],
      "grpc_status": "NOT_FOUND",
      "http_status": 404,
      "id": "gemini.not_found",
      "likely_owner": "caller",
      "meaning": "The requested resource (model, file, cached content) was not found.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "NOT_FOUND"
    },
    {
      "aliases": [
        "aborted"
      ],
      "checked_on": "2026-09-28",
      "code": "ABORTED",
      "default_for_status": true,
      "diagnosis": null,
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Re-read state and retry."
      ],
      "grpc_status": "ABORTED",
      "http_status": 409,
      "id": "gemini.aborted",
      "likely_owner": "caller",
      "meaning": "The operation was aborted due to a conflict or concurrency check failure.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Retry at the application level with backoff (1 s base, 30 s cap, 3 attempts).",
      "retryable": true,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "ABORTED"
    },
    {
      "aliases": [
        "already_exists"
      ],
      "checked_on": "2026-09-28",
      "code": "ALREADY_EXISTS",
      "diagnosis": "CONFLICT",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check whether the resource exists before creating it."
      ],
      "grpc_status": "ALREADY_EXISTS",
      "http_status": 409,
      "id": "gemini.already_exists",
      "likely_owner": "caller",
      "meaning": "The entity to create already exists.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "ALREADY_EXISTS"
    },
    {
      "aliases": [
        "rate_limit_exceeded",
        "too_many_requests"
      ],
      "checked_on": "2026-09-28",
      "code": "RESOURCE_EXHAUSTED",
      "default_for_status": true,
      "diagnosis": "RATE_LIMITED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Back off exponentially with jitter.",
        "Check the rate limits for the model and tier; request an increase if sustained."
      ],
      "grpc_status": "RESOURCE_EXHAUSTED",
      "http_status": 429,
      "id": "gemini.resource_exhausted",
      "likely_owner": "caller",
      "meaning": "Per-minute/per-second request or token rate limits exceeded.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Honour Retry-After when present (give up automatically if it exceeds 300 s); otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts.",
      "retryable": true,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "RESOURCE_EXHAUSTED"
    },
    {
      "checked_on": "2026-09-28",
      "code": "quota_exceeded",
      "diagnosis": "QUOTA_EXHAUSTED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Wait for the daily reset.",
        "Request a quota increase or move to a paid tier."
      ],
      "http_status": 429,
      "id": "gemini.quota_exceeded",
      "likely_owner": "caller",
      "meaning": "The daily quota is exhausted; retrying before the reset will keep failing.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Not transient within the day: wait for the quota reset or request an increase.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors"
    },
    {
      "aliases": [
        "cancelled"
      ],
      "checked_on": "2026-09-28",
      "code": "CANCELLED",
      "default_for_status": true,
      "diagnosis": null,
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check client-side cancellation and deadlines."
      ],
      "grpc_status": "CANCELLED",
      "http_status": 499,
      "id": "gemini.cancelled",
      "likely_owner": "caller",
      "meaning": "The client cancelled the request before completion.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "No action; the client disconnected or its deadline passed.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "CANCELLED"
    },
    {
      "aliases": [
        "api_error",
        "UNKNOWN"
      ],
      "checked_on": "2026-09-28",
      "code": "INTERNAL",
      "default_for_status": true,
      "diagnosis": "SUPPLIER_SERVER_ERROR",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Retry with backoff.",
        "Reduce input context or switch model temporarily if it persists."
      ],
      "grpc_status": "INTERNAL",
      "http_status": 500,
      "id": "gemini.internal",
      "likely_owner": "supplier",
      "meaning": "An unexpected error occurred on Google's side (sometimes triggered by very long input context).",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Retry with exponential backoff and full jitter (1 s base, 30 s cap, 3 attempts); idempotent calls or calls with an idempotency key only.",
      "retryable": true,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "INTERNAL"
    },
    {
      "aliases": [
        "unimplemented",
        "NOT_IMPLEMENTED"
      ],
      "checked_on": "2026-09-28",
      "code": "UNIMPLEMENTED",
      "default_for_status": true,
      "diagnosis": "NOT_IMPLEMENTED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check model capabilities; use a supported alternative."
      ],
      "grpc_status": "UNIMPLEMENTED",
      "http_status": 501,
      "id": "gemini.unimplemented",
      "likely_owner": "supplier",
      "meaning": "The operation or feature is not implemented or supported.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "UNIMPLEMENTED"
    },
    {
      "aliases": [
        "service_unavailable"
      ],
      "checked_on": "2026-09-28",
      "code": "UNAVAILABLE",
      "default_for_status": true,
      "diagnosis": "PROVIDER_OVERLOADED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Back off and retry.",
        "Switch temporarily to another model if urgent."
      ],
      "grpc_status": "UNAVAILABLE",
      "http_status": 503,
      "id": "gemini.unavailable",
      "likely_owner": "supplier",
      "meaning": "The service is temporarily overloaded or down.",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Transient capacity problem: honour Retry-After if present, otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts; ramp traffic back gradually.",
      "retryable": true,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "UNAVAILABLE"
    },
    {
      "aliases": [
        "deadline_exceeded"
      ],
      "checked_on": "2026-09-28",
      "code": "DEADLINE_EXCEEDED",
      "default_for_status": true,
      "diagnosis": "GATEWAY_TIMEOUT",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Increase the client timeout/deadline.",
        "Reduce prompt or context size."
      ],
      "grpc_status": "DEADLINE_EXCEEDED",
      "http_status": 504,
      "id": "gemini.deadline_exceeded",
      "likely_owner": "supplier",
      "meaning": "The request did not finish within the deadline (prompt or context too large for the deadline).",
      "note": "google.rpc status names per Google API design guidance; snake_case codes per the Gemini API errors page.",
      "provider": "GOOGLE_GEMINI",
      "retry_guidance": "Retry once with a larger client deadline; reduce input size.",
      "retryable": true,
      "spec_url": "https://ai.google.dev/gemini-api/docs/api-errors",
      "type": "DEADLINE_EXCEEDED"
    },
    {
      "checked_on": "2026-09-28",
      "code": "API_KEY_INVALID",
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the key value and that it is for the Generative Language API.",
        "Create a new key and retry once."
      ],
      "http_status": 400,
      "id": "gemini.api_key_invalid",
      "likely_owner": "caller",
      "meaning": "API key not valid: Gemini answers 400 INVALID_ARGUMENT (reason API_KEY_INVALID) for a bad key.",
      "message_patterns": [
        "api key not valid",
        "API_KEY_INVALID"
      ],
      "provider": "GOOGLE_GEMINI",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/troubleshooting",
      "type": "INVALID_ARGUMENT"
    },
    {
      "checked_on": "2026-09-28",
      "code": "INVALID_ARGUMENT: input token count exceeds maximum",
      "diagnosis": "CONTEXT_LENGTH_EXCEEDED",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Count tokens (models.countTokens) before sending.",
        "Trim input or use context caching / a larger-context model."
      ],
      "http_status": 400,
      "id": "gemini.input_token_limit",
      "likely_owner": "caller",
      "meaning": "The input token count exceeds the model's maximum input tokens.",
      "message_patterns": [
        "input token count.{0,40}exceeds the maximum",
        "exceeds the maximum number of tokens allowed"
      ],
      "provider": "GOOGLE_GEMINI",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/troubleshooting",
      "type": "INVALID_ARGUMENT"
    },
    {
      "checked_on": "2026-09-28",
      "code": "FAILED_PRECONDITION: user location not supported",
      "diagnosis": "FORBIDDEN",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the available regions list; do not route around the restriction."
      ],
      "http_status": 400,
      "id": "gemini.user_location",
      "likely_owner": "caller",
      "meaning": "The API is not available in the caller's location (or the free tier is not available there).",
      "message_patterns": [
        "user location is not supported"
      ],
      "provider": "GOOGLE_GEMINI",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://ai.google.dev/gemini-api/docs/troubleshooting",
      "type": "FAILED_PRECONDITION"
    },
    {
      "checked_on": "2026-09-28",
      "code": "text/html",
      "diagnosis": "NON_JSON_RESPONSE",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Check the Content-Type header and first bytes of the body.",
        "Call the endpoint declared in the agent card, MCP remotes or OpenAPI servers, not the homepage.",
        "Send Accept: application/json and retry once."
      ],
      "http_status": 200,
      "id": "pattern.non_json_html_body",
      "likely_owner": "caller",
      "meaning": "The response body is an HTML page (or plain text), not JSON: the URL points at a website, login, docs or proxy/CDN error page rather than the JSON API.",
      "message_patterns": [
        "<!doctype html",
        "<html",
        "unexpected token '?<'?",
        "unexpected token < in json",
        "\\btext/html\\b",
        "returned (an )?html",
        "not valid json.{0,60}<"
      ],
      "provider": "HTTP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-8.3",
      "type": "HTML or text body where JSON was expected"
    },
    {
      "checked_on": "2026-09-28",
      "code": "content-type-mismatch",
      "diagnosis": "RESPONSE_CONTENT_TYPE_MISMATCH",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Record the Content-Type header and whether the body parses as JSON.",
        "Ask the supplier to send application/json for JSON bodies.",
        "Retry once after the fix."
      ],
      "http_status": 200,
      "id": "pattern.response_content_type_mismatch",
      "likely_owner": "supplier",
      "meaning": "The response Content-Type does not match the media type the protocol requires (application/json for JSON-RPC replies), so strict clients refuse the body.",
      "message_patterns": [
        "content[- ]type mismatch",
        "unexpected content[- ]type",
        "invalid content[- ]type",
        "wrong content[- ]type",
        "expected (content[- ]type )?(an? )?application/json.{0,60}(got|but|received|instead)",
        "mime ?type mismatch"
      ],
      "provider": "HTTP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-8.3",
      "type": "Response Content-Type mismatch"
    },
    {
      "checked_on": "2026-09-28",
      "code": "text/event-stream",
      "diagnosis": "SSE_WHEN_JSON_EXPECTED",
      "evidence": "SPEC",
      "family": "MCP",
      "fix_steps": [
        "Send Accept: application/json, text/event-stream on MCP POST requests.",
        "Parse each data: line as a JSON-RPC message and pick the one with your request id.",
        "For A2A use message/send unless you consume message/stream."
      ],
      "http_status": 200,
      "id": "pattern.sse_when_json_expected",
      "likely_owner": "caller",
      "meaning": "The server replied with an SSE stream. MCP Streamable HTTP servers may answer a POST with text/event-stream; the JSON-RPC reply is inside the data: lines.",
      "message_patterns": [
        "text/event-stream",
        "server-sent events",
        "\\bsse\\b",
        "(^|\\n)\\s*event:\\s*message",
        "(^|\\n)\\s*data:\\s*\\{"
      ],
      "provider": "HTTP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/basic/transports",
      "type": "Server-Sent Events stream where JSON was expected"
    },
    {
      "checked_on": "2026-09-28",
      "code": "result.artifacts",
      "diagnosis": "A2A_RESULT_ARTIFACTS_MISSING",
      "evidence": "SPEC",
      "family": "A2A",
      "fix_steps": [
        "Check result.kind: message replies carry output in parts.",
        "For tasks in submitted/working, poll tasks/get with the task id; do not resend message/send.",
        "For completed tasks without artifacts, read status.message.parts."
      ],
      "http_status": 200,
      "id": "pattern.a2a_result_artifacts_missing",
      "likely_owner": "caller",
      "meaning": "A successful A2A reply carries no result.artifacts: the reply is a Message (output in parts), the task is still submitted/working, or the output is in status.message.",
      "message_patterns": [
        "result\\.artifacts",
        "(missing|no|empty) artifacts",
        "artifacts (is|are|was|were) (missing|undefined|empty|null)",
        "reading 'artifacts'"
      ],
      "provider": "JSON_RPC",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://a2a-protocol.org/latest/specification/",
      "type": "A2A result without artifacts"
    },
    {
      "checked_on": "2026-09-28",
      "code": "cors-preflight",
      "diagnosis": "CORS_PREFLIGHT_FAILED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Confirm the same request works server-side (no CORS in non-browser clients).",
        "Call from your backend, or ask the supplier to allow your origin, method and headers in the preflight response.",
        "Retry once after the change."
      ],
      "id": "pattern.cors_preflight_failed",
      "likely_owner": "supplier",
      "meaning": "A browser refused the call because the server's OPTIONS preflight did not allow the origin, method or headers. Server-side callers are not subject to CORS.",
      "message_patterns": [
        "blocked by cors policy",
        "cors (preflight|error|request did not succeed|policy)",
        "preflight (request|response)",
        "no ['\"]?access-control-allow-origin"
      ],
      "provider": "HTTP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://fetch.spec.whatwg.org/#http-cors-protocol",
      "type": "Browser CORS preflight failure"
    },
    {
      "checked_on": "2026-09-28",
      "code": "www-authenticate",
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Read the scheme and parameters (realm, scope, error, resource_metadata).",
        "Fetch resource_metadata when present to find the authorization server.",
        "Obtain a token through the documented flow (outside GAIP) and retry once."
      ],
      "http_status": 401,
      "id": "pattern.www_authenticate_challenge",
      "likely_owner": "caller",
      "meaning": "The server named the authentication scheme it expects in WWW-Authenticate; OAuth-protected MCP servers add resource_metadata (RFC 9728) pointing at the authorization server.",
      "message_patterns": [
        "www-authenticate",
        "resource_metadata="
      ],
      "provider": "HTTP",
      "requires_pattern": true,
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-11.6.1",
      "type": "WWW-Authenticate challenge"
    },
    {
      "checked_on": "2026-09-28",
      "code": "method-not-found-text",
      "diagnosis": "JSONRPC_METHOD_NOT_FOUND",
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Compare the method name with the protocol version the server declares.",
        "Check for a renamed method between protocol versions.",
        "Resend once with the supported method."
      ],
      "id": "pattern.jsonrpc_method_not_found_text",
      "likely_owner": "caller",
      "meaning": "Plain-text variants of JSON-RPC -32601: the server does not implement the method name sent (e.g. tools/call vs tools.call, message/send vs tasks/send).",
      "message_patterns": [
        "unknown method",
        "unsupported method",
        "unrecogni[sz]ed method",
        "no handler (registered )?for",
        "method ['\"]?[\\w/.-]{1,60}['\"]? (is )?not (found|supported|implemented|available)"
      ],
      "provider": "JSON_RPC",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Method not found (text variants)"
    },
    {
      "checked_on": "2026-09-28",
      "code": "invalid-params-text",
      "diagnosis": "JSONRPC_INVALID_PARAMS",
      "evidence": "SPEC",
      "family": "JSON_RPC",
      "fix_steps": [
        "Read the tool's inputSchema (tools/list) or the skill's documented input.",
        "Add missing required fields and correct types.",
        "Resend once."
      ],
      "id": "pattern.jsonrpc_invalid_params_text",
      "likely_owner": "caller",
      "meaning": "Plain-text variants of JSON-RPC -32602: the arguments do not match the method's (or MCP tool's inputSchema) required fields or types.",
      "message_patterns": [
        "invalid (tool )?arguments?",
        "missing required (argument|param(eter)?|property)",
        "required (argument|param(eter)?|property) ['\"]?\\w+['\"]? (is )?missing",
        "unexpected (argument|param(eter)?)",
        "arguments? (failed|did not pass) validation"
      ],
      "provider": "JSON_RPC",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://www.jsonrpc.org/specification#error_object",
      "type": "Invalid params (text variants)"
    },
    {
      "checked_on": "2026-09-28",
      "code": "client-timeout",
      "diagnosis": "TIMEOUT",
      "evidence": "SPEC",
      "family": "HTTP",
      "fix_steps": [
        "Record the client timeout and the server's documented latency.",
        "Retry once with a longer timeout.",
        "For long tasks, use asynchronous submit-and-poll (A2A tasks/get)."
      ],
      "id": "pattern.client_timeout_text",
      "likely_owner": "network",
      "meaning": "The client stopped waiting before the server answered (read/socket timeout, AbortSignal timeout).",
      "message_patterns": [
        "read ?timeout",
        "esockettimedout",
        "request took too long",
        "aborted due to timeout",
        "no response (received )?within"
      ],
      "provider": "HTTP",
      "requires_pattern": true,
      "retry_guidance": "Retry once with a longer timeout; prefer asynchronous submit-and-poll for long tasks.",
      "retryable": true,
      "spec_url": "https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.9",
      "type": "Client-side timeout (text variants)"
    },
    {
      "checked_on": "2026-10-01",
      "code": "ThrottlingException",
      "default_for_status": true,
      "diagnosis": "RATE_LIMITED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Back off exponentially with jitter; keep the AWS SDK's built-in retries enabled.",
        "Check the model's requests-per-minute and tokens-per-minute quotas in Service Quotas for this region.",
        "If sustained, request a quota increase or spread load (e.g. a cross-region inference profile)."
      ],
      "http_status": 429,
      "id": "bedrock.throttling",
      "likely_owner": "caller",
      "meaning": "The request was denied because it exceeded the account's Amazon Bedrock quotas (requests or tokens per minute).",
      "message_patterns": [
        "\\bthrottlingexception\\b",
        "too many (requests|tokens),? please wait before trying again"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Honour Retry-After when present (give up automatically if it exceeds 300 s); otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts. The AWS SDKs already retry this error in their standard retry mode.",
      "retryable": true,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "ModelNotReadyException",
      "diagnosis": "SERVICE_UNAVAILABLE",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Keep SDK retries enabled and retry with backoff.",
        "If it persists, confirm the model (or imported / provisioned model) is active in this region."
      ],
      "http_status": 429,
      "id": "bedrock.model_not_ready",
      "likely_owner": "supplier",
      "meaning": "The model named in the request is not ready to serve inference requests yet.",
      "message_patterns": [
        "\\bmodelnotreadyexception\\b",
        "model .{0,80}is not ready to serve inference requests"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Retry with exponential backoff; the AWS SDK retries this error automatically (up to 5 times per the API reference).",
      "retryable": true,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "aliases": [
        "validationexception"
      ],
      "checked_on": "2026-10-01",
      "code": "ValidationException: Input is too long for requested model",
      "diagnosis": "CONTEXT_LENGTH_EXCEEDED",
      "evidence": "OBSERVED_API_RESPONSE",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Shorten the input or lower the maximum output tokens.",
        "Split the task or choose a model with a larger context window."
      ],
      "http_status": 400,
      "id": "bedrock.input_too_long",
      "likely_owner": "caller",
      "meaning": "The prompt (plus requested output tokens) is longer than the model's context window.",
      "message_patterns": [
        "input is too long for requested model"
      ],
      "provider": "AWS_BEDROCK",
      "requires_pattern": true,
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html",
      "type": "ValidationException"
    },
    {
      "checked_on": "2026-10-01",
      "code": "ValidationException",
      "diagnosis": "VALIDATION_FAILED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the modelId (or inference profile id) is valid for this region.",
        "Check the request body against the model's native format or the Converse API schema.",
        "Resend once after the fix."
      ],
      "http_status": 400,
      "id": "bedrock.validation",
      "likely_owner": "caller",
      "meaning": "The input fails to satisfy the constraints specified by Amazon Bedrock (e.g. an invalid model id, body shape or inference parameter for that model).",
      "message_patterns": [
        "\\bvalidationexception\\b"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "AccessDeniedException",
      "default_for_status": true,
      "diagnosis": "FORBIDDEN",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Allow the action (e.g. bedrock:InvokeModel) on the model or inference profile ARN in the IAM policy.",
        "Enable access to the model for the account in the Amazon Bedrock console (Model access) for this region.",
        "Resend once after the fix."
      ],
      "http_status": 403,
      "id": "bedrock.access_denied",
      "likely_owner": "caller",
      "meaning": "The caller does not have sufficient permissions: IAM does not allow the action, or access to the model has not been enabled for the account in this region.",
      "message_patterns": [
        "\\baccessdeniedexception\\b",
        "(do not|don't) have access to the model with the specified model id"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "ServiceQuotaExceededException",
      "diagnosis": "QUOTA_EXHAUSTED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "View the Amazon Bedrock quotas for the account in Service Quotas.",
        "Request an increase if the workload needs it."
      ],
      "http_status": 400,
      "id": "bedrock.service_quota_exceeded",
      "likely_owner": "caller",
      "meaning": "The request exceeds a service quota for the account.",
      "message_patterns": [
        "\\bservicequotaexceededexception\\b"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Do not retry automatically; resubmit later or after the quota is raised.",
      "retryable": false,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "ResourceNotFoundException",
      "default_for_status": true,
      "diagnosis": "NOT_FOUND",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Check the model id or ARN and the region the client is configured for."
      ],
      "http_status": 404,
      "id": "bedrock.resource_not_found",
      "likely_owner": "caller",
      "meaning": "The specified resource (model id or ARN) was not found.",
      "message_patterns": [
        "\\bresourcenotfoundexception\\b"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "ModelTimeoutException",
      "default_for_status": true,
      "diagnosis": "REQUEST_TIMEOUT",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Retry once.",
        "Reduce input size or maximum output tokens, or use the streaming API."
      ],
      "http_status": 408,
      "id": "bedrock.model_timeout",
      "likely_owner": "network",
      "meaning": "Processing took longer than the model timeout.",
      "message_patterns": [
        "\\bmodeltimeoutexception\\b"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Retry once with backoff; if it repeats, reduce the work per request.",
      "retryable": true,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "ServiceUnavailableException",
      "default_for_status": true,
      "diagnosis": "SERVICE_UNAVAILABLE",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Retry with backoff.",
        "Check the AWS Health Dashboard for the region if it persists."
      ],
      "http_status": 503,
      "id": "bedrock.service_unavailable",
      "likely_owner": "supplier",
      "meaning": "The service is not currently available.",
      "message_patterns": [
        "\\bserviceunavailableexception\\b"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Retry with exponential backoff and jitter (the AWS SDKs retry this automatically).",
      "retryable": true,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "InternalServerException",
      "default_for_status": true,
      "diagnosis": "SUPPLIER_SERVER_ERROR",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Retry with backoff.",
        "If it persists, report it to AWS Support with the request id."
      ],
      "http_status": 500,
      "id": "bedrock.internal_server",
      "likely_owner": "supplier",
      "meaning": "An internal server error occurred in the service.",
      "message_patterns": [
        "\\binternalserverexception\\b"
      ],
      "provider": "AWS_BEDROCK",
      "retry_guidance": "Retry with exponential backoff and jitter, at most a few attempts.",
      "retryable": true,
      "spec_url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "checked_on": "2026-10-01",
      "code": "429 rate limit exceeded",
      "default_for_status": true,
      "diagnosis": "RATE_LIMITED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Honour retry-after-ms / retry-after; keep the SDK's retries enabled.",
        "Lower max_tokens to what you need (the estimate counts towards the limit).",
        "Raise the deployment's TPM quota or spread load across deployments or regions."
      ],
      "http_status": 429,
      "id": "azure_openai.rate_limit",
      "likely_owner": "caller",
      "meaning": "The deployment's tokens-per-minute or requests-per-minute rate limit was exceeded.",
      "message_patterns": [
        "exceeded (the )?(token|call|request)s? rate limit"
      ],
      "provider": "AZURE_OPENAI",
      "retry_guidance": "Wait for the retry-after-ms header (milliseconds) or retry-after (seconds) before retrying; GAIP converts retry-after-ms to seconds. Without either, back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts.",
      "retryable": true,
      "spec_url": "https://learn.microsoft.com/en-us/azure/ai-services/openai/quotas-limits"
    },
    {
      "aliases": [
        "responsibleaipolicyviolation"
      ],
      "checked_on": "2026-10-01",
      "code": "content_filter",
      "diagnosis": "BAD_REQUEST",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Read the content filter results in the error (innererror.content_filter_result) to see which category triggered.",
        "Rephrase the input, or review the content filter configuration for the deployment.",
        "For completions, handle finish_reason 'content_filter'."
      ],
      "http_status": 400,
      "id": "azure_openai.content_filter",
      "likely_owner": "caller",
      "meaning": "The prompt (or the completion) was filtered by the Azure OpenAI content filtering system.",
      "message_patterns": [
        "content management policy",
        "\\bResponsibleAIPolicyViolation\\b"
      ],
      "provider": "AZURE_OPENAI",
      "retry_guidance": "Do not resend the same prompt; it will be filtered again.",
      "retryable": false,
      "spec_url": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/content-filter"
    },
    {
      "checked_on": "2026-10-01",
      "code": "DeploymentNotFound",
      "diagnosis": "NOT_FOUND",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Use the deployment name (not the model name) in /openai/deployments/{deployment-id}.",
        "Check the resource endpoint and api-version.",
        "If just created, wait about 5 minutes, then send once."
      ],
      "http_status": 404,
      "id": "azure_openai.deployment_not_found",
      "likely_owner": "caller",
      "meaning": "The API deployment for this resource does not exist: the deployment name in the URL is wrong, or it was created only minutes ago.",
      "message_patterns": [
        "\\bdeploymentnotfound\\b",
        "api deployment for this resource does not exist"
      ],
      "provider": "AZURE_OPENAI",
      "retry_guidance": "Do not retry automatically; if the deployment was created in the last few minutes, wait and send once more.",
      "retryable": false,
      "spec_url": "https://learn.microsoft.com/en-us/azure/ai-services/openai/reference"
    },
    {
      "checked_on": "2026-10-01",
      "code": "401 Unauthorized",
      "default_for_status": true,
      "diagnosis": "AUTH_REQUIRED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Send the key as Authorization: Bearer <key>.",
        "Check the key in the Mistral console; create a new one if needed.",
        "Retry once."
      ],
      "http_status": 401,
      "id": "mistral.401",
      "likely_owner": "caller",
      "meaning": "The API key is missing, invalid or revoked.",
      "provider": "MISTRAL",
      "retry_guidance": "Retry once only after the listed fix is applied.",
      "retryable": false,
      "spec_url": "https://docs.mistral.ai/api/"
    },
    {
      "checked_on": "2026-10-01",
      "code": "422 Unprocessable Entity",
      "default_for_status": true,
      "diagnosis": "VALIDATION_FAILED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Read the field locations and messages in the error body.",
        "Fix the request against the API reference and send once."
      ],
      "http_status": 422,
      "id": "mistral.422",
      "likely_owner": "caller",
      "meaning": "The request body failed validation (e.g. a missing required field such as model or messages, or a wrong type); the body lists each failing field.",
      "provider": "MISTRAL",
      "retry_guidance": "Do not resend the same request; fix the cause first, then send once.",
      "retryable": false,
      "spec_url": "https://docs.mistral.ai/api/"
    },
    {
      "checked_on": "2026-10-01",
      "code": "429 Too Many Requests",
      "default_for_status": true,
      "diagnosis": "RATE_LIMITED",
      "evidence": "PROVIDER_DOCS",
      "family": "LLM_PROVIDER",
      "fix_steps": [
        "Back off exponentially with jitter.",
        "Check the workspace limits for your tier; request higher limits if sustained."
      ],
      "http_status": 429,
      "id": "mistral.429",
      "likely_owner": "caller",
      "meaning": "A rate limit for the workspace (requests or tokens per time window) was exceeded.",
      "provider": "MISTRAL",
      "retry_guidance": "Honour Retry-After when present (give up automatically if it exceeds 300 s); otherwise back off exponentially with jitter from 2 s (cap 60 s), at most 4 attempts.",
      "retryable": true,
      "spec_url": "https://docs.mistral.ai/api/"
    }
  ],
  "entry_count": 136,
  "fields": {
    "code": "Error code or type as the source publishes it.",
    "default_for_status": "Entry may match on HTTP status alone once the provider is known.",
    "diagnosis": "GAIP Integration Repair diagnosis this entry maps to (null keeps the status-based diagnosis).",
    "evidence": "SPEC | PROVIDER_DOCS | SDK_SOURCE | OBSERVED_API_RESPONSE (message text seen in published API responses).",
    "fix_steps": "Ordered steps to fix.",
    "likely_owner": "caller | supplier | network: who most likely has to act.",
    "meaning": "What the error means.",
    "message_patterns": "Case-insensitive regular expressions matched against the error text.",
    "requires_pattern": "Entry only matches when a message pattern matches.",
    "retry_guidance": "How to retry (or why not).",
    "retryable": "Whether an automatic retry can succeed without a change."
  },
  "governance": {
    "note": "Diagnoses are guidance from public specifications and provider documentation, not a finding of fault.",
    "personal_data": false,
    "public_knowledge_only": true,
    "read_only": true,
    "verdict_for_money": false
  },
  "kb_version": "1.2.0",
  "provider_detection": {
    "A2A / MCP / JSON_RPC": "JSON-RPC error object; A2A vs MCP from the declared protocol.",
    "ANTHROPIC": "Body {type: 'error', error: {type, message}} with an Anthropic error type, HTTP 529, or 'anthropic'/'claude' markers.",
    "AWS_BEDROCK": "AWS error names (ThrottlingException, ValidationException, ...) with 'bedrock' / bedrock-runtime markers or the SDK's 'when calling the InvokeModel / Converse operation' text; a hosting-platform marker wins over the model vendor's name.",
    "AZURE_OPENAI": "OpenAI-shaped bodies with openai.azure.com / cognitiveservices.azure.com, 'Azure OpenAI', DeploymentNotFound or ResponsibleAIPolicyViolation markers; OpenAI entries also apply.",
    "GOOGLE_GEMINI": "Body {error: {code: <int>, message, status: <google.rpc status>}}, generativelanguage.googleapis.com/gemini markers.",
    "HTTP": "HTTP status only.",
    "MISTRAL": "api.mistral.ai or 'mistral' markers; entries match on HTTP status once the provider is known.",
    "OPENAI": "Body {error: {message, type, param, code}} (the 'param' member), OpenAI error codes, or 'openai' markers."
  },
  "providers": [
    "A2A",
    "ANTHROPIC",
    "AWS_BEDROCK",
    "AZURE_OPENAI",
    "GOOGLE_GEMINI",
    "HTTP",
    "JSON_RPC",
    "MCP",
    "MISTRAL",
    "OPENAI"
  ],
  "schema_version": "gaip.error-kb.v1",
  "sources": [
    {
      "title": "RFC 9110 HTTP Semantics",
      "url": "https://www.rfc-editor.org/rfc/rfc9110.html"
    },
    {
      "title": "RFC 6585 Additional HTTP Status Codes",
      "url": "https://www.rfc-editor.org/rfc/rfc6585.html"
    },
    {
      "title": "RFC 9457 Problem Details for HTTP APIs",
      "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
    },
    {
      "title": "RFC 8470 Using Early Data in HTTP",
      "url": "https://www.rfc-editor.org/rfc/rfc8470.html"
    },
    {
      "title": "RFC 7725 HTTP 451",
      "url": "https://www.rfc-editor.org/rfc/rfc7725.html"
    },
    {
      "title": "RFC 4918 WebDAV (507)",
      "url": "https://www.rfc-editor.org/rfc/rfc4918.html"
    },
    {
      "title": "JSON-RPC 2.0 Specification",
      "url": "https://www.jsonrpc.org/specification"
    },
    {
      "title": "A2A Protocol Specification 1.0.0",
      "url": "https://a2a-protocol.org/latest/specification/"
    },
    {
      "title": "MCP Specification 2025-11-25",
      "url": "https://modelcontextprotocol.io/specification/2025-11-25"
    },
    {
      "title": "MCP TypeScript SDK ErrorCode",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/types.ts"
    },
    {
      "title": "OpenAI API error codes",
      "url": "https://developers.openai.com/api/docs/guides/error-codes"
    },
    {
      "title": "Claude API errors",
      "url": "https://platform.claude.com/docs/en/api/errors"
    },
    {
      "title": "Gemini API errors",
      "url": "https://ai.google.dev/gemini-api/docs/api-errors"
    },
    {
      "title": "Gemini API troubleshooting",
      "url": "https://ai.google.dev/gemini-api/docs/troubleshooting"
    },
    {
      "title": "Google AIP-193 Errors",
      "url": "https://google.aip.dev/193"
    },
    {
      "title": "google.rpc.Code definitions",
      "url": "https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto"
    },
    {
      "title": "Amazon Bedrock InvokeModel API reference (errors)",
      "url": "https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"
    },
    {
      "title": "Amazon Bedrock quotas",
      "url": "https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html"
    },
    {
      "title": "Azure OpenAI quotas and limits",
      "url": "https://learn.microsoft.com/en-us/azure/ai-services/openai/quotas-limits"
    },
    {
      "title": "Azure OpenAI content filtering",
      "url": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/content-filter"
    },
    {
      "title": "Azure OpenAI REST API reference",
      "url": "https://learn.microsoft.com/en-us/azure/ai-services/openai/reference"
    },
    {
      "title": "Mistral AI API reference",
      "url": "https://docs.mistral.ai/api/"
    }
  ]
}