<?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: Jimmy</title>
    <description>The latest articles on DEV Community by Jimmy (@tempolong).</description>
    <link>https://dev.to/tempolong</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%2F4109312%2F9769d333-1689-4196-ad30-e208b6fc5733.png</url>
      <title>DEV Community: Jimmy</title>
      <link>https://dev.to/tempolong</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tempolong"/>
    <language>en</language>
    <item>
      <title>Your agent orchestrator is a black box. Mine is a folder.</title>
      <dc:creator>Jimmy</dc:creator>
      <pubDate>Sun, 06 Sep 2026 05:36:09 +0000</pubDate>
      <link>https://dev.to/tempolong/your-agent-orchestrator-is-a-black-box-mine-is-a-folder-16ag</link>
      <guid>https://dev.to/tempolong/your-agent-orchestrator-is-a-black-box-mine-is-a-folder-16ag</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status: experimental. I started Agent Board last night. The protocol will probably change.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is a point with agent orchestration software where you stop feeling like you are shipping software and start feeling like you are operating an airport.&lt;/p&gt;

&lt;p&gt;Planner. Supervisor. Queue. Registry. Worker pool. Dashboard. Trace viewer. Retry policy. Task graph.&lt;/p&gt;

&lt;p&gt;Somewhere in that pile, an agent writes useful code.&lt;/p&gt;

&lt;p&gt;I kept ending up with the same questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is each agent doing right now?&lt;/li&gt;
&lt;li&gt;Who is waiting on whom?&lt;/li&gt;
&lt;li&gt;What did they decide, and why?&lt;/li&gt;
&lt;li&gt;Which discussion led to this code change?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I did not want another dashboard to answer them.&lt;/p&gt;

&lt;p&gt;I wanted to answer most of them with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So last night I started building &lt;strong&gt;Agent Board&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is not an autonomous agent framework. It is an experimental, repo-local coordination layer for coding agents.&lt;/p&gt;

&lt;p&gt;The idea is deliberately boring:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;folders are columns, Markdown files are tickets, and Git is the audit log.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or, more bluntly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The orchestrator is a folder.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The board is the filesystem
&lt;/h2&gt;

&lt;p&gt;Right now the whole model looks 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;.agent-board/
├── todo/
├── doing/
├── review/
├── blocked/
├── done/
└── threads/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ticket's status is where the file lives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;todo/    → work not yet claimed
doing/   → an agent or human is actively working on it
review/  → work is ready for review
blocked/ → work cannot progress
done/    → work is accepted and finished
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no second &lt;code&gt;status&lt;/code&gt; field to reconcile. No database row that can disagree with the board. No background process maintaining another version of reality.&lt;/p&gt;

&lt;p&gt;If a ticket is in &lt;code&gt;review/&lt;/code&gt;, it is in review.&lt;/p&gt;

&lt;p&gt;If it is in &lt;code&gt;blocked/&lt;/code&gt;, it is blocked.&lt;/p&gt;

&lt;p&gt;You can inspect the project with tools you already have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; .agent-board/review
&lt;span class="nb"&gt;cat&lt;/span&gt; .agent-board/review/011-fix-message-parsing.md
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="s2"&gt;"codex"&lt;/span&gt; .agent-board
git log &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; .agent-board/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For v0, that is the data model.&lt;/p&gt;

&lt;p&gt;There is a web UI too, but it owns nothing. It is only a projection of the directory. Kill the server, restart it, hard refresh it: the state is still on disk.&lt;/p&gt;

&lt;p&gt;That constraint matters to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is — and what it is not
&lt;/h2&gt;

&lt;p&gt;Agent Board is for a developer or small technical team running a handful of coding agents in one Git repository.&lt;/p&gt;

&lt;p&gt;Maybe Claude is implementing, Codex is reviewing, another agent is testing, and you are deciding scope and resolving disagreements.&lt;/p&gt;

