impl RichReporter {
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn analyze(&mut self) {
self.report.clusters = self.analyzer.cluster_findings(&mut self.report.findings);
self.analyzer
.calculate_pagerank(&mut self.report.findings, &self.dependencies);
self.report.communities = self
.analyzer
.detect_communities(&mut self.report.findings, &self.dependencies);
self.report.anomalies = self.analyzer.detect_anomalies(&mut self.report.findings);
self.report.trends = self.analyzer.analyze_trends(&self.metric_history);
self.report.calculate_andon_status();
self.generate_recommendations();
}
fn generate_recommendations(&mut self) {
self.report.recommendations.clear();
for cluster in &self.report.clusters {
if cluster.size >= 3 {
self.report.recommendations.push(format!(
"Batch fix {} {} issues (cluster cohesion: {:.0}%)",
cluster.size,
cluster.primary_category,
cluster.cohesion * 100.0
));
}
}
let mut high_pagerank: Vec<_> = self
.report
.findings
.iter()
.filter(|f| f.pagerank.unwrap_or(0.0) > 0.1)
.collect();
high_pagerank.sort_by(|a, b| {
b.pagerank
.unwrap_or(0.0)
.partial_cmp(&a.pagerank.unwrap_or(0.0))
.expect("internal error")
});
for finding in high_pagerank.iter().take(3) {
self.report.recommendations.push(format!(
"Priority: Fix {} in {} (high centrality: {:.2})",
finding.category,
finding.location,
finding.pagerank.unwrap_or(0.0)
));
}
for anomaly in &self.report.anomalies {
self.report.recommendations.push(format!(
"Investigate anomaly: {} (score: {:.2}) - {}",
anomaly.finding_id, anomaly.score, anomaly.action
));
}
for trend in &self.report.trends {
if trend.direction == TrendDirection::Degrading && trend.change_percent.abs() > 10.0 {
self.report.recommendations.push(format!(
"Address {} regression: {:.1}% degradation over window",
trend.name,
trend.change_percent.abs()
));
}
}
}
}