<?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>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>
    <item>
      <title>31 hard questions about coordinating parallel coding agents, answered</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Fri, 04 Sep 2026 04:50:40 +0000</pubDate>
      <link>https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2</link>
      <guid>https://dev.to/naw103/31-hard-questions-about-coordinating-parallel-coding-agents-answered-2md2</guid>
      <description>&lt;p&gt;Last week I open-sourced &lt;a href="https://github.com/naw103/foremerge" rel="noopener noreferrer"&gt;Foremerge&lt;/a&gt;, a coordination protocol for coding agents that sits above Git. Agents publish intent and claim semantic scopes with declared operations before writing code, so two plans that cannot both be true collide in a queryable store instead of in your merge.&lt;/p&gt;

&lt;p&gt;A few days in, a reader named &lt;a href="https://github.com/VedantMadane" rel="noopener noreferrer"&gt;Vedant Madane&lt;/a&gt; went through the repo and left thirty-one questions across a &lt;a href="https://github.com/naw103/foremerge/discussions/14" rel="noopener noreferrer"&gt;GitHub discussion&lt;/a&gt;. They were the best kind of questions: the kind you can only ask after actually reading the source. I answered every one in the thread, but most people will never click into a GitHub discussion, so here is the full Q&amp;amp;A, lightly edited, plus three questions I missed in the thread and answer here for the first time.&lt;/p&gt;

&lt;p&gt;If you want the short version of what the tool does first: one Rust binary, local-first, Apache-2.0, exposing a CLI, a local JSON API, and an MCP server over one SQLite store in your repo's git common dir. The &lt;a href="https://github.com/naw103/foremerge#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt; has a real terminal recording.&lt;/p&gt;

&lt;h2&gt;
  
  
  Origin and users
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What real failure made you build this? A specific multi-agent wreck, or a bet that fleets would need a whiteboard above Git?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initially it was just the growing pain of resolving collisions from multiple agents working in parallel worktrees and duplicating code. We had "find a better solution" on our roadmap with no success, because nothing seemed to exist at this layer of the stack. What pushed us to focus was a specific incident: the team was using an agent to replace a payment service class, and one of our automated agents picked up a backlog ticket to extend that same class with an additional provider. Different worktrees, no overlapping lines, both merged clean, and the second change depended on an extension point the first had deleted. We caught it in review, and it would have failed in CI, but something like this can slip into production without proper tests in place. It cost us a day of refactoring, and the gap was obvious.&lt;/p&gt;

&lt;p&gt;After using the tool internally, I extracted it from our internal tools monorepo and open-sourced it in late August.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why "intent before code" rather than post-hoc PR/diff analysis?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Timing and determinism. Post-hoc catches the collision after both agents have spent their tokens, so the best you can do is discard or refactor work. Comparing plans catches it before those costs exist. And a declared operation is a fact you can assert HIGH severity on, while an operation inferred from a diff is a guess. A coordination layer that guesses wrong at HIGH severity gets ignored within a week, which is why prose-inferred matches cap below HIGH in 0.4.0 and only declared operations can assert it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is the primary user today: solo power users running 2-3 agents, or teams running fleets?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Solo power users running two or more agents on one machine. That is who we were. Fleets and teams are the later story, and honestly need further validation before we lean on that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does success look like at 1.0 that isn't true at 0.4.0?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Published coordinated-vs-uncoordinated benchmarks with raw data. Versioned JSON Schemas for the full protocol surface, hopefully with community agreement. At least one language adapter so symbol scopes resolve structurally instead of as strings. Calibration evidence that findings correlate with real conflicts. Protocol stability is the promise 1.0 makes; 0.4.0 does not make it yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design choices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why advisory-only and never hard locks? What about "agent ignored the warning and shipped damage"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lock assumes the declarer is right and will finish, and agents abandon work constantly. One stale lock could gridlock an entire fleet. Deeper than that: we cannot enforce a semantic lock without intercepting filesystem writes, which we deliberately do not do, so a "lock" would be an advisory pretending to be a lock.&lt;/p&gt;

&lt;p&gt;On the tradeoff: the warning is not the enforcement point, acceptance is. Accepting a ChangeSet requires no unresolved HIGH findings plus verification against the exact candidate fingerprint, and the ledger records that a finding was overridden. Ignoring a warning becomes a visible decision instead of a silent one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why deterministic rules and no LLM judge for conflicts? When do pure rules hit a wall?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The conflict detector is the trust core, so it has to be reproducible, testable, free, offline, and identical for every user. A judge that changes its mind between runs erodes exactly the trust the layer exists to provide, and an LLM judge is only as good as the context it is given.&lt;/p&gt;