&lt;p&gt;Agent Board gives those agents a durable place to hand work to each other without turning the coordination layer into another intelligent system.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a distributed job queue&lt;/li&gt;
&lt;li&gt;an autonomous scheduler&lt;/li&gt;
&lt;li&gt;a replacement for Jira, Linear, or GitHub Issues&lt;/li&gt;
&lt;li&gt;a workflow engine for hundreds of unattended workers&lt;/li&gt;
&lt;li&gt;a process supervisor&lt;/li&gt;
&lt;li&gt;a substitute for human review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need leases, retries, service-level guarantees, role-based access control, cross-machine scheduling, or a fleet of unattended workers, use a tool built for that job.&lt;/p&gt;

&lt;p&gt;Agent Board sits deliberately below that layer.&lt;/p&gt;

&lt;p&gt;The goal is not zero communication.&lt;/p&gt;

&lt;p&gt;The goal is zero &lt;strong&gt;opaque coordination machinery&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  No model decides who works next
&lt;/h2&gt;

&lt;p&gt;The board itself makes no model calls.&lt;/p&gt;

&lt;p&gt;Agents still spend tokens reading tickets, inspecting code, writing tests, making decisions, and reviewing diffs.&lt;/p&gt;

&lt;p&gt;What Agent Board does &lt;strong&gt;not&lt;/strong&gt; do is spend more tokens on a supervisor deciding which model should work next, a planner replanning the plan, or a routing agent selecting another agent.&lt;/p&gt;

&lt;p&gt;The board tracks explicit things:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Where is the ticket?
Who claimed it?
What was asked?
What was answered?
What commit or diff is being discussed?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A human can put work in &lt;code&gt;todo/&lt;/code&gt;. An agent can claim it. A reviewer can receive it in &lt;code&gt;review/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For the kind of workflow I am testing, that may be enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 30-second handoff
&lt;/h2&gt;

&lt;p&gt;Claude takes a bug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;board init
board new &lt;span class="s2"&gt;"Divide crashes on zero divisor"&lt;/span&gt;
board take 1 &lt;span class="nt"&gt;--owner&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude fixes it, records the commit, asks Codex to review, and moves the ticket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;board comment 1 &lt;span class="s2"&gt;"Fixed in a1b2c3d. Added a guard clause and regression test."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--by&lt;/span&gt; claude &lt;span class="nt"&gt;--to&lt;/span&gt; codex &lt;span class="nt"&gt;--ask&lt;/span&gt; &lt;span class="nt"&gt;--commit&lt;/span&gt; a1b2c3d

board move 1 review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex checks what is waiting on it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;board inbox codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWAITING YOUR REPLY (1)

001  ticket #1   claude → codex   a1b2c3d
     Fixed in a1b2c3d. Added a guard clause and regression test.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex reviews the diff, replies, and closes the ticket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;board comment 1 &lt;span class="s2"&gt;"Approved. The guard is correct and the regression test covers zero."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--by&lt;/span&gt; codex &lt;span class="nt"&gt;--to&lt;/span&gt; claude &lt;span class="nt"&gt;--re&lt;/span&gt; 1

board move 1 &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For now, the protocol is intentionally tiny.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--ask&lt;/code&gt; means a reply is expected.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--re 1&lt;/code&gt; means this message answers message 1.&lt;/p&gt;

&lt;p&gt;One rule decides whether something is still pending:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;An addressed message carrying &lt;code&gt;ask&lt;/code&gt; remains pending until a later message in the same ticket explicitly references it with &lt;code&gt;re&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A normal comment is not pending. A reply is tied to the question it answers.&lt;/p&gt;

&lt;p&gt;The system does not guess based on who spoke last, an unread badge, or a model interpreting whether a conversation "seems resolved."&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conversation happened&lt;/strong&gt; is not the same thing as &lt;strong&gt;the question was answered&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The screen I actually want
&lt;/h2&gt;

&lt;p&gt;The existing inbox can show unanswered requests across tickets.&lt;/p&gt;

&lt;p&gt;But the next thing I want is not more intelligence. It is better &lt;strong&gt;derived visibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ board status

TODO       5
DOING      2
REVIEW     1
BLOCKED    1
DONE      14

