#[derive(Debug, Clone, thiserror::Error, PartialEq, Eq)]
pub enum VerifyError {
#[error("invalid bearer token format")]
InvalidFormat,
#[error("signature verification failed")]
SignatureInvalid,
#[error("token expired")]
Expired,
#[error("issuer invalid (M23)")]
IssuerInvalid,
#[error("audience invalid (M21/M22)")]
AudienceInvalid,
#[error("missing required claim: {0}")]
MissingClaim(&'static str),
#[error("keyset unavailable")]
KeysetUnavailable,
#[error("session_version stale (engine epoch port reject)")]
SessionVersionStale,
#[error("session_version lookup substrate unavailable")]
SessionVersionLookupUnavailable,
#[error("session revoked")]
SessionRevoked,
#[error("session liveness lookup substrate unavailable")]
SessionLivenessLookupUnavailable,
#[error("M73: id_token presented as Bearer — use access_token for resource access")]
IdTokenAsBearer,
#[error("verification failed: {0}")]
Other(String),
}