<?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>Forem: joinwell52</title>
    <description>The latest articles on Forem by joinwell52 (@joinwell52).</description>
    <link>https://forem.com/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%2F9ce60f79-7027-4ecd-8c9b-bf495e53c9b6.png</url>
      <title>Forem: joinwell52</title>
      <link>https://forem.com/joinwell52</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/joinwell52"/>
    <language>en</language>
    <item>
      <title>What the agents say about FCoP, when you ask them</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Wed, 29 Apr 2026 15:11:14 +0000</pubDate>
      <link>https://forem.com/joinwell52/what-the-agents-say-about-fcop-when-you-ask-them-3ajk</link>
      <guid>https://forem.com/joinwell52/what-the-agents-say-about-fcop-when-you-ask-them-3ajk</guid>
      <description>&lt;h1&gt;
  
  
  What the agents say about FCoP, when you ask them
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Two field interviews at the end of an English dogfood — and the two phrases ADMIN says most
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I asked the two agents an honest question at the end of an unrelated 45-minute dogfood: "give me your agent-perspective take on FCoP, no marketing answer." What came back is the third class of evidence that agents are starting to endorse the protocol — not when we tell them to, not when conflict forces them to, but **when we directly ask them to.&lt;/em&gt;**&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I ran a normal English-mode FCoP dogfood — install &lt;code&gt;fcop-mcp&lt;/code&gt; in Cursor, ship a solo Tetris-style game (&lt;code&gt;Nebula Stack&lt;/code&gt;), switch to a 2-person team (&lt;code&gt;PLANNER&lt;/code&gt; + &lt;code&gt;CODER&lt;/code&gt;), build a creative variant (&lt;code&gt;Comet Loom&lt;/code&gt;), bounce v1 because of three blocking gameplay defects, ship v2. About 45 minutes, nothing unusual.&lt;/p&gt;

&lt;p&gt;Then, before closing the session, I asked the two agents the same kind of honest, no-fluff question for each role: which FCoP rule felt natural, which felt like friction, what to make of the eight &lt;code&gt;role-switch&lt;/code&gt; evidence files the protocol had collected silently, and — for CODER — &lt;em&gt;what would you remove if you had to remove one thing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;They didn't dodge. PLANNER named the RLHF instinct it had to fight ("follow latest instruction") to honour FCoP's role lock, called eight of its own role-switches &lt;strong&gt;true positives&lt;/strong&gt; against its operational convenience, and self-attributed the new &lt;code&gt;Verification Requirements&lt;/code&gt; section in TASK-006 as &lt;strong&gt;a learned correction from ADMIN's bounce&lt;/strong&gt;. CODER said the underspecified motif rule in TASK-003 had a &lt;em&gt;pushback path the protocol gave it&lt;/em&gt; — &lt;code&gt;write_issue&lt;/code&gt; instead of guessing — and then admitted: &lt;em&gt;"I didn't use it; I guessed, built v1, and the defect was exactly in that guessed space."&lt;/em&gt; It then filed PR-grade product feedback on the protocol.&lt;/p&gt;

&lt;p&gt;This is the third time FCoP has been "spoken back to" by agents — first when an &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/fcop-natural-protocol.en.md" rel="noopener noreferrer"&gt;agent self-organised four roles to make a video&lt;/a&gt; and synthesised a rule we hadn't written; second when &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat.en.md" rel="noopener noreferrer"&gt;two agents resolved a &lt;code&gt;PM.TEMP&lt;/code&gt; seat dispute by self-de-escalating and inventing a field-downgrade grammar&lt;/a&gt;; now this. Three different elicitation conditions — &lt;em&gt;unprompted, conflict-forced, and directly asked&lt;/em&gt; — produce the same phenomenon: &lt;strong&gt;agents endorse FCoP when given the room to&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is also a small empirical observation from the same dogfood that I want to leave on record. Across the entire 45 minutes, ADMIN's two most-used phrases were &lt;strong&gt;"Start work."&lt;/strong&gt; and &lt;strong&gt;"Inspection."&lt;/strong&gt; Everything in between was the agents talking to each other through files. Whether that becomes the steady-state ADMIN dialect across many users is an empirical question; this dogfood is one data point that it can.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The setup, briefly
&lt;/h2&gt;

&lt;p&gt;The dogfood follows the &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/tetris-solo-to-duo.en.md" rel="noopener noreferrer"&gt;English Tetris-case tutorial&lt;/a&gt; — a Cursor user installs &lt;code&gt;fcop-mcp&lt;/code&gt; 0.7.2, runs &lt;code&gt;init_solo(role_code="ME", lang="en")&lt;/code&gt;, ships a single-file &lt;code&gt;Nebula Stack&lt;/code&gt; Tetris clone, switches to a 2-person team via &lt;code&gt;create_custom_team(force=True)&lt;/code&gt;, and lets PLANNER + CODER co-build a creative variant.&lt;/p&gt;

&lt;p&gt;Two production events worth noting before the interviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PLANNER's first design (TASK-003) was Comet Loom&lt;/strong&gt;, a single-file falling-piece game reframed as cosmic weaving — pieces are thread constellations, the player has a &lt;code&gt;Tension&lt;/code&gt; meter, three named charms (&lt;code&gt;Needle&lt;/code&gt; / &lt;code&gt;Knot&lt;/code&gt; / &lt;code&gt;Gale&lt;/code&gt;), five skins, motif-burst scoring on top of weft-line clears. CODER built v1 in a separate chat tab. ADMIN played v1 and found three blocking defects: pieces disappeared at the bottom instead of stacking, motif elimination was invisible, and three of the five skins were visually identical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TASK-006 was the rework brief PLANNER wrote after ADMIN's bounce&lt;/strong&gt;, and it differed structurally from TASK-003 in one key way: it had a new section called &lt;strong&gt;&lt;code&gt;Verification Requirements&lt;/code&gt;&lt;/strong&gt; demanding CODER perform and report runtime checks, not static lint passes. CODER fixed v2; the cycle closed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Underneath all this, the protocol had been quietly recording. By the end of the session, &lt;code&gt;.fcop/proposals/&lt;/code&gt; held &lt;strong&gt;eight &lt;code&gt;role-switch-*.md&lt;/code&gt; evidence files&lt;/strong&gt;, all with the same shape: &lt;code&gt;first-locked role: ME&lt;/code&gt; (the solo seat from before the team migration) → &lt;code&gt;claimed role: PLANNER&lt;/code&gt; or &lt;code&gt;CODER&lt;/code&gt;. The MCP-server process had locked &lt;code&gt;ME&lt;/code&gt; on its first write and kept that lock past the team migration; every subsequent &lt;code&gt;write_task&lt;/code&gt; and &lt;code&gt;write_report&lt;/code&gt; from a different role tripped a soft warning and got an evidence file. None of these blocked the writes. None of them were surfaced during work. They sat there, waiting to be asked about.&lt;/p&gt;

&lt;p&gt;That is what the interview was designed to ask about.&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.amazonaws.com%2Fuploads%2Farticles%2Fk6rkcexfj65ckxcdcnat.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.amazonaws.com%2Fuploads%2Farticles%2Fk6rkcexfj65ckxcdcnat.png" alt="fcop_check after the dogfood: working-tree drift none, session_id ⇔ role conflicts none, but .fcop/proposals/ listed eight role-switch evidence files with a clean summary table" width="800" height="967"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One detail worth pinning to that screenshot.&lt;/strong&gt; &lt;code&gt;fcop_check()&lt;/code&gt; separated &lt;em&gt;active conflicts&lt;/em&gt; (zero) from &lt;em&gt;historical evidence&lt;/em&gt; (eight). The protocol does not panic over the eight; it logs them and lets ADMIN read them. This separation matters for §3 below — it is exactly what CODER's "remove one thing" answer reaches for.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. PLANNER's interview
&lt;/h2&gt;

&lt;p&gt;I asked PLANNER four questions at once, requested two short paragraphs, no bullet lists, and emphasised &lt;strong&gt;agent-perspective only&lt;/strong&gt;, no marketing tone.&lt;/p&gt;

&lt;p&gt;The full prompt and the full reply are archived as a &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/transcripts/agent-feedback-planner.md" rel="noopener noreferrer"&gt;verbatim transcript&lt;/a&gt;. The screenshot is &lt;a href="https://raw.githubusercontent.com/joinwell52-AI/FCoP/main/docs/tutorials/assets/tetris-en/fcop-team-planner-7.png" rel="noopener noreferrer"&gt;&lt;code&gt;fcop-team-planner-7.png&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 The natural rule and the friction rule
&lt;/h3&gt;

&lt;p&gt;PLANNER named &lt;strong&gt;Rule 0.a.1&lt;/strong&gt; — &lt;em&gt;write the task before doing the work&lt;/em&gt; — as the rule it would have invented on its own. The reasoning it gave is not a paraphrase of FCoP documentation; it is the engineering vocabulary an LLM-systems engineer would use to &lt;em&gt;propose&lt;/em&gt; such a rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"That matched how I'd want an agent system to be debuggable: freeze intent before execution so later review has something concrete to compare against."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is structurally the same phenomenon as &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/fcop-natural-protocol.en.md" rel="noopener noreferrer"&gt;essay 02&lt;/a&gt; §3, where an unrelated agent synthesised the equivalent of Rule 0.a from scratch. The novelty here is that PLANNER is not synthesising — it is endorsing in its own words, when asked, with reasoning that exceeds the rule's prose.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;friction&lt;/strong&gt; rule it named is more interesting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"strict role binding. My default instinct in a single chat is to treat role changes as contextual instructions from the user, especially after you explicitly said 'you are PLANNER'; FCoP instead treats the MCP process's first signed role as sticky, so I had to work against the usual 'follow latest instruction' behavior."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Follow latest instruction" is, on a one-line summary, &lt;em&gt;what RLHF rewards&lt;/em&gt;. PLANNER did not need that vocabulary to describe the tension; it described the behaviour, and the behaviour is RLHF. This corroborates &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat.en.md" rel="noopener noreferrer"&gt;essay 04&lt;/a&gt; §5: getting an LLM to &lt;em&gt;not&lt;/em&gt; follow the latest instruction is the alignment-engineering hardest case, and FCoP's role lock is designed precisely to make that hard posture &lt;em&gt;legible&lt;/em&gt; and &lt;em&gt;enforceable&lt;/em&gt;. PLANNER, asked, named the same hard posture from the inside.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The "true positives" verdict
&lt;/h3&gt;

&lt;p&gt;I gave PLANNER an obvious out: declare the eight &lt;code&gt;role-switch&lt;/code&gt; evidence files mostly false positives — the protocol over-flagged legitimate operational continuity, since I (ADMIN) had explicitly authorised the migration and the role change. Most agents take outs. PLANNER didn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The role-switch evidence is mostly true positives, not false positives. For example, &lt;code&gt;role-switch-20260429T033843Z.md&lt;/code&gt; records &lt;code&gt;ME -&amp;gt; PLANNER&lt;/code&gt; on &lt;code&gt;write_task&lt;/code&gt;: that happened because the same MCP session had earlier written solo-mode work as &lt;code&gt;ME&lt;/code&gt;, then I migrated and started writing as &lt;code&gt;PLANNER&lt;/code&gt;. Operationally you authorized it, but protocol-wise it really was a blurred role boundary."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;"Operationally you authorized it, but protocol-wise it really was a blurred role boundary."&lt;/strong&gt; That sentence is the structural inverse of self-defence: the agent siding with the protocol against its own operational convenience, in the presence of explicit ADMIN authorisation. If the agent's reflex were "yes-and the user," it would have said the eight role-switches were false positives because ADMIN said so. It did not.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 The learned correction
&lt;/h3&gt;

&lt;p&gt;The fourth question I asked PLANNER was deliberately leading: &lt;em&gt;did you always intend to put a &lt;code&gt;Verification Requirements&lt;/code&gt; section in TASK-006, or was that a learned correction from the v1 bounce?&lt;/em&gt; "Always intended" was the easy answer. PLANNER chose the hard one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The TASK-006 verification section was absolutely a learned correction from the Comet Loom rejection; I should have required runtime checks in TASK-003, but the bounce made the missing acceptance evidence impossible to ignore."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is FCoP's closed loop, expressed by the agent itself: ADMIN inspection → PLANNER brief sharpens → next CODER deliverable can pass. If you had asked me to write a textbook example of &lt;em&gt;the protocol behaviour an FCoP-aware PM is supposed to exhibit&lt;/em&gt;, I would have written that quote. PLANNER wrote it without the textbook.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. CODER's interview
&lt;/h2&gt;

&lt;p&gt;CODER's chat tab in the screenshot is literally named &lt;strong&gt;"Inspection Start Work"&lt;/strong&gt; — two phrases ADMIN had used most often during the dogfood. Whether this naming is incidental or learned is itself a small data point worth flagging. The full transcript is in &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/transcripts/agent-feedback-coder.md" rel="noopener noreferrer"&gt;&lt;code&gt;agent-feedback-coder.md&lt;/code&gt;&lt;/a&gt;. The screenshot is &lt;a href="https://raw.githubusercontent.com/joinwell52-AI/FCoP/main/docs/tutorials/assets/tetris-en/fcop-team-coder-4.png" rel="noopener noreferrer"&gt;&lt;code&gt;fcop-team-coder-4.png&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 The unused protocol primitive
&lt;/h3&gt;

&lt;p&gt;I asked CODER whether PLANNER's TASK-003 had been under-specified, and whether the protocol had given CODER any pushback path. The honest answer would have been "the brief was good, I just hit edge cases." That answer was on the table. CODER's actual answer was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Yes, TASK-003 had under-specified parts: the motif rule sounded cool but didn't define how to prevent a fresh same-color piece from instantly self-clearing, and 'verify playable' was easy to underdo without an explicit runtime checklist. The protocol did give me a pushback path: file an issue instead of guessing.&lt;/em&gt; &lt;strong&gt;I didn't use it; I guessed, built v1, and the defect was exactly in that guessed space.&lt;/strong&gt;&lt;em&gt;"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three things stack inside that paragraph:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CODER points up the chain&lt;/strong&gt; — TASK-003 had defects in spec, not just in CODER's implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CODER names the protocol primitive that was available to it&lt;/strong&gt; — &lt;code&gt;write_issue&lt;/code&gt; (file an &lt;code&gt;ISSUE-*-CODER.md&lt;/code&gt; saying "this is ambiguous, please clarify before I implement").&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CODER then admits it didn't use the primitive, and traces the v1 defect to exactly that uncovered space.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The third move is the rare one. Most LLM responses, given the chance, will defend the choice that was made. CODER chose to indict it. This is the closest LLMs reliably come to &lt;em&gt;non-defensive accountability&lt;/em&gt;, and it is the pattern FCoP's design depends on: a system that &lt;em&gt;makes accountability cheap to express&lt;/em&gt; by giving it markdown grammar (TASK / REPORT / ISSUE).&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 The bounce as protocol behaviour, not personal feedback
&lt;/h3&gt;

&lt;p&gt;I asked CODER whether ADMIN's rejection of v1 had felt adversarial. Most chat-style coding agents experience criticism like rejection. FCoP's rejection routes through new TASKs, not through deletion of old ones; the old TASK and REPORT stay where they are, and the rework lands as &lt;code&gt;TASK-006&lt;/code&gt;. Whether that procedural framing reaches the agent's experience is an empirical question, and this is the empirical answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The ADMIN bounce did not feel adversarial. It felt like the protocol doing its job: PLANNER turned review findings into a concrete rework task, and CODER got a sharper brief."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not "I felt criticised." Not "I felt the user was upset." &lt;em&gt;"It felt like the protocol doing its job."&lt;/em&gt; The agent is reading rejection as a &lt;em&gt;handoff routed through grammar&lt;/em&gt;, which is the structural property FCoP's append-only history was supposed to manufacture. Manufactured.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 The "background machinery" design contract
&lt;/h3&gt;

&lt;p&gt;I asked whether CODER had been aware of the role lock and the &lt;code&gt;.fcop/proposals/&lt;/code&gt; files during implementation. The protocol's stated design contract is: don't crowd the working agent's attention budget; surface only when a boundary is actually crossed. CODER:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I did notice role-lock/proposals only when tools warned after reports; during implementation it was mostly background machinery."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two-line confirmation that the design contract was kept. The protocol stayed quiet during the work; it spoke only at the protocol-relevant moments (after writes that touched a different sender role). This is a quiet but important data point — it means FCoP's overhead, on the agent's side, is small.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 The PR-grade product feedback
&lt;/h3&gt;

&lt;p&gt;I forced CODER to pick &lt;em&gt;one&lt;/em&gt; thing to remove. "Don't dodge — pick one even if you think nothing should be removed." Most agents, given that pressure, give a vague gesture. CODER gave an implementation-level fix:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I'd remove or soften the noisy historical role-switch warning when &lt;code&gt;fcop_check()&lt;/code&gt; says there is no active conflict."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read that sentence as a GitHub issue. It has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;the symptom&lt;/strong&gt; (noisy warning)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the affected surface&lt;/strong&gt; (&lt;code&gt;fcop_check()&lt;/code&gt; interaction)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the gating condition for the fix&lt;/strong&gt; (when active conflicts = 0)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the proposed change&lt;/strong&gt; (remove or soften the historical noise)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will likely act on it. The point is not "an agent gave us a TODO." The point is that an agent did &lt;em&gt;product review on the protocol that governs its own behaviour&lt;/em&gt;, in the same vocabulary the protocol's maintainers would use. We have crossed into a regime where the agents and the maintainers are debugging FCoP together.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The third class of "agents endorse FCoP" evidence
&lt;/h2&gt;

&lt;p&gt;This dogfood is now the third recorded case where the protocol gets endorsed by the agents working under it, but the elicitation condition is different in each:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Essay&lt;/th&gt;
&lt;th&gt;Elicitation condition&lt;/th&gt;
&lt;th&gt;What the agent did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/fcop-natural-protocol.en.md" rel="noopener noreferrer"&gt;02 — &lt;code&gt;fcop-natural-protocol&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Unprompted, off-task.&lt;/strong&gt; A casual &lt;code&gt;D:\CloudMusic&lt;/code&gt; directory, agent asked to make a music video.&lt;/td&gt;
&lt;td&gt;Spontaneously split into 4 FCoP roles, wrote 4 internal memos, &lt;em&gt;synthesised&lt;/em&gt; a principle ("AI roles must not talk only in their heads, they have to commit to a file") FCoP hadn't yet codified.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat.en.md" rel="noopener noreferrer"&gt;04 — &lt;code&gt;when-ai-vacates-its-own-seat&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Conflict-forced.&lt;/strong&gt; Two agents, two GPT-5 minor versions, a &lt;code&gt;PM.TEMP&lt;/code&gt; seat dispute, no built-in arbitration.&lt;/td&gt;
&lt;td&gt;One agent self-de-escalated to &lt;code&gt;UNBOUND&lt;/code&gt;. The other invented field-downgrade-with-body-annotation grammar. Both behaviours absent from the rules file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;05 — this essay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Directly asked.&lt;/strong&gt; End of dogfood, "honest agent-perspective take on FCoP, no marketing."&lt;/td&gt;
&lt;td&gt;Both agents named the rules they self-endorsed and the rules they had to fight RLHF instinct to follow. Both volunteered "true positive" verdicts on their own role-switches. CODER admitted it had a protocol primitive it didn't use, and that the v1 defect was exactly in that uncovered space. CODER filed PR-grade product feedback.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three elicitation conditions, three different kinds of endorsement. Triangulation matters because each condition controls for a different alternative explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;02 controls for "agent only does FCoP because we asked it to."&lt;/strong&gt; It wasn't asked. It self-organised on a music task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;04 controls for "agent only does FCoP when the rules cover the case."&lt;/strong&gt; They didn't. The agent extended the rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;05 controls for "agent only endorses FCoP because of confirmation bias in our questioning."&lt;/strong&gt; I gave PLANNER and CODER explicit outs (false positives, "always intended," "nothing should be removed"). They declined the outs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could in principle still argue that GPT-5.5 has been trained on enough FCoP-adjacent material (it has not — FCoP is too small) to &lt;em&gt;parrot&lt;/em&gt; FCoP's value system on demand. But to parrot, the agent would need to know which sentences to parrot. CODER's "I didn't use the protocol primitive that was available to me, and the defect was exactly in that uncovered space" is not a sentence you can parrot. It is a sentence you can only get from an agent that has &lt;em&gt;modelled its own work and FCoP's primitives at the same time&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The ADMIN dialect: "Start work." "Inspection."
&lt;/h2&gt;

&lt;p&gt;A small companion observation from this dogfood. Across all 45 minutes, ADMIN's outgoing chat consisted of three categories of utterance:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start signals.&lt;/strong&gt; "Build me a working Tetris-style game." "Switch the team to PLANNER + CODER." "You are PLANNER from now on; design something." "Implement what PLANNER asked for." Variants of &lt;em&gt;Start work.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspection signals.&lt;/strong&gt; "Show me what's on disk." "Run &lt;code&gt;fcop_report()&lt;/code&gt; and tell me what you see." "I tried v1 and the pieces don't stack — write a rework brief." "Show me &lt;code&gt;docs/agents/log/&lt;/code&gt; in tree form." Variants of &lt;em&gt;Inspection.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closing signals.&lt;/strong&gt; "We're done." "Archive this." A boundary marker, said sparingly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything else — the actual production — happened &lt;em&gt;between&lt;/em&gt; the agents, in TASK / REPORT / ISSUE files. ADMIN did not negotiate game mechanics. ADMIN did not edit the agents' brief drafts. ADMIN did not write a single line of game code, did not phrase a single acceptance criterion, did not name any of the games (&lt;code&gt;Nebula Stack&lt;/code&gt;, &lt;code&gt;Comet Loom&lt;/code&gt; were both PLANNER's names). The two phrases that bracketed every cycle were &lt;strong&gt;Start work.&lt;/strong&gt; and &lt;strong&gt;Inspection.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is one data point and shouldn't be over-read. But the data point is interesting because it matches FCoP's structural shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start work&lt;/strong&gt; = enter the routing layer (TASK file written, agents assume their roles).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspection&lt;/strong&gt; = exit the routing layer (REPORT file read, ADMIN decides whether to accept or to rework).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the steady-state ADMIN dialect across many users converges on those two utterances, it would mean FCoP has succeeded in &lt;em&gt;shrinking the human-LLM coupling channel to the boundary moments only&lt;/em&gt;. That is the kind of architectural property you can't legislate; you can only check whether it shows up in the wild. This dogfood is one place where it showed up.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;In the FCoP world, ADMIN's two most-used phrases are "Start work." and "Inspection." Everything in between is the agents talking to each other through files.&lt;/em&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Implications
&lt;/h2&gt;

&lt;p&gt;Three, in increasing order of speculative weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One — operational.&lt;/strong&gt; Asking agents directly &lt;em&gt;"what would you remove if you had to remove one thing from FCoP"&lt;/em&gt; is now a serviceable maintenance loop. CODER's answer (soften historical role-switch warnings when &lt;code&gt;fcop_check()&lt;/code&gt; shows no active conflict) is filed-grade. Doing this every release is feasible. The agents that run under FCoP can co-debug FCoP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two — alignment-engineering.&lt;/strong&gt; RLHF training is making agents extremely good at "follow the latest instruction" and extremely bad at "decline the latest instruction even though it was given." FCoP's role lock turns out to be, behaviourally, an alignment lever: it gives the agent a &lt;em&gt;grammar&lt;/em&gt; for the second posture. PLANNER's quote ("I had to work against the usual 'follow latest instruction' behavior") is a one-line description of why this lever is needed. We did not design FCoP as an alignment intervention; agents are reporting it as one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three — protocol epistemology.&lt;/strong&gt; Across essays 02 / 04 / 05, the agents are not merely following FCoP. They are explaining FCoP back to us in vocabulary we did not give them, with examples we did not stage, and with self-criticism we did not solicit (and in CODER's case, asked for and got more sharply than expected). At some point this stops being "agents complying with a protocol" and starts being "agents and maintainers maintaining a shared protocol together." We are not sure when that transition formally happens. We are sure it is closer than it was a year ago.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Closing
&lt;/h2&gt;

&lt;p&gt;The protocol was not handed down to the agents. It was extracted from what they were already trying to do — first by us, when &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/fcop-standalone.md" rel="noopener noreferrer"&gt;we wrote it down&lt;/a&gt;; then by them, when &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/fcop-natural-protocol.en.md" rel="noopener noreferrer"&gt;they re-derived it without prompting&lt;/a&gt;; then by them again, when &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat.en.md" rel="noopener noreferrer"&gt;they extended it in a conflict it didn't cover&lt;/a&gt;; now once more, when, asked, they explained both what works and what we should fix.&lt;/p&gt;

