Skip to main content

session_metrics/
session_metrics.rs

1//! Example: Session Metrics — tracking and reporting improvement sessions.
2//!
3//! ```bash
4//! cargo run -p brainwires-autonomy --example session_metrics
5//! ```
6
7use std::time::Duration;
8
9use brainwires_autonomy::metrics::{ComparisonResult, SessionMetrics, SessionReport};
10
11fn main() {
12    println!("=== Session Metrics & Reporting Example ===\n");
13
14    // 1. Build up session metrics
15    let mut metrics = SessionMetrics::new();
16
17    // Simulate a session with multiple strategies
18    let strategies = [
19        ("clippy", 3, 2, vec![5, 8]),
20        ("dead_code", 2, 1, vec![12]),
21        ("doc_gaps", 4, 3, vec![3, 6, 4]),
22        ("refactoring", 1, 0, vec![]),
23    ];
24
25    println!("--- Recording Tasks ---");
26    for (name, generated, succeeded, iters) in &strategies {
27        metrics.record_generated(name, *generated);
28        for _ in 0..*generated {
29            metrics.record_attempt(name);
30        }
31        for &iter_count in iters.iter() {
32            metrics.record_success(name, iter_count);
33        }
34        let failed = *generated - *succeeded;
35        for _ in 0..failed {
36            metrics.record_failure(name);
37        }
38        println!(
39            "  {name}: generated={generated}, succeeded={succeeded}, failed={}",
40            generated - succeeded
41        );
42    }
43
44    // Record commits
45    metrics.record_commit("a1b2c3d".to_string());
46    metrics.record_commit("e4f5g6h".to_string());
47    metrics.record_commit("i7j8k9l".to_string());
48
49    // Record a dual-path comparison
50    metrics.record_comparison(ComparisonResult {
51        both_succeeded: true,
52        both_failed: false,
53        diffs_match: true,
54        iteration_delta: -3,
55        bridge_specific_errors: vec![],
56    });
57    metrics.record_comparison(ComparisonResult {
58        both_succeeded: false,
59        both_failed: false,
60        diffs_match: false,
61        iteration_delta: 5,
62        bridge_specific_errors: vec!["timeout on bridge path".to_string()],
63    });
64
65    println!();
66
67    // 2. Print summary
68    println!("--- Summary ---");
69    println!("  Tasks attempted  : {}", metrics.tasks_attempted);
70    println!("  Tasks succeeded  : {}", metrics.tasks_succeeded);
71    println!("  Tasks failed     : {}", metrics.tasks_failed);
72    println!("  Total iterations : {}", metrics.total_iterations);
73    println!(
74        "  Success rate     : {:.1}%",
75        metrics.success_rate() * 100.0
76    );
77    println!("  Commits          : {}", metrics.commits.len());
78    println!("  Comparisons      : {}", metrics.comparisons.len());
79    println!();
80
81    // 3. Generate a session report
82    let report = SessionReport::new(
83        metrics,
84        Duration::from_secs(185),
85        None, // no safety stop
86    );
87
88    // 4. JSON output
89    println!("--- JSON Report (truncated) ---");
90    let json = report.to_json().unwrap();
91    // Print first 500 chars
92    let preview: String = json.chars().take(500).collect();
93    println!("{preview}...\n");
94
95    // 5. Markdown output
96    println!("--- Markdown Report ---");
97    let md = report.to_markdown();
98    println!("{md}");
99
100    println!("Done.");
101}