crackle-runtime 0.2.0

Detect emergent patterns — clustering, correlations, phase transitions, and conservation laws — across task outputs
Documentation
//! Basic usage: fire tasks with metrics, detect patterns.

use crackle_runtime::{CrackleTask, Kiln, ThermalProfile, TaskOutput};

struct NumberTask {
    value: f64,
    name: String,
}

impl CrackleTask for NumberTask {
    type Output = f64;

    fn fire(&self) -> TaskOutput<Self::Output> {
        TaskOutput::new(
            self.value,
            vec![
                ("value".into(), self.value),
                ("abs".into(), self.value.abs()),
                ("squared".into(), self.value * self.value),
            ],
        )
    }

    fn label(&self) -> String {
        self.name.clone()
    }
}

fn main() {
    let mut kiln = Kiln::new(ThermalProfile::fast_cooling());

        kiln.fire_and_record(NumberTask { value: 2.0, name: "a".into() }).unwrap();
    kiln.fire_and_record(NumberTask { value: 2.1, name: "b".into() }).unwrap();
    kiln.fire_and_record(NumberTask { value: 9.8, name: "c".into() }).unwrap();
    kiln.fire_and_record(NumberTask { value: 10.0, name: "d".into() }).unwrap();
    kiln.fire_and_record(NumberTask { value: 2.2, name: "e".into() }).unwrap();

    println!("Tasks in kiln: {}", kiln.task_count());

    let patterns = kiln.cool();
    println!("\nDetected {} pattern(s):\n", patterns.len());

    for p in &patterns {
        println!("[{}] {}", p.kind(), p.description());
        println!("  confidence: {:.2}", p.confidence());
        println!("  tasks: {:?}\n", p.involved_tasks());
    }
}