Skip to main content

weavatrix_memory/analytics/
model.rs

1use 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}