Archive
Everything else I've written — the older notes, in full.
Two kinds of correctness: currency bugs and ghost feature flags
A currency display bug in the exchange flow and a feature flag referencing something that never existed in production. Two different kinds of silent incorrectness.
The shape of shared libraries
A shared library is defined by the shape it presents to its dependents. Two cases make that concrete: an icon component used through an undeclared path, and a one-line logging change that quietly broke a numeric assumption.
Three quiet bugs hiding in a cross-service feature
Shipping a feature across four services meant coordinating an AI backend, a fare search service, and two frontend components. Along the way: a silent configuration bug, a duplicate event contract, and an HTML injection path.
The scaffolding tax: getting a new service properly bootstrapped
Bootstrapping a new service from a template isn't just renaming things; it's wiring it into the deployment pipeline, getting dependency management right, and building the scaffolding that makes all future work faster.
Shipping a conversational search flow across services
Cross-service work: shipping an end-to-end conversational flight search flow, instrumenting an MCP server with privacy-aware observability, improving AI coding assistant context injection, and cleaning up inconsistent naming across the codebase.
Release pipelines should be boring
Time spent fixing a flaky release pipeline sounds like a lot of infrastructure work. Here's why its effects on a team are easy to undercount.
Granular Dependabot groups and getting error attribution right
Repos got granular Dependabot grouping and a shared error library got a missing origin type. Neither is glamorous; both are the kind of thing that keeps a platform manageable.
The notification that wouldn't leave
A booking interface was showing a queue warning banner after it should have disappeared. The fix was small; the pattern it points to is worth thinking about.
Designing an API endpoint for an AI consumer
Adding a conversational search endpoint to a fare search service raised an interesting question: what does a response shape optimised for an AI assistant look like, versus one optimised for UI code?
Keeping orchestration in your code, not your prompt
A reflection on where coordination logic should live when building AI assistants into production systems, and why application-layer orchestration beats prompt-driven coordination.
The quiet work of removing feature flags
On removing feature flags that had outlived their purpose. Not glamorous, but this kind of cleanup is what keeps a codebase navigable over the long run.
What adding an AI layer taught me about type ownership
Adding an AI layer to existing services surfaced something I'd been quietly ignoring: schema drift. Here's what fixing it actually looked like.