I removed the transaction with pywallet, and started the daemon with -rescan. Good new is that the botched transaction is no longer shown in the wallet.
Bad news is that getinfo shows a balance of 0 even though my accounts have positive balances. Not sure how the balance is calculated, but it's definitely not the sum of the accounts.
I'm going to dump keys, create a new wallet, and import keys to see if that works.