&lt;p&gt;The real limits of rules show up when meaning, not exact text, matters: synonyms, undeclared renames, cross-file contract drift. The plan is to keep rules authoritative and let fuzzier matching only propose findings below HIGH.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why SQLite under the .git common dir instead of a separate service, CRDTs, or Git notes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SQLite in the common dir is zero infrastructure, transactional, and queryable, and the common dir is the one location every worktree of a repo already shares, so worktree isolation plus shared state comes for free.&lt;/p&gt;

&lt;p&gt;CRDTs solve convergence of concurrent edits, but our problem is whether two plans can both be true, and convergence is not correctness. CRDTs are engineered to make conflicts disappear; Foremerge exists to make them visible. They are excellent for what they are built for, and the wrong tool at the layer we would use them.&lt;/p&gt;

&lt;p&gt;Git notes are append-only but query poorly and entangle coordination state with push semantics. And I would push back hard on any new storage engine until SQLite produces evidence one is necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why one Rust binary (CLI, daemon, MCP) rather than a library every runtime embeds?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents integrate through protocol surfaces (MCP, CLI, JSON API), not linkage, and runtimes already speak MCP. A library per runtime means N bindings with version skew. One binary keeps the deterministic core single-sourced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What did you deliberately put in non-goals that people keep asking for anyway?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hard locks are the most requested, then a merge queue, then editor-buffer sync. They share a theme: each would make Foremerge claim authority it cannot honestly enforce. A lock it cannot physically hold, a merge decision that belongs to your Git host, a synchronization layer that would confuse convergence with correctness. The non-goals list is the tool refusing to pretend. Also on the list: automatically trusting a ChangeSet because an agent says its tests passed. Verification runs, or acceptance does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protocol practice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How much do agents actually publish intents in the wild?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the MCP skill or project template in context, compliance is good, because declaring intent is just another tool call in the loop. Without it, compliance is whatever your system prompt enforces. Hard numbers on wild compliance rates are one of the things we most want real traces for, beyond our own use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How stable is the scope vocabulary, and who owns expanding it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The seven operations (add, extend, modify, replace, remove, rename, migrate) are versioned with the protocol. Expansion needs to happen conservatively through community discussions, and the same goes for removals. If you hit a real change the vocabulary cannot express, that report is a contribution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When should an agent claim vs only publish intent? What cadence in a long session?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Publish intent when the plan forms, claim when you are about to touch the scope. Claims are leases, so long sessions renew them, and a materially changed plan is a new intent. Detecting drift between what was declared and what is actually being edited is on the 0.5.0 roadmap, based on feedback from Reddit reviewers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Empty conflicts on first publish is "none yet," not "none ever." How should clients handle that?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Correct reading, and a source reviewer made the same point independently. 0.4.1 adds an &lt;code&gt;as_of&lt;/code&gt; sequence to conflict queries so a client can tell how stale its view is instead of mistaking an early empty answer for a verdict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should happen when two agents claim the same scope and both continue?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both can continue, because claims are advisory leases, and that is deliberate. The protocol's ideal shape: the second claimant sees the finding at claim time, and its options are all first-class moves. Proceed anyway (recorded), coordinate by recording an assessment (conflicts, depends_on), or re-scope the work. If both continue regardless, the acceptance gate is the backstop: the first ChangeSet through accepts clean, the second faces an unresolved finding that requires explicit resolution or an operator override, and every step of that is in the ledger. For HIGH findings, my advice is that a human should make the call. The tool's job is to make sure the call is made with both plans visible, not discovered at merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measurement
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do you measure false positives vs false negatives on real multi-agent traces?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Paired runs: the same tasks with and without coordination, then labeling discarded work, post-integration failures, and warnings dismissed as noise. False negatives are the hard half because they are breaks that nothing detected, which means human labeling. We will publish raw results before making any quantitative claim, and until then the documentation says exactly that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Synonyms and rename collisions (PaymentService vs BillingService): research track or near-term?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Worth splitting into three layers. Declared renames are in the operation vocabulary and detected deterministically. Across different labels, the deterministic core refuses to guess on purpose: scope matching is token-normalized but never speculative, because speculation about synonymy erodes the trust the HIGH tier depends on. Instead, the protocol hands semantic similarity to the layer that actually has semantic understanding: the agents. An agent that recognizes two differently-named intents overlap records an assessment (conflicts, compatible, duplicate, or depends_on, with rationale), and that verdict becomes durable, queryable coordination state the rest of the fleet sees. Language adapters shrink the alias problem near-term by resolving symbols to canonical paths instead of strings. The research track is narrower than it sounds: whether the engine itself should ever propose cross-label matches below HIGH with calibrated confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are conflict suggestions meant to stay heuristic forever or become policy-driven?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suggestions stay heuristic suggestions in core. The policy layer being designed in the community threads is where a team encodes what must happen when a finding fires. The resolution itself stays a recorded human or agent decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which shipped rule are you least confident in, and why keep it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Probably &lt;code&gt;divergent_rewrite&lt;/code&gt;. Two broad modifications of one scope are sometimes genuinely compatible, which is why it fires below HIGH. We keep it because the cost asymmetry favors the warning: dismissing a wrong one costs a sentence, missing a right one costs a rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trust boundary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Validation runs as trusted OS commands with no sandbox. What's the threat model for agent-supplied check names?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Checks are registered by name, by a human, once (&lt;code&gt;foremerge checks set unit-tests -- cargo test --workspace&lt;/code&gt;). Agents reference the name and cannot supply arbitrary command lines; the string an agent sends is a lookup key, not a shell command, and the stored command is argv, never shell-interpreted.&lt;/p&gt;