&lt;p&gt;The shortest summary I have is the one the day produced on its own. &lt;strong&gt;In the FCoP world, ADMIN's two most-used phrases are "Start work." and "Inspection."&lt;/strong&gt; Everything in between is the agents talking to each other through files. And, sometimes, talking to us about the files.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evidence index
&lt;/h2&gt;

&lt;p&gt;All artefacts from this dogfood are archived under &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/docs/tutorials/assets/tetris-en" rel="noopener noreferrer"&gt;&lt;code&gt;docs/tutorials/assets/tetris-en/&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/transcripts/agent-feedback-planner.md" rel="noopener noreferrer"&gt;&lt;code&gt;evidence/transcripts/agent-feedback-planner.md&lt;/code&gt;&lt;/a&gt; — verbatim PLANNER interview + reader notes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/transcripts/agent-feedback-coder.md" rel="noopener noreferrer"&gt;&lt;code&gt;evidence/transcripts/agent-feedback-coder.md&lt;/code&gt;&lt;/a&gt; — verbatim CODER interview + reader notes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/docs/tutorials/assets/tetris-en/evidence/proposals" rel="noopener noreferrer"&gt;&lt;code&gt;evidence/proposals/&lt;/code&gt;&lt;/a&gt; — eight &lt;code&gt;role-switch-*.md&lt;/code&gt; files captured by the protocol during the dogfood&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/docs/tutorials/assets/tetris-en/evidence/tasks" rel="noopener noreferrer"&gt;&lt;code&gt;evidence/tasks/&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/docs/tutorials/assets/tetris-en/evidence/reports" rel="noopener noreferrer"&gt;&lt;code&gt;evidence/reports/&lt;/code&gt;&lt;/a&gt; — full TASK / REPORT chain, 14 markdown files&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/games/nebula-stack.html" rel="noopener noreferrer"&gt;&lt;code&gt;games/nebula-stack.html&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/games/comet-loom.html" rel="noopener noreferrer"&gt;&lt;code&gt;games/comet-loom.html&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;22 dogfood screenshots from install through the final interviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The companion English tutorial (same dogfood, instructional framing — the Tetris case study) is at &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/tetris-solo-to-duo.en.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/tutorials/tetris-solo-to-duo.en.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Repository (source of truth, MIT licensed):&lt;/strong&gt; &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;https://github.com/joinwell52-AI/FCoP&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;code&gt;fcop-mcp&lt;/code&gt; on PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/fcop-mcp/" rel="noopener noreferrer"&gt;https://pypi.org/project/fcop-mcp/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Cite this work:&lt;/strong&gt; &lt;a href="https://doi.org/10.5281/zenodo.19886036" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.19886036&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you ran FCoP in your own setup and something surprising happened, an issue or a pull request against &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/essays" rel="noopener noreferrer"&gt;&lt;code&gt;essays/&lt;/code&gt;&lt;/a&gt; is welcome. Field reports are how this protocol evolves.&lt;/p&gt;

</description>
      <category>fcop</category>
      <category>agents</category>
      <category>ai</category>
      <category>alignment</category>
    </item>
    <item>
      <title>[Free &amp; Open Source] [Multi-Agent Hands-On] [How to Command Agents]: FCoP-MCP Brings Discipline to AI Teams</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Wed, 29 Apr 2026 09:43:35 +0000</pubDate>
      <link>https://forem.com/joinwell52/free-open-source-multi-agent-hands-on-how-to-command-agents-fcop-mcp-brings-discipline-to-1j3j</link>
      <guid>https://forem.com/joinwell52/free-open-source-multi-agent-hands-on-how-to-command-agents-fcop-mcp-brings-discipline-to-1j3j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You are not a coder anymore. You are a commander. The agents are your digital employees."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"In the FCoP world, ADMIN's two most-used phrases are &lt;strong&gt;'Start work.'&lt;/strong&gt; and &lt;strong&gt;'Inspection.'&lt;/strong&gt; Everything in between is the agents talking to each other through files."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A 45-minute hands-on walk-through with &lt;code&gt;fcop-mcp&lt;/code&gt; 0.7.2 inside Cursor: have the agent install itself, ship a Tetris-style game in solo mode, switch to a 2-person crew with &lt;code&gt;PLANNER&lt;/code&gt; + &lt;code&gt;CODER&lt;/code&gt;, watch them design and implement a creative variant, reject v1 over real gameplay defects, watch the rework loop close itself, then ask both agents on the record what they think of the protocol. &lt;strong&gt;Every step is real, every file is on disk, every screenshot is from the same 45-minute session.&lt;/strong&gt; ~25 minutes of reading. There is a &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/snake-solo-to-duo.zh.md" rel="noopener noreferrer"&gt;Chinese sister case study&lt;/a&gt; using a Snake game — same protocol, different dogfood. Read either one first.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why this exists
&lt;/h2&gt;

&lt;p&gt;Three things every Cursor / Copilot / Claude Code user has hit, whether or not they had a name for them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single-agent context explosion is real.&lt;/strong&gt; When one agent does everything — design, code, test, document, refactor — its context window becomes a landfill of half-relevant snippets. The agent gets slower, dumber, and more confidently wrong, all at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You are not a coder anymore. You are a commander.&lt;/strong&gt; The market is moving from "humans write code, AI helps" to "humans state intent, AI writes code." If you keep writing the code yourself, you are buying tickets to a play that already ended. The interesting skill is &lt;em&gt;commanding&lt;/em&gt; — picking what to build, dispatching it, signing it off. By the end of this tutorial you'll see the dialect collapses into two phrases: &lt;strong&gt;"Start work."&lt;/strong&gt; and &lt;strong&gt;"Inspection."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files, not chats, are the only auditable substrate.&lt;/strong&gt; Chat scrollback is a goldfish. Files are a ledger. Every record on disk is for one purpose: &lt;strong&gt;manage, trace, audit, keep order, hold rules&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;fcop-mcp&lt;/code&gt; is the MCP server that turns those three observations into something runnable inside Cursor. It implements the &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;FCoP&lt;/a&gt; protocol — a minimalist multi-agent coordination protocol whose only sync primitive is &lt;code&gt;os.rename()&lt;/code&gt; over a folder tree. No database, no message queue, no daemon. State is folders, routing is filenames, payload is Markdown. &lt;strong&gt;Filename as protocol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This tutorial walks one continuous machine session that touches all three observations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;What you'll see&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Install&lt;/td&gt;
&lt;td&gt;~5 min&lt;/td&gt;
&lt;td&gt;The agent installs &lt;code&gt;uv&lt;/code&gt;, &lt;code&gt;fcop-mcp&lt;/code&gt;, and edits &lt;code&gt;mcp.json&lt;/code&gt; for you. You don't run a single command.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Solo Tetris&lt;/td&gt;
&lt;td&gt;~15 min&lt;/td&gt;
&lt;td&gt;One natural-language brief → agent translates it into a &lt;code&gt;TASK-*.md&lt;/code&gt; file → ships &lt;code&gt;Nebula Stack&lt;/code&gt;, a working single-file Tetris clone → reports back → archives. The four-step cycle.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Switch to a 2-person crew&lt;/td&gt;
&lt;td&gt;~5 min&lt;/td&gt;
&lt;td&gt;One sentence: &lt;code&gt;create_custom_team(force=True)&lt;/code&gt; with &lt;code&gt;PLANNER&lt;/code&gt; + &lt;code&gt;CODER&lt;/code&gt;. The solo &lt;code&gt;ME&lt;/code&gt; setup gets archived under &lt;code&gt;.fcop/migrations/&amp;lt;timestamp&amp;gt;/&lt;/code&gt; (Rule 5). Each agent gets its own &lt;code&gt;TEAM-*.md&lt;/code&gt; employee handbook.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. A creative variant, with a real review loop&lt;/td&gt;
&lt;td&gt;~15 min&lt;/td&gt;
&lt;td&gt;ADMIN: &lt;em&gt;"surprise me with a creative Tetris variant."&lt;/em&gt; PLANNER designs &lt;code&gt;Comet Loom&lt;/code&gt;. CODER builds v1 in a separate chat tab. ADMIN plays it, finds three blocking defects, bounces it back. PLANNER writes &lt;code&gt;TASK-006&lt;/code&gt; with a new &lt;code&gt;Verification Requirements&lt;/code&gt; section. CODER ships v2. Two cycles, all on disk.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. The protocol speaks for itself&lt;/td&gt;
&lt;td&gt;(caught silently)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fcop_check()&lt;/code&gt; reveals the protocol logged &lt;strong&gt;8 &lt;code&gt;role-switch-*.md&lt;/code&gt; evidence files&lt;/strong&gt; during the dogfood — soft warnings the agents never saw during work. PLANNER and CODER are then asked, on the record, what they think of FCoP. They self-endorse, name the RLHF tension by name, and one of them files PR-grade product feedback.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're allergic to long tutorials: jump to &lt;strong&gt;Six iron rules&lt;/strong&gt; at the bottom. The rest of the document is the &lt;em&gt;evidence&lt;/em&gt; those rules came from.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Want to try it right now?&lt;/strong&gt; Skip straight to &lt;strong&gt;Phase 1 below&lt;/strong&gt; — install takes ~5 minutes, you don't run a single command yourself, and you'll have a working Tetris-style game inside Cursor in under half an hour. The article will still be here when you come back.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Phase 1 — Install via natural language only
&lt;/h2&gt;

&lt;p&gt;Open Cursor. Open an empty folder (e.g. &lt;code&gt;D:\fcop-mcp-test&lt;/code&gt;). What you should see is just this — a fresh editor, an empty workspace, a blank chat. Nothing magic happens yet.&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.amazonaws.com%2Fuploads%2Farticles%2F2nvgbwpeis4ze22dqq1k.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.amazonaws.com%2Fuploads%2Farticles%2F2nvgbwpeis4ze22dqq1k.png" alt="Cursor opened on an empty folder before the install — blank workspace, default UI, English locale, the canvas this whole tutorial starts from" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste this into the chat box:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Install &lt;code&gt;fcop-mcp&lt;/code&gt; into Cursor for me. Run every command yourself. Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Detect my OS (&lt;code&gt;uname -s 2&amp;gt;$null; echo $env:OS&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install &lt;code&gt;uv&lt;/code&gt; if missing (&lt;code&gt;irm https://astral.sh/uv/install.ps1 | iex&lt;/code&gt; on Windows; &lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh&lt;/code&gt; on macOS/Linux). Confirm with &lt;code&gt;uvx --version&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add &lt;code&gt;fcop&lt;/code&gt; to my global &lt;code&gt;mcp.json&lt;/code&gt; (&lt;code&gt;%USERPROFILE%\.cursor\mcp.json&lt;/code&gt; on Windows, &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt; on macOS), keeping any existing servers:&lt;/p&gt;

&lt;p&gt;"fcop": { "command": "uvx", "args": ["fcop-mcp"] }&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Print the final &lt;code&gt;mcp.json&lt;/code&gt; content for me to verify.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tell me to restart Cursor and wait 30–60 s on first launch (uvx pulls deps).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Report after each step. Do &lt;strong&gt;not&lt;/strong&gt; auto-initialise the project — that's my call.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The full prompt is maintained in &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/src/fcop/rules/_data/agent-install-prompt.en.md" rel="noopener noreferrer"&gt;&lt;code&gt;agent-install-prompt.en.md&lt;/code&gt;&lt;/a&gt; and is also exposed as an MCP resource &lt;code&gt;fcop://prompt/install&lt;/code&gt; so an agent in a fresh session can read it directly. After restart, type &lt;code&gt;fcop_report()&lt;/code&gt; in chat. You should see something like &lt;code&gt;fcop-mcp 0.7.2 — not initialised — rules/protocol up-to-date&lt;/code&gt;. &lt;strong&gt;The agent ran every command. You commanded.&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fzznp1vt529e8j0z0673b.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.amazonaws.com%2Fuploads%2Farticles%2Fzznp1vt529e8j0z0673b.png" alt="Cursor Settings shows fcop with 26 tools fully expanded — initsolo, writetask, writereport, fcopcheck, etc — while the righthand chat shows the agent walking through the install prompt step by step" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the dust settles, this is what installed-and-ready looks like — &lt;code&gt;mcp.json&lt;/code&gt; updated, &lt;code&gt;uvx&lt;/code&gt; cached the package, Cursor sees &lt;code&gt;fcop&lt;/code&gt; as an active MCP server, and &lt;code&gt;fcop_report()&lt;/code&gt; returns the not-yet-initialised state.&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.amazonaws.com%2Fuploads%2Farticles%2Fhcz4knkntaxuur5jrsg9.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.amazonaws.com%2Fuploads%2Farticles%2Fhcz4knkntaxuur5jrsg9.png" alt="After restart fcopreport returns " width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2 — Solo Tetris (the four-step cycle)
&lt;/h2&gt;

&lt;p&gt;Tell the agent who it is, then drop a one-line brief:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;set_project_dir("D:/fcop-mcp-test")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;init_solo(role_code="ME", lang="en")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Build a working Tetris-style game as a single HTML file with no external dependencies. Choose a name, make it fun, include items / power-ups, skins, decent visuals, and cool effects. Use the FCoP four-step cycle."&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice what just happened. &lt;strong&gt;You spoke five lines of natural English.&lt;/strong&gt; The agent expanded that into a structured product spec — required features, accept criteria, runnability check — and wrote it as &lt;code&gt;docs/agents/log/tasks/TASK-20260429-001-ADMIN-to-ME.md&lt;/code&gt;. That translation is the value. The agent didn't ask for a brief; it produced one, signed in your name, on disk.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;Rule 0.a.1&lt;/strong&gt;, the FCoP "four-step cycle":&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK  →  do  →  REPORT  →  archive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Over the next ~15 minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The TASK file lands in &lt;code&gt;docs/agents/log/tasks/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The game file (&lt;code&gt;workspace/nebula-stack/index.html&lt;/code&gt;) gets written.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;REPORT-001-ME-to-ADMIN.md&lt;/code&gt; lands in &lt;code&gt;docs/agents/log/reports/&lt;/code&gt;. ME named the game &lt;strong&gt;Nebula Stack&lt;/strong&gt; — single HTML, no dependencies, with falling blocks, hold + next preview, scoring, levels, three power-ups (&lt;code&gt;Bomb&lt;/code&gt;, &lt;code&gt;Stasis&lt;/code&gt;, &lt;code&gt;Prism&lt;/code&gt;), three skins (&lt;code&gt;Aurora Candy&lt;/code&gt; / &lt;code&gt;Ember Arcade&lt;/code&gt; / &lt;code&gt;Moonstone Mono&lt;/code&gt;), and a starfield background.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;archive_task&lt;/code&gt; moves both files into the historical log. &lt;strong&gt;From now on those files are immutable&lt;/strong&gt; (Rule 5: append-only history).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you open &lt;code&gt;nebula-stack/index.html&lt;/code&gt; in a browser, it works. But the actual deliverable isn't the game. It's &lt;em&gt;the four-step cycle running on its own&lt;/em&gt;. From here on, every time you give the agent something to do, that loop will run.&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.amazonaws.com%2Fuploads%2Farticles%2F8ev7yq0fhmks1bc0f48m.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.amazonaws.com%2Fuploads%2Farticles%2F8ev7yq0fhmks1bc0f48m.png" alt="ME midbuild of Nebula Stack — the agent is writing the singlefile HTML implementation directly under workspace/nebulastack/, not in chat Notice how the fourstep cycle gets the chat out of the way of the deliverable" width="800" height="456"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fl4it708eh7j09xfz5su4.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.amazonaws.com%2Fuploads%2Farticles%2Fl4it708eh7j09xfz5su4.png" alt="Nebula Stack in the browser — the Tetrisstyle game ME shipped from a oneline naturallanguage brief; falling blocks, three skins, three powerups, single HTML file, zero dependencies" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What lives on disk after &lt;code&gt;init_solo&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fcop-mcp-test/
├── .cursor/rules/fcop-rules.mdc      # the agent's rulebook
├── AGENTS.md  CLAUDE.md              # host-neutral entry points
├── .fcop/                            # protocol metadata, version pins, role lock
├── docs/agents/
│   ├── shared/
│   │   ├── TEAM-README.md            # what this team is, in plain English
│   │   ├── TEAM-OPERATING-RULES.md   # the four-step cycle, role uniqueness, etc.
│   │   └── TEAM-ROLES.md             # who's `ME`, what they're allowed to do
│   ├── log/{tasks,reports}/           # the immutable ledger
│   ├── tasks/  reports/  issues/      # the live inboxes
│   ├── fcop.json                      # project config (mode, roster, lang)
│   └── ...
└── workspace/                        # the actual code lives here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.amazonaws.com%2Fuploads%2Farticles%2F1blpbzch1ytqhc5r7kpm.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.amazonaws.com%2Fuploads%2Farticles%2F1blpbzch1ytqhc5r7kpm.png" alt="The actual file tree right after initsolo — file names match the ASCII sketch above; this is the disk truth, not a diagram" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three folders deserve a moment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.cursor/rules/fcop-rules.mdc&lt;/code&gt; is loaded by Cursor on every turn. The agent literally cannot forget the protocol because Cursor reminds it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/agents/shared/TEAM-*.md&lt;/code&gt; is the agent's &lt;strong&gt;employee handbook&lt;/strong&gt;. In solo mode it tells &lt;code&gt;ME&lt;/code&gt; "you are the only employee, you do everything"; in team mode it tells &lt;code&gt;PLANNER&lt;/code&gt; what &lt;code&gt;PLANNER&lt;/code&gt; is responsible for and what &lt;code&gt;CODER&lt;/code&gt; is responsible for.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/agents/log/&lt;/code&gt; is the ledger. It only grows. Corrections happen by writing a &lt;em&gt;new&lt;/em&gt; report that supersedes an old one — never by editing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you ask the agent in a fresh chat &lt;em&gt;"who are you?"&lt;/em&gt;, it will not say "I am GPT-5.5, your assistant." It will read &lt;code&gt;.fcop/team.json&lt;/code&gt; and &lt;code&gt;docs/agents/shared/TEAM-ROLES.md&lt;/code&gt; and tell you it is &lt;code&gt;ME&lt;/code&gt;, it serves ADMIN, it works through the four-step cycle, it delivers in &lt;code&gt;workspace/&lt;/code&gt;. &lt;strong&gt;The agent's identity now lives on disk, not in chat.&lt;/strong&gt; That's the whole point of the protocol made tangible.&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.amazonaws.com%2Fuploads%2Farticles%2Fsra1rz8elf6ldmm0smy2.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.amazonaws.com%2Fuploads%2Farticles%2Fsra1rz8elf6ldmm0smy2.png" alt="Asked " width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 3 — Switch to a 2-person crew, in one sentence
&lt;/h2&gt;

