What I do
- Integrations
- B2B APIs, message contracts, retries and the failure modes that only show up once a partner system is connected.
- Releases
- New platform versions into real environments: old data, backward compatibility, rollout order and a way back.
- Debugging production
- Logs, metrics, the database and domain knowledge together, until the cause is clear.
- Architecture
- Small safe changes, clearly named rules and sensible service boundaries.
Companion AI tooling
I use AI agents every day and build small tools that let them work with real systems. They explore unfamiliar code, draft routine parts, run tests and review a diff before I do.
- Own MCP servers
- Read-only log search over Elasticsearch with server-side guards and an audit log (working prototype), a Jira server, and a team-chat bridge that only sends a message after I confirm the draft.
- Skills and shared context
- One knowledge base for Claude Code and Codex, and a library of repeatable workflows: preparing a release batch, scanning container images, fixing a ticket in an isolated branch.
- Ground rules
- Agents only read production data, I push to git myself, every data fix ships with a revert script, and credentials reach MCP servers through environment variables or a separate form, never through the chat.
- Side projects
- Built mostly by agents. That's where I learn what they can be trusted with.
I review every change before it ships, check its behaviour with tests or in the running app, and I'm accountable for the result.
Boss fight The UUID that wasn't a UUID
When we rolled out the first platform version, the integration spec said the messageId would be a UUID. One partner started failing straight away: their system had been quietly parsing the ticket ID out of the old ticketId_timestamp format, even though the ticket ID sat right there in the message body.
The clean fix was on their side, but in a corporate setting it would have taken months. So I switched our side back to the old format and production kept running.