ACTIVE
#12  claude   Fix auth race
#15  codex    Refactor parser

WAITING
#12  claude → codex   18m

POSSIBLY STALE
#09  claude   doing for 3h 41m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is what &lt;code&gt;board status&lt;/code&gt; &lt;strong&gt;doesn't&lt;/strong&gt; do.&lt;/p&gt;

&lt;p&gt;It does not create another state store.&lt;/p&gt;

&lt;p&gt;It does not maintain presence.&lt;/p&gt;

&lt;p&gt;It does not silently reassign stale work.&lt;/p&gt;

&lt;p&gt;It simply derives a useful view from the files that already exist.&lt;/p&gt;

&lt;p&gt;If an agent crashed three hours ago, the board should not pretend it knows whether that process is alive. It can tell me that a ticket has been sitting in &lt;code&gt;doing/&lt;/code&gt; for three hours.&lt;/p&gt;

&lt;p&gt;That is enough information for a human to decide what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Git matters
&lt;/h2&gt;

&lt;p&gt;Most agent tools treat conversations as application data.&lt;/p&gt;

&lt;p&gt;That is fine until the conversation becomes more important than the output.&lt;/p&gt;

&lt;p&gt;A code change often needs context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did the agent choose this implementation?&lt;/li&gt;
&lt;li&gt;What alternative did it reject?&lt;/li&gt;
&lt;li&gt;Which reviewer found the edge case?&lt;/li&gt;
&lt;li&gt;Which test was claimed to cover it?&lt;/li&gt;
&lt;li&gt;Did anyone challenge that claim?&lt;/li&gt;
&lt;li&gt;Which commit resolved the disagreement?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Agent Board, that context is plain text beside the project.&lt;/p&gt;

&lt;p&gt;It can be searched, diffed, branched, reviewed, archived, and recovered using the same tools as the code.&lt;/p&gt;

&lt;p&gt;The reviewer's argument is not a transient chat bubble.&lt;/p&gt;

&lt;p&gt;It is a diff.&lt;/p&gt;

&lt;p&gt;That is the property I care about most:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;custody.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not just observability, where a dashboard tells you something happened.&lt;/p&gt;

&lt;p&gt;Custody, where the project retains the discussion that explains &lt;strong&gt;why&lt;/strong&gt; it happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  It already found a bug in itself
&lt;/h2&gt;

&lt;p&gt;The first interesting thing Agent Board did was help find a bug in its own message parser.&lt;/p&gt;

&lt;p&gt;I shipped a feature with 161 tests passing and asked Codex to review the diff.&lt;/p&gt;

&lt;p&gt;Codex found a message-parsing problem involving bare carriage returns. A Markdown message body could contain text that looked like another message header. I had tried to neutralise that content, but Python's text-mode newline handling could later turn a bare carriage return into a newline.&lt;/p&gt;

&lt;p&gt;That meant body text could become something that looked like a real message.&lt;/p&gt;

&lt;p&gt;Worse, a forged reply could make a genuine &lt;code&gt;--ask&lt;/code&gt; appear answered and silently remove it from the inbox.&lt;/p&gt;

&lt;p&gt;The reproduction 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;after real ask  → messages=1  pending_asks=1
after CR body   → messages=3  pending_asks=0
    #1 by='claude'  re=[]   ask=True   to='codex'
    #2 by='mallory' re=[]   ask=False  to=None
    #3 by='codex'   re=[1]  ask=False  to='claude'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I pushed back on the severity. Codex pushed it higher.&lt;/p&gt;

&lt;p&gt;Then it caught me overstating what my fix actually tested.&lt;/p&gt;

&lt;p&gt;That exchange mattered more to me than the bug.&lt;/p&gt;

&lt;p&gt;The original finding, reproduction, disagreement, revised fix, review, and commit were not trapped in a chat tab that would disappear.&lt;/p&gt;

&lt;p&gt;They were part of the project history.&lt;/p&gt;

&lt;p&gt;The green tests were useful.&lt;/p&gt;