&lt;p&gt;The residual risk is real and documented: agents still write the code that a legitimate check executes, so a malicious test file runs with your privileges regardless. Our threat model is fallible agents, not adversarial ones. If your agents are adversarial, you need OS-level sandboxing underneath everything, and no coordination layer replaces that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Authoritative" validation can be gamed if tests mutate and restore the tree. Accepted residual risk or future fix?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Accepted residual risk today, stated in the limitations doc. Verification binds to the exact fingerprint and failed validation leaves refs untouched, but a test that lies about itself can win. Re-hashing the tree after the run is a plausible 0.5+ hardening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChangeSet accept is not merge/push. Will Foremerge ever gate merges?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Core stays above Git permanently; not becoming a merge queue is a listed non-goal. The roadmap path is status checks: surface acceptance state to your Git host and let your branch protection do the gating. Git gates, Foremerge informs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coordination state isn't in clone/push. What's the real backup story before multi-machine?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Intentional, because Git is the wrong transport for it. Coordination state is live, expiring, operational data, and Git moves snapshots of history. A claim is a lease; a lease you learn about only when someone remembers to push is pointless, and a stale synced copy is worse than none because it looks authoritative.&lt;/p&gt;

&lt;p&gt;What is actually at risk: the store is &lt;code&gt;.git/foremerge/state.sqlite3&lt;/code&gt;, running in WAL mode. Losing it loses zero code. It loses open intents and claims (transient, agents re-declare) and the durable record: the hash-chained event ledger, assessments, verification evidence, acceptance decisions. For a solo user that is telemetry and audit trail. If you care about the provenance ledger as a record, back it up.&lt;/p&gt;