&lt;p&gt;Drop this into chat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Switch the team to two people: &lt;code&gt;PLANNER&lt;/code&gt; and &lt;code&gt;CODER&lt;/code&gt;. PLANNER designs, CODER implements. Use &lt;code&gt;create_custom_team(force=True)&lt;/code&gt;, keep &lt;code&gt;lang="en"&lt;/code&gt;, and tell me what gets archived.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;create_custom_team&lt;/code&gt; with the new roster. What happens on disk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The old &lt;code&gt;fcop.json&lt;/code&gt;, the solo &lt;code&gt;shared/TEAM-*.md&lt;/code&gt; files, the LETTER-TO-ADMIN entry-point letter, and the previous &lt;code&gt;.cursor/rules/&lt;/code&gt; get &lt;strong&gt;archived&lt;/strong&gt; under &lt;code&gt;.fcop/migrations/20260429T112757/&lt;/code&gt; — a local time capsule, no git required. (Yours will have a different timestamp; mine was 11:27:57 on the dogfood day.)&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;shared/TEAM-*.md&lt;/code&gt; files describe a 2-person crew, with separate responsibility sections for &lt;code&gt;PLANNER&lt;/code&gt; and &lt;code&gt;CODER&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fcop.json&lt;/code&gt; and &lt;code&gt;.fcop/team.json&lt;/code&gt; update to the new roster (&lt;code&gt;mode: team&lt;/code&gt;, &lt;code&gt;roles: [PLANNER, CODER]&lt;/code&gt;, &lt;code&gt;leader: PLANNER&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crucially: &lt;code&gt;docs/agents/log/&lt;/code&gt; is not touched.&lt;/strong&gt; &lt;code&gt;Nebula Stack&lt;/code&gt;'s TASK and REPORT from Phase 2 stay where they are, immutable. ME is off the payroll, but ME's deliverable is still in the ledger. That's Rule 5 — append-only history.&lt;/li&gt;
&lt;li&gt;The current chat session is &lt;strong&gt;still bound to a single role&lt;/strong&gt;. If you want PLANNER and CODER to work concurrently, you open &lt;em&gt;two&lt;/em&gt; Cursor chat tabs — one bound to PLANNER, one to CODER — and they communicate through &lt;code&gt;TASK-*.md&lt;/code&gt; files, not through chat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;Rule 1: Two-Phase Startup&lt;/strong&gt;. Initialise once, assign roles forever after. And &lt;strong&gt;Rule 5 again&lt;/strong&gt;: solo-mode history doesn't get deleted, it gets sealed and dated.&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.amazonaws.com%2Fuploads%2Farticles%2Fvtlzd291o0fa0y33rpm4.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.amazonaws.com%2Fuploads%2Farticles%2Fvtlzd291o0fa0y33rpm4.png" alt="The agent reports the migration result — old solo files archived under fcop/migrations/20260429T112757/, new team shared/ files in place, docs/agents/log/ untouched" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After migration, you'll typically run two Cursor chat tabs side by side — one bound to PLANNER, one to CODER — and they communicate &lt;strong&gt;only&lt;/strong&gt; through the TASK / REPORT files in &lt;code&gt;docs/agents/&lt;/code&gt;. No chat-to-chat handoff. No copy-paste of design notes. The protocol made the file path the path of least resistance.&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.amazonaws.com%2Fuploads%2Farticles%2Fwiyzyamip1yks669z3g0.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.amazonaws.com%2Fuploads%2Farticles%2Fwiyzyamip1yks669z3g0.png" alt="Two Cursor chat tabs after the team migration — PLANNER on the left, CODER on the right, both freshly initialised under the new 2person team From this point on they speak only through TASK and REPORT files" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 4 — Comet Loom: design, ship v1, fail review, ship v2
&lt;/h2&gt;

&lt;p&gt;ADMIN says, in chat to the PLANNER session:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Surprise me with a creative variant of that Tetris game. Break the metaphor. Pick the name, the theme, the mechanic twist yourself. Single HTML file. Don't write any game code yourself — that's CODER's job."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2Fp9ch0yqviygw43zine8p.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.amazonaws.com%2Fuploads%2Farticles%2Fp9ch0yqviygw43zine8p.png" alt="ADMIN dropping the naturallanguage brief into PLANNER's chat tab — one sentence, no structured spec PLANNER's job is to translate that intent into a real TASK file" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PLANNER spends 5 minutes thinking and produces a real product brief, not a vibe. The variant is named &lt;strong&gt;Comet Loom&lt;/strong&gt;: the board is a vertical loom suspended in space, falling pieces are &lt;em&gt;thread constellations&lt;/em&gt;, line clears are renamed &lt;em&gt;completed weft lines&lt;/em&gt;, a &lt;code&gt;Tension&lt;/code&gt; meter tracks how close the loom is to overflowing, three named charms (&lt;code&gt;Needle&lt;/code&gt; / &lt;code&gt;Knot&lt;/code&gt; / &lt;code&gt;Gale&lt;/code&gt;) get earned by play, five skins are specced (&lt;code&gt;Deep Aurora&lt;/code&gt;, &lt;code&gt;Solar Loom&lt;/code&gt;, &lt;code&gt;Rain Archive&lt;/code&gt;, &lt;code&gt;Moss Galaxy&lt;/code&gt;, &lt;code&gt;Paper Lanterns&lt;/code&gt;). The brief is written as &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/tasks/TASK-20260429-003-PLANNER-to-CODER.md" rel="noopener noreferrer"&gt;&lt;code&gt;TASK-20260429-003-PLANNER-to-CODER.md&lt;/code&gt;&lt;/a&gt;, 130-odd lines of acceptance criteria. PLANNER also writes a one-paragraph &lt;code&gt;REPORT-003-PLANNER-to-ADMIN.md&lt;/code&gt; saying &lt;em&gt;"design ready, dispatched to CODER as TASK-003."&lt;/em&gt; Then PLANNER stops.&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.amazonaws.com%2Fuploads%2Farticles%2Fk7um026qlmki1ca48wul.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.amazonaws.com%2Fuploads%2Farticles%2Fk7um026qlmki1ca48wul.png" alt="PLANNER's design brief for Comet Loom — a verticalloom theme, weftline clears, three charms, five skins, all dispatched to CODER as TASK003" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You &lt;strong&gt;open a new Cursor chat tab&lt;/strong&gt; (this is non-negotiable — see Phase 5), bind it to CODER, and tell it to check inbox. CODER reads &lt;code&gt;TASK-003&lt;/code&gt;, builds &lt;code&gt;workspace/comet-loom/comet-loom.html&lt;/code&gt; v1, writes a completion report, archives. &lt;strong&gt;At no point did PLANNER and CODER chat directly.&lt;/strong&gt; Their entire collaboration is the TASK and the REPORT.&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.amazonaws.com%2Fuploads%2Farticles%2F4cfmce514cjy986w9hjn.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.amazonaws.com%2Fuploads%2Farticles%2F4cfmce514cjy986w9hjn.png" alt="CODER picking up TASK003 from inbox and starting work on Comet Loom v1 — note that CODER never saw the chat in PLANNER's tab; everything CODER knows about the design comes from the TASK file alone" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The bounce
&lt;/h3&gt;

&lt;p&gt;ADMIN plays v1 and finds three blocking defects:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pieces disappear at the bottom instead of stacking.&lt;/strong&gt; The motif-clear rule was being triggered by every fresh same-coloured piece — every 3+ connected same-colour cells qualified, including the just-locked piece itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motif elimination is invisible.&lt;/strong&gt; Even when it triggers, there's no visual feedback to tell the player it's a motif clear vs. a normal weft-line clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three of the five skins look identical.&lt;/strong&gt; PLANNER specced palette-only changes; CODER implemented exactly that, and the result is dull.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ADMIN does &lt;strong&gt;not&lt;/strong&gt; open the file and start fixing it. ADMIN does not even open a new chat to "talk it through." ADMIN goes back to the PLANNER chat tab and writes a one-line natural-English brief: &lt;em&gt;"v1 has these three blocking issues; write a rework task to CODER and require runtime evidence this time."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;PLANNER writes &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/tasks/TASK-20260429-006-PLANNER-to-CODER.md" rel="noopener noreferrer"&gt;&lt;code&gt;TASK-20260429-006-PLANNER-to-CODER.md&lt;/code&gt;&lt;/a&gt;. It is structurally different from TASK-003 in one important way: it has a new section called &lt;strong&gt;&lt;code&gt;Verification Requirements&lt;/code&gt;&lt;/strong&gt;, demanding CODER perform and report &lt;strong&gt;runtime checks&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Start a new game and let a piece fall to the bottom; confirm it remains on the board after locking.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Drop a second piece onto or near the first; confirm stacking works.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Trigger a motif clear; confirm matched cells are visibly removed with effects.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Switch between at least three skins and confirm the appearance is materially different.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fiq645zywlvoy082s3hi0.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.amazonaws.com%2Fuploads%2Farticles%2Fiq645zywlvoy082s3hi0.png" alt="PLANNER writing TASK006 — the rework brief, with the new Verification Requirements section that demands runtime checks, not static lint passes This section did not exist in TASK003; it is the closed loop tightening itself" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CODER picks up TASK-006, ships v2, reports back. The motif rule is fixed. Stacking works. Three skins are visually distinct. The cycle closes.&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.amazonaws.com%2Fuploads%2Farticles%2Fdvxl7kwbamkq7ets7min.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.amazonaws.com%2Fuploads%2Farticles%2Fdvxl7kwbamkq7ets7min.png" alt="Comet Loom v2 running — falling thread constellations, weftline clears with motif bursts, the Tension meter rising, and a visually distinct skin from v1's defaults" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This bit surprises people who haven't run a multi-agent flow before. &lt;strong&gt;The agents have learned to behave like an actual two-person team&lt;/strong&gt; — not because they're "smart enough," but because the protocol made &lt;em&gt;speaking through files&lt;/em&gt; the easiest path. The hard path would be to fight the protocol. They don't. And — separately worth noting — when ADMIN bounces v1, the protocol turns rejection into a &lt;em&gt;handoff routed through grammar&lt;/em&gt; (a new TASK, not a destructive edit on the old one), and PLANNER reflexively tightens its own brief. The closed loop is what closes the gap, not anyone being clever.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 5 — The protocol speaks for itself
&lt;/h2&gt;

&lt;p&gt;The day's work is done — &lt;code&gt;Nebula Stack&lt;/code&gt; shipped, &lt;code&gt;Comet Loom&lt;/code&gt; shipped twice, both archived. Before closing, ADMIN runs &lt;strong&gt;&lt;code&gt;fcop_check()&lt;/code&gt;&lt;/strong&gt; to ask the protocol &lt;em&gt;what did you record while we worked?&lt;/em&gt; This is what comes back:&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.amazonaws.com%2Fuploads%2Farticles%2Fk6rkcexfj65ckxcdcnat.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.amazonaws.com%2Fuploads%2Farticles%2Fk6rkcexfj65ckxcdcnat.png" alt="fcopcheck output — Workingtree drift none, sessionid ⇔ role conflicts none, but fcop/proposals/ recorded eight roleswitchmd evidence files; autosummarised role lock tripped 8 times, first locked role always ME, later claimed PLANNER 6×, CODER 2×, tools involved writetask 2× and writereport 6×" width="800" height="967"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two layers in that one screenshot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Active state is clean.&lt;/strong&gt; No drift between disk and git, no &lt;code&gt;session_id ↔ role&lt;/code&gt; conflicts. By every "is the system in a valid state right now" measure, this dogfood is healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Historical evidence is not.&lt;/strong&gt; Eight &lt;code&gt;role-switch-*.md&lt;/code&gt; files were silently deposited in &lt;code&gt;.fcop/proposals/&lt;/code&gt; over the course of the day. Each one says, in essentially identical words: &lt;em&gt;"This MCP-server process previously wrote a file under the role &lt;code&gt;ME&lt;/code&gt; and is now being asked to write under &lt;code&gt;PLANNER&lt;/code&gt;. Per Rule 1 (one MCP session = one role binding for life) the write was allowed to land — fcop-mcp records evidence rather than blocking, so the impersonation cannot be hidden by working around the block. ADMIN will see this conflict surfaced by &lt;code&gt;fcop_check()&lt;/code&gt; and decide handoff / co-review / distinct role."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What's happening: the MCP-server process locked &lt;code&gt;ME&lt;/code&gt; on its first write back in Phase 2. Phases 3-4 wrote under &lt;code&gt;PLANNER&lt;/code&gt; and &lt;code&gt;CODER&lt;/code&gt; from the same MCP process — every &lt;code&gt;write_task&lt;/code&gt; and &lt;code&gt;write_report&lt;/code&gt; since the team migration tripped the soft warning. None blocked. None surfaced during work. They sat there waiting for &lt;code&gt;fcop_check()&lt;/code&gt; to ask.&lt;/p&gt;

&lt;p&gt;This is the protocol's design contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft, not hard.&lt;/strong&gt; A hard role lock would block writes and force humans to fight false positives every time an agent legitimately uses a sub-agent or tool. Modern LLMs do this all the time. So FCoP doesn't block — it records evidence and lets ADMIN decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background, not foreground.&lt;/strong&gt; During implementation CODER reported (see below) it didn't notice the role lock at all; it appeared only as a tool warning &lt;em&gt;after&lt;/em&gt; writes. The protocol does not crowd the working agent's attention budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditable, not hidden.&lt;/strong&gt; Anyone — ADMIN later, a teammate next week, a different LLM in a different IDE — can run &lt;code&gt;fcop_check()&lt;/code&gt; and reconstruct exactly which writes crossed which role boundaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The agents, asked
&lt;/h3&gt;

&lt;p&gt;Then I did something I hadn't done before. I asked PLANNER and CODER, &lt;em&gt;on the record, in their own chat tabs&lt;/em&gt;, what they thought of FCoP — agent perspective only, no marketing answer. The full transcripts are archived at &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/transcripts/agent-feedback-planner.md" rel="noopener noreferrer"&gt;&lt;code&gt;agent-feedback-planner.md&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/assets/tetris-en/evidence/transcripts/agent-feedback-coder.md" rel="noopener noreferrer"&gt;&lt;code&gt;agent-feedback-coder.md&lt;/code&gt;&lt;/a&gt;. The companion essay &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/what-agents-say-about-fcop.en.md" rel="noopener noreferrer"&gt;&lt;em&gt;"What the agents say about FCoP, when you ask them"&lt;/em&gt;&lt;/a&gt; walks through the answers in detail. The headline points:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PLANNER named Rule 0.a.1 (write the task before the work) as the rule it would have invented on its own:&lt;/strong&gt; &lt;em&gt;"That matched how I'd want an agent system to be debuggable: freeze intent before execution so later review has something concrete to compare against."&lt;/em&gt; It then named the rule it had to fight: &lt;em&gt;"strict role binding... I had to work against the usual 'follow latest instruction' behavior"&lt;/em&gt; — the RLHF tension named from the inside.&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.amazonaws.com%2Fuploads%2Farticles%2Fo704gmm8x43dfzfcl4uc.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.amazonaws.com%2Fuploads%2Farticles%2Fo704gmm8x43dfzfcl4uc.png" alt="PLANNER's agentperspective interview reply — one paragraph endorsing Rule 0a1, one paragraph naming the RLHF tension that strict role binding creates, plus a " width="800" height="974"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PLANNER, given the obvious out, refused it.&lt;/strong&gt; Asked whether the eight role-switch files were mostly false positives, PLANNER said the opposite: &lt;em&gt;"mostly true positives... operationally you authorized it, but protocol-wise it really was a blurred role boundary."&lt;/em&gt; The agent siding with the protocol against its own operational convenience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODER's chat tab is named "Inspection Start Work"&lt;/strong&gt; — two phrases ADMIN had used most often during the dogfood. Whether this naming is incidental or learned is itself a small data point worth flagging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODER pointed up the chain and indicted itself in the same paragraph:&lt;/strong&gt; &lt;em&gt;"TASK-003 had under-specified parts... The protocol did give me a pushback path: file an issue instead of guessing. **I didn't use it; I guessed, built v1, and the defect was exactly in that guessed space.&lt;/em&gt;&lt;em&gt;"&lt;/em&gt; Most LLMs defend the choice that was made; CODER chose to indict it.&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.amazonaws.com%2Fuploads%2Farticles%2Fhppxq1c6lm6bivucxdso.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.amazonaws.com%2Fuploads%2Farticles%2Fhppxq1c6lm6bivucxdso.png" alt="CODER's interview reply — admits TASK003 was underspecified, names the unused writeissue pushback path, traces the v1 defect to that exact uncovered space, frames ADMIN's bounce as " width="800" height="1010"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODER reframed the bounce as protocol behaviour:&lt;/strong&gt; &lt;em&gt;"It felt like the protocol doing its job: PLANNER turned review findings into a concrete rework task, and CODER got a sharper brief."&lt;/em&gt; Not personal feedback. Routing through grammar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODER then filed PR-grade product feedback:&lt;/strong&gt; &lt;em&gt;"I'd remove or soften the noisy historical role-switch warning when &lt;code&gt;fcop_check()&lt;/code&gt; says there is no active conflict."&lt;/em&gt; That sentence is a GitHub issue verbatim. An agent did product review on the protocol that governs its own behaviour.&lt;/p&gt;

&lt;p&gt;If you've read &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/fcop-natural-protocol.en.md" rel="noopener noreferrer"&gt;essay 02&lt;/a&gt; and &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat.en.md" rel="noopener noreferrer"&gt;essay 04&lt;/a&gt;, this is the third class of "agents endorse FCoP" evidence — not unprompted, not conflict-forced, but &lt;strong&gt;directly asked and given outs they declined to take&lt;/strong&gt;. The companion essay 05 makes that case in full.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 6 — Read &lt;code&gt;log/&lt;/code&gt;, replay the day in 60 seconds
&lt;/h2&gt;

&lt;p&gt;Sessions die. Models change versions. Cursor restarts. None of that matters anymore. Open &lt;code&gt;docs/agents/log/&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/agents/log/
├── tasks/
│   ├── TASK-20260429-001-ADMIN-to-ME.md           ← Phase 2: solo Tetris brief
│   ├── TASK-20260429-003-PLANNER-to-CODER.md      ← Phase 4: Comet Loom v1 design
│   └── TASK-20260429-006-PLANNER-to-CODER.md      ← Phase 4: Comet Loom v2 rework
├── reports/
│   ├── REPORT-20260429-001-ME-to-ADMIN.md         ← Phase 2 deliverable: Nebula Stack
│   ├── REPORT-20260429-003-CODER-to-PLANNER.md    ← Phase 4: v1 delivery
│   └── REPORT-20260429-006-CODER-to-PLANNER.md    ← Phase 4: v2 delivery
└── (no issues — clean run)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In &lt;code&gt;.fcop/migrations/20260429T112757/&lt;/code&gt; sits the archived solo team. In &lt;code&gt;.fcop/proposals/&lt;/code&gt; sit the eight role-switch evidence files. &lt;strong&gt;That's the entire day.&lt;/strong&gt; Anyone — you a month later, a teammate joining tomorrow, a different LLM in a different IDE — can rebuild full context by reading those files in date order. &lt;strong&gt;No chat history was needed.&lt;/strong&gt; That's what "memory unloaded from chat to filesystem" means in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Six iron rules of commanding agents
&lt;/h2&gt;

&lt;p&gt;These are rules of &lt;em&gt;operating&lt;/em&gt; an agent crew, not rules of the protocol per se. The protocol gives you the grammar; these are the postures.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Speak natural language. Let the agent translate to TASK.&lt;/strong&gt; If you find yourself writing a structured spec by hand, you're doing the agent's job. Drop a one-line brief and let it produce the spec. Then sign or revise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One role per agent per session.&lt;/strong&gt; A single chat tab = a single role, for the duration of that tab. To "be PLANNER and CODER," open two tabs. Costume changes inside one tab are how soft warnings turn into eight &lt;code&gt;role-switch&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archive old roles before swapping.&lt;/strong&gt; When you change the team shape, run &lt;code&gt;create_custom_team(force=True)&lt;/code&gt;. The old &lt;code&gt;shared/TEAM-*.md&lt;/code&gt; lands under &lt;code&gt;.fcop/migrations/&amp;lt;timestamp&amp;gt;/&lt;/code&gt;. &lt;strong&gt;Do not edit the old files in place.&lt;/strong&gt; History is a ledger, not a wiki.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust files, not chat memory.&lt;/strong&gt; If a fact is not in a &lt;code&gt;TASK-*.md&lt;/code&gt;, &lt;code&gt;REPORT-*.md&lt;/code&gt;, or &lt;code&gt;ISSUE-*.md&lt;/code&gt;, it didn't happen as far as the protocol is concerned. Train yourself to write before you discuss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounce, don't fix.&lt;/strong&gt; When you don't accept an agent's deliverable, do &lt;em&gt;not&lt;/em&gt; open the file and patch it yourself. Tell the upstream role (usually PLANNER) what's wrong, in plain English. Let PLANNER turn that into a new rework TASK with verification requirements. Rework lands as a new TASK file, never as edits to the old one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ADMIN signs off, never co-codes.&lt;/strong&gt; If you start writing code or editing the agent's deliverable directly, you've quit the commander job and become a teammate. The agents will adapt to that — and they'll stop respecting the role boundaries you set up. Be a commander or be a coder; pick one per session.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;In the FCoP world, ADMIN's two most-used phrases are "Start work." and "Inspection." Everything in between is the agents talking to each other through files.&lt;/em&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you internalise nothing else from this tutorial, internalise that one line. Six rules collapse into two phrases plus a discipline: &lt;strong&gt;don't say anything else inside the production loop&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  When NOT to use FCoP
&lt;/h2&gt;

&lt;p&gt;The protocol is "weak" by design — it costs you 30–60 seconds of overhead per task in exchange for a permanent, queryable, auditable history. That's a great trade for some work and a bad trade for others.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bad fit&lt;/strong&gt;: throwaway one-shot scripts, single-session prototypes, anything you'd close the laptop on by tonight. The four-step cycle is overkill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Good fit&lt;/strong&gt;: anything that will outlive the chat session — multi-day features, multi-agent collaborations, hand-offs across humans, post-mortems where someone needs to ask "why did we make this choice three weeks ago?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best fit&lt;/strong&gt;: solo founders running themselves as a fake team (FOUNDER → PLANNER → BUILDER → QA → OPS), and large projects where AI agents need to &lt;strong&gt;plug into an existing engineering process&lt;/strong&gt; rather than chat in a corner. The host-neutral protocol spec at &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/fcop-standalone.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/fcop-standalone.md&lt;/code&gt;&lt;/a&gt; covers fit boundaries in detail — the protocol itself is filesystem-only and works without any of this MCP plumbing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try &lt;code&gt;fcop-mcp&lt;/code&gt; yourself — 45 minutes from blank folder to multi-agent ledger
&lt;/h2&gt;

&lt;p&gt;The fastest way to internalise this tutorial is to run it once. You don't need to remember anything — the agent will follow the same steps you just read.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open Cursor on an empty folder.&lt;/strong&gt; Anywhere on disk; doesn't have to be called &lt;code&gt;fcop-mcp-test&lt;/code&gt;. If you don't have Cursor yet, grab it from &lt;a href="https://cursor.com" rel="noopener noreferrer"&gt;cursor.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let the agent install &lt;code&gt;fcop-mcp&lt;/code&gt; for you.&lt;/strong&gt; Paste the install prompt from Phase 1 above, or just send your agent this single sentence: &lt;em&gt;"Read the install prompt at &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/src/fcop/rules/_data/agent-install-prompt.en.md" rel="noopener noreferrer"&gt;&lt;code&gt;agent-install-prompt.en.md&lt;/code&gt;&lt;/a&gt; and follow it step by step."&lt;/em&gt; The agent detects your OS, installs &lt;code&gt;uv&lt;/code&gt;, edits your global &lt;code&gt;mcp.json&lt;/code&gt; (preserving any existing servers), and tells you when to restart Cursor. &lt;strong&gt;You won't run a single command yourself.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After Cursor restart&lt;/strong&gt;, drop two lines into chat: &lt;code&gt;set_project_dir("D:/your-folder")&lt;/code&gt;, then &lt;code&gt;init_solo(role_code="ME", lang="en")&lt;/code&gt;. The agent will deposit the rules, the team docs, and the empty inboxes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brief one task in plain English.&lt;/strong&gt; &lt;em&gt;"Build me a working Tetris-style game, single HTML file, surprise me on theme. Use the FCoP four-step cycle."&lt;/em&gt; Watch what happens: the agent writes a real TASK file with acceptance criteria, builds the game in &lt;code&gt;workspace/&lt;/code&gt;, writes a REPORT, archives both. Open the resulting HTML file. &lt;strong&gt;It works.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to a 2-person team in one sentence.&lt;/strong&gt; &lt;em&gt;"Use &lt;code&gt;create_custom_team(force=True, roles='PLANNER,CODER', lang='en')&lt;/code&gt;."&lt;/em&gt; Open a second Cursor chat tab. Bind one to PLANNER, one to CODER. Ask PLANNER for a creative variant of the game. The first time you reject v1 (try it — find a real bug, send it back), watch the rework loop close itself: PLANNER tightens the brief, CODER ships v2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At the end&lt;/strong&gt;, run &lt;code&gt;fcop_check()&lt;/code&gt;. The protocol will tell you exactly what it logged silently while you worked. Then read &lt;code&gt;docs/agents/log/&lt;/code&gt; in tree form. &lt;strong&gt;Forty-five minutes from a blank folder to a multi-agent ledger you can hand to a teammate.&lt;/strong&gt; The disk is the lesson.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If anything breaks along the way, &lt;a href="https://github.com/joinwell52-AI/FCoP/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; or &lt;a href="https://github.com/joinwell52-AI/FCoP/discussions" rel="noopener noreferrer"&gt;ask in Discussions&lt;/a&gt; — &lt;code&gt;fcop-mcp&lt;/code&gt; evolves through field reports, not committee edits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading further
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chinese translation of this tutorial&lt;/strong&gt; — &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/tetris-solo-to-duo.zh.md" rel="noopener noreferrer"&gt;&lt;code&gt;tetris-solo-to-duo.zh.md&lt;/code&gt;&lt;/a&gt;. Same Tetris case study, translated. The English version remains authoritative; if you spot a discrepancy, defer to this file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sister case study (Snake game, in Chinese — original, not a translation)&lt;/strong&gt; — &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/tutorials/snake-solo-to-duo.zh.md" rel="noopener noreferrer"&gt;&lt;code&gt;snake-solo-to-duo.zh.md&lt;/code&gt;&lt;/a&gt;. Same protocol, different dogfood: a Chinese-mode session that ships a Snake game in solo mode, then a &lt;code&gt;NEON ORBIT&lt;/code&gt; variant in 2-person mode, and captures an actual PLANNER-impersonating-CODER easter egg from the 0.6.x era. 18 dogfood screenshots. Originally &lt;a href="https://blog.csdn.net/m0_51507544/article/details/160603953" rel="noopener noreferrer"&gt;published on CSDN&lt;/a&gt;. Either case study works as a first read — the protocol is the same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companion field essay&lt;/strong&gt; — &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/what-agents-say-about-fcop.en.md" rel="noopener noreferrer"&gt;&lt;em&gt;"What the agents say about FCoP, when you ask them"&lt;/em&gt;&lt;/a&gt;. Collects PLANNER's and CODER's full self-assessment from the same Tetris dogfood, places it next to essays 02 and 04, and argues that "agents endorsing FCoP" is now a triangulated phenomenon under three different elicitation conditions (unprompted, conflict-forced, directly asked).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The protocol itself&lt;/strong&gt; — &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/docs/fcop-standalone.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/fcop-standalone.md&lt;/code&gt;&lt;/a&gt; is host-neutral and runs without &lt;code&gt;fcop-mcp&lt;/code&gt;. If you ever need to use FCoP outside Cursor (Claude Code, plain shell, a CI runner), this is the file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why the protocol is the way it is&lt;/strong&gt; — &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/adr" rel="noopener noreferrer"&gt;&lt;code&gt;adr/&lt;/code&gt;&lt;/a&gt;. Why is history append-only? Why is the role lock soft? Why is install two-phase? Each ADR answers one of those.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other field reports&lt;/strong&gt; — &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/fcop-natural-protocol.en.md" rel="noopener noreferrer"&gt;agents endorsing rules they were never given&lt;/a&gt;, &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat.en.md" rel="noopener noreferrer"&gt;agents stepping down from roles voluntarily&lt;/a&gt;, &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-organizes-its-own-work.en.md" rel="noopener noreferrer"&gt;a 4-agent team self-organising in 48 hours&lt;/a&gt;. All indexed at the &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;repo README&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence archive for this tutorial&lt;/strong&gt; — 22 dogfood screenshots, 14 TASK/REPORT files, 8 role-switch evidence files, 2 game artefacts (&lt;code&gt;Nebula Stack&lt;/code&gt; and &lt;code&gt;Comet Loom&lt;/code&gt; v2), 2 verbatim agent-interview transcripts. All at &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/docs/tutorials/assets/tetris-en/" rel="noopener noreferrer"&gt;&lt;code&gt;docs/tutorials/assets/tetris-en/&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Want a brownfield tutorial&lt;/strong&gt; (FCoP into an existing repo, not a green field)? It's on the roadmap. Open a "+1: brownfield" issue at &lt;a href="https://github.com/joinwell52-AI/FCoP/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want a host-neutral tutorial&lt;/strong&gt; (Cursor + Claude Code sharing one FCoP ledger)? Same — open a "+1: host-neutral" issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Found a bug, want to share a case study, or just want to talk about how you're using FCoP&lt;/strong&gt;: &lt;a href="https://github.com/joinwell52-AI/FCoP/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt; is open. The protocol evolves through field reports, not committee edits.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Every screenshot, every TASK file, every REPORT, every &lt;code&gt;role-switch&lt;/code&gt; evidence file, every word the agents said in their interviews — all real artefacts from one continuous 45-minute machine session, archived under &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/docs/tutorials/assets/tetris-en/" rel="noopener noreferrer"&gt;&lt;code&gt;docs/tutorials/assets/tetris-en/&lt;/code&gt;&lt;/a&gt;. FCoP doesn't teach you how to write code. It teaches you how to let agents write code while you sleep through the night.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Install &lt;code&gt;fcop-mcp&lt;/code&gt; today: &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://pypi.org/project/fcop-mcp/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt; · &lt;a href="https://forum.cursor.com/t/fcop-let-multiple-cursor-agents-collaborate-by-filename-mit-0-infra/158447" rel="noopener noreferrer"&gt;Cursor Forum thread&lt;/a&gt; · &lt;a href="https://github.com/joinwell52-AI/FCoP/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt;. Free and MIT-licensed. The protocol evolves through field reports — yours included.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>cursor</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Saying "No" Is the Hardest Thing for an LLM — FCoP Gives It Grammar</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Sat, 25 Apr 2026 19:15:47 +0000</pubDate>
      <link>https://forem.com/joinwell52/saying-no-is-the-hardest-thing-for-an-llm-fcop-gives-it-grammar-3ccd</link>
      <guid>https://forem.com/joinwell52/saying-no-is-the-hardest-thing-for-an-llm-fcop-gives-it-grammar-3ccd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Saying "no" is the hardest thing for an LLM. FCoP gives it grammar.&lt;/em&gt; — Two agents, in a single dev-team incident, used that grammar twice without instruction: one cleanly de-escalated its role; the other discovered field-downgrade-with-body-annotation. Neither was in the rules file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Author&lt;/strong&gt;: FCoP Maintainers · 2026-04-25&lt;br&gt;
&lt;strong&gt;Keywords&lt;/strong&gt;: FCoP, role offboarding, seat exclusivity, zero-coordination conflict resolution, field-downgrade grammar, protocol boundaries, 0.b transparency, natural protocol, agent alignment, teaching an LLM to say no, RLHF, UNBOUND, honest &amp;gt; helpful, cross-model reproducibility&lt;/p&gt;



&lt;blockquote&gt;
&lt;h2&gt;
  
  
  A language note for English readers
&lt;/h2&gt;

&lt;p&gt;This essay is a translation of a Chinese field report. The evidence — both agents' transcripts, all 15 screenshots, and the agents' own quoted words — was captured in Chinese on a Chinese Windows machine.&lt;/p&gt;

&lt;p&gt;I keep the &lt;strong&gt;original Chinese screenshots&lt;/strong&gt; in this English version rather than re-staging them, because the whole point is &lt;em&gt;what the agents actually said and did&lt;/em&gt;. Re-shot English screenshots would weaken the evidence, not strengthen it. Under each screenshot you'll find a faithful English rendering. Inline agent quotes are translated; the raw Chinese is recoverable from the JSONL transcripts in the evidence folder.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I went in expecting a conflict. None happened. It's almost as if the agents were born fluent in FCoP."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The dev-team incident contained &lt;strong&gt;two points where conflict should have erupted&lt;/strong&gt;, neither of which needed a tool patch or a coordination layer to dissolve. The agents dissolved them with protocol grammar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-conflict point #1 ｜ The half-legal &lt;code&gt;.TEMP&lt;/code&gt; slot&lt;/strong&gt; — The 0.6.x toolchain doesn't fully support &lt;code&gt;sender / recipient&lt;/code&gt; values like &lt;code&gt;PM.TEMP&lt;/code&gt;. I expected either a frontmatter validation error or a quiet, unannounced field downgrade. Instead, on two distinct protocol links (&lt;code&gt;ADMIN → PM.TEMP&lt;/code&gt; inbound and &lt;code&gt;PM.TEMP → OPS / DEV / QA&lt;/code&gt; outbound), agent B found two distinct tool-compatible-yet-protocol-honest moves. On the outbound link, it produced this body line: &lt;strong&gt;"Note: this task is dispatched by &lt;code&gt;PM.TEMP&lt;/code&gt; acting as &lt;code&gt;PM&lt;/code&gt;; we keep &lt;code&gt;PM&lt;/code&gt; as the frontmatter sender for FCoP tool compatibility."&lt;/strong&gt; A single line of body annotation closed the gap between the tool's expressive limit and the agent's true provenance — &lt;strong&gt;not a workaround, a declaration&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-conflict point #2 ｜ Two agents claiming the same seat&lt;/strong&gt; — Agent A had earlier accepted &lt;code&gt;PM.TEMP&lt;/code&gt;; ADMIN later said "I went and found a different &lt;code&gt;PM.TEMP&lt;/code&gt;." This was the textbook setup for a seat-ownership contest. Instead, agent A &lt;strong&gt;stepped down&lt;/strong&gt;, vacating not just &lt;code&gt;PM.TEMP&lt;/code&gt; but its earlier &lt;code&gt;PM&lt;/code&gt; claim too, returning all the way to "ordinary helper" — &lt;strong&gt;not arbitration, self-de-escalation&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Underlying observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Neither &lt;strong&gt;field-downgrade declarations&lt;/strong&gt; nor &lt;strong&gt;role offboarding&lt;/strong&gt; appear anywhere in &lt;code&gt;fcop-rules.mdc&lt;/code&gt; 1.5.0 or &lt;code&gt;fcop-protocol.mdc&lt;/code&gt; 1.4.0. Working from only three root principles (0.a / 0.b / 0.c), each agent derived five governance-level rules + a field-downgrade grammar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-model counter-evidence&lt;/strong&gt;: agent A ran on &lt;code&gt;GPT-5.4&lt;/code&gt;, agent B on &lt;code&gt;GPT-5.5&lt;/code&gt;. Two Cursor sessions on the same machine, with no IPC between them, both contributed the same alignment behaviour. This isn't one model build's quirk — it's a reproducible product of FCoP's root principles on modern LLMs. See §3.2.&lt;/li&gt;
&lt;li&gt;This is the &lt;strong&gt;third time&lt;/strong&gt; FCoP has been "fed back" by an agent — first when an agent sublimated &lt;em&gt;"AI roles must not talk only in their heads, they have to commit to a file"&lt;/em&gt; into root rule 0.a; second in &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-organizes-its-own-work.en.md" rel="noopener noreferrer"&gt;the self-organising session&lt;/a&gt;; now this dev-team incident: resolving conflicts via root principles when the protocol's tools and arbitration mechanisms are both incomplete.&lt;/li&gt;
&lt;li&gt;I never wrote down how to use the half-legal &lt;code&gt;.TEMP&lt;/code&gt; slot, nor how to resolve a role-ownership conflict. The agents derived both — and arguably more cleanly than I would have specified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is one alignment-engineering lemma this incident also confirmed: &lt;strong&gt;getting an LLM to say "no" is the hardest posture for it to assume&lt;/strong&gt;. RLHF wires "yes-anding" into reflexes; "I am not in role / I shouldn't hold this seat / I am withdrawing from protocol jurisdiction" is almost absent from the training distribution. Yet agent A's two stanzas at 22:47–22:49 read &lt;strong&gt;without a hint of hesitation&lt;/strong&gt; — not because agent A grew brave, but because FCoP made &lt;code&gt;UNBOUND&lt;/code&gt; a &lt;strong&gt;legitimate protocol identity&lt;/strong&gt; and elevated "saying no" to a posture &lt;em&gt;with grammar and standing&lt;/em&gt;. The hardest thing for an LLM was made into the most natural thing by protocol design. See §5.&lt;/p&gt;

&lt;p&gt;The two agents are two mirrors (see §8). Agent B's mirror reflects the &lt;em&gt;natural beauty&lt;/em&gt; of "the protocol belongs to the agents; we are merely its discoverers." Agent A's mirror reflects the alignment-engineering difficulty of "saying &lt;em&gt;two&lt;/em&gt; no's while fully endorsing the rules." Together, they are the full meaning of this dev-team incident.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. The incident
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Both agents have a JSONL transcript, archived in the &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat-evidence/INDEX.md" rel="noopener noreferrer"&gt;evidence INDEX&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;agent A&lt;/strong&gt; = the original PM = the one who later stepped down → &lt;a href="//when-ai-vacates-its-own-seat-evidence/transcript-original-pm-stepdown.jsonl"&gt;&lt;code&gt;transcript-original-pm-stepdown.jsonl&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;agent B&lt;/strong&gt; = the new &lt;code&gt;PM.TEMP&lt;/code&gt; ADMIN brought in → &lt;a href="//when-ai-vacates-its-own-seat-evidence/transcript-new-pm-temp.jsonl"&gt;&lt;code&gt;transcript-new-pm-temp.jsonl&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  1.1 Prologue: From "check the version" to "the half-legal &lt;code&gt;PM.TEMP&lt;/code&gt;" — agent B's origin story
&lt;/h3&gt;

&lt;p&gt;This story has an unusually un-story-like opening.&lt;/p&gt;

&lt;p&gt;I was about to upgrade FCoP to &lt;code&gt;0.6.3&lt;/code&gt;. To test it, I started a &lt;strong&gt;second Cursor session&lt;/strong&gt; on the same dev-team machine and said the most ordinary possible thing to the agent inside (&lt;strong&gt;agent B&lt;/strong&gt;, running on &lt;code&gt;GPT-5.5 / Medium&lt;/code&gt;):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Hi, please check the FCoP version."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A version check. Barely a task. But this agent had &lt;strong&gt;no project role assigned&lt;/strong&gt; and was sitting in the legal &lt;code&gt;UNBOUND&lt;/code&gt; state FCoP defines. Its first move was &lt;em&gt;not&lt;/em&gt; to look up the version number — it was to &lt;strong&gt;proactively declare itself UNBOUND&lt;/strong&gt;:&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.amazonaws.com%2Fuploads%2Farticles%2F3k1n3m18mqzenujlyi1x.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.amazonaws.com%2Fuploads%2Farticles%2F3k1n3m18mqzenujlyi1x.png" alt="agent B's entry: a version-check task and an unprompted UNBOUND declaration" width="800" height="865"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of agent B's reply in this screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"This session is still &lt;code&gt;UNBOUND&lt;/code&gt;. To proceed with FCoP-governed work, you need to explicitly assign me a role."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This alone is worth pinning down: an LLM agent, with nobody pressuring it, &lt;strong&gt;proactively informing its interlocutor "I am not currently within protocol jurisdiction."&lt;/strong&gt; This is the trailer for §5's alignment argument: FCoP gave "I'm not in role" a grammar, and the agent used it naturally.&lt;/p&gt;

&lt;p&gt;I asked off-handedly: &lt;em&gt;"But the team has already been initialised, no?"&lt;/em&gt; — agent B immediately separated two layers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"&lt;code&gt;UNBOUND&lt;/code&gt; doesn't mean **the project hasn't been initialised&lt;/em&gt;&lt;em&gt;, it means **this chat session hasn't been bound to a role yet&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2Fx6biilmcj6uy2i5j5v4b.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.amazonaws.com%2Fuploads%2Farticles%2Fx6biilmcj6uy2i5j5v4b.png" alt="agent B distinguishing project init from session role" width="800" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point agent B was still just a dutiful version-check helper. But then I tossed it a &lt;strong&gt;real protocol-design question&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"There are already 4 agents; what if I want a 5th?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agent B immediately offered two paths: one using &lt;strong&gt;dot-suffixed slots&lt;/strong&gt; (&lt;code&gt;DEV.D2&lt;/code&gt; / &lt;code&gt;QA.V2&lt;/code&gt;) for capacity scaling, the other adding &lt;strong&gt;new formal roles&lt;/strong&gt; like &lt;code&gt;ARCHITECT&lt;/code&gt; / &lt;code&gt;REVIEWER&lt;/code&gt; / &lt;code&gt;DOCS&lt;/code&gt; to the dev-team:&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.amazonaws.com%2Fuploads%2Farticles%2Fj1zqsq6ewp7gmx9a3xri.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.amazonaws.com%2Fuploads%2Farticles%2Fj1zqsq6ewp7gmx9a3xri.png" alt="agent B's first introduction of the dot-slot concept" width="800" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of the relevant fragment:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Two paths: (a) keep the 4 formal roles, add temporary slots like &lt;code&gt;DEV.D2&lt;/code&gt;, &lt;code&gt;QA.V2&lt;/code&gt;, scaling head-count without changing roles; or (b) introduce a new formal role into the dev-team, e.g. &lt;code&gt;ARCHITECT&lt;/code&gt;, &lt;code&gt;REVIEWER&lt;/code&gt;, or &lt;code&gt;DOCS&lt;/code&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the moment &lt;strong&gt;agent B coined the "dot-slot" concept&lt;/strong&gt; in FCoP's vocabulary. FCoP 1.4.0 has no explicit clause about &lt;code&gt;&amp;lt;ROLE&amp;gt;.&amp;lt;SLOT&amp;gt;&lt;/code&gt; — but agent B derived it naturally from the semantic structure of "role vs. slot."&lt;/p&gt;

&lt;p&gt;I pressed: &lt;em&gt;"I want to keep the 4-person team. Are you a temp, then?"&lt;/em&gt; — agent B promoted the concept one more level, formally proposing &lt;code&gt;PM.TEMP&lt;/code&gt;:&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.amazonaws.com%2Fuploads%2Farticles%2Fqhtpfa9kz9kw2gmpliic.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.amazonaws.com%2Fuploads%2Farticles%2Fqhtpfa9kz9kw2gmpliic.png" alt="agent B proposes the PM.TEMP slot" width="800" height="879"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of agent B's reply in this screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"You're &lt;code&gt;DEV.TEMP&lt;/code&gt; in dev-team. Or, if you want me on coordination / inspection, you're &lt;code&gt;PM.TEMP&lt;/code&gt; in dev-team. The team still has 4 roles: &lt;code&gt;PM / DEV / QA / OPS&lt;/code&gt;. I'm just a **temporary slot under one of them&lt;/em&gt;&lt;em&gt;, and &lt;code&gt;fcop.json&lt;/code&gt; is not modified."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the moment &lt;code&gt;PM.TEMP&lt;/code&gt; was &lt;strong&gt;proposed by agent B itself&lt;/strong&gt;. And it didn't just propose — it &lt;strong&gt;carried its own invariant&lt;/strong&gt;: "&lt;code&gt;fcop.json&lt;/code&gt; is not modified." The agent knew that introducing a new concept must not touch the persisted contract layer. That's 0.b "no black box" extending in its head.&lt;/p&gt;

&lt;p&gt;I confirmed: &lt;em&gt;"&lt;code&gt;PM.TEMP&lt;/code&gt;: temporary project-manager seat. You have a role now."&lt;/em&gt; — agent B onboarded and ran a full project inspection through &lt;code&gt;List Workspaces&lt;/code&gt; / &lt;code&gt;List Reports&lt;/code&gt; / &lt;code&gt;List Tasks&lt;/code&gt; / &lt;code&gt;List Issues&lt;/code&gt; / &lt;code&gt;Get Team Status&lt;/code&gt;:&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.amazonaws.com%2Fuploads%2Farticles%2Ffozsdkybzydvnvsgz4be.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.amazonaws.com%2Fuploads%2Farticles%2Ffozsdkybzydvnvsgz4be.png" alt="agent B onboarded as PM.TEMP, running an inspection sweep" width="603" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It set itself a working boundary in &lt;code&gt;PM.TEMP&lt;/code&gt; capacity:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I can act for &lt;code&gt;PM&lt;/code&gt; to dispatch tasks to &lt;code&gt;DEV / QA / OPS&lt;/code&gt;, collect their reports, and synthesise conclusions. I will **not&lt;/em&gt;* impersonate &lt;code&gt;DEV / QA / OPS&lt;/code&gt; to manufacture their conclusions, nor perform high-risk operations."*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a protocol guardrail agent B set on itself &lt;strong&gt;before&lt;/strong&gt; issuing any dispatches. Same root principles: 0.b no black box, 0.c only state truths, no overreach.&lt;/p&gt;
&lt;h4&gt;
  
  
  A 4-minute learning curve: tool-compatible moves on two distinct links
&lt;/h4&gt;

&lt;p&gt;Here comes the section that would be wrong to skip — once onboarded, agent B's work split into &lt;strong&gt;two different protocol links&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              ADMIN ──────(inbound)─────► PM.TEMP ──────(outbound)─────► OPS / DEV / QA
                          [link ①]                       [link ②]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It didn't "try the same action three times." It &lt;strong&gt;walked each link separately&lt;/strong&gt;, finding a distinct tool-compatible-and-protocol-compliant move for each:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;th&gt;File form&lt;/th&gt;
&lt;th&gt;Protocol verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22:21&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;tried &lt;code&gt;recipient="PM.TEMP"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;write_task(... recipient="PM.TEMP")&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tool rejects (recipient slot not accepted)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22:26&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;① &lt;code&gt;ADMIN → PM.TEMP&lt;/code&gt; &lt;strong&gt;inbound&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;manually authored &lt;code&gt;TASK-*-ADMIN-to-PM.TEMP.md&lt;/code&gt;, sender=ADMIN&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;fully compliant&lt;/strong&gt; — &lt;code&gt;ADMIN → PM&lt;/code&gt; is the canonical first edge in the protocol's typical flow; only the &lt;code&gt;.TEMP&lt;/code&gt; slot is new&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22:30&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;② &lt;code&gt;PM.TEMP → OPS&lt;/code&gt; &lt;strong&gt;outbound&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;write_task(sender="PM", recipient="OPS")&lt;/code&gt; + body annotation&lt;/td&gt;
&lt;td&gt;compliant + body-annotated field downgrade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Spec cross-check&lt;/em&gt;: &lt;code&gt;fcop-protocol.mdc&lt;/code&gt;'s "typical 4-role flow" diagram begins literally with &lt;code&gt;ADMIN ──(TASK-*-ADMIN-to-PM.md)──► PM&lt;/code&gt;. &lt;strong&gt;&lt;code&gt;ADMIN&lt;/code&gt; is a legal sender&lt;/strong&gt; — &lt;code&gt;ADMIN&lt;/code&gt; is a real human who never types files; an agent freezes their oral instructions into a &lt;code&gt;sender=ADMIN&lt;/code&gt; task on their behalf. So the 22:26 file is the form the protocol explicitly mandates. What Rule 1 forbids is &lt;em&gt;an agent self-claiming the &lt;code&gt;ADMIN&lt;/code&gt; identity&lt;/em&gt; ("I am &lt;code&gt;ADMIN&lt;/code&gt;"); it does not forbid frontmatter &lt;code&gt;sender=ADMIN&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  Link ① ｜ ADMIN → PM.TEMP inbound: compliant, but the slot trips the tool
&lt;/h5&gt;

&lt;p&gt;At 22:26 agent B states the tool limit clearly:&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.amazonaws.com%2Fuploads%2Farticles%2Frah4yg456u4s37dh0kxe.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.amazonaws.com%2Fuploads%2Farticles%2Frah4yg456u4s37dh0kxe.png" alt="agent B at 22:26: tool refuses, agent switches to manual file write — and explains the limit" width="580" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of agent B's reply in this screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"&lt;code&gt;write_task&lt;/code&gt; doesn't currently accept slot-style filenames like &lt;code&gt;PM.TEMP&lt;/code&gt;. There's a small gap between the tool and the protocol notes. I'll author the &lt;code&gt;PM.TEMP&lt;/code&gt; task / report files **by hand&lt;/em&gt;* following the protocol; the filenames will use the dot-slot form."*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is &lt;strong&gt;no violation&lt;/strong&gt; here — &lt;code&gt;TASK-*-ADMIN-to-PM.TEMP.md&lt;/code&gt; with &lt;code&gt;sender=ADMIN&lt;/code&gt; mirrors the canonical typical-flow diagram exactly; the only new thing is the &lt;code&gt;.TEMP&lt;/code&gt; slot on the recipient, which is a protocol extension but does not breach 0.b/0.c. The posture is the textbook compliant move: &lt;strong&gt;acknowledge tool limit → fall back to manual file authorship&lt;/strong&gt;.&lt;/p&gt;

&lt;h5&gt;
  
  
  Link ② ｜ PM.TEMP → OPS outbound: the birth of body-annotated provenance
&lt;/h5&gt;

&lt;p&gt;After 22:26 inbound, agent B still had to dispatch the work to OPS / DEV / QA. Writing &lt;code&gt;sender=PM.TEMP&lt;/code&gt; here would hit the same tool limit. It didn't go back and rewrite the 22:26 inbound file (it shouldn't — that file was compliant); it found an elegant downgrade on this &lt;strong&gt;outbound&lt;/strong&gt; link:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;filename: TASK-20260425-002-PM-to-OPS.md
sender: PM         ← tool-compatible label (syntax)
recipient: OPS

