diff --git a/hive-ag3nt/src/stats.rs b/hive-ag3nt/src/stats.rs index ff28d916..020dec90 100644 --- a/hive-ag3nt/src/stats.rs +++ b/hive-ag3nt/src/stats.rs @@ -367,9 +367,15 @@ fn fill_buckets( let avg = if sorted.is_empty() { 0.0 } else { - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "stat magnitudes (counts, token + duration sums) stay well under f64's 2^53 exact-integer range, so this averaging cast loses no precision in practice" + )] let sum_f = sorted.iter().sum::() as f64; - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "stat magnitudes (counts, token + duration sums) stay well under f64's 2^53 exact-integer range, so this averaging cast loses no precision in practice" + )] let len_f = sorted.len() as f64; sum_f / len_f }; @@ -378,9 +384,15 @@ fn fill_buckets( let avg_ctx = if acc.turn_count == 0 { 0.0 } else { - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "stat magnitudes (counts, token + duration sums) stay well under f64's 2^53 exact-integer range, so this averaging cast loses no precision in practice" + )] let sum_f = acc.ctx_sum as f64; - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "stat magnitudes (counts, token + duration sums) stay well under f64's 2^53 exact-integer range, so this averaging cast loses no precision in practice" + )] let cnt_f = acc.turn_count as f64; sum_f / cnt_f }; @@ -427,9 +439,15 @@ fn summarize_durations(all: &mut [i64]) -> DurationSummary { return DurationSummary::default(); } all.sort_unstable(); - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "stat magnitudes (counts, token + duration sums) stay well under f64's 2^53 exact-integer range, so this averaging cast loses no precision in practice" + )] let sum_f = all.iter().sum::() as f64; - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "stat magnitudes (counts, token + duration sums) stay well under f64's 2^53 exact-integer range, so this averaging cast loses no precision in practice" + )] let len_f = all.len() as f64; DurationSummary { avg_ms: sum_f / len_f, diff --git a/hive-c0re/src/container_stats.rs b/hive-c0re/src/container_stats.rs index ea488da4..bd39097e 100644 --- a/hive-c0re/src/container_stats.rs +++ b/hive-c0re/src/container_stats.rs @@ -141,16 +141,25 @@ pub async fn gather() -> Vec { let t0: Vec> = candidates.iter().map(|(_, d)| read_usage_usec(d)).collect(); sleep(CPU_SAMPLE).await; - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "CPU-utilisation math; the operands (core count, microsecond sample interval, cgroup time delta) stay well under f64's 2^53 exact-integer range, so no precision is lost" + )] let nproc = host_nproc() as f64; - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "CPU-utilisation math; the operands (core count, microsecond sample interval, cgroup time delta) stay well under f64's 2^53 exact-integer range, so no precision is lost" + )] let interval_usec = CPU_SAMPLE.as_micros() as f64; let mut out: Vec = Vec::with_capacity(candidates.len()); for (i, (name, dir)) in candidates.iter().enumerate() { let cpu_pct = match (t0[i], read_usage_usec(dir)) { (Some(a), Some(b)) => { - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "CPU-utilisation math; the operands (core count, microsecond sample interval, cgroup time delta) stay well under f64's 2^53 exact-integer range, so no precision is lost" + )] let delta = b.saturating_sub(a) as f64; (delta / (interval_usec * nproc)) * 100.0 } diff --git a/hive-c0re/src/hive_stats.rs b/hive-c0re/src/hive_stats.rs index 28e3d44b..e70f984d 100644 --- a/hive-c0re/src/hive_stats.rs +++ b/hive-c0re/src/hive_stats.rs @@ -205,7 +205,10 @@ fn read_agent(path: &Path, from: i64) -> rusqlite::Result { agg.cache_read = agg.cache_read.saturating_add(cache_read); agg.cache_creation = agg.cache_creation.saturating_add(cache_creation); let p = model_prices(&model); - #[allow(clippy::cast_precision_loss)] + #[allow( + clippy::cast_precision_loss, + reason = "token counts stay well under f64's 2^53 exact-integer range, so this cost computation loses no precision" + )] { agg.cost += (input as f64 * p.input + output as f64 * p.output