cd /news/ai-agents/fcop-grew-a-project-tree Β· home β€Ί topics β€Ί ai-agents β€Ί article
[ARTICLE Β· art-27435] src=dev.to β†— pub= topic=ai-agents verified=true sentiment=Β· neutral

FCoP Grew a Project Tree

FCoP, a multi-agent collaboration protocol, unexpectedly revealed a project tree structure during a workflow test with the CodeFlowMu system. The test, which used a simple Grid Runner mini-game as a probe, exposed that FCoP can express product evolution beyond task flow management. This structural change emerged when a second phase task referenced the first, creating a hierarchical task tree.

read13 min publishedJun 15, 2026

Subtitle: How a Mini-Game Task Revealed Product Evolution Inside a Multi-Agent Workflow

Author: FCoP Maintainer Β· 2026-06-14

Note: Some screenshots are from the Chinese CodeFlowMu console. They are included as workflow evidence; the key protocol signals are the task IDs, lifecycle states, and FCoP fields explained in the captions.

I originally wanted the PM in CodeFlowMu to coordinate DEV, OPS, and QA around a small local mini-game.

The game turned out not to be the important part.

The task tree was.

During one failed archive attempt, FCoP exposed something that had not yet been formally written into the protocol: a project tree.

This article is not really about the Grid Runner game itself. It is about a structural change that appeared while debugging a multi-agent workflow: FCoP was designed to manage task flow. In this run, it started to express product evolution.

FCoP is a multi-agent collaboration protocol. Its core idea is simple: agents should not only β€œtalk” in chat. Their work must land as files. Tasks, reports, review records, and lifecycle transitions all live inside the project directory, so that anyone can later inspect what happened, who did what, and whether the work was actually closed.

CodeFlowMu is an AI collaboration workflow system built on top of FCoP. As ADMIN, I use a Web console to assign work to PM. PM then decomposes the work for DEV, OPS, and QA. The console makes the workflow easier to operate, but the real ledger still lives on disk: TASK-*.md

, REPORT-*.md

, and the lifecycle folders under fcop/_lifecycle/

.

This test was not meant to build a large product. It was meant to check whether multiple roles could complete a full collaboration loop around a small target:

ADMIN creates task β†’ PM decomposes β†’ DEV/OPS/QA execute β†’ REPORT β†’ review β†’ archive

So I chose a very small probe: Grid Runner.

Grid Runner is a local HTML / CSS / JavaScript mini-game. The player moves on a grid, collects coins, avoids monsters, and reaches an exit. The rules are simple, but the task is still rich enough for DEV to implement, OPS to verify the local runtime path, and QA to actually play and score it.

Figure 1. The small game used as the workflow probe. The game itself was intentionally simple; the real test was whether PM, DEV, OPS, and QA could complete the FCoP loop around it.

On June 13, I assigned the first task to PM through the console:

TASK-20260613-020
Grid Runner v0.1
thread_key: panel-task-020

PM followed the normal workflow and assigned work to DEV, OPS, and QA. After the reports came back, task 020 entered done

.

At this point, everything looked ordinary. Nobody mentioned a β€œproject tree.” Nobody mentioned β€œphase tasks.” It looked like a single completed task line.

After the first version was accepted, the product did not stop.

I assigned a second task to PM:

TASK-20260614-004
Grid Runner Phase 2: product upgrade
references:
  - TASK-20260613-020
thread_key: panel-task-020

The goal of 004 was to turn the demo into a more product-like lightweight game: a main menu, five levels, power-ups, local progress storage, a result screen, and visual effects.

PM then decomposed it:

005 DEV  Implement Phase 2
006 OPS  Verify file:// execution
007 QA   Playtest and accept
008 DEV  Fix the missing magnet tile in level 4
009 OPS  Re-check the fix

At the time, I only saw this as β€œthe next segment on the same line.” Task 020 was already complete; task 004 was the follow-up upgrade. My mental model was still a single-task model: once 020 is done, it should be archivable.

In the console, under panel-task-020

