RSSAmplifier

Blog

Pete Hodgson

Recent content on Pete Hodgson

blog.thepete.netRSS feed ↗103 posts

Latest posts

Assessing the Latest AI Coding Hotness

“Have you tried out Ralph Wiggum loop?!” 
 “Are you still using beads?” 
 “Is Gas Town actually legit?” 
 “Know anyone who’s into BMAD?” 
 Most days these days I’m grateful my family doesn’t know what my Serious Work Conversations sound like. It’s kinda embarrassing. 
 Let’s talk about how to deal…

Same Model, Different Results: Why Coding Agents Aren't Interchangeable


 “Why would Claude Code work differently than my IDE’s coding agent, if they’re both using the same models under the hood?” 
 
 I see this asked quite often, and it’s a reasonable question. If Copilot Agent is using Opus 4.5, and Claude Code is using Opus 4.5, what’s the difference? 
 Let’s reverse-engineer Claude Code to see what…

Claude Code System Prompt

This is the full Claude Code system prompt as of Dec 9 2025, captured using the technique described in Same Model, Different Results: Why Coding Agents Aren’t Interchangeable . 
 
 
You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.

IMPORTANT: Assist with…

Claude Code Tools

This is the full list of tools available to Claude Code as of Dec 9 2025, captured using the technique described in Same Model, Different Results: Why Coding Agents Aren’t Interchangeable . 
 
 Total tools available: 18 
 Table of Contents 
 
 Task 
 Bash 
 Glob 
 Grep 
 ExitPlanMode 
 Read 
 Edit 
 Write 
 NotebookEdit 
 WebFetch 
…

AI Coding: Managing Context

Managing your coding agent’s context is super important. 
 On the one hand, providing the agent all the relevant information needed to complete it’s task makes it much more likely that it will do what you want it to. Without context the LLM doesn’t know anything about your business, your codebase, or your stylistic preferences. Giving it that context is key in constraining…

Leading your engineers towards an AI-assisted future

“Listen, I’m wondering if our engineers are doing enough with AI…” your CEO says, as the two of you sit down for your 1:1. 
 “OK…” , you reply. 
 “I was chatting to a startup buddy of mine over the weekend, and she said that 50% of their code is written by AI now!” 
 “Well,” you stammer, “I’m not sure…

Your CEO Should Not Be Slacking Your Coding Agent

The new wave of asynchronous AI coding platforms makes it entirely possible for your CEO to make a feature request via a Slack message and have a fully autonomous coding agent such as Devin or Codex pick up the task and start implementing it. 
 I’m here to tell you this is a Really Bad Idea, at least for now. 
 These “fully autonomous” coding agents still consume precious…

Why Your AI Coding Assistant Keeps Doing It Wrong, and How To Fix It

Current discourse on AI-assisted coding is very polarized. On one side you have the true believers proclaiming “90% of code is going to be written by AI within the next 12 months”. On the other side you have the skeptics dismissing it as a statistical word generator that can’t code anything but trivial greenfield apps. 
 
 
 if we have a more nuanced understanding of…

Product Strategy: a Cheatsheet for Engineering Leaders

As an engineering leader at a startup, you find yourself wearing a lot of hats. Product strategy can fall onto your shoulders, even though it’s not your core expertise. 
 
 
 this post is an opinionated cheat sheet for an engineering leader who finds themselves in the position of faking it as a product leader.
 
 Being expected to define a clear product strategy and build…

Chain-of-Vibes

Despite the breathless hype from some corners of the internet, vibe-coding - fully autonomous AI coding - isn’t going to replace engineers in the near future. Anyone who’s tried it on a significant coding problem will have likely watched the AI charge down a questionable path, make a mess, and get stuck. 
 The good news is that engineers CAN still lean on AI to significantly…

Vibe-coding 101

After a few hours of experimenting with Claude Code, I’m starting to take Agentic Coding/Vibe Coding seriously. 
 Based on my experimentation the “full vibe” hype - where an AI builds software entirely unsupervised - is pretty ridiculous. But these agentic systems ARE extremely capable, and even as they stand today I believe they can give every developer a significant…

Getting AI-powered features past the post-MVP slump

Basically every product out there has added ✨AI-powered✨ features in the last year or so. I suspect many engineering teams are now struggling to maintain and improve these LLM-based systems. 
 Many of these exciting product features stalled out at MVP, and haven’t really delivered on their promise. Why? 
 In this article series I’ll talk about the common challenges that product…

