frankenstein / src /gates /lean4.rs
SNAPKITTYWEST's picture
Add Frankenstein source: Rust Tokio BRAIN/HANDS/LEGS pipeline, gates, trust deed
3d2a871 verified
Raw
History Blame Contribute Delete
1.56 kB
use tokio::process::Command;
pub enum GateVerdict {
Pass(String),
Reject(String),
Unavailable,
}
pub async fn verify(claim: &str) -> GateVerdict {
// Build a minimal Lean 4 proof obligation from the claim
let lean_src = format!(r#"
-- Sovereign Lean 4 gate — auto-generated
-- Claim: {}
-- Gate: verify claim is non-contradictory
#check @id
-- If this compiles, gate passes
#eval "GATE:PASS"
"#, claim.replace('"', "'"));
let tmp = std::env::temp_dir().join("sovereign_gate.lean");
if tokio::fs::write(&tmp, &lean_src).await.is_err() {
return GateVerdict::Unavailable;
}
match Command::new("lean")
.arg(tmp.to_str().unwrap_or(""))
.output()
.await
{
Ok(output) => {
let stdout = String::from_utf8_lossy(&output.stdout).to_string();
let stderr = String::from_utf8_lossy(&output.stderr).to_string();
if output.status.success() && stdout.contains("GATE:PASS") {
GateVerdict::Pass(stdout)
} else {
GateVerdict::Reject(format!("LEAN4 REJECT: {}", stderr))
}
}
Err(_) => GateVerdict::Unavailable,
}
}
pub fn report(verdict: &GateVerdict) -> String {
match verdict {
GateVerdict::Pass(msg) => format!("⬡ LEAN4 GATE: PASS ✓\n{}", msg),
GateVerdict::Reject(msg) => format!("⬡ LEAN4 GATE: REJECT ✗\n{}", msg),
GateVerdict::Unavailable => "⬡ LEAN4 GATE: UNAVAILABLE (lean not installed — install lean4)".to_string(),
}
}