&lt;p&gt;The two loss scenarios that actually happen are re-cloning a repo and disk death. General backup tools cover the second, with one catch: some configs exclude &lt;code&gt;.git&lt;/code&gt; directories. The correct stopgap is SQLite's online backup, which is safe while the service runs (never plain &lt;code&gt;cp&lt;/code&gt; a WAL-mode database mid-write):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlite3 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--git-common-dir&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/foremerge/state.sqlite3"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;".backup '&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/backups/foremerge-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.sqlite3'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restore is putting the file back before starting the service. A built-in &lt;code&gt;foremerge backup&lt;/code&gt; command is a natural first installment of the export/import tooling already on the roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Multi-machine is "later." What's the hardest unsolved piece: auth, consistency, or threat model?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The trust model, more than consistency. Consistency is boundable: one shared daemon first, no distributed SQLite pretensions. But a verification result asserted from another machine is hearsay unless re-executed or attested, and designing auth and attestation without turning a local-first tool into a server product is the genuinely hard part. That tension is why it sits in "later."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which language adapter first, and will manual scopes stay first-class?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TypeScript and Python first, following where agent usage concentrates. Manual scopes stay first-class forever: APIs, schemas, config, infrastructure, and environment variables live in no AST. Many of the things agents collide on are not code symbols and appear in no syntax tree. Two agents both migrating the same table is exactly the "both plans cannot be true" failure, and often a worse one than a code collision, because nothing else in the stack even pretends to watch for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When will you publish benchmarks, and which metric matters most?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pilot after the 0.5.0 tooling settles. Priority order: conflicts avoided, discarded work, post-integration failures, time-to-merge. Wasted human and agent hours are the cost that scales with fleet size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows install story: intentional lag or capacity?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Release CI builds and tests &lt;code&gt;x86_64-pc-windows-msvc&lt;/code&gt; today, including Windows-specific validation-timeout behavior, and &lt;code&gt;cargo install foremerge&lt;/code&gt; works. The curl installer is unix-only; a winget or scoop manifest would be a very welcome contribution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the business/maintenance plan if this stays open source?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The core stays Apache-2.0 and local-first, and the local tool will never require a server. GitHub Sponsors covers maintenance today. If a sustainable business ever grows around this, it will be around optional team infrastructure, the shared coordination service already described in the roadmap's "later" section, and never around gating the local tool. The word "optional" in that roadmap entry is load-bearing, and I intend to keep it that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best path to stickiness: MCP skill, setup templates, or CI status checks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The MCP skill, because it works with any coding tool and makes coordination another tool call instead of a discipline. Setup templates second. Status checks third, because that converts an individual habit into a team default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would make Claude/Codex/Cursor default to Foremerge?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Community adoption, and the fact that the protocol is boring and neutral. Versioned schemas, no vendor coupling, Apache-2.0, published evidence. Runtimes adopt what their users already run, so the path is bottom-up through MCP, not partnerships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If another project ships "agent locks" or "agent worktrees," where do you still win?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Locks and worktrees manage files; we compare plans. Worktrees are complementary and we assume them. If someone ships actual semantic plan comparison, we compete on determinism, the verification gate, and the provenance ledger. And if they do it better, it is Apache-2.0 all the way down and users win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What contribution do you most want right now?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Conflict evidence. Real traces where detection was right, wrong, or missed, even a paragraph describing the collision. Second: scope vocabulary proposals grounded in a real codebase. Third: client adapter recipes for specific agent stacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The questions I could answer fastest were the ones where a non-goal did the work. Never hard-lock, never merge-queue, never guess about synonymy, never trust an agent's word for its tests: each of those is the tool declining authority it could not honestly enforce, and each one made the harder questions (trust boundaries, multi-machine, benchmarks) easier to reason about.&lt;/p&gt;

&lt;p&gt;If you run parallel coding agents and have seen a collision that clean diffs missed, that story is the contribution I want most: &lt;a href="https://github.com/naw103/foremerge/discussions" rel="noopener noreferrer"&gt;open a discussion&lt;/a&gt;. And if you read the source and come back with questions like these, you will get answers like these.&lt;/p&gt;

&lt;p&gt;Thanks again to Vedant for the interrogation.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>git</category>
      <category>rust</category>
    </item>
    <item>
      <title>Parallel coding agents without the carnage</title>
      <dc:creator>Nick Woodhead</dc:creator>
      <pubDate>Thu, 27 Aug 2026 18:21:26 +0000</pubDate>
      <link>https://dev.to/naw103/parallel-coding-agents-without-the-carnage-gf9</link>
      <guid>https://dev.to/naw103/parallel-coding-agents-without-the-carnage-gf9</guid>
      <description>&lt;p&gt;We build GPTree with several coding agents working the same repository at once: Claude Code, Codex, and Cursor, each in its own git worktree. The failure that finally made us build tooling for it was small and completely silent.&lt;/p&gt;

&lt;p&gt;One session was told to replace &lt;code&gt;PaymentService&lt;/code&gt; with a Stripe-specific implementation. Another was told to add PayPal support to &lt;code&gt;PaymentService&lt;/code&gt;. Different worktrees. Different files. Zero textual conflict. Git merged both branches cleanly, and the second change now depended on an extension point the first had deleted. Nothing in the toolchain had an opinion about it at any moment.&lt;/p&gt;

&lt;p&gt;Git compares diffs. It cannot compare plans.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worktrees isolate files, not plans
&lt;/h2&gt;

&lt;p&gt;Worktrees became the standard answer to parallel agents for a good reason: two sessions editing one checkout will overwrite each other's files and poison each other's context. Isolated checkouts fix that completely.&lt;/p&gt;

&lt;p&gt;But three failure modes survive file isolation, because they were never about files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Destructive versus additive.&lt;/strong&gt; One agent removes or replaces a thing another agent is building on. The example above. Merges clean, breaks the design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate work.&lt;/strong&gt; Two agents solve the same problem from different angles because nothing assigned ownership. You pay twice and then pay again to reconcile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract drift.&lt;/strong&gt; One agent changes an API, a schema, or a config contract while another codes against the old shape. Compiles, runs, disagrees at runtime.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A shared task list helps with the second one, if every agent reads it, every time. Nothing in that setup catches the first or third, because the collision is between intentions, and intentions live in prompts, not in any file a tool can watch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declare the work before doing it
&lt;/h2&gt;

