Utility AI scores how desirable each action is in context. It suits continuous priorities—heal or fight, seek cover or advance—but becomes opaque when many curves interact.
Separate eligibility from preference
First remove actions that cannot run: no ammunition, unreachable target, cooldown active. Then score the eligible set. Each consideration should map a named input to a normalised value with clamping and documented units.
Control curve complexity
Begin with linear or simple piecewise curves. Multiplying many scores can collapse values; summing can let one strong input hide a critical weakness. Choose aggregation deliberately and display intermediate values.
Prevent oscillation
Use commitment windows, switching costs or hysteresis. Reconsider immediately for urgent events, but let ordinary actions finish meaningful phases. Randomness should break near-ties, not hide instability.
Debug decisions
Record the winner, runner-up, raw inputs, transformed scores and disqualifiers. A timeline reveals when the balance changed. Compare with Reusable AI… Salvation or Holy Grail?.