completeFire

open suspend override fun completeFire(scheduleId: String, fence: Long, runs: List<NewJob>, nextFireAt: Instant?): List<JobId>?

Applies one claimed fire ATOMICALLY: inserts runs with enqueue semantics (including the uniqueKey rule), advances the schedule's nextFireAt to nextFireAt (null makes the schedule dormant), sets lastFiredAt to the store's clock, and releases the lease, all in one transaction. Compare-and-set on fence: returns null and changes NOTHING, inserts no runs, when the stored fence differs. On success returns the run ids in runs order, existing ids on uniqueKey dedup, exactly like enqueue. An empty runs is a legal completion (a misfire handled with Skip, for example) and returns an empty list.