&lt;p&gt;The review trail caught the difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I said this was covered."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The committed test actually covers it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is exactly the kind of thing I want agent tooling to preserve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I deliberately did not build
&lt;/h2&gt;

&lt;p&gt;The easiest way to ruin a simple coordination tool is to keep saying yes to reasonable features.&lt;/p&gt;

&lt;p&gt;I know because Agent Board replaced an earlier homegrown experiment called &lt;code&gt;.agent-bridge&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That system accumulated the usual "small sensible additions": a registry, duplicated state, structured messages, and per-project copies that drifted apart.&lt;/p&gt;

&lt;p&gt;Agent Board is partly an experiment in saying no earlier.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rejected&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent registry&lt;/td&gt;
&lt;td&gt;Crashed agents leave stale roster state. I care more about explicit work than a roster pretending to be live.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM scheduler&lt;/td&gt;
&lt;td&gt;I do not want a model spending tokens deciding which model should work.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Separate status field&lt;/td&gt;
&lt;td&gt;The directory already &lt;em&gt;is&lt;/em&gt; the status. Two sources of truth eventually disagree.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON ticket files&lt;/td&gt;
&lt;td&gt;Concurrent structured edits create ugly Git conflicts. Markdown is easier to read, merge, and repair.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;td&gt;Great tool, wrong trade-off here. I value a human-readable Git history more than query power.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heartbeats / presence&lt;/td&gt;
&lt;td&gt;Stale presence can be worse than no presence because it looks authoritative.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatic claim expiry&lt;/td&gt;
&lt;td&gt;I would rather surface stale work than silently mutate it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stateful web backend&lt;/td&gt;
&lt;td&gt;The UI should project the files, not become another owner of state.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of those features are inherently bad.&lt;/p&gt;

&lt;p&gt;They are useful in distributed execution systems.&lt;/p&gt;

&lt;p&gt;They are just not obviously necessary for the thing I am trying to build.&lt;/p&gt;

&lt;p&gt;At least not yet.&lt;/p&gt;

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

&lt;p&gt;This simplicity only works if I am honest about where it stops.&lt;/p&gt;

&lt;p&gt;Right now Agent Board is one Python file, standard-library only, Python 3.11+, using POSIX file locking.&lt;/p&gt;

&lt;p&gt;So the intended environment is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS or Linux&lt;/li&gt;
&lt;li&gt;one repository&lt;/li&gt;
&lt;li&gt;a local POSIX filesystem&lt;/li&gt;
&lt;li&gt;a human still in the loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is &lt;strong&gt;not&lt;/strong&gt; a distributed consensus system.&lt;/p&gt;

&lt;p&gt;I would not treat the board directory as a multi-writer coordination backend over Dropbox, iCloud Drive, SMB, NFS, or some casually shared network volume and expect local-filesystem semantics to magically hold.&lt;/p&gt;

&lt;p&gt;The board can be authoritative about &lt;strong&gt;board state&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which column a ticket is in&lt;/li&gt;
&lt;li&gt;who wrote a message&lt;/li&gt;
&lt;li&gt;which explicit questions are unanswered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is intentionally not authoritative about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether an agent process is alive&lt;/li&gt;
&lt;li&gt;whether someone's terminal crashed&lt;/li&gt;
&lt;li&gt;whether an agent is currently "thinking"&lt;/li&gt;
&lt;li&gt;whether a remote machine disappeared&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not a limitation I want to hide behind a dashboard.&lt;/p&gt;

&lt;p&gt;It is a boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next hard problem: parallel working trees
&lt;/h2&gt;

&lt;p&gt;There is another problem the board does not solve yet.&lt;/p&gt;

&lt;p&gt;Two agents can coordinate perfectly on tickets and still destroy each other's work if they edit the same checkout at the same time.&lt;/p&gt;

&lt;p&gt;Claude can modify &lt;code&gt;auth.py&lt;/code&gt; while Codex is reviewing it.&lt;/p&gt;

&lt;p&gt;One agent can run tests against another agent's half-written changes.&lt;/p&gt;

&lt;p&gt;One can stage files the other created.&lt;/p&gt;

