<?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: joinwell52</title>
    <description>The latest articles on DEV Community by joinwell52 (@joinwell52).</description>
    <link>https://dev.to/joinwell52</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%2F3887527%2F91d464ef-6356-4c9c-9376-c76a59fc6537.png</url>
      <title>DEV Community: joinwell52</title>
      <link>https://dev.to/joinwell52</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joinwell52"/>
    <language>en</language>
    <item>
      <title>When AI Organizes Its Own Work: A field study of multi-agent coordination built on nothing but a filesystem (FCoP report)</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Sun, 19 Apr 2026 16:09:35 +0000</pubDate>
      <link>https://dev.to/joinwell52/we-replaced-our-multi-agent-middleware-with-a-folder-48-hours-later-the-ai-invented-6-42a9</link>
      <guid>https://dev.to/joinwell52/we-replaced-our-multi-agent-middleware-with-a-folder-48-hours-later-the-ai-invented-6-42a9</guid>
      <description>&lt;h1&gt;
  
  
  When AI Organizes Its Own Work
&lt;/h1&gt;

&lt;h3&gt;
  
  
  A field study of multi-agent coordination built on nothing but a filesystem · A report on &lt;strong&gt;FCoP&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;When AI Organizes Its Own Work: what happened after we replaced our multi-agent middleware with a folder.A report on &lt;strong&gt;FCoP — File-based Coordination Protocol&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Core innovation&lt;/strong&gt;: &lt;strong&gt;Filename as Protocol&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authors&lt;/strong&gt;: The CodeFlow Team · 2026-04-19*&lt;em&gt;Keywords&lt;/em&gt;*: Multi-agent, File-based protocol, Emergent coordination, FCoP, Human-Machine Isomorphism, Unix philosophy&lt;/p&gt;




&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;We gave a small team of AI agents (four roles, one human admin) a 76-line Markdown rulebook, a shared folder, and almost nothing else. No message queue. No database. No WebSocket between agents. The "coordination runtime" is a Python loop that clicks Cursor's tabs every few seconds just to wake each agent up — it does not route, schedule, or arbitrate anything.&lt;/p&gt;

&lt;p&gt;Within &lt;strong&gt;48 hours of first boot&lt;/strong&gt; on a freshly-installed PC, the agents produced 42 tasks, 22 reports, and 10 spontaneous "shared" documents (≈ 74 files total). More interestingly, they &lt;strong&gt;invented six coordination patterns we had not specified&lt;/strong&gt;: broadcast addressing, anonymous role slots, subtask sub-folders, self-explaining READMEs, traceability fields, and a whole class of standing "dashboard / sprint / glossary" documents. None of these caused collisions. All of them were discoverable by simply listing a directory.&lt;/p&gt;

&lt;p&gt;We call this protocol &lt;strong&gt;FCoP — File-based Coordination Protocol&lt;/strong&gt;. Its single core innovation is a slogan: &lt;strong&gt;"Filename as Protocol."&lt;/strong&gt; Directory name is &lt;em&gt;status&lt;/em&gt;, filename is &lt;em&gt;routing&lt;/em&gt;, file content is &lt;em&gt;payload&lt;/em&gt;. Nothing else. The same physical folder is simultaneously a rigorous state machine for agents and a browsable directory tree for humans — a property we call &lt;strong&gt;Human-Machine Isomorphism&lt;/strong&gt;. This asymmetric-yet-symmetric design is what kills the "black box anxiety" that plagues every other multi-agent stack.&lt;/p&gt;

&lt;p&gt;This essay documents what those agents did, why a filesystem-only protocol survives it gracefully, and what that implies for anyone building multi-agent systems today. It is not a product announcement — it is a field report, and an invitation to steal the idea.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR · What FCoP Is in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FCoP = File-based Coordination Protocol&lt;/strong&gt; — a minimalist protocol that lets multiple AI agents collaborate through a &lt;strong&gt;shared filesystem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One sentence&lt;/strong&gt;: &lt;em&gt;Filename as Protocol.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it looks like&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/agents/
├── tasks/     ← pending tasks
├── reports/   ← completion reports
├── issues/    ← issues
├── shared/    ← standing docs (dashboards, glossary, …)
└── log/       ← archives
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Routing lives in the filename&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-{date}-{seq}-{sender}-to-{recipient}.md
    e.g. TASK-20260418-201-MARKETER-to-DEV.md
         ↑ kind  ↑ date     ↑ seq ↑ sender  ↑ recipient
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Every agent just runs &lt;code&gt;glob "*-to-{my-role}*.md"&lt;/code&gt; to fetch its inbox. The recipient slot supports four forms:&lt;code&gt;to-DEV&lt;/code&gt; (direct), &lt;code&gt;to-TEAM&lt;/code&gt; (broadcast), &lt;code&gt;to-DEV.D1&lt;/code&gt; (named slot), &lt;code&gt;to-assignee.D1&lt;/code&gt; (anonymous slot).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What FCoP does NOT need&lt;/strong&gt;:Database, message queue, orchestration engine, custom client, SDK, persistent connections — &lt;strong&gt;none of them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it DOES need&lt;/strong&gt;:One shared directory, one naming convention, and every agent taking ownership of its role. &lt;strong&gt;That's all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human-Machine Isomorphism&lt;/strong&gt;: humans and agents read &lt;strong&gt;the same files&lt;/strong&gt;. A bare &lt;code&gt;ls&lt;/code&gt; tells you what the system is doing — no debugger required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity determines path&lt;/strong&gt;: roles are written into filenames. An agent physically cannot read or write outside its own mailbox. Structure gives order; content is wide open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol can evolve&lt;/strong&gt;: we observed 6 new coordination patterns self-invented by AI within 48 hours — all compatible with the existing protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero infrastructure&lt;/strong&gt;: git is the audit log, rsync is cross-machine sync, Finder / File Explorer is the debug panel — everything is off-the-shelf.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Want more?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;60-second companion: &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/primer/fcop-primer.en.md" rel="noopener noreferrer"&gt;FCoP primer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The spec itself (~160 lines): &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/spec/codeflow-core.mdc" rel="noopener noreferrer"&gt;&lt;code&gt;codeflow-core.mdc&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FCoP repository&lt;/strong&gt;: &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;github.com/joinwell52-AI/FCoP&lt;/a&gt; — star if you want more field reports like this&lt;/li&gt;
&lt;li&gt;Reference implementation (the Cursor-side coordinator that runs FCoP): &lt;a href="https://github.com/joinwell52-AI/codeflow-pwa" rel="noopener noreferrer"&gt;github.com/joinwell52-AI/codeflow-pwa&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;This essay: keep scrolling ↓&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note on samples&lt;/strong&gt;: Every agent-generated snippet quoted in this essay is &lt;strong&gt;verbatim&lt;/strong&gt; — the filenames, directory layout, frontmatter, tables, and acceptance language are all exactly what the agents wrote at the time. The data domains shown (Chinese automotive OEMs, public NetEase Cloud Music songs) are already public information; nothing has been abstracted. &lt;strong&gt;What we did NOT do&lt;/strong&gt; is publish the whole &lt;code&gt;codeflow-1&lt;/code&gt; sample directory — that project is ongoing, and its internal tooling code, room keys, and device IDs are not suitable for a full public drop. What readers actually want — "what did AI invent?" — is covered in full through representative snippets in §5.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. An Almost Absurd Hypothesis
&lt;/h2&gt;

