<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nick Woodhead</title>
    <description>The latest articles on DEV Community by Nick Woodhead (@naw103).</description>
    <link>https://dev.to/naw103</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png</url>
      <title>DEV Community: Nick Woodhead</title>
      <link>https://dev.to/naw103</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naw103"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Mon, 19 Oct 2026 18:40:10 +0000</pubDate>
      <link>https://dev.to/naw103/-205c</link>
      <guid>https://dev.to/naw103/-205c</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/naw103/translating-technical-debt-1ohi" class="crayons-story__hidden-navigation-link"&gt;Translating Technical Debt&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/naw103" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" alt="naw103 profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/naw103" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nick Woodhead
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nick Woodhead
                
                
              
              &lt;div id="story-author-preview-content-4865384" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/naw103" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nick Woodhead&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/naw103/translating-technical-debt-1ohi" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 17&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/naw103/translating-technical-debt-1ohi" id="article-link-4865384"&gt;
          Translating Technical Debt
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/technicaldebt"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;technicaldebt&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/leadership"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;leadership&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/naw103/translating-technical-debt-1ohi" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/naw103/translating-technical-debt-1ohi#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>career</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Mon, 19 Oct 2026 00:05:49 +0000</pubDate>
      <link>https://dev.to/naw103/-7pi</link>
      <guid>https://dev.to/naw103/-7pi</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/naw103/running-multiple-claude-code-agents-in-parallel-what-worktrees-cannot-see-4le7" class="crayons-story__hidden-navigation-link"&gt;Running multiple Claude Code agents in parallel: what worktrees cannot see&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/naw103" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" alt="naw103 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/naw103" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nick Woodhead
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nick Woodhead
                
                
              
              &lt;div id="story-author-preview-content-4874444" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/naw103" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nick Woodhead&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/naw103/running-multiple-claude-code-agents-in-parallel-what-worktrees-cannot-see-4le7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 18&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/naw103/running-multiple-claude-code-agents-in-parallel-what-worktrees-cannot-see-4le7" id="article-link-4874444"&gt;
          Running multiple Claude Code agents in parallel: what worktrees cannot see
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/git"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;git&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devtools"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devtools&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/naw103/running-multiple-claude-code-agents-in-parallel-what-worktrees-cannot-see-4le7" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/naw103/running-multiple-claude-code-agents-in-parallel-what-worktrees-cannot-see-4le7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              14&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>claude</category>
    </item>
    <item>
      <title>Running multiple Claude Code agents in parallel: what worktrees cannot see</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Sun, 18 Oct 2026 23:54:25 +0000</pubDate>
      <link>https://dev.to/naw103/running-multiple-claude-code-agents-in-parallel-what-worktrees-cannot-see-4le7</link>
      <guid>https://dev.to/naw103/running-multiple-claude-code-agents-in-parallel-what-worktrees-cannot-see-4le7</guid>
      <description>&lt;p&gt;If you only ever run one coding agent, you do not need most of this. You're also probably working more inefficiently than you could be.&lt;/p&gt;

&lt;p&gt;If you run two or more: give each Claude Code session its own Git worktree, give each one a task that changes different things, and run your real checks on the merged result rather than on each branch. Worktrees stop agents from overwriting each other's files. They do not stop two agents from making plans that cannot both be true, and Git will merge those plans cleanly, because Git compares text, not intent.&lt;/p&gt;

&lt;p&gt;That second problem has a name. A &lt;strong&gt;semantic conflict&lt;/strong&gt; is when two changes merge without a textual conflict but contradict each other in meaning: one agent removes something another agent is building on, two agents build the same thing twice, or one changes a contract that the other is still coding against. Git cannot report it, because no two edits touched the same lines.&lt;/p&gt;

&lt;p&gt;This post covers the setup that works, what Git can and cannot see, how to split work so semantic conflicts are rarer, and the part no amount of task splitting fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup: one agent, one worktree, one branch
&lt;/h2&gt;

&lt;p&gt;Running two agents in one checkout fails fast. They overwrite each other's half-written files, one session's install step breaks the other's build, and each agent's picture of the code goes stale under it. The standard fix is a Git worktree per agent: a separate checkout of the same repository on its own branch, sharing one history.&lt;/p&gt;

&lt;p&gt;Claude Code has this built in. Run it once per session, with a different name each time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--worktree&lt;/span&gt; feature-auth
claude &lt;span class="nt"&gt;--worktree&lt;/span&gt; add-paypal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use stock Git, which works the same way for any agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add ../myapp-paypal &lt;span class="nt"&gt;-b&lt;/span&gt; agent/paypal
&lt;span class="nb"&gt;cd&lt;/span&gt; ../myapp-paypal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things worktrees do not isolate, and that will bite you the first week:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gitignored dependencies.&lt;/strong&gt; &lt;code&gt;git worktree add&lt;/code&gt; checks out tracked files only. &lt;code&gt;node_modules&lt;/code&gt;, virtualenvs and build directories do not come with it, so each worktree needs its own install before its tests mean anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ports, databases and other shared services.&lt;/strong&gt; Two dev servers on one port, or two agents migrating one local database, collide no matter how the files are laid out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branches.&lt;/strong&gt; Git lets a branch be checked out in only one worktree at a time, so each agent needs its own branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration.&lt;/strong&gt; Someone still merges the branches. Pick one integrator, a person or one designated session, and do not let several agents each resolve the same conflict their own way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With that in place, file collisions are solved. What is left is everything that was never about files.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Git can see, and what it cannot
&lt;/h2&gt;

&lt;p&gt;Git merges by comparing changed lines against a common ancestor. That makes it very good at one kind of collision and blind to the rest.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What the two agents did&lt;/th&gt;
&lt;th&gt;What Git reports&lt;/th&gt;
&lt;th&gt;What actually happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Edited the same lines of the same file&lt;/td&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;td&gt;Git stops you. This is the case it handles.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edited different parts of the same file&lt;/td&gt;
&lt;td&gt;Usually a clean merge&lt;/td&gt;
&lt;td&gt;Often fine. Sometimes not.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One renamed a function, the other added a call to the old name&lt;/td&gt;
&lt;td&gt;Clean merge&lt;/td&gt;
&lt;td&gt;The build fails afterwards. Your CI catches it, if it runs on the merged result.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One replaced a class, the other extended it&lt;/td&gt;
&lt;td&gt;Clean merge&lt;/td&gt;
&lt;td&gt;It may compile. The design is broken.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both built the same feature from different angles&lt;/td&gt;
&lt;td&gt;Clean merge, or an add/add conflict&lt;/td&gt;
&lt;td&gt;You paid twice and now reconcile two versions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One changed a schema or config contract, the other coded against the old shape&lt;/td&gt;
&lt;td&gt;Clean merge&lt;/td&gt;
&lt;td&gt;It builds, runs, and disagrees at runtime.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only the first row is visible to Git. The rename row is visible to a compiler. The last three are visible to nothing in a standard toolchain, because the collision is between two plans, and plans live in prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The canonical failure: replace versus extend
&lt;/h2&gt;

