use crate::calibration::{
CalibrationManifest, Phase4Config, CalibrationSample, CrossLanguageMetrics,
IntegrityStatus, ValidationResult, ConfigurationFingerprint,
};
use anyhow::{Context, Result, bail};
use chrono::{DateTime, Utc, Duration};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fmt;
use tracing::{info, warn, error, debug};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GovernanceConfig {
pub enable_sla_enforcement: bool,
pub ece_threshold_params: EceThresholdParams,
pub language_variance_limits: LanguageVarianceLimits,
pub compatibility_settings: CompatibilitySettings,
pub ieee754_settings: Ieee754Settings,
pub monitoring_config: MonitoringConfig,
pub violation_escalation: ViolationEscalationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EceThresholdParams {
pub base_ece_requirement: f32,
pub empirical_constant: f32,
pub default_bin_count: usize,
pub min_sample_count: usize,
pub max_allowed_ece: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LanguageVarianceLimits {
pub max_tier1_variance_pp: f32,
pub max_tier2_variance_pp: f32,
pub max_individual_language_ece_multiplier: f32,
pub min_languages_for_variance: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompatibilitySettings {
pub enable_version_checking: bool,
pub supported_manifest_versions: Vec<String>,
pub supported_phase4_versions: Vec<String>,
pub required_dependencies: HashMap<String, String>,
pub enable_breaking_change_detection: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Ieee754Settings {
pub enable_strict_compliance: bool,
pub detect_fast_math: bool,
pub enable_denormal_handling: bool,
pub precision_requirements: PrecisionRequirements,
pub special_values_handling: SpecialValuesHandling,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PrecisionRequirements {
pub ece_precision: u8,
pub score_precision: u8,
pub confidence_precision: u8,
pub numerical_tolerance: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecialValuesHandling {
pub nan_handling: NanHandling,
pub infinity_handling: InfinityHandling,
pub detect_subnormals: bool,
pub max_relative_error: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NanHandling {
Reject,
ReplaceWithNeutral,
ReplaceWith(f32),
Allow,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum InfinityHandling {
Reject,
Clamp { min: f32, max: f32 },
Replace { pos_inf: f32, neg_inf: f32 },
Allow,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MonitoringConfig {
pub enable_realtime_monitoring: bool,
pub check_interval_seconds: u64,
pub violation_tracking_days: u32,
pub alert_thresholds: AlertThresholds,
pub enable_automated_reports: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertThresholds {
pub ece_violations: SeverityThresholds,
pub variance_violations: SeverityThresholds,
pub compatibility_violations: SeverityThresholds,
pub ieee754_violations: SeverityThresholds,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SeverityThresholds {
pub warning: f32,
pub critical: f32,
pub emergency: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ViolationEscalationConfig {
pub enable_auto_escalation: bool,
pub escalation_levels: Vec<EscalationLevel>,
pub max_violations_before_emergency: u32,
pub alert_cooldown_minutes: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EscalationLevel {
pub level: String,
pub violation_threshold: u32,
pub time_window_hours: u32,
pub actions: Vec<EscalationAction>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum EscalationAction {
Alert { message: String, severity: AlertSeverity },
StopCalibration,
RevertConfiguration,
EmergencyProcedure { procedure: String },
LogViolation { details: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AlertSeverity {
Info,
Warning,
Critical,
Emergency,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplianceResult {
pub compliant: bool,
pub checked_at: DateTime<Utc>,
pub checks: Vec<ComplianceCheck>,
pub violations: Vec<ComplianceViolation>,
pub compliance_score: f32,
pub next_check_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplianceCheck {
pub name: String,
pub check_type: ComplianceCheckType,
pub passed: bool,
pub checked_at: DateTime<Utc>,
pub measured_value: Option<f32>,
pub expected_value: Option<f32>,
pub details: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ComplianceCheckType {
EceThreshold,
LanguageVariance,
ConfigurationCompatibility,
Ieee754Compliance,
ManifestIntegrity,
SlaEnforcement,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplianceViolation {
pub violation_id: String,
pub violation_type: ViolationType,
pub severity: ViolationSeverity,
pub detected_at: DateTime<Utc>,
pub description: String,
pub measured_value: f32,
pub threshold_value: f32,
pub context: HashMap<String, serde_json::Value>,
pub remediation: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ViolationType {
EceThresholdExceeded,
LanguageVarianceExceeded,
UnsupportedConfigurationVersion,
Ieee754NonCompliance,
ManifestIntegrityCompromise,
SlaViolation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ViolationSeverity {
Low,
Medium,
High,
Critical,
Emergency,
}
pub struct CalibrationGovernance {
config: GovernanceConfig,
violation_history: Vec<ComplianceViolation>,
last_compliance_result: Option<ComplianceResult>,
active_alerts: Vec<ActiveAlert>,
}
#[derive(Debug, Clone)]
struct ActiveAlert {
pub alert_id: String,
pub violation_id: String,
pub severity: AlertSeverity,
pub created_at: DateTime<Utc>,
pub escalated: bool,
}
impl CalibrationGovernance {
pub fn new(config: GovernanceConfig) -> Self {
info!("Initializing calibration governance service");
info!("SLA enforcement: {}", config.enable_sla_enforcement);
info!("Base ECE requirement: {:.4}", config.ece_threshold_params.base_ece_requirement);
info!("Empirical constant ĉ: {:.2}", config.ece_threshold_params.empirical_constant);
info!("Max Tier-1 variance: {:.1}pp", config.language_variance_limits.max_tier1_variance_pp);
info!("IEEE-754 strict compliance: {}", config.ieee754_settings.enable_strict_compliance);
Self {
config,
violation_history: Vec::new(),
last_compliance_result: None,
active_alerts: Vec::new(),
}
}
pub fn calculate_statistical_ece_threshold(&self, sample_count: usize, bin_count: usize) -> f32 {
if sample_count == 0 {
return self.config.ece_threshold_params.base_ece_requirement;
}
let n = sample_count as f32;
let k = bin_count as f32;
let c_hat = self.config.ece_threshold_params.empirical_constant;
let base_requirement = self.config.ece_threshold_params.base_ece_requirement;
let statistical_floor = c_hat * (k / n).sqrt();
let threshold = statistical_floor.max(base_requirement);
debug!("Statistical ECE threshold: N={}, K={}, ĉ={:.2}, τ={:.4}",
sample_count, bin_count, c_hat, threshold);
threshold.min(self.config.ece_threshold_params.max_allowed_ece)
}
pub fn enforce_sla_requirements(
&mut self,
samples: &[CalibrationSample],
metrics: &CrossLanguageMetrics,
) -> Result<ComplianceResult> {
info!("Enforcing SLA requirements");
info!("Sample count: {}", samples.len());
info!("Overall ECE: {:.4}", metrics.overall_ece);
info!("Tier-1 variance: {:.1}pp", metrics.tier1_variance);
let mut checks = Vec::new();
let mut violations = Vec::new();
let checked_at = Utc::now();
let bin_count = self.config.ece_threshold_params.default_bin_count;
let ece_threshold = self.calculate_statistical_ece_threshold(samples.len(), bin_count);
let ece_compliant = metrics.overall_ece <= ece_threshold;
checks.push(ComplianceCheck {
name: "ECE Threshold Compliance".to_string(),
check_type: ComplianceCheckType::EceThreshold,
passed: ece_compliant,
checked_at,
measured_value: Some(metrics.overall_ece),
expected_value: Some(ece_threshold),
details: format!("ECE {:.4} vs threshold {:.4} (N={}, K={})",
metrics.overall_ece, ece_threshold, samples.len(), bin_count),
});
if !ece_compliant {
let severity = self.determine_ece_violation_severity(metrics.overall_ece, ece_threshold);
violations.push(ComplianceViolation {
violation_id: self.generate_violation_id(),
violation_type: ViolationType::EceThresholdExceeded,
severity,
detected_at: checked_at,
description: format!("ECE {:.4} exceeds statistical threshold {:.4}",
metrics.overall_ece, ece_threshold),
measured_value: metrics.overall_ece,
threshold_value: ece_threshold,
context: HashMap::from_iter(vec![
("sample_count".to_string(), serde_json::Value::Number(samples.len().into())),
("bin_count".to_string(), serde_json::Value::Number(bin_count.into())),
]),
remediation: "Increase calibration training data or adjust model parameters".to_string(),
});
}
let tier1_variance_compliant = metrics.tier1_variance < self.config.language_variance_limits.max_tier1_variance_pp;
checks.push(ComplianceCheck {
name: "Tier-1 Language Variance".to_string(),
check_type: ComplianceCheckType::LanguageVariance,
passed: tier1_variance_compliant,
checked_at,
measured_value: Some(metrics.tier1_variance),
expected_value: Some(self.config.language_variance_limits.max_tier1_variance_pp),
details: format!("Tier-1 variance {:.1}pp vs limit {:.1}pp",
metrics.tier1_variance, self.config.language_variance_limits.max_tier1_variance_pp),
});
if !tier1_variance_compliant {
let severity = self.determine_variance_violation_severity(
metrics.tier1_variance,
self.config.language_variance_limits.max_tier1_variance_pp
);
violations.push(ComplianceViolation {
violation_id: self.generate_violation_id(),
violation_type: ViolationType::LanguageVarianceExceeded,
severity,
detected_at: checked_at,
description: format!("Tier-1 language variance {:.1}pp exceeds limit {:.1}pp",
metrics.tier1_variance,
self.config.language_variance_limits.max_tier1_variance_pp),
measured_value: metrics.tier1_variance,
threshold_value: self.config.language_variance_limits.max_tier1_variance_pp,
context: HashMap::new(),
remediation: "Improve language-specific calibration or collect more training data for underperforming languages".to_string(),
});
}
let max_individual_ece = ece_threshold * self.config.language_variance_limits.max_individual_language_ece_multiplier;
let mut individual_language_compliant = true;
for (language, lang_ece) in &metrics.ece_by_language {
if *lang_ece > max_individual_ece {
individual_language_compliant = false;
violations.push(ComplianceViolation {
violation_id: self.generate_violation_id(),
violation_type: ViolationType::SlaViolation,
severity: ViolationSeverity::High,
detected_at: checked_at,
description: format!("Language {} ECE {:.4} exceeds individual limit {:.4}",
language, lang_ece, max_individual_ece),
measured_value: *lang_ece,
threshold_value: max_individual_ece,
context: HashMap::from_iter(vec![
("language".to_string(), serde_json::Value::String(language.clone())),
]),
remediation: format!("Improve calibration for {} language specifically", language),
});
}
}
checks.push(ComplianceCheck {
name: "Individual Language ECE Bounds".to_string(),
check_type: ComplianceCheckType::SlaEnforcement,
passed: individual_language_compliant,
checked_at,
measured_value: None,
expected_value: Some(max_individual_ece),
details: format!("All languages within {:.4} ECE limit", max_individual_ece),
});
let total_checks = checks.len();
let passed_checks = checks.iter().filter(|c| c.passed).count();
let compliance_score = (passed_checks as f32 / total_checks as f32) * 100.0;
let overall_compliant = violations.is_empty();
let result = ComplianceResult {
compliant: overall_compliant,
checked_at,
checks,
violations: violations.clone(),
compliance_score,
next_check_at: checked_at + Duration::seconds(self.config.monitoring_config.check_interval_seconds as i64),
};
self.violation_history.extend(violations.clone());
self.last_compliance_result = Some(result.clone());
if !violations.is_empty() {
self.handle_violations(&violations)?;
}
if overall_compliant {
info!("✓ SLA requirements fully compliant (score: {:.1}%)", compliance_score);
} else {
warn!("✗ SLA compliance violations detected: {} violations", violations.len());
warn!("Compliance score: {:.1}%", compliance_score);
}
Ok(result)
}
pub fn validate_configuration_compatibility(
&self,
manifest: &CalibrationManifest,
) -> Result<ComplianceCheck> {
info!("Validating configuration compatibility");
let checked_at = Utc::now();
let mut compatibility_issues = Vec::new();
if self.config.compatibility_settings.enable_version_checking {
if !self.config.compatibility_settings.supported_manifest_versions
.contains(&manifest.manifest_version) {
compatibility_issues.push(format!(
"Unsupported manifest version: {} (supported: {:?})",
manifest.manifest_version,
self.config.compatibility_settings.supported_manifest_versions
));
}
}
let phase4_valid = self.validate_phase4_constraints(&manifest.phase4_config);
if !phase4_valid {
compatibility_issues.push("Phase 4 configuration violates contract requirements".to_string());
}
for (dep_name, version_constraint) in &self.config.compatibility_settings.required_dependencies {
let dep_found = manifest.sbom.iter()
.any(|entry| entry.name == *dep_name);
if !dep_found {
compatibility_issues.push(format!("Missing required dependency: {}", dep_name));
}
}
if self.config.compatibility_settings.enable_breaking_change_detection {
let breaking_changes = self.detect_breaking_changes(manifest);
compatibility_issues.extend(breaking_changes);
}
let compatible = compatibility_issues.is_empty();
let details = if compatible {
"All configuration compatibility checks passed".to_string()
} else {
format!("Compatibility issues: {}", compatibility_issues.join("; "))
};
info!("Configuration compatibility: {} (issues: {})",
if compatible { "✓" } else { "✗" }, compatibility_issues.len());
Ok(ComplianceCheck {
name: "Configuration Compatibility".to_string(),
check_type: ComplianceCheckType::ConfigurationCompatibility,
passed: compatible,
checked_at,
measured_value: None,
expected_value: None,
details,
})
}
pub fn enforce_ieee754_compliance(
&self,
samples: &[CalibrationSample],
) -> Result<ComplianceCheck> {
info!("Enforcing IEEE-754 compliance");
info!("Checking {} samples for floating-point compliance", samples.len());
let checked_at = Utc::now();
let mut compliance_issues = Vec::new();
if self.config.ieee754_settings.enable_strict_compliance {
let nan_count = samples.iter()
.filter(|s| s.prediction.is_nan() || s.ground_truth.is_nan())
.count();
if nan_count > 0 {
match self.config.ieee754_settings.special_values_handling.nan_handling {
NanHandling::Reject => {
compliance_issues.push(format!("Found {} NaN values (rejected)", nan_count));
}
_ => {
info!("Found {} NaN values (handled by configured strategy)", nan_count);
}
}
}
let inf_count = samples.iter()
.filter(|s| s.prediction.is_infinite() || s.ground_truth.is_infinite())
.count();
if inf_count > 0 {
match self.config.ieee754_settings.special_values_handling.infinity_handling {
InfinityHandling::Reject => {
compliance_issues.push(format!("Found {} infinite values (rejected)", inf_count));
}
_ => {
info!("Found {} infinite values (handled by configured strategy)", inf_count);
}
}
}
if self.config.ieee754_settings.special_values_handling.detect_subnormals {
let subnormal_count = samples.iter()
.filter(|s| self.is_subnormal(s.prediction) || self.is_subnormal(s.ground_truth))
.count();
if subnormal_count > 0 {
compliance_issues.push(format!("Found {} subnormal values", subnormal_count));
}
}
if self.config.ieee754_settings.detect_fast_math {
if self.detect_fast_math_compilation() {
compliance_issues.push("Fast-math compilation detected - may violate IEEE-754 compliance".to_string());
}
}
}
let compliant = compliance_issues.is_empty();
let details = if compliant {
format!("All {} samples are IEEE-754 compliant", samples.len())
} else {
format!("IEEE-754 compliance issues: {}", compliance_issues.join("; "))
};
info!("IEEE-754 compliance: {} (issues: {})",
if compliant { "✓" } else { "✗" }, compliance_issues.len());
Ok(ComplianceCheck {
name: "IEEE-754 Compliance".to_string(),
check_type: ComplianceCheckType::Ieee754Compliance,
passed: compliant,
checked_at,
measured_value: None,
expected_value: None,
details,
})
}
pub fn validate_comprehensive_compliance(
&mut self,
manifest: &CalibrationManifest,
samples: &[CalibrationSample],
metrics: &CrossLanguageMetrics,
) -> Result<ComplianceResult> {
info!("Performing comprehensive compliance validation");
let mut all_checks = Vec::new();
let mut all_violations = Vec::new();
if self.config.enable_sla_enforcement {
let sla_result = self.enforce_sla_requirements(samples, metrics)?;
all_checks.extend(sla_result.checks);
all_violations.extend(sla_result.violations);
}
let config_check = self.validate_configuration_compatibility(manifest)?;
let config_compliant = config_check.passed;
all_checks.push(config_check);
let ieee754_check = self.enforce_ieee754_compliance(samples)?;
let ieee754_compliant = ieee754_check.passed;
all_checks.push(ieee754_check);
let integrity_check = self.validate_manifest_integrity(manifest)?;
all_checks.push(integrity_check);
let total_checks = all_checks.len();
let passed_checks = all_checks.iter().filter(|c| c.passed).count();
let compliance_score = (passed_checks as f32 / total_checks as f32) * 100.0;
let overall_compliant = all_violations.is_empty() && config_compliant && ieee754_compliant;
let checked_at = Utc::now();
let result = ComplianceResult {
compliant: overall_compliant,
checked_at,
checks: all_checks,
violations: all_violations.clone(),
compliance_score,
next_check_at: checked_at + Duration::seconds(self.config.monitoring_config.check_interval_seconds as i64),
};
self.violation_history.extend(all_violations.clone());
self.last_compliance_result = Some(result.clone());
if !all_violations.is_empty() {
self.handle_violations(&all_violations)?;
}
info!("Comprehensive compliance validation complete");
info!("Overall compliant: {}", overall_compliant);
info!("Compliance score: {:.1}%", compliance_score);
info!("Total checks: {}, passed: {}", total_checks, passed_checks);
info!("Violations detected: {}", all_violations.len());
Ok(result)
}
pub fn get_compliance_history(&self, days: u32) -> Vec<&ComplianceViolation> {
let cutoff = Utc::now() - Duration::days(days as i64);
self.violation_history.iter()
.filter(|v| v.detected_at >= cutoff)
.collect()
}
pub fn generate_compliance_report(&self) -> Result<GovernanceReport> {
info!("Generating compliance report");
let report_time = Utc::now();
let last_30_days_violations = self.get_compliance_history(30);
let violation_stats = ViolationStatistics {
total_violations: self.violation_history.len(),
last_30_days_violations: last_30_days_violations.len(),
critical_violations: self.violation_history.iter()
.filter(|v| matches!(v.severity, ViolationSeverity::Critical | ViolationSeverity::Emergency))
.count(),
resolved_violations: 0, };
let compliance_trends = self.calculate_compliance_trends();
let current_status = if let Some(last_result) = &self.last_compliance_result {
if last_result.compliant {
"COMPLIANT".to_string()
} else {
format!("NON-COMPLIANT ({} violations)", last_result.violations.len())
}
} else {
"UNKNOWN".to_string()
};
let report = GovernanceReport {
generated_at: report_time,
reporting_period_days: 30,
current_compliance_status: current_status,
compliance_score: self.last_compliance_result.as_ref()
.map(|r| r.compliance_score)
.unwrap_or(0.0),
violation_statistics: violation_stats,
compliance_trends,
active_alerts_count: self.active_alerts.len(),
recommendations: self.generate_recommendations(),
};
info!("✓ Compliance report generated");
Ok(report)
}
fn validate_phase4_constraints(&self, config: &Phase4Config) -> bool {
config.target_ece <= 0.015
&& config.max_language_variance < 7.0
&& config.isotonic_slope_clamp == (0.9, 1.1)
}
fn detect_breaking_changes(&self, manifest: &CalibrationManifest) -> Vec<String> {
let mut breaking_changes = Vec::new();
if manifest.manifest_version.starts_with("2.") &&
self.config.compatibility_settings.supported_manifest_versions.iter()
.all(|v| v.starts_with("1.")) {
breaking_changes.push("Major version change detected in manifest format".to_string());
}
if manifest.phase4_config.isotonic_slope_clamp != (0.9, 1.1) {
breaking_changes.push("Isotonic slope clamp changed from contract requirement [0.9, 1.1]".to_string());
}
breaking_changes
}
fn validate_manifest_integrity(&self, manifest: &CalibrationManifest) -> Result<ComplianceCheck> {
let checked_at = Utc::now();
let integrity_valid = matches!(manifest.integrity_status, IntegrityStatus::Valid);
let details = match &manifest.integrity_status {
IntegrityStatus::Valid => "Manifest integrity verified".to_string(),
IntegrityStatus::HashMismatch { mismatched_components } => {
format!("Hash mismatch in components: {}", mismatched_components.join(", "))
}
IntegrityStatus::VersionIncompatible { incompatible_versions } => {
format!("Incompatible versions: {}", incompatible_versions.join(", "))
}
IntegrityStatus::SecurityIssue { vulnerability_count } => {
format!("Security issues detected: {} vulnerabilities", vulnerability_count)
}
IntegrityStatus::ConfigurationInvalid { validation_errors } => {
format!("Configuration invalid: {}", validation_errors.join(", "))
}
IntegrityStatus::Unknown => "Integrity status unknown".to_string(),
};
Ok(ComplianceCheck {
name: "Manifest Integrity".to_string(),
check_type: ComplianceCheckType::ManifestIntegrity,
passed: integrity_valid,
checked_at,
measured_value: None,
expected_value: None,
details,
})
}
fn is_subnormal(&self, value: f32) -> bool {
value != 0.0 && value.abs() < f32::MIN_POSITIVE
}
fn detect_fast_math_compilation(&self) -> bool {
let test_val = 0.1_f32 + 0.2_f32;
let expected = 0.30000001_f32;
(test_val - expected).abs() > f32::EPSILON * 10.0
}
fn determine_ece_violation_severity(&self, measured: f32, threshold: f32) -> ViolationSeverity {
let excess = measured - threshold;
let relative_excess = excess / threshold;
let thresholds = &self.config.monitoring_config.alert_thresholds.ece_violations;
if relative_excess >= thresholds.emergency {
ViolationSeverity::Emergency
} else if relative_excess >= thresholds.critical {
ViolationSeverity::Critical
} else if relative_excess >= thresholds.warning {
ViolationSeverity::High
} else {
ViolationSeverity::Medium
}
}
fn determine_variance_violation_severity(&self, measured: f32, threshold: f32) -> ViolationSeverity {
let excess = measured - threshold;
let thresholds = &self.config.monitoring_config.alert_thresholds.variance_violations;
if excess >= thresholds.emergency {
ViolationSeverity::Emergency
} else if excess >= thresholds.critical {
ViolationSeverity::Critical
} else if excess >= thresholds.warning {
ViolationSeverity::High
} else {
ViolationSeverity::Medium
}
}
fn generate_violation_id(&self) -> String {
use fastrand;
let timestamp = Utc::now().timestamp();
let random = fastrand::u32(..);
format!("VIO-{}-{:08X}", timestamp, random)
}
fn handle_violations(&mut self, violations: &[ComplianceViolation]) -> Result<()> {
if !self.config.violation_escalation.enable_auto_escalation {
return Ok(());
}
info!("Handling {} violations", violations.len());
for violation in violations {
for escalation_level in &self.config.violation_escalation.escalation_levels {
let recent_violations = self.count_recent_violations(
Duration::hours(escalation_level.time_window_hours as i64)
);
if recent_violations >= escalation_level.violation_threshold {
info!("Escalating to level: {}", escalation_level.level);
for action in &escalation_level.actions {
self.execute_escalation_action(action, violation)?;
}
}
}
let alert = ActiveAlert {
alert_id: format!("ALERT-{}", self.generate_violation_id()),
violation_id: violation.violation_id.clone(),
severity: match violation.severity {
ViolationSeverity::Low => AlertSeverity::Info,
ViolationSeverity::Medium => AlertSeverity::Warning,
ViolationSeverity::High => AlertSeverity::Critical,
ViolationSeverity::Critical => AlertSeverity::Critical,
ViolationSeverity::Emergency => AlertSeverity::Emergency,
},
created_at: Utc::now(),
escalated: false,
};
self.active_alerts.push(alert);
}
Ok(())
}
fn count_recent_violations(&self, duration: Duration) -> u32 {
let cutoff = Utc::now() - duration;
self.violation_history.iter()
.filter(|v| v.detected_at >= cutoff)
.count() as u32
}
fn execute_escalation_action(&self, action: &EscalationAction, violation: &ComplianceViolation) -> Result<()> {
match action {
EscalationAction::Alert { message, severity } => {
match severity {
AlertSeverity::Info => info!("ALERT: {}", message),
AlertSeverity::Warning => warn!("WARNING: {}", message),
AlertSeverity::Critical => error!("CRITICAL: {}", message),
AlertSeverity::Emergency => error!("EMERGENCY: {}", message),
}
}
EscalationAction::StopCalibration => {
error!("ESCALATION: Stopping calibration system due to violation {}", violation.violation_id);
}
EscalationAction::RevertConfiguration => {
warn!("ESCALATION: Configuration revert requested for violation {}", violation.violation_id);
}
EscalationAction::EmergencyProcedure { procedure } => {
error!("ESCALATION: Triggering emergency procedure '{}' for violation {}",
procedure, violation.violation_id);
}
EscalationAction::LogViolation { details } => {
info!("LOGGING: Violation {} - {}", violation.violation_id, details);
}
}
Ok(())
}
fn calculate_compliance_trends(&self) -> ComplianceTrends {
let now = Utc::now();
let mut weekly_scores = Vec::new();
for week in 0..4 {
let week_start = now - Duration::weeks((week + 1) as i64);
let week_end = now - Duration::weeks(week as i64);
let week_violations = self.violation_history.iter()
.filter(|v| v.detected_at >= week_start && v.detected_at < week_end)
.count();
let score = if week_violations == 0 {
100.0
} else {
(100.0 - (week_violations as f32 * 10.0)).max(0.0)
};
weekly_scores.push(score);
}
let trend_direction = if weekly_scores.len() >= 2 {
let recent_avg = (weekly_scores[0] + weekly_scores[1]) / 2.0;
let older_avg = (weekly_scores[2] + weekly_scores[3]) / 2.0;
if recent_avg > older_avg + 5.0 {
"IMPROVING".to_string()
} else if recent_avg < older_avg - 5.0 {
"DEGRADING".to_string()
} else {
"STABLE".to_string()
}
} else {
"UNKNOWN".to_string()
};
ComplianceTrends {
trend_direction,
weekly_compliance_scores: weekly_scores,
violation_rate_change_percent: 0.0, }
}
fn generate_recommendations(&self) -> Vec<String> {
let mut recommendations = Vec::new();
if let Some(last_result) = &self.last_compliance_result {
if !last_result.compliant {
recommendations.push("Address current compliance violations before proceeding".to_string());
}
if last_result.compliance_score < 90.0 {
recommendations.push("Improve calibration training data quality and quantity".to_string());
}
}
let recent_violations = self.get_compliance_history(7);
if recent_violations.len() > 5 {
recommendations.push("High violation rate detected - review calibration system configuration".to_string());
}
if self.active_alerts.len() > 10 {
recommendations.push("Many active alerts - prioritize resolution of critical issues".to_string());
}
if recommendations.is_empty() {
recommendations.push("System is operating within compliance parameters".to_string());
}
recommendations
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GovernanceReport {
pub generated_at: DateTime<Utc>,
pub reporting_period_days: u32,
pub current_compliance_status: String,
pub compliance_score: f32,
pub violation_statistics: ViolationStatistics,
pub compliance_trends: ComplianceTrends,
pub active_alerts_count: usize,
pub recommendations: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ViolationStatistics {
pub total_violations: usize,
pub last_30_days_violations: usize,
pub critical_violations: usize,
pub resolved_violations: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplianceTrends {
pub trend_direction: String,
pub weekly_compliance_scores: Vec<f32>,
pub violation_rate_change_percent: f32,
}
impl Default for GovernanceConfig {
fn default() -> Self {
Self {
enable_sla_enforcement: true,
ece_threshold_params: EceThresholdParams {
base_ece_requirement: 0.015,
empirical_constant: 1.5,
default_bin_count: 15,
min_sample_count: 30,
max_allowed_ece: 0.10,
},
language_variance_limits: LanguageVarianceLimits {
max_tier1_variance_pp: 7.0,
max_tier2_variance_pp: 10.0,
max_individual_language_ece_multiplier: 2.0,
min_languages_for_variance: 2,
},
compatibility_settings: CompatibilitySettings {
enable_version_checking: true,
supported_manifest_versions: vec!["1.0.0".to_string()],
supported_phase4_versions: vec!["1.0.0".to_string()],
required_dependencies: HashMap::new(),
enable_breaking_change_detection: true,
},
ieee754_settings: Ieee754Settings {
enable_strict_compliance: true,
detect_fast_math: true,
enable_denormal_handling: true,
precision_requirements: PrecisionRequirements {
ece_precision: 4,
score_precision: 6,
confidence_precision: 3,
numerical_tolerance: 1e-6,
},
special_values_handling: SpecialValuesHandling {
nan_handling: NanHandling::ReplaceWithNeutral,
infinity_handling: InfinityHandling::Clamp { min: 0.001, max: 0.999 },
detect_subnormals: true,
max_relative_error: 1e-6,
},
},
monitoring_config: MonitoringConfig {
enable_realtime_monitoring: true,
check_interval_seconds: 300, violation_tracking_days: 30,
alert_thresholds: AlertThresholds {
ece_violations: SeverityThresholds {
warning: 0.1,
critical: 0.3,
emergency: 0.5,
},
variance_violations: SeverityThresholds {
warning: 1.0,
critical: 2.0,
emergency: 3.0,
},
compatibility_violations: SeverityThresholds {
warning: 1.0,
critical: 1.0,
emergency: 1.0,
},
ieee754_violations: SeverityThresholds {
warning: 0.01,
critical: 0.05,
emergency: 0.10,
},
},
enable_automated_reports: true,
},
violation_escalation: ViolationEscalationConfig {
enable_auto_escalation: true,
escalation_levels: vec![
EscalationLevel {
level: "Warning".to_string(),
violation_threshold: 3,
time_window_hours: 1,
actions: vec![
EscalationAction::Alert {
message: "Multiple violations detected".to_string(),
severity: AlertSeverity::Warning,
},
EscalationAction::LogViolation {
details: "Warning level escalation".to_string(),
},
],
},
EscalationLevel {
level: "Critical".to_string(),
violation_threshold: 5,
time_window_hours: 6,
actions: vec![
EscalationAction::Alert {
message: "Critical violation threshold exceeded".to_string(),
severity: AlertSeverity::Critical,
},
EscalationAction::RevertConfiguration,
],
},
EscalationLevel {
level: "Emergency".to_string(),
violation_threshold: 10,
time_window_hours: 24,
actions: vec![
EscalationAction::Alert {
message: "Emergency: System non-compliance critical".to_string(),
severity: AlertSeverity::Emergency,
},
EscalationAction::StopCalibration,
EscalationAction::EmergencyProcedure {
procedure: "calibration_emergency_stop".to_string(),
},
],
},
],
max_violations_before_emergency: 20,
alert_cooldown_minutes: 15,
},
}
}
}
impl fmt::Display for ComplianceResult {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let status = if self.compliant { "✓ COMPLIANT" } else { "✗ NON-COMPLIANT" };
write!(f, "{} (score: {:.1}%, checks: {}, violations: {})",
status, self.compliance_score, self.checks.len(), self.violations.len())
}
}
impl fmt::Display for ComplianceViolation {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "[{}] {:?}: {} (measured: {:.4} vs threshold: {:.4})",
self.violation_id, self.severity, self.description,
self.measured_value, self.threshold_value)
}
}
pub fn initialize_calibration_governance() -> CalibrationGovernance {
let config = GovernanceConfig::default();
CalibrationGovernance::new(config)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::calibration::{Phase4Config, feature_flags::CalibV22Config};
#[test]
fn test_statistical_ece_threshold_calculation() {
let config = GovernanceConfig::default();
let governance = CalibrationGovernance::new(config);
let threshold = governance.calculate_statistical_ece_threshold(1000, 15);
assert!(threshold >= 0.015);
assert!(threshold < 0.10);
let threshold_small = governance.calculate_statistical_ece_threshold(100, 15);
assert!(threshold_small > threshold);
let threshold_zero = governance.calculate_statistical_ece_threshold(0, 15);
assert_eq!(threshold_zero, 0.015);
}
#[test]
fn test_phase4_constraints_validation() {
let config = GovernanceConfig::default();
let governance = CalibrationGovernance::new(config);
let valid_config = Phase4Config::default();
assert!(governance.validate_phase4_constraints(&valid_config));
let mut invalid_config = Phase4Config::default();
invalid_config.target_ece = 0.020; assert!(!governance.validate_phase4_constraints(&invalid_config));
let mut invalid_config2 = Phase4Config::default();
invalid_config2.max_language_variance = 8.0; assert!(!governance.validate_phase4_constraints(&invalid_config2));
}
#[test]
fn test_ieee754_compliance_checking() {
let config = GovernanceConfig::default();
let governance = CalibrationGovernance::new(config);
let valid_samples = vec![
CalibrationSample {
prediction: 0.7,
ground_truth: 1.0,
intent: "test".to_string(),
language: Some("rust".to_string()),
features: HashMap::new(),
weight: 1.0,
},
];
let check = governance.enforce_ieee754_compliance(&valid_samples).unwrap();
assert!(check.passed);
let invalid_samples = vec![
CalibrationSample {
prediction: f32::NAN,
ground_truth: 1.0,
intent: "test".to_string(),
language: Some("rust".to_string()),
features: HashMap::new(),
weight: 1.0,
},
];
let check = governance.enforce_ieee754_compliance(&invalid_samples).unwrap();
assert!(!check.passed);
}
#[test]
fn test_subnormal_detection() {
let config = GovernanceConfig::default();
let governance = CalibrationGovernance::new(config);
assert!(!governance.is_subnormal(1.0));
assert!(!governance.is_subnormal(0.0));
assert!(governance.is_subnormal(f32::MIN_POSITIVE / 2.0));
}
#[test]
fn test_violation_severity_determination() {
let mut config = GovernanceConfig::default();
config.monitoring_config.alert_thresholds.ece_violations = SeverityThresholds {
warning: 0.1,
critical: 0.5,
emergency: 1.0,
};
let governance = CalibrationGovernance::new(config);
let severity1 = governance.determine_ece_violation_severity(0.020, 0.015);
assert!(matches!(severity1, ViolationSeverity::High | ViolationSeverity::Medium));
let severity2 = governance.determine_ece_violation_severity(0.030, 0.015);
assert!(matches!(severity2, ViolationSeverity::Critical | ViolationSeverity::Emergency));
}
#[test]
fn test_governance_report_generation() {
let config = GovernanceConfig::default();
let governance = CalibrationGovernance::new(config);
let report = governance.generate_compliance_report().unwrap();
assert!(!report.generated_at.timestamp().is_zero());
assert_eq!(report.reporting_period_days, 30);
assert!(!report.recommendations.is_empty());
}
}