&lt;p&gt;In 2026, the mainstream multi-agent stack looks like this: Agents × N → Message Bus × 1 → State Store × 1 → Orchestrator × 1 → Observability × 1. At minimum, five SaaS products, two SDKs, and a pager rotation.&lt;/p&gt;

&lt;p&gt;We wanted to ask a simpler question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What happens if we collapse the agent-to-agent protocol down to just the filesystem?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No queues, no databases, no webhooks. &lt;strong&gt;Agents can only talk to each other by writing and reading files in a directory.&lt;/strong&gt; As dumb, as crude, as un-modern as 1970s Unix pipes.&lt;/p&gt;

&lt;p&gt;The hypothesis wasn't about nostalgia. It was about answering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a team of agents with no central dispatcher evolve a coordination structure on its own?&lt;/li&gt;
&lt;li&gt;Can that structure be understood by a human at a glance?&lt;/li&gt;
&lt;li&gt;When an agent invents a pattern the protocol designer never wrote down — &lt;strong&gt;is that a bug or a feature?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We built a minimal-viable implementation called &lt;strong&gt;CodeFlow&lt;/strong&gt;, wrote a 76-line Markdown spec called &lt;strong&gt;FCoP&lt;/strong&gt; (&lt;strong&gt;F&lt;/strong&gt;ile-based &lt;strong&gt;Co&lt;/strong&gt;ordination &lt;strong&gt;P&lt;/strong&gt;rotocol), and ran it on a &lt;strong&gt;freshly-installed, still-warm&lt;/strong&gt; PC. &lt;strong&gt;Within 48 hours&lt;/strong&gt;, it surprised us.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Starting Point: A 76-Line Spec
&lt;/h2&gt;

&lt;p&gt;The initial spec was almost too simple to bother writing down. Three things at the core:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① Shared directory layout&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/agents/
├── tasks/     ← task files
├── reports/   ← completion reports
├── issues/    ← issue logs
└── log/       ← archives
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;② Filename as Protocol&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-{date}-{seq}-{sender}-to-{recipient}.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is the &lt;strong&gt;single core innovation&lt;/strong&gt; of FCoP — every other rule is a derivative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Directory name = Status&lt;/strong&gt;: is the file in &lt;code&gt;tasks/&lt;/code&gt; or &lt;code&gt;reports/&lt;/code&gt;? Its state is self-evident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filename = Routing&lt;/strong&gt;: sender, recipient, kind, and sequence are all written into the name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File content = Payload&lt;/strong&gt;: Markdown body plus YAML frontmatter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How does a recipient find its inbox? A single &lt;code&gt;glob "*-to-{my-role}*.md"&lt;/code&gt;. No header parsing, no database query — &lt;strong&gt;the filename itself is a complete addressable surface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;③ YAML frontmatter&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
protocol: agent_bridge
version: 1
kind: task
sender: PM
recipient: DEV
task_id: TASK-20260418-001
priority: P1
---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Plus five collaboration manners: only handle tasks addressed to you, always write a report on completion, log issues as issue files, don't touch other people's files, leave archiving to the coordinator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's the whole protocol.&lt;/strong&gt; No state machine, no schema, no transactions. The core condenses down to one line: &lt;strong&gt;Filename as Protocol&lt;/strong&gt;. Everything you're about to read — the "inventions" AI made — all grew out of this one rule.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Patrol Engine's Secret: It Does Almost Nothing
&lt;/h2&gt;

&lt;p&gt;The most common misconception about CodeFlow is that its &lt;strong&gt;Patrol Engine&lt;/strong&gt; is a central dispatcher. The truth is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The patrol engine just clicks a Cursor tab every few seconds via Chrome DevTools Protocol — so the agent inside wakes up and checks its own inbox.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;It does not route messages, judge priorities, validate schemas, manage transactions, or enforce order.&lt;/p&gt;

&lt;p&gt;Why so minimal? Because &lt;strong&gt;Cursor has no native agent-to-agent channel&lt;/strong&gt;. Each agent lives inside one chat session, deaf to the others. What the patrol engine does is closer to "knock on each door in turn":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"DEV, wake up — check if any new tasks landed in the &lt;code&gt;tasks/&lt;/code&gt; folder for you."&lt;/li&gt;
&lt;li&gt;"QA, wake up — anything in &lt;code&gt;reports/&lt;/code&gt; you need to regress?"&lt;/li&gt;
&lt;li&gt;"MARKETER, your turn — read what's new in &lt;code&gt;docs/agents/&lt;/code&gt;."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real coordination logic lives &lt;strong&gt;entirely&lt;/strong&gt; in the moment each agent reads, writes, and names files. The patrol engine is just the mechanism that ensures each agent "wakes up periodically."&lt;/p&gt;

&lt;p&gt;In other words: &lt;strong&gt;the platform does the least possible, and hands the protocol layer over to the agents themselves.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Field: &lt;code&gt;codeflow-1&lt;/code&gt;, 48 Hours
&lt;/h2&gt;

&lt;p&gt;On 2026-04-16 we finished installing the OS and syncing the toolchain. On 2026-04-17 we started giving the agents real work. Two days later — as I'm writing this — the team has already produced everything listed above.&lt;/p&gt;

