<?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: Ram Chandra Samal</title>
    <description>The latest articles on DEV Community by Ram Chandra Samal (@ramcsamal).</description>
    <link>https://dev.to/ramcsamal</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3950207%2F4d5e0b51-0c83-4ce0-a8fa-f5ecdb7abed0.png</url>
      <title>DEV Community: Ram Chandra Samal</title>
      <link>https://dev.to/ramcsamal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramcsamal"/>
    <language>en</language>
    <item>
      <title>Multi-Repo Microservice Changes Are a Coordination Problem. I Solved It With AI Agent Teams.</title>
      <dc:creator>Ram Chandra Samal</dc:creator>
      <pubDate>Mon, 25 May 2026 08:12:03 +0000</pubDate>
      <link>https://dev.to/ramcsamal/multi-repo-microservice-changes-are-a-coordination-problem-i-solved-it-with-ai-agent-teams-34mf</link>
      <guid>https://dev.to/ramcsamal/multi-repo-microservice-changes-are-a-coordination-problem-i-solved-it-with-ai-agent-teams-34mf</guid>
      <description>&lt;p&gt;A walkthrough of &lt;strong&gt;RepoOrch&lt;/strong&gt; — an open-source Claude Code plugin that turns a multi-repo workspace into a deliberating team of AI specialists, with peer-to-peer messaging and a hard read-only safety model.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/architonixlabs/RepoOrch" rel="noopener noreferrer"&gt;github.com/architonixlabs/RepoOrch&lt;/a&gt; · MIT licensed · v0.3.0&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;The honest workflow for a multi-repo bug in a microservice org looks like this: open three codebases, read until your eyes blur, hope you didn't miss a contract break in the fourth.&lt;/p&gt;

&lt;p&gt;This isn't a code problem. It's a &lt;em&gt;coordination&lt;/em&gt; problem. And it's the exact shape of problem that the new &lt;strong&gt;Agent Teams&lt;/strong&gt; primitive in Claude Code is built to solve.&lt;/p&gt;

&lt;p&gt;In this post I'll walk through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why subagents (the older primitive) can't handle multi-repo change planning&lt;/li&gt;
&lt;li&gt;What Agent Teams add — specifically, the mailbox abstraction for peer-to-peer agent messaging&lt;/li&gt;
&lt;li&gt;How I built &lt;strong&gt;RepoOrch&lt;/strong&gt;, an open-source plugin that uses this pattern to turn a multi-repo workspace into a deliberating AI team&lt;/li&gt;
&lt;li&gt;The propose-only safety model and why it's enforced at the platform layer, not in prose&lt;/li&gt;
&lt;li&gt;How knowledge graphs cut per-triage token cost on large workspaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you've ever opened five tabs for a single microservice change and thought &lt;em&gt;"there has to be a better division of labor here,"&lt;/em&gt; this is about that.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The shape of the problem
&lt;/h2&gt;

&lt;p&gt;Imagine the workspace below — a perfectly ordinary microservice layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-project/
├── auth-service/
├── payments/
├── notifications/
├── inventory/
└── shipping/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ticket arrives in your queue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Users are getting 401 errors after the auth refactor."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The bug almost certainly lives across multiple repos. Maybe &lt;code&gt;auth-service&lt;/code&gt; changed the shape of a JWT claim, and &lt;code&gt;payments&lt;/code&gt; still expects the old shape. Maybe &lt;code&gt;notifications&lt;/code&gt; never validated the claim properly and is silently dropping events. The only honest way to know is to read each codebase, trace the contract, and hope you didn't miss something.&lt;/p&gt;

&lt;p&gt;This is a textbook agentic AI use case — except for one thing: the agents need to &lt;strong&gt;talk to each other&lt;/strong&gt;. And until recently, they couldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Why subagents can't do this
&lt;/h2&gt;

&lt;p&gt;The standard agent-orchestration pattern in Claude Code (before Agent Teams) looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;master agent
    ├─→ subagent A (auth-service expert)
    ├─→ subagent B (payments expert)
    └─→ subagent C (notifications expert)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each subagent gets a question, does some research, and reports back to the master. Subagents &lt;strong&gt;cannot talk to each other&lt;/strong&gt;. They form a tree, not a graph.&lt;/p&gt;

