tracevault_core/
policy.rs1use 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}