Skip to main content

tracevault_core/
policy.rs

1use serde::{Deserialize, Serialize};
2use uuid::Uuid;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct PolicyRule {
6    pub id: Uuid,
7    pub org_id: Option<String>,
8    pub name: String,
9    pub description: String,
10    pub condition: PolicyCondition,
11    pub action: PolicyAction,
12    pub severity: PolicySeverity,
13    pub enabled: bool,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(tag = "type")]
18pub enum PolicyCondition {
19    TraceCompleteness,
20    AiPercentageThreshold {
21        threshold: f32,
22    },
23    ModelAllowlist {
24        allowed_models: Vec<String>,
25    },
26    SensitivePathPattern {
27        patterns: Vec<String>,
28    },
29    RequiredToolCall {
30        tool_names: Vec<String>,
31        #[serde(default)]
32        must_succeed: bool,
33    },
34    TokenBudget {
35        max_tokens: Option<u64>,
36        max_cost_usd: Option<f64>,
37    },
38    ConditionalToolCall {
39        tool_name: String,
40        min_count: Option<u32>,
41        when_files_match: Option<Vec<String>>,
42        #[serde(default)]
43        must_succeed: bool,
44    },
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(rename_all = "snake_case")]
49pub enum PolicyAction {
50    BlockPush,
51    Warn,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55#[serde(rename_all = "lowercase")]
56pub enum PolicySeverity {
57    Critical,
58    High,
59    Medium,
60    Low,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct PolicyEvaluation {
65    pub policy: PolicyRule,
66    pub result: EvalResult,
67    pub details: String,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
71#[serde(rename_all = "lowercase")]
72pub enum EvalResult {
73    Pass,
74    Fail,
75    Warn,
76}