#[derive(Debug, thiserror::Error)]
pub enum CalcError {
#[error("invalid input: {0}")]
InvalidInput(String),
#[error("ruleset '{id}' expired on {until}")]
RulesetExpired { id: String, until: String },
#[error("emission factor not found for activity '{0}'")]
FactorNotFound(String),
#[error("methodology mismatch: {0}")]
MethodologyMismatch(String),
#[error("not implemented: {methodology} — {reason}")]
NotImplemented { methodology: String, reason: String },
#[error("cross-field validation failed: {0}")]
CrossFieldViolation(String),
#[error("canonicalization error: {0}")]
CanonicalizeError(String),
}