@stephenw10 Sorry I didn't get back to you; I must have missed the reply.
I saw cores for lighttpd, pkg-static, sudo, and I think squidGuard and snort.
It looked like everything went through, according to /conf/upgrade_log.latest.txt, but the last reboot didn't finish. I had to manually reset it. After that, it said it was fine.
I had to put this on hold for a bit (I didn't have a USB-serial adapter handy), but eventually got it working without a reinstall:
I happened across pkg-static.pkgsave, which did work. (It has the same md5sum as the pkg-static on the installation CD.)
I used the command prompt at /diag_command.php, which I discovered runs commands as root, to create an ersatz su (a copy of /bin/sh that's mode 4755)
I used that to run pkg-static.pkgsave bootstrap -f to reinstall pkg.
The pkg command, because of a quirk of implementation, can’t update the packages database when run under my ersatz su (it uses faccessat to check the database, which checks with the real uid, not the euid). But, now that pkg was working, I could use the GUI to reinstall sudo.
Using sudo, I was able to run pkg-static install -fy pkg pfSense-repo pfSense-upgrade and pkg-static upgrade -f.
I later found all of my add-on packages were locked; the pkg command and the GUI would just note that they were updating the database. They wouldn’t upgrade the packages, or print a message. I ended up using pkg unlock on them.
I know this is all pretty rough-and-ready work, and I’ll need to do a clean install to make sure that everything really is cleaned up. But this at least got me going until I can afford the downtime to do a clean install.
The key here had been pkg-static.pkgsave; I only happened across it by accident while I was tab-completing. It may be valuable to put a note about this on the Troubleshooting Upgrades page.