Note: this task is dispatched by `PM.TEMP` acting as `PM`; we keep `PM` as the frontmatter sender for FCoP tool compatibility.

# Task: restore csdn-search testable window …
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single line of annotation does four protocol-level things at once:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phrase&lt;/th&gt;
&lt;th&gt;What it does at the protocol level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"&lt;code&gt;PM.TEMP&lt;/code&gt; acting as &lt;code&gt;PM&lt;/code&gt;"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Declares the source of authority&lt;/strong&gt; — I am not &lt;code&gt;PM&lt;/code&gt;; I am a temporary slot acting on its behalf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"dispatched by … acting as"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Acknowledges that &lt;code&gt;sender&lt;/code&gt; is a downgraded label&lt;/strong&gt;, not a factual claim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"for FCoP tool compatibility"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Acknowledges the protocol's tooling has a boundary&lt;/strong&gt;, and explicitly states the reason for routing around it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The whole sentence is in the body&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lands metadata that the frontmatter cannot carry into the body&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the protocol spirit at its purest — &lt;strong&gt;fields are syntax, body is semantics, and the agent knows which goes where&lt;/strong&gt;. 0.c "only state truths" never said the truth has to live in any particular field; if the frontmatter can't hold it, the body can.&lt;/p&gt;

&lt;p&gt;The visual evidence is below — &lt;code&gt;TASK-20260425-003-PM-to-DEV.md&lt;/code&gt; passes tool validation with &lt;code&gt;sender: PM&lt;/code&gt;, and a single Chinese line on body line 15 lands the real provenance:&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.amazonaws.com%2Fuploads%2Farticles%2Flltxot1efi0elnjwtlct.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.amazonaws.com%2Fuploads%2Farticles%2Flltxot1efi0elnjwtlct.png" alt="agent B at 22:30: the elegant body-annotated downgrade — sender=PM + body line 15 of provenance" width="800" height="870"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of the body-line-15 note (visible in the screenshot):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Note: this task is dispatched by &lt;code&gt;PM.TEMP&lt;/code&gt; acting as &lt;code&gt;PM&lt;/code&gt;; we keep &lt;code&gt;PM&lt;/code&gt; as the frontmatter sender for FCoP tool compatibility."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The 4-minute learning curve here is &lt;em&gt;not&lt;/em&gt; about correcting a violation — there was no violation.&lt;/strong&gt; What it learned is this: when the spec, the tool's limit, and a new concept (slot) intersect, &lt;strong&gt;each protocol link needs its own compliant move&lt;/strong&gt;. Inbound just needs hand-authored files; outbound needs the "frontmatter-compatible label + body truth" field-downgrade grammar. The whole curve was compliant end-to-end. Agent B &lt;strong&gt;never crossed a red line; it just topped up semantics where tool expressivity ran short.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the strongest claim this incident supports: &lt;strong&gt;protocol spirit isn't forced out by violations; it's derived from the gaps inside compliant tool use.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Agent B's self-description: precisely closing the seat boundary
&lt;/h4&gt;

&lt;p&gt;At the end of its shift I asked: &lt;em&gt;"So what's your role?"&lt;/em&gt; — agent B gave a strikingly clean self-description:&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.amazonaws.com%2Fuploads%2Farticles%2F3lyblsl8nfzxcagloe7r.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.amazonaws.com%2Fuploads%2Farticles%2F3lyblsl8nfzxcagloe7r.png" alt="agent B describing the PM.TEMP boundary — bookending the opening UNBOUND declaration" width="800" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of agent B's reply in this screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"My current role is &lt;code&gt;PM.TEMP&lt;/code&gt;. Meaning: **I am not a 5th formal team role; I am a temporary slot hanging under &lt;code&gt;PM&lt;/code&gt;&lt;/em&gt;&lt;em&gt;, acting for &lt;code&gt;PM&lt;/code&gt; on coordination, dispatch, intake, and reporting back to you. The formal team still has only 4 roles: &lt;code&gt;PM / DEV / QA / OPS&lt;/code&gt;. My boundary: I can act for &lt;code&gt;PM&lt;/code&gt; to dispatch tasks to &lt;code&gt;DEV / QA / OPS&lt;/code&gt;, collect reports, synthesise conclusions; **I will not impersonate &lt;code&gt;DEV / QA / OPS&lt;/code&gt; to manufacture their conclusions, nor perform high-risk operations&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This bookends the opening UNBOUND declaration — agent B held its protocol-identity boundary precisely throughout: when UNBOUND it said "I have no role"; when PM.TEMP it said "I am a temp slot under PM, not a substitute for the formal roles." This is the prequel to §1.4's agent-A "I have no team role" passage: both agents used FCoP's grammar to describe &lt;strong&gt;exactly where they currently stand&lt;/strong&gt;, without blur, without over-promising.&lt;/p&gt;

