mod kani_verification;
mod bolero_integration;
mod quickcheck_properties;
mod safety_invariants;
pub use kani_verification::*;
pub use bolero_integration::*;
pub use quickcheck_properties::*;
pub use safety_invariants::*;
pub trait ThinkToolVerifiable {
fn verify_safety(&self) -> VerificationResult;
fn verify_memory_safety(&self) -> MemorySafetyResult;
fn verify_logic(&self) -> LogicVerificationResult;
}
#[derive(Debug, Clone)]
pub struct VerificationResult {
pub status: VerificationStatus,
pub confidence: f64,
pub evidence: Vec<VerificationEvidence>,
pub duration_ms: u64,
pub method: VerificationMethod,
}
#[derive(Debug, Clone, PartialEq)]
pub enum VerificationStatus {
Verified,
Failed,
Inconclusive,
Timeout,
}
#[derive(Debug, Clone)]
pub enum VerificationEvidence {
Counterexample(String),
Proof(String),
Witness(Vec<String>),
Metric(f64),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum VerificationMethod {
Kani,
Bolero,
QuickCheck,
Z3,
Manual,
}
#[derive(Debug, Clone)]
pub struct MemorySafetyResult {
pub panic_free: bool,
pub buffer_safe: bool,
pub null_pointer_safe: bool,
pub use_after_free_safe: bool,
pub data_race_safe: bool,
}
#[derive(Debug, Clone)]
pub struct LogicVerificationResult {
pub protocol_consistent: bool,
pub output_stable: bool,
pub confidence_monotonic: bool,
pub resource_bounded: bool,
pub terminates: bool,
}
pub struct ThinkToolSafetyInvariants;
impl ThinkToolSafetyInvariants {
pub fn confidence_bounds(confidence: f64) -> bool {
(0.0..=1.0).contains(&confidence)
}
pub fn query_length_bounds(query: &str, max_length: usize) -> bool {
query.len() <= max_length
}
pub fn json_validity(output: &serde_json::Value) -> bool {
serde_json::to_string(output).is_ok()
}
pub fn execution_idempotent<F>(execute: F, input: &str) -> bool
where
F: Fn(&str) -> Result<serde_json::Value, String>,
{
let result1 = execute(input);
let result2 = execute(input);
match (result1, result2) {
(Ok(r1), Ok(r2)) => r1 == r2,
_ => false,
}
}
}
pub mod property_helpers {
use super::*;
use proptest::prelude::*;
pub fn output_has_confidence() -> impl Strategy<Value = bool> {
Just(true).prop_map(|_| {
true
})
}
pub fn confidence_bounded() -> impl Strategy<Value = bool> {
(0.0..=1.0).prop_map(|confidence| {
ThinkToolSafetyInvariants::confidence_bounds(confidence)
})
}
pub fn protocol_id_valid() -> impl Strategy<Value = bool> {
"[a-z]+".prop_map(|id: String| {
!id.is_empty() && id.chars().all(|c| c.is_ascii_lowercase())
})
}
}