<?xml version="1.0" encoding="UTF-8"?>
<rss version='2.0' xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dominic Cooney</title>
    <description>Software engineer. This blog does not represent my employer.</description>
    <link>https://blog.dpc.dev/feed</link>
    <atom:link href="https://blog.dpc.dev/feed" rel="self" type="application/rss+xml"/>
    <category domain="blog.dpc.dev">Content Management/Blog</category>
    <language>en-us</language>
      <pubDate>Tue, 23 Sep 2025 18:53:57 +0900</pubDate>
    <managingEditor>dominic.cooney@gmail.com (Dominic Cooney)</managingEditor>
      <item>
        <guid>http://blog.dpc.dev/my-agentic-coding-process-summer-2025#60961</guid>
          <pubDate>Tue, 23 Sep 2025 18:53:57 +0900</pubDate>
        <link>http://blog.dpc.dev/my-agentic-coding-process-summer-2025</link>
        <title>My Agentic Coding Process, Summer 2025</title>
        <description></description>
        <content:encoded><![CDATA[<p>Around June 2025 I had time on my hands, so I tackled what I viewed as the next set of important problems with Agentic coding. In my view, the problems were:</p>

<ul>
<li>To <strong>make good use of my time,</strong> by having the agent run only involve me when there&#39;s a problem. </li>
<li>To <strong>elicit good (...good enough) performance from models,</strong> without continuous monitoring.</li>
<li>To <strong>avoid &quot;collapse.&quot;</strong></li>
</ul>

<h1 id="make-good-use-of-my-time">Make Good Use of My Time</h1>

<p>Once a model is a much better engineer than you, sure, you should let it churn out source code and trust it to judge whether that code is good. 2025, models got better, more marginal engineers embraced the tools, so it follows that people increasingly handed the reins to coding agents. I&#39;m an AI positivist prepared to do that <em>at some point.</em> But for strong engineers, it doesn&#39;t make sense to delegate everything to agents <em>yet.</em></p>

<p>If the human is going to be involved, the question is: how do you use their time effectively?</p>

<p>For me, circa northern hemisphere summer 2025, that means getting out of the <em>inner loop</em> without getting out of the loop entirely. To work on the parts of the problem that complement the model&#39;s capabilities, then be free to walk away. Not waiting for the model to churn.</p>

<h1 id="elicit-good-enough-performance-from-models">Elicit Good (Enough) Performance from Models</h1>

<p>Models are steadily improving. The context systems around them are fitfully improving. But we can&#39;t throw arbitrary problems at these systems and expect good results. So what are we going to do while we wait for models to improve?</p>

<p>Classifying errors, then understanding and attacking their root causes, sounds dangerously like real work. Work which may be eclipsed by model improvements anyway.</p>

<p>Instead, we should work on this key problem: <strong>How do you pick tasks that are &quot;just right&quot; for your chosen model&#39;s capacity for attention and reasoning?</strong> By the way, you can err on both sides. If you pick a task that&#39;s too hard, performance is bad, and it is easy to see that. But if you pick a task that&#39;s <em>too easy,</em> model performance is good, but you have subtly wasted human time dealing with a relatively trivial task.</p>

<h1 id="avoid-collapse">Avoid &quot;Collapse&quot;</h1>

<p>By &quot;collapse&quot;, I mean these specific failure modes:</p>

<ul>
<li>The agent f*cks up the codebase. Progress stops.</li>
<li>The agent doesn&#39;t explosively f*ck things up, but it goes in circles, (break it, put it back, break it differently... often subtly degrading quality as it does so) or it gets distracted by other problems.</li>
<li>The agent exudes a can-do attitude and claims problems are solved, but they are not.</li>
</ul>

<h1 id="my-meta-coding-system">My Meta-Coding System</h1>

<p>Here&#39;s how I tackled these problems. I&#39;ll start with the <em>what...</em> a set of prompts and a tiny bit of Python driving the Claude Code SDK in the inner loop. The prompts explain three roles:</p>

<ol>
<li><em>Operator.</em> Defines goals. Played by the human.</li>
<li><em>Engineer.</em> Realizes goals. Played by the agent.</li>
<li><em>Compliance.</em> Checks this process is being adhered to. A separate invocation of the agent.</li>
</ol>

<p>The <strong>operator</strong> authors and checks in a file, <strong>GOALS.md.</strong> This is a bulleted list of requirements, in a tree structure. Requirements are named. They cover content ranging from something suitable for a product requirements document (PRD) that your product manager might produce, and technical requirements you might find in a design doc.</p>

<p>Here&#39;s an example of ONE goal related to an interactive visualization of a path planning system for an autonomous ship:</p>

<blockquote>
<p>G-STAGE There is a 3D viewport which can be rotated using the mouse or touch and zoomed with pinch or the scrollwheel. The z=0 plane is suggested by subtle grid lines.</p>

<p>The view is centered on our ship in the simulation. Specifically, the camera is behind and above the ship, and is relative to the ship. This means as the ship moves and changes direction on its path, the camera makes compensatory pans and swings.</p>

<p>If the user reorients the camera while the simulation is playing, the simulation does not stop and there is no jank when they stop manipulating the view.</p>
</blockquote>

<p>The <strong>engineer</strong> examines the codebase and the goals and picks a goal to pursue. This happens in a structured way:</p>

<ol>
<li>At the start of a goal attempt, create a git branch named after the goal.</li>
<li>Solve the goal adhering to an engineering philosophy explained in the engineer&#39;s prompt. This philosophy is, roughly, the Google way of software engineering (at least in the late 2000s and early 2010s when I worked there.) That should be another blog post, but I&#39;ll briefly characterize it as objective, technical, critical, preferring cleanliness and consistency, and heavily emphasizing tests. There are some additions, though. For example, an added emphasis on making results visible to <strong>engineer</strong> and <strong>operator.</strong> This encourages practical, performance enhancing tool use like looking at screenshots and operator ergonomic improvements like storybooks and demo modes.</li>
<li>Using objective measures of success--typically a claim that a unit test adequately captures a requirement--<strong>compliance</strong> scrutinizes whether a goal has been achieved. It literally reads the commit message to discover what goal is being attempted, reads the relevant goal, reads the relevant test to decide if it covers the relevant goal, and can run tests and examine output. It makes a judgement based on these facts.</li>
</ol>

<p>When a goal <em>is</em> achieved, the engineer continues by selecting a new goal.</p>

<p>When a goal is <em>not</em> achieved, the engineer makes a new attempt at the goal. However, critically, they do this by creating a new git branch resetting them to the departure point. (The failed work remains in git as an evolutionary dead-end. Often interesting to inspect when improving the meta-process.)</p>

<p>After a failed attempt, <strong>engineer</strong> may edit <strong>GOALS.md</strong> to sub-divide a goal into simpler parts. Given the context of an attempt that failed and the judgement of the compliance agent about why the effort failed, these goal decompositions turn out to be feasible.</p>

<p>If all goals are achieved, the project is done. Alternatively, after three successive failed attempts, the process halts and escalates to operator.</p>

<h1 id="the-good-parts">The Good Parts</h1>

<p>I find this system effective and a better use of my time than the coding agents I left behind. There&#39;s no more constant hand-holding. Write some goals, leave it alone, and come back much later to be delighted at how much progress it has made.</p>

<p>It is easy to incorporate feedback by writing new goals, or changing goals.</p>

<p>Interestingly, there&#39;s no checklist of completed goals. This is a deliberate choice. It avoids the Polyanna problem where the agent does some clowny sh*t, adds a green tick emoji to the task list, and stops thinking about that goal. Claude is surprisingly attentive to when goals are out of alignment with the code and will deal with updated requirements where goals have been refined.</p>

<p>The best goals are orthogonal, or at least not openly contradictory, and the software architecture is stronger as a result. By revising goals continuously the goals document is a living document and not a historical task list. (If you want history, that&#39;s what git log is for.)</p>

<p>The process of resetting branches, and subdividing goals, is roughly adapted from <a href="https://mikadomethod.info/">The Mikado Method.</a> This slays the problem of the agent always wanting to just fix one more broken thing... oh you&#39;re right, let me just change that... oh I need to just fix... and going in circles.</p>

<p>Similarly, three failed attempts in a row stop the agent burning tokens if it is really stuck. It prevents endlessly hopping between problems because <em>any</em> three <em>consecutive</em> failures of stop the agent. And it prevents the agent wasting time on your poorly specified goals. (If the sub-sub-goal is too hard, you need to ask for help.)</p>

<h1 id="next-steps">Next Steps</h1>

<p>For focus, I deliberately left some opportunities for later. I&#39;ve been thinking about them, though.</p>

<p>One is parallelism. My system is single threaded. There&#39;s nothing inherently single-threaded about this process, but exploiting parallelism <em>well</em> will benefit from effectively merging related subgoals, and possibly flagging conflicting subgoals, arising from the concurrent agents. Interesting topic but not one I needed to solve this summer. Maybe when it is colder outside.</p>

<p>Another is learning more effectively from mistakes. I generated this process <em>using</em> this process, but the approach was hacky. Doing it &quot;live&quot; confused the process-improving agent, which tried to incorporate some learnings from first-order projects which were too domain specific. Waiting until projects were done to reflect and make improvements to the process went better, but Claude&#39;s overzealousness to prevent <em>any</em> errors made it attempt to compromise the inherent flexibility of the feedback loop from failures.</p>

<p>(It is prosaic, but I believe simply collecting <em>all</em> of the tweaks over the course of several projects, and using them for classic fine tuning, could be useful to try. The hard part there is just collecting the data.)</p>

<p>This system burns a lot of tokens (...which was kinda the point. Unblock machine time from the human attention bottleneck.) There&#39;s plenty of easy efficiency work like caching the process documentation. Using cheaper models is appealing: High capacity models can do goal decompositions for cheaper models to attempt. (Unblock cheap inference from the expensive inference bottleneck.)</p>

<p>Ultimately, I found this a useful point in the solution space. One I believe avoids a lot of problems I hear other senior engineers are having. At the same time, there&#39;s a lot of juice left to be squeezed out of these models. Let&#39;s keep sharing what we find that works (and doesn&#39;t work) when using AI to invent new ways of building software. Peace and love to you all, my fellow hackers.</p>
]]></content:encoded>
      </item>
      <item>
        <guid>http://blog.dpc.dev/chocolate-chip-cookies#51264</guid>
          <pubDate>Sun, 03 Jan 2021 09:55:57 +0900</pubDate>
        <link>http://blog.dpc.dev/chocolate-chip-cookies</link>
        <title>Chocolate Chip Cookies</title>
        <description></description>
        <content:encoded><![CDATA[<p>This is based on the &ldquo;Pittsburgh&rdquo; cookie in <a href="https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46507.pdf"><em>Bayesian Optimization for a Better Dessert</em></a> with even less sugar and other tweaks. That is an industrial recipe, so this version works well if you dump everything in a bowl and mix. It is a good recipe to make with kids.</p>

<p>Skeptical about the chilli? Divide your dough and make some cookies with and some without. The chilli makes the cookies compulsively more-ish.</p>

<p><em>Ingredients</em></p>

<ul>
<li>136g butter, melted</li>
<li>107g flour</li>
<li>60g oat flour, <em>which you can make by milling oatmeal in your blender into a powder</em></li>
<li>55g muscavado sugar, <em>or brown sugar... or any kind of sugar</em></li>
<li>½ tsp salt, <em>even medium coarse salt works well</em></li>
<li>½ tsp baking soda</li>
<li>50g egg, <em>if you have more than 50g, use all of the yolk first</em></li>
<li>⅓ tsp vanilla essence</li>
<li>⅓ tsp orange essence</li>
<li>two dashes of cayenne pepper, <em>or</em> ½ tsp chilli powder 🌶️</li>
<li>254g chocolate chips</li>
</ul>

<p><em>Method</em></p>

<ol>
<li>Preheat the oven to 170&deg;C. Line two baking trays with baking paper.</li>
<li>In a mixing bowl, add all ingredients except the chocolate chips. Mix well.</li>
<li>Add the chocolate chips and mix briefly to distribute them.</li>
<li>Using a tablespoon measure, scoop out crude balls and place on baking trays.</li>
<li>Bake until light brown, about 20 minutes.</li>
<li>Remove from the oven and cool for 5 minutes, then transfer to a cooling rack.</li>
</ol>

<p><em>Tips</em></p>

<ul>
<li>🚫 Don&#39;t introduce the egg to hot melted butter: The butter will cook the egg and you will get a mixture of cookie dough and scrambled egg. I soften butter in a 500W microwave over for one minute, which is not very hot, add the flour, then the egg.</li>
<li>🚫 Don&#39;t mix the butter and sugar until the sugar is dissolved. Without some sugar crystals, the surface texture of the cookie suffers. And we&#39;re already using a fine sugar.</li>
<li>🚫 Don&#39;t roll the cookies into smooth balls. This makes the cookie surface smooth and less crunchy. Before baking the cookies should look very rough and forlorn.</li>
</ul>
]]></content:encoded>
      </item>
      <item>
        <guid>http://blog.dpc.dev/useless-stuff#50031</guid>
          <pubDate>Sat, 20 Jun 2020 23:27:12 +0900</pubDate>
        <link>http://blog.dpc.dev/useless-stuff</link>
        <title>Useless Stuff</title>
        <description>How to have less of it</description>
        <content:encoded><![CDATA[<p>You have too much useless stuff.</p>

<p>Get rid of it.</p>

<p>Marie Kondo&#39;s method can manipulate your emotions to help you throw things out. First, you have to pile all your clothes on the bed. Put all you books on the floor. That sort of thing. How much stuff you have will <em>disgust</em> you. Second, you have to &quot;wake up&quot; your things and &quot;thank&quot; the ones which do not &quot;spark joy&quot; before you &quot;let them go.&quot; This is sleight of hand to distract you from what you&#39;re doing: You are wasting these things. Marie approves. You have her permission.</p>

<p>Japan has an indigenous concept, 断捨離 (danshari), which has three parts: Don&#39;t get things you don&#39;t need. Discard things you have but don&#39;t use. Don&#39;t obsess about things. This is more comprehensive than the Kon-Mari method. The Kon-Mari method is <em>discarding.</em> Discarding has the negative connotation of wastefulness, もったいない (mottainai.) So Marie Kondo is less famous in Japan. People I&#39;ve talked to here seem skeptical of her method.</p>

<p><strong>Subscriptions.</strong> Cancel them. This is my work in progress. The newspaper, some software are still too hard to let go of. But try. You will cancel some. You will get offers to remain a subscriber at half price for others. (Read those cancellation terms.) Patreon&mdash;those people you support have moved on to other things. Or <em>you</em> have moved on to other things. That&#39;s OK.</p>

<h2 id="dont-get-any-more-stuff">Don&#39;t Get Any More Stuff</h2>

<p>Once you have less stuff, its tempting to get new stuff. Ask yourself these questions first:<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>

<ol>
<li>Can I live without this item?</li>
<li>Based on my financial situation, can I afford it?</li>
<li>Will I actually use it?</li>
<li>Do I have space for it?</li>
<li>How did I come across it in the first place?</li>
<li>What is my emotional state in general today?</li>
<li>How do I feel about buying it? And how long will this feeling last?</li>
</ol>

<p>Examine your motivations. You don&#39;t need, can&#39;t afford, won&#39;t use, and don&#39;t have space for [thing] you stumbled upon while feeling a little bored. The nice feeling you have about buying it won&#39;t last.</p>

<p><strong>Kickstarter.</strong> Getting off it takes special effort. You click, you buy, you get the little endorphin rush from that. The remorse comes much, much later&mdash;if at all. From time to time something does arrive in the post. I forgot all about this! It&#39;s a present from someone with excellent taste: Yours. Let&#39;s shop some more!</p>

<p>I tried to give it up cold turkey. That didn&#39;t work. Things I had already backed kept pulling me to the site. Size? Color? Address? Psst you might like this project. Only now that I&#39;m free of it can see what&#39;s going on. <em>Of course</em> Kickstarter <em>could</em> remember my mailing address. They don&#39;t. That is the point.</p>

<p>What did work was doing Kickstarter &quot;lite.&quot; Project looks interesting? Great, back it for $1. You will get updates but no rewards. This makes the site less sticky. It kills the reward signal. In a month I was clean; I didn&#39;t even need to back things for $1 any more.</p>

<p><img alt="sb_float" class="sb_float" src="https://silvrback.s3.amazonaws.com/uploads/532acd33-cb65-4348-b265-993d80bb72e3/IMG_20200621_083553_medium.jpg" /> <strong>Keep the box.</strong>  If you do cave and buy something, keep the box. These fill up your closet space and act as a natural brake on having too much. And when you&#39;re ready to &quot;let it go,&quot; it&#39;s better to sell it in the original box.</p>

<h2 id="minimalism-even-less-stuff">Minimalism: Even Less Stuff</h2>

<p>To go deeper, you need the minimalists. <a href="https://www.amazon.com/gp/product/0141986387/ref=as_li_tl?ie=UTF8&tag=dpc00-22&camp=247&creative=1211&linkCode=as2&creativeASIN=0141986387&linkId=d1323a5b2d1896c6c304614ed633d87c"><em>Goodbye, Things: On Minimalist Living</em></a> has a series of short arguments for minimalism. Read it. A few of them will stick and start to nag at you.</p>

<p>Minimalism is a thing I have <em>not</em> acquired, though.</p>

<div class="footnotes">
<hr>
<ol>

<li id="fn1">
<p>I clipped these from an article, but threw the rest of the article out. If you know the source, please let me know so I can link to it.&nbsp;<a href="#fnref1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
      </item>
  </channel>
</rss>