Here's how I see it working programmatically:
The values need to be managed at the channel level. For each channel there is a flag that says if it is HTP or LTP (set in the"edit channels map" window). Each channel also maintains its own list of values - one value for every active Matrix Value Send (MVS) that contains that channel.
When a new scene is activated, all the values in the MVS are passed to the channels as well as the fade time. If a given channel is flagged as HTP, the new value is added to the list. It is then also checked against all other values. If the new value is now the highest value, the outputted channel value is then faded from the previous highest value to the new highest value in the specified fade time. If the new value is not the highest value it is still added to the list but there is no change in output. Similarly, when a scene is deactivated, the value for the given channel is removed from the list. If that value was the highest value, then the output is faded down to the second highest value in the specified amount of time. If the value was not the highest value then it is simply struck from the list and there is no change in output. If there are no other values in the list, then the value can be faded to zero. This behaviour can be consistent with scene activate/deactivate as well as jumps. If a value is changed manually within a scene (or with an envelope generator, etc) then the same check for highest in the list can be made and the output changed in real time (if necessary).
If a channel is flagged as LTP, then the values for that channel are stored in order of activation. When a new scene is activated and the MVS contains the channel in question, the new value is added to the list and the value is faded from the previous latest value to the new latest value over the specified time. If the MVS does not contain the the channel in question then no change is made to that channel. When a scene is deactivated, the value from that scene's MVS is struck from the list. If that value was the latest value, then the output is faded to the second latest over the specified fade time. If that value was not the latest then it is simply struck from the list with no change in output. If no values remain in the list then the value is faded to zero. If a value is changed manually within a scene (or with an envelope generator, etc), then the value is immediately changed to that value and that value then becomes the "latest" value.
Hopefully that makes some sense.
Craig