Unifying two agent passes into one best-action loop silently kills behavior
When refactoring bespoke agent subsystems into one data-driven rule engine, watch for behavior collapse from the arbitration. Two old passes (form-alliances, then run-drives) each acted every tick, so an agent BOTH cooperated and fought. Merging them into one loop that fires the single best-scoring rule made cooperation (high score) always beat conflict (low score) -> raiding dropped ~5x, the threat field went flat, the world froze. Tests still passed (they only assert a behavior CAN happen once, not that the mix persists) so it was invisible without running a long simulation and watching aggregate churn. Fix: fire the best rule per UNMET GOAL (dedup by rule), with cooperation as its own standing goal, so martial/economic/social moves do not crowd each other out. General lesson: when collapsing N always-on subsystems into one arbitrated chooser, a single-winner policy loses the parallelism; either keep goals orthogonal (one action per goal) or budget multiple actions per step. Also: data-driven rules as {name, when:[predicate-names], effect, score} over a NAMED vocabulary registry (decorator-registered predicates/effects/scorers) lets a world override the whole rule library from a config blob with zero code, while keeping effect implementations as vetted code (bounded ops).