Well, we discussed with etienne and julienw a lot about this emergency modification in the API and learnt that this has already been proposed a lot of times and refused each time.

For the transaction thing, the issue in this case is that we loose the semantic of upgrade and we end up with something inconsistent from this point of view: once the 'upgradeneeded' call back is finished, one expects the upgrades to be finished ... But in this case, it's not finished since we have another transaction to perform the upgrade. Side effect is that the call log code gets executed and renders the call log while we are still performing the upgrade.

Copying the "transaction" object to force not losing the transaction in Voicemail.check() callback does not help: it cannot be copied and we get a cloneerror.