Skip to main content

locus_core_rs/application/services/
calibration_service.rs

1use std::sync::Arc;
2
3use anyhow::Result;
4
5use crate::domain::contracts::NodeStore;
6use crate::domain::models::{AvecState, CalibrationResult};
7
8pub struct CalibrationService {
9    store: Arc<dyn NodeStore>,
10}
11
12impl CalibrationService {
13    /// Create a calibration service backed by the configured node store.
14    pub fn new(store: Arc<dyn NodeStore>) -> Self {
15        Self { store }
16    }
17
18    /// Persist a calibration point and return drift analysis vs prior state.
19    pub async fn calibrate_async(
20        &self,
21        session_id: &str,
22        stability: f32,
23        friction: f32,
24        logic: f32,
25        autonomy: f32,
26        trigger: &str,
27    ) -> Result<CalibrationResult> {
28        let current = AvecState {
29            stability,
30            friction,
31            logic,
32            autonomy,
33        };
34
35        let previous = self.store.get_last_avec_async(session_id).await?;
36        let history = self.store.get_trigger_history_async(session_id).await?;
37        let is_first = previous.is_none();
38        let baseline = previous.unwrap_or(current);
39
40        self.store
41            .store_calibration_async(session_id, current, trigger)
42            .await?;
43
44        let mut trigger_history = history;
45        trigger_history.push(trigger.to_string());
46
47        Ok(CalibrationResult {
48            previous_avec: baseline,
49            delta: current.drift_from(baseline),
50            drift_classification: current.classify_drift(baseline),
51            trigger: trigger.to_string(),
52            trigger_history,
53            is_first_calibration: is_first,
54        })
55    }
56}