weavatrix-memory 0.3.2

Event-sourced bitemporal evidence memory and budgeted context retrieval for coding agents
Documentation
use crate::{
    domain::MemoryFact,
    id::{EntityId, FactId},
    projection::ProjectionClock,
    time::Timestamp,
};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BeliefRevisionRequest {
    pub hypothesis: MemoryFact,
    pub clock: ProjectionClock,
    pub max_depth: usize,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Contradiction {
    pub fact: FactId,
    pub strength_bps: u16,
    pub reason: String,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CascadeEffect {
    pub entity: EntityId,
    pub depth: usize,
    pub revised_confidence_bps: u16,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BeliefRevisionReport {
    pub contradictions: Vec<Contradiction>,
    pub cascade: Vec<CascadeEffect>,
    pub invalidated_decisions: Vec<EntityId>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ReasoningGapRequest {
    pub clock: ProjectionClock,
    pub minimum_supports: usize,
    pub low_confidence_bps: u16,
    pub unstable_revision_count: usize,
    pub stale_after_micros: i64,
    pub max_results: usize,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum GapKind {
    UnjustifiedDecision,
    SingleSourceInference,
    LowConfidenceFoundation,
    UnstableKnowledge,
    StaleEvidence,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReasoningGap {
    pub entity: EntityId,
    pub fact: Option<FactId>,
    pub kind: GapKind,
    pub severity_bps: u16,
    pub downstream_entities: usize,
    pub explanation: String,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GapReport {
    pub gaps: Vec<ReasoningGap>,
    pub health_bps: u16,
    pub analyzed_entities: usize,
    pub analyzed_facts: usize,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChangeKind {
    Initial,
    Refined,
    Corrected,
    Reinforced,
    Weakened,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DriftSnapshot {
    pub fact: FactId,
    pub target: EntityId,
    pub recorded_at: Timestamp,
    pub confidence_bps: u16,
    pub change: ChangeKind,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DriftReport {
    pub source: EntityId,
    pub relation: String,
    pub snapshots: Vec<DriftSnapshot>,
    pub correction_count: usize,
    pub stability_bps: u16,
    pub likely_to_change: bool,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ConsolidationKind {
    SupersedeDuplicate,
    ReviewOrphan,
    CompactRevisionChain,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ConsolidationAction {
    pub kind: ConsolidationKind,
    pub keep: Option<FactId>,
    pub affected_facts: Vec<FactId>,
    pub affected_entities: Vec<EntityId>,
    pub rationale: String,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ConsolidationPlan {
    pub actions: Vec<ConsolidationAction>,
    pub projected_savings: usize,
    pub source_position: Option<u64>,
}