&lt;p&gt;This is the one that made us build tooling, and it is described in more detail in the first post on this blog.&lt;/p&gt;

&lt;p&gt;Two sessions, two worktrees, one repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A: Replace PaymentService with StripePaymentService
Agent B: Add PayPal support to PaymentService
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent A moves every caller onto the new Stripe class. Agent B adds PayPal to the old class. They touch different files. Git merges both branches without complaint. The PayPal work now hangs off a class nothing calls any more.&lt;/p&gt;

&lt;p&gt;Neither agent did anything wrong. Each did exactly what it was asked, each branch passes its own tests, and each agent reports success. Two agents can each be correct and jointly wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same file is not the same as collision
&lt;/h2&gt;

&lt;p&gt;The intuitive fix is to warn whenever two agents touch the same file. Our own data says that signal is weak in both directions.&lt;/p&gt;

&lt;p&gt;When we replayed 76 intents from our own parallel work on GPTree through Foremerge 0.4.0, one pair of branches produced a real Git conflict, and Foremerge had flagged that pair. Five other pairs had changed the same file while both pieces of work were open, and merged cleanly when we checked them with &lt;code&gt;git merge-tree&lt;/code&gt; thanks to Foremerge.&lt;/p&gt;

&lt;p&gt;What it does show is the shape of the problem. Same-file overlap produced mostly clean merges. The replace-versus-extend failure above produces no file overlap at all. File paths are the wrong unit for the collisions that cost the most.&lt;/p&gt;

&lt;p&gt;The replay also showed a real gap: 0.4.0 could not match a scope on a whole class against a scope on one of its methods. Scope hierarchy is a candidate for a later release and is not built yet. More on that in the limitations section below.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to split work between parallel agents
&lt;/h2&gt;

&lt;p&gt;This part is useful whether or not you ever install anything. Most semantic conflicts are avoidable at assignment time, if you assign on the right axis.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Split by what a task changes, not by what it is called.&lt;/strong&gt; "Payments refactor" and "PayPal support" sound like different features and change the same class. Before starting a task, ask which things it will change: which classes, endpoints, tables, config keys. Two tasks with no overlap there can run in parallel. Two with overlap need an order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name the operation, not just the target.&lt;/strong&gt; Adding to something, extending it or modifying it preserves what other work depends on. Replacing, removing, renaming or migrating it does not. Two additive tasks on one target usually just need a shared contract. A destructive task on a target anyone else is touching should run alone, or first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specify the contract before you split the work.&lt;/strong&gt; If two tasks meet at a boundary, make one small change that defines the boundary (the interface, the schema, the API shape), merge it, and then start both agents from that commit. In the payments example, that is a &lt;code&gt;PaymentProvider&lt;/code&gt; interface first, then Stripe and PayPal implementations behind it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List the shared registries.&lt;/strong&gt; Route files, &lt;code&gt;.env.example&lt;/code&gt;, dependency manifests, migration numbering, feature flag lists. Almost every task touches one of them, and almost no plan mentions them. In our replay, two of the same-file pairs were exactly this: a routes file and an example env file that neither plan had named.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the plans down where every agent can read them, before any code.&lt;/strong&gt; A shared markdown file listing each agent's task and targets catches duplicate work, as long as every agent reads it every time. It does not catch replace versus extend unless someone reads both entries and notices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify the merged result, not each branch.&lt;/strong&gt; Every branch can be green while the merge is red. Build, typecheck and test after integration, and treat a branch passing its own tests as a statement about that branch only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run only as many agents as you can follow.&lt;/strong&gt; We do not have a number to give you. The honest limit is how many plans you can read and compare before the agents finish.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1 to 5 are all versions of one idea: get each plan into a form that can be compared with the others before code exists. That is exactly the step that falls apart past two or three agents, because a person has to do the comparing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part Git cannot see: compare plans before code
&lt;/h2&gt;

&lt;p&gt;Foremerge is the tool we built for that comparison. It is an open-source coordination protocol for coding agents that sits above Git. Each agent declares what it is about to change, and how, before it changes anything. Foremerge compares declarations from every agent in the repository and reports a finding when two plans collide, while both worktrees are still clean.&lt;/p&gt;

&lt;p&gt;A declaration is an intent with one or more semantic scopes, each carrying an operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foremerge intent publish &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$AGENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--task&lt;/span&gt; &lt;span class="s2"&gt;"modernize-payments"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--summary&lt;/span&gt; &lt;span class="s2"&gt;"Replace PaymentService with StripePaymentService"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--scope&lt;/span&gt; symbol:PaymentService&lt;span class="o"&gt;=&lt;/span&gt;replace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scopes are not file paths. The kinds are &lt;code&gt;symbol&lt;/code&gt;, &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;schema&lt;/code&gt;, &lt;code&gt;config&lt;/code&gt;, &lt;code&gt;infra&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;migration&lt;/code&gt;, &lt;code&gt;env&lt;/code&gt;, &lt;code&gt;file&lt;/code&gt;, &lt;code&gt;component&lt;/code&gt;, &lt;code&gt;contract&lt;/code&gt; and &lt;code&gt;domain&lt;/code&gt;. The operation is declared by the agent rather than guessed from the summary, so "consolidate payments onto Stripe" and "replace PaymentService with Stripe" reach the same verdict.&lt;/p&gt;

&lt;p&gt;When Agent B declares &lt;code&gt;symbol:PaymentService=extend&lt;/code&gt;, Foremerge raises a &lt;code&gt;destructive_vs_additive&lt;/code&gt; finding at &lt;code&gt;HIGH&lt;/code&gt; severity, explains that one intent replaces the scope the other extends, and suggests coordinating on a stable &lt;code&gt;PaymentProvider&lt;/code&gt; contract first. The suggestion is labelled as a heuristic, not an architecture decision. The response also lists the other agent's intent and every overlapping scope with both declared operations, so the agent can decide what the overlap means and record that decision.&lt;/p&gt;

&lt;p&gt;A few properties matter for parallel Claude Code work specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works across worktrees.&lt;/strong&gt; The store is a SQLite file inside your repository's Git common directory, which every linked worktree shares. Agents keep isolated files and see the same declarations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works across tools.&lt;/strong&gt; Claude Code, Codex and Cursor each connect through the same MCP server and read the same store, so a Codex session and a Claude Code session on one repository see each other's plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can check before you commit to a plan.&lt;/strong&gt; &lt;code&gt;check_conflicts&lt;/code&gt; runs the same comparison as publishing and stores nothing, so an agent that is still planning can ask without leaving a trace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claims never lock.&lt;/strong&gt; Two agents can claim the same scope. The second gets a warning and the other agent's context, not a refusal, because a lock serializes work that was often compatible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acceptance is gated on evidence, not on the agent's word.&lt;/strong&gt; When an agent finishes, it publishes a ChangeSet, and Foremerge runs a check you registered (a build, a typecheck, a fast test target) against the exact fingerprint of that candidate. An agent saying "tests pass" is recorded as provenance and does not satisfy the gate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this replaces worktrees. Worktrees isolate files. Foremerge shares plans. You want both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting it up
&lt;/h3&gt;

