<?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: Aviv Laufer</title>
    <description>The latest articles on DEV Community by Aviv Laufer (@avivl).</description>
    <link>https://dev.to/avivl</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%2F34647%2F9e6962c5-8187-44f5-a7da-a1bd4447cced.png</url>
      <title>DEV Community: Aviv Laufer</title>
      <link>https://dev.to/avivl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avivl"/>
    <language>en</language>
    <item>
      <title>I talk to one agent. It runs the others.</title>
      <dc:creator>Aviv Laufer</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:49:31 +0000</pubDate>
      <link>https://dev.to/avivl/i-talk-to-one-agent-it-runs-the-others-26k4</link>
      <guid>https://dev.to/avivl/i-talk-to-one-agent-it-runs-the-others-26k4</guid>
      <description>&lt;p&gt;&lt;em&gt;The map of my setup: OMP in the middle, the tools it dispatches, and the 13 parts coming next.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most of my coding day happens in one terminal pane. I type into OMP, and OMP does the rest.&lt;/p&gt;

&lt;p&gt;It picks a model for each job. Planning goes to Opus. Normal turns go to Sonnet. Reviews go to a GPT model, so the reviewer is never the same model that wrote the code. When the work is big, OMP hands it to a fleet: Firstmate spawns crew agents, each one in its own worktree, and most of the time the crew is working and I'm not.&lt;/p&gt;

&lt;p&gt;I use several coding agents, but I don't configure them separately. One repo decides which rules, skills, identities and models every agent gets, on every machine.&lt;/p&gt;

&lt;p&gt;That repo is my dotfiles. It started in December 2016 with a tmux and vim config. In the last three months, since agents took over my workflow, it got almost as many commits as in the nine years before.&lt;/p&gt;

&lt;p&gt;This post is the map: every tool, how they connect, what broke when I first wired them together, and the fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  The map
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         me
                          |
                          v
   +---------------------------------------------+
   |  OMP  (my main tool, one model per role)    |
   +---------------------------------------------+
            |                        |
            | talks to models        | fm &amp;lt;project&amp;gt;
            | directly               v
            |              +----------------------+
            |              |  Firstmate           |
            |              |  (first mate on OMP) |
            |              +----------------------+
            |                 |   dispatch rules
            v                 v
   Anthropic, Cursor,     crew: OMP, Claude Code,
   OpenAI, local model    Codex, Grok
                              |
                              v
                     treehouse worktrees
                     (one per task, pooled)

   herdr on the laptop, tmux on the VM: every agent gets a pane
   dotfiles: renders the config for all of the above
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs on two laptops and a cloud VM. My work laptop gets the company rules: our skills, our ticket conventions, our compliance rules. My personal laptop should not see any of that, and the two use different model accounts.&lt;/p&gt;

&lt;p&gt;I'll go through each box below. First, the part that went wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke
&lt;/h2&gt;

&lt;p&gt;OMP is where I type, but it is not the only agent that runs. Firstmate starts Claude Code, Codex or Grok as crew, and Cursor agent is there too. Each of these tools reads its instructions from a different place:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/CLAUDE.md
~/.codex/AGENTS.md
~/.pi/agent/AGENTS.md
~/.agents/AGENTS.md
~/.gemini/GEMINI.md
~/.config/opencode/AGENTS.md
~/.copilot/copilot-instructions.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seven files that should say the same thing. Skills have the same problem: each tool has its own skills folder.&lt;/p&gt;

&lt;p&gt;Agents read their instructions in every session, so when those instructions drift, the agents drift with them. Nothing warns you.&lt;/p&gt;

&lt;p&gt;Two things were wrong.&lt;/p&gt;

&lt;p&gt;First, the files had drifted. My &lt;code&gt;~/.codex/AGENTS.md&lt;/code&gt; was a copy I'd made by hand in May, and it was out of date. Pi, another agent I had installed, saw only 3 of my 23 skills. Each tool was working with a different set of rules, and I had assumed they were all the same.&lt;/p&gt;

&lt;p&gt;Second, the instructions were too long. The global file had grown to 465 lines, about 21 KB or 5,300 tokens. It loads on every turn, in Claude Code and each of its subagents, in OMP, Codex, Pi, Gemini, OpenCode and Copilot. So every one of those paid for all 465 lines, every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One source, compiled per machine
&lt;/h3&gt;

