invocations

One record per attempt at each planned call, always in plan order: call 0 before call 1, and within a call, first attempt before second.

Normalized here rather than left as the caller listed it. Records arrive in the order calls came back, which is not the order they were planned in and is not a fact about the run — two runs that made the same calls and got the same answers in a different sequence are the same run. Since equals compares this list element by element, leaving the caller's order alone would make those two runs unequal, and it would make a durable backend disagree with the in-memory one on the same call sequence: a store keeps identified rows and reads them back in plan order, while an in-memory store would hand back the order it was given.

sourceRevisions is deliberately not normalized the same way. The order sources were read in is data about the run.