&lt;p&gt;The fastest path is to paste this into Claude Code, Codex or Cursor from inside the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set up Foremerge in this repository so we can coordinate parallel agents.

1. Install it:      curl -fsSL https://foremerge.com/install.sh | sh
2. Initialize:      foremerge init
3. Wire this client and any others in use: foremerge setup all
4. Register the check I should be validated against, for example:
                    foremerge checks set test -- cargo test --all-targets
5. Confirm:         foremerge doctor --client all

Then read the Foremerge skill that step 3 installed for this client and follow
it from now on: publish your intent with semantic scopes before editing, claim
the scope, and check for conflicts before you start.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change step 4 to your repository's real test command. Step 3 asks the client to enable an MCP server, so it will prompt you first.&lt;/p&gt;

&lt;p&gt;To install by hand instead: the install script above fetches a checksum-verified release binary for macOS or Linux. &lt;code&gt;npm install -g foremerge&lt;/code&gt; works on macOS and on Linux with glibc. &lt;code&gt;cargo install foremerge&lt;/code&gt; builds it with Rust 1.85 or later. Windows binaries are on the &lt;a href="https://github.com/naw103/foremerge/releases" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;. Then run &lt;code&gt;foremerge init&lt;/code&gt; and &lt;code&gt;foremerge setup claude&lt;/code&gt; (or &lt;code&gt;codex&lt;/code&gt;, &lt;code&gt;cursor&lt;/code&gt;, &lt;code&gt;all&lt;/code&gt;) inside the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not catch
&lt;/h2&gt;

&lt;p&gt;A coordination tool that overclaims is worse than none, because severity is what an agent uses to decide what to stop for. So, plainly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Under-declaration.&lt;/strong&gt; An agent that declares &lt;code&gt;extend&lt;/code&gt; and then rewrites the thing is not detected. Not caught, but auditable: the declaration and the diff are both on record, so the miss can be reconstructed afterwards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope hierarchy.&lt;/strong&gt; A scope on a whole class does not match a scope on one of its methods, and &lt;code&gt;domain:payments&lt;/code&gt; does not imply every payment symbol. Narrow, accurate scopes matter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files nobody declared.&lt;/strong&gt; File overlap is not a conflict signal in this release. The shared registries from step 4 above only show up if an agent declares them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synonyms.&lt;/strong&gt; Two agents using different names for the same concept can slip past the detector, and it can warn on work that was always compatible. Detection is deterministic and explainable, but heuristic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Late arrivals.&lt;/strong&gt; A conflict is detected when the later intent publishes. There are no push notifications, so the earlier agent learns of it at its next boundary or by checking again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other machines.&lt;/strong&gt; The store is per machine. Coordination between machines is outside the project's scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measured results.&lt;/strong&gt; There is a benchmark plan and a harness in the repository, but no published coordinated-versus-uncoordinated results. We make no claim about time saved right now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything else in your pipeline.&lt;/strong&gt; It does not replace code review, CI, or architecture ownership. A missing finding never proves two changes are compatible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full list is in &lt;a href="https://github.com/naw103/foremerge/blob/main/docs/limitations.md" rel="noopener noreferrer"&gt;docs/limitations.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are deciding whether you need this at all, the companion piece on orchestrators and coordinators has a one-question test, and the case for a coordination layer has a post of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I run multiple Claude Code sessions in the same directory?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can, but they share one set of files, so one session's edits and installs land underneath the other's work. Give each session its own Git worktree with &lt;code&gt;claude --worktree &amp;lt;name&amp;gt;&lt;/code&gt; or &lt;code&gt;git worktree add&lt;/code&gt;. Each gets a separate checkout and branch while sharing the repository's history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do Git worktrees prevent merge conflicts between agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Worktrees stop agents from overwriting each other's files while they work. Textual conflicts still appear at merge time when two branches change the same lines, and semantic conflicts, where two changes contradict each other without touching the same lines, merge cleanly and are not reported at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did my agents' branches merge cleanly but the app broke?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most likely a semantic conflict: one agent renamed, replaced or removed something another agent was still using, or changed a schema or config contract the other coded against. Git only compares changed lines, so contradictory plans in different files merge without complaint. Building and testing the merged result catches some of these. Comparing plans before code catches others earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many Claude Code agents should I run in parallel?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is no number we can defend. The practical limit is how many plans you can read and compare before the agents finish, plus how many installs, ports and databases your machine can run at once. If tasks change different things, more agents are fine. If they overlap, more agents mostly means more reconciliation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Foremerge work with Codex and Cursor, or only Claude Code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All three. &lt;code&gt;foremerge setup all&lt;/code&gt; installs the skill and MCP entry for Claude Code, Codex and Cursor, and every client reads the same store in the repository's Git common directory. Any other MCP client can launch &lt;code&gt;foremerge mcp&lt;/code&gt; over stdio. Agents from different vendors see each other's declared plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Foremerge lock files or stop agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Claims are leased and advisory: overlap produces a warning and the other agent's context, never a lock. Findings are evidence for the agent or person to act on. The one hard gate is acceptance, which requires a passing registered check on the exact candidate and no unresolved HIGH finding unless someone overrides it with a recorded reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you run more than one agent
&lt;/h2&gt;

&lt;p&gt;If you only ever run one coding agent, you do not need this. If you run two or more on one repository, worktrees handle the files and Foremerge handles the plans: one Rust binary, local-first, Apache-2.0, with its SQLite store in the Git directory your worktrees already share.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo and docs: &lt;a href="https://github.com/naw103/foremerge" rel="noopener noreferrer"&gt;github.com/naw103/foremerge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install: &lt;a href="https://foremerge.com" rel="noopener noreferrer"&gt;foremerge.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It will miss what agents do not declare. If you hit a collision it should have caught, an issue describing it is the most useful thing you can send us.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://foremerge.com/blog/running-multiple-claude-code-agents-in-parallel/" rel="noopener noreferrer"&gt;foremerge.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>git</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Did you make copies of your custom GPTs?</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Sat, 17 Oct 2026 03:21:44 +0000</pubDate>
      <link>https://dev.to/naw103/did-you-make-copies-of-your-custom-gpts-39gg</link>
      <guid>https://dev.to/naw103/did-you-make-copies-of-your-custom-gpts-39gg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" class="crayons-story__hidden-navigation-link"&gt;Gemini Gems become skills in November and custom GPTs retire on December 11. What to copy out first.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/naw103" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" alt="naw103 profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/naw103" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nick Woodhead
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nick Woodhead
                
                
              
              &lt;div id="story-author-preview-content-4848151" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/naw103" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nick Woodhead&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 14&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" id="article-link-4848151"&gt;
          Gemini Gems become skills in November and custom GPTs retire on December 11. What to copy out first.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/chatgpt"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;chatgpt&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemini"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemini&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>openai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Translating Technical Debt</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Sat, 17 Oct 2026 03:20:01 +0000</pubDate>
      <link>https://dev.to/naw103/translating-technical-debt-1ohi</link>
      <guid>https://dev.to/naw103/translating-technical-debt-1ohi</guid>
      <description>&lt;h2&gt;
  
  
  What technical debt actually means, and how to explain it to someone who doesn't write code