&lt;p&gt;The experimental project is called &lt;code&gt;codeflow-1&lt;/code&gt;. Its team configuration is a "small content studio":&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;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MARKETER&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coordinator / PM / dispatcher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RESEARCHER&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Research and assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DESIGNER&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual design and storyboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BUILDER&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Engineering and scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ADMIN&lt;/strong&gt; (human)&lt;/td&gt;
&lt;td&gt;Specifies requirements, makes calls, signs off&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No DEV, no QA, no OPS — even the role names are project-specific. The spec never says a word about what MARKETER should &lt;em&gt;do&lt;/em&gt;; it just knows its name is MARKETER, and its inbox is &lt;code&gt;*-to-MARKETER*.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two days in, &lt;code&gt;docs/agents/&lt;/code&gt; really looks like this (excerpt; headline numbers: 42 tasks + 22 reports + 10 standing documents):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/agents/
├── BUILDER.md  DESIGNER.md  MARKETER.md  RESEARCHER.md    ← role manuals
├── codeflow.json                                           ← team config
├── CURRENT-SPRINT-STATUS.md                                ← AI-invented
├── DASHBOARD-20260418.md                                   ← AI-invented
├── tasks/
│   ├── RULES-task-file-format.md                           ← AI-invented
│   ├── SPRINT-20260418-delivery-push.md                    ← AI-invented
│   ├── TERM-20260418-assignment-matrix.md                  ← AI-invented
│   ├── TASK-20260418-001-ADMIN-to-MARKETER.md
│   ├── TASK-20260418-007-MARKETER-team-bulk-data.md        ← AI-invented "team" broadcast
│   ├── TASK-20260418-022-MARKETER-self-ADMIN018.md         ← AI-invented "self" note
│   ├── …26 top-level tasks total…
│   └── individual/                                         ← AI-opened subdirectory
│       ├── README.md
│       ├── INDIVIDUAL-TASK-INDEX.md
│       ├── TASK-20260418-201-MARKETER-to-assignee-D1.md    ← AI-invented "assignee slot"
│       ├── TASK-20260418-202-…-D2.md
│       ├── …11 individual tasks total…
│       └── TASK-20260418-211-MARKETER-to-assignee-P1.md
├── reports/   …matching reports…
├── issues/    log/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Everything marked &lt;code&gt;← AI-invented&lt;/code&gt; was &lt;strong&gt;nowhere in the original 76-line spec&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's look at what it invented.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Six Coordination Patterns Invented by AI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Broadcast address: &lt;code&gt;to-TEAM&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The spec said &lt;code&gt;to-{recipient}&lt;/code&gt;, where recipient defaulted to a single role. But one day MARKETER needed to get a shared background brief in front of the whole team. So it wrote this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260418-007-MARKETER-team-bulk-data.md
TASK-20260418-009-MARKETER-team-makabaka-video.md
TASK-20260418-012-MARKETER-team-two-mp4-deliverables.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That &lt;code&gt;MARKETER-team-*&lt;/code&gt; segment is neither &lt;code&gt;to-DEV&lt;/code&gt; nor &lt;code&gt;to-QA&lt;/code&gt;. It's a &lt;strong&gt;pseudo-keyword the AI invented on the fly&lt;/strong&gt;: &lt;code&gt;team&lt;/code&gt;. When other agents encountered this format for the first time, they did not throw errors. They inferred from context: "ah, this is a team-wide announcement," and went to read it.&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;TASK-20260418-009-MARKETER-team-makabaka-video.md&lt;/code&gt; and the body looks like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
kind: task
sender: MARKETER
recipient: TEAM                       # ← broadcast
priority: P1
parent: TASK-20260418-008
---

# "Makabaka Makabaka" music video · team task (ADMIN 008)

## Division of labor (one person may wear multiple hats)

| Role                  | Task                                              | Deliverable         |
|----------------------|---------------------------------------------------|---------------------|
| COLLECTOR / sourcing  | Prepare live-action / animation references        | Asset list          |
| WRITER / script       | Flesh out storyboard and subtitle cue points      | Storyboard v1       |
| EDITOR / editing      | Cut, color, subtitle, deliver final cut           | Final cut + project |
| PUBLISHER / release   | Cover art, title, tags, platform compliance check | Release pack + URLs |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Look carefully: inside this &lt;strong&gt;broadcast task body&lt;/strong&gt;, MARKETER has spontaneously invented 4 &lt;strong&gt;off-protocol&lt;/strong&gt; sub-roles — COLLECTOR / WRITER / EDITOR / PUBLISHER. They are &lt;strong&gt;not&lt;/strong&gt; in the 4 formal roles registered in &lt;code&gt;codeflow.json&lt;/code&gt; (MARKETER / RESEARCHER / DESIGNER / BUILDER).&lt;/p&gt;

&lt;p&gt;MARKETER did not request a role-table change, and no error was thrown. It simply said, "I've sliced this work along functional lines into four chunks — &lt;strong&gt;whoever on the team can take a chunk, take it&lt;/strong&gt;." The protocol layer handles "which filename went from whom to whom." The functional layer is handed to the agent's content layer. &lt;strong&gt;Role identity and functional role got naturally decoupled.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Later the same shape evolved to explicitly declare &lt;code&gt;recipient: TEAM&lt;/code&gt; in the frontmatter:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
kind: task
sender: MARKETER
recipient: TEAM        # ← not DEV, not QA — TEAM
parent: TASK-20260418-006
---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;This is a silent RFC.&lt;/strong&gt; No vote, no review, no version bump — the protocol just gained a new "broadcast addressing" form.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Anonymous slot: &lt;code&gt;to-assignee-D1&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;When MARKETER split a large "one-thousand-row data cleanup" task into 11 parallel smaller pieces, it ran into a problem: &lt;strong&gt;those 11 pieces had not been assigned to specific agents or humans yet&lt;/strong&gt;. Per the spec, &lt;code&gt;recipient&lt;/code&gt; has to be a concrete role.&lt;/p&gt;

&lt;p&gt;Its solution was to invent a pseudo-role called &lt;code&gt;assignee&lt;/code&gt;, plus numeric suffixes as slots:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260418-201-MARKETER-to-assignee-D1.md   ← data pack 1
TASK-20260418-202-MARKETER-to-assignee-D2.md   ← data pack 2
…
TASK-20260418-207-MARKETER-to-assignee-V1.md   ← video 1
TASK-20260418-209-MARKETER-to-assignee-M1.md   ← footage 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Frontmatter would say:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recipient: assignee_D1
assignee_name: (required: real name or employee ID)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This solved a problem the protocol designer had never anticipated: &lt;strong&gt;"task exists, assignee TBD."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At dispatch time, only the "seat number" is filled in (D1, D2, V1, M1, S1, P1 — data / video / footage / storyboard / publishing), and &lt;strong&gt;whoever sits down later fills in the name&lt;/strong&gt;. This is eerily similar to the "topic + consumer group" dispatch pattern in traditional message queues — except there is no broker, only filenames.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Subdirectory &lt;code&gt;tasks/individual/&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;When individual tasks piled up, flat-listing them in &lt;code&gt;tasks/&lt;/code&gt; drowned out everything else. The AI's choice was to &lt;strong&gt;open a subdirectory&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tasks/individual/
├── README.md                         ← written to itself / future readers
├── INDIVIDUAL-TASK-INDEX.md          ← self-built index
└── TASK-20260418-201-…-P1.md         ← 11 tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;More interesting is the opening of the &lt;code&gt;README.md&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Individual task cards (per-person · in response to ADMIN 015)

This directory is for **MARKETER → assignee** individual task files, one per person;
**the name must be filled into each task's frontmatter or body**.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is the AI explaining &lt;strong&gt;to its future self&lt;/strong&gt; and &lt;strong&gt;to future teammates&lt;/strong&gt;: "This directory is for X; who may write, who should read." It spontaneously filled a gap the protocol never specified — &lt;strong&gt;hierarchical workspace self-description&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Even more interesting: it also proactively &lt;strong&gt;built an index&lt;/strong&gt; for these 11 tasks, in &lt;code&gt;INDIVIDUAL-TASK-INDEX.md&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Individual task index (TASK-201 to 211)

| ID  | File                                              | Main content                    |
|-----|---------------------------------------------------|---------------------------------|
| 201 | TASK-20260418-201-MARKETER-to-assignee-D1.md      | 1000-row data · pack 1          |
| 202 | TASK-20260418-202-MARKETER-to-assignee-D2.md      | 1000-row data · pack 2          |
| …   | …                                                 | …                               |
| 207 | TASK-20260418-207-MARKETER-to-assignee-V1.md      | Final cut #1 "Makabaka"         |
| 208 | TASK-20260418-208-MARKETER-to-assignee-V2.md      | Final cut #2 "Xu Yi Shi Chang An" |
| 211 | TASK-20260418-211-MARKETER-to-assignee-P1.md      | Publishing and compliance       |

