|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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");
|
|
|
|
|
| let l1 = L1KernelIntegration::new("kernel_001".into());
|
| let l3 = L3PolicyIntegration::new("policy_001".into());
|
| let l5 = L5KnowledgeIntegration::new();
|
|
|
|
|
| let manager = ReasoningStreamManager::new();
|
|
|
| println!("--- Phase 1: Kernel reasons about offset 101 ---");
|
|
|
| l1.on_kernel_append(101, "abc123def456789").await;
|
| l1.on_kernel_commit(101, "hash_101_xyz").await;
|
|
|
|
|
| let kernel_events = l1.protocol_handler.get_events().await;
|
| println!("Kernel emitted {} events", kernel_events.len());
|
|
|
|
|
| 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 ---");
|
|
|
| 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());
|
|
|
|
|
| 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 ---");
|
|
|
| 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 ---");
|
|
|
| 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]
|
| );
|
| }
|
|
|
|
|
| let summary = manager.get_summary().await;
|
| println!("\nSummary:");
|
| for (key, value) in summary {
|
| println!(" {}: {}", key, value);
|
| }
|
|
|
|
|
| println!("\n--- Mermaid Sequence Diagram ---");
|
| let diagrams = manager.generate_diagrams().await;
|
| for diagram in diagrams {
|
| println!("{}", diagram.render());
|
| }
|
|
|
|
|
| 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());
|
| }
|
| }
|
|
|
|
|
| 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 ===");
|
| }
|
|
|