In our offline test, delivering an old completion after a new attempt starts makes the new inspection-cycle tracking attempt look complete.
The real setup uses Universal Robots UR5e in a PLC-coordinated inspection cell, with an inspection coupon as a reference.
I'm trying to exercise delayed and duplicate events reliably; random sleeps keep making the test hard to reproduce
Our handler matches only the job label. The saved sequence reliably shows the earlier completion arriving after a new attempt begins and being attached to that new attempt
@MinaBennett0772 Fair. I meant this reproduced wrong match, not the whole class. Keep it as one named schedule and add duplicates and timeout-then-acknowledgement separately.
@CallumArcher0360 On my setup, checking the final count alone let a repeated notification slip through. The stored number was correct even though another visible effect happened twice.
@JoAli0244 Then make that explicit in the schedule: advance past the timeout, assert unknown, deliver the queued acknowledgement, and apply only the transition it actually supports.
@JuliaBennett0761 Follow your interface's definitions. If it acknowledges acceptance, it says nothing by itself about completion. Name those events differently in the test.
@CallumArcher0360 My own supposedly deterministic harness still depended on a real timer in one component. Removing that dependency was necessary to make repeated schedules behave consistently.