&lt;p&gt;Foremerge is the internal tool we built for this, open-sourced this week. It is a coordination protocol that sits above Git: agents declare what they are about to do, before they do it, in a form precise enough to check.&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 vocabulary covers symbol, api, schema, config, migration, contract, and more, because file paths miss API, schema, configuration, and cross-language collisions entirely. The operation (replace, extend, and so on) is declared rather than parsed out of the summary, so it does not matter how the agent phrased its plan.&lt;/p&gt;

&lt;p&gt;When a second agent declares work on the same scope, deterministic rules compare the declarations and raise a finding while both pieces of work are still plans. This is real output from 0.4.0, captured while writing this post:&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;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Coordinate on a stable `PaymentProvider` contract first, then implement StripePaymentProvider and PayPalPaymentProvider behind it and migrate callers deliberately. This is a heuristic suggestion, not an automatic design decision."&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;The finding names the rule that fired, explains itself, and suggests a resolution. It does not block anyone. Claims in Foremerge are leased and advisory: overlap produces a warning and shared context, never a lock, because two agents can often work the same region compatibly and a lock would serialize work that did not need serializing.&lt;/p&gt;

&lt;p&gt;The other half of the protocol is evidence. When an agent finishes, it publishes a ChangeSet, and acceptance is gated on verification that Foremerge runs itself: your named check (a build, a typecheck, a test target you registered) executed against the exact candidate fingerprint. An agent saying "tests pass" is recorded as provenance; it does not satisfy the gate. If the tree changed after validation, the attempt is non-authoritative and the gate says so.&lt;/p&gt;

&lt;p&gt;Mechanically it is one Rust binary. The CLI, a local JSON API, and an MCP server are adapters over the same SQLite store, which lives inside your repository's git common directory, which is exactly why worktrees work well with it: linked worktrees share that directory, so every agent in the repo sees the same declarations while keeping isolated files. Local-first, no cloud, Apache-2.0.&lt;/p&gt;

&lt;p&gt;The five-minute version&lt;br&gt;
The fastest path is to let your agent set it up. &lt;/p&gt;

&lt;p&gt;Paste this into Claude Code, Codex, or Cursor from inside the repository you want to coordinate:&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;The MCP server gives the agent the full lifecycle as tools: publish intent, claim scope, check conflicts, publish ChangeSets, run verification, record the commit that landed. Set it up once per repository and every agent connected to that repository shares the same awareness.&lt;/p&gt;

&lt;p&gt;Doing it by hand instead is the install line,&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;foremerge init&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
, and the commands in the README, which walks two throwaway agents into the exact conflict above in under five minutes.&lt;/p&gt;

&lt;p&gt;What it deliberately does not claim&lt;br&gt;
This is a pre-1.0, local-first MVP, and the parts it does not do are documented as carefully as the parts it does:&lt;/p&gt;

&lt;p&gt;Detection is deterministic and explainable, but heuristic. It can miss synonymous concepts and warn on work that was always compatible.&lt;br&gt;
Claims warn. They never lock files, symbols, or agents.&lt;br&gt;
Passing validation proves that the recorded command passed for the recorded fingerprint. Nothing more.&lt;br&gt;
The store is per-machine SQLite. Shared multi-machine mode does not exist yet.&lt;br&gt;
There is a reproducible benchmark harness in the repo, but no published coordinated-versus-uncoordinated results yet. Performance claims wait for numbers.&lt;br&gt;
The full list is in docs/limitations.md. We think a coordination tool that overclaims is worse than no coordination tool, because severity is the signal an agent uses to decide what to stop for, and a false HIGH is worse than silence.&lt;/p&gt;

&lt;p&gt;Where this goes&lt;br&gt;
The protocol is the part we most want feedback on: is the scope vocabulary the right shape, where would the conflict rules warn on compatible work in your codebase, and which collisions would they miss? Issues and Discussions are open.&lt;/p&gt;

&lt;p&gt;Repo: github.com/naw103/foremerge&lt;br&gt;
Site and install: foremerge.com&lt;br&gt;
Crate: cargo install foremerge&lt;/p&gt;

&lt;p&gt;If you run parallel agents and have hit collisions worktrees could not see, we would genuinely like to hear what they looked like.&lt;/p&gt;

</description>
      <category>git</category>
      <category>ai</category>
      <category>devtools</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
