It is impossible currently to write an app such that it uses FinalityFlow in a backwards compatible manner if the app has set targetPlatformVersion >= 4. The reason for this is that the old version of FinalityFlow has a check against the targetPlatformVersion of the app, which results in an exception being thrown. This means newer apps are unable to communicate with any apps using the old version of FinalityFlow. This includes any version of the app running on a V3 node (which only has the old version).
Relatedly, it is not totally clear what it means for an app to set a particular targetPlatformVersion. Currently we state that it means "the app has been tested against a V4 node", but we don't define what level of testing we expect. We should improve the documentation here to set some expectations (for example, we expect the app to be tested against a network of V4 nodes running the same app, but not against older versions). It may also be helpful to define what sort of things we would expect to gate behind a particular targetPlatformVersion check within the platform.