Greedy Looks Smart Until The Bill Arrives
The reward-greedy policy does exactly what you told it to do and exactly what you were afraid it would do. It finds the reward, then blasts straight through the cost budget without a second thought, because nobody told it a budget existed.
riskbandit makes that tradeoff impossible to ignore. The synthetic logged data has contexts, actions, rewards, and costs. The benchmark trains separate reward and cost models, then asks the only question that matters: which policy actually survives a budget.
Conformal Bounds As A Gate, Not A Suggestion
The conformal policy calibrates cost residuals on held-out logged data. At decision time, it only considers actions whose upper cost estimate actually fits inside the budget, then picks the best reward among the survivors.
That makes safety a selection rule baked into the policy, not a paragraph in the README nobody enforces. If every risky action gets blocked, it falls back to the safe action instead of shrugging.
The Number
Reward-greedy averages 0.774 reward while violating the budget on 73.3% of decisions, which is what "optimize for reward, don't ask questions" looks like in practice. The conformal policy gives up some reward, landing at 0.572, but drops the violation rate to 0.7%. The safe action alone gets 0.442 reward with zero violations, the floor everything else gets measured against.
3 tests pass locally and on GitHub Actions across Python 3.9, 3.11, and 3.13.