First off get rid of "saga id" and "aggregate id" they are meaningless
here. I have done that below.
"this is observed by the event handler, who in this example creates a
new process instance, which records its own history with an event C
C.messageId = 6
C.causationId = 5
C.correlationId = 4
And issues a command D (to a different aggregate, referenced in the
payload of event B).
D.messageId =8
D.causationId = 5? 6?
D.correlationId = 4
Which in turn emits another event E
E.messageId = 10
E.causationId = 8
E.correlationId = 4:
D.causationId = 6 (the message its responding to)
"How does the event handler arrange that event E(10,9,8,4) gets passed
to the saga that was created when we processed B(5,2,1,4)? How do we
keep the history of the two together? Or more carefully, how do we
keep this history together, without also introducing the constraint
that there's only one process involved in any given message?"
The process manager simply subscribes to correlation id. Note every
event here will have the same correlation id. As for only one process
per correlationid can you come up with any sane reason why you would
want multiple processes concurrently operating on a given
correlationid?