Just to get it right, from what I understand of your usecase:
- You have a parallel gate-way with 2 user-tasks. These user-tasks serve a different purpose.
- One of the user tasks is a multi-instance, assigned to one group of people, which can "countersign" the task by completing it.
- The other user task is a multi-instance assigned to another group of people, which can "countersign" the task by completing it.
- If one of the 2 tasks is completed, the other task should be cancelled and the workflow should be completed.
A solution I can suggest is surrounding the parallel fork-gateway, the 2 user-tasks and the join-gateway by a sub-process. Add a signal-boundary-event on the sub-process, with cancelActivity="true". From the 2 user-tasks in the subprocess, you'll add 2 intermediate signal throwing events (each task has a sequence-flow to one throwing-event). When one of the two user-tasks completes, a signal will be thrown an caught by the boundary-event, canceling the sub-process and removing any open tasks in that.
Your process moves on, starting from an outgoing flow on the boundary-event.