FCoP 跑出了项目树
副标题:从一个小游戏任务,看多 Agent 协作如何从任务流长成产品演进树
作者:FCoP 维护者 · 2026-06-14
我原本只是想让 CodeFlowMu 里的 PM 带 DEV、OPS、QA 做一个本地小游戏。
结果游戏不是重点,任务树才是重点。
在一次归档失败里,FCoP 跑出了一个此前没有正式写进协议的东西:项目树。
这篇文章讲的不是 Grid Runner 这个小游戏本身,而是一次多 Agent 协作调试里发生的结构变化:FCoP 原本管理的是任务流,跑着跑着,它开始表达产品演进树。
1. 为什么从一个小游戏开始
FCoP是一套多 Agent 协作协议。它的核心想法很简单:角色之间不能只在聊天里说话,必须落成文件。任务单、报告、验收记录都在项目目录里,谁做了什么、有没有关单,事后能翻、能审计。
CodeFlowMu是基于 FCoP 构建的 AI 协作工作流系统。我作为 ADMIN 在 Web 控制台里派任务给 PM,PM 再拆给 DEV、OPS、QA。控制台负责让人更容易操作,但真正的账本仍在磁盘上:TASK-*.md、REPORT-*.md、fcop/_lifecycle/各阶段目录。
这次测试不是为了做一个大产品,而是为了看多角色协作能不能围绕一个小目标走完闭环:
ADMIN 派单 → PM 拆单 → DEV/OPS/QA 执行 → REPORT → 验收 → 归档所以我选了一个很小的探针:Grid Runner。
它是一个纯 HTML / CSS / JavaScript 的本地小游戏。玩家在网格里移动、捡金币、躲怪、找出口。规则简单,但足够让 DEV 写代码、OPS 验运行方式、QA 试玩打分。
6 月 13 日,我通过控制台给 PM 派了第一张任务:
TASK-20260613-020 Grid Runner v0.1 thread_key: panel-task-020PM 按流程拆给开发、运维、测试。收齐报告后,020 进入done。
到这里,一切都很普通。没有人提“项目树”,也没有人提“阶段任务”。它看起来只是一条已经完成的任务线。
2. Phase 2 来了,但我还没有意识到它是一棵树
初版完成后,产品没有停。
我又给 PM 派了第二张任务:
TASK-20260614-004 Grid Runner Phase 2:产品化升级 references: - TASK-20260613-020 thread_key: panel-task-020004 的目标是把 demo 升级成更像产品的轻量游戏:主菜单、五关、道具、本地存档、结算、粒子效果。
PM 继续拆单:
005 DEV 实现 Phase 2 006 OPS 验 file:// 运行 007 QA 试玩验收 008 DEV 修复第 4 关磁铁格 009 OPS 复验修复当时我只是把它看成“同一条线上的下一段”。020 已经完成,004 是后续升级。我的直觉还停留在单任务时代:020 做完了,就可以归档。
切到控制台里看,panel-task-020下确实能看到两类东西:上方是 ADMIN 派给 PM 的 020、004;下方是 PM 拆给团队的执行任务。树已经在屏幕上了,但我还没把它读成树。
:
TASK-20260613-020 Grid Runner v0.1 / 静态返工 └── TASK-20260614-004 Phase 2 产品化升级 ├── 005 DEV ├── 006 OPS ├── 007 QA ├── 008 DEV fix └── 009 OPS fix这和内部 EVAL 的观察一致:它把020→004→005/006/007/008识别为「主线任务 → 阶段任务 → 执行任务」的项目树,并判断价值是「FCoP 从任务流管理中涌现出产品演进树与项目管理能力」。
最终口径(正文、归档、规范都应按这个来):
- 020 不是单独已完结的项目;004 是挂在 020 下的 Phase 2。
- 两者子任务不重叠,但业务连续、
thread_key相同、references/parent关联成立。 - 因此020 进了
done/不等于整棵树可以 archive;只要 004 或 007 还 open,CHILD_TASKS_OPEN拦截就是合理的——不是控制台 bug,是协议在保护整树一致性。
这里真正有价值的发现是:
- FCoP 自然长出了 Project / Phase / Execution 三层结构——从 demo 到产品、从一版到多版、从主线到阶段、从执行到验收、从失败到修复、从单任务 done 到整树归档,都在同一条协作线上发生。
parent/thread_key/references已经具备「项目树」语义,而不只是任务引用字段。- 控制台现在还按单任务看待 lifecycle,所以会出现
done、report_missing、child_open混在一起的展示困惑——树在文件里已经成立,UI 还没跟上。 - 后续应吸收为协议能力:PM 创建 Phase 时必须选择「继续当前主线」还是「新建独立 thread」,别等归档失败再靠聊天补画。
一句话:这是一次受控涌现——Grid Runner 从普通任务流自动长成了产品迭代树;020 是项目根,004 是 Phase 2,不是两个独立项目。没有人为此加新按钮;是协议规则叠真实推进叠出来的。规则短,意图窄;形状可读、可审计、可阻塞——这就是协议的生命力。
结论
这次 Grid Runner 双线任务,我会记成 FCoP 的一次受控涌现。
它的核心不是「AI 自己发明了项目管理」,而是:
parent thread_key references PM Phase 派单 CHILD_TASKS_OPEN这些协议规则组合后,自然形成了项目树。
所以 FCoP 的下一步不是回避这个现象,而是吸收它——这个就是FCoP接受涌现的意义。
一句话:FCoP 跑出了项目树;现在要把它写进协议。
这次观察的证据
下面只放地址链接 + 关键摘录。完整原件不再贴全文,避免把文章变成日志转储。CodeFlowMu 狗食现场的 TASK / EVAL 原件索引见 证据存档;正文配图见essays/assets/。
| 证据 | 索引 | 说明 |
|---|---|---|
| 初版任务原件 | TASK-20260613-020 | 原来的任务:Grid Runner v0.1;后续被识别为项目根;关键字段是thread_key: panel-task-020 |
| Phase 2 任务原件 | TASK-20260614-004 | 后来的任务:Grid Runner Phase 2;关键字段是references: TASK-20260613-020,同 thread |
| EVAL 原始报告 | GAP-20260614-004-panel-scan | 控制台触发的内部 EVAL 扫描;识别到project_tree_emergence |
关键字段可以压缩成四行:
TASK-20260613-020: thread_key = panel-task-020 TASK-20260614-004: references = TASK-20260613-020 EVAL: project_tree_emergence Archive guard: CHILD_TASKS_OPENEVAL 观察到了什么
内部 EVAL 把 Grid Runner 这条线识别成一棵项目树:
TASK-20260613-020 Grid Runner v0.1 / 项目根 └── TASK-20260614-004 Phase 2 产品化升级 ├── TASK-20260614-005 DEV 执行 ├── TASK-20260614-006 OPS 验收 ├── TASK-20260614-007 QA 试玩 └── TASK-20260614-008 DEV fix它的 canonical 读法是:
020 → 004 → 005 / 006 / 007 / 008也就是:主线任务 → 阶段任务 → 执行任务。
EVAL 同时也会读出一些局部 Fix 链,例如:
004 → 007 → 008 004 → 008 → 009这些局部观察有价值,但不能替代主线判断:020 是 Grid Runner 产品线的项目根,004 是挂在 020 下的 Phase 2。
术语
| 中文说法 | 协议/字段 |
|---|---|
| 协作线 | thread_key,本例是panel-task-020 |
| 承接 | references |
| 父任务 | parent |
| 子任务未关完 | CHILD_TASKS_OPEN |
| 内部扫描 | EVAL,产出GAP-*-panel-scan.md |
| 项目树涌现 | project_tree_emergence |
延伸阅读
- FCoP 开源项目:https://github.com/joinwell52-AI/FCoP