const W_ERRORED: u32 = 1;
const W_REPAIR_SUCCESS: u32 = 1;
const W_HALLUCINATED: u32 = 2;
const W_STORM: u32 = 2;
const W_REPAIR_INVALID: u32 = 4;
const W_SCAVENGED: u32 = 4;
const PER_MILLE: u64 = 1_000;
const MIN_CALLS_FOR_ESTIMATE: u32 = 5;
const STREAK_FORCE_STRUGGLING: u32 = 3;
const STRONG_MAX_PER_MILLE: u64 = 50;
const STRUGGLING_MIN_PER_MILLE: u64 = 333;
const HYSTERESIS_FLIP_RUNS: u32 = 2;
const STRONG_SCALE_NUM: u64 = 3;
const STRONG_SCALE_DEN: u64 = 2;
const STRUGGLING_SCALE_NUM: u64 = 1;
const STRUGGLING_SCALE_DEN: u64 = 2;
#[allow(dead_code)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CapabilityTier {
Nominal,
Strong,
Struggling,
}
#[allow(dead_code)] impl CapabilityTier {
pub fn as_str(self) -> &'static str {
match self {
CapabilityTier::Struggling => "struggling",
CapabilityTier::Nominal => "nominal",
CapabilityTier::Strong => "strong",
}
}
pub fn scale_threshold(self, base: u32) -> u32 {
if base == 0 {
return 0;
}
let (num, den) = match self {
CapabilityTier::Nominal => (1u64, 1u64),
CapabilityTier::Strong => (STRONG_SCALE_NUM, STRONG_SCALE_DEN),
CapabilityTier::Struggling => (STRUGGLING_SCALE_NUM, STRUGGLING_SCALE_DEN),
};
((base as u64 * num / den) as u32).max(1)
}
pub fn scale_budget(self, base: u32) -> u32 {
if base == 0 {
return 0;
}
let (num, den) = match self {
CapabilityTier::Nominal => (1u64, 1u64),
CapabilityTier::Struggling => (STRONG_SCALE_NUM, STRONG_SCALE_DEN),
CapabilityTier::Strong => (STRUGGLING_SCALE_NUM, STRUGGLING_SCALE_DEN),
};
((base as u64 * num / den) as u32).max(1)
}
}
#[allow(dead_code)] #[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct CapabilityCounters {
pub tool_calls: u32,
pub errored_tool_calls: u32,
pub repair_invalid: u32,
pub repair_successful: u32,
pub hallucinated_tool_names: u32,
pub storm_suppressions: u32,
pub scavenged_calls: u32,
pub max_failure_streak: u32,
}
#[allow(dead_code)] impl CapabilityCounters {
fn raw_tier(&self) -> CapabilityTier {
if self.tool_calls < MIN_CALLS_FOR_ESTIMATE {
return CapabilityTier::Nominal;
}
if self.max_failure_streak >= STREAK_FORCE_STRUGGLING {
return CapabilityTier::Struggling;
}
let weighted = self.errored_tool_calls as u64 * W_ERRORED as u64
+ self.repair_successful as u64 * W_REPAIR_SUCCESS as u64
+ self.hallucinated_tool_names as u64 * W_HALLUCINATED as u64
+ self.storm_suppressions as u64 * W_STORM as u64
+ self.repair_invalid as u64 * W_REPAIR_INVALID as u64
+ self.scavenged_calls as u64 * W_SCAVENGED as u64;
let rate_permille = weighted * PER_MILLE / self.tool_calls as u64;
if rate_permille < STRONG_MAX_PER_MILLE {
CapabilityTier::Strong
} else if rate_permille >= STRUGGLING_MIN_PER_MILLE {
CapabilityTier::Struggling
} else {
CapabilityTier::Nominal
}
}
}
#[allow(dead_code)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CapabilityEstimator {
tier: CapabilityTier,
candidate: Option<CapabilityTier>,
runs: u32,
}
#[allow(dead_code)] impl CapabilityEstimator {
pub fn new() -> Self {
Self {
tier: CapabilityTier::Nominal,
candidate: None,
runs: 0,
}
}
pub fn tier(&self) -> CapabilityTier {
self.tier
}
pub fn observe(&mut self, counters: &CapabilityCounters) -> CapabilityTier {
let computed = counters.raw_tier();
if computed == self.tier {
self.candidate = None;
self.runs = 0;
} else if self.candidate == Some(computed) {
self.runs += 1;
if self.runs >= HYSTERESIS_FLIP_RUNS {
self.tier = computed;
self.candidate = None;
self.runs = 0;
}
} else {
self.candidate = Some(computed);
self.runs = 1;
}
self.tier
}
}
impl Default for CapabilityEstimator {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn clean(calls: u32) -> CapabilityCounters {
CapabilityCounters {
tool_calls: calls,
..Default::default()
}
}
#[test]
fn warm_up_returns_nominal_below_floor() {
let c = CapabilityCounters {
tool_calls: MIN_CALLS_FOR_ESTIMATE - 1,
errored_tool_calls: 4,
repair_invalid: 4,
max_failure_streak: 4,
..Default::default()
};
assert_eq!(c.raw_tier(), CapabilityTier::Nominal);
}
#[test]
fn clean_stream_reaches_strong() {
assert_eq!(clean(10).raw_tier(), CapabilityTier::Strong);
assert_ne!(clean(10).raw_tier(), CapabilityTier::Struggling);
let mut est = CapabilityEstimator::new();
let snapshot = clean(10);
est.observe(&snapshot);
assert_ne!(est.tier(), CapabilityTier::Struggling);
est.observe(&snapshot);
assert_eq!(est.tier(), CapabilityTier::Strong);
}
#[test]
fn heavy_repair_and_scavenge_struggles() {
let c = CapabilityCounters {
tool_calls: 12,
repair_invalid: 3,
scavenged_calls: 2,
..Default::default()
};
assert_eq!(c.raw_tier(), CapabilityTier::Struggling);
let mut est = CapabilityEstimator::new();
est.observe(&c);
assert_eq!(est.tier(), CapabilityTier::Nominal);
est.observe(&c);
assert_eq!(est.tier(), CapabilityTier::Struggling);
}
#[test]
fn hysteresis_blocks_single_observation_flip_both_directions() {
let mut est = CapabilityEstimator::new();
let good = clean(20);
let bad = CapabilityCounters {
tool_calls: 6,
repair_invalid: 4,
scavenged_calls: 2,
..Default::default()
};
est.observe(&good);
est.observe(&good);
assert_eq!(est.tier(), CapabilityTier::Strong);
est.observe(&bad);
assert_eq!(
est.tier(),
CapabilityTier::Strong,
"single bad observation must not flip Strong -> Struggling"
);
est.observe(&good);
assert_eq!(est.tier(), CapabilityTier::Strong);
let mut est = CapabilityEstimator::new();
est.observe(&bad);
est.observe(&bad);
assert_eq!(est.tier(), CapabilityTier::Struggling);
est.observe(&good);
assert_eq!(
est.tier(),
CapabilityTier::Struggling,
"single clean observation must not flip Struggling -> Strong"
);
est.observe(&bad);
assert_eq!(est.tier(), CapabilityTier::Struggling);
}
#[test]
fn scale_is_identity_for_nominal_and_directional_otherwise() {
for base in [0u32, 1, 7, 42, 1_000, u32::MAX] {
assert_eq!(
CapabilityTier::Nominal.scale_threshold(base),
base,
"Nominal must return base bit-identically"
);
}
assert_eq!(CapabilityTier::Strong.scale_threshold(10), 15);
assert_eq!(CapabilityTier::Struggling.scale_threshold(10), 5);
assert!(CapabilityTier::Strong.scale_threshold(10) > 10);
assert!(CapabilityTier::Struggling.scale_threshold(10) < 10);
}
#[test]
fn rates_not_counts() {
let diluted = CapabilityCounters {
tool_calls: 40,
errored_tool_calls: 4,
..Default::default()
};
let concentrated = CapabilityCounters {
tool_calls: 6,
errored_tool_calls: 4,
..Default::default()
};
let diluted_tier = diluted.raw_tier();
let concentrated_tier = concentrated.raw_tier();
assert_eq!(diluted_tier, CapabilityTier::Nominal);
assert_eq!(concentrated_tier, CapabilityTier::Struggling);
fn rank(t: CapabilityTier) -> u8 {
match t {
CapabilityTier::Strong => 0,
CapabilityTier::Nominal => 1,
CapabilityTier::Struggling => 2,
}
}
assert!(rank(diluted_tier) < rank(concentrated_tier));
}
#[test]
fn struggling_threshold_never_truncates_to_zero() {
for base in 1..=4u32 {
assert!(
CapabilityTier::Struggling.scale_threshold(base) >= 1,
"scale_threshold({base}) must not zero out the gate"
);
}
assert_eq!(CapabilityTier::Struggling.scale_threshold(0), 0);
assert_eq!(CapabilityTier::Strong.scale_threshold(0), 0);
}
#[test]
fn budget_scales_opposite_to_threshold() {
let base = 4;
assert!(
CapabilityTier::Struggling.scale_budget(base) > base,
"a failing run gets MORE help, not less"
);
assert!(
CapabilityTier::Strong.scale_budget(base) < base,
"a coping run gets fewer interruptions"
);
assert_eq!(CapabilityTier::Nominal.scale_budget(base), base);
assert_eq!(CapabilityTier::Nominal.scale_threshold(base), base);
for b in 1..=4u32 {
assert!(CapabilityTier::Strong.scale_budget(b) >= 1);
}
}
fn settled(counters: &CapabilityCounters) -> CapabilityTier {
let mut est = CapabilityEstimator::new();
for _ in 0..3 {
est.observe(counters);
}
est.tier()
}
#[test]
fn observed_glm_thrash_run_reads_as_struggling() {
let obs = CapabilityCounters {
tool_calls: 40,
errored_tool_calls: 5,
repair_invalid: 4,
max_failure_streak: 3,
..Default::default()
};
assert_eq!(
settled(&obs),
CapabilityTier::Struggling,
"4 undispatchable calls and a 3-long failure streak is a run in trouble"
);
}
#[test]
fn observed_deepseek_clean_run_is_not_struggling() {
let obs = CapabilityCounters {
tool_calls: 35,
..Default::default()
};
assert_ne!(
settled(&obs),
CapabilityTier::Struggling,
"a clean run must never be branded struggling because the model is small"
);
}
#[test]
fn tier_tracks_the_run_not_the_model() {
let strong_model_bad_run = CapabilityCounters {
tool_calls: 40,
errored_tool_calls: 5,
repair_invalid: 4,
max_failure_streak: 3,
..Default::default()
};
let weak_model_good_run = CapabilityCounters {
tool_calls: 35,
..Default::default()
};
assert_eq!(settled(&strong_model_bad_run), CapabilityTier::Struggling);
assert_ne!(settled(&weak_model_good_run), CapabilityTier::Struggling);
}
#[test]
fn same_model_clean_run_ranks_above_its_own_bad_run() {
let good = CapabilityCounters {
tool_calls: 20,
errored_tool_calls: 1,
repair_invalid: 1,
max_failure_streak: 1,
..Default::default()
};
assert_ne!(settled(&good), CapabilityTier::Struggling);
}
}