&lt;/h2&gt;

&lt;p&gt;An engineer asks for two sprints to "pay down technical debt," and the person who owns the budget hears two sprints with nothing to show for them. The phrase was invented to make exactly this conversation easier, and a lot of the time it now gets in the way.&lt;/p&gt;

&lt;p&gt;The fix is not a better slide. It's going back to what the metaphor meant in the first place, because the original version already contains the answer to the question the business side is really asking: is this worth paying for?&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the phrase came from
&lt;/h2&gt;

&lt;p&gt;Ward Cunningham coined it in 1992, in a short experience report for the OOPSLA conference about WyCash, a portfolio management system his team built. The line most people know is "Shipping first time code is like going into debt." The same paragraph says a little debt speeds development, as long as it is paid back promptly with a rewrite, and that the danger is debt that never gets repaid.&lt;/p&gt;

&lt;p&gt;In a later video (the transcript is on the c2 wiki) Cunningham explained why he reached for a money metaphor at all. WyCash was financial software, and he needed to explain to his boss why the team kept reworking code that already worked. As the team learned how the financial objects really behaved, they changed the program to match that understanding. If they had not, he said, they would keep stumbling over the gap between what the code said and what they now knew, and that stumbling would slow them down the way interest slows down a loan.&lt;/p&gt;

&lt;p&gt;So the original idea is simple. You ship before you fully understand the problem, because shipping is how you learn. Then you put what you learned back into the code. Skip that second step for long enough and every change gets slower.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not mean
&lt;/h2&gt;

&lt;p&gt;In the same video, Cunningham said many people had confused the metaphor with the idea of writing code badly on purpose and cleaning it up later. He was clear that he never favored writing code poorly. What he favored was code that reflects your current understanding, even when that understanding is partial, written cleanly enough that you can change it once you know more.&lt;/p&gt;

&lt;p&gt;That matters for the conversation. When an engineer says "we have technical debt," the business side often hears "we cut corners" or "we did it wrong." Usually it means something closer to "we know more now than we did when we built this, and the code has not caught up." That is not a failure. It is what learning looks like in software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principal and interest, in plain terms
&lt;/h2&gt;

&lt;p&gt;Martin Fowler's explanation on his site is the clearest one I know of, because it uses the two parts of a loan that everyone already understands.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The principal&lt;/strong&gt; is the cost of cleaning the code up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The interest&lt;/strong&gt; is the extra effort every new change costs while the mess is still there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;His example: a confusing structure means a new feature takes six days instead of the four it would take with a clean structure. Those two extra days are the interest. Cleaning up the structure would take five days.&lt;/p&gt;

&lt;p&gt;If that is the only feature coming, cleaning up is a bad deal. Fowler points out you would spend nine days instead of six. But if two more similar features are on the way, cleaning up first makes the team faster overall. Using his numbers: three features without the cleanup is 18 days, and the cleanup plus three faster features is 5 + 12 = 17 days.&lt;/p&gt;

&lt;p&gt;Look at what that decision depends on. Not on how ugly the code is, but on how much more work is coming through that part of the system. Engineers know the interest rate. The business side knows the roadmap. Neither can make the call alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not all debt is the same kind
&lt;/h2&gt;

&lt;p&gt;Fowler also sorts debt into a simple grid. One axis is whether the debt was &lt;strong&gt;deliberate&lt;/strong&gt; (you knew you were taking a shortcut) or &lt;strong&gt;inadvertent&lt;/strong&gt; (you found out later). The other is whether it was &lt;strong&gt;prudent&lt;/strong&gt; (taken on with the cost weighed against the benefit) or &lt;strong&gt;reckless&lt;/strong&gt; (taken on without weighing anything).&lt;/p&gt;

&lt;p&gt;In plain terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deliberate and prudent:&lt;/strong&gt; "We took a shortcut to hit the launch date, and we knew it would cost us later." This is a business decision that worked as intended. The bill is now due.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inadvertent and prudent:&lt;/strong&gt; "Now that we have built it, we understand how it should have been built." Fowler says even the best teams end up here, because you learn as you go. This is Cunningham's original meaning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliberate and reckless:&lt;/strong&gt; "We knew better and skipped it anyway to go faster." This usually comes from underestimating how soon the shortcut would start costing time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inadvertent and reckless:&lt;/strong&gt; "We didn't know what good looked like." This is a skills conversation, not a debt conversation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fowler's point is that the useful question is not whether a team has debt, since every team does, but whether it was prudent or reckless. Knowing which kind you are talking about tells you whether this is a normal bill, a lesson, or a problem with how the work is done.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you write the code: how to explain it
&lt;/h2&gt;

&lt;p&gt;The goal is to give the person with the budget something they can decide on. A few habits help.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lead with the interest, not the principal.&lt;/strong&gt; "We need two sprints to refactor billing" is a cost with no benefit attached. "Every change to billing takes about two extra days because of how it is structured" is a cost they are already paying. Use your own real numbers, even rough ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect it to work that is actually coming.&lt;/strong&gt; Name the upcoming items on the roadmap that go through that part of the system. If nothing is coming, say so. Leaving it alone can be the right call, and saying that out loud earns you trust for the times it is not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show the payback.&lt;/strong&gt; Cleanup cost, the time each change saves, and how many changes until it pays for itself. Fowler's example is a good template because the arithmetic fits on one line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say which kind it is.&lt;/strong&gt; "We took this shortcut on purpose to make the March launch" lands very differently from "this is how we learned the problem." Both are fine. Just say which.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask for a decision.&lt;/strong&gt; End with the options and what you would pick: pay it now, pay it before a specific feature, or leave it. Do not end with "let's discuss."&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  If you fund the work: how to ask about it
&lt;/h2&gt;

&lt;p&gt;Business leaders can make this conversation easier too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask &lt;strong&gt;"what does this slow down, and by how much?"&lt;/strong&gt; instead of "why is the code bad?" The first question gets you an interest rate. The second gets you a defensive answer.&lt;/li&gt;
&lt;li&gt;Ask &lt;strong&gt;"what happens if we never pay it?"&lt;/strong&gt; Sometimes the honest answer is "nothing much, that area rarely changes," and that is useful to know.&lt;/li&gt;
&lt;li&gt;Share what is coming. The engineers can only work out whether the cleanup pays back if they know what the next few months of work look like.&lt;/li&gt;
&lt;li&gt;Treat a debt request as information, not an admission. The team is telling you about a cost you are already paying.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One question that carries most of it
&lt;/h2&gt;

