use car_memgine::cascade::{decide_cascade, CascadePolicy};
pub fn decide(current_confidence: f64, policy_json: &str) -> Result<String, String> {
let policy: CascadePolicy = crate::from_json("policy", policy_json)?;
let outcome = decide_cascade(current_confidence, &policy);
crate::to_json(&outcome)
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::Value;
const POLICY: &str = r#"{
"confidence_target": 0.8,
"budget": 100.0,
"tiers": [
{"tier": "self_reflect", "cost": 1.0, "expected_confidence": 0.6},
{"tier": "tool_verify", "cost": 5.0, "expected_confidence": 0.85},
{"tier": "human_expert", "cost": 50.0, "expected_confidence": 0.99}
]
}"#;
#[test]
fn escalates_to_tool_verify_for_mid_target() {
let out = decide(0.2, POLICY).unwrap();
let v: Value = serde_json::from_str(&out).unwrap();
assert_eq!(v["decision"], "accept");
assert_eq!(v["tier"], "tool_verify");
assert_eq!(v["cost_spent"], 6.0);
}
#[test]
fn already_confident_round_trips() {
let out = decide(0.95, POLICY).unwrap();
let v: Value = serde_json::from_str(&out).unwrap();
assert_eq!(v["decision"], "already_confident");
}
#[test]
fn invalid_json_errors() {
assert!(decide(0.5, "not json").is_err());
}
}