SNAPKITTYWEST's picture
chore: push full sov-kernel-monster content from local build
9425aed verified
Raw
History Blame Contribute Delete
7.46 kB
//! Multi-agent reasoning conversation demo
//!
//! Demonstrates:
//! 1. kernel_001 reasons about offset 101 commit
//! 2. policy_001 extends kernel trace with authorization check
//! 3. auditor_001 challenges policy decision with counter-evidence
//! 4. All traces immutable, queryable, visualized as sequence diagram
use seb_reasoning::{
L1KernelIntegration, L3PolicyIntegration, L5KnowledgeIntegration, ReasoningEventType,
ReasoningPartition, ReasoningStreamManager, ReasoningStep, ReasoningTrace, TraceRelation,
};
#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
println!("=== SEB L6 Reasoning Protocol Demo ===\n");
// Initialize layer integrations
let l1 = L1KernelIntegration::new("kernel_001".into());
let l3 = L3PolicyIntegration::new("policy_001".into());
let l5 = L5KnowledgeIntegration::new();
// Initialize stream manager
let manager = ReasoningStreamManager::new();
println!("--- Phase 1: Kernel reasons about offset 101 ---");
// Kernel appends and commits event at offset 101
l1.on_kernel_append(101, "abc123def456789").await;
l1.on_kernel_commit(101, "hash_101_xyz").await;
// Retrieve kernel trace
let kernel_events = l1.protocol_handler.get_events().await;
println!("Kernel emitted {} events", kernel_events.len());
// Create kernel reasoning trace
let mut kernel_trace = ReasoningTrace::new("kernel_001".into(), "append".into(), 1);
kernel_trace.set_query(Some("Append offset 101".into()));
kernel_trace.add_step(ReasoningStep::Retrieve {
source: "L1::WAL".into(),
symbol: "offset_101".into(),
result: serde_json::json!({
"offset": 101,
"hash": "abc123def456789",
}),
});
kernel_trace.add_step(ReasoningStep::Verify {
target: "offset_101".into(),
method: "prev_hash_chain".into(),
valid: true,
error: None,
});
let kernel_trace_id = kernel_trace.finalize();
manager.store_trace(kernel_trace.clone()).await;
l5.store_reasoning_trace(kernel_trace).await;
println!("Kernel trace ID: {}", &kernel_trace_id[0..16]);
println!("\n--- Phase 2: Policy extends kernel trace with authorization ---");
// Policy gate checks authorization
l3.on_policy_authorize("kernel_001", "commit_offset", "offset_101", true, "L0_invariant_satisfied")
.await;
let policy_events = l3.protocol_handler.get_events().await;
println!("Policy emitted {} events", policy_events.len());
// Create policy reasoning trace that extends kernel trace
let mut policy_trace = ReasoningTrace::new("policy_001".into(), "authorize".into(), 1);
policy_trace.set_query(Some("Authorize kernel_001 commit_offset".into()));
policy_trace.add_parent(TraceRelation::Extends {
parent_trace_id: kernel_trace_id.clone(),
});
policy_trace.add_step(ReasoningStep::Retrieve {
source: "L3::Datalog".into(),
symbol: "policy_commit_offset".into(),
result: serde_json::json!({
"principal": "kernel_001",
"action": "commit_offset",
"allowed": true,
}),
});
policy_trace.add_step(ReasoningStep::CheckAuthorization {
principal: "kernel_001".into(),
action: "commit_offset".into(),
resource: "offset_101".into(),
allowed: true,
reason: "L0_invariant_satisfied".into(),
});
policy_trace.add_step(ReasoningStep::Conclude {
conclusion: "Authorization: ALLOW - offset monotonic and signature valid".into(),
confidence: 0.99,
});
let policy_trace_id = policy_trace.finalize();
manager.store_trace(policy_trace.clone()).await;
l5.store_reasoning_trace(policy_trace).await;
println!("Policy trace ID: {}", &policy_trace_id[0..16]);
println!("\n--- Phase 3: Auditor challenges policy decision ---");
// Auditor challenges with counter-evidence
let mut auditor_trace = ReasoningTrace::new("auditor_001".into(), "challenge".into(), 1);
auditor_trace.set_query(Some("Challenge policy authorization".into()));
auditor_trace.add_parent(TraceRelation::Challenges {
parent_trace_id: policy_trace_id.clone(),
});
auditor_trace.add_step(ReasoningStep::Retrieve {
source: "L5::Audit".into(),
symbol: "audit_log_101".into(),
result: serde_json::json!({
"offset": 101,
"anomaly": "offset_not_monotonic",
}),
});
auditor_trace.add_step(ReasoningStep::Challenge {
target_trace_id: policy_trace_id.clone(),
target_step_index: 2,
counter_evidence: "Audit log shows offset 101 violates monotonicity constraint vs offset 100".into(),
});
let auditor_trace_id = auditor_trace.finalize();
manager.store_trace(auditor_trace.clone()).await;
l5.store_reasoning_trace(auditor_trace).await;
println!("Auditor trace ID: {}", &auditor_trace_id[0..16]);
println!("\n--- Phase 4: Query and visualize ---");
// Query all traces
let all_traces = manager.get_traces().await;
println!("\nTotal traces: {}", all_traces.len());
for trace in &all_traces {
println!(
" - Agent: {}, Competency: {}, Steps: {}, ID: {}",
trace.agent_id,
trace.competency,
trace.steps.len(),
&trace.trace_id[0..16]
);
}
// Get summary
let summary = manager.get_summary().await;
println!("\nSummary:");
for (key, value) in summary {
println!(" {}: {}", key, value);
}
// Generate Mermaid diagrams
println!("\n--- Mermaid Sequence Diagram ---");
let diagrams = manager.generate_diagrams().await;
for diagram in diagrams {
println!("{}", diagram.render());
}
// Generate timelines
println!("\n--- Timeline for Each Trace ---");
for trace in &all_traces {
if let Some(timeline) = manager.get_timeline(&trace.trace_id).await {
println!("{}", timeline.render_ascii());
}
}
// Emit A2A protocol events
println!("\n--- A2A Protocol Events ---");
let partition = ReasoningPartition::AgentTraces("auditor_001".into());
let challenge_event = seb_reasoning::a2a_protocol::A2AReasoningEvent::with_challenge(
policy_trace_id.clone(),
"Offset not monotonic".into(),
Some(2),
);
println!("Challenge event: {}", challenge_event.as_json_line());
let composition_event = seb_reasoning::a2a_protocol::A2AReasoningEvent::with_composition(
uuid::Uuid::new_v4().to_string(),
vec![kernel_trace_id, policy_trace_id, auditor_trace_id],
"multi_agent_reasoning".into(),
);
println!("Composition event: {}", composition_event.as_json_line());
println!("\n--- Cycle Detection ---");
let has_cycles = all_traces[0].has_cycles(&all_traces);
println!("Traces have cycles: {}", has_cycles);
println!("\n--- Symbol Indexing ---");
for trace in &all_traces {
let symbols = trace.extract_symbols();
if !symbols.is_empty() {
println!("Trace {} symbols: {:?}", &trace.trace_id[0..16], symbols);
}
}
println!("\n=== Demo Complete ===");
}