use degenbot_config::FleetConfig;
pub const DEFAULT_RESERVE_CPUS: u64 = 1;
pub const MIN_SOLVER_CPUS: u64 = 2;
pub const DEFAULT_SIM_SLOT_CAP: usize = 4;
pub const DEFAULT_POOL_STATE_UPDATER_SLOTS: usize = 4;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct BudgetOverrides {
pub reserve_cpus: Option<u64>,
pub ambient_io_workers: Option<u64>,
pub solver_cpus: Option<u64>,
pub sim_slot_cap: Option<usize>,
pub pool_state_updater_slots: Option<usize>,
pub solve_headroom: Option<usize>,
}
impl BudgetOverrides {
#[must_use]
pub fn from_config(cfg: °enbot_config::BotConfig) -> Self {
Self {
reserve_cpus: cfg.fleet.reserve_cpus.and_then(|v| u64::try_from(v).ok()),
ambient_io_workers: cfg.runtime.io_workers.and_then(|v| u64::try_from(v).ok()),
solver_cpus: cfg.fleet.solver_cpus.and_then(|v| u64::try_from(v).ok()),
sim_slot_cap: cfg.fleet.sim_slot_cap,
pool_state_updater_slots: cfg.fleet.pool_state_updater_slots,
solve_headroom: cfg.solve.solve_headroom,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, thiserror::Error)]
pub enum BudgetError {
#[error(
"fleet budget oversubscribed: declared peak shares {declared} cores exceed \
floor(quota {quota}) = {floor} — oversubscription is a configuration bug, failed at boot"
)]
Oversubscribed {
quota: f64,
floor: u64,
declared: u64,
},
#[error(
"fractional quota {quota:.2} below the pinned-role floor of {required} cores \
(reserve H + ambient A + resolve R + merge M + the 2-core Solver minimum); \
the fleet cannot host the pinned latency roles there — the \
serial/sequential fallback DECISION POINT is here (reth \
has_enough_parallelism(): lane capability is explicit, never silently \
narrower); the fallback arm itself is a DOWNSTREAM decision (LW-T7)"
)]
QuotaTooSmallForPinnedRoles {
quota: f64,
required: u64,
},
#[error("fleet Solver share derives to {solver} < the {min}-core minimum")]
TooFewSolverCpus {
solver: u64,
min: u64,
},
#[error(
"fractional quota {quota:.2} below the 2-core host floor (one core for I/O \
work, one core for solve work) — no binding can host the fleet there \
(raise the host CPU budget / affinity to at least 2 cores)"
)]
BelowHostFloor {
quota: f64,
},
#[error(
"runtime.io_workers override {requested} is out of bounds for the {binding} \
binding (pinned: A >= 1, the SMTH6M ambient floor; serial: exactly one \
ambient I/O lane) — fix or drop the override, never a silent clamp"
)]
IoWorkersOutOfBounds {
requested: u64,
binding: &'static str,
},
}
impl BudgetError {
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
Self::Oversubscribed { .. } => "Oversubscribed",
Self::QuotaTooSmallForPinnedRoles { .. } => "QuotaTooSmallForPinnedRoles",
Self::TooFewSolverCpus { .. } => "TooFewSolverCpus",
Self::BelowHostFloor { .. } => "BelowHostFloor",
Self::IoWorkersOutOfBounds { .. } => "IoWorkersOutOfBounds",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ConsumerShare {
pub consumer: &'static str,
pub peak_cpus: u64,
pub thread_count: usize,
pub sizing: &'static str,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct FleetBudget {
pub quota_cpus: f64,
pub quota_floor: u64,
pub reserve_cpus: u64,
pub ambient_cpus: u64,
pub resolve_cpus: u64,
pub merge_cpus: u64,
pub solver_cpus: u64,
pub solver_pin_count: usize,
pub sim_slot_cap: usize,
pub pool_state_updater_slots: usize,
pub fractional_remainder: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum BudgetMode {
Pinned,
PinnedMarked,
Serial,
}
pub const HOST_FLOOR_CORES: u64 = 2;
impl FleetBudget {
pub fn derive(quota_cpus: f64, overrides: &BudgetOverrides) -> Result<Self, BudgetError> {
Self::project(quota_cpus, overrides, BudgetMode::Pinned)
}
#[expect(
clippy::cast_possible_truncation,
reason = "quota floors are small positive values (core counts)"
)]
#[expect(
clippy::cast_precision_loss,
reason = "core counts are exact in f64 at any realistic quota"
)]
#[expect(
clippy::cast_sign_loss,
reason = "the floor is clamped to >= 1.0 before the cast"
)]
pub(crate) fn project(
quota_cpus: f64,
overrides: &BudgetOverrides,
mode: BudgetMode,
) -> Result<Self, BudgetError> {
let quota_floor = quota_cpus.max(1.0).floor() as u64;
let reserve_cpus = overrides.reserve_cpus.unwrap_or(DEFAULT_RESERVE_CPUS);
let ambient_cpus = overrides
.ambient_io_workers
.unwrap_or_else(|| ((quota_floor.saturating_sub(reserve_cpus)) / 4).max(1));
let (resolve_cpus, merge_cpus) = (1, 1);
let base = reserve_cpus + ambient_cpus + resolve_cpus + merge_cpus;
let solve_headroom = overrides
.solve_headroom
.unwrap_or(degenbot_core::cpu_budget::DEFAULT_SOLVE_HEADROOM);
let sim_slot_cap = overrides.sim_slot_cap.unwrap_or(DEFAULT_SIM_SLOT_CAP);
let pool_state_updater_slots = overrides
.pool_state_updater_slots
.unwrap_or(DEFAULT_POOL_STATE_UPDATER_SLOTS);
let pinned_pin_count = usize::try_from(quota_floor)
.unwrap_or(usize::MAX)
.saturating_sub(solve_headroom)
.max(1);
match mode {
BudgetMode::Pinned => {
if base + MIN_SOLVER_CPUS > quota_floor {
return Err(BudgetError::QuotaTooSmallForPinnedRoles {
quota: quota_cpus,
required: base + MIN_SOLVER_CPUS,
});
}
let solver_cpus = overrides.solver_cpus.unwrap_or(quota_floor - base);
if base + solver_cpus > quota_floor {
return Err(BudgetError::Oversubscribed {
quota: quota_cpus,
floor: quota_floor,
declared: base + solver_cpus,
});
}
if solver_cpus < MIN_SOLVER_CPUS {
return Err(BudgetError::TooFewSolverCpus {
solver: solver_cpus,
min: MIN_SOLVER_CPUS,
});
}
Ok(Self {
quota_cpus,
quota_floor,
reserve_cpus,
ambient_cpus,
resolve_cpus,
merge_cpus,
solver_cpus,
solver_pin_count: pinned_pin_count,
sim_slot_cap,
pool_state_updater_slots,
fractional_remainder: quota_cpus - (base + solver_cpus) as f64,
})
}
BudgetMode::PinnedMarked => {
let solver_cpus = overrides
.solver_cpus
.unwrap_or_else(|| quota_floor.saturating_sub(base).max(MIN_SOLVER_CPUS));
Ok(Self {
quota_cpus,
quota_floor,
reserve_cpus,
ambient_cpus,
resolve_cpus,
merge_cpus,
solver_cpus,
solver_pin_count: pinned_pin_count,
sim_slot_cap,
pool_state_updater_slots,
fractional_remainder: (quota_cpus - (base + solver_cpus) as f64).max(0.0),
})
}
BudgetMode::Serial => Ok(Self {
quota_cpus,
quota_floor,
reserve_cpus,
ambient_cpus: 1,
resolve_cpus,
merge_cpus,
solver_cpus: MIN_SOLVER_CPUS,
solver_pin_count: 1,
sim_slot_cap,
pool_state_updater_slots,
fractional_remainder: (quota_cpus - HOST_FLOOR_CORES as f64).max(0.0),
}),
}
}
#[must_use]
pub const fn declared_sum(&self) -> u64 {
self.reserve_cpus
+ self.ambient_cpus
+ self.resolve_cpus
+ self.merge_cpus
+ self.solver_cpus
}
#[must_use]
pub fn allocation_table(&self) -> Vec<ConsumerShare> {
vec![
ConsumerShare {
consumer: "reserve",
peak_cpus: self.reserve_cpus,
thread_count: 0,
sizing: "fixed; must never starve I/O",
},
ConsumerShare {
consumer: "ambient_io",
peak_cpus: self.ambient_cpus,
thread_count: usize::try_from(self.ambient_cpus).unwrap_or(1),
sizing: "max(1, floor((Q-H)/4)); DEGENBOT_IO_WORKERS override is terminal",
},
ConsumerShare {
consumer: "resolve",
peak_cpus: self.resolve_cpus,
thread_count: usize::try_from(self.resolve_cpus).unwrap_or(1),
sizing: "fixed v1 (12.4 ms/cycle measured)",
},
ConsumerShare {
consumer: "merge",
peak_cpus: self.merge_cpus,
thread_count: usize::try_from(self.merge_cpus).unwrap_or(1),
sizing: "exactly one sidecar",
},
ConsumerShare {
consumer: "solver",
peak_cpus: self.solver_cpus,
thread_count: self.solver_pin_count,
sizing: "Q - H - A - R - M (>= 2 or fail-fast); pins = one per LPT bin (floor(Q) - solve headroom)",
},
]
}
pub fn resize(
&self,
new_quota_cpus: f64,
new_overrides: &BudgetOverrides,
) -> Result<Self, BudgetError> {
Self::derive(new_quota_cpus, new_overrides)
}
#[must_use]
pub const fn pins_require_rekey(&self, next: &FleetBudget) -> bool {
self.solver_pin_count != next.solver_pin_count
}
}
#[must_use]
pub fn detected_quota_cpus(cfg: &FleetConfig) -> f64 {
cfg.quota_cpus
.filter(|q| *q >= 1.0)
.unwrap_or_else(crate::quota::fractional_cpu_budget)
}
#[cfg(test)]
#[expect(clippy::expect_used)]
mod tests {
use super::*;
fn overrides() -> BudgetOverrides {
BudgetOverrides::default()
}
#[test]
fn the_8_core_quota_table_sums_exactly_against_the_floor() {
let b = FleetBudget::derive(8.0, &overrides()).expect("8-core quota hostable");
assert_eq!(b.quota_floor, 8);
assert_eq!(b.declared_sum(), b.quota_floor);
assert_eq!(b.reserve_cpus, 1);
assert_eq!(b.resolve_cpus, 1);
assert_eq!(b.merge_cpus, 1);
assert_eq!(b.ambient_cpus, 1);
assert_eq!(b.solver_cpus, 4);
assert_eq!(b.solver_pin_count, 6);
}
#[test]
fn the_worked_8_core_table_split_is_reachable_via_the_terminal_override() {
let b = FleetBudget::derive(
8.0,
&BudgetOverrides {
ambient_io_workers: Some(2),
..overrides()
},
)
.expect("hostable");
assert_eq!(b.ambient_cpus, 2);
assert_eq!(b.solver_cpus, 3);
assert_eq!(b.solver_pin_count, 6);
assert_eq!(b.declared_sum(), 8);
}
#[test]
fn a_quota_below_the_pinned_role_floor_fails_fast() {
let err = FleetBudget::derive(4.5, &overrides()).expect_err("too small");
assert!(matches!(
err,
BudgetError::QuotaTooSmallForPinnedRoles { .. }
));
}
#[test]
fn the_refusal_family_names_its_typed_variants() {
let cases: [(BudgetError, &str); 5] = [
(
BudgetError::Oversubscribed {
quota: 4.0,
floor: 4,
declared: 7,
},
"Oversubscribed",
),
(
BudgetError::QuotaTooSmallForPinnedRoles {
quota: 4.0,
required: 6,
},
"QuotaTooSmallForPinnedRoles",
),
(
BudgetError::TooFewSolverCpus {
solver: 1,
min: MIN_SOLVER_CPUS,
},
"TooFewSolverCpus",
),
(BudgetError::BelowHostFloor { quota: 1.5 }, "BelowHostFloor"),
(
BudgetError::IoWorkersOutOfBounds {
requested: 0,
binding: "pinned",
},
"IoWorkersOutOfBounds",
),
];
for (err, expected) in cases {
assert_eq!(err.name(), expected, "{expected} names itself");
assert!(
!err.to_string().contains(expected),
"the wording stays the sentence; the name rides explicitly: {err}"
);
}
}
#[test]
fn fractional_quota_banks_the_remainder_outside_the_integer_sum() {
let b = FleetBudget::derive(6.5, &overrides()).expect("hostable");
assert_eq!(b.quota_floor, 6);
assert_eq!(b.declared_sum(), 6);
assert!((b.fractional_remainder - 0.5).abs() < 1e-9);
assert_eq!(b.solver_cpus, 2);
assert_eq!(b.solver_pin_count, 4);
}
#[test]
fn seat_count_is_quota_headroom_derived_under_the_documented_formula_only() {
for quota in [1.0_f64, 1.5, 4.0, 8.0, 24.0] {
for headroom in [1_usize, 2] {
let overrides = BudgetOverrides {
solve_headroom: Some(headroom),
..overrides()
};
#[expect(
clippy::cast_possible_truncation,
reason = "quota floors are exact for the injected positive reals"
)]
#[expect(
clippy::cast_sign_loss,
reason = "the injected quotas are all strictly positive"
)]
let q_floor = quota.max(1.0).floor() as u64;
let b = match FleetBudget::derive(quota, &overrides) {
Ok(b) => b,
Err(err @ BudgetError::QuotaTooSmallForPinnedRoles { .. }) => {
let msg = err.to_string();
assert!(
msg.contains(&format!("{q_floor} numerically"))
|| msg.contains("pinned-role floor"),
"the capacity-floor error must name the floor: {msg}"
);
assert!(
msg.contains("serial/sequential"),
"the typed floor error must name the serial/sequential fallback decision point (reth has_enough_parallelism): {msg}"
);
continue;
}
Err(other) => {
#[expect(
clippy::panic,
reason = "an unexpected typed refusal is the fixture's failure mode"
)]
{
panic!("unexpected typed refusal at quota {quota}: {other}")
}
}
};
assert!(
q_floor > u64::try_from(headroom).unwrap_or(0),
"a quota below headroom+1 must have taken the typed floor arm above"
);
assert_eq!(
b.solver_pin_count as u64,
q_floor
.saturating_sub(u64::try_from(headroom).unwrap_or(0))
.max(1),
"seat count must be f(quota, headroom): quota {quota}, headroom {headroom}"
);
assert_eq!(
b.declared_sum(),
q_floor,
"the integer share sum must be exactly floor(Q)"
);
{
let q = u32::try_from(q_floor).expect("injected quotas are < 2^24");
let quoted = quota - f64::from(q);
assert!(
(b.fractional_remainder - quoted).abs() < 1e-12,
"the fractional remainder is Q − floor(Q), spendable only by I/O: {} vs {quoted}",
b.fractional_remainder
);
}
}
}
}
#[test]
fn seat_sizing_never_reads_ambient_parallelism() {
let src = std::fs::read_to_string(concat!(env!("CARGO_MANIFEST_DIR"), "/src/budget.rs"))
.expect("crate source readable");
let lib = src
.split("#[cfg(test)]")
.next()
.expect("the lib segment always exists");
assert!(
!lib.contains("available_parallelism"),
"the boot authority must never size lanes off ambient parallelism (reth lesson-4)"
);
}
#[test]
fn oversubscription_is_typed_at_boot_and_names_both_numbers() {
let err = FleetBudget::derive(
8.0,
&BudgetOverrides {
ambient_io_workers: Some(2),
solver_cpus: Some(4),
..overrides()
},
)
.expect_err("H1+A2+R1+M1+S4 = 9 > 8");
assert!(matches!(err, BudgetError::Oversubscribed { .. }));
let msg = err.to_string();
assert!(
msg.contains('9'),
"the message must name the declared sum: {msg}"
);
assert!(
msg.contains('8'),
"the message must name the quota floor: {msg}"
);
}
#[test]
fn quota_below_the_capacity_floor_refuses_typed_naming_the_fallback_point() {
let err = FleetBudget::derive(2.0, &overrides())
.expect_err("quota 2.0 < the pinned-role floor must refuse typed");
assert!(matches!(
err,
BudgetError::QuotaTooSmallForPinnedRoles { .. }
));
let msg = err.to_string();
assert!(
msg.contains("serial"),
"the typed floor error must name the serial/sequential fallback decision point: {msg}"
);
}
#[test]
fn oversubscription_by_overrides_fails_at_boot() {
let err = FleetBudget::derive(
8.0,
&BudgetOverrides {
ambient_io_workers: Some(2),
solver_cpus: Some(4),
..overrides()
},
)
.expect_err("H1+A2+R1+M1+S4 = 9 > 8");
assert!(matches!(err, BudgetError::Oversubscribed { .. }));
}
#[test]
fn a_sub_minimum_solver_share_is_refused() {
let err = FleetBudget::derive(
8.0,
&BudgetOverrides {
solver_cpus: Some(1),
..overrides()
},
)
.expect_err("S=1 < the 2-core minimum");
assert!(matches!(err, BudgetError::TooFewSolverCpus { .. }));
}
#[test]
fn resize_redeclares_shares_and_keeps_the_sum_invariant() {
let big = FleetBudget::derive(8.0, &overrides()).expect("8");
let small = big.resize(6.5, &overrides()).expect("6.5 hostable");
assert_eq!(small.declared_sum(), small.quota_floor);
assert!(big.pins_require_rekey(&small));
let same = big.resize(8.0, &overrides()).expect("8 again");
assert!(!big.pins_require_rekey(&same));
}
#[test]
fn the_registration_intake_station_is_duty_counted_like_sim() {
let b = FleetBudget::derive(8.0, &overrides()).expect("hostable");
assert_eq!(b.pool_state_updater_slots, DEFAULT_POOL_STATE_UPDATER_SLOTS);
assert_eq!(b.declared_sum(), b.quota_floor);
let b2 = FleetBudget::derive(
8.0,
&BudgetOverrides {
pool_state_updater_slots: Some(6),
..overrides()
},
)
.expect("hostable");
assert_eq!(b2.pool_state_updater_slots, 6);
assert_eq!(b2.declared_sum(), b2.quota_floor);
}
#[test]
fn the_pool_state_updater_override_projects_from_the_typed_config() {
let mut cfg = degenbot_config::BotConfig::default();
cfg.fleet.pool_state_updater_slots = Some(6);
let o = BudgetOverrides::from_config(&cfg);
assert_eq!(o.pool_state_updater_slots, Some(6));
let b = FleetBudget::derive(8.0, &o).expect("hostable");
assert_eq!(b.pool_state_updater_slots, 6);
}
#[test]
fn allocation_table_covers_every_consumer_row() {
let b = FleetBudget::derive(8.0, &overrides()).expect("8");
let consumers: Vec<&str> = b
.allocation_table()
.into_iter()
.map(|s| s.consumer)
.collect();
for want in ["reserve", "ambient_io", "resolve", "merge", "solver"] {
assert!(consumers.contains(&want), "missing {want}");
}
}
#[test]
fn typed_config_projection_carries_the_override_fields() {
let mut cfg = degenbot_config::BotConfig::default();
cfg.fleet.solver_cpus = Some(3);
cfg.runtime.io_workers = Some(2);
cfg.fleet.sim_slot_cap = Some(6);
let o = BudgetOverrides::from_config(&cfg);
assert_eq!(o.solver_cpus, Some(3));
assert_eq!(o.ambient_io_workers, Some(2));
assert_eq!(o.sim_slot_cap, Some(6));
let b = FleetBudget::derive(8.0, &o).expect("hostable");
assert_eq!(b.solver_cpus, 3);
assert_eq!(b.sim_slot_cap, 6);
}
#[test]
fn the_solve_headroom_override_projects_from_the_typed_config() {
let loaded = degenbot_config::BotConfigLoader::new()
.without_env()
.with_cli("solve.solve_headroom", "2")
.load()
.expect("the headroom override must load from the explicit CLI layer");
assert_eq!(loaded.config.solve.solve_headroom, Some(2));
let o = BudgetOverrides::from_config(&loaded.config);
assert_eq!(o.solve_headroom, Some(2));
let b = FleetBudget::derive(8.0, &o).expect("hostable");
assert_eq!(b.solver_pin_count, 6);
assert_eq!(b.declared_sum(), b.quota_floor);
assert_eq!(
BudgetOverrides::from_config(°enbot_config::BotConfig::default()).solve_headroom,
None
);
}
fn ambient_formula(floor: u64, reserve: u64) -> u64 {
((floor.saturating_sub(reserve)) / 4).max(1)
}
fn pin_formula(floor: u64, headroom: usize) -> usize {
usize::try_from(floor)
.unwrap_or(usize::MAX)
.saturating_sub(headroom)
.max(1)
}
#[expect(
clippy::cast_precision_loss,
reason = "test quotas and small share sums are exact in f64"
)]
fn assert_pinned_projection(
quota: f64,
floor: u64,
ov: &BudgetOverrides,
reserve: u64,
ambient: u64,
pins: usize,
) {
let base = reserve + ambient + 2;
match FleetBudget::project(quota, ov, BudgetMode::Pinned) {
Ok(b) => {
assert_eq!(b.reserve_cpus, reserve, "pinned reserve H");
assert_eq!(
b.ambient_cpus, ambient,
"pinned ambient A = max(1, (Q-H)/4)"
);
assert_eq!(
b.solver_cpus,
ov.solver_cpus.unwrap_or(floor - base),
"pinned solver S = floor(Q) - H - A - R - M"
);
assert_eq!(
b.solver_pin_count, pins,
"pinned pins = floor(Q) - headroom"
);
assert!(
b.declared_sum() <= floor,
"pinned sum-check never oversubscribes floor(quota)"
);
if ov.solver_cpus.is_none() {
assert_eq!(b.declared_sum(), floor, "pinned default fills floor(quota)");
}
assert!(
(b.fractional_remainder - (quota - b.declared_sum() as f64)).abs() < 1e-9,
"pinned remainder banks Q - declared_sum"
);
}
Err(refusal) => assert!(
matches!(
refusal,
BudgetError::QuotaTooSmallForPinnedRoles { .. }
| BudgetError::Oversubscribed { .. }
| BudgetError::TooFewSolverCpus { .. }
),
"pinned refusal is a typed budget error, got {refusal:?}"
),
}
}
fn assert_marked_projection(
quota: f64,
floor: u64,
ov: &BudgetOverrides,
reserve: u64,
ambient: u64,
pins: usize,
) {
let base = reserve + ambient + 2;
let b = FleetBudget::project(quota, ov, BudgetMode::PinnedMarked).expect("marked total");
assert_eq!(b.reserve_cpus, reserve, "marked reserve H");
assert_eq!(
b.ambient_cpus, ambient,
"marked ambient A = max(1, (Q-H)/4)"
);
assert_eq!(
b.solver_cpus,
ov.solver_cpus
.unwrap_or_else(|| floor.saturating_sub(base).max(MIN_SOLVER_CPUS)),
"marked solver S = max(floor(Q) - base, MIN)"
);
assert_eq!(
b.solver_pin_count, pins,
"marked pins = floor(Q) - headroom"
);
assert!(
b.fractional_remainder >= 0.0,
"marked remainder clamps at zero"
);
}
#[expect(
clippy::cast_precision_loss,
reason = "the host floor is a tiny core count, exact in f64"
)]
fn assert_serial_projection(quota: f64, ov: &BudgetOverrides, reserve: u64) {
let b = FleetBudget::project(quota, ov, BudgetMode::Serial).expect("serial total");
assert_eq!(b.reserve_cpus, reserve, "serial reserve H");
assert_eq!(
b.ambient_cpus, 1,
"serial owns exactly one ambient I/O lane"
);
assert_eq!(
b.solver_cpus, MIN_SOLVER_CPUS,
"serial logical 2-core solve"
);
assert_eq!(b.solver_pin_count, 1, "serial-0: exactly one solve seat");
assert!(
(b.fractional_remainder - (quota - HOST_FLOOR_CORES as f64).max(0.0)).abs() < 1e-9,
"serial remainder is Q - the 2-core host floor"
);
}
#[test]
#[expect(
clippy::cast_possible_truncation,
reason = "quota floors are small positive values (core counts)"
)]
#[expect(
clippy::cast_sign_loss,
reason = "the test quota is floored at 1.0 before the cast"
)]
fn every_projection_mode_shares_the_derive_formulas() {
let cases: [BudgetOverrides; 3] = [
BudgetOverrides::default(),
BudgetOverrides {
ambient_io_workers: Some(2),
..BudgetOverrides::default()
},
BudgetOverrides {
reserve_cpus: Some(2),
solver_cpus: Some(3),
..BudgetOverrides::default()
},
];
for quota in [2.0_f64, 2.5, 4.0, 5.99, 6.0, 6.5, 8.0, 24.0, 33.25] {
let floor = quota.max(1.0).floor() as u64;
for ov in &cases {
let reserve = ov.reserve_cpus.unwrap_or(DEFAULT_RESERVE_CPUS);
let ambient = ov
.ambient_io_workers
.unwrap_or_else(|| ambient_formula(floor, reserve));
let headroom = ov
.solve_headroom
.unwrap_or(degenbot_core::cpu_budget::DEFAULT_SOLVE_HEADROOM);
let pins = pin_formula(floor, headroom);
assert_pinned_projection(quota, floor, ov, reserve, ambient, pins);
assert_marked_projection(quota, floor, ov, reserve, ambient, pins);
assert_serial_projection(quota, ov, reserve);
}
}
}
mod cross_authority {
use super::*;
use proptest::prelude::*;
prop_compose! {
fn quota_shape()(base in 1u64..=512u64, half in 0u8..2u8, affinity in 1u64..=1024u64)
-> (u64, u8, u64) {
(base, half, affinity)
}
}
proptest! {
#![proptest_config(proptest::test_runner::Config::with_cases(512))]
#[test]
#[expect(
clippy::cast_precision_loss,
reason = "quota units (1e6 scale, <= 5e8) are exact in f64"
)]
fn pins_and_solve_workers_follow_the_documented_floor_ceil_split(
(base, half, affinity) in quota_shape(),
) {
let units = base * 1_000_000 + u64::from(half) * 500_000;
let floor_q = units / 1_000_000;
let fractional = units % 1_000_000 != 0;
let budget = units.div_ceil(1_000_000).min(affinity).max(1);
let budget_usize = usize::try_from(budget).unwrap_or(usize::MAX);
let solve = degenbot_core::cpu_budget::solve_worker_count_from(
None, None, budget_usize,
);
let q = (units as f64) / 1_000_000.0;
if floor_q < 6 {
let refused = matches!(
FleetBudget::derive(q, &BudgetOverrides::default()),
Err(BudgetError::QuotaTooSmallForPinnedRoles { .. })
);
prop_assert!(refused);
} else {
let Ok(b) = FleetBudget::derive(q, &BudgetOverrides::default()) else {
return Err(TestCaseError::fail(format!(
"hostable shape refused: q = {q}"
)));
};
prop_assert_eq!(
b.solver_pin_count,
usize::try_from((floor_q - 2).max(1)).unwrap_or(usize::MAX)
);
if !fractional && affinity >= floor_q {
prop_assert_eq!(b.solver_pin_count, solve);
} else if fractional && budget == floor_q + 1 {
prop_assert_eq!(solve, b.solver_pin_count + 1);
} else if !fractional && affinity < floor_q {
prop_assert!(solve <= b.solver_pin_count);
} else if fractional && budget <= floor_q {
prop_assert!(solve <= b.solver_pin_count);
}
let _ = fractional; }
}
}
}
mod derivation {
use super::*;
use proptest::prelude::*;
fn overrides_shape() -> impl Strategy<Value = BudgetOverrides> {
(
1u64..=64u64,
0u64..=16u64,
0u64..=64u64,
0usize..=16usize,
0usize..=16usize,
)
.prop_map(|(h, a, s, sim, psu)| BudgetOverrides {
reserve_cpus: Some(h),
ambient_io_workers: Some(a),
solver_cpus: Some(s),
sim_slot_cap: Some(sim),
pool_state_updater_slots: Some(psu),
solve_headroom: None,
})
}
proptest! {
#![proptest_config(proptest::test_runner::Config::with_cases(512))]
#[test]
#[expect(
clippy::cast_precision_loss,
reason = "quota units (1e6 scale) and share sums (<= 640) are exact in f64"
)]
fn derive_is_total_and_typed_over_the_whole_input_space(
quota_units in 1u64..=64_000_000u64,
ov in overrides_shape(),
) {
let q = (quota_units as f64) / 1_000_000.0;
let floor_q = quota_units / 1_000_000;
match FleetBudget::derive(q, &ov) {
Ok(b) => {
prop_assert!(b.declared_sum() <= b.quota_floor);
prop_assert_eq!(b.quota_floor, floor_q);
let sum_f = b.declared_sum() as f64;
prop_assert!((b.fractional_remainder - (q - sum_f)).abs() < 1e-9);
prop_assert!(b.fractional_remainder >= 0.0 && b.fractional_remainder <= q);
prop_assert_eq!(
b.solver_pin_count,
usize::try_from(floor_q).unwrap_or(usize::MAX)
.saturating_sub(degenbot_core::cpu_budget::DEFAULT_SOLVE_HEADROOM)
.max(1)
);
}
Err(
BudgetError::QuotaTooSmallForPinnedRoles { .. }
| BudgetError::Oversubscribed { .. }
| BudgetError::TooFewSolverCpus { .. }
| BudgetError::BelowHostFloor { .. }
| BudgetError::IoWorkersOutOfBounds { .. },
) => {
}
}
}
}
}
}