&lt;p&gt;Every version of this conversation comes down to one question both sides can answer together, what is the interest on the work we are about to do? Explaining tradeoffs in terms like that, so the decision happens in the meeting, is what TranslateTech's Geek2Speak series is about.&lt;/p&gt;

&lt;p&gt;Next time technical debt comes up, ask (or answer) that one question before anyone talks about how long the cleanup takes.&lt;/p&gt;

</description>
      <category>technicaldebt</category>
      <category>leadership</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Wed, 14 Oct 2026 06:27:24 +0000</pubDate>
      <link>https://dev.to/naw103/-ndn</link>
      <guid>https://dev.to/naw103/-ndn</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" class="crayons-story__hidden-navigation-link"&gt;Gemini Gems become skills in November and custom GPTs retire on December 11. What to copy out first.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/naw103" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" alt="naw103 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/naw103" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nick Woodhead
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nick Woodhead
                
                
              
              &lt;div id="story-author-preview-content-4848151" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/naw103" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nick Woodhead&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 14&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" id="article-link-4848151"&gt;
          Gemini Gems become skills in November and custom GPTs retire on December 11. What to copy out first.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/chatgpt"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;chatgpt&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemini"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemini&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>gemini</category>
      <category>news</category>
    </item>
    <item>
      <title>Gemini Gems become skills in November and custom GPTs retire on December 11. What to copy out first.</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Wed, 14 Oct 2026 06:23:48 +0000</pubDate>
      <link>https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5</link>
      <guid>https://dev.to/naw103/gemini-gems-become-skills-in-november-and-custom-gpts-retire-on-december-11-what-to-copy-out-first-3kf5</guid>
      <description>&lt;p&gt;If you built a Gem in Gemini or a custom GPT in ChatGPT, it is about to be converted into something else on the vendor's timetable, not yours. Both companies say most of it carries over, but both also list things that do not, and those are the parts you will miss the next time you use it.&lt;/p&gt;

&lt;p&gt;I read both help pages today (October 13, 2026). Here is what each one says, what does not make the trip, and what I would copy out this week.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Google says about Gems
&lt;/h2&gt;

&lt;p&gt;Google's help page "About the transition from Gems to skills" says that starting in November 2026, Gems will transition to skills for personal Google Accounts, and in 2027 for work and school accounts. The page gives March 2027 for Workspace business accounts and June 2027 for education accounts.&lt;/p&gt;

&lt;p&gt;When Gems are removed, Google says it will automatically recreate your Gems as skills, along with supported knowledge files. A skill is a set of reusable custom instructions you call by typing a slash and its name in any Gemini chat, and Gemini can also apply one on its own when it thinks it is relevant.&lt;/p&gt;

&lt;p&gt;The same page lists what is different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skills do not work with Canvas or Deep Research yet, and most of the default tools a Gem could use (Create video, Create music, Guided learning) are not available to a skill.&lt;/li&gt;
&lt;li&gt;Files a Gem pulled from GitHub are not supported in skills, so they are not converted.&lt;/li&gt;
&lt;li&gt;Sharing a skill, and adding Google Drive files to one, are listed as coming in the coming weeks.&lt;/li&gt;
&lt;li&gt;You can make as many skills as you like but only 100 can be active at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So a Gem that was mostly instructions will be fine. A Gem that leaned on Canvas, Deep Research, a GitHub file or a share link to your team will come out the other side missing a piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenAI says about custom GPTs
&lt;/h2&gt;

&lt;p&gt;OpenAI's "Custom GPT retirement and migration FAQ" says custom GPTs are scheduled to retire on December 11, 2026 (February 11, 2027 for Enterprise workspaces with an approved deferral), and that the change affects all ChatGPT plans. Creators migrate each GPT to a plugin from My GPTs when the option shows up for their account.&lt;/p&gt;

&lt;p&gt;What transfers, per the FAQ: the GPT's instructions become a skill inside the new plugin, connected apps are added as apps, and knowledge files are copied into the plugin's reference files. Your existing conversations with the GPT stay accessible after retirement.&lt;/p&gt;

&lt;p&gt;What does not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The GPT's selected model does not carry over.&lt;/li&gt;
&lt;li&gt;Custom actions do not transfer. The FAQ says rebuilding one may need a custom MCP server.&lt;/li&gt;
&lt;li&gt;Sharing settings do not carry over. A migrated plugin starts private, and the people who used your GPT do not get access to the replacement automatically.&lt;/li&gt;
&lt;li&gt;Migration uses the latest published version, so drafts and unpublished edits are left behind.&lt;/li&gt;
&lt;li&gt;After you migrate, the original GPT becomes read-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAI also says plainly that a migrated plugin may respond differently, and suggests saving a few familiar prompts so you can compare the results before and after.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern in both
&lt;/h2&gt;

&lt;p&gt;The two migrations are not the same, but the same three things hold in both.&lt;/p&gt;

&lt;p&gt;The instructions survive. In both cases the text you wrote is the part that converts cleanly.&lt;/p&gt;

&lt;p&gt;The wiring does not. Tools, actions, model choice and sharing are the parts each vendor is changing, and they are the parts you cannot export as text.&lt;/p&gt;

&lt;p&gt;You do not pick the date. Google gives a month, OpenAI gives a day, and both pages say the timing can differ by account.&lt;/p&gt;

&lt;p&gt;That tells you where the work is. The instructions are the asset, and a copy of them in a plain file is worth more than whatever container they sit in this quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would copy out this week
&lt;/h2&gt;

&lt;p&gt;This takes about 20 minutes for a handful of assistants.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open each Gem and each GPT you still use and paste its name, description and full instructions into a text or markdown file. One file per assistant.&lt;/li&gt;
&lt;li&gt;Download the knowledge files into the same folder. Google's own steps for recreating a Gem as a skill start with exactly this.&lt;/li&gt;
&lt;li&gt;Write down what it depended on that is not text: which model, which tools (Canvas, Deep Research, actions, connected apps) and who it was shared with.&lt;/li&gt;
&lt;li&gt;Save three or four prompts you run often, with an answer you were happy with. OpenAI recommends this for testing a migrated plugin and it works just as well for a skill.&lt;/li&gt;
&lt;li&gt;If a GPT has unpublished edits you care about, publish them before you migrate. Publishing does not require sharing it publicly.&lt;/li&gt;
&lt;li&gt;After the conversion, run the saved prompts and compare. Fix what changed before you rely on it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One useful detail on the Google side: the help page says you can upload a &lt;code&gt;SKILL.md&lt;/code&gt; file to bring in a skill made on another platform, in the Gemini web app and Mac app for now. OpenAI's migration also turns your instructions into a skill. Both vendors are converging on instructions kept as a file, which is one more reason to keep your own copy as one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where GPTree fits
&lt;/h2&gt;

