Writing

I write about grounded architecture and testing, practical AI-assisted engineering, and hands-on code and tooling.

I also post shorter, less formal TIL notes here.

I’m most active on Bluesky, and you can also find me on LinkedIn.

Subscribe via RSS
  • Harness Engineering

    Notes

    Today I heard the term “harness engineering” for the first time: Harness engineering is the practice of building tooling, tests, and automation that let coding agents execute tasks safely and reliably. If code is written more and more by LLMs, the focus seems to be shifting to …

  • Combining agent skills

    How-to

    A short post on combining skills. It's not always clear when a skill will be called or triggered. The easiest way is to put instructions and directly invoke the skill you want by name. For example, for my Today I Learned mini blog site, I have two skills to keep my TILs focussed …

  • AI’s Opportunity: Pacing Control Loops with Development

    Opinion

    What caught my attention in the book Vibe Coding by Gene Kim and Steve Yegge is the idea that, as LLMs and coding agents change how we build software, control loops—tests, reviews, and other signals that tell you whether a change behaves as expected—should be faster and more inte…

  • Experience Report: Building a time-tracking AI assistant

    Experience Report

    This is a short experience report about using skills (with Codex and its models) to build a personal AI assistant that helps me maintain my time-tracking log. To set expectations: the assistant does not manage my calendar or tasks. It helps me keep a time-tracking log that lives …

  • On Building Reliable Software with LLMs

    Opinion

    This post captures my current thinking on how LLMs are impacting software development, particularly around software quality and engineering discipline. My main observation: most of the best practices we've relied on for years are just as important—maybe even more so—in an LLM-ass…

  • The Unification of Commands and Skills in Claude Code

    For background, because you may be noticing them in some of the outputs and inputs to Claude Code, I want to combine two skills: text-grader: grade a text for correct UK English spelling and grammar til-rules-checker: check my 'Today I Learned' format rules for my Today I Lea…

  • Agent Chisels: My LLM Agent Skills and Workflows

    I have been meaning to share more about my LLM workflows and tooling for a while, partly to have a reference for conversations, but mostly to learn in public. Agent Chisels is where I will be sharing the custom artefacts (primarily skills, with commands and agents to follow) that…

  • My Best Technical Decision of 2025: Moving to Proton for Peace of Mind

    This year I bit the bullet and moved mail, calendar and drive from Google to Proton. Knowing that my family is not being profiled when, for example, I plan a doctor's appointment feels liberating. Sure, there were fun and useful technical improvements, like getting a podcast micr…

  • Implementing an Urgent Feature with Opencode, Claude, and Zed

    Experience Report

    This is a short post to share a positive experience I had using an LLM agent to quickly add a feature to an existing personal CLI time-tracking application. Below, I describe how I added it using Zed, Opencode and Claude. To start, I wasn't even sure the feature I needed existed …

  • TIL rules to remember

    I have been writing "Today I Learned" posts (TILs) for a few weeks now and I started writing them as a complement to long form blogging. But I found myself spending 45-60 minutes, sometimes longer, per TIL instead of 15-25. This defeated the purpose of quickly recording and inter…

  • DORA Research: Evidence-Based and Scientifically Grounded Software Engineering

    Opinion

    Years ago, the book Accelerate changed my view on software development and delivery fundamentally. Of course, there are its findings (dare I say 'revolutionary'?) on which technical and organisational factors drive high performance software delivery. But that is not what I want t…

  • Grounded decision records from AI conversations

    If you've read some of my posts before or worked with me, you know I like using Architectural Decision Records (ADRs) for lots of reasons. To me the most important one is documenting the why of a decision. If you've worked with AI models before, you've probably asked them for opt…

  • Output Styles in Claude Code

    How-to

    Claude Code's output styles control how the AI responds to your requests. This summary covers the built-in styles and when to use each one. TLDR: Output styles = stored system prompts that change Claude's behaviour. Slash commands = stored user prompts for quick actions. Use th…

  • Examples of using Claude Code's output styles

    How-to

    A very short post on Claude Code's new output styles feature which I have been experimenting with in the past days. Here are some actual examples of how you can leverage output styles to change 'hard-configured' Claude Code behaviour: Remove Claude Code branding from commit mes…

  • How to Use Jujutsu (jj) with Claude Code

    How-to

    I prefer Jujutsu (jj) over Git for version control, but getting Claude Code to work with jj proved tricky since Claude Code defaults to git. This post explains how to configure Claude Code to use jj instead of Git for version control operations and file change detection. I'll sho…

  • Remove Claude Code branding from commit messages using output styles

    How-to

    When Claude Code creates git commits for you, it automatically adds its own signature to every commit message, including a promotional link and co-author attribution. Personally I think this is pretty annoying but especially for professional work or team repositories you may pref…

  • Grounding AI Instructions in Living Documentation

    Opinion

    Context engineering shows interesting potential to ground documentation to actual code, or as how I sometimes refer to it: reality. Linking AI instruction files (CLAUDE.md, .rules, .cursorrules, etc) to development documentation may turn static docs into living resources. Each co…

  • Using Code Coverage as a Check for Test Refactoring

    TLDR: Use code coverage reports to verify that test refactorings haven't accidentally changed what functionality you're testing. Same coverage percentage before and after refactoring gives confidence your tests still cover the same code paths. If we refactor code, tests should co…

  • Rust code coverage: use 'llvm-cov' over 'tarpaulin'

    A few days ago, I wrote about an issue I encountered where the code coverage for one of my projects failed on CI but worked fine locally. I also discussed a solution. It turns out there's an even better alternative: switch code coverage tools entirely and use llvm-cov instead of …

  • Rust: When Cargo Code Coverage Works Locally But Fails in CI

    A short post to help if you run into the same issue. TLDR: If your code coverage reports show vastly different results between local development and CI, explicitly set --engine llvm in your cargo tarpaulin command. I recently ran into a frustration you may be familiar with: your …