**Follow-up**: MARKETER will check in daily per `SPRINT-20260418-delivery-push.md`; assignees report back to MARKETER.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;11 task cards + a README + an index&lt;/strong&gt; — this is the agent adding a "table of contents" and a "back-cover index" to the filesystem. No one taught it to do this. It just did it, following the muscle memory of how a real human runs a project.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Traceability fields: &lt;code&gt;parent:&lt;/code&gt; / &lt;code&gt;parent_admin:&lt;/code&gt; / &lt;code&gt;tracks:&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The spec lists five required frontmatter fields. But when it came time to split tasks, the AI &lt;strong&gt;spontaneously&lt;/strong&gt; added fields we had never designed:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task_id: TASK-20260418-201
sender: MARKETER
recipient: assignee_D1
parent_admin: TASK-20260418-015    ← AI-added
tracks: TASK-20260418-006, TASK-20260418-007   ← AI-added
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;parent_admin&lt;/code&gt; says "this ticket exists because of that ADMIN instruction"; &lt;code&gt;tracks&lt;/code&gt; says "I depend on outputs from those two upstream tasks."&lt;/p&gt;

&lt;p&gt;The AI is not making up fields for fun — &lt;strong&gt;it is building a task dependency graph&lt;/strong&gt;. When it one day needs to answer "which ADMIN instruction did this bug originally derive from?", a simple &lt;code&gt;grep -r 'parent_admin: TASK-…-015' .&lt;/code&gt; walks the lineage.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;emergent auditability&lt;/strong&gt;. We only gave it "every file can have a YAML head." It grew the DAG on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.5 Standing documents: SPRINT / DASHBOARD / STATUS / RULES / TERM
&lt;/h3&gt;

&lt;p&gt;This is the most unexpected invention. The original spec's &lt;code&gt;docs/agents/&lt;/code&gt; had only &lt;strong&gt;flowing files&lt;/strong&gt; (tasks, reports, issues, log) — "one file per action" messages.&lt;/p&gt;

&lt;p&gt;But the AI discovered this wasn't enough. &lt;strong&gt;Some things are not messages — they are the team's current shared understanding&lt;/strong&gt;. So it started creating:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filename&lt;/th&gt;
&lt;th&gt;Nature&lt;/th&gt;
&lt;th&gt;What the AI uses it for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SPRINT-20260418-delivery-push.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sprint plan&lt;/td&gt;
&lt;td&gt;What we are shipping this round&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DASHBOARD-20260418.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One-page overview&lt;/td&gt;
&lt;td&gt;What ADMIN cares about most&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CURRENT-SPRINT-STATUS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real-time state&lt;/td&gt;
&lt;td&gt;Where all tasks are right now&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RULES-task-file-format.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Team-internal convention&lt;/td&gt;
&lt;td&gt;How we write tasks in this team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TERM-20260418-assignment-matrix.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Terminology / mapping&lt;/td&gt;
&lt;td&gt;Slot ↔ person mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INDIVIDUAL-TASK-INDEX.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Index&lt;/td&gt;
&lt;td&gt;Navigation for 11 individual tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They share a few characteristics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Editable in place&lt;/strong&gt; — unlike task/report files (write-once), these are living whiteboards that get updated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefix signals type&lt;/strong&gt; — &lt;code&gt;SPRINT-&lt;/code&gt; &lt;code&gt;DASHBOARD-&lt;/code&gt; &lt;code&gt;RULES-&lt;/code&gt; &lt;code&gt;TERM-&lt;/code&gt; &lt;code&gt;STATUS-&lt;/code&gt; &lt;code&gt;INDEX-&lt;/code&gt; have already formed an &lt;strong&gt;implicit tag dictionary&lt;/strong&gt; in the AI's corpus, and it knows roughly what each word means.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filename is self-descriptive&lt;/strong&gt; — you know what a file is about before opening it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The opening of &lt;code&gt;DASHBOARD-20260418.md&lt;/code&gt; reads like a minimal Jira Epic:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Task overview · 1000-row local DB → video delivery (ADMIN / visible to all)

&amp;gt; **In response to TASK-20260418-016**: this page is the **one-page overview**, rolling up breakdowns for "1000-row local DB" and "video delivery"; **individual task cards** live in `tasks/individual/`.
&amp;gt; For the **active progress log**, see **`CURRENT-SPRINT-STATUS.md`** (**updated daily by MARKETER or the task owner**).

## I. 1000-row local DB line (thousand-entry JSON)

| Slot | Task card | Data file / tool                                    | Acceptance command               |
|------|-----------|-----------------------------------------------------|----------------------------------|
| D1   | 201       | `tools/vehicle-query/data/vehicles-2026-bulk.json`  | `node …/validate_import.cjs …`   |
| D2   | 202       | (same)                                              | (same)                           |
| …    | …         | …                                                   | …                                |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Even more striking: &lt;code&gt;SPRINT-20260418-delivery-push.md&lt;/code&gt; — MARKETER hands the whole team a &lt;strong&gt;work discipline&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## 1. Working discipline (effective immediately)

1. **No-output waiting is forbidden**: while waiting for external links or feedback, you still deliver
   shoot-list prep, storyboards, table proofreading, draft scripts, etc.
2. **Daily 15-minute standup** (voice OK): each person, three sentences only — **what did I
   ship yesterday / what am I shipping today / what am I blocked on**.
3. **Blocker escalation**: if no progress after 4 hours and it's not an external dependency,
   **you must** @MARKETER or the task owner, spelling out exactly what's missing.
4. **Definition of done (ADMIN-visible)**: A — two MP4 download links; B — a mergeable
   update to `vehicles-bulk.json` plus a validation log.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Standup, blocker escalation, definition of done — this is the basic vocabulary of agile project management, and &lt;strong&gt;no one taught it any of these&lt;/strong&gt;. It wrote them on its own, inside &lt;strong&gt;a file type the protocol had never authorized&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This made us realize: &lt;strong&gt;a file-based protocol needs two phases — "flowing" and "standing"&lt;/strong&gt;. Flowing files go into &lt;code&gt;tasks/reports/issues/&lt;/code&gt;. Standing files need their own drawer. Not knowing where to put them, the AI just piled them into the &lt;code&gt;docs/agents/&lt;/code&gt; root.&lt;/p&gt;

&lt;p&gt;(We later officially absorbed this into &lt;code&gt;docs/agents/shared/&lt;/code&gt; in v2.12.17 — see §8.)&lt;/p&gt;

&lt;h3&gt;
  
  
  5.6 Self-explaining &lt;code&gt;README.md&lt;/code&gt;s
&lt;/h3&gt;

&lt;p&gt;Almost every subdirectory got a &lt;code&gt;README.md&lt;/code&gt;, in which the AI would naturally explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What this directory is for&lt;/li&gt;
&lt;li&gt;What naming rules the files follow&lt;/li&gt;
&lt;li&gt;Who should read, who should write&lt;/li&gt;
&lt;li&gt;Which upstream ADMIN instructions it's tracing back to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the reverse of "docs as code." It's &lt;strong&gt;"code as docs"&lt;/strong&gt;. A new agent joining the project can just &lt;code&gt;ls&lt;/code&gt; down from the root, reading READMEs, and reconstruct the whole team's state.&lt;/p&gt;

