The onMerge() path (dashboard "merge now" button) bypassed the drainMergeQueue serialization, allowing two tasks to enter "merging" status simultaneously within the same project. Route manual merges through the same queue so only one merge runs at a time per project. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>