Saturation is done at every step of the calculation.
In your example, assuming you play G4 :
Base value : 127
Taking built-in key-tracking into account: 127 + 3 = 127 (all calculations saturated to 0…127)
Taking modulation matrix into account 127 - 3 = 124 (all calculations saturated to 0…127)
I know that ideally you’d want the calculations to be saturated only at the final step (So it would be 127 + 1 - 1 = 127), but there’s not enough CPU to do modulation calculations with a larger word size.