thanks, guys---that explains it. i went back and reproduced the error. when i export an unsigned replacement transaction, it looks like this on my watching-only wallet:
but when i import to my offline wallet, it looks like this:
the first few times this happened, i was on autopilot and assumed i had already signed it. in the UI, it looks like any other signed transaction, with the "sign" button greyed out. and when i import it back into the watching-only wallet, it looks the same---like a transaction ready to be broadcast. but when you try to broadcast it, you get the decode error.
if you look at the hex it starts with 45505446ff. the transaction was indeed unsigned!
you have to be using the latest electrum on both offline and online devices.
as i had feared.