"Delivery is not acceptance" could come straight off a job site. Finishing the work and having it signed off are two different days, and the punch list lives between them. Your overlap check is the scope-gap problem from the other direction: in an estimate two trades can both carry the same work, or neither does. I like that the script only flags the pair and leaves the call to a named person.
The send-back versus reopen distinction suggests an execution-generation check as well as a board-state check. Closing the old branch does not necessarily stop an already-running agent from pushing or delivering later; the acceptance boundary needs to know which attempt currently owns the item.
I would add a fixture where an old runner delivers after reopen and a new claim. Its result should remain associated with the obsolete attempt rather than replacing the new runner's delivery. That complements your snapshot overlap check: one prevents accidental duplicate starts, while the other prevents stale work from becoming the accepted result.
Kartik N V J K
AI Developer | Making AI reliable, trustworthy & accessible to everyone | Active community contributor
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?