use crate::types::*;
#[inline]
pub fn apply_policy(
confirmed_grammar: GrammarState,
dsa_score: f64,
consistency_gate_passed: bool,
semantic: SemanticDisposition,
persistence_count: usize,
persistence_threshold: usize,
) -> PolicyState {
if confirmed_grammar == GrammarState::Admissible && dsa_score < 0.5 {
return PolicyState::Silent;
}
if !consistency_gate_passed && confirmed_grammar != GrammarState::Violation {
return PolicyState::Silent;
}
if confirmed_grammar == GrammarState::Violation {
return PolicyState::Escalate;
}
if persistence_count < persistence_threshold {
if confirmed_grammar == GrammarState::Boundary {
return PolicyState::Watch;
}
return PolicyState::Silent;
}
match semantic {
SemanticDisposition::Named(motif) => {
match motif {
MotifClass::CascadingTimeoutSlew
| MotifClass::DeploymentRegressionSlew
| MotifClass::ErrorRateEscalation => PolicyState::Escalate,
_ => PolicyState::Review,
}
}
SemanticDisposition::Unknown => {
PolicyState::Review
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_admissible_is_silent() {
let p = apply_policy(
GrammarState::Admissible, 0.1, false,
SemanticDisposition::Unknown, 0, 4,
);
assert_eq!(p, PolicyState::Silent);
}
#[test]
fn test_violation_is_escalate() {
let p = apply_policy(
GrammarState::Violation, 3.0, true,
SemanticDisposition::Unknown, 0, 4,
);
assert_eq!(p, PolicyState::Escalate);
}
#[test]
fn test_boundary_below_persistence_is_watch() {
let p = apply_policy(
GrammarState::Boundary, 2.5, true,
SemanticDisposition::Named(MotifClass::MemoryLeakDrift), 2, 4,
);
assert_eq!(p, PolicyState::Watch);
}
#[test]
fn test_boundary_above_persistence_review() {
let p = apply_policy(
GrammarState::Boundary, 2.5, true,
SemanticDisposition::Named(MotifClass::MemoryLeakDrift), 5, 4,
);
assert_eq!(p, PolicyState::Review);
}
}