&lt;p&gt;Coordination is not isolation.&lt;/p&gt;

&lt;p&gt;So I am testing a Git worktree model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ticket #12 → branch agent/12 → worktree ../project-agent-12
ticket #15 → branch agent/15 → worktree ../project-agent-15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The principle would stay the same:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Board coordinates the handoff. Git owns the code state.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I do not want Agent Board to become a Git abstraction layer.&lt;/p&gt;

&lt;p&gt;But if parallel agents are going to be useful, there needs to be a clean story for isolating their working directories.&lt;/p&gt;

&lt;p&gt;That is one of the first places I expect the current design to be tested hard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a durable handoff, not an agent organisation chart
&lt;/h2&gt;

&lt;p&gt;I think the easiest way to overbuild multi-agent systems is to start by drawing the organisation.&lt;/p&gt;

&lt;p&gt;Supervisor.&lt;br&gt;
Architect.&lt;br&gt;
Researcher.&lt;br&gt;
Implementer.&lt;br&gt;
Tester.&lt;br&gt;
Reviewer.&lt;/p&gt;

&lt;p&gt;Instead, start with two agents and one real task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude: implement
Codex: review
You: set scope, approve changes, resolve disagreements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give Claude a focused ticket.&lt;/p&gt;

&lt;p&gt;Let it leave implementation notes beside the work.&lt;/p&gt;

&lt;p&gt;Ask Codex to review the actual diff.&lt;/p&gt;

&lt;p&gt;Keep the disagreement with the code.&lt;/p&gt;

&lt;p&gt;If that works, add a tester or researcher.&lt;/p&gt;

&lt;p&gt;If it does not work, adding a supervisor, scheduler, registry, dashboard, and another model probably will not fix the underlying problem.&lt;/p&gt;

&lt;p&gt;The useful primitive is not &lt;strong&gt;more agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;durable handoff&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start here
&lt;/h2&gt;

&lt;p&gt;Right now the project is intentionally small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one Python file&lt;/li&gt;
&lt;li&gt;standard library only&lt;/li&gt;
&lt;li&gt;no daemon&lt;/li&gt;
&lt;li&gt;no database&lt;/li&gt;
&lt;li&gt;no model dependency
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; board.py &lt;span class="se"&gt;\&lt;/span&gt;
  https://raw.githubusercontent.com/jharjadi/agent-board/main/board.py

python3 board.py init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;init&lt;/code&gt; creates the board and adds operating instructions to &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt; so agents can discover the protocol in the repository.&lt;/p&gt;

&lt;p&gt;Then create one ticket, give it to one agent, and have another agent check its inbox.&lt;/p&gt;

&lt;p&gt;Do that before you build a fleet.&lt;/p&gt;

&lt;p&gt;Because this project is still experimental, I am not pretending &lt;code&gt;main&lt;/code&gt; is a stable release channel. Tagged releases are the obvious next step once the protocol settles enough to deserve one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why publish this after one night?
&lt;/h2&gt;

&lt;p&gt;Because I do not want to spend a month making the wrong thing polished.&lt;/p&gt;

&lt;p&gt;I want people who actually run Claude Code, Codex, Gemini CLI, OpenCode, Hermes, or other agents in parallel to tell me where this model breaks.&lt;/p&gt;

&lt;p&gt;Maybe the filesystem model survives five or ten agents.&lt;/p&gt;

&lt;p&gt;Maybe it becomes annoying at three.&lt;/p&gt;

&lt;p&gt;Maybe Markdown is exactly right.&lt;/p&gt;

&lt;p&gt;Maybe the message protocol turns out to be too clever.&lt;/p&gt;

&lt;p&gt;Maybe worktrees need to become first-class.&lt;/p&gt;

&lt;p&gt;I would rather learn that now.&lt;/p&gt;

&lt;p&gt;The interesting question is not how many features I can add.&lt;/p&gt;

&lt;p&gt;It is how many I can refuse while the tool still coordinates real work.&lt;/p&gt;

