A conditional import, a bare except, and three months of nothing
An automation pipeline classified 21,000 events and executed none of them for three months. The bug was one wrong dictionary key, and Python's scoping rules did the rest.
Read →Chester Frazier · Gulfport, MS · b. 1988
Debugging stories, architecture notes, and the occasional thing I built because nobody else had. New posts when I have something worth writing down.
An automation pipeline classified 21,000 events and executed none of them for three months. The bug was one wrong dictionary key, and Python's scoping rules did the rest.
Read →An offboarding script reported 9/10 steps. The tenth was a Microsoft 365 group the departing user owned — and Graph refuses to leave a group ownerless.
Read →Shipping a tool to an LLM agent takes three registrations, not two. Miss the intent router and the model truthfully tells you the tool isn't there.
Read →Culling 600 burst-mode photos with OpenCV: why sharpness has to be scored within the burst, not across the shoot, and how YuNet's eye landmarks catch blinks.
Read →A quota gate projected 120% usage from a 15% reading and shut down a whole tier of jobs on a Monday. The bug wasn't the math — it was letting the median decide.
Read →A timestamp watermark silently skipped 41 replicated rows because now() in Postgres is transaction start time, not commit time. The fix, and the three details that made it wrong twice.
Read →A .NET service on Linux refused to import a folder it could read perfectly well. The path had an emoji in it, and the error message pointed at permissions the whole time.
Read →A monitoring flag meant to hide noisy checks was quietly hiding the most important one. Six automations were green because nothing they ran could ever be reported.
Read →A wall-mounted dashboard froze on a job tile for eleven hours. The SSE socket was dead, EventSource said it was open, and the server's keepalive was a comment JavaScript never sees.
Read →A bug report I had already fixed — except the build carrying the fix never reached the phone. How to find the real client from an access log, and why a version number should be read out of the artifact.
Read →A nightly Postgres backup shipped nothing to four destinations because one frozen snapshot database had a connection limit of zero. The fix is a batch-job design rule, not a Postgres trick.
Read →A monitor paged every day for a week while the automation it watched was deliberately waiting. The bug wasn't in either one — it was that they shared a threshold.
Read →A DNS probe paged claiming my records were wrong. They weren't. dig prints its own failure text on stdout, and my parser kept it as an answer.
Read →A replication healthcheck that watched lag, cadence and error counts stayed green for months while the standby held stale text, missing rows and mojibake. Here's why bookkeeping can't see it.
Read →My TV dashboard shows my agent's live activity whenever the agent is running — which makes it impossible for the agent to screenshot the dashboard. The fix was to move the shutter.
Read →Users kept asking why a portal made them sign in when Microsoft's own apps never do. The answer was one OAuth parameter overriding the thing that would have signed them in silently.
Read →Building a two-person finder for a crowded venue: why a Bluetooth contact beats a GPS fix at close range, and why the app still refuses to print metres from an RSSI.
Read →A PXE server that broke every few weeks turned out to be iPXE falling back to a hardcoded HTTPS URL. The fix was to stop letting DHCP decide where the boot menu lives.
Read →Every reminder system I've used is time-anchored. 'Next time I hire a handyman' has no time. Here's the trigger-anchored half — keywords, geofences, and payday — wired into an assistant's turn.
Read →