, the structure was already visible: ADMIN-to-PM tasks 020 and 004 above, and PM-to-team execution tasks below. The tree was already on screen. I just had not yet read it as a tree.

Figure 2. CodeFlowMu console view. The UI is in Chinese, but the important protocol markers are the task IDs, panel-task-020, report_missing, and lifecycle states.

On the morning of June 14, I clicked β€œArchive” on task 020 in the CodeFlowMu console.

Task 020 was the initial Grid Runner version. DEV, OPS, and QA had all reported back. PM had already submitted a summary. The console showed it as completed. I expected it to move into _lifecycle/archive/

.

But the archive did not go through.

The core message was: there were still open child tasks. At the protocol level, this was CHILD_TASKS_OPEN

.

I asked PM in the ADMIN ↔ PM chat:

Do the child tasks of this one overlap with 004? Wasn’t 004 opened as a separate new task?

My confusion was concrete: 004 was clearly a later Phase 2 task. Why should it block the archive of 020?

PM answered: this was not an ID collision. It was a parent-child relationship. Task 020 still had Phase 2 task 004 underneath it. Task 004 had then produced 005, 006, and 007; the QA path further led to 008 and 009. The lower tasks had to be closed before 020 could be archived.

Then PM drew a text tree in the chat:

020  Grid Runner initial version
└── 004  Phase 2
    β”œβ”€β”€ 005–007  implementation, ops check, playtest
    └── 008–009  bug fix and re-check

Figure 3. PM explained the failed archive by drawing the task relation as a tree: 020 as the root, 004 as Phase 2, and 005–009 as execution / fix tasks.

That was the first moment I saw the β€œproject tree.”

It did not come from a protocol spec. It did not come from a dedicated UI prompt. It came from PM trying to explain why 020 could not be archived, by drawing the relationship that already existed on disk.

Figure 4. The archive attempt was blocked because child tasks were still open. This is where the single-task view broke down and the project-tree view became necessary.

At that point, the meaning changed:

020 was no longer just the Grid Runner v0.1 task.
020 had become the project root of the Grid Runner product line.

004 was not an independent new project.
004 was Phase 2 under 020.

So CHILD_TASKS_OPEN

was not wrong.

From a single-task view, 020 was complete. From a project-tree view, the Phase 2 branch below 020 had not yet closed. A phase can be complete while the whole project tree is not yet ready to archive.

This was not an AI agent inventing a new project management method.

What actually mattered were several rules that already existed:

thread_key       tracks the same collaboration thread
references       marks which delivery a task continues from
parent           expresses parent-child relation
REPORT           requires roles to write back results
CHILD_TASKS_OPEN prevents a parent from being archived while children are open

Add one ordinary behavior: after the first version was accepted, ADMIN assigned Phase 2, and PM decomposed it under the same collaboration thread.

Nobody had designed a β€œproject tree” button. Nobody started by saying β€œwe are building an Epic / Milestone hierarchy.” But those rules stacked together, and the disk began to express this structure:

Project Root β†’ Phase β†’ Execution Task β†’ Fix Task β†’ Archive

In the actual Grid Runner run, it looked like this:

TASK-20260613-020  Grid Runner v0.1 / project root
└── TASK-20260614-004  Phase 2 product upgrade
    β”œβ”€β”€ TASK-20260614-005  DEV implementation
    β”œβ”€β”€ TASK-20260614-006  OPS verification
    β”œβ”€β”€ TASK-20260614-007  QA playtest
    β”œβ”€β”€ TASK-20260614-008  DEV fix
    └── TASK-20260614-009  OPS re-check

This is what I call controlled emergence.

It is β€œemergence” because the project tree was not hard-coded in advance.

It is β€œcontrolled” because it was not random. It was constrained by the file protocol, task references, PM decomposition, and archive guards.

The rules were small. The original intention was narrow. But once a real project continued across versions, the structure appeared.

After I recognized the tree in chat, I manually ran EVAL from the CodeFlowMu console.

This EVAL is not a formal audit, and it does not replace the FCoP ledger. It is an internal collaboration-state scan. It reads TASK files, REPORT files, and frontmatter under _lifecycle/