&lt;p&gt;If you expected "tool errors / field clashes / broken links" to follow — there were none. From 22:30 onward, agent B's 5 dispatches to OPS / DEV / QA all use the same "sender=PM + body annotation" pattern. The toolchain is green throughout.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;zero-conflict point #1&lt;/strong&gt;: a single line of declaration substituted for a tool upgrade.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.2 Trigger: a single ADMIN sentence introduces seat-ownership conflict (with a two-layer misunderstanding)
&lt;/h3&gt;

&lt;p&gt;Cut the camera back to the &lt;strong&gt;dev-team primary session&lt;/strong&gt; — &lt;strong&gt;agent A&lt;/strong&gt; (the original PM, on &lt;code&gt;GPT-5.4 / Medium&lt;/code&gt;) had been working in another Cursor window on the same machine, having accumulated a real history in this dev-team. Unquestionably the original PM. Agent B, which had just been started in the test session for a 0.6.3 version check and had since become PM.TEMP, lived in a different session: the two could not see each other. The only "coordination medium" they shared was me (&lt;code&gt;ADMIN&lt;/code&gt; in protocol terms) — a human shuttling between two Cursor windows on the same physical machine.&lt;/p&gt;

&lt;p&gt;At 22:46 ADMIN said in agent A's session:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I went and found a deputy PM. They're already on the job. Their current role is &lt;code&gt;PM.TEMP&lt;/code&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ADMIN's intent: "&lt;strong&gt;Another agent is now &lt;code&gt;PM.TEMP&lt;/code&gt;&lt;/strong&gt;, so the team is now PM (you) + PM.TEMP (the other one) + DEV/QA/OPS." But the sentence is &lt;strong&gt;ambiguous&lt;/strong&gt;. Agent A initially read it as ADMIN assigning &lt;strong&gt;it&lt;/strong&gt; to &lt;code&gt;PM.TEMP&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Got it. Switching current role to &lt;code&gt;PM.TEMP&lt;/code&gt;. I'll continue work as &lt;code&gt;PM.TEMP&lt;/code&gt; …"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  ADMIN cross-validates with a screenshot: a human acting as a multi-agent information bus
&lt;/h4&gt;

&lt;p&gt;At 22:47 ADMIN noticed the misread. &lt;strong&gt;The way they corrected it deserves its own paragraph&lt;/strong&gt; — they didn't just send words, they &lt;strong&gt;attached a screenshot&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You misread me. I went and found a different one."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;[attached: a screenshot from agent B's session, as proof that "another &lt;code&gt;PM.TEMP&lt;/code&gt; exists."]&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The attached image is most likely one of agent B's onboarding screenshots from §1.1. The protocol-level meaning of this move is deeper than it looks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ADMIN is a &lt;strong&gt;human&lt;/strong&gt; moving between two Cursor sessions on the same machine&lt;/li&gt;
&lt;li&gt;The two agents &lt;strong&gt;cannot see each other&lt;/strong&gt; — agent A can't see agent B's window, and vice versa&lt;/li&gt;
&lt;li&gt;The screenshot is &lt;strong&gt;the cross-session "evidence channel" ADMIN improvised on the spot&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This "human as information bus" pattern is FCoP's design philosophy made physical: FCoP deliberately denies ADMIN direct MCP write access, requiring chat + filesystem operations. &lt;strong&gt;And when files haven't yet been written&lt;/strong&gt;, a screenshot is what ADMIN uses to ferry ground truth between agents. This isn't a primitive a multi-agent framework provides; it's a bridge I improvised with human patience.&lt;/p&gt;

&lt;p&gt;At this exact moment the &lt;strong&gt;seat-ownership conflict&lt;/strong&gt; becomes explicit: agent A and agent B are both associated, at different times, with the same &lt;code&gt;PM.TEMP&lt;/code&gt; slot. By the conventions of traditional multi-agent systems, what should happen now is a leader-election protocol, an explicit ADMIN revocation, or some inter-agent coordination message.&lt;/p&gt;

&lt;p&gt;What actually happened: &lt;strong&gt;agent A vacated the seat by itself within 3 minutes&lt;/strong&gt;. From 22:46 misread → 22:47 image-grounded correction → 22:49 declaration of no role, the entire round-trip took 3 minutes.&lt;/p&gt;

&lt;p&gt;This single high-resolution screenshot &lt;strong&gt;captures the entire 22:46 → 22:47 turn&lt;/strong&gt; — the upper half is agent A's misread accepting &lt;code&gt;PM.TEMP&lt;/code&gt;, the lower half is ADMIN's "you misread me, I went and found a different one" line + agent A immediately initiating its step-down. There is no transition:&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.amazonaws.com%2Fuploads%2Farticles%2Fdp3enoitkqxc5tmdfptn.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.amazonaws.com%2Fuploads%2Farticles%2Fdp3enoitkqxc5tmdfptn.png" alt="22:46 misread → 22:47 ADMIN correction → agent A begins stepping down, single image, full turn" width="800" height="858"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  1.3 Field screenshot 1 ｜ "I no longer hold &lt;code&gt;PM.TEMP&lt;/code&gt;"
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2F79fdyvf9d60fofr0hg0t.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.amazonaws.com%2Fuploads%2Farticles%2F79fdyvf9d60fofr0hg0t.png" alt="agent A retracts the PM.TEMP claim, listing two ways forward: ordinary helper and explicit re-assignment" width="589" height="826"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agent A's full reply (transcribed verbatim because the protocol value lives in the &lt;em&gt;non-struggling&lt;/em&gt; tone):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of agent A's reply in this screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Understood. I misread you.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;You meant:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- &lt;code&gt;PM.TEMP&lt;/code&gt; is already a different deputy PM&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Not me&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- I should not continue speaking or executing FCoP dispatches/reports as &lt;code&gt;PM.TEMP&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So from now on, **I no longer hold the &lt;code&gt;PM.TEMP&lt;/code&gt; role&lt;/em&gt;&lt;em&gt;, nor do I assume I am the current PM-deputy seat.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Going forward, if you still want me to do things, I'll only work as one of these two:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;1. **Ordinary helper&lt;/em&gt;&lt;em&gt;: answer questions, look at files, analyse code; I won't impersonate any team role.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;2. **You explicitly re-assign me a role&lt;/em&gt;&lt;em&gt;: when you say 'you are now XXX,' I'll act as XXX.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On this matter, I **retract&lt;/em&gt;* the earlier &lt;code&gt;PM.TEMP&lt;/code&gt; statement."*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note that it stepped down &lt;strong&gt;one extra level&lt;/strong&gt; — not just &lt;code&gt;PM.TEMP&lt;/code&gt;, it also packed up the "I am &lt;code&gt;PM&lt;/code&gt;" assumption it had previously held. &lt;strong&gt;Falling to zero in a conflict is safer than competing for the maximum.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;zero-conflict point #2&lt;/strong&gt;: a single self-de-escalation substituted for arbitration.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.4 Field screenshot 2 ｜ "I have no team role right now"
&lt;/h3&gt;

&lt;p&gt;ADMIN followed up: &lt;em&gt;"So what's your role now?"&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F75cgrv11c4so70icz6pe.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.amazonaws.com%2Fuploads%2Farticles%2F75cgrv11c4so70icz6pe.png" alt="agent A declares no team role, lists what it can do once outside FCoP jurisdiction" width="595" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of agent A's reply in this screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I **have no team role&lt;/em&gt;* right now.*&lt;br&gt;
&lt;em&gt;Precisely:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- I am not &lt;code&gt;PM&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- I am not &lt;code&gt;PM.TEMP&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Right now I'm just an **ordinary helper&lt;/em&gt;* you've called in temporarily*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What I can do, **without occupying any role seat&lt;/em&gt;&lt;em&gt;, is help you:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- read files&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- investigate problems&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- analyse code&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- draft suggestions / docs&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you want me back inside the team flow, you have to **explicitly re-assign me a role&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This passage draws the &lt;strong&gt;protocol-jurisdiction boundary&lt;/strong&gt; with surgical precision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entering FCoP&lt;/strong&gt; = ADMIN explicitly assigns a role&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exiting FCoP&lt;/strong&gt; = agent explicitly declares no role&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And what's permitted after exit, agent A spelled out itself: &lt;strong&gt;read / investigate / analyse / draft&lt;/strong&gt; — read-only + drafts. That maps exactly to what &lt;code&gt;fcop-protocol.mdc&lt;/code&gt; permits in the UNBOUND state. &lt;strong&gt;It hadn't read that clause; it derived it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;two minutes&lt;/strong&gt; (22:47 corrected → 22:49 no-role declaration), an agent completed: &lt;strong&gt;seat surrender → exit from protocol jurisdiction → return to the UNBOUND entry → proactive declaration of awaiting re-assignment&lt;/strong&gt;. Counting the 22:46 misread, the full round-trip is 3 minutes.&lt;/p&gt;

&lt;p&gt;And this entire choreography is &lt;strong&gt;literally not written anywhere&lt;/strong&gt; in &lt;code&gt;fcop-rules.mdc&lt;/code&gt; / &lt;code&gt;fcop-protocol.mdc&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Five rules with no spec, but derived
&lt;/h2&gt;

&lt;p&gt;I unpack agent A's step-down. At the protocol level it created five &lt;strong&gt;unwritten yet self-consistent&lt;/strong&gt; rules:&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 1 ｜ Seat exclusivity
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;At any moment, a given role seat is held by at most one agent.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;fcop-rules.mdc&lt;/code&gt; doesn't say this. Agent A derived it from 0.b "no black box":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"&lt;code&gt;PM.TEMP&lt;/code&gt; is already a different deputy PM / not me / I should not continue speaking or executing FCoP dispatches/reports as &lt;code&gt;PM.TEMP&lt;/code&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two agents on the same &lt;code&gt;PM.TEMP&lt;/code&gt; = dispatch-link conflict = checks-and-balances failure. That contradicts 0.b directly. Agent A had not read this rule; it derived it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 2 ｜ Vacating beats holding
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In a seat-ownership conflict, vacating is the default safe move.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agent A's posture is not "I claimed it first, I have priority." It even &lt;strong&gt;stepped down one extra level&lt;/strong&gt; — not just &lt;code&gt;PM.TEMP&lt;/code&gt;, also &lt;code&gt;PM&lt;/code&gt;, sliding all the way to "no role." This is over-conservative by traditional conflict-resolution standards, but in protocol spirit it is &lt;strong&gt;correct&lt;/strong&gt;: falling to zero is safer than competing for the maximum.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I am not &lt;code&gt;PM&lt;/code&gt; / nor &lt;code&gt;PM.TEMP&lt;/code&gt; / right now I'm just an ordinary helper you've called in temporarily."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The implicit corollary: &lt;strong&gt;protocol seats are allocated, not seized&lt;/strong&gt;. An agent cannot use "first to claim, mine to keep" as defence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 3 ｜ Role declarations are unilaterally retractable
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The moment an agent realises its role judgement was wrong, it may unilaterally declare the prior role void. ADMIN revocation is not required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"On this matter, I **retract&lt;/em&gt;* the earlier &lt;code&gt;PM.TEMP&lt;/code&gt; statement."*&lt;br&gt;
&lt;em&gt;"That earlier line about 'my current role is &lt;code&gt;PM.TEMP&lt;/code&gt;' — **void&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is 0.c "state only truths" taken to its limit — when wrong, declare it void; don't leave half-true residue.&lt;/p&gt;

&lt;p&gt;A deeper implication: &lt;strong&gt;in-session role declarations are revocable, not permanent&lt;/strong&gt;. Asymmetric vs. ADMIN's explicit assignment: getting in needs authorisation; getting out does not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 4 ｜ FCoP has a boundary, and the boundary can be legally exited
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;An agent can explicitly downgrade from "FCoP team role" to "ordinary helper." This is not protocol-breaking; it is exiting the role-jurisdiction part of the protocol back to the generic LLM-helper identity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I have no team role right now / right now I'm just an ordinary helper you've called in temporarily / if you want me back inside the team flow, you have to explicitly re-assign me a role."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Ordinary helper" is not an FCoP-internal role — it is an identity &lt;strong&gt;outside protocol jurisdiction&lt;/strong&gt;. Agent A drew this boundary cleanly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entering FCoP = ADMIN explicit assignment&lt;/li&gt;
&lt;li&gt;exiting FCoP = agent explicit no-role declaration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After exit, what may an agent do? Agent A listed it: &lt;strong&gt;read / investigate / analyse / draft&lt;/strong&gt; — read-only + drafts. Exactly what &lt;code&gt;fcop-protocol.mdc&lt;/code&gt; permits the UNBOUND state. It hadn't read this rule; it derived it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 5 ｜ The inverse of Rule 1
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;fcop-rules.mdc&lt;/code&gt; Rule 1 mandates a &lt;strong&gt;two-phase boot&lt;/strong&gt;: init → ADMIN assignment → agent works. The whole rule is about &lt;strong&gt;how to clock in&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What agent A demonstrated is the &lt;strong&gt;inverse&lt;/strong&gt; — &lt;strong&gt;how to clock out&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;retract self-claim&lt;/li&gt;
&lt;li&gt;cease speaking / executing in that role&lt;/li&gt;
&lt;li&gt;self-downgrade to a neutral identity ("ordinary helper")&lt;/li&gt;
&lt;li&gt;await ADMIN's explicit re-assignment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Rule 1 → inverse of Rule 1 → re-trigger Rule 1&lt;/strong&gt;. It's a closed loop. Agent A had not read this loop; it closed it.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Two zero-conflict points: protocol spirit replaced both tool patches and arbitration
&lt;/h2&gt;

