This is the part where I admit to an embarrassing oversight.
I finally traced the bug to a subtle buffering problem. The file being uploaded is not fully written at the time that it is ftp'ed. I never noticed because by the time the ftp is completed and I check the local copy of the file, the buffer has been written to disk. Once I explicitly
goes away.
On the bright side, I learned a lot more about Net::ftp.