<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on mutable state</title><link>https://nicetrygee.github.io/mutable-state/posts/</link><description>Recent content in Posts on mutable state</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Sat, 31 Oct 2026 00:00:00 +1100</lastBuildDate><atom:link href="https://nicetrygee.github.io/mutable-state/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Tales from the Terminal</title><link>https://nicetrygee.github.io/mutable-state/tales-from-the-terminal/</link><pubDate>Sat, 31 Oct 2026 00:00:00 +1100</pubDate><guid>https://nicetrygee.github.io/mutable-state/tales-from-the-terminal/</guid><description>&lt;h2 id="if-manual_mode-interrupted-else-lost"&gt;if manual_mode: interrupted() else: lost()&lt;/h2&gt;&#10;&lt;p&gt;I build most of my side projects with coding agents now, and for a long time every way of working with them felt like choosing which way I&amp;rsquo;d rather be annoyed.&lt;/p&gt;&#10;&lt;p&gt;In manual mode, I&amp;rsquo;m in on every step. Great! Love it! But the continual interrupts whenever it needs a decision drive me bonkers. In auto mode it gets on with the work, fast and quiet. Great! But before long I&amp;rsquo;ve lost sight of what&amp;rsquo;s going on and lost control of my own project. I also read about people leaving agents to build overnight. Sounds great, but I would spend all morning reviewing all the PRs. I suspect the engineers who do this well choose work a test suite can check, like dependency upgrades or migrations, so a green build in the morning means it&amp;rsquo;s ready to merge without a line-by-line review. Perhaps I need to get better at writing test cases.&lt;/p&gt;</description></item><item><title>A Walking Skeleton for AI Evals</title><link>https://nicetrygee.github.io/mutable-state/ai-evals-1-building-the-walking-skeleton/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/ai-evals-1-building-the-walking-skeleton/</guid><description>&lt;p&gt;When I started testing the AI features in one of my apps, my first question was simple: can I get the same answer twice? With normal software, you mostly take that for granted.&lt;/p&gt;&#10;&lt;h2 id="ai-testing-vs-traditional-software-testing"&gt;AI testing vs traditional software testing&lt;/h2&gt;&#10;&lt;p&gt;Most traditional software is built to be deterministic: given the same inputs and the same environment, it gives the same output. When it doesn&amp;rsquo;t, the cause is usually something the test hasn&amp;rsquo;t pinned down yet, like the clock, the network or the order tests run in, and good testers put a lot of craft into pinning those things down. But AI models vary by design. They&amp;rsquo;re built to choose their words with a little randomness thrown in for good measure, and for many questions there&amp;rsquo;s more than one good answer. So the task shifts from removing variation to measuring it, and from checking for &lt;em&gt;the&lt;/em&gt; right answer to checking for &lt;em&gt;a&lt;/em&gt; right one.&lt;/p&gt;</description></item><item><title>What 258 Million Tokens Bought Me</title><link>https://nicetrygee.github.io/mutable-state/what-258-million-tokens-bought-me/</link><pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/what-258-million-tokens-bought-me/</guid><description>&lt;p&gt;I pay £18 a month for Claude Pro and I was pretty confident I was wasting most of it because I rarely hit my usage limit, and let&amp;rsquo;s be honest, a limit you never reach feels like money left on the table. So I planned an experiment: switch to the pay-as-you-go API for a month and compare the bill with the subscription. If you&amp;rsquo;d asked me to guess, I&amp;rsquo;d have said my usage was worth about £10 a month. It was actually worth £63. Doh! I was out by a factor of six.&lt;/p&gt;</description></item><item><title>A Day of Spec-Driven Development with Spec-Kit</title><link>https://nicetrygee.github.io/mutable-state/a-day-of-spec-driven-development-with-spec-kit/</link><pubDate>Thu, 24 Sep 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/a-day-of-spec-driven-development-with-spec-kit/</guid><description>&lt;p&gt;Earlier this week I was at AI Camp&amp;rsquo;s Sydney meetup about Forward Deployed Engineering. I was discussing spec-driven development with an engineer I met and he recommended that I check out Spec-Kit. This is GitHub&amp;rsquo;s free, open-source toolkit for spec-driven development and it&amp;rsquo;s reasonably mature&amp;hellip;.for an SDD framework. So I spent a day trying it out, and this post is about what I learned.&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve spent years telling teams that knowledge in someone&amp;rsquo;s head doesn&amp;rsquo;t count until it&amp;rsquo;s written down. An AI coding agent makes that rule absolute because it has no head to keep it in. A day with Spec-Kit was my chance to test that rule.&lt;/p&gt;</description></item><item><title>Controls At Agent Speed</title><link>https://nicetrygee.github.io/mutable-state/left-of-the-diff/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/left-of-the-diff/</guid><description>&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;&#10;&lt;p&gt;An agent doesn&amp;rsquo;t autocomplete a line and then wait for me. It&amp;rsquo;s busy editing across files, running commands, and opening PR&amp;rsquo;s while I&amp;rsquo;m still waiting for the kettle to boil. If code can arrive that quickly, and that unsupervised, I think my controls have to work at the same speed. Yes, code review is a backstop but it&amp;rsquo;s not a primary control because it&amp;rsquo;s late, it varies by reviewer, and volume overwhelms it very quickly. If the only thing standing between a plausible, but wrong implementation, and production is an (often) overworked human skimming a diff, that isn&amp;rsquo;t a safety system that this old man wants to hang his hat on.&lt;/p&gt;</description></item><item><title>Give People Good Primitives</title><link>https://nicetrygee.github.io/mutable-state/give-people-good-primitives/</link><pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/give-people-good-primitives/</guid><description>&lt;h2 id="whats-an-orchestrator"&gt;What&amp;rsquo;s an Orchestrator&lt;/h2&gt;&#10;&lt;p&gt;You have a set of steps that need to run in order. Some of them fail, some are slow, and you want to see all of them clearly when they break in the middle of the night. The problem with tools I&amp;rsquo;ve been exposed to in this space is that they add a second job on top of that. You have to learn their model of the world before you&amp;rsquo;re allowed to describe yours.&lt;/p&gt;</description></item><item><title>Making the Jump to Senior</title><link>https://nicetrygee.github.io/mutable-state/making-the-jump-to-senior/</link><pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/making-the-jump-to-senior/</guid><description>&lt;h2 id="notes-on-making-the-jump"&gt;Notes on making the jump&lt;/h2&gt;&#10;&lt;p&gt;What follows is a collection of thoughts, drawn from my own experience and opinions, on how mid-level software engineers can make the jump to senior if they choose to.&lt;/p&gt;&#10;&lt;h2 id="autonomy-dont-wait-for-the-title"&gt;Autonomy: Don&amp;rsquo;t wait for the title&lt;/h2&gt;&#10;&lt;p&gt;The constraint on mid-level engineers is scope of ownership rather than ability. A strong mid-level is often technically excellent and often every bit the equal of a new senior at writing and reviewing code. The difference is in the boundary of what they&amp;rsquo;re asked to own: ambiguous calls tend to be escalated by design, higher-stakes decisions are made jointly with someone more senior, and accountability for a poor outcome ultimately rests above them. This is how I&amp;rsquo;ve encountered the level to be structured. It&amp;rsquo;s by no means a judgment on the person operating in it.&lt;/p&gt;</description></item><item><title>Revenge of the Generalist</title><link>https://nicetrygee.github.io/mutable-state/revenge-of-the-generalist/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/revenge-of-the-generalist/</guid><description>&lt;h2 id="the-ai-productivity-debate"&gt;The AI Productivity Debate&lt;/h2&gt;&#10;&lt;p&gt;There&amp;rsquo;s a lot of discussion right now about AI enabling companies to do more with fewer people and many orgs are looking at AI primarily through the lens of efficiency: automate tasks, reduce costs, and remove roles. I think they&amp;rsquo;re looking at it too narrowly and our biggest opportunity with AI is not replacing people. It&amp;rsquo;s making willing and talented people dramatically more capable. Its real potential is as a force multiplier for creativity, productivity and opportunity discovery.&lt;/p&gt;</description></item><item><title>Setting Up a Hugo Blog from Scratch</title><link>https://nicetrygee.github.io/mutable-state/setting-up-a-hugo-blog-from-scratch/</link><pubDate>Sat, 11 Jul 2026 14:45:20 +1000</pubDate><guid>https://nicetrygee.github.io/mutable-state/setting-up-a-hugo-blog-from-scratch/</guid><description>&lt;h2 id="why-i-chose-hugo"&gt;Why I Chose Hugo&lt;/h2&gt;&#10;&lt;p&gt;I&amp;rsquo;ve built websites using WordPress, static HTML, React, and a handful of other frameworks over the years. For a personal engineering blog, I wanted something much simpler. I didn&amp;rsquo;t want to manage a server or worry about databases. I wanted to write Markdown, push to GitHub, and have a website miraculously appear. Enter Hugo.&lt;/p&gt;&#10;&lt;p&gt;At a high level, the architecture looks like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Markdown files&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Hugo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Static HTML&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GitHub Actions&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GitHub Pages&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Everything lives in Git, every deployment is automated, and there&amp;rsquo;s hardly anything to maintain.&lt;/p&gt;</description></item><item><title>Judgement as a System Property</title><link>https://nicetrygee.github.io/mutable-state/judgement-as-a-system-property/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/judgement-as-a-system-property/</guid><description>&lt;h2 id="judgement-loops"&gt;Judgement Loops&lt;/h2&gt;&#10;&lt;p&gt;AI is changing where and how often judgement happens in software engineering.&lt;/p&gt;&#10;&lt;p&gt;When implementation becomes significantly cheaper, software engineering stops being a sequence of decisions followed by execution. Instead of one design discussion leading to three days of coding, an engineer might generate and evaluate dozens of alternatives in an afternoon. The cost of trying another approach is close to cheap and the workflow becomes:&lt;/p&gt;&#10;&lt;p&gt;Prompt &amp;gt; Review &amp;gt; Refine the prompt &amp;gt; Generate again &amp;gt; Compare alternatives &amp;gt; Accept or reject &amp;gt; Repeat&lt;/p&gt;</description></item><item><title>Hello World</title><link>https://nicetrygee.github.io/mutable-state/hello-world/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://nicetrygee.github.io/mutable-state/hello-world/</guid><description>&lt;p&gt;Hey! I&amp;rsquo;m Gregg. I&amp;rsquo;ve been working in software engineering for many years now and in recent times I&amp;rsquo;ve rarely written anything longer than a design doc.&lt;/p&gt;&#10;&lt;p&gt;But that changed recently, at a big life inflection point when I decided to leave my perfectly good job as an Engineering Manager at a Data Engineering consultancy in London and embark on an adventurous life change by moving to sunny Sydney. At the time of writing this, I don&amp;rsquo;t have a job to go to, and it&amp;rsquo;s just in time for one of the worst hiring markets anyone can remember in Sydney. Layoffs everywhere, hundreds of applicants per role, and recruiters ghosting me. Ask me to pick a worse time to move to the other side of the planet and I&amp;rsquo;d struggle.&lt;/p&gt;</description></item></channel></rss>