Establish what is happening
Freeze the ordered input
Choose a sanitized batch with uniquely ordered records and record the input snapshot or selection timestamp. Number the expected items independently. This prevents a changed query or unstable ordering from being mistaken for a bad resume cursor.
Compare item commit and checkpoint times
Trace one interruption before an item commits and another immediately after it commits. Capture the item outcome, checkpoint value, worker exit, and restart cursor. Look for a checkpoint written ahead of durable work or left behind after committed work.
Inspect the resumed sequence
List every item processed after restart and compare it with the expected next item. Mark duplicates, omissions, and legitimate replays separately. If the input set changed, repeat against the original snapshot before assigning the problem to checkpoint logic.
What to carry forward
Return the input ordering, interruption point, last durable item, stored checkpoint, and resumed sequence. Classify the scope as replay, omission, unstable input, or missing checkpoint evidence. Keep the cause provisional when an item outcome and cursor were written by separate uncorrelated records.
Technical background: Rails guides.
Keep the decision with the work.
Use a Work Item in Aglet to record the problem, the evidence you have, and the next decision. Add an owner and priority, then keep updates in the discussion so the next person can follow the reasoning.
Create an account See the product workflow