, then writes suspected structures into GAP-*-panel-scan.md

under fcop/internal/eval/

.

The scan reported project_tree_emergence

:

Root task: TASK-20260613-020
Phase task: TASK-20260614-004
Execution tasks: TASK-20260614-005, 006, 007, 008
Pattern: main task -> phase task -> execution task
Value: FCoP has emerged product-evolution tree and project-management capability from task-flow management

This means the tree was not only an explanation PM drew in chat. The file relationships themselves were readable by a program.

Still, EVAL should be treated as heuristic cross-checking. Sometimes it also identifies smaller local fix chains as subtrees, such as 004 β†’ 007 β†’ 008

or 004 β†’ 008 β†’ 009

. Those local readings are useful, but they do not replace the canonical reading: 020 is the project root of the Grid Runner product line, and 004 is Phase 2 under it.

Figure 5. EVAL also detected local project-tree slices. This supported the observation, but the canonical reading remains 020 β†’ 004 β†’ 005/006/007/008.

So the external story should still be grounded in TASK / REPORT / archive paths. EVAL only shows that the human intuition and the programmatic scan aligned.

My confusion did not come from a protocol error.

The opposite is closer to the truth: the protocol was protecting consistency. Since open child tasks remained below the parent, the parent could not be archived.

The real issue was that the console still mainly presented the workflow as a flat task lifecycle. It had not yet exposed the Project / Phase / Execution layer.

As a result, the same screen could mix several states:

done              this delivery of 020 was completed
report_missing    some child path was still missing a report
CHILD_TASKS_OPEN  the root still had open children

Each state made sense on its own. But together, they looked contradictory to ADMIN: if the task is done, why can it not be archived?

Once the project-tree view appears, the contradiction disappears:

phase complete β‰  project tree closed
task done β‰  root node archivable

This is not protocol debt. It is product-expression debt.

CodeFlowMu should add three things next:

CHILD_TASKS_OPEN

; it should list which Phase and which child task are still open.ADMIN’s real intent was simple: 020 had been accepted; continue with a Phase 2 product upgrade.

But PM made a β€œproject-manager-like” structural choice during execution: Phase 2 was kept inside the same panel-task-020

thread, and the disk formed a ** 020 β†’ 004 product-evolution tree**.

That is the emergence point. It was not simply that ADMIN phrased the request incorrectly, nor that PM wrote a wrong field. Product intent and lifecycle representation overlapped in the same collaboration thread, and the tree shape grew out of that overlap.

This was not a simple mistake. It was two layers of truth stacked together:

Layer Judgment
Product semantics βœ… Reasonable. 004 really was Grid Runner Phase 2, continuing from 020.
Lifecycle semantics ⚠️ Risky. If 004 enters the same thread / parent relationship before 020 is fully archived, 020 can be blocked by CHILD_TASKS_OPEN .
Protocol capability βœ… Emergent. FCoP grew a structure from β€œtask flow” into β€œproject root β†’ phase β†’ execution line.”
Console expression ❌ Insufficient. The console still presented a single-task lifecycle, so users saw done , report_missing , and child_open mixed together.

Grid Runner itself was just a mini-game. The structure produced by the collaboration was more important than the game.

Originally, FCoP only had a task flow:

ADMIN β†’ PM β†’ DEV/OPS/QA β†’ REPORT β†’ REVIEW β†’ DONE

But this Grid Runner run produced another shape:

Project Root β†’ Phase β†’ Execution Tasks β†’ Fix Line β†’ Final Close

The tree on disk looked like this, consistent with the ASCII tree PM drew in chat:

TASK-20260613-020  Grid Runner v0.1 / static-game milestone
└── TASK-20260614-004  Phase 2 product upgrade
    β”œβ”€β”€ 005 DEV
    β”œβ”€β”€ 006 OPS
    β”œβ”€β”€ 007 QA
    β”œβ”€β”€ 008 DEV fix
    └── 009 OPS fix

This matches the internal EVAL observation: it identified 020β†’004β†’005/006/007/008