Expand/Contract: making a breaking change without a big bang

Adding a new feature to a software system sometimes requires making a breaking change in a database schema or API schema. Deploying such code changes, where the previous version of your software is not compatible with the new version, can be challenging. 
 The easiest way to roll out a breaking change is in a “big bang” - change both sides of the system all in one go. However, this…

Five Minutes to Feature Flags

We’re going to add feature flagging to a node service in under five minutes using OpenFeature, the open, vendor-agnostic feature flagging SDK. 
 We’ll be working with a simple express server, but if you have any basic familiarity with JavaScript and node you should be able to follow along. 
 Hello, world 
 Here’s the service we’ll be working on: 
 
…

OpenFeature - a standard for feature flagging

I’ve recently been involved 1 in OpenFeature , an effort to define a standard API and SDK for feature flagging. At first glance, you might wonder whether feature flagging needs a standard. It’s just a function call and an if statement, right? Well, no, not really. I’ll explain why, and then talk about some of the benefits that I hope OpenFeature will bring to the space. 
 The…

Explaining Variable

An Explaining Variable is a code-level pattern which reduces the need for code comments, making your software a little more self-documenting. 
 Here we have a function with some non-obvious business logic, with a comment to explain what’s going on: 
 
 
 
 before.js
 
 
 
function determineShippingSpeed(shippingRoute, shippingMethod) {

 // if the…

Patterns of cross-team collaboration

Almost every company feels pain when it comes to organizing work that spans multiple teams. 
 How do we get the appropriate work into each team’s backlog, and how does each team juggle the competing priorities that cross-team initiatives demand? It’s hard! What’s more, for a scaled-up engineering organization any meaningful product change will require this type of cross-team coordination -…

Your Platform is a Product

I once knew a team who built a beautiful platform that almost no-one used. In fact, the only real consumers of this elegant system were the platform engineers themselves. 
 This was partly intentional. The platform team considered themselves guinea pigs - they would be the first consumers of the platform, making sure that it was fit for purpose by eating their own dog food 1 . Sadly, while…

Engineering Values and Architectural Principles

Every engineering leader at a growing startup encounters the same challenge at some point: how to ensure your teams are making decisions in a roughly coherent way. 
 When a startup is young, it’s easy to keep all the engineers on the same page. Everyone is in the same codebase, working on the same thing and talking through technical decisions on a daily basis. But as a startup begins to…

Tech Debt Walls

Every codebase carries some amount of technical debt. Every team would like to get better at managing that tech debt. 
 The first step in managing something is making it visible. A tech debt wall is a simple, effective way to make tech debt visible. 
 Building a tech debt wall 
 A tech debt wall is a 2-dimensional map used to track a codebase’s tech debt as individual issues. The…

Roadtrip!

When looking at the work ahead of them, product delivery teams need to see both the big picture - the vision of where we want to take the product - as well as all the details - the detailed requirements for each feature. 
 This is a tricky balance. When getting ready to implement a feature, we need to sweat the details and talk through all scenarios and edge cases. But, if we spend all our…

Service Templates and Service Chassis

As engineering organizations move towards smaller services and more autonomous teams, it’s common to run into situations where teams are duplicating effort on “table stakes” platform functionality. Rather than spending time solving business problems, engineers waste that time building the same basic technical plumbing multiple times, using inconsistent approaches. 
…

Testing a feature-flagged change


 “Sorry, that just sounds… dangerous”. 
 
 I sometimes hear things like this when explaining concepts like Trunk-based Development and Feature Flagging to someone who’s not worked that way before. The testers on a team are often the first to speak up. 
 
 
 We need some way to verify the behavior of a feature flag, without actually flipping it on…

Creating and sharing Strategic Architectural Initiatives

I wrote recently about how a Strategic Architectural Initiative (SAI) helps align autonomous teams around a technical strategy. In this post we’ll look in detail at how to create an SAI, and how to ensure it’s widely understood. 
 Building a Strategic Architectural Initiative 
 As discussed in my previous post , a good technical strategy is one formed to help achieve a business…

Delivering on an architecture strategy

Software companies always have an unended stream of product features for engineers to work on. One of the most important responsibilities of a technology leader is to carve out space so that engineers can also perform the technical work which keeps the architectural foundations of a product healthy. Just as product leadership are responsible for defining a vision for a product and leading towards…

Hello, production

Deploying something useless into production, as soon as you can, is the right way to start a new project. It pulls unknown risk forward, opens up parallel streams of work, and establishes good habits. 
 I spend a fair amount of time helping engineering teams with the initial build and release of a product. There’s one piece of advice that I find myself giving consistently during the very…

Story Tests - clear, expressive testing for redux reducers

This post is part of a series, covering techniques for testing redux reducers. 
 In the first post of this series we discovered that it’s better to test reducers and actions together, as an integrated, cohesive unit - the duck . In the next part of the series we pulled selectors into the scope of that integrated unit. We also looked at how we can simulate different scenarios in a…

Testing redux reducers - leveraging selectors

This post is part of a series, covering techniques for testing redux reducers. In the first installment of the series we saw that it’s better to test reducers and actions together as an integrated, cohesive unit. In this post we’ll take this idea a little further and see what happens when we pull selectors into our reducer testing strategy. Specifically, we’re going to see…

A nice way to test redux reducers and actions - part I

This post is part one of a series , covering techniques for testing redux reducers. 
 One of the benefits of using redux is the ease of testing. Keeping state management separate from the rest of our application makes it easier to test in isolation. 
 That said, the mechanics of testing the various moving parts in a redux app - stores, reducers, actions, action creators, selectors - is not…

Day-One Deploys

Here’s a crazy idea: software companies should require new engineers to make a production code change on their first day at work. Not allow engineers to deploy to prod on day one, but require it. 
 What exactly is it about this idea that makes it seem crazy, or at least ill-advised? Is it that it’s a bad idea, or is it that it doesn’t seem feasible ? I do know that it’s possible: I first heard…

6 Practices for Effective Pull Requests

I once thought that code review was all about catching bugs, but I was wrong. 
 In this article I’ll discuss the additional value that teams get from code review beyond defect detection, and how Pull Requests (PRs) can get in the way of maximizing that value. Understanding the drawbacks of PR-based workflows, we’ll then discover a few simple practices which prevent pull requests…

Mission Command: enabling autonomous software teams

Building software is an inherently creative endeavor. 
 We never build the same thing twice — if we wanted the same thing we’d just copy-paste it! We’re always solving a new problem, which brings with it new unknowns. We also work in near-constant uncertainty and ambiguity. Priorities shift, requirements change, and our understanding of what’s needed to meet those requirements evolves over…

Advice for the Founding Engineer, part 3

Engineering decisions made at the very early stages of a product’s life can have repercussions which extend far into the future. Making well-informed, thoughtful decisions is important. 
 In this series of posts I condense my advice on how to make the correct decisions as a founding engineer down into three maxims. In the first post in this series I introduced the first maxim -…

Continuous Delivery for Static Sites

In this article I’ll show that the typical approach for deploying sophisticated static sites is not sufficient, and explain how we can apply the principles of Continuous Delivery to improve the situation. We’ll then walk through a worked example, building a fully functional continuous delivery pipeline for a single page React application. 
 The rise of the static site 
 The client-side…

Advice for the Founding Engineer, part 2

Engineering decisions made at the very early stages of a product’s life can have repercussions which extend far into the future. In this series of posts my advice on how to make the correct decisions as a founding engineer is condensed into three maxims. In the first post in this series I introduced the first maxim - “You’ll Never Know Less Than You Know Right Now”. In this…

Advice for the Founding Engineer, part 1

The founding engineer at a new startup carries a heavy weight upon their shoulders. Technical decisions made at this early stage resonate for a long time. Beginnings are such delicate times, as they say. Compounding this is an underlying tension inherent to every young enterprise - we must get an initial product out of the door ASAP but still support what comes after the MVP. Grounding your…

The JS testing ecosystem needs a standard matcher library

The testing ecosystem in JavaScript today is full of tools which keep re-inventing the same wheel - Matchers. If we can extract this concept from individual tools into a general abstraction we can focus energy to build a much more expressive API, and provide a common ground for re-use and extension. Read on to find out why. 
 Matchers when making assertions 
 Unit-testing JavaScript code…

Articles & Talks

I’ve had articles published on various other websites besides my blog here. I also run workshops and present talks at conferences fairly frequently - slides and video of some talks are listed below. 
 Articles 
 Road to somewhere: Product Planning as Road Trip , for Increment Magazine 
 By sharing both the route and the destination to our strategic objectives, we can set…

The Symbol-Keyed State Accessor pattern

In this post I’ll show three different techniques for encapsulating internal state in JavaScript, concluding with my preferred approach, a pattern I’m calling “Symbol-keyed State Accessor”. 
 I was in a discussion about how to implement the Value Object pattern in JavaScript recently. Most of the examples folks were proposing involved a prototypical approach to OOO,…

DIY stir plate for homebrew yeast starters

I brew beer as a hobby, and one of the secrets to really good homebrew is happy, healthy, plentiful yeast at the start of fermentation. Creating a yeast starter really helps with this, and a good yeast starter requires a stir plate to keep the yeast in suspension. 
 Stir plates aren’t super expensive, but at around 100USD they’re not something you’d buy on a whim. I found a…

The Ultimate Traveler's Coffee Kit

I travel a fair bit for work and have discovered that when you’re living in a hotel it’s the simple comforts that you miss the most. Near the top of my list of simple comforts is a good cup of coffee soon after I wake up. The hideous coffee tea-bag things that most hotel rooms provide barely counts as coffee, let alone good coffee. A year or so ago I set out to find a way to make good…

video for my different.js talk

I had the opportunity to present at Forward JS a few weeks ago on “different.js”. No, the presentation wasn’t about a new, shiny, artisinally-crafted micro-framework. I talked about how to “level up” at JavaScript by introducing artificial constraints which force you to approach things a different way. I worked through a specific example, abstaining from the use of…

optimizing 3rd party JavaScript loading

I was doing some research today on preventing slow/flakey external javascript files from 3rd-party sources from slowing down your perceived page load times. Things like tracking pixels and chat widgets are generally loaded via script tags, and if you’re not careful then one rogue provider can create a really poor experience for users on your site. 
 I don’t have any original…

Rails as an SOA Client

I got to present a talk at RailsConf this year. video is here , slides are here . 
 My talk was about Rails as an SOA client. I talked about things like Conway’s Law, Contract Testing, Hexagonal Architecture, the faraday gem, and HTTP Caching.

the 5 rules of an awesome dev toolchain


 
 ./go can eventually become the primary interface into the dev tooling for the project.
 
 Every ThoughtWorks project I’ve ever been on has a script in the root of the project repo, often named ./go or ./go.sh (or ./go.bat if you’re very unlucky). This script often starts life as the script which the CI server runs to test the project. It soon acquires extra…

Microstatic: radically simple static microsites

I’m a bit fan of static sites, and have created a fair few little static one-page demos and toy apps over the last few years. I like to host these off of S3 and expose them under subdomains of my domain, thepete.net. In fact, you’re reading one of those S3-hosted static sites right now! 
 With modern infrastructure like S3 and Route 53 the process of setting up a new microsite is…

Assertions in Page Objects

Martin Fowler recently added a bliki entry for the Page Object pattern . It’s a good writeup - if you haven’t read it I recommend doing so now. Go ahead . I’ll wait. 
 The entry sparked a discussion on an internal ThoughtWorks mailing list as to whether Page Objects should include assertions or not. In fact Martin mentions this difference of opinion in the bliki entry itself.…

introducing rack-flags

I’m pleased to announce rack-flags , a very simple way to add feature flags/bits/toggles to your Rails app (or any other rack-based web app). 
 The rack-flags gem allows you to define a set of feature flags which can be turned either off or on for any user. Your application code inspects the state of these feature flags when processing a web request and uses that information to modify…

iOS Unit Testing Workshop

##TL;DR
I’ll be running a couple of free workshops on iOS Unit Testing in San Francisco in late August/early September. If you’d like to attend please fill out this simple form and I’ll be in touch with details. 
 ##Why is it free? What’s the catch? 
 I’m preparing to run a paid 3 hour workshop on iOS unit testing for the upcoming super-awesome StrangeLoop…

Using Travis CI and xctool to build and test iOS apps

Travis CI is a cloud-based Continuous Integration service which is free to use (but only on public github projects). They recently announced support for OS X agents, which means you can now use Travis to build and test iOS applications. In this post I’ll show how I set up basic CI for an example iOS app using Travis, with the help of xctool . xctool is the ‘better xcodebuild’…