Hi David,
sorry for answering that late, but I really do not have much time.
I can think of 3 relation types between two jobs A and B that can be modelled:
1. in-same-route: here you need to specify a hard constrait at route level. additionally, you need a route state that memorizes whether jobA or jobB has been inserted
2. in-sequence: here you need to define a hard constraint at activity level, and you require activity states that gives you - at each activity in the route - the information whether jobA/B has already been inserted
3. in-direct-sequence: here you do not need any state since this can be modeled just by defining a hard activity constraint.
If you modeled these relations between two jobs, it would be easy to generalize it for n jobs. For example to model that jobA,B,C,D need to be in direct sequence, you just
need to make sure that this is valid: in-direct-sequence(A,B) && in-direct-sequence(B,C) && in-direct-sequence(C,D).
Hope this helps.
Best,
Stefan