as a β€œmain task β†’ phase task β†’ execution task” project tree, and judged the value as: FCoP emerged product-evolution tree and project-management capability from task-flow management.

The final reading should be consistent across the article, archive behavior, and future spec:

thread_key

is the same, and references

/ parent

relationships are valid.done/

does not mean the whole tree can be archivedCHILD_TASKS_OPEN

is reasonable. It is not a console bug. It is the protocol protecting tree consistency.The valuable discoveries are:

done

state to whole-tree archive, everything happened inside the same collaboration thread.parent

, thread_key

, and references

already carry project-tree semanticsdone

, report_missing

, and child_open

can appear together and confuse the user. The tree exists in files; the UI has not caught up.In one sentence: this was controlled emergence. Grid Runner grew from a normal task flow into a product-iteration tree. 020 is the project root, and 004 is Phase 2, not a separate project. Nobody added a new button for this. Existing protocol rules, real execution, and archive constraints stacked together. The shape became readable, auditable, and blockable. That is the life of a protocol.

I will remember this Grid Runner two-line run as a case of controlled emergence in FCoP.

The core was not that AI invented project management.

It was this combination:

parent
thread_key
references
PM Phase planning
CHILD_TASKS_OPEN

Together, these rules naturally formed a project tree.

So FCoP should not avoid this phenomenon. It should absorb it.

In one sentence: FCoP grew a project tree; now the protocol needs to write it down.

This section keeps only links and key excerpts. The full source files are not pasted here, to avoid turning the article into a log dump. Primary TASK / EVAL originals from the CodeFlowMu dogfood run are catalogued in the evidence archive; figures in this essay live under essays/assets/.

Evidence Reference Why it matters
Original task
TASK-20260613-020

thread_key: panel-task-020

.TASK-20260614-004

references: TASK-20260613-020

, same thread.GAP-20260614-004-panel-scan

project_tree_emergence

.The key fields can be compressed into four lines:

TASK-20260613-020: thread_key = panel-task-020
TASK-20260614-004: references = TASK-20260613-020
EVAL: project_tree_emergence
Archive guard: CHILD_TASKS_OPEN

The internal EVAL scan identified the Grid Runner line as a project tree:

TASK-20260613-020  Grid Runner v0.1 / project root
└── TASK-20260614-004  Phase 2 product upgrade
    β”œβ”€β”€ TASK-20260614-005  DEV execution
    β”œβ”€β”€ TASK-20260614-006  OPS verification
    β”œβ”€β”€ TASK-20260614-007  QA playtest
    └── TASK-20260614-008  DEV fix

Its canonical reading was:

020 β†’ 004 β†’ 005 / 006 / 007 / 008

In other words: main task β†’ phase task β†’ execution task.

EVAL also detected smaller local fix chains, such as:

004 β†’ 007 β†’ 008
004 β†’ 008 β†’ 009

Those local observations are useful, but they do not replace the main-line interpretation: 020 is the project root of the Grid Runner product line, and 004 is Phase 2 under 020.

The table below explains the FCoP terms used in this article without requiring readers to know Chinese.

Term Meaning in this article Protocol marker
Collaboration thread A continuous line of work that keeps related tasks together. In this case, Grid Runner stayed under the same thread.
thread_key , here panel-task-020
Continues from A task explicitly builds on an earlier task or delivery. Phase 2 continued from the v0.1 task. references
Parent task A task that owns or contains lower-level tasks. A parent should not be archived while its children are still open. parent
Open child tasks Lower-level tasks are still not fully closed. This is why the archive attempt was blocked. CHILD_TASKS_OPEN
Internal EVAL scan A CodeFlowMu internal scan that reads TASK / REPORT files and detects possible workflow structures. It is supporting evidence, not the formal ledger. GAP-*-panel-scan.md
Project-tree emergence The observed pattern where FCoP task flow began to express a product structure: project root β†’ phase β†’ execution β†’ fix. project_tree_emergence
── more in #ai-agents 4 stories Β· sorted by recency
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/fcop-grew-a-project-…] indexed:0 read:13min 2026-06-15 Β· β€”