&lt;p&gt;I split the instructions into small fragments, one topic per file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agents/fragments/
  00-header.md
  05-no-emojis.md
  10-voice.md
  20-workflow.md
  30-git-conventions.md
  32-worktrees-stacking.md
  35-pull-requests.md
  45-core-principles.md
  ...
  50-work-skills.md     # work only
  55-compliance.md      # work only
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each machine profile is a plain list of the fragments it gets. The personal profile leaves out the work-only ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# agents/machines/personal.txt
00-header.md
05-no-emojis.md
20-workflow.md
35-pull-requests.md
32-worktrees-stacking.md
45-core-principles.md
30-git-conventions.md
40-languages.md
10-voice.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;make build&lt;/code&gt; puts them together into one flat &lt;code&gt;AGENTS.md&lt;/code&gt;, with a marker before each fragment so I can see where a rule came from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="err"&gt;while&lt;/span&gt; &lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; name&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="err"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"$name"&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="s1"&gt;'#'&lt;/span&gt;&lt;span class="err"&gt;*)&lt;/span&gt; &lt;span class="err"&gt;continue&lt;/span&gt; &lt;span class="err"&gt;;;&lt;/span&gt; &lt;span class="err"&gt;esac&lt;/span&gt;
  &lt;span class="nl"&gt;printf '&amp;lt;!-- Source&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;fragments/%s --&amp;gt;&lt;/span&gt;\n&lt;span class="nf"&gt;' "$name"&lt;/span&gt;
  &lt;span class="err"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"fragments/$name"&lt;/span&gt;
&lt;span class="err"&gt;done&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="err"&gt;machines/$(PROFILE).txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why flat and not includes? Codex, Pi and Cursor don't expand any include syntax. So the modular part lives in the source, and every tool gets one plain file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;make deploy&lt;/code&gt; then symlinks that one file into all seven paths. There are no copies left to go stale. When I edit a fragment and run &lt;code&gt;make build&lt;/code&gt;, every tool picks it up in its next session.&lt;/p&gt;

&lt;h3&gt;
  
  
  A check that blocks drift
&lt;/h3&gt;

&lt;p&gt;A pre-commit hook runs &lt;code&gt;make check&lt;/code&gt;. It builds again into a temp folder and diffs the result against the built file. If I edit a fragment and forget to build, the commit fails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;check: build/personal/AGENTS.md is out of date. Run: make -C agents build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  One skills folder
&lt;/h3&gt;

&lt;p&gt;Skills go in one place, &lt;code&gt;~/.agents/skills/&lt;/code&gt;. When I checked in July, Codex, Cursor, OpenCode, Gemini and Copilot all read that folder directly. Claude Code doesn't, so &lt;code&gt;make skills-sync&lt;/code&gt; adds a symlink per skill into &lt;code&gt;~/.claude/skills/&lt;/code&gt;. It does the same for Pi's own folder, which is where the 3-of-23 problem was.&lt;/p&gt;

&lt;p&gt;It never overwrites a real file. A skill installed some other way gets skipped with a warning, not deleted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I could cut it in half
&lt;/h2&gt;

&lt;p&gt;With one file, I could finally see everything in one place. So I cut it. 465 lines down to 215. About 5,300 tokens down to 2,500.&lt;/p&gt;

&lt;p&gt;The biggest cut was the pull request procedure. I moved it, as is, into a skill. It loads only when an agent works on a PR. The fragment kept only the hard rules: draft only, no merge and no deploy without my approval. The rest of the fragments I trimmed down to the rules, without the explanations.&lt;/p&gt;

&lt;p&gt;With seven copies, I never cut anything. I didn't know which copy was the real one, so I only added. With one source, cutting is safe.&lt;/p&gt;

&lt;p&gt;Now I split instructions into two kinds. Rules every agent needs on every turn go in the global file, and I keep it short. Procedures for one kind of task go in a skill. An agent renaming a variable doesn't need my PR procedure, and it shouldn't pay for it in tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the map
&lt;/h2&gt;

&lt;p&gt;With that in place, here is what each box in the diagram does.&lt;/p&gt;

