Posts
A Day of Letting an Agent Run My Workflow
Specs gated on a mechanical audit, progress mirrored onto a team board, a timesheet filled from what actually happened. An honest account of a day spent building and debugging that setup — including the three work items I created on a live board by accident, and the one failure that showed up in every single component.
Deriving My Timesheet From What I Actually Did
Three sources — the board, my workflow's own run records, and git — merged into one line per working day. Getting the data was easy; the naive version produced 58 activities for a single Tuesday. On why each filter had to earn its place, and the four ways duplicate work arrives wearing different clothes.
Azure DevOps Boards with Nothing but curl and jq
A complete Boards client — fetch, create, transition, link, reparent, WIQL — in one bash script with no SDK. Most of the post is the four failures that shaped it: a permissions problem that arrives as HTTP 500, parents that mark themselves as your work, a flag that silently orphans cards, and two tokens of identical length where one was revoked.
Your Change Detection Never Fires If the Payload Carries a Clock
A guard compared whole JSON payloads to avoid needless re-renders. The payload included a generated timestamp, so it never matched once — the UI rebuilt every 2.5 seconds and threw you back to the top of any document you were reading. On volatile fields, and why gating an event on 'did it change' can lose that event permanently.
A Passing Health Check Doesn't Mean It's Your Build
The rebuild succeeded, the restart silently didn't, and the health endpoint kept answering — from the old binary. I reported a change as live when it wasn't. On verifying that the process you started is the one serving, and why the lsof invocation everyone copy-pastes is wrong in two independent ways.
Eight Ways the Shell Silently Ate My Data
Every one of these produced no error, no warning, and a plausible-looking wrong result. Collected from a single day of writing bash, jq and git glue: heredocs that steal stdin, tab as IFS whitespace, NUL bytes vanishing in command substitution, jq's dot rebinding after a pipe, and four more.
When State Is Keyed by Absolute Path, Syncing Files Isn't Enough
A tool that keys per-project state by absolute working directory. Copy the files to a second machine with a different home directory and you don't merge history — you accumulate parallel copies of it. One repository had three. On identifiers derived from environment facts, and why making the environments agree beats translating forever.
Instructions Get Skipped. Commands Don't.
Three times in one day a step that was clearly documented in my workflow got skipped anyway. The fix was never better wording — it was folding the step into the command that already ran at that moment. On why written procedure decays, why 'same as before' is a documentation smell, and what it means to make a step unskippable.
Make the Gate Mechanical: Exit Codes Over Adjectives
If the definition of done is a sentence, it will be negotiated. On making acceptance criteria executable, letting a process exit code be the verdict, refusing to record a lesson without evidence behind it — and the gap I found between ten criteria that had tests and zero that had passed.
A Migration Spike Should Produce a Loss List, Not a Recommendation
The output of an evaluation shouldn't be a verdict someone has to trust — it should be a document they can disagree with. On ranking gaps by impact instead of tabulating features, establishing the minimum tier per capability against the catalogue you actually serve, and making the cost of "yes" explicit.