Primary finding
Budget config and record/restore accept invalid values leading to NaN/Infinity and inconsistent state
- src/budget.ts:58-68
- src/budget.ts:90-95
- src/budget.ts:70-75
- src/budget.ts:77-82
- src/budget.ts:131-144
No validation prevents zero/negative/NaN values for maxTokens, maxTurns, or costs. Division by zero yields Infinity; NaN inputs propagate through percentages and costs; negative tokens/costs produce nonsensical snapshots. record/restore also allow negative or NaN, enabling inconsistent internal state.
Recommendation
Validate and clamp config: require maxTokens/maxTurns > 0; clamp warnAtPercent to [0,100]; require costs >= 0. In record/restore, coerce inputs to non-negative finite numbers and reject/throw on invalid values.