The real bug: escaping $url multiple times. The leading tilde in "/~mike/blog" was first escaped into %7E, and then into %257E, and then into %25257E... Etc. Adding a new post prepended another %25 to all the old posts' URLs, so the readers considered them new.
So I moved the entity encoding regular expressions and encoding of $url to before the foreach my $entry loop. That seemed to fix it... Except it didn't work in FireFox, because FireFox fetched the blog as "/%7Emike", which is correct according to the standard, but of course loathsxome escaped the leading percent, and everything was "/%257Emike/". So setting my $url explicitly was part two of that fix.