You Can't Remove the Last Owner
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 →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 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 →