weavatrix_memory/analytics/
model.rs1use crate::{EntityId, FactId, MemoryFact, ProjectionClock};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct BeliefRevisionRequest {
6 pub hypothesis: MemoryFact,
7 pub clock: ProjectionClock,
8 pub max_depth: usize,
9}
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12pub struct Contradiction {
13 pub fact: FactId,
14 pub strength_bps: u16,
15 pub reason: String,
16}
17
18#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
19pub struct CascadeEffect {
20 pub entity: EntityId,
21 pub depth: usize,
22 pub revised_confidence_bps: u16,
23}
24
25#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
26pub struct BeliefRevisionReport {
27 pub contradictions: Vec<Contradiction>,
28 pub cascade: Vec<CascadeEffect>,
29 pub invalidated_decisions: Vec<EntityId>,
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq)]
33pub struct ReasoningGapRequest {
34 pub clock: ProjectionClock,
35 pub minimum_supports: usize,
36 pub low_confidence_bps: u16,
37 pub unstable_revision_count: usize,
38 pub stale_after_micros: i64,
39 pub max_results: usize,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
43#[serde(rename_all = "snake_case")]
44pub enum GapKind {
45 UnjustifiedDecision,
46 SingleSourceInference,
47 LowConfidenceFoundation,
48 UnstableKnowledge,
49 StaleEvidence,
50}
51
52#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
53pub struct ReasoningGap {
54 pub entity: EntityId,
55 pub fact: Option<FactId>,
56 pub kind: GapKind,
57 pub severity_bps: u16,
58 pub downstream_entities: usize,
59 pub explanation: String,
60}
61
62#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
63pub struct GapReport {
64 pub gaps: Vec<ReasoningGap>,
65 pub health_bps: u16,
66 pub analyzed_entities: usize,
67 pub analyzed_facts: usize,
68}
69
70#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
71#[serde(rename_all = "snake_case")]
72pub enum ChangeKind {
73 Initial,
74 Refined,
75 Corrected,
76 Reinforced,
77 Weakened,
78}
79
80#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
81pub struct DriftSnapshot {
82 pub fact: FactId,
83 pub target: EntityId,
84 pub recorded_at: crate::Timestamp,
85 pub confidence_bps: u16,
86 pub change: ChangeKind,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
90pub struct DriftReport {
91 pub source: EntityId,
92 pub relation: String,
93 pub snapshots: Vec<DriftSnapshot>,
94 pub correction_count: usize,
95 pub stability_bps: u16,
96 pub likely_to_change: bool,
97}
98
99#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
100#[serde(rename_all = "snake_case")]
101pub enum ConsolidationKind {
102 SupersedeDuplicate,
103 ReviewOrphan,
104 CompactRevisionChain,
105}
106
107#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
108pub struct ConsolidationAction {
109 pub kind: ConsolidationKind,
110 pub keep: Option<FactId>,
111 pub affected_facts: Vec<FactId>,
112 pub affected_entities: Vec<EntityId>,
113 pub rationale: String,
114}
115
116#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
117pub struct ConsolidationPlan {
118 pub actions: Vec<ConsolidationAction>,
119 pub projected_savings: usize,
120 pub source_position: Option<u64>,
121}