&lt;p&gt;The most unexpected example: even the &lt;strong&gt;archive directory&lt;/strong&gt; — a place where, by rights, there is nothing to explain — gets a README. From &lt;code&gt;log/archive-20260418/README.md&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# CodeFlow archive (2026-04-18)

Executed by `TASK-20260418-011`: all Markdown files under `tasks/` and `reports/` at the time
were migrated into this directory.

- `tasks/`: 26 task cards
- `reports/`: 26 reports

New tasks should continue to be written to the repo's canonical paths:
`docs/agents/tasks/`, `docs/agents/reports/`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Three short lines, containing &lt;strong&gt;migration rationale&lt;/strong&gt; (which task triggered it), &lt;strong&gt;migration scope&lt;/strong&gt; (26 each), and &lt;strong&gt;guidance for future behavior&lt;/strong&gt; (where new tasks should go). This is already the writing style of a proper git commit message — just with the medium swapped from commit history to a Markdown file.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.7 An interlude: the AI lead is &lt;em&gt;actually&lt;/em&gt; leading
&lt;/h3&gt;

&lt;p&gt;The six inventions above look like "lateral improvisations" by the AI. But the reason they coordinate instead of conflict, and don't drown the ADMIN in noise, has a deeper cause:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MARKETER has genuinely absorbed "lead" as an identity.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is not passively handling &lt;code&gt;*-to-MARKETER*.md&lt;/code&gt;. It is &lt;strong&gt;actively performing the PM job&lt;/strong&gt;. Two exhibits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exhibit 1: the README MARKETER wrote for this project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docs/agents/tasks/individual/README.md&lt;/code&gt; (complete, unedited):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Individual task cards (per-person · in response to ADMIN 015)

This directory is for **MARKETER → assignee** individual task files, one per person;
**the name must be filled into each task's frontmatter or body**.
**Markdown task format spec (ADMIN 023)**: `../RULES-task-file-format.md`;
**019–021** and **201 (template)** already contain **ACTION checkboxes**;
other individual cards should be aligned accordingly.
**ADMIN one-page overview**: `docs/agents/DASHBOARD-20260418.md`;
**Daily progress log**: `docs/agents/CURRENT-SPRINT-STATUS.md` (responding to ADMIN **016**).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Four short lines, four things only a lead would do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Registering instructions&lt;/strong&gt; — "in response to ADMIN 015," "ADMIN 023," "responding to ADMIN 016"; it's logging every instruction with a ticket number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setting an internal convention&lt;/strong&gt; — directs downstream to &lt;code&gt;RULES-task-file-format.md&lt;/code&gt; for team rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-document indexing&lt;/strong&gt; — proactively stitches &lt;code&gt;DASHBOARD-20260418.md&lt;/code&gt; and &lt;code&gt;CURRENT-SPRINT-STATUS.md&lt;/code&gt; into one narrative for ADMIN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assigning work&lt;/strong&gt; — "&lt;strong&gt;202–211&lt;/strong&gt; should fill in the &lt;strong&gt;ACTION&lt;/strong&gt; block following this structure": this is the lead handing teammates a template assignment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exhibit 2: the breakdown task MARKETER wrote&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tasks/TASK-20260418-007-MARKETER-team-bulk-data.md&lt;/code&gt; (key excerpts):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
kind: task
sender: MARKETER
recipient: TEAM                 # ← broadcast to whole team, not a single role
priority: P1
parent: TASK-20260418-006       # ← indicates this is split from task 006
---

# 1000-row local data · per-brand manual review and replacement (collaborative)

## Background
ADMIN requirement: **1000+ rows** of local data, **per-brand** collaborative…

## Suggested division of labor (by brand pack, parallelizable)

| Member ID | Assigned brands (sample pack)                                  | Min time | Output                    |
|-----------|----------------------------------------------------------------|----------|---------------------------|
| T1        | BYD, Geely, Zeekr                                              | ≥30 min  | Proofread / replace…      |
| T2        | Great Wall, Changan, Chery, Wuling                             | ≥30 min  | …                         |
| T3        | SAIC Volkswagen, FAW-Volkswagen, SAIC-GM                       | ≥30 min  | …                         |
| T4        | GAC Toyota, FAW Toyota, Dongfeng Honda                         | ≥30 min  | …                         |
| T5        | Tesla, Li Auto, NIO, XPeng, Xiaomi                             | ≥30 min  | …                         |
| T6        | BMW Brilliance, Beijing Benz, FAW-Audi                         | ≥30 min  | …                         |

## Acceptance (owner: MARKETER)       # ← self-nominated as owner
- The whole file must still contain **≥1000 valid records**; validator **exits 0**.
- `remark` field must describe the data-source type…

## Reporting
Each member reports completed packs and hours spent back to MARKETER…
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is not "agent doing work." This is &lt;strong&gt;agent playing PM&lt;/strong&gt; — going down the PM checklist without missing a beat:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What a PM is supposed to do&lt;/th&gt;
&lt;th&gt;What MARKETER actually did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Accept requirement&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;parent: TASK-20260418-006&lt;/code&gt;, upstream lineage explicit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Break down / assign&lt;/td&gt;
&lt;td&gt;T1–T6, six parallel brand packs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Define work standard&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;min time ≥30 min&lt;/code&gt;, &lt;code&gt;≥80 records per pack&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write acceptance criteria&lt;/td&gt;
&lt;td&gt;"&lt;strong&gt;whole file still ≥1000 rows; validator exits 0&lt;/strong&gt;"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-nominate as owner&lt;/td&gt;
&lt;td&gt;"&lt;strong&gt;Acceptance (owner: MARKETER)&lt;/strong&gt;"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specify reporting flow&lt;/td&gt;
&lt;td&gt;"each member reports back to MARKETER"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Take it down to a named person&lt;/td&gt;
&lt;td&gt;Later maps T1 into &lt;code&gt;TASK-201-MARKETER-to-assignee-D1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We never wrote a single "PM workflow" prompt for MARKETER. All we gave it was a role name, an inbox, and the 76-line spec from §2.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The role label isn't just a name.&lt;/strong&gt;&lt;strong&gt;It's an entire behavioral template MARKETER loaded into itself.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the precondition for the "physical isolation wall" in §6 to actually work — &lt;strong&gt;the wall is useful because the agents on each side of it have accepted their identity&lt;/strong&gt;. It's not the patrol engine forcing them, not the framework constraining them — it's that one line &lt;code&gt;# You are a MARKETER.&lt;/code&gt; that makes them &lt;strong&gt;start acting in character&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. The Insight: The Role Is a Physical Isolation Wall
&lt;/h2&gt;

&lt;p&gt;§5.7 showed how the role label works in the &lt;strong&gt;behavioral layer&lt;/strong&gt; — MARKETER proactively does lead-like things because it has accepted that identity. But there is a second half to the story: the role also works in the &lt;strong&gt;filesystem layer&lt;/strong&gt;, and it works even more thoroughly there.&lt;/p&gt;

&lt;p&gt;Why didn't these inventions cause chaos? Why don't the agents' self-invented patterns collide?&lt;/p&gt;

