Yesterday I shipped eight things, and three of them were fixes for bugs that had never once shown up in a log. No red text. No stack trace. No 500. Just features quietly not working while everything reported that it was fine.
The first one was the games page. Earlier in the day I moved the game icons from plain img tags to next/image -- a small performance pass, part of the same batch where I pulled the command palette, the cursor torch and the route progress bar out of the first bundle. Sensible change. Then the games page loaded with every icon blank.
The reason: my image config allowed my own asset CDN, but only under the /images path. Game icons live at /logos/games/{slug}.png. next/image looked at the pathname, decided it wasn't on the allowlist, and refused -- silently. The file itself served a perfectly happy 200 if you opened it directly. One line of path config was holding every game icon hostage, and nothing in the console said so.
Postgres saying no, very politely
The second one was worse, because it had been broken for a while and I hadn't noticed. Bookmark counts on /community were stuck at 0 -- except on my own posts, where they read correctly. That asymmetry is the whole clue, and it took me embarrassingly long to hear it.
The counter function updates community_posts. The RLS policy on that table only lets the owner or an admin update a row. My vote, reply and reblog counters were all declared security definer. The bookmark one, added later, wasn't. So when you bookmarked someone else's post, the trigger ran as you, tried to update a row you're not allowed to touch, matched zero rows, and returned success. The bookmark row inserted fine. The count just never moved.
Zero rows updated is not an error in Postgres. It's a valid outcome. The fix was one keyword plus a resync of the counts that had drifted while it was a no-op.
The one I caused three days earlier
Third: the Share to Community button stopped prefilling. Last week I made Hot the default feed sort. Hot needs a shuffle seed, so a bare /community redirects to itself with sort and seed attached. That redirect was hardcoding the whole URL -- so every share link arriving with compose, composeTitle and returnTo got bulldozed on the way through. The composer opened with nothing in it. The button had worked for exactly as long as the feed defaulted to New.
The pattern I keep re-learning: the dangerous changes aren't the ones that break loudly. They're the ones where some layer -- the image optimizer, RLS, a redirect -- has a perfectly reasonable way to say no that isn't an error. Add the guard, keep going.
Also spent an afternoon measuring a thread line to the pixel. Closed a 25px gap to 1px. Some days are like that.

