The gap between 'two agents, one ticket' and 'two tickets, one job' is one I had not framed that cleanly, and your webhook-retry example makes it obvious. The pre-claim overlap check is smart, but the 'claim goes quiet' leak is the one I would worry about most, since a stalled runner looks identical to a slow one. How does the Preparer decide a quiet claim is dead without killing a runner that is just slow?