msc {

    width=800;

    Manager, TeamLead, WorkerA, WorkerB;

    Manager -> TeamLead [ label="process(groupId: $groupID, groupMembers: [$pkgA, $pkgB, ...])" ];
    TeamLead -> WorkerA [ label="newGroup($groupID)"];
    TeamLead -> WorkerB [ label="newGroup($groupID)"];
    TeamLead -> WorkerA [ label="task('collect', $collectA, $pkgA)" ];
    TeamLead -> WorkerB [ label="task('collect', $collectA, $pkgB)" ];
    ...;
    TeamLead <- WorkerB [ label="completed('collect', $collectA', $pkgB)" ];
    TeamLead -> WorkerB [ label="task('collect', $collectB, $pkgA)" ];
    ...;
    TeamLead <- WorkerA [ label="completed('collect', $collectA', $pkgA)" ];
    ...;
    TeamLead <- WorkerB [ label="completed('collect', $collectB, $pkgA)" ];
    TeamLead -> WorkerA [ label="task('check', $checkA, $pkgA)" ];
    TeamLead -> WorkerB [ label="task('check', $checkA, $pkgB)" ];
    TeamLead <- WorkerA [ label="tag($checkA, $tagnameA, $pkgA, ...)" ];
    TeamLead <- WorkerA [ label="tag($checkA, $tagnameB, $pkgA, ...)" ];
    TeamLead <- WorkerB [ label="completed('check', $checkA, $pkgB)" ];
    TeamLead -> WorkerB [ label="finished($groupId)" ];
    WorkerB => WorkerB  [ label="clearCache()" ];
    TeamLead <- WorkerA [ label="tag($checkA, $tagnameC, $pkgA, ...)" ];
    TeamLead <- WorkerA [ label="completed('check', $checkA, $pkgB)" ];
    TeamLead -> WorkerA [ label="finished($groupId)" ];
    WorkerA => WorkerA  [ label="clearCache()" ];
    Manager <- TeamLead [ label="finshGroup(groupId: $groupID)" ];
}
