use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Observation {
pub id: String,
pub obs_type: ObservationType,
pub timestamp: u64,
pub data: serde_json::Value,
pub source: String,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum ObservationType {
Metric,
Event,
Receipt,
Anomaly,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Finding {
pub id: String,
pub kind: FindingKind,
pub severity: String,
pub description: String,
pub component: String,
pub evidence: Vec<String>,
pub suggested_action: Option<String>,
pub timestamp: u64,
pub metadata: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum FindingKind {
TickBudgetViolation,
GuardFailureRate,
DriftDetected,
SLOBreach,
PatternDiscovered,
OptimizationOpportunity,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OntologyOverlay {
pub id: String,
pub base_snapshot_id: String,
pub rdf_patch: String,
pub overlay_kind: OverlayKind,
pub guard_changes: Vec<GuardChange>,
pub config_changes: HashMap<String, serde_json::Value>,
pub proposer: OverlayProposer,
pub related_finding: Option<String>,
pub created_at: u64,
pub validation_status: ValidationStatus,
pub validation_results: Vec<ValidationResult>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum OverlayKind {
Addition,
Modification,
Removal,
Refactoring,
}
impl std::fmt::Display for OverlayKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
OverlayKind::Addition => write!(f, "Addition"),
OverlayKind::Modification => write!(f, "Modification"),
OverlayKind::Removal => write!(f, "Removal"),
OverlayKind::Refactoring => write!(f, "Refactoring"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum OverlayProposer {
Policy,
LLM,
User,
Optimizer,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GuardChange {
pub guard_id: String,
pub change_type: String,
pub new_params: HashMap<String, serde_json::Value>,
pub reason: String,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum ValidationStatus {
Pending,
InProgress,
Valid,
Invalid,
Approved,
ReviewNeeded,
Rejected,
Promoted,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum ValidationStage {
SHACL,
TDD,
Performance,
Security,
}
impl std::fmt::Display for ValidationStage {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ValidationStage::SHACL => write!(f, "SHACL"),
ValidationStage::TDD => write!(f, "TDD"),
ValidationStage::Performance => write!(f, "Performance"),
ValidationStage::Security => write!(f, "Security"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationResult {
pub stage: ValidationStage,
pub passed: bool,
pub details: String,
pub execution_time_ms: u64,
pub warnings: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OverlayProposal {
pub title: String,
pub description: String,
pub overlay: OntologyOverlay,
pub estimated_effort: f64,
pub expected_improvement: f64,
pub risk_level: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyRule {
pub id: String,
pub name: String,
pub trigger_condition: String,
pub action: PolicyAction,
pub priority: i32,
pub enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PolicyAction {
ProposeOverlay {
overlay_kind: String,
parameters: HashMap<String, serde_json::Value>,
},
Alert {
severity: String,
message: String,
},
AdjustMonitoring {
sampling_rate: f64,
},
}
#[derive(Debug, Clone)]
pub struct PromotionGate {
pub auto_promote: bool,
pub validation_threshold: f64,
pub require_approval: bool,
pub approval_risk_threshold: String,
}
impl Default for PromotionGate {
fn default() -> Self {
Self {
auto_promote: true,
validation_threshold: 95.0,
require_approval: false,
approval_risk_threshold: "Critical".to_string(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KnowledgeStore {
pub snapshots: Vec<SnapshotMetadata>,
pub observations: Vec<Observation>,
pub findings: Vec<Finding>,
pub overlays: Vec<OntologyOverlay>,
pub validations: Vec<ValidationResult>,
pub active_snapshot_id: String,
pub policies: Vec<PolicyRule>,
pub mape_metrics: MAPEMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotMetadata {
pub id: String,
pub description: String,
pub created_at: u64,
pub promoted_at: Option<u64>,
pub overlay_count: usize,
pub is_active: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MAPEMetrics {
pub observations_ingested: usize,
pub findings_generated: usize,
pub overlays_proposed: usize,
pub overlays_promoted: usize,
pub total_execution_time_ms: u64,
pub last_execution_timestamp: u64,
}