use proserpina::{
AgentId, EchoAgent, Finding, InteractionGraph, Persona, Report, Runner, Severity, Subject,
Topology,
};
fn main() {
let personas = vec![
Persona::new("Devil's Advocate").with_framing("Assume the proposal is wrong; find how."),
Persona::new("Methodologist").with_framing("Scrutinize rigor."),
];
let critics: Vec<AgentId> = personas.iter().map(|p| AgentId::new(p.name())).collect();
let graph = InteractionGraph::from(Topology::parallel(critics));
let mut runner = Runner::new(graph);
for persona in personas {
let id = AgentId::new(persona.name());
runner = runner.with_agent(EchoAgent::new(id, persona));
}
let subject = Subject::from_markdown(
"# Plan\n\nWe will ship a distributed database with no consistency model.",
"plan.md",
);
let transcript = runner.execute(&subject).expect("echo run never fails");
let report = Report::from_transcript(&transcript);
println!("=== transcript ({} messages) ===", transcript.len());
for msg in transcript.iter() {
println!(" [{}] {:?}", msg.sender(), msg.kind());
}
println!("\n=== report ({} findings) ===", report.findings().len());
let markdown = report.to_markdown_with_source(subject.source());
print!("{markdown}");
let mut custom = Report::new();
custom.push_finding(
Finding::new(Severity::Blocker, "No consistency model defined.")
.with_category("consistency")
.with_location("ยง1"),
);
println!("\n=== custom report ===\n{}", custom.to_markdown());
}