88b9503c3b
decide(lead, reminderCount) shared one counter across the reply and ticket sources after PR #84 collapsed both onto a single per-lead schedule. A reply stream that used up the whole budget could then make decide() STOP even for a ticket that had never been nudged and had coalesced onto the same still-active schedule — stranding it with no live schedule left, since stopOrRestart's racedIn check does not save work that was already present in the "before" snapshot. decide() now tracks a per-source count (replyReminderCount, ticketReminderCount) and returns INJECT while either source is still under its own cap, STOP only when both are exhausted. Still exactly one schedule per lead; stopOrRestart's snapshot-diff logic is untouched.