It was "weectl station upgrade --what skins" as the offender.
The skins stuff that comes with core is Ftp, Mobile, Rsync, Seasons, Smartphone, Standard - so my thought as a user is that I always am going to want to upgrade the one(s) that I use along with the code stuff that pip installs. In my case this means Rsync specifically, but I know others might want the Ftp uploader. So for me, I would 'always' run that optional --what command when updating weewx even though I don't use the actual core skins at all.
Of course that begs the question of why the core Ftp and Rsync uploaders are in skins to begin with. If they're core, shouldn't they just be in the pip-installed tree and shouldn't their skin.conf content be in the core weewx.conf always like other code ?
Anyway - timestamping the individual skins seems like the quickest way to get back to 'nothing breaks a pre-existing installation' although I did want to bring up that weewx-data/user/{bin,skins} option just in case you wanted to get a more complete architectural split of core-vs-user stuff.
I'm appreciative of any solution that does not break a pre-existing anything.