use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EconomicEvidence {
#[default]
LocalEstimate,
ObservedToolTraffic,
ProviderCountedInput,
ProviderMeasuredUsage,
PairedControl,
}
impl EconomicEvidence {
pub fn label(self) -> &'static str {
match self {
Self::LocalEstimate => "local estimate",
Self::ObservedToolTraffic => "observed tool traffic (provider path not visible)",
Self::ProviderCountedInput => "provider-counted input (counterfactual)",
Self::ProviderMeasuredUsage => "provider-measured usage (savings estimated)",
Self::PairedControl => "paired control/treatment",
}
}
pub fn bill_impact_observable(self) -> bool {
self >= Self::ProviderMeasuredUsage
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct EconomicView {
pub evidence: EconomicEvidence,
pub net_bill_impact_tokens: Option<i64>,
pub net_bill_impact_usd: Option<f64>,
pub roi: Option<f64>,
}
pub fn economic_view(
observed_commands: u64,
provider_turns: u64,
net_tokens_if_observed: i64,
net_usd_if_observed: f64,
tool_spend_usd: f64,
) -> EconomicView {
let evidence = if provider_turns > 0 {
EconomicEvidence::ProviderMeasuredUsage
} else if observed_commands > 0 {
EconomicEvidence::ObservedToolTraffic
} else {
EconomicEvidence::LocalEstimate
};
let observable = evidence.bill_impact_observable();
EconomicView {
evidence,
net_bill_impact_tokens: observable.then_some(net_tokens_if_observed),
net_bill_impact_usd: observable.then_some(net_usd_if_observed),
roi: (observable && tool_spend_usd > 0.0).then(|| net_usd_if_observed / tool_spend_usd),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn integrated_mode_never_reports_a_bill_impact_or_roi() {
let v = economic_view(4_200, 0, 1_500_000, 18.75, 3.0);
assert_eq!(v.evidence, EconomicEvidence::ObservedToolTraffic);
assert_eq!(
v.net_bill_impact_tokens, None,
"net must not fall back to gross"
);
assert_eq!(v.net_bill_impact_usd, None);
assert_eq!(v.roi, None);
}
#[test]
fn gateway_mode_reports_an_estimated_net_and_roi() {
let v = economic_view(4_200, 900, -12_000, -0.4, 2.0);
assert_eq!(v.evidence, EconomicEvidence::ProviderMeasuredUsage);
assert_eq!(
v.net_bill_impact_tokens,
Some(-12_000),
"a negative net is reported"
);
assert_eq!(v.roi, Some(-0.2));
assert_ne!(
v.evidence,
EconomicEvidence::PairedControl,
"measured usage is still not a paired bill claim"
);
}
#[test]
fn nothing_observed_is_a_local_estimate() {
let v = economic_view(0, 0, 0, 0.0, 0.0);
assert_eq!(v.evidence, EconomicEvidence::LocalEstimate);
assert_eq!(v.net_bill_impact_usd, None);
}
}