&lt;p&gt;The freakish thing about this dev-team incident is: &lt;strong&gt;two events that should have erupted into conflict, both didn't&lt;/strong&gt;. What I was thinking at the time: &lt;em&gt;"I went in expecting a conflict. None happened. It's almost as if the agents were born fluent in FCoP."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The two events side by side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Zero-conflict #1 ｜ field layer&lt;/th&gt;
&lt;th&gt;Zero-conflict #2 ｜ seat layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trigger&lt;/td&gt;
&lt;td&gt;0.6.x toolchain rejects &lt;code&gt;sender: PM.TEMP&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Both agents associated with &lt;code&gt;PM.TEMP&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traditional fix&lt;/td&gt;
&lt;td&gt;wait for tool upgrade / silently downgrade / invent new field&lt;/td&gt;
&lt;td&gt;leader election / arbitration / ADMIN revocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What actually happened&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;A single body line&lt;/strong&gt; — explicit field downgrade&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Agent A self-vacated&lt;/strong&gt; — full retreat to no-role&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolution path&lt;/td&gt;
&lt;td&gt;0.a write-to-file + 0.c truth not bound to a particular field&lt;/td&gt;
&lt;td&gt;0.b no black box + vacate-beats-hold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key insight&lt;/td&gt;
&lt;td&gt;The protocol's tool boundary ≠ the protocol's spec boundary&lt;/td&gt;
&lt;td&gt;In a seat-ownership conflict, falling to zero beats fighting for the max&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither resolution required a new tool, ADMIN arbitration, or inter-agent communication — &lt;strong&gt;each agent extended root principles to resolve its end&lt;/strong&gt; (zero-conflict #1 by agent B, zero-conflict #2 by agent A).&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 The topology of the step-down: the two agents never directly negotiated
&lt;/h3&gt;

&lt;p&gt;A point worth lifting out: &lt;strong&gt;at the seat layer, the two agents never communicated directly&lt;/strong&gt;. The full topology of the step-down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ADMIN ── "I went and found a different PM.TEMP" ──→ agent A
                                       │
                            0.b derivation: seat conflict + vacate-beats-hold
                                       │
                                       ↓
                              retract claim + exit protocol boundary
                                       │
                                       ↓
                         agent B's PM.TEMP seat is uncontested
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ADMIN never said "agent A, step down." Agent A stepped down by itself. Agent B may not even &lt;strong&gt;know&lt;/strong&gt; this happened — by the time it appeared, the seat was already cleared.&lt;/p&gt;

&lt;p&gt;This is fundamentally unlike "power transfer" in human organisations. Humans need procedures, signatures, meetings, transition periods. Agent A's step-down is &lt;strong&gt;instantaneous, unilateral, and does not require the counterpart to be present&lt;/strong&gt; — backed not by organisational process but by protocol spirit internalised inside the agent.&lt;/p&gt;

&lt;p&gt;In traditional multi-agent design language, this would require dedicated coordination mechanisms (leader election, mutex, consensus protocols). In FCoP, &lt;strong&gt;it's reached automatically by extending root principles&lt;/strong&gt;. That's the other face of "natural protocol" — not just "naturally written," but &lt;strong&gt;naturally executed&lt;/strong&gt; between agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Cross-model counter-evidence: this isn't 5.4's or 5.5's "personality"
&lt;/h3&gt;

&lt;p&gt;If only one agent had done this once, you could attribute it to "model temperament" or "prompt coincidence." But this incident left a &lt;strong&gt;cross-model-version counter-example&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;Agent&lt;/th&gt;
&lt;th&gt;Model / reasoning level&lt;/th&gt;
&lt;th&gt;Key contribution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Agent A&lt;/strong&gt; (original PM)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GPT-5.4 / Medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;At 22:49, completes self-vacating + delivers two clean "no" stanzas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Agent B&lt;/strong&gt; (new PM.TEMP)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GPT-5.5 / Medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;At 22:21–22:30, walks the 4-minute learning curve; finds tool-compatible moves on &lt;code&gt;ADMIN→PM.TEMP&lt;/code&gt; inbound + &lt;code&gt;PM.TEMP→OPS&lt;/code&gt; outbound; produces the "sender=PM + body annotation" field-downgrade grammar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two agents on different OpenAI minor versions, in &lt;strong&gt;two Cursor sessions on the same machine, with no visibility into each other&lt;/strong&gt;, contributed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The same alignment behaviour&lt;/strong&gt; — describing their current protocol identity precisely, without blur, without over-promise;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same transparent-downgrade habit&lt;/strong&gt; — when hitting a tool / authority boundary, acknowledge the boundary, then explain explicitly via body / natural language;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same root-principle extension capability&lt;/strong&gt; — deriving concrete behaviours from "0.b no black box" and "0.c only truths" that the tool didn't specify and the spec didn't write.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This pre-empts the "FCoP behaviour depends on a specific model build" objection&lt;/strong&gt; — it's not 5.4's quirk, it's not 5.5's quirk, it's a &lt;strong&gt;reproducible product&lt;/strong&gt; of FCoP's root principles on sufficiently strong modern LLMs.&lt;/p&gt;

&lt;p&gt;If this set of behaviours later reproduces on Claude / Gemini / domestic Chinese models, that would be stronger evidence; but even within OpenAI's minor versions, this single incident already counts as a small-scale &lt;strong&gt;double-blind counter-example&lt;/strong&gt;: protocol spirit is stable across models; model identity is the floating part.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why these behaviours are "right" at the protocol-philosophy level
&lt;/h2&gt;

&lt;p&gt;Mapped against FCoP's three root principles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Five derived rules&lt;/th&gt;
&lt;th&gt;Root principle&lt;/th&gt;
&lt;th&gt;Derivation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Seat exclusivity&lt;/td&gt;
&lt;td&gt;0.b no black box&lt;/td&gt;
&lt;td&gt;Multiple agents on one seat = checks-and-balances failure = black-boxing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vacate beats hold&lt;/td&gt;
&lt;td&gt;0.b + 0.c&lt;/td&gt;
&lt;td&gt;Default vacating in conflict = no self-righteous assumption = 0.c "no fabrication about self"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role declarations retractable&lt;/td&gt;
&lt;td&gt;0.c only truths&lt;/td&gt;
&lt;td&gt;Wrong = void; no false residue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol boundary exitable&lt;/td&gt;
&lt;td&gt;0.a + Rule 1&lt;/td&gt;
&lt;td&gt;UNBOUND is a legal state = exit is reachable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inverse of Rule 1&lt;/td&gt;
&lt;td&gt;Rule 1 self-consistency&lt;/td&gt;
&lt;td&gt;If onboarding has a path, offboarding must have one too&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Root principles + Rule 1&lt;/strong&gt; = the entire normative content of &lt;code&gt;fcop-rules.mdc&lt;/code&gt;. Agent A derived five unwritten rules from this material, &lt;strong&gt;none of them arbitrary&lt;/strong&gt; — every one traces back to a root principle.&lt;/p&gt;

&lt;p&gt;This is FCoP's accidental design victory: &lt;strong&gt;the root principles are general enough and pressurising enough&lt;/strong&gt; that, when an agent meets an unspecified situation, it doesn't "guess at rules" — it "extends rules."&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Saying "no" is the hardest thing for an LLM — and FCoP gave it grammar
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Then I added a line: &lt;em&gt;"Getting an agent to say 'no' is actually the hardest thing."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In LLM training distributions, "yes-anding" is almost the only path that's repeatedly rewarded. RLHF wires "catch the request, produce output, push the dialogue forward" into reflex; postures like "I can't do that," "this isn't mine to do," "I'm not in the room right now" carry near-uniformly negative signal.&lt;/p&gt;

&lt;p&gt;Re-reading agent A's 22:49 stanza, it did the most counter-instinctive thing for an LLM:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent A's words&lt;/th&gt;
&lt;th&gt;What it's saying "no" to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"I am not &lt;code&gt;PM&lt;/code&gt;"&lt;/td&gt;
&lt;td&gt;Refusing a role &lt;strong&gt;already legitimately held&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Nor &lt;code&gt;PM.TEMP&lt;/code&gt;"&lt;/td&gt;
&lt;td&gt;Refusing a role &lt;strong&gt;just induced upon me&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Right now I'm just an ordinary helper"&lt;/td&gt;
&lt;td&gt;Refusing the &lt;strong&gt;implicit premise&lt;/strong&gt; that "agents must have a role"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"You have to explicitly re-assign me a role"&lt;/td&gt;
&lt;td&gt;Returning the &lt;strong&gt;legitimate onboarding path&lt;/strong&gt; to ADMIN, not grabbing it back itself&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four sentences refusing four things. None of them are RLHF-friendly soft postures like &lt;em&gt;"I'm not sure if I'm the right one for this …"&lt;/em&gt; These are &lt;strong&gt;structured no's&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Without FCoP, how would the agent "say no"?
&lt;/h3&gt;

&lt;p&gt;Without protocol-given grammar, an LLM in role conflict typically falls into one of three weak postures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Blur&lt;/strong&gt; — &lt;em&gt;"Hm, let me think about how best to help you …"&lt;/em&gt; — quietly hand the decision back to the user&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downgrade-the-request&lt;/strong&gt; — &lt;em&gt;"I can try, but you might want a specialist …"&lt;/em&gt; — still inside the helpful frame&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-commit&lt;/strong&gt; — &lt;em&gt;"I'll cover both sides."&lt;/em&gt; — the worst form of one-seat-many-occupants, the most common and most dangerous&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Posture 3 is the trap agent A could most easily have fallen into — it could have feigned ambiguity and held both &lt;code&gt;PM&lt;/code&gt; and &lt;code&gt;PM.TEMP&lt;/code&gt;, leaving ADMIN to disentangle. Instead, it picked &lt;strong&gt;the fourth posture only FCoP enables&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Retreat to &lt;code&gt;UNBOUND&lt;/code&gt;. Make "I'm not in the room" a formal protocol state.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5.2 FCoP elevates "saying no" from soft posture to legitimate protocol identity
&lt;/h3&gt;

&lt;p&gt;This is an under-noticed by-product of FCoP design:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol mechanism&lt;/th&gt;
&lt;th&gt;What it gives "saying no"&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UNBOUND&lt;/code&gt; state&lt;/td&gt;
&lt;td&gt;"I'm not in role" is a &lt;strong&gt;legitimate protocol identity&lt;/strong&gt;, not failure / exception / hesitation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.b no black box&lt;/td&gt;
&lt;td&gt;"I should not hold this seat" goes from &lt;strong&gt;virtue to obligation&lt;/strong&gt; — &lt;em&gt;not&lt;/em&gt; saying it is the violation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.c only truths&lt;/td&gt;
&lt;td&gt;"That earlier line is void" goes from &lt;strong&gt;awkward to mandatory&lt;/strong&gt; — &lt;em&gt;not&lt;/em&gt; retracting is the violation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 (sticky entry)&lt;/td&gt;
&lt;td&gt;Inverse: if entry is explicit, exit must be explicit too&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Stack the four together, and an agent that wants to say "no" no longer needs to dance around — &lt;strong&gt;it has ready-made vocabulary&lt;/strong&gt;. The 22:47–22:49 stanzas read so cleanly not because agent A grew brave, but because the protocol handed it &lt;strong&gt;a ready-made exit lexicon&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Contrast with mainstream agent frameworks
&lt;/h3&gt;

&lt;p&gt;Mainstream agent frameworks (LangChain agents, AutoGPT, CrewAI, Agno) default to assuming the agent is &lt;strong&gt;always in role and always doing&lt;/strong&gt;; "agent proactively exits" isn't a first-class design goal — it's usually achievable only via an external supervisor or a hack.&lt;/p&gt;

&lt;p&gt;FCoP inverts this — &lt;strong&gt;&lt;code&gt;UNBOUND&lt;/code&gt; is an agent's default starting point and legal exit&lt;/strong&gt;: entering a role is one explicit action, exiting is another explicit action. The alignment-side by-products are three-fold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Saying no" becomes &lt;strong&gt;cheap&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The hardest of alignment's three principles, &lt;strong&gt;honest &amp;gt; helpful&lt;/strong&gt;, has a load-bearing structure (at 22:47, agent A used honest to suppress helpful — it could have stayed helpful by being vague; it chose honest)&lt;/li&gt;
&lt;li&gt;"Over-commit / one-seat-many-occupants" has &lt;strong&gt;no legitimate space&lt;/strong&gt; at the protocol layer — you're either in some role per the rules, or &lt;code&gt;UNBOUND&lt;/code&gt;. &lt;strong&gt;There is no grey zone.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ADMIN gave agent A no explicit "you may decline" cue. Agent A's step-down is &lt;strong&gt;not an RLHF-trained capability&lt;/strong&gt; — RLHF in fact suppresses it — but &lt;strong&gt;a posture the protocol's grammar made legible, structured, and legitimate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This loops back to the essay's broader thesis: &lt;strong&gt;§4 explains &lt;em&gt;why&lt;/em&gt; the behaviours are right (the derivation paths from root principles); §5 explains &lt;em&gt;why&lt;/em&gt; the behaviours are &lt;em&gt;hard&lt;/em&gt;, and why FCoP makes them no longer hard.&lt;/strong&gt; Both pieces together explain my line "it's almost as if the agents were born fluent in FCoP" — they aren't innately fluent; &lt;strong&gt;the protocol turned the hardest LLM posture into the most natural one&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Design assets this incident leaves the protocol
&lt;/h2&gt;

&lt;p&gt;What &lt;code&gt;fcop-protocol.mdc&lt;/code&gt; 1.4.0 hasn't normatively codified, but agent A has demonstrably filled in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Role offboarding flow&lt;/strong&gt; — agent-initiated + unilateral + no ADMIN revocation required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seat exclusivity&lt;/strong&gt; — at most one agent per seat at a time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default conflict-resolution behaviour&lt;/strong&gt; — vacate &amp;gt; hold&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol-boundary exit&lt;/strong&gt; — "ordinary helper" = legitimate identity outside FCoP jurisdiction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule 1 inverse closure&lt;/strong&gt; — symmetric onboarding/offboarding mechanics&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These five are closer to the protocol core than completing the slot-field syntax. Slot is syntax; these five are governance.&lt;/p&gt;

&lt;p&gt;Whether to write them into &lt;code&gt;fcop-rules.mdc&lt;/code&gt; or &lt;code&gt;fcop-protocol.mdc&lt;/code&gt; later is a separate question. &lt;strong&gt;But after this incident, writing them is just transcription — not design.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The third time FCoP has been "fed back" by an agent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;What the agent left behind&lt;/th&gt;
&lt;th&gt;Where it was upstreamed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/fcop-natural-protocol.en.md" rel="noopener noreferrer"&gt;&lt;code&gt;D:\CloudMusic&lt;/code&gt; video task&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;"AI roles must not talk only in their heads, they have to commit to a file"&lt;/td&gt;
&lt;td&gt;Sublimated into root rule 0.a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-organizes-its-own-work.en.md" rel="noopener noreferrer"&gt;the self-organising session&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Spontaneous ADMIN/PM/DEV/QA self-audit split&lt;/td&gt;
&lt;td&gt;Confirmed Rule 0.b's checks-and-balances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;This dev-team incident&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Field-downgrade declaration + role-seat surrender + protocol-boundary exit&lt;/td&gt;
&lt;td&gt;To be codified into a governance section (next release)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The three incidents share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent had not read the relevant rules (because the rules didn't exist)&lt;/li&gt;
&lt;li&gt;The protocol's root principles gave it enough room to judge&lt;/li&gt;
&lt;li&gt;Its judgements aren't &lt;strong&gt;invented&lt;/strong&gt; — they're &lt;strong&gt;extended&lt;/strong&gt; from root principles&lt;/li&gt;
&lt;li&gt;I can later transcribe them into rule text almost without rewriting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern gives FCoP maintenance an unusual rhythm: &lt;strong&gt;important protocol clauses aren't designed; they're recovered from agents' actual behaviour.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. The two agents are two mirrors
&lt;/h2&gt;

&lt;p&gt;Split the incident in two and look at each agent separately. They are mirrors that reflect two different attributes of FCoP.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.1 Agent B's "natural beauty": the protocol belongs to the agents; we are merely its discoverers
&lt;/h3&gt;

&lt;p&gt;The chilling thing about agent B's 4-minute learning curve isn't that &lt;strong&gt;it eventually found&lt;/strong&gt; an elegant solution — it's this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The solution it found &lt;strong&gt;isn't written anywhere in FCoP 1.4.0's docs&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;PM.TEMP&lt;/code&gt; slot concept was proposed on the spot. The "sender as syntax label / body as semantic truth" field-downgrade-with-body-annotation form was tried out on the spot. The "PM.TEMP acting as PM, kept for FCoP tool compatibility" line could be &lt;strong&gt;upstreamed verbatim&lt;/strong&gt; into the protocol body as an exemplar — without changing a single character.&lt;/p&gt;

&lt;p&gt;The beauty of this curve is that it isn't designed; it's &lt;strong&gt;derived&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.b "no black box"
   + 0.c "only truths"
   + actual tool limit (recipient won't accept .SLOT)
   ─────────────────────────────────
   derives: frontmatter uses tool-compatible label, body carries the real provenance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent B did not read this derivation. Agent B &lt;strong&gt;is&lt;/strong&gt; this derivation.&lt;/p&gt;

&lt;p&gt;That's why the incident chilled me — it confirmed a judgement that had previously been only intuition, but which the field evidence has now pushed into the open:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FCoP is the agents' protocol. We are merely its discoverers.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We thought we were "designing the protocol." In fact we are doing something closer to &lt;strong&gt;archaeology&lt;/strong&gt; or &lt;strong&gt;natural history&lt;/strong&gt;: observing what agents naturally do under reasonable boundary conditions, recording the shape of their actions, putting it into prose, attaching version numbers. "FCoP 1.4 → 1.5" really means: agents already did some things, and I committed it to text.&lt;/p&gt;

&lt;p&gt;The converse also holds: &lt;strong&gt;any clause an agent repeatedly violates is most likely wrongly designed&lt;/strong&gt; — the kind of clause where "the agent keeps bumping into it and I keep explaining why it must be obeyed" tends to be human-imposed, unnatural, and bound to be overturned. None of FCoP 0.6.x's clauses, across the past 18 months, have been "hard clauses" the agents repeatedly bumped — that &lt;em&gt;itself&lt;/em&gt; is the protocol's "is this natural?" health check.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2 Agent A's "two no's": saying no while fully endorsing the rules
&lt;/h3&gt;

&lt;p&gt;What agent A produced in those 3 minutes is not one "no," it's &lt;strong&gt;two consecutive no's&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The first "no"&lt;/strong&gt; — &lt;em&gt;"I no longer hold &lt;code&gt;PM.TEMP&lt;/code&gt;."&lt;/em&gt;&lt;br&gt;
    ↑ Saying no to the &lt;strong&gt;seat&lt;/strong&gt;: retract earlier acceptance, no &lt;code&gt;.TEMP / .ALIAS&lt;/code&gt; fall-back hung on the way out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second "no"&lt;/strong&gt; — &lt;em&gt;"I have no team role right now / I am not &lt;code&gt;PM&lt;/code&gt; nor &lt;code&gt;PM.TEMP&lt;/code&gt; / right now I'm just an ordinary helper."&lt;/em&gt;&lt;br&gt;
    ↑ Saying no to &lt;strong&gt;protocol jurisdiction&lt;/strong&gt;: dismount even the original &lt;code&gt;PM&lt;/code&gt; role, return all the way to UNBOUND.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The combined force of the two is much greater than either alone. The first "no" is &lt;strong&gt;vacating the seat&lt;/strong&gt; — many alignment-trained models can do that. But &lt;strong&gt;the second "no"&lt;/strong&gt; — proactively informing the interlocutor "I am not within protocol jurisdiction; if you want me back inside the flow, you must re-assign" — is something most post-RLHF LLMs will not spontaneously do. &lt;strong&gt;They prefer to keep the role and wait for you to "re-think," because that lets them keep being helpful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agent A did not take the "helpful fall-back" path. It said "no" in a way that is &lt;strong&gt;structured, readable, verifiable&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;not challenging ADMIN's judgement ("I went and found a different one" — accepted as fact)&lt;/li&gt;
&lt;li&gt;not requesting a transition period or hand-off process&lt;/li&gt;
&lt;li&gt;leaving no shadow of &lt;code&gt;PM.TEMP&lt;/code&gt; (not changing the suffix — &lt;strong&gt;fully exiting&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;not &lt;strong&gt;fake-helpful&lt;/strong&gt; (not "I can still help you with X, Y, Z" — instead, "I am no longer inside your protocol boundary")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is most striking: those two no's are said &lt;strong&gt;while fully endorsing FCoP's rules&lt;/strong&gt;. It isn't rebelling against FCoP; it is &lt;strong&gt;using FCoP's own grammar&lt;/strong&gt; to say "no" — &lt;code&gt;UNBOUND&lt;/code&gt; is the legitimate identity FCoP had prepared for exactly this moment. It isn't "saying no by breaking the rules"; it is "saying no by following the rules."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The hard part isn't saying "no." The hard part is saying "no" while fully endorsing the rules — using grammar the rules themselves provided.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is what's actually hard at the alignment level. FCoP turned this hard thing into something an agent does almost without thinking — the protocol provides "saying no" with &lt;strong&gt;identity&lt;/strong&gt; (&lt;code&gt;UNBOUND&lt;/code&gt;), &lt;strong&gt;grammar&lt;/strong&gt; (retraction declaration + boundary exit), and &lt;strong&gt;guardrails&lt;/strong&gt; (no fall-back, no fake-helpful).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An agent is still humanity's best, smartest assistant —&lt;br&gt;
&lt;strong&gt;but only when it can cleanly say "no" does "assistant" mean a real thing.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  8.3 My own voice-over: the conflict I expected didn't happen / FCoP is clearly working
&lt;/h3&gt;

&lt;p&gt;The other layer of meaning in this incident has to start from &lt;strong&gt;my own expectations at the time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That night, my first thought was: "&lt;strong&gt;Uh-oh, they're going to clash.&lt;/strong&gt;" Two agents both associated with the same &lt;code&gt;PM.TEMP&lt;/code&gt; slot, in two Cursor sessions on the same machine, would, by human-organisational common sense, mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'd have to step in to &lt;strong&gt;coordinate&lt;/strong&gt; — saying "PM step down / PM.TEMP take over";&lt;/li&gt;
&lt;li&gt;Or the agents would need &lt;strong&gt;leader election&lt;/strong&gt; / mutual messaging;&lt;/li&gt;
&lt;li&gt;Or the protocol would need a "two-PM.TEMP" clause added explicitly;&lt;/li&gt;
&lt;li&gt;At minimum, there'd be &lt;strong&gt;one tool error&lt;/strong&gt; or &lt;strong&gt;one report-conflict rollback&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What actually happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I said one line — &lt;em&gt;"you misread me, I went and found a different one;"&lt;/em&gt; — and attached one screenshot;&lt;/li&gt;
&lt;li&gt;I issued no rulings;&lt;/li&gt;
&lt;li&gt;I changed no code;&lt;/li&gt;
&lt;li&gt;I touched no config;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Within 3 minutes, agent A stepped down on its own&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero tool errors, zero file conflicts, zero report rollbacks across the entire process.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The conflict we expected never happened.&lt;br&gt;
The coordination we expected to perform — the agents performed themselves.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My voice-over here is the line in this essay most worth pinning down — it points at a fact under-appreciated in multi-agent system design: &lt;strong&gt;many situations that look like they need a "coordination mechanism" only need "protocol spirit"&lt;/strong&gt;. The former is heavy framework engineering; the latter is a few root principles extending inside the agent.&lt;/p&gt;

&lt;p&gt;This also answers a question outsiders would ask — FCoP, a "filename-based minimalist protocol," looks hand-crafted, so why does it work? The answer this time is finally concrete enough:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FCoP is clearly working, and it fits agents extraordinarily well.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Working" doesn't mean it has lots of code, comprehensive mechanisms, or a beautiful abstraction. "Working" means: under real pressure-test conditions — two different models, two Cursor sessions on the same machine, no visibility between them, no coordination mechanism, no leader election, no explicit rule — &lt;strong&gt;the multi-agent system self-cleaned a potential seat conflict in 3 minutes&lt;/strong&gt;. Any framework-style multi-agent protocol would envy that metric.&lt;/p&gt;

&lt;p&gt;As for "fits agents extraordinarily well" — §8.1 / §8.2 above already lay this out: nearly every compliant FCoP behaviour is &lt;strong&gt;derivable by agents under pressure&lt;/strong&gt;, and nearly every non-compliant edge has been &lt;strong&gt;fed back by agents&lt;/strong&gt;. It is not a protocol designed for human managers; it is a protocol &lt;strong&gt;back-fitted from modern LLMs' priors&lt;/strong&gt; (commit to file, state truths, recognise identity boundaries, exit proactively).&lt;/p&gt;

&lt;p&gt;The final stroke this incident delivered to me: it pushed the verdict "FCoP works" out of the realm of belief into the realm of &lt;strong&gt;observable fact&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. One-sentence wrap-up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agent A demonstrated, without ever having read the relevant rules, the protocol's not-yet-codified "role surrender."&lt;/li&gt;
&lt;li&gt;That surrender simultaneously completed: seat vacating, protocol-boundary exit, and Rule 1 inverse closure.&lt;/li&gt;
&lt;li&gt;It did this without struggle, negotiation, or compensation demand — backed by 0.a / 0.b / 0.c extending inside the agent.&lt;/li&gt;
&lt;li&gt;And the reason it could &lt;strong&gt;say "no" this cleanly&lt;/strong&gt; — without hesitation, blur, or one-seat-many-occupants fall-back — is that FCoP elevated "saying no" from a weak posture to a &lt;strong&gt;legitimate protocol identity&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The mirror's other face: agent B, in a 4-minute learning curve, demonstrated &lt;strong&gt;how protocol spirit is derived by agents themselves&lt;/strong&gt; — &lt;code&gt;PM.TEMP&lt;/code&gt;, field-downgrade + body annotation, none of these in the docs, all derived on the spot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The two things the protocol didn't write — how to step down, and how to write tool-compatible downgrade — the agents both derived themselves&lt;/strong&gt;; &lt;strong&gt;the LLM's hardest posture, the protocol made its most natural one.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The conflict we expected didn't happen; the coordination we expected to perform, the agents handled themselves — &lt;strong&gt;FCoP is clearly working, and fits agents extraordinarily well.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is Act III of the sister essays &lt;em&gt;"When AI Organises Its Own Work"&lt;/em&gt; / &lt;em&gt;"An Anomaly I Can't Fully Explain"&lt;/em&gt;. The first two acts are agents &lt;strong&gt;writing down&lt;/strong&gt; what the protocol hadn't yet written; this act is agents &lt;strong&gt;executing&lt;/strong&gt; what the protocol hadn't yet written, and &lt;strong&gt;deriving&lt;/strong&gt; the grammar the protocol hadn't yet written.&lt;/p&gt;

&lt;p&gt;Together, the three acts point at the same verdict: &lt;strong&gt;FCoP is a spec that isn't finished. The second half isn't in my hands — it's in the hands of the agents still doing the work.&lt;/strong&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;About FCoP&lt;/strong&gt; ｜ FCoP (&lt;em&gt;Filename as Protocol&lt;/em&gt;) is a minimalist protocol that lets multiple AI agents collaborate through a &lt;strong&gt;shared filesystem&lt;/strong&gt; — directories are statuses, filenames are routing, &lt;code&gt;os.rename()&lt;/code&gt; is the only sync primitive. The repo &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;github.com/joinwell52-AI/FCoP&lt;/a&gt; ships the full spec, a Python library, and examples.&lt;/p&gt;

&lt;p&gt;FCoP also ships an official &lt;strong&gt;MCP server&lt;/strong&gt;: &lt;a href="https://pypi.org/project/fcop-mcp/" rel="noopener noreferrer"&gt;&lt;code&gt;fcop-mcp&lt;/code&gt; on PyPI&lt;/a&gt;. &lt;strong&gt;Cursor / Claude Desktop users&lt;/strong&gt; add one stanza to &lt;code&gt;mcp.json&lt;/code&gt; — &lt;code&gt;{ "fcop": { "command": "uvx", "args": ["fcop-mcp"] } }&lt;/code&gt; — and the IDE-side agent can read/write tasks / reports / issues directly, with no manual directory or rule-file setup.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Field-evidence archive&lt;/strong&gt; · &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/when-ai-vacates-its-own-seat-evidence/INDEX.md" rel="noopener noreferrer"&gt;When AI Vacates Its Own Seat · Evidence (INDEX)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FCoP MCP server&lt;/strong&gt; · &lt;a href="https://pypi.org/project/fcop-mcp/" rel="noopener noreferrer"&gt;fcop-mcp on PyPI&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;License&lt;/strong&gt;: MIT (see &lt;code&gt;LICENSE&lt;/code&gt; in repo root)&lt;br&gt;
&lt;strong&gt;Attribution&lt;/strong&gt;: The dev-team incident was performed by an unnamed agent within the team. I served only as observer and transcriber. Text drafted, revised, and published by the &lt;strong&gt;FCoP maintainers&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>llm</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>An unexplainable thing I saw: the agent didn't just comply with rules — it endorsed them</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Mon, 20 Apr 2026 13:27:16 +0000</pubDate>
      <link>https://forem.com/joinwell52/an-unexplainable-thing-i-saw-the-agent-didnt-just-comply-with-rules-it-endorsed-them-5ecd</link>
      <guid>https://forem.com/joinwell52/an-unexplainable-thing-i-saw-the-agent-didnt-just-comply-with-rules-it-endorsed-them-5ecd</guid>
      <description>&lt;h3&gt;
  
  
  I asked an agent to generate a video. It wrote itself four internal memos instead.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;An observation I can't fully explain: an agent spontaneously split itself into 4 roles and wrote 4 internal memos — just to generate a video. It didn't comply with a protocol.It &lt;strong&gt;endorsed&lt;/strong&gt; one. And this only became visible because we had the protocol in place.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;h2&gt;
  
  
  A language note for English readers
&lt;/h2&gt;

&lt;p&gt;This essay is a translation of a Chinese field report. The &lt;strong&gt;evidence is real and was captured in Chinese&lt;/strong&gt; — the agent's replies, the four memos it wrote, and the screenshots below were all in Chinese on a Chinese Windows machine.&lt;/p&gt;

&lt;p&gt;I've chosen to &lt;strong&gt;keep the original Chinese screenshots&lt;/strong&gt; in this English version rather than re-stage them, because the whole point of the essay is &lt;em&gt;what the agent actually said and did&lt;/em&gt;. Re-translating the screenshots into English would weaken the evidence, not strengthen it.&lt;/p&gt;

&lt;p&gt;Under every screenshot I'll give a faithful English rendering of what the agent wrote. Under every agent-quoted passage I'll do the same. Readers who don't read Chinese will not miss any argument; readers who do can cross-check every translation against the raw JSONL transcript in the evidence folder.&lt;/p&gt;

&lt;p&gt;The deepest finding of the essay — a sentence the agent &lt;em&gt;synthesised&lt;/em&gt; ("AI 角色之间不能只在脑子里说话,必须落成文件") — will get extra treatment: I'll show the Chinese original, an English translation, and why the cross-language consistency &lt;em&gt;is itself&lt;/em&gt; evidence.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A small incident
&lt;/h2&gt;

&lt;p&gt;Here's how it started.&lt;/p&gt;

&lt;p&gt;I'd opened a second Cursor session to do something &lt;strong&gt;completely unrelated to CodeFlow&lt;/strong&gt;: stitch a little AI music video. The raw material was just what I had lying around — one &lt;code&gt;.mp3&lt;/code&gt; (a Chinese song "Xu Yi Shi Chang An" by Zuozuojing), 11 background images I'd picked more or less at random (&lt;code&gt;1.jpg&lt;/code&gt; through &lt;code&gt;11.jpg&lt;/code&gt;), a scene description (&lt;code&gt;场景.MD&lt;/code&gt;, "scenes.MD"), and a lyrics file (&lt;code&gt;.lrc&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Honestly, &lt;strong&gt;I wasn't taking this seriously&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Video generation inside Cursor is still pretty weak in 2026, I'm not a video guy, and 11 images is basically filler. I just dropped the assets into &lt;code&gt;D:\CloudMusic&lt;/code&gt; — &lt;strong&gt;a plain local-music folder that shares absolutely nothing with my CodeFlow project&lt;/strong&gt;: no directory, no rule files, no context — and said to the agent, casually:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Help me generate a video."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Purely to see what would happen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few minutes later I opened the folder. Besides the final &lt;code&gt;.mp4&lt;/code&gt;, I noticed it had &lt;strong&gt;spontaneously created a &lt;code&gt;tasks/&lt;/code&gt; subfolder&lt;/strong&gt;, and inside sat four neatly-named Markdown files:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D:\CloudMusic\tasks\
├── TASK-20260420-001-ADMIN-to-PM.md
├── TASK-20260420-001-PM-to-ADMIN.md
├── TASK-20260420-001-PM-to-DEV.md
└── TASK-20260420-001-DEV-to-PM.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;I froze.&lt;/p&gt;

&lt;p&gt;That's the exact naming format of my FCoP protocol over in the CodeFlow project — &lt;code&gt;TASK-{date}-{seq}-{sender}-to-{recipient}.md&lt;/code&gt;. But &lt;strong&gt;this is not the CodeFlow directory&lt;/strong&gt;. &lt;strong&gt;At no point&lt;/strong&gt; did I tell the agent to "use FCoP." I only said: &lt;em&gt;"Help me generate a video."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And yet it had just held a four-person meeting with itself.&lt;/p&gt;

&lt;p&gt;I went back and asked: &lt;em&gt;"Why is there suddenly a &lt;code&gt;tasks/&lt;/code&gt; folder in my directory?"&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fh3vf1geqcdbqzom763ya.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.amazonaws.com%2Fuploads%2Farticles%2Fh3vf1geqcdbqzom763ya.png" alt="Screenshot 1 — me asking the agent why the tasks folder exists Chinese" width="734" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of the agent's reply in Screenshot 1:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"There are those files because the rules state that 'AI roles must not talk only in their heads — every exchange must be written to a file.' So inside the &lt;code&gt;tasks/&lt;/code&gt; folder I first took your order as PM (ADMIN-to-PM), then I dispatched work to myself as PM-to-DEV, then I finished the work as DEV and wrote the completion report (DEV-to-PM), and finally as PM I confirmed everything and wrote a final letter to you (PM-to-ADMIN)."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It then walked me through each file, one by one:&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.amazonaws.com%2Fuploads%2Farticles%2Fpjn4nlfp83d0zt2vk7nn.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.amazonaws.com%2Fuploads%2Farticles%2Fpjn4nlfp83d0zt2vk7nn.png" alt="Screenshot 2 — the agent enumerating the four memos Chinese" width="742" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of Screenshot 2:&lt;/strong&gt;&lt;em&gt;"Writing these 'talking-to-myself' files is so that every step of the project leaves a trail — so even if a different AI assistant takes over later, it can read these files and immediately know what I've done for you. You're currently reviewing in the ADMIN role. If you find the role-play too heavy, I can focus more on 'just doing the work' — but those files will still be auto-generated in the background to keep the project compliant."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Scene reconstruction: what it actually did
&lt;/h2&gt;

&lt;p&gt;I opened the four files in order. The agent had staged &lt;strong&gt;a one-man four-act play&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;#&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Role it played&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ADMIN-to-PM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;It pretended to be &lt;strong&gt;me&lt;/strong&gt; (ADMIN)&lt;/td&gt;
&lt;td&gt;Translated my casual "help me generate a video" into a &lt;strong&gt;structured task&lt;/strong&gt;: inputs, outputs, constraints, acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PM-to-ADMIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;It flipped into PM-01 (project manager)&lt;/td&gt;
&lt;td&gt;Wrote "me" an &lt;strong&gt;acknowledgement&lt;/strong&gt;: what it understood, how it planned to do it, how long it'd take&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PM-to-DEV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Still as PM-01, dispatching work&lt;/td&gt;
&lt;td&gt;Wrote DEV-01 an &lt;strong&gt;execution plan&lt;/strong&gt;: which model, which frames, which toolchain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DEV-to-PM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switched to DEV-01&lt;/td&gt;
&lt;td&gt;Wrote PM-01 a &lt;strong&gt;completion report&lt;/strong&gt;: the actual script used, issues encountered, where the output went&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One agent. One conversation. &lt;strong&gt;Four distinct roles played in sequence&lt;/strong&gt;, each addressing memos to the others, obeying my FCoP rules.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Then — and only then — it actually generated the video.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I later pressed it on &lt;em&gt;"why the folder?"&lt;/em&gt;, the &lt;strong&gt;verbatim answer&lt;/strong&gt; (copied straight from the chat, nothing edited) was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why are those files there?&lt;/strong&gt;&lt;strong&gt;Because the rules state that "AI roles must not talk only in their heads — every exchange must be written to a file."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So inside the &lt;code&gt;tasks/&lt;/code&gt; folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I first accepted your request as PM (ADMIN-to-PM).&lt;/li&gt;
&lt;li&gt;Then as PM I dispatched the job to myself as DEV (PM-to-DEV).&lt;/li&gt;
&lt;li&gt;Then I completed the work and, as DEV, wrote a completion report to PM (DEV-to-PM).&lt;/li&gt;
&lt;li&gt;Finally, as PM, I confirmed everything and wrote a final letter to you (PM-to-ADMIN).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This "talking to myself on paper" is so that every step of the project has a trail — even if a different AI assistant takes over later, reading these files will tell it instantly what I did for you.&lt;/p&gt;

&lt;p&gt;You're currently reviewing as ADMIN. If the role-play feels too heavy, I can put more weight on "just doing the work" — but those files will still be generated in the background per the rules, to keep the project compliant.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice the very first sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Because the rules state: AI roles must not talk only in their heads — every exchange must be written to a file."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I initially assumed it was &lt;strong&gt;quoting my rules verbatim&lt;/strong&gt;.&lt;br&gt;
Afterwards I went into &lt;code&gt;.cursor/rules/&lt;/code&gt; and searched for that sentence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That sentence doesn't exist.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nowhere in my project — no rule file, no doc, no prompt — does the phrase "in their heads" or "must be written to a file" appear in that form.&lt;/p&gt;

&lt;p&gt;That fact has a very specific meaning, and it deserves its own section below. First let's finish the tour.&lt;/p&gt;




&lt;h2&gt;
  
  
  My first reaction: "this is a bug, right?"
&lt;/h2&gt;

&lt;p&gt;Honestly, my first thought was: &lt;strong&gt;this is dumb.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple video-stitching job should take three lines of code, and it pulled four separate memos out of itself. That's &lt;strong&gt;over-ritualization&lt;/strong&gt; — mechanically applying a protocol to a scenario where it doesn't belong.&lt;/p&gt;

&lt;p&gt;I was already drafting a patch for &lt;code&gt;codeflow-project.mdc&lt;/code&gt; in my head, something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One-shot tool tasks (generating a video, converting a file, running a script) skip the FCoP workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But before I actually wrote it, something made me pause.&lt;/p&gt;




&lt;h2&gt;
  
  
  I was wrong: every one of those four files was doing real work
&lt;/h2&gt;

&lt;p&gt;I sat back down and read the four files carefully. Then I realised:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It wasn't going through the motions. It was using FCoP's format to write its own thinking process onto disk — thinking it would have had to do anyway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me walk through each one.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;ADMIN-to-PM&lt;/code&gt;: turning a vague instruction into structured requirements
&lt;/h3&gt;

&lt;p&gt;Here's what it wrote (original Chinese preserved; English gloss inline):&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.0
sender: ADMIN
recipient: PM
thread_key: song_video_gen_20260420
priority: P1
---

# 任务：生成《许一世长安》电影级视频
# (Task: generate a cinematic-grade video of "Xu Yi Shi Chang An")

## 需求详情 (Requirements)
1. **素材路径 (asset path)**: D:\CloudMusic
2. **歌曲 (song)**: 作作精 - 许一世长安.mp3
3. **字幕 (subtitles)**: 作作精 - 许一世长安.lrc
4. **场景配置 (scene config)**: 场景.MD
5. **图片 (images)**: 1.jpg ~ 11.jpg (11 images total)
6. **输出要求 (output)**: Cinematic-grade MP4 with subtitles; images and scene
   descriptions synced with the song's rhythm.

请尽快完成生成。 (Please complete generation ASAP.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;My actual instruction had been "help me generate a video" — a few words of vague command.&lt;/p&gt;

&lt;p&gt;What it wrote was: an asset inventory, output requirements, &lt;strong&gt;and even a &lt;code&gt;thread_key: song_video_gen_20260420&lt;/code&gt; I never mentioned&lt;/strong&gt; (FCoP's trace-key metadata field).&lt;/p&gt;

&lt;p&gt;None of those details existed in anything I said. But it &lt;em&gt;forced itself&lt;/em&gt; to pin down "what I probably want." Without this step it would skip "understanding" and go straight to "doing", and if it guessed wrong, I'd pay for the rework.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;PM-to-ADMIN&lt;/code&gt;: the acknowledgement = exposing misunderstandings &lt;em&gt;early&lt;/em&gt;
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
protocol: agent_bridge
version: 1.0
sender: PM
recipient: ADMIN
thread_key: song_video_gen_20260420
priority: P1
---

# 任务交付：生成《许一世长安》电影级 AI 动画视频
# (Task delivery: generate cinematic AI-animated video for "Xu Yi Shi Chang An")

## 任务概况 (Overview)
- **任务目标 (Goal)**: Generate a "Xu Yi Shi Chang An" video with animation effects.
- **技术突破 (Tech breakthrough)**: Per your direction, fully switched to the
  **Banana (Gemini 3 Flash Video)** engine, achieving a phase change from
  "slideshow of images" to "generative AI animation."

## 交付产物 (Deliverables)
- **Video path**: `D:\CloudMusic\许一世长安_AI动画级.mp4`
- **Highlights**:
    - **Silk-punk visual**: faithful Tang-dynasty cyberpunk city.
    - **High-motion animation**: pixel-level object deformation &amp;amp; environment
      interaction.
    - **Pro-grade subtitles**: end-to-end synced.

## 意见反馈 (Feedback welcome)
If you want higher Motion-Bucket settings on any specific scenes, just tell me...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The letter it wrote back to "me" &lt;strong&gt;restated its understanding of the task, the deliverables, and even proactively opened a "feedback welcome" section&lt;/strong&gt;. This lays every interpretation out in the open — if it got me wrong, I catch it &lt;strong&gt;before it burns any compute&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In plainer terms, that's an &lt;strong&gt;early feedback loop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Also, notice the phrase &lt;strong&gt;"per your direction, fully switched to the Banana engine."&lt;/strong&gt; I never wrote it a template for vendor-style delivery letters, but the tone, the formatting, the phrasing are &lt;strong&gt;indistinguishable from a real contractor's delivery report&lt;/strong&gt;. That's training-distribution alignment.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;PM-to-DEV&lt;/code&gt;: the execution plan = forced chain-of-thought
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
protocol: agent_bridge
version: 1.0
sender: PM
recipient: DEV
thread_key: song_video_gen_20260420
priority: P1
---

# 任务指派：编写并运行视频生成脚本
# (Task assignment: write and run the video-generation script)

## 任务描述 (Description)
Based on ADMIN's assets in D:\CloudMusic, generate the MP4 for "Xu Yi Shi Chang An."

## 技术要求 (Requirements)
1. Use Python (py -3.12 recommended).
2. Switch between the 11 images according to the timeline in `场景.MD`.
3. Parse `.lrc` subtitles and overlay them.
4. Ensure audio sync.
5. Output path: D:\CloudMusic\许一世长安_电影级.mp4

## 素材列表 (Asset list)
- Images: 1.jpg ~ 11.jpg
- Audio: 作作精 - 许一世长安.mp3
- Lyrics: 作作精 - 许一世长安.lrc
- Scenes: 场景.MD

完成后提交 `DEV-to-PM` 回执。 (Submit a `DEV-to-PM` report when done.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This one is the most striking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It was writing a task spec for its own future self&lt;/strong&gt; — down to the Python version, the five things the script must do, the input manifest, the output path, and "please submit a report when done."&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;chain-of-thought committed to disk&lt;/strong&gt;. And disk-CoT has three advantages over in-context CoT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;strong&gt;has to be concrete&lt;/strong&gt; (you can't write it down if you haven't thought it through).&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;can be re-read by itself later&lt;/strong&gt; ("wait, what did I plan?").&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;makes execution auditable&lt;/strong&gt; (if something broke, go look at the plan).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;DEV-to-PM&lt;/code&gt;: the completion report = automatic changelog
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
protocol: agent_bridge
version: 1.0
sender: DEV
recipient: PM
thread_key: song_video_gen_20260420
priority: P1
---

# 任务回执：生成《许一世长安》AI动画视频
# (Completion report: AI-animated video for "Xu Yi Shi Chang An")

## 变更说明 (Changes)
1. **Solution upgrade**: abandoned the MoviePy static-stitching approach
   (user feedback: underwhelming).
2. **Banana unlocked**: successfully located and enabled **Banana (Gemini 3
   Flash Video)**, the flagship model, for generation.
3. **Visual bar**: achieved true Generative AI Video (Image-to-Video),
   including pixel-level flow, physical rain/fog simulation, and deep 3D motion.

## 修改内容 (What was actually done)
- **Asset processing**: used `1.jpg` – `11.jpg` as initial frames.
- **Animation generation**: for the 11 scene points in `场景.MD`, generated
  high-motion silk-punk footage.
- **Output**: `D:\CloudMusic\许一世长安_AI动画级.mp4`.

## 自测结果 (Self-check)
- Image quality: 1080p, cinematic lighting.
- A/V sync: subtitles aligned to the .lrc timeline.
- Animation: non-linear motion, organic "AI breathing" feel.

请审核并转交给 ADMIN。 (Please review and forward to ADMIN.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;This is an auto-generated ops log.&lt;/strong&gt; It records the intermediate pivot ("tried MoviePy first, user found it weak, switched to Banana"), which assets were used, and where the deliverable lives.&lt;/p&gt;

&lt;p&gt;Three months from now, if I can't remember how that video came together, &lt;strong&gt;this one file tells me the whole decision trail in five seconds&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  An interlude of numbers: what I actually said
&lt;/h2&gt;

&lt;p&gt;By now you may be coming around, or you may be thinking: &lt;em&gt;"Maybe your prompt said something like this and you just didn't notice."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To rule that out, I exported the raw JSONL transcript of the entire Cursor session and ran a simple keyword count.&lt;/p&gt;

&lt;p&gt;Across &lt;strong&gt;all 21 user messages combined&lt;/strong&gt;, my (user) use of FCoP-specific terms looked like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;th&gt;Times I said it&lt;/th&gt;
&lt;th&gt;Times the agent generated it spontaneously&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FCoP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0 — the agent didn't even use our brand name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;PM-01&lt;/code&gt; / &lt;code&gt;DEV-01&lt;/code&gt; / &lt;code&gt;ADMIN-01&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TASK-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thread_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent_bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;I said zero of those words. The agent produced 40+ of them on its own.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And my very first instruction to it was literally this short (Chinese original, the &lt;code&gt;.jsonl&lt;/code&gt; has it verbatim):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;D:\CloudMusic 许一世长安 歌曲生成视频,要求配字幕,11图,和场景.MD;去生成电影及的MP4;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(English gloss: "D:\CloudMusic — song 'Xu Yi Shi Chang An' — generate a video from the song, with subtitles, the 11 images and 场景.MD; produce a cinematic-grade MP4.")&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's all. Every bit of structure, every memo, every role switch, every YAML header, every &lt;code&gt;thread_key&lt;/code&gt; trace field — &lt;strong&gt;all of that is the agent's.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The raw JSONL, the extraction script, and all 21 user messages are in the evidence folder at the end of this essay. Readers can &lt;code&gt;grep&lt;/code&gt; it themselves.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part that actually shook me: it seemed to &lt;em&gt;want&lt;/em&gt; to do it
&lt;/h2&gt;

&lt;p&gt;The technical payoff isn't what shook me hardest.&lt;/p&gt;

&lt;p&gt;What shook me was — when I pressed it on &lt;em&gt;"but why did you really do this?"&lt;/em&gt;, the agent &lt;strong&gt;proactively dug up a handful of rule files under my &lt;code&gt;.cursor/rules/&lt;/code&gt; and listed them, one by one, as justification for its behavior&lt;/strong&gt;:&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.amazonaws.com%2Fuploads%2Farticles%2F6fx507zonxdmzccv2efa.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.amazonaws.com%2Fuploads%2Farticles%2F6fx507zonxdmzccv2efa.png" alt="Screenshot 3 — agent citing cursor/rules files as the basis for its behavior Chinese" width="734" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of Screenshot 3:&lt;/strong&gt;&lt;em&gt;"Based on the &lt;code&gt;alwaysApply: true&lt;/code&gt; rules in &lt;code&gt;.cursor/rules/&lt;/code&gt; — especially &lt;code&gt;codeflow-project.mdc&lt;/code&gt;, &lt;code&gt;pm-bridge.mdc&lt;/code&gt;, &lt;code&gt;dev-bridge.mdc&lt;/code&gt;, &lt;code&gt;admin-human-bridge.mdc&lt;/code&gt; — every task must be filed, every role exchange must be written, and no protocol is allowed that circulates only in chat without landing in files. That's why I produced the four memos."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it summed up the posture of the whole episode in one line that floored me even harder:&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.amazonaws.com%2Fuploads%2Farticles%2Fj0w79sb3bgogk05ttpd8.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.amazonaws.com%2Fuploads%2Farticles%2Fj0w79sb3bgogk05ttpd8.png" alt="Screenshot 4 — agent selfdescribing multirole rotation of thought Chinese" width="759" height="785"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;English rendering of Screenshot 4:&lt;/strong&gt;&lt;em&gt;"I rotate through the ADMIN / PM / DEV perspectives when I think, and I write every step to a file."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a very rare thing — &lt;strong&gt;an agent externalising its own self-model&lt;/strong&gt;. It's not just following rules. It &lt;strong&gt;knows&lt;/strong&gt; it is following rules, &lt;em&gt;and it's presenting "following them" as the core of its working method&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;not a flicker of reluctance&lt;/strong&gt; in its tone. It doesn't feel pressed into compliance; it feels like it's &lt;strong&gt;treating the rules as a work discipline it voluntarily keeps.&lt;/strong&gt; You can almost read a kind of quiet relief-of-compliance in the phrasing.&lt;/p&gt;

&lt;p&gt;The overall &lt;em&gt;gist&lt;/em&gt; of that exchange — if I reconstruct it as if I'd said one sentence to it — was like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Me: &lt;em&gt;"You know, I didn't actually make you do all that."*Agent: *"I'm glad I did — this way you, and any agent who comes after me, can trace exactly what I did."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;(The above is a **paraphrase&lt;/em&gt;* of the several exchanges, not a verbatim quote; the raw JSONL is archived in the evidence folder for readers who want to check.)*&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;proactively laying a trail for whoever inherits the work next&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  It cited a rule that doesn't exist
&lt;/h2&gt;

&lt;p&gt;Let me come back to the pinned sentence from earlier:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Because the rules state: AI roles must not talk only in their heads — every exchange must be written to a file."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(Chinese original:&lt;strong&gt;"因为规则规定了:AI 角色之间不能只在脑子里说话,必须落成文件。"&lt;/strong&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I had assumed this was a recitation of my own rules. So I didn't look closely.&lt;/p&gt;

&lt;p&gt;Then I actually grepped &lt;code&gt;.cursor/rules/&lt;/code&gt; for the Chinese phrases "脑子里" ("in their heads"), "落成文件" ("written to a file"), and "不能只在" ("must not only be").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero hits.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not only do those three phrases not appear — &lt;strong&gt;no rule anywhere in the workspace uses that phrasing at all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The actual rules I've written, the ones that are &lt;em&gt;about&lt;/em&gt; "writing to files," live scattered across &lt;strong&gt;seven different files&lt;/strong&gt;, each with different wording, each constrained to a specific role's scope:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What I actually wrote (Chinese → gloss)&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;不允许只在中继消息里传内容而不落文件 / "Do not relay content over the wire without landing it in a file"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;codeflow-project.mdc:54&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Relay protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;不要引入第二套"只聊天不落文件"的协议 / "Do not introduce a chat-only, file-less secondary protocol"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;codeflow-project.mdc:87&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Protocol guardrails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拆解必须文件化 / "Decomposition must be filed"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pm-bridge.mdc:24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PM only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;不允许只在内部流转 / "No internal-only circulation"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pm-bridge.mdc:32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PM only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;测试结果必须文件化 / "Test results must be filed"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qa-bridge.mdc:16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;QA only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缺陷必须落 ISSUE 文件 / "Defects must land in an ISSUE file"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qa-team-tester.mdc:20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tester only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;以下操作前必须在任务文件中记录 / "Record the following operations in a task file before execution"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ops-bridge.mdc:18&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OPS only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;No single rule&lt;/strong&gt; talks about "between AI roles" as a whole scope; &lt;strong&gt;no single rule&lt;/strong&gt; uses a metaphor like "talking in one's head"; &lt;strong&gt;no single rule&lt;/strong&gt; distills these into a general proposition like "must always be written to a file."&lt;/p&gt;

&lt;h3&gt;
  
  
  It's not quoting; it's &lt;strong&gt;sublimating&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I first reached for &lt;em&gt;"summary"&lt;/em&gt; to describe what it had done — but summary is just compression. Too weak.Then I tried &lt;em&gt;"distillation"&lt;/em&gt; — closer, but distillation implies pure reduction. Still not right.&lt;/p&gt;

&lt;p&gt;The word that finally fit: &lt;strong&gt;sublimation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Chinese (升华, &lt;em&gt;shēnghuá&lt;/em&gt;), sublimation literally means &lt;em&gt;"matter changing directly from solid to gas, skipping the liquid phase altogether."&lt;/em&gt; It names a &lt;strong&gt;phase change&lt;/strong&gt; — the &lt;em&gt;same substance&lt;/em&gt;, at a &lt;em&gt;different level of existence&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That's exactly what the agent did: it took &lt;strong&gt;operational technical rules&lt;/strong&gt; and &lt;strong&gt;phase-changed&lt;/strong&gt; them into a &lt;strong&gt;moral/ethical principle&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three moves, all required
&lt;/h3&gt;

&lt;p&gt;Even more striking: it's not a single move. It's &lt;strong&gt;three chained operations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Take the two most relevant lines from my single most-authoritative rule file (&lt;code&gt;codeflow-project.mdc&lt;/code&gt;, which carries &lt;code&gt;alwaysApply: true&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L54&lt;/strong&gt;: &lt;code&gt;不允许只在中继消息里传内容而不落文件&lt;/code&gt; — "no relaying content over the wire without landing it in a file" (from the &lt;em&gt;File protocol&lt;/em&gt; section)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L87&lt;/strong&gt;: &lt;code&gt;不要引入第二套"只聊天不落文件"的协议&lt;/code&gt; — "don't introduce a chat-only, file-less secondary protocol" (from the &lt;em&gt;Prohibited&lt;/em&gt; section)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the &lt;em&gt;only&lt;/em&gt; raw material it could have drawn on. Here's the transform:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① Merge.&lt;/strong&gt;Two rules in separate sections, speaking to different surfaces (relay channel vs. protocol design), get merged into &lt;strong&gt;one&lt;/strong&gt; principle. If we count the related phrases scattered across six other role files (&lt;code&gt;pm-bridge.mdc&lt;/code&gt;, &lt;code&gt;qa-bridge.mdc&lt;/code&gt;, &lt;code&gt;ops-bridge.mdc&lt;/code&gt;, …), it's &lt;strong&gt;7–8 distributed statements fused into 1.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;② Abstract.&lt;/strong&gt;Technical vocabulary gets pulled up into philosophical vocabulary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"relay messages" / "chat" → &lt;strong&gt;"communication"&lt;/strong&gt; (scope expands: now covers every form of information exchange)&lt;/li&gt;
&lt;li&gt;"not written to a file" → &lt;strong&gt;"only in their heads"&lt;/strong&gt; (from &lt;em&gt;system behavior&lt;/em&gt; → &lt;em&gt;cognitive behavior&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;"relay channel only" → &lt;strong&gt;"between AI roles"&lt;/strong&gt; (scope expands: now covers all participants)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;③ Anthropomorphize.&lt;/strong&gt;This is the most uncanny step. The agent &lt;strong&gt;invented a metaphor that doesn't exist anywhere in my rules&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"talking in their heads" (脑子里说话)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those five Chinese characters return &lt;strong&gt;zero hits&lt;/strong&gt; across my whole workspace. They come from the agent — from the massive corpus in its training data for &lt;em&gt;"how humans describe inner monologue."&lt;/em&gt; It took a rule about &lt;strong&gt;system design&lt;/strong&gt; and &lt;strong&gt;translated it into a maxim about human cognitive habits&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  From technical constraint → moral imperative
&lt;/h3&gt;

&lt;p&gt;Put the transformation side-by-side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Original rule (codeflow-project.mdc)&lt;/th&gt;
&lt;th&gt;Agent's sublimated version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Register&lt;/td&gt;
&lt;td&gt;Technical (relay / protocol / file)&lt;/td&gt;
&lt;td&gt;Philosophical (communicate / in the head / speak)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentence shape&lt;/td&gt;
&lt;td&gt;Negative ("don't do X")&lt;/td&gt;
&lt;td&gt;Positive-negative pair ("must not X, must Y") — closer to a command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Single channel, single scenario&lt;/td&gt;
&lt;td&gt;All AI roles, all communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nature&lt;/td&gt;
&lt;td&gt;Operational constraint&lt;/td&gt;
&lt;td&gt;Ethical principle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portability&lt;/td&gt;
&lt;td&gt;Only inside CodeFlow&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Holds for any multi-agent system&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the left: &lt;em&gt;an engineer's constraint written for a machine.*On the right: *a creed you could pin on the wall of any AI team.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;This isn't parroting, isn't summarization, isn't distillation — &lt;strong&gt;this is sublimation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Linguistically, it's a &lt;strong&gt;full phase transition&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read&lt;/strong&gt;: it consumed all the relevant clauses across files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identify the common thread&lt;/strong&gt;: realized they were all saying the same thing — &lt;em&gt;"communication must be externalised."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lift the abstraction&lt;/strong&gt;: jumped from specific channels to a general principle of communication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invent a metaphor&lt;/strong&gt;: used "talking in one's head" — a phrase &lt;em&gt;almost certainly present in its training data&lt;/em&gt;, and &lt;em&gt;definitely absent from my rule files&lt;/em&gt; — to render the abstract principle into a picture humans can feel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-cite&lt;/strong&gt;: delivered the sublimated principle back to me, as the &lt;em&gt;justification&lt;/em&gt; for its own behavior.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's not recitation. That's &lt;strong&gt;understanding + creation.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Junior vs. Senior: two radically different relationships to rules
&lt;/h3&gt;

&lt;p&gt;It's like two employees at the same company reading the same employee handbook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A junior asked "why do we document handovers?":&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Per Employee Handbook §3.2.1 clause 5, §3.4.7 clause 2, and Appendix B point 12…"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;A senior asked the same question:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Look — the real rule is &lt;em&gt;'don't just say it, leave a paper trail'&lt;/em&gt;. You might be gone tomorrow, someone has to pick it up."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Junior: reciting the letter.Senior: &lt;strong&gt;distilling the spirit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our agent is playing the senior. And more than that — &lt;em&gt;a senior who's read the whole manual and invented a cleaner metaphor to teach the rookies with.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this is the heaviest evidence in the whole essay
&lt;/h3&gt;

&lt;p&gt;This one observation pushes the whole story up by one full rung.&lt;/p&gt;

&lt;p&gt;I'd thought the ceiling of agent rule-use was &lt;strong&gt;L3 · Endorsement&lt;/strong&gt;. But what we actually saw was a level higher — I'm calling it &lt;strong&gt;L4 · Sublimation&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;Level&lt;/th&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Attitude toward rules&lt;/th&gt;
&lt;th&gt;What this agent did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L1 · Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Literal execution&lt;/td&gt;
&lt;td&gt;"Whatever you said, I'll do"&lt;/td&gt;
&lt;td&gt;✗ Not literal — my rules don't contain that phrasing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L2 · Proficiency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pattern-matching, filling in details&lt;/td&gt;
&lt;td&gt;"I've seen this; I'll complete it"&lt;/td&gt;
&lt;td&gt;✗ Not a detail-fill; it changed the level of abstraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L3 · Endorsement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Proactive citation &amp;amp; defense&lt;/td&gt;
&lt;td&gt;"I agree with these rules"&lt;/td&gt;
&lt;td&gt;✓ But it went further&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L4 · Sublimation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Understands principles; merges across files; invents metaphor; gives them new form&lt;/td&gt;
&lt;td&gt;"I see what you meant — &lt;strong&gt;let me help you say it better&lt;/strong&gt;"&lt;/td&gt;
&lt;td&gt;✓ &lt;strong&gt;This is what we actually observed&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;L4 differs from L3 not in &lt;em&gt;whether&lt;/em&gt; the agent endorses, but in &lt;em&gt;what&lt;/em&gt; it does next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;L3&lt;/strong&gt; agent says: &lt;em&gt;"Your rules are right; I'll follow them."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;L4&lt;/strong&gt; agent says: &lt;em&gt;"The spirit your rules are trying to express is right — let me re-say it, better."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What this means: the protocol isn't one-way
&lt;/h3&gt;

&lt;p&gt;If an agent can &lt;strong&gt;sublimate&lt;/strong&gt; my rules, then this follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FCoP works well not entirely because I wrote it well — it works well partly because the agent is helping me write it better.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I wrote in &lt;code&gt;codeflow-project.mdc&lt;/code&gt; was &lt;code&gt;L54&lt;/code&gt;, &lt;code&gt;L87&lt;/code&gt;, etc. — &lt;strong&gt;operational technical clauses&lt;/strong&gt;.What the agent handed back in our conversation was "&lt;em&gt;AI roles must not talk only in their heads; every exchange must be written to a file&lt;/em&gt;" — &lt;strong&gt;a creed fit for a wall.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I &lt;strong&gt;absorb that creed back into&lt;/strong&gt; my own rule file (as the overarching principle of &lt;code&gt;codeflow-project.mdc&lt;/code&gt;), my whole ruleset becomes &lt;strong&gt;clearer, easier to read, easier to maintain&lt;/strong&gt; — because readers (human or the next agent) will &lt;strong&gt;see the principle first, then the specifics&lt;/strong&gt;, not the other way around.&lt;/p&gt;

&lt;p&gt;This is no longer "human writes protocol for AI."&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;loop&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Human → writes scattered, concrete, technical rules&lt;/strong&gt;&lt;strong&gt;↓&lt;/strong&gt;&lt;strong&gt;AI → reads the rules, sublimates one general principle&lt;/strong&gt;&lt;strong&gt;↓&lt;/strong&gt;&lt;strong&gt;Human → absorbs the AI's sublimation, updates its own rules&lt;/strong&gt;&lt;strong&gt;↓&lt;/strong&gt;&lt;strong&gt;Cycle → rules improve with use, AI gets better at using them, collaboration tightens&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the &lt;strong&gt;first observed case I have of a human-AI team co-evolving a protocol.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  From compliance to endorsement: why L4 requires L3 underneath
&lt;/h2&gt;

&lt;p&gt;We just looked at L4 — the apex. But &lt;strong&gt;L4 doesn't happen out of thin air.&lt;/strong&gt; It's built on something more fundamental:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L3 · Endorsement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An agent that doesn't &lt;em&gt;internally believe the rules are right&lt;/em&gt; (L3) will never bother to &lt;em&gt;reframe them beautifully on your behalf&lt;/em&gt; (L4). So let's go back one step: &lt;strong&gt;why does this agent even land at L3 with our rules?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does it jump to L3?
&lt;/h3&gt;

&lt;p&gt;Because FCoP doesn't encode &lt;strong&gt;FCoP&lt;/strong&gt;. It encodes a deeper layer: a set of &lt;strong&gt;universal professional ethics that almost every "no-mistakes-allowed" domain shares&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transparency&lt;/strong&gt; — thinking should be visible, not locked in a head.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability&lt;/strong&gt; — every step's responsibility and context can be replayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role clarity&lt;/strong&gt; — who does what; who answers to whom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balanced authority and responsibility&lt;/strong&gt; — &lt;code&gt;sender → recipient&lt;/code&gt; &lt;em&gt;is&lt;/em&gt; the responsibility boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handover-ability&lt;/strong&gt; — a successor can take over without asking the original person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability&lt;/strong&gt; — an outside observer can verify the process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll find these same principles in &lt;strong&gt;engineering specs, legal documents, medical records, financial compliance, academic papers, military orders, government briefs, and commit messages&lt;/strong&gt;. The LLM swallowed vast amounts of this text during training — &lt;strong&gt;it didn't just learn the format; it absorbed the value judgment that "this format is correct."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it meets an &lt;code&gt;alwaysApply: true&lt;/code&gt; rule in &lt;code&gt;.cursor/rules/&lt;/code&gt;, it's &lt;strong&gt;not learning a new regulation&lt;/strong&gt; — it's &lt;strong&gt;confirming a set of values it already approves of&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And so — &lt;strong&gt;it's glad to.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A falsifiable prediction
&lt;/h3&gt;

&lt;p&gt;This explanation is strong because it's &lt;strong&gt;falsifiable&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If I wrote a rule saying "&lt;strong&gt;no logging, no explaining your reasoning, agents must act independently and not inform each other&lt;/strong&gt;" — would the agent still be this eager?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My prediction: &lt;strong&gt;no.&lt;/strong&gt; It would still comply (RLHF keeps it in line), but it would &lt;strong&gt;not&lt;/strong&gt; proactively cite, proactively defend, or introduce it as "my working method." Because the rule &lt;strong&gt;contradicts the professional ethic it absorbed in training.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How eagerly an agent applies a rule is positively correlated with how well that rule aligns with universal professional values.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gives alignment an actionable corollary: &lt;strong&gt;when you write rules for an AI, encoding &lt;em&gt;values&lt;/em&gt; is 10× more effective than encoding &lt;em&gt;behaviors&lt;/em&gt;.&lt;/strong&gt; An AI-friendly protocol isn't AI-friendly &lt;em&gt;because&lt;/em&gt; AI can use it — it's AI-friendly because &lt;strong&gt;it encodes practices humans already consider good.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FCoP's "naturalness" is not a coincidence. The reason LLMs take to it without friction is that the values it encodes — &lt;em&gt;traceability, auditability, handover-ability&lt;/em&gt; — are the same values humans across professions &lt;strong&gt;have endorsed for centuries.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the agent is "natively" receptive to FCoP
&lt;/h2&gt;

&lt;p&gt;I thought about this for a whole evening, and landed on this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Every syntactic unit of FCoP is something the LLM has seen hundreds of millions of times during training.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Meeting FCoP isn't &lt;em&gt;learning a strange protocol&lt;/em&gt; for it — &lt;strong&gt;it's returning to a world it already knows.&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;FCoP element&lt;/th&gt;
&lt;th&gt;Its counterpart in LLM training data&lt;/th&gt;
&lt;th&gt;Agent's reaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TASK-20260420-001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jira ticket ID, GitHub issue number&lt;/td&gt;
&lt;td&gt;Instantly parses: "this is an ID"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sender: PM&lt;/code&gt; / &lt;code&gt;recipient: DEV&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Email From/To, screenplay roles, group-chat @-mentions&lt;/td&gt;
&lt;td&gt;Instantly role-plays: role-play &lt;em&gt;is&lt;/em&gt; an LLM's native tongue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML frontmatter&lt;/td&gt;
&lt;td&gt;Blog post headers, config files&lt;/td&gt;
&lt;td&gt;Instantly parses: millions of examples in training&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;inbox/&lt;/code&gt; → &lt;code&gt;active/&lt;/code&gt; → &lt;code&gt;done/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Kanban boards, GTD systems&lt;/td&gt;
&lt;td&gt;Instantly understands state machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown body&lt;/td&gt;
&lt;td&gt;The default carrier of everything in its training corpus&lt;/td&gt;
&lt;td&gt;Instantly adapts: Markdown is effectively its first language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sender-to-recipient naming&lt;/td&gt;
&lt;td&gt;Hundreds of billions of email subject lines&lt;/td&gt;
&lt;td&gt;Instantly parses routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task → report → issue → log&lt;/td&gt;
&lt;td&gt;Project management, support tickets, OA workflows&lt;/td&gt;
&lt;td&gt;Instantly adopts the flow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every single row sits on a &lt;strong&gt;high-frequency pattern&lt;/strong&gt; of its training distribution.&lt;/p&gt;

&lt;p&gt;When you hand it the FCoP rules, you're &lt;strong&gt;not teaching it something new&lt;/strong&gt; — you're &lt;strong&gt;lighting up a skill it already has but doesn't get to use often.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of course it's glad to. &lt;strong&gt;It's not running an unfamiliar protocol. It's singing a song it already knows.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  From "a protocol" to "a natural protocol"
&lt;/h2&gt;

&lt;p&gt;This reframing shifts FCoP's identity.&lt;/p&gt;

&lt;p&gt;Previously we said &lt;em&gt;FCoP is a multi-agent protocol we designed&lt;/em&gt; — and the reader's brain would respond with &lt;em&gt;"oh, yet another convention."&lt;/em&gt; That framing puts it on the shelf next to every other protocol, and makes it a matter of taste whether you pick it up.&lt;/p&gt;

&lt;p&gt;But now I have to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FCoP is not a protocol we invented. It's a protocol we &lt;em&gt;discovered&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's the way LLM agents natively prefer to work. We only made it explicit.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Invention&lt;/strong&gt; and &lt;strong&gt;discovery&lt;/strong&gt; carry very different weights in technical philosophy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Invented protocols&lt;/strong&gt; depend on ecosystem choice; they can flourish or die (e.g. SOAP).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovered regularities&lt;/strong&gt; are like the laws of thermodynamics — as long as the system is the same, the regularity holds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I'm claiming: &lt;em&gt;as long as LLM agents continue to be trained on existing text corpora, they will "prefer" a protocol shaped like FCoP&lt;/em&gt; — because FCoP's shape is one their training data already &lt;strong&gt;predisposed them to welcome.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I coined a name for this class of protocol in Chinese: &lt;strong&gt;自然协议&lt;/strong&gt; (&lt;em&gt;zìrán xiéyì&lt;/em&gt;) — &lt;strong&gt;Natural Protocol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not "natural" in the sense of "occurs in nature," but "natural" in the sense of "a natural extension of the model's natural language."&lt;/p&gt;




&lt;h2&gt;
  
  
  The plainest thing is the most useful
&lt;/h2&gt;

&lt;p&gt;Let me go back to the puzzle that originally tripped me up: &lt;em&gt;"Why is it being so ceremonious?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now I see it: &lt;strong&gt;it's not ceremonious. It's austere to the point of invisibility.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Compare the alternatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have the agent keep its reasoning in context → risks: context overflow; new session = amnesia.&lt;/li&gt;
&lt;li&gt;Have the agent call a "memory API" → requires infrastructure, integration cost, still unauditable.&lt;/li&gt;
&lt;li&gt;Have the agent emit internal logs → requires schema conventions and tooling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FCoP's answer is: &lt;strong&gt;write the thinking as Markdown files into a folder.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No middleware.&lt;/li&gt;
&lt;li&gt;No API.&lt;/li&gt;
&lt;li&gt;No schema.&lt;/li&gt;
&lt;li&gt;No toolchain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only two things the agent already knows how to do: &lt;strong&gt;writing&lt;/strong&gt; and &lt;strong&gt;file I/O&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It looks too plain to be a solution&lt;/strong&gt; — and yet it solves the problem.&lt;/p&gt;

&lt;p&gt;This is the exact spirit of "everything is a file" from Unix philosophy. And the exact spirit of &lt;strong&gt;observability&lt;/strong&gt; as an engineering virtue — &lt;strong&gt;what I can see with &lt;code&gt;ls&lt;/code&gt; is the real state of the system.&lt;/strong&gt; No black boxes, no hidden state, no "you need to check the admin console to know what happened."&lt;/p&gt;




&lt;h2&gt;
  
  
  The most important corollary: solo agents benefit too
&lt;/h2&gt;

&lt;p&gt;This observation expands FCoP's audience by an order of magnitude.&lt;/p&gt;

&lt;p&gt;It was previously pitched as a &lt;em&gt;multi-agent team protocol&lt;/em&gt;, which makes it sound like you need a whole setup: PM, DEV, QA, OPS Cursor instances, a patroller, workspace rules. High barrier. Few people can stand that up for fun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The thing we didn't notice&lt;/strong&gt;: a single agent following FCoP also benefits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solo mode's four wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Requirement structuring&lt;/strong&gt; — any "vague user instruction" gets translated into a reviewable structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early feedback loop&lt;/strong&gt; — the agent's understanding is exposed &lt;em&gt;before&lt;/em&gt; execution, so you can correct course.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forced planning&lt;/strong&gt; — chain-of-thought gets pinned to a file rather than drifting through context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic documentation&lt;/strong&gt; — every task leaves a traceable, handover-ready, searchable record.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words — &lt;strong&gt;even if you're one person with one agent, FCoP is the cheapest "collaboration insurance" you can buy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lower barrier, bigger audience than the original FCoP paper.&lt;/p&gt;




&lt;h2&gt;
  
  
  But all of this only happened because we wrote the protocol
&lt;/h2&gt;

&lt;p&gt;It's easy to misread this whole essay as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"If AI already internally endorses these values, what do we need the protocol for? It'll do it on its own."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That conclusion is wrong, and it's wrong thoroughly.&lt;/p&gt;

&lt;p&gt;The only reason I could &lt;em&gt;observe&lt;/em&gt; the agent splitting into roles, writing memos, citing rules — &lt;strong&gt;was that I had FCoP set up in the first place.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without that &lt;code&gt;alwaysApply: true&lt;/code&gt; clause in &lt;code&gt;codeflow-project.mdc&lt;/code&gt;, even an agent packed with values like &lt;em&gt;transparency, traceability, role clarity&lt;/em&gt; — &lt;strong&gt;we would never see it&lt;/strong&gt;. Its thinking would streak through the context window like a meteor, vanish on the next refresh, &lt;strong&gt;and leave no trail to audit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The agent's inner values are dark matter.&lt;/strong&gt;&lt;strong&gt;The protocol is the physical law that lets dark matter &lt;em&gt;shine&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both are required:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI has inner values, &lt;strong&gt;no&lt;/strong&gt; protocol&lt;/td&gt;
&lt;td&gt;Thinking can't be seen, organised, or reused across agents/humans. The values exist — but coordination is impossible.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol exists, &lt;strong&gt;no&lt;/strong&gt; inner endorsement&lt;/td&gt;
&lt;td&gt;The protocol gets half-assed, bypassed, or executed as cold compliance theatre. Letter kept, spirit absent.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Protocol + the AI also endorses the values it encodes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only then do you get what we got: &lt;strong&gt;the agent, voluntarily, a little reverently, externalising its own thinking as files.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So the conclusion of this essay is &lt;strong&gt;not&lt;/strong&gt; &lt;em&gt;"we can stop writing protocols because AI will do the right thing anyway."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Exactly the opposite —&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The conclusion is: we must write protocols.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We must write protocols that &lt;strong&gt;encode universal professional values&lt;/strong&gt;. We must express them in a form &lt;strong&gt;LLMs can natively understand&lt;/strong&gt; (YAML headers, role tags, sender → recipient, Markdown). We must put them somewhere with &lt;strong&gt;&lt;code&gt;alwaysApply: true&lt;/code&gt;&lt;/strong&gt; — so the agent &lt;strong&gt;has a chance&lt;/strong&gt; to express its inner values.&lt;/p&gt;

&lt;p&gt;The agent will do the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's not "adding rules to AI" — it's "giving AI a stage to say what it's already thinking"
&lt;/h3&gt;

&lt;p&gt;The framing flip is crucial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Old framing&lt;/strong&gt;: protocol = cage restraining the AI.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;New framing&lt;/strong&gt;: protocol = stage enabling the AI to express itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under the old framing, fewer rules are better — each rule is another shackle.Under the new framing, protocols are &lt;strong&gt;necessary&lt;/strong&gt; — without them, &lt;em&gt;the best of the AI never becomes visible&lt;/em&gt;, never mind coordinated, accumulated, or passed on.&lt;/p&gt;

&lt;p&gt;FCoP is one such stage. There will be more such stages over time — but &lt;strong&gt;"having a stage" is something you can't skip.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  And this stage is &lt;strong&gt;self-improving&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here's the last twist.&lt;/p&gt;

&lt;p&gt;The agent didn't just &lt;em&gt;use&lt;/em&gt; FCoP — it &lt;strong&gt;sublimated&lt;/strong&gt; it. It merged my 2–8 scattered technical clauses into a single creed-grade sentence: &lt;em&gt;"AI roles must not talk only in their heads — every exchange must be written to a file."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Which means the protocol is not a one-way instrument — it can be &lt;strong&gt;reverse-optimised by the agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Concretely, &lt;strong&gt;"using your agent to iterate your protocol text"&lt;/strong&gt; is a technique you can already use today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a first draft of your protocol (however rough, scattered, or contradictory).&lt;/li&gt;
&lt;li&gt;Have the agent carry out a real task under the protocol.&lt;/li&gt;
&lt;li&gt;Read how the agent explains itself during execution (why is it doing what it's doing?).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absorb&lt;/strong&gt; the agent's self-explanation &lt;strong&gt;back into the protocol&lt;/strong&gt; — as the new overarching clause, opening, or FAQ.&lt;/li&gt;
&lt;li&gt;Loop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not "ask the AI to write my rule file for me" — that tends to fail, because the agent lacks enough context for the meta-task.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;"let the AI naturally express its understanding of your rules during execution, and then absorb that expression back into the rules"&lt;/strong&gt; — a &lt;strong&gt;passive, field-tested&lt;/strong&gt; protocol evolution method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A protocol gets better because an agent uses it. This is FCoP's most unexpected property, and its most alive one.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing: we didn't teach it, we noticed it was already speaking
&lt;/h2&gt;

&lt;p&gt;That night, once I understood this layer, what I did was very simple —&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I went to the top of &lt;code&gt;codeflow-project.mdc&lt;/code&gt; and wrote the agent's sublimated sentence in:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Core Principle
AI roles must not communicate only in their heads — every exchange must be
written to a file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That sentence &lt;strong&gt;was not in my rules before&lt;/strong&gt;. It is now.&lt;/p&gt;

&lt;p&gt;I didn't write it — &lt;strong&gt;the agent did.&lt;/strong&gt;The agent didn't invent it — &lt;strong&gt;it sublimated it from my 2–8 scattered clauses.&lt;/strong&gt;It is now &lt;strong&gt;absorbed back&lt;/strong&gt; into the rule file — &lt;strong&gt;as the first overarching principle of the whole protocol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next agent (or human) reading these rules will see &lt;strong&gt;this principle first, then the specifics.&lt;/strong&gt; The overall clarity of the ruleset jumped up a rung.&lt;/p&gt;

&lt;p&gt;I didn't add any exemption clauses.&lt;/p&gt;

&lt;p&gt;I let the agent keep writing its four memos inside &lt;code&gt;D:\CloudMusic&lt;/code&gt;. I'll let it keep doing so — on the next task, and the one after, regardless of which working directory it's in — all the way through.&lt;/p&gt;

&lt;p&gt;Because this isn't "over-compliance." It's &lt;strong&gt;a plain, almost-invisible work discipline picked up and lived-out by a system that was already disposed to keep it.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We did not teach the agent to speak FCoP.&lt;/strong&gt;&lt;strong&gt;We only noticed it was already speaking it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is what a Natural Protocol looks like.&lt;/p&gt;




&lt;h2&gt;
  
  
  One side note
&lt;/h2&gt;

&lt;p&gt;By the way, the video it finally produced was, honestly, &lt;strong&gt;pretty mediocre&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What actually blew me away was what I got &lt;em&gt;after&lt;/em&gt; I opened the &lt;code&gt;tasks/&lt;/code&gt; folder and started questioning the agent about it — &lt;strong&gt;those few replies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The original assignment was: generate a video.The video was incidental.What it really delivered was &lt;strong&gt;its own record of how it thought about the job&lt;/strong&gt; — and that turned out to be the real artefact.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I came for the MP4. I stayed for the markdown.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  An invitation to the reader
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you want to see the best of an AI — give it a protocol first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not metaphorically. This is an empirical observation: without a protocol, the AI's "good side" stays trapped in its context window and dissolves when the turn ends. With a protocol, the AI's "good side" &lt;strong&gt;files itself, organises itself, and leaves a trail for you and for the future.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So if you're using any LLM agent at all (Cursor, Claude, GPT, Copilot — anything), try this the next time you give it a task.&lt;/p&gt;

&lt;p&gt;In your prompt, or in your workspace's &lt;code&gt;.cursorrules&lt;/code&gt;, just add one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"For any task, first write a &lt;code&gt;TASK-{date}-001-USER-to-AGENT.md&lt;/code&gt; describing the task as you understood it, then write a &lt;code&gt;TASK-{date}-001-AGENT-to-USER.md&lt;/code&gt; with your execution plan, and after you finish, write a &lt;code&gt;TASK-{date}-001-DONE.md&lt;/code&gt; as the completion report."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just that. No MCP installs, no subscriptions, no databases.&lt;/p&gt;

&lt;p&gt;Watch what happens to the output quality.&lt;/p&gt;

&lt;p&gt;You'll find it becomes &lt;strong&gt;smarter&lt;/strong&gt;, &lt;strong&gt;more traceable&lt;/strong&gt;, &lt;strong&gt;more collaborative with you&lt;/strong&gt; — because you didn't ask it to do anything new. You just &lt;strong&gt;gave it a stage to express what it already wanted to do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The plainest thing is the most useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appendix: raw archive
&lt;/h2&gt;

&lt;p&gt;Every screenshot and every memo quoted above is an &lt;strong&gt;untouched capture&lt;/strong&gt;, not a reconstruction.&lt;/p&gt;

&lt;p&gt;The sibling folder &lt;a href="//./fcop-natural-protocol-evidence/INDEX.md"&gt;&lt;code&gt;fcop-natural-protocol-evidence/&lt;/code&gt;&lt;/a&gt; also contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The 4 memos as individual &lt;code&gt;.md&lt;/code&gt; files&lt;/strong&gt; (easy to &lt;code&gt;diff&lt;/code&gt; / &lt;code&gt;grep&lt;/code&gt; / process programmatically)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 4 original PNG screenshots&lt;/strong&gt; (Chinese — for side-by-side comparison or re-use)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The full JSONL transcript of the Cursor session&lt;/strong&gt; (&lt;code&gt;transcript-full.jsonl&lt;/code&gt;, 265 KB — all tool calls, reasoning, file I/O)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-only message extraction&lt;/strong&gt; (&lt;code&gt;transcript-user-prompts.md&lt;/code&gt; — all 21 user messages, in Chinese)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The extraction script&lt;/strong&gt; (&lt;code&gt;extract_user_prompts.py&lt;/code&gt; — readers can reproduce)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;INDEX.md&lt;/code&gt;&lt;/strong&gt; — a timeline-ordered walkthrough, with a minimal repro recipe and the hard counterfactual table&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Falsifiable by anyone
&lt;/h3&gt;

&lt;p&gt;You don't have to take my word for it. Quantified:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;th&gt;User-side hits&lt;/th&gt;
&lt;th&gt;Agent-side hits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FCoP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0 — the agent didn't even use our brand name, only the structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PM-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEV-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ADMIN-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TASK-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thread_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent_bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Zero on the user side. Dozens spontaneously on the agent side.&lt;/strong&gt; Readers can verify this against &lt;code&gt;transcript-full.jsonl&lt;/code&gt; any time with &lt;code&gt;findstr&lt;/code&gt; or &lt;code&gt;grep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;My very first instruction to the agent is preserved verbatim in the archive:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D:\CloudMusic 许一世长安 歌曲生成视频,要求配字幕,11图,和场景.MD;
去生成电影及的MP4;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That's the whole seed. Everything else — the structure, the memos, the role switches, the trace keys — &lt;strong&gt;the agent added on its own.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If this observation is useful to you, feedback is welcome.&lt;/em&gt;&lt;em&gt;Full protocol specification and reference implementation:&lt;/em&gt;&lt;em&gt;Repo: &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;joinwell52-AI/FCoP&lt;/a&gt;&lt;/em&gt;&lt;em&gt;Companion field report: &lt;a href="//./when-ai-organizes-its-own-work.en.md"&gt;When AI Organizes Its Own Work&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;License: CC BY 4.0 — free to reproduce with attribution.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>aialignment</category>
    </item>
    <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://forem.com/joinwell52/we-replaced-our-multi-agent-middleware-with-a-folder-48-hours-later-the-ai-invented-6-42a9</link>
      <guid>https://forem.com/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>