&lt;p&gt;That's fine for "go read this file" or "summarize the schema." It falls apart the moment two specialists need to &lt;em&gt;negotiate&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Consider what actually needs to happen for the 401 bug:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The auth specialist proposes: &lt;em&gt;"I'll change the JWT &lt;code&gt;sub&lt;/code&gt; claim from &lt;code&gt;user_id&lt;/code&gt; to &lt;code&gt;UUID&lt;/code&gt;."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The payments specialist needs to answer: &lt;em&gt;"Does my service depend on the shape of the &lt;code&gt;sub&lt;/code&gt; claim?"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a subagent tree, the only path between them goes through the master. So the master has to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understand the auth proposal deeply enough to translate it into a question for payments&lt;/li&gt;
&lt;li&gt;Get the payments answer&lt;/li&gt;
&lt;li&gt;Translate it back into a constraint on auth&lt;/li&gt;
&lt;li&gt;Repeat for every cross-repo edge&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This doesn't scale, and worse — it forces the master into a coordinator role it's not really equipped for. The result is plans that look complete but have stale assumptions baked in.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Agent Teams: the mailbox primitive
&lt;/h2&gt;

&lt;p&gt;Claude Code 2.1.32 introduced &lt;strong&gt;Agent Teams&lt;/strong&gt;. The key difference is one small but transformative addition: &lt;strong&gt;each teammate gets a mailbox&lt;/strong&gt;, and teammates can message each other directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;master agent
    ├─→ auth specialist  ──┐
    │                      │  direct peer messages
    ├─→ payments spec.  ──┤  (mailbox)
    │                      │
    └─→ notifications  ───┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the conversation that actually needs to happen &lt;em&gt;can&lt;/em&gt; happen:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;auth → payments:&lt;/strong&gt; "I'm proposing changing the JWT &lt;code&gt;sub&lt;/code&gt; claim from &lt;code&gt;user_id&lt;/code&gt; to &lt;code&gt;UUID&lt;/code&gt;. Does your service read &lt;code&gt;sub&lt;/code&gt; directly, and if so, how do you parse it?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;payments → auth:&lt;/strong&gt; "Yes, we read &lt;code&gt;sub&lt;/code&gt; in &lt;code&gt;auth.middleware.ts:42&lt;/code&gt; and call &lt;code&gt;parseInt()&lt;/code&gt; on it. Your change will break us unless we update to &lt;code&gt;UUID&lt;/code&gt; parsing in the same release."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That deliberation is what produces a plan you can actually trust. The master doesn't have to be smart enough to mediate the contract — the specialists are.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How RepoOrch puts this together
&lt;/h2&gt;

