Problem
crates/stella-cli/src/subagent.rs:169 documents DEFAULT_POOL_LIMIT_USD = 2.0 as the bound that stops 'a model looping on task'. It is dead:
install_for_session (:298-309) — the only production installer (command_deck.rs:354, agent.rs:248/734, fleet_cmd.rs:687, subsession.rs:675, agent/resume.rs:86, agent/goal.rs:28/219) — passes pool_limit_usd: None, and BudgetGuard::new(mode, None, None) is unlimited (budget.rs:155-168).
SessionSubAgents::with_pool_limit (:257-263) replaces the guard wholesale, so even the constant's own path discards any prior mode.
- Children compound it:
SubAgentSpec::default().budget_usd = None and carve(None, None) yields ceiling: None (budget.rs:373-378); install_for_session passes BudgetMode::Observed, so even a limit would only warn.
A session without --budget where the model wedges on delegation runs every child to max_steps with no dollar bound at any layer.
Fix direction
Wire DEFAULT_POOL_LIMIT_USD as the pool default in install_for_session (observed mode: it WARNS at $2, per the standing 'degradation warns, never disables' policy), overridable by settings; when the parent session runs an enforced budget, the pool should inherit enforced mode. The decision of warn-vs-stop at the pool ceiling is the maintainer's call — state both options in the PR.
Verify
Witness: install_for_session with no explicit limit yields a pool guard whose ceiling is 2.0 (and mode matches the session's); a child carve against it sees finite headroom.
Constraints
This becomes URGENT once PR #1836 lands: concurrent siblings can carve in parallel (overshoot = up to 7 extra child caps — see the corrected doc in that PR).
Problem
crates/stella-cli/src/subagent.rs:169documentsDEFAULT_POOL_LIMIT_USD = 2.0as the bound that stops 'a model looping on task'. It is dead:install_for_session(:298-309) — the only production installer (command_deck.rs:354, agent.rs:248/734, fleet_cmd.rs:687, subsession.rs:675, agent/resume.rs:86, agent/goal.rs:28/219) — passespool_limit_usd: None, andBudgetGuard::new(mode, None, None)is unlimited (budget.rs:155-168).SessionSubAgents::with_pool_limit(:257-263) replaces the guard wholesale, so even the constant's own path discards any prior mode.SubAgentSpec::default().budget_usd = Noneandcarve(None, None)yieldsceiling: None(budget.rs:373-378);install_for_sessionpassesBudgetMode::Observed, so even a limit would only warn.A session without
--budgetwhere the model wedges on delegation runs every child to max_steps with no dollar bound at any layer.Fix direction
Wire
DEFAULT_POOL_LIMIT_USDas the pool default ininstall_for_session(observed mode: it WARNS at $2, per the standing 'degradation warns, never disables' policy), overridable by settings; when the parent session runs an enforced budget, the pool should inherit enforced mode. The decision of warn-vs-stop at the pool ceiling is the maintainer's call — state both options in the PR.Verify
Witness: install_for_session with no explicit limit yields a pool guard whose ceiling is 2.0 (and mode matches the session's); a child carve against it sees finite headroom.
Constraints
This becomes URGENT once PR #1836 lands: concurrent siblings can carve in parallel (overshoot = up to 7 extra child caps — see the corrected doc in that PR).