&lt;p&gt;I built GPTree, so read this part knowing that. GPTree does not import Gems or GPTs. What it has is personas, and a persona is three plain fields: a name, an optional description, and the instructions. The text you copied out in step 1 pastes straight into the instructions box. You pick a persona per message from the composer, and personas apply per branch, so you can send the same question down two branches under two personas and compare the answers. On the Free plan you can keep one persona of your own, and the built-in ones do not count toward that.&lt;/p&gt;

&lt;p&gt;That is not a migration tool and I am not selling it as one. The point of the list above is the same wherever you paste the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next step
&lt;/h2&gt;

&lt;p&gt;Pick the one Gem or GPT you would miss most, and copy its instructions and files into a folder today. Everything else on the list can wait until the migration option shows up in your account.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>chatgpt</category>
      <category>gemini</category>
    </item>
    <item>
      <title>AI agents introduced several new layers to the development stack. You are probably missing this one.</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Thu, 17 Sep 2026 01:39:19 +0000</pubDate>
      <link>https://dev.to/naw103/ai-agents-introduced-several-new-layers-to-the-development-stack-you-are-probably-missing-this-one-54dg</link>
      <guid>https://dev.to/naw103/ai-agents-introduced-several-new-layers-to-the-development-stack-you-are-probably-missing-this-one-54dg</guid>
      <description>&lt;p&gt;The development stack grew more in the last two years than in the previous ten. Most teams adopted the new layers so quickly they never noticed them becoming layers. Count them.&lt;/p&gt;

&lt;p&gt;The agent layer: Claude Code, Codex, Cursor. The thing that writes code. Two years ago this layer did not exist; today it is where implementation happens.&lt;/p&gt;

&lt;p&gt;The context layer: CLAUDE.md, AGENTS.md, rules files, memory systems. Telling agents how your repository works, what your conventions are, what not to touch. Everyone who onboarded an agent wrote these within a week, because an agent without context is a very fast junior with amnesia.&lt;/p&gt;

&lt;p&gt;The tool layer: MCP. Agents reaching databases, browsers, issue trackers, deployment systems. Adopted fast because an agent that cannot touch your systems can only talk about them.&lt;/p&gt;

&lt;p&gt;The isolation layer: git worktrees, containers, cloud sandboxes. One agent per checkout, because two sessions in one working directory stomp each other's files and poison each other's context. Anyone who ran two agents learned this in the first afternoon.&lt;/p&gt;

&lt;p&gt;The orchestration layer: Gas Town, claude-squad, Foreman, and a fast-growing ecosystem of fleet runners. Who works on what, which sessions are alive, what needs review. The moment you run more than two or three agents, supervision becomes its own job, and this layer takes it.&lt;/p&gt;

&lt;p&gt;Each of these layers got adopted quickly for the same reason: its absence hurts immediately and obviously. No context, the agent writes nonsense today. No isolation, files get stomped today. No orchestration, you lose track of your fleet today.&lt;/p&gt;

&lt;p&gt;There is one more layer, and almost nobody runs it, because its absence hurts silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure that announces nothing
&lt;/h2&gt;

&lt;p&gt;Two agents, one repository. Agent A is told to replace PaymentService with a Stripe-specific implementation. Agent B is told to add PayPal support to PaymentService. Run the failure through every layer you have adopted.&lt;/p&gt;

&lt;p&gt;The agent layer performs perfectly: both sessions write competent code. The context layer performs: both followed your conventions. The tool layer performs: every MCP call succeeded. The isolation layer performs: separate worktrees, no stomped files. The orchestration layer performs: two independent tasks, both completed, both green.&lt;/p&gt;

&lt;p&gt;Git merges both branches without a conflict, because the changes touch different lines. And the design is now broken: agent B built on an extension point agent A deleted. Nothing in the toolchain objected at any moment, because every layer you have answers a different question, and none of them answer this one: can these two plans coexist?&lt;/p&gt;

&lt;p&gt;Git compares diffs, and there is no diff at the moment this collision actually happens. The collision is between intentions, at plan time, before either agent has written a line. We hit versions of this for months. The one that finally made us build tooling surfaced three days after a clean merge, in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The coordination layer
&lt;/h2&gt;

&lt;p&gt;The missing layer answers exactly one question: can the work currently in flight all be true at once?&lt;/p&gt;

&lt;p&gt;To be precise about what it does not do: it does not create plans. Your agents plan however they already plan. The coordination layer is a ledger and a referee, not a planner. Each agent declares what it is about to change before writing code: a semantic scope plus an operation, like symbol:PaymentService=replace. Scopes are not file paths, because file paths miss API, schema, configuration, and cross-language collisions. Deterministic rules compare the declarations and raise a finding while both sides are still plans: the rule that fired, an explanation, a suggested resolution. In the PaymentService case, one destructive operation and one additive operation on the same scope cannot both be true, and the second agent learns this in the same call that published its intent.&lt;/p&gt;

&lt;p&gt;The other half of the layer is evidence. When work finishes, acceptance is gated on a verification command the layer executes itself against the exact fingerprint of the candidate change. An agent reporting that tests pass is provenance, not proof. If the tree changed after validation, the attempt does not count.&lt;/p&gt;

&lt;h2&gt;
  
  
  What building one taught us
&lt;/h2&gt;

&lt;p&gt;Three lessons, each paid for.&lt;/p&gt;

&lt;p&gt;First: declared beats inferred. We started by inferring operations from agent prose, and it produced confident false alarms. "Delete the flaky ThumbnailCache benchmark test" was read as destroying ThumbnailCache itself. Widening the verb list just moved the boundary. Making agents declare the operation as structured syntax removed the whole error class.&lt;/p&gt;

&lt;p&gt;Second: advisory beats locks, but severity must be earned. Most overlaps between agents are compatible, and a lock serializes work that did not need serializing; the moment a lock exists, a busy repo becomes a queue. So claims warn instead of block. The discipline that makes warnings survivable is reserving HIGH for two declarations that genuinely cannot both be true. Our repo carries a regression fixture that fails the build if compatible work ever raises a HIGH.&lt;/p&gt;

&lt;p&gt;Third: soft claims, hard gate. Everything before the finish line is advisory, because the finish line is not: no acceptance while an unresolved HIGH finding stands, and no acceptance on self-reported evidence. The gate staying hard is what lets everything before it stay soft.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you need this layer?
&lt;/h2&gt;

&lt;p&gt;If you run one coding agent, no. Close the tab, you are fine.&lt;/p&gt;

&lt;p&gt;If you run two or more on the same repository, whether in parallel today or sequentially across days, you have already had the silent version of this failure whether you noticed it or not. The tell: a change that made you say "wait, when did that class stop existing?" three days after a clean merge.&lt;/p&gt;

