pub mod claim;
pub mod consistency;
pub mod entity;
pub mod mcp;
pub mod scorer;
pub mod trajectory;
pub use claim::{extract_claims, Claim};
pub use consistency::{check_consistency, ConsistencyReport, Contradiction};
pub use scorer::{score_claim, score_passage, RiskLevel, TrustScore};
pub use trajectory::{analyze_trajectory, TrajectoryAnalysis, TrajectoryPattern};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrustReport {
pub score: f64,
pub risk_level: RiskLevel,
pub summary: String,
pub claims: Vec<ClaimReport>,
pub trajectory: TrajectoryAnalysis,
pub total_claims: usize,
pub high_risk_claims: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClaimReport {
pub text: String,
pub trust: TrustScore,
#[serde(skip_serializing_if = "Option::is_none")]
pub verification: Option<entity::VerificationResult>,
}
pub fn analyze(text: &str) -> TrustReport {
let claims = extract_claims(text);
let claim_reports: Vec<ClaimReport> = claims
.iter()
.map(|c| ClaimReport {
text: c.text.clone(),
trust: score_claim(c),
verification: None,
})
.collect();
let passage_score = score_passage(&claims);
let traj = analyze_trajectory(&claims);
let adjusted_score = (passage_score.score + traj.trust_modifier).clamp(0.0, 1.0);
let adjusted_risk = scorer::classify_risk_pub(adjusted_score);
let high_risk = claim_reports
.iter()
.filter(|c| {
c.trust.risk_level == RiskLevel::High || c.trust.risk_level == RiskLevel::Critical
})
.count();
let summary = format!("{} Trajectory: {}", passage_score.explanation, traj.pattern);
TrustReport {
score: adjusted_score,
risk_level: adjusted_risk,
summary,
trajectory: traj,
total_claims: claim_reports.len(),
high_risk_claims: high_risk,
claims: claim_reports,
}
}
pub fn analyze_with_verification(text: &str) -> TrustReport {
let claims = extract_claims(text);
let claim_reports: Vec<ClaimReport> = claims
.iter()
.map(|c| {
let verification = Some(entity::verify_claim(&c.text));
ClaimReport {
text: c.text.clone(),
trust: score_claim(c),
verification,
}
})
.collect();
let passage_score = score_passage(&claims);
let traj = analyze_trajectory(&claims);
let verification_results: Vec<&entity::VerificationResult> = claim_reports
.iter()
.filter_map(|c| c.verification.as_ref())
.collect();
let owned_results: Vec<entity::VerificationResult> =
verification_results.into_iter().cloned().collect();
let verification_modifier = entity::compute_verification_modifier(&owned_results);
let adjusted_score =
(passage_score.score + traj.trust_modifier + verification_modifier).clamp(0.0, 1.0);
let adjusted_risk = scorer::classify_risk_pub(adjusted_score);
let high_risk = claim_reports
.iter()
.filter(|c| {
c.trust.risk_level == RiskLevel::High || c.trust.risk_level == RiskLevel::Critical
})
.count();
let summary = format!(
"{} Trajectory: {} | Verification modifier: {:+.2}",
passage_score.explanation, traj.pattern, verification_modifier
);
TrustReport {
score: adjusted_score,
risk_level: adjusted_risk,
summary,
trajectory: traj,
total_claims: claim_reports.len(),
high_risk_claims: high_risk,
claims: claim_reports,
}
}