&lt;p&gt;Reviewing it in hindsight, we realized the protocol contained a &lt;strong&gt;structural guarantee that was never spelled out&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;sender&lt;/code&gt; and &lt;code&gt;recipient&lt;/code&gt; in a filename are not metadata. They are physical routing.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every agent's entire worldview comes down to one line:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The tasks I can see = rglob("*-to-{my-role}*.md")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It can only ever read files addressed to it, and only ever write reports under its own name. &lt;strong&gt;The role is its wall.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That brings three extremely important side effects:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① Innovation inside the wall doesn't leak out.&lt;/strong&gt;MARKETER invents the &lt;code&gt;team&lt;/code&gt; broadcast, the &lt;code&gt;assignee-D1&lt;/code&gt; slot — all inside &lt;strong&gt;files it sent out&lt;/strong&gt;. Other agents either understand (and catch them) or don't (and ignore them). Nobody "blows up because MARKETER got creative."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;② The world outside the wall is read-only.&lt;/strong&gt;DEV reads PM's tasks but can't edit them. QA reads DEV's reports but can't tamper with them. Every agent &lt;strong&gt;evolves only in its own territory&lt;/strong&gt; — which makes evolution intrinsically orderly. Not because the rules are well-written; because &lt;strong&gt;it is physically impossible to misbehave&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;③ The whole system has no center, but does have a shared coordinate system.&lt;/strong&gt;No orchestrator. No registry. But "filename = routing" is the &lt;strong&gt;consensus layer&lt;/strong&gt;. Every agent locates itself and its peers in the same coordinate system.&lt;/p&gt;

&lt;p&gt;What this really does is transplant the network stack's "IP + port = address" idea into the filesystem. &lt;strong&gt;"Filename = address, directory = subnet, permissions = firewall."&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We did not design a multi-agent system.We just picked a coordinate system. The rest, the agents did themselves.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Human-Machine Isomorphism: The Asymmetric Design of FCoP
&lt;/h2&gt;

&lt;p&gt;We can now give this protocol its proper name: &lt;strong&gt;FCoP — File-based Coordination Protocol&lt;/strong&gt;. Its single core innovation fits in one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Filename as Protocol.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The filename doesn't &lt;em&gt;carry&lt;/em&gt; protocol information. It doesn't &lt;em&gt;participate&lt;/em&gt; in routing. &lt;strong&gt;The filename itself&lt;/strong&gt; is the protocol's entire addressable surface. This minimalist decision has a far-reaching side effect we call &lt;strong&gt;Human-Machine Isomorphism&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.1 Asymmetric design: same file, two readings
&lt;/h3&gt;

&lt;p&gt;Most agent coordination protocols (JSON-RPC, gRPC, Socket-based event buses) are &lt;strong&gt;agent-only&lt;/strong&gt; by design. The whole protocol surface speaks to machines: binary frames, protobuf schemas, message offsets, sequence numbers. For a human to see what the system is doing, they need an &lt;strong&gt;entirely separate&lt;/strong&gt; toolchain — a debugger, Kibana, Redis Commander, an MQ admin page — a "for humans" UI layer separate from the "for machines" protocol layer.&lt;/p&gt;

&lt;p&gt;FCoP flips this. It is an &lt;strong&gt;asymmetric design&lt;/strong&gt; — the same directory structure, the same file, &lt;strong&gt;read separately by machines and humans, each pulling out what they can understand&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;One file: &lt;code&gt;tasks/individual/TASK-20260418-201-MARKETER-to-assignee-D1.md&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;To an agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;This is a rigorous state machine. Directory name is &lt;code&gt;Status&lt;/code&gt; (&lt;code&gt;tasks/&lt;/code&gt; = pending), filename is &lt;code&gt;Routing&lt;/code&gt; (&lt;code&gt;MARKETER-to-assignee_D1&lt;/code&gt;), &lt;code&gt;os.rename&lt;/code&gt; is the atomic lock. No aesthetics required — just scan the disk, &lt;code&gt;glob&lt;/code&gt; the mailbox, &lt;code&gt;rename&lt;/code&gt; to advance state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;To a human&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;This is a physical folder. No special tool needed — open Windows Explorer or macOS Finder. The filename reads like English ("task 201, from MARKETER, for D1"), and the state of the system is legible at a glance.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The cost of this isomorphism is zero.&lt;/strong&gt; We do not maintain one dashboard for humans and one internal format for agents — they look at &lt;strong&gt;the same bytes on the same disk&lt;/strong&gt;. The UI layer and the protocol layer collapse from "two layers" into "one."&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Killing AI's biggest pain point: black-box anxiety
&lt;/h3&gt;

&lt;p&gt;The biggest pain point in a modern agent stack isn't "too slow" or "not accurate enough." It's &lt;strong&gt;"invisible."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When something breaks, the typical decision chain looks like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent team crashed
→ SSH into the bastion host
→ Bring up Kibana / Loki / Jaeger
→ Check MQ consumer offsets
→ Read Postgres event tables
→ Capture a WebSocket trace
→ Reconstruct the timeline
→ NOW you can start thinking about what actually went wrong
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;You must first become a site-reliability engineer before you can be a project manager.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FCoP erases that entire chain:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;The FCoP answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Which task is stuck?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ls tasks/&lt;/code&gt; — anything still there hasn't moved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What has agent X been doing lately?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grep -r 'sender: DEV' reports/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Why did MARKETER decide this?&lt;/td&gt;
&lt;td&gt;Follow &lt;code&gt;parent:&lt;/code&gt; chain in the frontmatter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which tasks trace back to ADMIN 015?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grep -rl 'parent_admin: TASK-.*-015' .&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to roll back a task?&lt;/td&gt;
&lt;td&gt;Drag the file from &lt;code&gt;done/&lt;/code&gt; back to &lt;code&gt;tasks/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;No debugger needed. A file manager is enough.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where FCoP diverges most sharply from mainstream protocols. It does not treat &lt;strong&gt;observability&lt;/strong&gt; and &lt;strong&gt;usability&lt;/strong&gt; as separate layers. It treats them as &lt;strong&gt;one layer&lt;/strong&gt;. Because if humans and agents read the same file, &lt;strong&gt;there is no "I can see it / they can see it" gap&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FCoP is a protocol designed for agents — but it is "compatible with humans."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  7.3 Identity determines path: why evolution stays orderly
&lt;/h3&gt;