&lt;p&gt;We open-sourced the coordination layer we built and use: Foremerge (&lt;a href="https://github.com/naw103/foremerge" rel="noopener noreferrer"&gt;https://github.com/naw103/foremerge&lt;/a&gt;), Apache-2.0, one Rust binary, local-first, above Git rather than inside it. Setup is one paste into Claude Code, Codex, or Cursor. Stated plainly per the honesty its own docs demand: detection is deterministic but heuristic and can warn on compatible work, claims never lock anything, and there are no published benchmarks yet, so no performance claims. The layer matters regardless of whose implementation you run, including one you build yourself.&lt;/p&gt;

&lt;p&gt;The stack grew five layers in two years because each one's absence hurt the day you needed it. The sixth one's absence hurts three days later. That is the only reason you are probably missing it.&lt;/p&gt;

&lt;p&gt;Foremerge&lt;br&gt;
The open-source coordination protocol for parallel coding agents, built above Git. Agents declare intent and semantic scopes before writing code, so plans that cannot both be true collide in a queryable store instead of in your merge. One Rust binary, Apache-2.0, local-first.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -fsSL https://foremerge.com/install.sh | sh&lt;/code&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>git</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Any thoughts on this?</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Thu, 17 Sep 2026 01:32:04 +0000</pubDate>
      <link>https://dev.to/naw103/any-thoughts-on-this-pa7</link>
      <guid>https://dev.to/naw103/any-thoughts-on-this-pa7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" class="crayons-story__hidden-navigation-link"&gt;31 hard questions about coordinating parallel coding agents, answered&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/naw103" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" alt="naw103 profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/naw103" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nick Woodhead
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nick Woodhead
                
                
              
              &lt;div id="story-author-preview-content-4570291" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/naw103" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nick Woodhead&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" id="article-link-4570291"&gt;
          31 hard questions about coordinating parallel coding agents, answered
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/git"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;git&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rust"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rust&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>discuss</category>
      <category>llm</category>
    </item>
    <item>
      <title>Both words mean "make several agents work together," so they get used interchangeably. They name different layers, and one question tells you which one you are running.</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Mon, 14 Sep 2026 05:06:30 +0000</pubDate>
      <link>https://dev.to/naw103/both-words-mean-make-several-agents-work-together-so-they-get-used-interchangeably-they-name-2bk4</link>
      <guid>https://dev.to/naw103/both-words-mean-make-several-agents-work-together-so-they-get-used-interchangeably-they-name-2bk4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/naw103/agent-orchestrators-and-agent-coordinators-are-not-the-same-layer-5gek" class="crayons-story__hidden-navigation-link"&gt;Agent orchestrators and agent coordinators are not the same layer&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/naw103" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" alt="naw103 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/naw103" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nick Woodhead
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nick Woodhead
                
                
              
              &lt;div id="story-author-preview-content-4647108" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/naw103" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nick Woodhead&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/naw103/agent-orchestrators-and-agent-coordinators-are-not-the-same-layer-5gek" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 14&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/naw103/agent-orchestrators-and-agent-coordinators-are-not-the-same-layer-5gek" id="article-link-4647108"&gt;
          Agent orchestrators and agent coordinators are not the same layer
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devtools"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devtools&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/git"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;git&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/naw103/agent-orchestrators-and-agent-coordinators-are-not-the-same-layer-5gek" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;10&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/naw103/agent-orchestrators-and-agent-coordinators-are-not-the-same-layer-5gek#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              16&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Agent orchestrators and agent coordinators are not the same layer</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Mon, 14 Sep 2026 05:05:29 +0000</pubDate>
      <link>https://dev.to/naw103/agent-orchestrators-and-agent-coordinators-are-not-the-same-layer-5gek</link>
      <guid>https://dev.to/naw103/agent-orchestrators-and-agent-coordinators-are-not-the-same-layer-5gek</guid>
      <description>&lt;p&gt;If you only ever run one coding agent, you do not need either of these. Close the tab, you are fine.&lt;/p&gt;

&lt;p&gt;For everyone else: I maintain &lt;a href="https://github.com/naw103/foremerge" rel="noopener noreferrer"&gt;Foremerge&lt;/a&gt;, and I recently submitted it to a list called &lt;code&gt;awesome-agent-orchestrators&lt;/code&gt;. It was merged into a section for infrastructure and coordination protocols, which is the right shelf. The list's name is still the wrong noun for it. Foremerge is not an orchestrator. It cannot start an agent, cannot stop one, and does not know when one is running. Coordination currently lives as a shelf inside an orchestration list, which says a lot about how new the distinction is.&lt;/p&gt;

&lt;p&gt;The two words get used interchangeably, and reasonably so. Both mean something like "make several agents work together." But they describe different layers of the stack, with different authority, different failure modes, and different reasons to exist. Here is the difference, and a one-question test for telling them apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What happens if you kill it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kill your orchestrator and the fleet stops. Sessions die, queued work never starts, nothing is spawned or resumed until you bring it back. An orchestrator sits in the control path.&lt;/p&gt;

&lt;p&gt;Kill your coordinator and every agent keeps typing. You lose the shared picture, not the work. A coordinator sits beside the control path, not in it.&lt;/p&gt;

&lt;p&gt;That single structural fact drives everything else about how the two behave.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an orchestrator does
&lt;/h2&gt;

&lt;p&gt;It owns the run loop. Concretely: spawning sessions, placing each one somewhere isolated (a worktree, a container, a cloud sandbox), deciding what runs next and in what order, restarting what died, routing prompts and results, and giving you one screen showing which of your fourteen sessions are alive and which are waiting on you.&lt;/p&gt;

&lt;p&gt;This is real work and it becomes its own job the moment you pass two or three agents. The ecosystem here is growing fast and includes both standalone session managers, &lt;code&gt;claude-squad&lt;/code&gt;, &lt;code&gt;dmux&lt;/code&gt;, &lt;code&gt;amux&lt;/code&gt;, &lt;code&gt;agent-deck&lt;/code&gt; and their neighbors, and in-session fan-out inside a single agent, like Claude Code's subagents or a workflow script that runs a dozen tasks in parallel.&lt;/p&gt;

&lt;p&gt;An orchestrator's authority is imperative. It can start things and stop things. Its input is tasks. Its state is sessions and processes. Its question is &lt;strong&gt;who is running what right now?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What a coordinator does
&lt;/h2&gt;

&lt;p&gt;It never starts or stops anything. Its input is not tasks but declarations: before an agent edits, it states what it is about to change, in a form precise enough to check.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foremerge intent publish &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$AGENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--task&lt;/span&gt; modernize-payments &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--summary&lt;/span&gt; &lt;span class="s2"&gt;"Replace PaymentService with StripePaymentService"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--scope&lt;/span&gt; &lt;span class="s1"&gt;'symbol:PaymentService=replace'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A scope is not a file path, because file paths miss API, schema, configuration and cross-language collisions. The operation (&lt;code&gt;replace&lt;/code&gt;, &lt;code&gt;extend&lt;/code&gt;, and the rest) is declared rather than parsed out of the summary. When a second agent declares &lt;code&gt;symbol:PaymentService=extend&lt;/code&gt;, deterministic rules compare the two declarations and return a finding in the same call that published the second intent. This is real 0.4.0 output, captured while writing this piece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"destructive_vs_additive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HIGH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PaymentService"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"explanation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"One intent will replace `PaymentService` while the other will extend it; both declare the same semantic scope."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FM-C001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source_operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"extend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target_operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source_operation_inferred"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target_operation_inferred"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"detected_before_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note what is absent. No process id, no session, no queue position, no instruction to either agent. The coordinator does not know whether either agent is currently running, and does not need to. Its question is &lt;strong&gt;can the work in flight all be true at once?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Its authority is evidentiary rather than imperative. It cannot stop a keyboard. What it can do is withhold its blessing at the end and say exactly why:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BLOCKING_CONFLICT: 1 unresolved HIGH intent conflict(s);
coordinate and resolve them before acceptance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CHECK_FAILED: this ChangeSet is UNVERIFIED (no verification check was
run against this ChangeSet)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both are overridable, by a human, with a recorded reason. That is the shape of evidentiary authority: it can make you look, it cannot make you stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The split, in a table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Orchestrator&lt;/th&gt;
&lt;th&gt;Coordinator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Owns the run loop&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authority&lt;/td&gt;
&lt;td&gt;Imperative: start, stop, schedule&lt;/td&gt;
&lt;td&gt;Evidentiary: findings, gates, audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;Tasks&lt;/td&gt;
&lt;td&gt;Declared intents and scopes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;Sessions, processes, queues&lt;/td&gt;
&lt;td&gt;Intents, claims, findings, changesets, validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Question answered&lt;/td&gt;
&lt;td&gt;Who is running what?&lt;/td&gt;
&lt;td&gt;Can these plans coexist?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;If it dies&lt;/td&gt;
&lt;td&gt;The fleet stalls&lt;/td&gt;
&lt;td&gt;Agents keep working, you lose visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibility scope&lt;/td&gt;
&lt;td&gt;Its own sessions&lt;/td&gt;
&lt;td&gt;The repository, across sessions and vendors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Three consequences worth caring about
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One: an orchestrator can only see its own fleet.&lt;/strong&gt; It knows about the sessions it spawned. Your actual working day is Claude Code in one window, Codex in another, Cursor open on the same repository, plus a colleague, plus something you started on Tuesday and came back to on Thursday. Claude Code coordinates its own subagents inside one session, and does it well, because there is one root and one plan. Between roots, nothing does. A coordinator earns its keep by being neutral about who spawned the agent, which is also why one built into a single runner would see less.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two: an orchestrator's only lever is scheduling.&lt;/strong&gt; If the only tool you have is control over execution order, then your only conflict resolution is serialization: run them one at a time and the collision cannot happen. That is correct and expensive, because most concurrent work on a repository is compatible and did not need serializing. A coordinator can let both agents run and raise a finding, precisely because it is not responsible for the run loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three: being outside the control path forces a design choice.&lt;/strong&gt; A coordinator must never lock, because a single crashed agent holding a lock would stall the fleet, which is the exact failure it was supposed to help you avoid causing. So claims are leased and advisory: overlap produces a warning and shared context, never a lock. What makes advisory claims survivable is that the last step is not advisory. No acceptance while an unresolved HIGH finding stands, and no acceptance on an agent's own report that tests passed. Soft claims, hard gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Could one tool be both?
&lt;/h2&gt;

&lt;p&gt;Structurally, yes, and nothing stops it. An orchestrator could grow declared scopes and deterministic comparison rules and cover both layers in one process. Most of the tools on that list manage sessions and worktrees, which is what they set out to do, and its infrastructure section already carries a few coordination tools, this one included. What I have not yet seen is a single tool that runs the agents and also compares declared operations before code exists.&lt;/p&gt;

&lt;p&gt;The interesting part is what such a tool would have to add, because it is not just a feature. An orchestrator holds prompts. A prompt is prose, and inferring an operation from prose produces confident false alarms: we tried it, and "delete the flaky ThumbnailCache benchmark test" got read as destroying ThumbnailCache itself. Widening the verb list only moved the boundary. Asserting HIGH severity on a guess is how a coordination tool gets ignored in a week. A declared operation is a fact, and facts are what a rule can be strict about. In 0.4.0 only declared operations can assert HIGH; prose-inferred matches cap below it.&lt;/p&gt;

&lt;p&gt;So the question is not whether one process can hold both layers. It is whether it holds declarations or just prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one do you need?
&lt;/h2&gt;

&lt;p&gt;One agent: neither.&lt;/p&gt;

&lt;p&gt;Two or three in parallel: orchestration first. Its absence hurts today, in ways you notice within an afternoon. Lost sessions, stomped files, no idea what is still running.&lt;/p&gt;

&lt;p&gt;The coordination layer's absence hurts on a delay. Both agents finish, both look right, Git merges both without a conflict because nothing textually overlaps, and three days later you are asking when that class stopped existing. That is the failure that made us build this one.&lt;/p&gt;

&lt;p&gt;Foremerge is the coordination layer we extracted from the monorepo of internal tools we use building GPTree, and open-sourced in late August 2026. One Rust binary, Apache-2.0, local-first, a CLI plus a local JSON API plus an MCP server over one SQLite store inside your repository's Git common directory. It sits above Git rather than inside it, and it composes with whatever orchestrator you already run.&lt;/p&gt;

&lt;p&gt;Stated plainly, per the honesty its own docs demand: detection is deterministic but heuristic, so it can warn on compatible work and can miss incompatible plans when agents name the same concept differently. Claims never lock anything. Agent identity is self-asserted, so the ownership guards raise the bar against confusion, not against a caller that deliberately presents another agent's id. It is local-only today, with no multi-machine mode. There are no published benchmarks yet, so there are no performance claims here.&lt;/p&gt;

&lt;p&gt;The layer matters regardless of whose implementation you run, including one you write yourself. So here is the noun test one more time. If it can start and stop your agents, it is an orchestrator. If it can only tell you whether their plans can coexist, and refuse to bless the result at the end, it is a coordinator. Most fleets run the first. Almost nobody runs the second.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>opensource</category>
      <category>git</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Fri, 04 Sep 2026 05:39:26 +0000</pubDate>
      <link>https://dev.to/naw103/-28kn</link>
      <guid>https://dev.to/naw103/-28kn</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" class="crayons-story__hidden-navigation-link"&gt;31 hard questions about coordinating parallel coding agents, answered&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/naw103" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" alt="naw103 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/naw103" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nick Woodhead
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nick Woodhead
                
                
              
              &lt;div id="story-author-preview-content-4570291" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/naw103" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554256%2F30bcbda8-7c4e-4e95-b2a5-0e5a0008965a.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nick Woodhead&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" id="article-link-4570291"&gt;
          31 hard questions about coordinating parallel coding agents, answered
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/git"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;git&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rust"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rust&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
