e599f1299c
The batch took the 500 soonest-expiring watches of a group every tick, so a group larger than the cap could leave the rest unchecked until the first 500 expired. The group is now ordered least-recently-checked first, with a generated cadence_minutes column and an index so the due predicate no longer re-parses the spec JSON per tick.