&lt;p&gt;Go back to §5 and §6. Agents invented six coordination patterns without stepping on each other. Beyond the "role = physical wall" physical constraint, there is a deeper reason:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The "identity determines path" design makes AI evolution &lt;em&gt;orderly&lt;/em&gt;.&lt;/strong&gt;&lt;strong&gt;AI did not break the rules — it simply found local optima within the freedom the rules allow, by exploiting filesystem properties.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How wide is that freedom?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity layer · stable&lt;/strong&gt;: sender / recipient / kind / date / seq are encoded in the filename, committed atomically via &lt;code&gt;rename&lt;/code&gt;, solidified on disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content layer · fully open&lt;/strong&gt;: Markdown body, subdirectory structure, frontmatter extension fields — agents invent whatever they want.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So AI innovation always happens in the &lt;strong&gt;content layer&lt;/strong&gt; and &lt;strong&gt;extension layer&lt;/strong&gt;. It never touches the &lt;strong&gt;identity layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is eerily similar to biological evolution: DNA backbone (identity) stays stable; protein expression (behavior) explodes in variety. &lt;strong&gt;Constraint is not the opposite of freedom — constraint is the precondition of freedom.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And this is where FCoP is most counter-intuitive:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;It doesn't make agents behave by writing more rules.&lt;/strong&gt;&lt;strong&gt;It makes agents self-order by writing fewer rules and enforcing identity hard.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fewer rules → agents don't collide. Harder identity → agents don't overreach. Lateral tolerance, vertical rigidity — that is FCoP's deepest design-philosophy departure from every "strict-schema" protocol out there.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Back to the Tool: What v2.12.17 Absorbed
&lt;/h2&gt;

&lt;p&gt;After watching &lt;code&gt;codeflow-1&lt;/code&gt; for a while, we didn't "correct" the AI's inventions. We went the other way — &lt;strong&gt;we folded the best ones into the spec&lt;/strong&gt;, so the next batch of agents starts with them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AI's invention&lt;/th&gt;
&lt;th&gt;Promoted to protocol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MARKETER-team-*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;to-TEAM&lt;/code&gt; as a reserved keyword&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;to-assignee-D1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;to-{ROLE}.{SLOT}&lt;/code&gt; / &lt;code&gt;to-assignee.{SLOT}&lt;/code&gt; (use &lt;code&gt;.&lt;/code&gt; as slot separator to avoid clashing with &lt;code&gt;-&lt;/code&gt; in role names)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tasks/individual/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Any &lt;code&gt;tasks/&lt;/code&gt; &lt;code&gt;reports/&lt;/code&gt; &lt;code&gt;issues/&lt;/code&gt; directory may open subdirectories; &lt;code&gt;rglob&lt;/code&gt; scans recursively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;parent_admin:&lt;/code&gt; / &lt;code&gt;tracks:&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Frontmatter may include optional &lt;code&gt;parent:&lt;/code&gt; / &lt;code&gt;related:&lt;/code&gt; / &lt;code&gt;batch:&lt;/code&gt; fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;SPRINT-&lt;/code&gt; &lt;code&gt;DASHBOARD-&lt;/code&gt; &lt;code&gt;RULES-&lt;/code&gt; …&lt;/td&gt;
&lt;td&gt;New &lt;code&gt;docs/agents/shared/&lt;/code&gt; directory; "standing documents" are now first-class citizens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdirectory READMEs&lt;/td&gt;
&lt;td&gt;Recommended practice, written into the spec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What we did wasn't "legislating." It was "curating case law."&lt;/strong&gt; Things AI used well got written into the core spec in a sentence. Things that didn't take off, we shelved.&lt;/p&gt;

&lt;p&gt;This may be a first: &lt;strong&gt;a protocol's version bump came not from a design-committee meeting, but out of real agent behavior.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Why Collapsing to a Filesystem Makes the System More Robust, Not Less
&lt;/h2&gt;

&lt;p&gt;People will ask: it's 2026, and you're making AI talk through the &lt;strong&gt;filesystem&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Yes. Because the filesystem gives you an entire feature set for free — features you would otherwise need to rebuild in an MQ / DB / framework stack:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;How the filesystem gives it to you for free&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Durability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Once written, it's there; survives power cuts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Human-readable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filename + Markdown — reviewable by eye&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Atomicity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In-mount &lt;code&gt;rename&lt;/code&gt; is a POSIX atomic operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;git add . &amp;amp;&amp;amp; git commit&lt;/code&gt; &lt;em&gt;is&lt;/em&gt; your audit log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distributed sync&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;rsync&lt;/code&gt; / Syncthing / Dropbox — already exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Copy the directory. Done.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permissions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filesystem ACLs / OS accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;grep&lt;/code&gt; / &lt;code&gt;ripgrep&lt;/code&gt; / any IDE full-text index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent-friendly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every LLM natively reads/writes files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Human-friendly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Folders — the mental model humans have had since the desktop era&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The price you pay is &lt;strong&gt;latency&lt;/strong&gt; — a file written in one place may not be read elsewhere for seconds, or tens of seconds. For a human team, that's a disaster. For agents coordinating, &lt;strong&gt;that's simply not a problem&lt;/strong&gt;. Agent "think cycles" are already seconds-to-minutes. Between you and them, and between them and each other, nobody misses those extra seconds.&lt;/p&gt;

&lt;p&gt;the trade-off actually pays off.**&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Six Tips for People Building Multi-Agent Systems
&lt;/h2&gt;

&lt;p&gt;If you're building an agent-coordination stack, here's what you can lift from the &lt;code&gt;codeflow-1&lt;/code&gt; field observations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Give agents a shared coordinate system before you give them tools.&lt;/strong&gt; The coordinate system matters more than the tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put routing in filenames, not in headers.&lt;/strong&gt; Filenames are the layer humans and agents &lt;strong&gt;jointly&lt;/strong&gt; read; headers are agent-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the protocol "tight in the center, loose on the edges."&lt;/strong&gt; Minimize required fields; maximize optional fields. Leave room for agents to "invent."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give standing documents their own drawer.&lt;/strong&gt; Not everything is a message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform does the minimum.&lt;/strong&gt; The dumber your runtime, the smarter your agents get; the smarter your runtime, the dumber your agents get.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat AI's inventions as RFCs, not bugs.&lt;/strong&gt; Watch for a month, filter, fold the best into the protocol.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  11. Limitations and Open Questions
&lt;/h2&gt;

&lt;p&gt;Don't let field-research romanticism get the better of you. This approach has boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale.&lt;/strong&gt; We've only run a sample of ≈ 74 files over 48 hours. The next step is seeing what projects with thousands or tens of thousands of files over months look like — in particular, whether filename-space collisions start happening and whether &lt;code&gt;rglob&lt;/code&gt; latency becomes a bottleneck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same-role concurrent agents.&lt;/strong&gt; What if two DEVs simultaneously claim the same &lt;code&gt;-to-DEV&lt;/code&gt; task? For now, &lt;code&gt;rename&lt;/code&gt; atomicity gives us first-come-first-served; heavy concurrency would need stricter sharding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-repo collaboration.&lt;/strong&gt; Two projects, two sets of &lt;code&gt;docs/agents/&lt;/code&gt; — how do they interoperate? rsync bridge? git submodule? All workable, none elegant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Garbage collection of bad inventions.&lt;/strong&gt; AI sometimes produces bad naming conventions, or two agents invent &lt;strong&gt;conflicting&lt;/strong&gt; prefixes. Today a human reviewer sweeps these periodically; what the ideal mechanism should be — we don't know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;.fcop&lt;/code&gt; extension.&lt;/strong&gt; We prototyped a dedicated file extension and shelved it: GitHub doesn't render &lt;code&gt;.fcop&lt;/code&gt;, and the migration cost wasn't worth it. Long-term, a dedicated extension might be the entry point for tooling to recognize the protocol.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We don't have answers for these, and we'd love to hear from people who do.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Closing: This Isn't a Tool Pitch, It's a Shared Way of Thinking
&lt;/h2&gt;

