Skip to content

Start here

Everything I know about shipping agents, written down.

Nine guides, 94 minutes end to end. Not a tour of features. The parts that decide whether an agent system survives contact with a real company: how to shape tools a model can drive, what memory looks like six months in, where the human has to stay, and what the security review is going to ask.

These are maintained. When the thinking changes, the guide changes. The essays are the dated version: what broke, when, and what it cost.

More

  1. Your tests run a different database driver than production

    A serverless runtime forces a different database driver than the one your tests use. The type system is then asked to paper over the difference, and it does, cheerfully. This is how 1,257 green tests shipped a 500 on every authenticated call, and the two controls that stop it happening again.

  2. I fixed the same bug twice in three weeks

    The first fix was written about a folder. The bug was never about a folder. Here is how to tell a real fix from a closed ticket.

  3. Your MCP server is a resource server, not an authorisation server

    Adding OAuth to an MCP server needs three independent settings on your identity provider, and each one fails in a way that looks like a different bug. Two of them let sign-in succeed before anything breaks. This is the wire protocol, the three settings, and one curl for each failure.

  4. Your MCP server's instructions are a product surface, not a README

    An MCP server can send the model one paragraph that governs every tool it will ever call. Most servers leave it empty and then fix the same problem thirty times in thirty tool descriptions. This is what belongs in it, taken from a server in production, including the rule that stops a model politely inventing a postcode.

  5. Your entitlement check should return the tenant id

    A permission check that returns true or false leaves you holding a second question: whose data is this? Answer both at once and a tool physically cannot do the work without having passed the gate. This is multi-tenancy for an MCP server, from one that has run it in production since July.

  6. A no-new-tools rule quietly becomes a no-new-ideas rule

    A blunt rule against installing things is good discipline and a bad reading habit. Separating 'should I take this dependency' from 'is there a good idea here' turned an eleven-item tool list into nine specific noes and twenty lines of my own code: a contrast gate that refuses to render below WCAG AA.

  7. Your Terminal Never Resets Between Commands. You Do.

    A misdirected commit landed on the wrong repository because a shell that never forgets where you left it assumed I meant to still be there. The failure mode gets more common, not less, once most of your work runs through automation instead of your own hands.