context-governor 0.2.0

Crate-agnostic governed context compaction with receipts, exact fallback references, and recall quality filters
Documentation
use context_governor::{compact_context, CompactRequest, CompactionPolicy, Message};
use std::time::Instant;

fn main() {
    let cases = [100usize, 500, 1_000, 2_000];
    let iterations = 25usize;
    println!("messages,original_tokens,compacted_tokens,savings_tokens,avg_ms,p50_ms,p95_ms,throughput_msgs_per_s,fallback_refs,quarantined");
    for message_count in cases {
        let request = make_request(message_count);
        let mut durations = Vec::with_capacity(iterations);
        let mut last_original = 0usize;
        let mut last_compacted = 0usize;
        let mut last_savings = 0isize;
        let mut last_fallback_refs = 0usize;
        let mut last_quarantined = 0usize;
        for _ in 0..iterations {
            let start = Instant::now();
            let response = compact_context(request.clone()).expect("compaction should succeed");
            durations.push(start.elapsed().as_secs_f64() * 1_000.0);
            last_original = response.receipt.original_approx_tokens;
            last_compacted = response.receipt.compacted_approx_tokens;
            last_savings = response.receipt.token_savings_estimate;
            last_fallback_refs = response.receipt.exact_fallback_refs.len();
            last_quarantined = response.allocation_plan.quarantined_item_ids.len();
        }
        durations.sort_by(|a, b| a.partial_cmp(b).unwrap());
        let avg = durations.iter().sum::<f64>() / durations.len() as f64;
        let p50 = percentile(&durations, 0.50);
        let p95 = percentile(&durations, 0.95);
        let throughput = message_count as f64 / (avg / 1_000.0);
        println!(
            "{message_count},{last_original},{last_compacted},{last_savings},{avg:.3},{p50:.3},{p95:.3},{throughput:.1},{last_fallback_refs},{last_quarantined}"
        );
    }
}

fn make_request(message_count: usize) -> CompactRequest {
    let mut messages = Vec::with_capacity(message_count);
    messages.push(message("system", "You are an operator-grade coding agent."));
    messages.push(message(
        "user",
        "Build the feature. Acceptance gate: preserve latest request, failing errors, exact fallback, and test receipts.",
    ));
    for idx in 2..message_count.saturating_sub(1) {
        let role = match idx % 4 {
            0 => "tool",
            1 => "assistant",
            2 => "user",
            _ => "tool",
        };
        let content = match idx % 10 {
            0 => format!(
                "error: compile failed in /tmp/generated_{idx}.rs:13\n{}",
                "stack line ".repeat(40)
            ),
            1 => format!("Decision: store receipt {idx} with exact fallback and allocation plan."),
            2 => format!("This likely connects to speculative graph-edge material {idx}."),
            3 => {
                format!("/home/sikmindz/project/src/file_{idx}.rs changed; cargo test should pass.")
            }
            _ => format!(
                "verbose tool output {idx}: {}",
                "low value repeated output ".repeat(60)
            ),
        };
        messages.push(message(role, &content));
    }
    messages.push(message(
        "user",
        "Latest active request: finish implementation and report receipts.",
    ));
    CompactRequest {
        session_id: format!("perf-{message_count}"),
        messages,
        policy: CompactionPolicy {
            target_tokens: 8_000,
            protect_first_n: 3,
            protect_last_n: 12,
            summary_max_chars: 12_000,
            ..Default::default()
        },
        focus: None,
    }
}

fn message(role: &str, content: &str) -> Message {
    Message {
        id: None,
        role: role.to_string(),
        content: content.to_string(),
        name: None,
        metadata: Default::default(),
    }
}

fn percentile(sorted: &[f64], p: f64) -> f64 {
    let idx = ((sorted.len().saturating_sub(1)) as f64 * p).round() as usize;
    sorted[idx]
}