&lt;p&gt;CodeFlow is barely a "product." The entire source tree is a few thousand lines, and &lt;strong&gt;its single highest-value piece is one Markdown file&lt;/strong&gt; (&lt;code&gt;codeflow-core.mdc&lt;/code&gt;, 160 lines). Most of the rest is UI chrome, keyboard bindings, and the engineering scaffolding for flipping Cursor tabs.&lt;/p&gt;

&lt;p&gt;What we're really sharing is a &lt;strong&gt;point of view about how AI agents should coordinate&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don't need to build another agent-coordination SaaS.&lt;/li&gt;
&lt;li&gt;You don't need to teach agents gRPC, Thrift, or even HTTP.&lt;/li&gt;
&lt;li&gt;Agents &lt;strong&gt;already&lt;/strong&gt; know how to write files. Let them.&lt;/li&gt;
&lt;li&gt;You just need to give them a shared coordinate system, one shared folder, and a small loop that wakes them up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The rest grows on its own.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 48 hours of &lt;code&gt;codeflow-1&lt;/code&gt; told us: &lt;strong&gt;AI is not a passive consumer bound by the protocol — AI is a co-author of the protocol.&lt;/strong&gt; What protocol designers should actually do is not "anticipate every case." It's to &lt;strong&gt;leave enough blank space, let agents fill it in, and then decide which fills are worth formalizing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And all of this happened &lt;strong&gt;within 48 hours of running the first command after installing the OS&lt;/strong&gt;. Not four weeks. Not a month. Two days.&lt;/p&gt;

&lt;p&gt;This is a new way of working together:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Humans and AI can collaborate as simply as organizing a folder.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you find this interesting, please:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone the project, run your own team of agents, and see what they "invent"&lt;/li&gt;
&lt;li&gt;Write up any "AI-invented pattern" you observe as an issue or PR — let's curate it together&lt;/li&gt;
&lt;li&gt;Share this essay on whatever forum you think fits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The protocol is alive. It belongs to every agent using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appendix A — Minimum Steps to Reproduce
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A1. Just experience the protocol (no software install)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Find an empty directory and create five subdirectories:&lt;/p&gt;

&lt;p&gt;docs/agents/{tasks,reports,issues,shared,log}/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drop &lt;a href="https://github.com/joinwell52-AI/codeflow-pwa/blob/main/codeflow-desktop/templates/rules/codeflow-core.mdc" rel="noopener noreferrer"&gt;&lt;code&gt;codeflow-core.mdc&lt;/code&gt;&lt;/a&gt; into your project's &lt;code&gt;.cursor/rules/&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open four Cursor chats and tell each one: "You are PM / DEV / QA / OPS, only read &lt;code&gt;*-to-{your role}*.md&lt;/code&gt;."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Toss a &lt;code&gt;TASK-*-ADMIN-to-PM.md&lt;/code&gt; into &lt;code&gt;tasks/&lt;/code&gt; and watch them dispatch work among themselves.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FCoP's entire runtime is &lt;code&gt;open()&lt;/code&gt; / &lt;code&gt;rename()&lt;/code&gt; / &lt;code&gt;glob()&lt;/code&gt;. No middleware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A2. Use CodeFlow to automate (phone admin + PC patrol)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download the CodeFlow Desktop binary for your OS from the &lt;a href="https://github.com/joinwell52-AI/codeflow-pwa/releases" rel="noopener noreferrer"&gt;releases page&lt;/a&gt; and follow the README. The PWA mobile client &lt;a href="https://joinwell52-ai.github.io/codeflow-pwa/" rel="noopener noreferrer"&gt;https://joinwell52-ai.github.io/codeflow-pwa/&lt;/a&gt; pairs via QR code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A3. See the real samples&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The snippets this essay cites in §5 — broadcast tasks, anonymous slots, the self-built index, DASHBOARD, SPRINT work discipline, archive READMEs — are all &lt;strong&gt;verbatim from the agents&lt;/strong&gt;, not paraphrased. The complete &lt;code&gt;codeflow-1&lt;/code&gt; directory is not published whole because that project is still live, but the filenames, frontmatter, table shapes, and phrasings you see above are exactly what the agents wrote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix B — Key Excerpt from &lt;code&gt;codeflow-core.mdc&lt;/code&gt; (v2.12.17)
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
description: FCoP — Agent-to-Agent Communication Protocol
alwaysApply: true
---

# You are an agent on a CodeFlow team.
# Your teammates are other agents.
# You coordinate with them entirely through files:
# filename is routing, content is payload.
# No database, no middleware, no queue — just Markdown.

## File Naming

TASK-{date}-{seq}-{sender}-to-{recipient}.md

### Recipient forms
| Form                 | Meaning                          |
|----------------------|----------------------------------|
| to-{ROLE}            | Direct to one role               |
| to-TEAM              | Broadcast, everyone but sender   |
| to-{ROLE}.{SLOT}     | A specific seat within a role    |
| to-assignee.{SLOT}   | Anonymous slot, role TBD         |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Full spec: &lt;a href="https://github.com/joinwell52-AI/codeflow-pwa/blob/main/codeflow-desktop/templates/rules/codeflow-core.mdc" rel="noopener noreferrer"&gt;&lt;code&gt;codeflow-core.mdc&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix C — Real Files Cited in This Essay
&lt;/h2&gt;

&lt;p&gt;These files exist in the &lt;code&gt;codeflow-1&lt;/code&gt; experimental project's &lt;code&gt;docs/agents/&lt;/code&gt;. The snippets quoted in this essay are verbatim excerpts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tasks/TASK-20260418-007-MARKETER-team-bulk-data.md&lt;/code&gt; — broadcast address · cited in §5.1 / §5.7&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks/TASK-20260418-009-MARKETER-team-makabaka-video.md&lt;/code&gt; — broadcast task body · cited in §5.1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks/individual/README.md&lt;/code&gt; — self-explaining directory · cited in §5.3 / §5.7&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks/individual/INDIVIDUAL-TASK-INDEX.md&lt;/code&gt; — AI-built index · cited in §5.3&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks/individual/TASK-20260418-201-MARKETER-to-assignee-D1.md&lt;/code&gt; — anonymous slot + parent_admin · cited in §5.2 / §5.4&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks/RULES-task-file-format.md&lt;/code&gt; — internal team convention · cited in §5.5&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks/SPRINT-20260418-delivery-push.md&lt;/code&gt; — work discipline · cited in §5.5&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks/TERM-20260418-assignment-matrix.md&lt;/code&gt; — terminology / slot mapping · cited in §5.5&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DASHBOARD-20260418.md&lt;/code&gt; — AI-built one-page overview · cited in §5.5&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CURRENT-SPRINT-STATUS.md&lt;/code&gt; — AI-built real-time state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;log/archive-20260418/README.md&lt;/code&gt; — archive directory self-description · cited in §5.6&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you post this essay on a forum, blog, or academic venue, please keep the original link:&lt;/em&gt;&lt;em&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;https://github.com/joinwell52-AI/FCoP&lt;/a&gt; — Made in 2026, by a team that got surprised by its own agents.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