&lt;h3&gt;
  
  
  OMP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/can1357/oh-my-pi" rel="noopener noreferrer"&gt;OMP&lt;/a&gt; (Oh My Pi) is a coding agent that talks to the model APIs directly. I log in to Anthropic, Cursor and OpenAI once, and OMP routes each kind of work to a model through roles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;modelRoles&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cursor/claude-sonnet-5-5:medium&lt;/span&gt;
  &lt;span class="na"&gt;plan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s"&gt;cursor/claude-opus-5-5:medium&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s"&gt;cursor/claude-sonnet-5-5:medium&lt;/span&gt;
  &lt;span class="na"&gt;slow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s"&gt;cursor/composer-2.5:high&lt;/span&gt;
  &lt;span class="na"&gt;smol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s"&gt;cursor/gpt-5.6-luna:medium&lt;/span&gt;
  &lt;span class="na"&gt;commit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;cursor/gpt-5.6-luna:low&lt;/span&gt;
  &lt;span class="na"&gt;tiny&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s"&gt;local/lfm2.5-230m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reviewer is set in a separate block of the same config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;agentModelOverrides&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;reviewer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cursor/gpt-5.6-terra:high&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's my personal laptop. It only has Claude and Cursor accounts, so almost everything goes through Cursor. The work laptop uses the same roles with different providers, and dotfiles picks the right ones per machine.&lt;/p&gt;

&lt;p&gt;Model names change every few months, so here is the current table. I'll keep it up to date. The pattern is what matters.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Current model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;td&gt;normal turns&lt;/td&gt;
&lt;td&gt;Claude Sonnet 5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;plan&lt;/td&gt;
&lt;td&gt;planning&lt;/td&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;task&lt;/td&gt;
&lt;td&gt;subagent work&lt;/td&gt;
&lt;td&gt;Claude Sonnet 5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;slow&lt;/td&gt;
&lt;td&gt;hard fixes&lt;/td&gt;
&lt;td&gt;Composer 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reviewer&lt;/td&gt;
&lt;td&gt;code review, different vendor than the author&lt;/td&gt;
&lt;td&gt;GPT-5.6 Terra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smol&lt;/td&gt;
&lt;td&gt;cheap fan-out&lt;/td&gt;
&lt;td&gt;GPT-5.6 Luna&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;commit&lt;/td&gt;
&lt;td&gt;commit messages&lt;/td&gt;
&lt;td&gt;GPT-5.6 Luna, low effort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tiny&lt;/td&gt;
&lt;td&gt;throwaway calls&lt;/td&gt;
&lt;td&gt;a 230M local model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;judge&lt;/td&gt;
&lt;td&gt;"is this actually done?"&lt;/td&gt;
&lt;td&gt;a small model on Cloudflare Workers AI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Firstmate
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/kunchenguid/firstmate" rel="noopener noreferrer"&gt;Firstmate&lt;/a&gt; runs a fleet of agents. I'm the captain. The first mate is an OMP session that takes my ask, writes a brief and starts crew agents to do the work. &lt;code&gt;fm &amp;lt;project&amp;gt;&lt;/code&gt; opens it for one project, and each project gets its own home, so backlogs and running tasks never mix.&lt;/p&gt;

&lt;p&gt;The crew is OMP by default, but a few dispatch rules send work to other tools:&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;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The task is a trivial mechanical edit: rote rename, formatting sweep, targeted typo fix, dependency bump, or gathering files."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"use"&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;"harness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"haiku"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&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="err"&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;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The task is a scout: investigate, audit, trace a bug, or produce a standalone report without changing code."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"use"&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;"harness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"omp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"effort"&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="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;My preferences for the first mate live in a markdown file it reads at the start of every session. A few lines from it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; Never use em dashes in PR titles, PR bodies, commit messages, or comments.
&lt;span class="p"&gt;-&lt;/span&gt; Every PR any worker opens is created in draft mode, no exceptions.
&lt;span class="p"&gt;-&lt;/span&gt; Escalate to me on any change touching auth, tenancy boundaries, data
  retention, or migration ordering, even when the tests are green.
&lt;span class="p"&gt;-&lt;/span&gt; Scout tasks end in a report, never a code change.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Worktrees: two tools on purpose
&lt;/h3&gt;

&lt;p&gt;When I start an agent myself, I use &lt;a href="https://github.com/max-sixty/worktrunk" rel="noopener noreferrer"&gt;worktrunk&lt;/a&gt; (&lt;code&gt;wt&lt;/code&gt;). One alias creates a branch, a worktree and an agent session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;worktree-path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"~/worktrees/{{ repo }}/{{ branch | sanitize }}"&lt;/span&gt;