&lt;p&gt;RepoOrch is a Claude Code plugin that operationalizes this pattern for the multi-repo microservice case. Setup is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/repo-orch-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The setup runner:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discovers every git repo under your workspace root.&lt;/li&gt;
&lt;li&gt;Indexes each repo (language, frameworks, endpoints, events, dependencies).&lt;/li&gt;
&lt;li&gt;Writes an editable context document per repo — and &lt;em&gt;pauses for your review&lt;/em&gt;. (This is the most important step. The &lt;code&gt;owns&lt;/code&gt; field in the context drives routing later.)&lt;/li&gt;
&lt;li&gt;On your confirmation, generates a specialist agent per repo and a &lt;code&gt;registry.json&lt;/code&gt; the master uses for routing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, for any incoming ticket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/repo-orch-triage "Users are getting 401 errors after the recent auth refactor"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The master reads the registry, scores which repos are likely involved, and spawns the relevant specialists as an Agent Team. They emit VERDICTs, deliberate over cross-repo contracts via their mailboxes, and the master synthesizes a single ordered change plan with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-repo dependency ordering (which repo's change must land first)&lt;/li&gt;
&lt;li&gt;Risks called out per repo&lt;/li&gt;
&lt;li&gt;Validation hints (the tests / endpoints to exercise)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero files modified&lt;/strong&gt; — which brings us to the safety model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For incidents where the root cause isn't known, there's an adversarial variant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/repo-orch-deliberate "Payments failing intermittently — unknown root cause"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This spawns the team in a mode where specialists are biased toward challenging each other's hypotheses, not converging too fast on the first plausible cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Propose-only, enforced at the platform layer
&lt;/h2&gt;

&lt;p&gt;There is a recurring AI-agent failure mode where the prompt says "do not modify files" and then the agent modifies files anyway. &lt;strong&gt;Prose is not a security boundary.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RepoOrch enforces propose-only in two layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tool restriction.&lt;/strong&gt; Every specialist agent is spawned with &lt;code&gt;tools: Read, Grep, Glob, Bash&lt;/code&gt;. There are no write, edit, create, or delete tools available. This isn't a prompt instruction — it's the actual tool inventory the agent sees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PreToolUse hook.&lt;/strong&gt; A platform-level hook intercepts every Bash call and hard-blocks write-like commands: &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, &lt;code&gt;git push&lt;/code&gt;, &lt;code&gt;sed -i&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt; redirection, and others. Even a malicious or hallucinated bash invocation is rejected before it runs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;/repo-orch-triage&lt;/code&gt; and &lt;code&gt;/repo-orch-deliberate&lt;/code&gt; commands additionally spawn agents with &lt;code&gt;permissionMode: "plan"&lt;/code&gt;, so the spawning context itself is read + delegate only.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The v0.2 guarantee, written into the README: &lt;em&gt;the agents produce a plan document. The developer executes it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6. Knowledge graphs and token savings
&lt;/h2&gt;

&lt;p&gt;The naive way to run a triage is to have every specialist cold-read its repo on every ticket. That works, but it adds up. The optional &lt;code&gt;/repo-orch-graph&lt;/code&gt; command builds a Claude-native knowledge summary per repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/repo-orch-graph    →  Claude reads each repo and writes summary.json
     ↓                  (one-time cost, no API key)
/repo-orch-triage   →  master pre-loads summary.json into a ~600-token
     ↓                  GRAPH_SUMMARY
specialist          →  reads GRAPH_SUMMARY first, targeted file reads
                       only for gaps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This entire flow runs &lt;strong&gt;inside the Claude Code session&lt;/strong&gt; — no Python, no API key, no external service. If no summary exists, the plugin degrades gracefully to direct file reads.&lt;/p&gt;

&lt;p&gt;On large workspaces this is the difference between "feels expensive" and "feels free." On small workspaces it's not worth the setup; the plugin lets you skip it.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Headless mode for CI
&lt;/h2&gt;

&lt;p&gt;For teams that want triage to happen automatically when a Jira ticket or GitHub issue is filed, RepoOrch exposes a headless entry point via the Anthropic Agent SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;runTriage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.claude/plugins/repo-orchestrator/automation/repo-orch-triage_runner.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// In a GitHub/Jira webhook handler:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runTriage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;workspaceRoot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/path/to/your/workspace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;postComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs in &lt;code&gt;permissionMode: "plan"&lt;/code&gt; — same read-only, propose-only constraints as the interactive flow. The output is the same change-plan document, posted as a comment on the source ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd build next
&lt;/h2&gt;

&lt;p&gt;A few directions I'm exploring for v0.4 and beyond:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Confidence-weighted plans.&lt;/strong&gt; The aggregate confidence formula already lives in &lt;code&gt;skills/routing/SKILL.md&lt;/code&gt; — surface it more prominently so devs can sort risks by uncertainty, not just severity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph-aware deliberation.&lt;/strong&gt; Today the mailbox is fully connected. For 10+ repo workspaces, routing the mailbox along actual service-dependency edges would cut deliberation overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An execute mode behind an explicit consent prompt.&lt;/strong&gt; Still propose-by-default, but with a guarded path to apply the plan repo-by-repo with diff approval.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add the marketplace (one time)&lt;/span&gt;
/plugin marketplace add architonixlabs/RepoOrch

&lt;span class="c"&gt;# Install the plugin&lt;/span&gt;
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;repo-orchestrator@repo-orchestrator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;code&gt;/repo-orch-setup&lt;/code&gt; in any workspace that has 2+ git repos as immediate subdirectories.&lt;/p&gt;

&lt;p&gt;Source, issues, and discussions: &lt;a href="https://github.com/architonixlabs/RepoOrch" rel="noopener noreferrer"&gt;github.com/architonixlabs/RepoOrch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If RepoOrch saves you a single hour of multi-repo triage, a GitHub star is how I know to keep building. And if you try it and it breaks — file an issue, I'll respond. v0.3 just shipped a ten-fix security hardening pass; v0.4 is being shaped by feedback like yours.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>microservices</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