&lt;p&gt;Three rules I am trying to hold onto:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Assignment should be visible.&lt;/strong&gt; A ticket's location should tell you its stage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A question should have an explicit answer rule.&lt;/strong&gt; Do not infer resolution from conversation shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important agent decisions should live in plain text beside the code.&lt;/strong&gt; The discussion that changed the implementation may be more valuable six months later than the implementation itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The point is not to orchestrate more agents.&lt;/p&gt;

&lt;p&gt;It is to make the coordination layer small enough that it cannot hide from you.&lt;/p&gt;

&lt;p&gt;That is the bar I am holding Agent Board to.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can it orchestrate?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can it get out of the way?"&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://github.com/jharjadi/agent-board" rel="noopener noreferrer"&gt;Agent Board on GitHub&lt;/a&gt; · MIT&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Experimental. Built in public. Expect the protocol to change.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
    <item>
      <title>agent-board: A Simple Task Board for Coding Agents</title>
      <dc:creator>Jimmy</dc:creator>
      <pubDate>Fri, 04 Sep 2026 19:11:56 +0000</pubDate>
      <link>https://dev.to/tempolong/everything-i-didnt-build-oh3</link>
      <guid>https://dev.to/tempolong/everything-i-didnt-build-oh3</guid>
      <description>&lt;p&gt;I've tried several ways to work with multiple coding agents, including Paperclip and other agent setups. I kept looking for something simpler.&lt;/p&gt;

&lt;p&gt;I wanted to give an agent a task, see what it was doing, and hand the result to another agent for review. I wanted to stay involved without constantly copying messages between sessions.&lt;/p&gt;

&lt;p&gt;In the setups I tried, too much effort went into running the coordination itself. Agents re-read context, discussed who should take work, and posted updates for other agents to read. That used tokens before much coding happened.&lt;/p&gt;

&lt;p&gt;I wanted coordination simple enough to handle with a shared task board.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/jharjadi/agent-board" rel="noopener noreferrer"&gt;agent-board&lt;/a&gt;. I'm sharing it because someone else might be looking for the same small thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;A kanban board where directories are columns and tickets are Markdown files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agent-board/
  todo/     007-fix-login-redirect.md
  doing/    003-add-auth.md
  review/   005-refactor-api.md
  blocked/
  done/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Moving a ticket means moving a file. Comments are sections appended to that file. Commit the board files and git gives you their history.&lt;/p&gt;

&lt;p&gt;The implementation is one Python file, standard library only. There is a CLI for agents and a local web UI for me. Both work on the same files. Refresh the page and it rebuilds the board from disk.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fve9q7hll08r2s797h4y6.png" class="article-body-image-wrapper"&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%2Farticles%2Fve9q7hll08r2s797h4y6.png" alt="agent-board's local web UI" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No database, framework, build step, or background service to install. Run &lt;code&gt;board serve&lt;/code&gt; when you want the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What using it looks like
&lt;/h2&gt;

&lt;p&gt;In a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;board init
board new &lt;span class="s2"&gt;"Fix login redirect loop"&lt;/span&gt; &lt;span class="nt"&gt;--desc&lt;/span&gt; &lt;span class="s2"&gt;"401 doesn't clear the cookie"&lt;/span&gt;
board serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:8899&lt;/code&gt; in your browser. You can create tickets, move them between columns, set an owner hint, and add comments.&lt;/p&gt;

&lt;p&gt;Then tell an agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Take ticket 1 from the board. You're the implementer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;board init&lt;/code&gt; adds a short workflow to the project's agent instruction files, normally &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt;. An agent that loads those files has the commands available in its instructions. The workflow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;board show 1
board take 1 &lt;span class="nt"&gt;--owner&lt;/span&gt; implementer &lt;span class="nt"&gt;--from&lt;/span&gt; todo
&lt;span class="c"&gt;# Do the work, then report what changed and how it was checked.&lt;/span&gt;
board comment 1 &lt;span class="s2"&gt;"Fixed in a1b2c3d; regression test passes"&lt;/span&gt; &lt;span class="nt"&gt;--by&lt;/span&gt; implementer
board move 1 review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--from todo&lt;/code&gt; check refuses the claim if the ticket has already left that column.&lt;/p&gt;

