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. 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 archived CHILD 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 semantics done , 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 https://github.com/joinwell52-AI/FCoP/blob/main/essays/from-mini-game-to-project-tree-evidence/INDEX.md ; figures in this essay live under essays/assets/ https://github.com/joinwell52-AI/FCoP/tree/main/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 |