use serde::{Deserialize, Serialize};
pub const SCHEMA_VERSION: u32 = 1;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct QualityContract {
pub schema_version: u32,
pub generated_at: String,
pub provenance: Provenance,
pub envelopes: Envelopes,
pub fidelity: Vec<FidelityEntry>,
pub performance: Vec<PerformanceEntry>,
}
impl QualityContract {
pub fn to_json_pretty(&self) -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(self)
}
pub fn from_json_str(input: &str) -> Result<Self, QualityContractError> {
let contract: QualityContract = serde_json::from_str(input)?;
if contract.schema_version != SCHEMA_VERSION {
return Err(QualityContractError::UnsupportedSchemaVersion {
actual: contract.schema_version,
expected: SCHEMA_VERSION,
});
}
Ok(contract)
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Provenance {
pub git_commit: String,
pub git_dirty: bool,
pub run_id: String,
pub effective_isa: String,
pub cpu_model: String,
pub rustc: String,
pub cargo_profile: String,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Envelopes {
pub esr_namcore: EsrNamcoreEnvelope,
pub snr_db_drop: f64,
pub mrstft_mult: f64,
pub latency_mult: f64,
pub latency_floor_us: f64,
}
impl Envelopes {
pub fn policy_v1() -> Self {
Self {
esr_namcore: EsrNamcoreEnvelope {
noise_mult: 3.0,
noise_floor_abs: 5e-14,
safety_mult: 10.0,
safety_floor_abs: 1e-12,
},
snr_db_drop: 6.0,
mrstft_mult: 10.0,
latency_mult: 1.10,
latency_floor_us: 0.05,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EsrNamcoreEnvelope {
pub noise_mult: f64,
pub noise_floor_abs: f64,
pub safety_mult: f64,
pub safety_floor_abs: f64,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FidelityEntry {
pub id: String,
pub label: String,
pub esr_namcore: f64,
pub esr_f64: Option<f64>,
pub snr_db: Option<f64>,
pub mrstft: f64,
#[serde(default)]
pub optional: bool,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PerformanceEntry {
pub id: String,
pub label: String,
pub median_latency_us: f64,
}
#[derive(Debug, thiserror::Error)]
pub enum QualityContractError {
#[error("invalid quality contract JSON: {0}")]
Json(#[from] serde_json::Error),
#[error("unsupported quality contract schema version {actual}, expected {expected}")]
UnsupportedSchemaVersion {
actual: u32,
expected: u32,
},
}
pub mod metrics;
pub mod baseline_store;
pub mod classify;
pub mod coverage;
pub mod env;
pub mod fingerprint;
pub mod ids;
pub mod verify;
pub mod render;
#[cfg(test)]
#[path = "qa_test.rs"]
mod qa_test;
#[cfg(test)]
#[path = "transcription.rs"]
mod transcription;