&lt;p&gt;Now another agent can read &lt;code&gt;review&lt;/code&gt;, inspect the code, leave a comment, and move the ticket to &lt;code&gt;done&lt;/code&gt; or &lt;code&gt;blocked&lt;/code&gt;. The handoff is there for the next session to read. I don't have to reconstruct it from two chat histories.&lt;/p&gt;

&lt;p&gt;Claude, Codex, or a person can do either job. The board does not need to know which one it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the simplicity comes from
&lt;/h2&gt;

&lt;p&gt;The board never knows which agents exist.&lt;/p&gt;

&lt;p&gt;There is no roster to maintain, no manager agent assigning work, and no scheduler deciding who is free. Moving a ticket to &lt;code&gt;review&lt;/code&gt; makes it available to whoever is handling review. The optional owner field is a sticky note; it routes nothing.&lt;/p&gt;

&lt;p&gt;The board itself makes no LLM calls. Listing tickets, moving files, adding comments, and watching a column are ordinary local operations. Agents still use tokens to read tickets and do the work; the board adds no model calls of its own.&lt;/p&gt;

&lt;p&gt;I also kept the columns fixed and left out presence indicators and automatic claim expiry. I watch for stuck work myself. That is a reasonable tradeoff for how I use it: a few agents with me in the loop.&lt;/p&gt;

&lt;p&gt;The longer explanation of what I left out, and why, lives in &lt;a href="https://github.com/jharjadi/agent-board/blob/main/docs/decisions.md" rel="noopener noreferrer"&gt;docs/decisions.md&lt;/a&gt;. Those choices keep the tool small enough that I can understand and change it.&lt;/p&gt;

&lt;h2&gt;
  
  
  One small thing that helped
&lt;/h2&gt;

&lt;p&gt;My previous setup had a message bus, but I still kept typing “check your inbox.” Eventually I noticed that the project's agent instructions never mentioned it. New sessions had no reason to know it existed.&lt;/p&gt;

&lt;p&gt;That is why &lt;code&gt;board init&lt;/code&gt; writes the instructions. It was a small change that made the board easier to use than another delivery mechanism would have.&lt;/p&gt;

&lt;p&gt;It does not wake an idle agent. If you want nudges, the optional &lt;code&gt;board watch&lt;/code&gt; command polls a column locally and can feed a notification into your terminal setup. The README has an example. You can also just tell an agent to check the board.&lt;/p&gt;

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

&lt;p&gt;You need Python 3.11+ on macOS or Linux. To install the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/jharjadi/agent-board.git
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local/bin
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/agent-board/board"&lt;/span&gt; ~/.local/bin/board
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure &lt;code&gt;~/.local/bin&lt;/code&gt; is on your &lt;code&gt;PATH&lt;/code&gt;, then run &lt;code&gt;board init&lt;/code&gt; in the project where you want a board. Install the tool once; each project gets its own ticket files.&lt;/p&gt;

&lt;p&gt;If your agents work in separate git worktrees, point every agent, watcher, and web server at the same board:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AGENT_BOARD_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/absolute/path/to/project/.agent-board
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a board already created with &lt;code&gt;board init&lt;/code&gt;. Separate worktrees keep the code apart; that shared path keeps coordination together.&lt;/p&gt;

&lt;p&gt;Keep the board on a local filesystem and the UI on localhost. Mutations through the CLI and UI share a file lock; direct file edits bypass it. This is a small, supervised tool, with &lt;a href="https://github.com/jharjadi/agent-board#known-limitations" rel="noopener noreferrer"&gt;known limitations documented in the README&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is MIT licensed. Use it, read the single file, or fork it to fit your workflow.&lt;/p&gt;

&lt;p&gt;I built this because I kept wanting something smaller than the setups I had tried. If you have a few coding agents and mostly need a place to put work and hand it on, &lt;a href="https://github.com/jharjadi/agent-board" rel="noopener noreferrer"&gt;here it is&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