&lt;span class="nn"&gt;[aliases]&lt;/span&gt;
&lt;span class="py"&gt;cc&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"wt switch --create {{ branch }} -x claude"&lt;/span&gt;
&lt;span class="py"&gt;cur&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"wt switch --create {{ branch }} -x wt-agent -- cursor-agent"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Firstmate starts a crew agent, it uses treehouse. Treehouse keeps a pool of worktrees per repo and leases one out per task (&lt;code&gt;treehouse get --lease&lt;/code&gt;, then &lt;code&gt;treehouse return&lt;/code&gt;). Two crew agents on the same repo get slot 1 and slot 2 and never collide. Most of the worktrees on my machine come from treehouse, because most of the time the crew is the one working.&lt;/p&gt;

&lt;h3&gt;
  
  
  herdr and tmux
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://herdr.dev" rel="noopener noreferrer"&gt;herdr&lt;/a&gt; is the terminal multiplexer on my laptops. Unlike tmux, it knows which pane is an agent and whether that agent is working, blocked, done or idle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[ui]&lt;/span&gt;
&lt;span class="py"&gt;agent_panel_sort&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"spaces"&lt;/span&gt;     &lt;span class="c"&gt;# one space per repo/worktree&lt;/span&gt;
&lt;span class="py"&gt;status_indicators&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"symbols"&lt;/span&gt;   &lt;span class="c"&gt;# blocked/working/done/idle&lt;/span&gt;
&lt;span class="py"&gt;show_agent_labels_on_pane_borders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With several crew agents running, &lt;code&gt;ctrl+alt+up&lt;/code&gt; and &lt;code&gt;ctrl+alt+down&lt;/code&gt; jump between them. On the cloud VM I use plain tmux, so agents keep running after I close the laptop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dotfiles
&lt;/h3&gt;

&lt;p&gt;Everything above is rendered from the dotfiles repo, in layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;base &amp;lt; os &amp;lt; organization &amp;lt; machine &amp;lt; local.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer only overrides the values it names. The work laptop declares the work organization and the personal one. The personal laptop declares only personal. A repo outside every declared root has no git identity at all, so a commit fails instead of going out under the wrong name.&lt;/p&gt;

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

&lt;p&gt;The companion repo has a small working version of the fragments build: four fragments (one of them work-only), two profiles, a pre-commit hook, and the Makefile with &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt; and &lt;code&gt;deploy&lt;/code&gt;. By default it deploys into a fake home folder, so it never touches your real config. When you point it at your real home, it skips any real file in the way instead of overwriting it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make deploy
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; fake-home/.codex   &lt;span class="c"&gt;# AGENTS.md -&amp;gt; .../build/personal/AGENTS.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/avivl/golem-notes-examples/tree/main/01-the-map" rel="noopener noreferrer"&gt;golem-notes-examples/01-the-map&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's coming
&lt;/h2&gt;

&lt;p&gt;One part every two weeks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The map&lt;/strong&gt; (this post)&lt;/li&gt;
&lt;li&gt;Close the laptop, the agent keeps working: agents on a cloud VM with tmux&lt;/li&gt;
&lt;li&gt;My agents on two laptops, controlled from one phone app&lt;/li&gt;
&lt;li&gt;Every PR gets an agent review before a human sees it&lt;/li&gt;
&lt;li&gt;Captain, first mate, crew: orchestrating a fleet of agents&lt;/li&gt;
&lt;li&gt;Nine roles, not one model&lt;/li&gt;
&lt;li&gt;Right model for the task: dispatch rules and cheaper subagents&lt;/li&gt;
&lt;li&gt;When the credits run out: fallback chains&lt;/li&gt;
&lt;li&gt;A cheap judge for "is this actually done?"&lt;/li&gt;
&lt;li&gt;Teaching agents how I work: my skills library&lt;/li&gt;
&lt;li&gt;Dotfiles an agent can't break&lt;/li&gt;
&lt;li&gt;One laptop, many companies: identities and secrets&lt;/li&gt;
&lt;li&gt;Testing your dotfiles like production code&lt;/li&gt;
&lt;li&gt;What I'd do differently&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you run more than one agent tool, I'd like to know how you keep their rules in sync. Leave a comment.&lt;/p&gt;




&lt;p&gt;This is part 1 of my series on running a real agentic dev setup. I publish each part first on Golem Notes, with the full write-up and what's coming next. Subscribe there to get the next one in your inbox: &lt;a href="https://golemnotes.substack.com/p/i-talk-to-one-agent-it-runs-the-others?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=agentic-setup-01" rel="noopener noreferrer"&gt;https://golemnotes.substack.com/p/i-talk-to-one-agent-it-runs-the-others?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=agentic-setup-01&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
      <category>dotfiles</category>
    </item>
  </channel>
</rss>
