Skip to content
超凡97 / 100
证据34/35原创24/25结构20/20实用19/20
从‘证据不能串账’到动态诊断:CodeFlowMu V2.0.4 如何把研究结论做成工程能力
开源工程观察 · 工程研究

从‘证据不能串账’到动态诊断:CodeFlowMu V2.0.4 如何把研究结论做成工程能力

这不是一项先有产品、再补解释的功能。它从历史证据中的关联问题出发,经过工程实现与真实任务校准,最终成为 V2.0.4 正式版本中的动态证据关联诊断。

RSEM-20260827-02工程研究 · 2026-08-27English →

从“证据不能串账”到动态诊断:CodeFlowMu V2.0.4 如何把研究结论做成工程能力

这篇文章最初只有一个很小的问题:一张任务已经进入 review,能不能因此相信它旁边的 REPORT、执行记录和 REVIEW 都属于同一条责任链?

我们从一份固定历史切片里抽取了 10 条 REPORT 做逐行对账。结果是:4 条可以用显式任务编号直接关联,4 条缺少动作侧任务编号,2 条在两份来源里给出了不同任务编号。

这组 4 / 4 / 2 从来不是故障率,也不是对 CodeFlowMu 整体质量的评分。它真正逼出的是一个更重要的工程判断:

生命周期位置只能说明任务走到了哪里,不能替证据归属签字。

如果研究停在这里,这只是一条设计原则。真正有价值的是下一步:我们把这个判断做进 CodeFlowMu,并在真实任务运行过程中持续校准证据语义,最终形成 V2.0.4 正式版本中的“证据关联诊断”。

这条路径不是“发现一个错误,然后补一个功能”,而是:

研究发现 → 工程设计 → 真实任务校准 → 语义收敛 → 正式发版 → 实机验证。

1. 理论起点:位置不是归属,关系不能靠猜

最初的 10 条历史样本只使用两类显式事实:动作日志里写 REPORT 时记录的任务编号,以及 REPORT 账本中同一 REPORT 对应的任务编号。

规则故意很严格:

两份来源输出系统不得做什么
任务编号都存在且相同linked不需要额外推断
一侧缺少任务编号missing不按文件名、时间接近或角色猜归属
两侧任务编号都存在但不同conflict不替用户挑一边当“正确答案”

公开脱敏样本最终是:linked = 4missing = 4conflict = 2

它验证的不是 REPORT 内容是否真实,而是读端有没有遵守一条基本纪律:面对缺失和矛盾,不把不确定性剪掉。

这个研究结果进一步把“证据链”拆成了多条可以独立核对的关系:

text
TASK / 修订
→ attempt
→ lease
→ execution
→ 工具动作证据
→ REPORT
→ REVIEW / EVAL
→ 业务决定

关键不在箭头多,而在每条箭头都必须回答:为什么这两个对象可以连在一起?

2. 从理论到工程:把证据关系做成只读诊断,而不是新的状态机

R2 进入工程实现时,我们没有给任务再加一个“健康/不健康”的总状态,而是做成一个独立、只读的证据关联诊断器。

它检查的不是“任务成功了吗”,而是:

  • 当前任务修订能否关联到一次明确的 attempt;
  • attempt 能否关联到 lease;
  • attempt 能否关联到实际 execution;
  • execution 能否关联到工具动作证据;
  • REPORT 能否明确回到当前 Task;
  • REPORT 能否明确回到正式 REVIEW;
  • EVAL 如果存在,它与 REVIEW 是什么关系。

这套设计有一个非常重要的边界:诊断器只读取正式事实源并生成派生结果,不改写 TASK、REPORT、REVIEW、lease、attempt 或生命周期。

它像 X 光机,而不是裁判。

3. 一个来自 CrewAI 的独立公开参照:过程不是一个完成事件

这条研究线并不只在我们的任务账本里出现。CrewAI 的公开工程变更提供了一个很清楚的独立参照。

João Moura 在 CrewAI PR #7115 中没有把原来的 deployment 创建事件简单挪到成功之后,而是保留创建前的 Create Crew Deployment 事件继续记录 creation attempt,再新增一个只有成功后才产生的 Crew Deployment Created 事件,并携带实际返回的 UUID。该 PR 已于 2026-08-27 合并。

这个设计为什么重要?因为“尝试创建”和“已经创建成功”是两件不同的事实。如果把原事件直接移到成功之后,历史上的 attempt 指标就会在没有显式声明的情况下变成 success 指标。#7115 明确拒绝这种语义偷换。

PR 描述还给出一个来源方统计:当时 create_deployment 读取到 76,015 条事件,其中没有一条携带 UUID。这个数字是 CrewAI 作者报告的工程观测,我们没有独立复现,也不把它当作本文自己的实验结果。

同一作者的 CrewAI PR #7118 目前仍开放。它尝试为 crew run 增加一个所有用户都可见的 Crew Completed 终态事件,记录 outcomeduration_ms,并与已有的起始/创建记录分开。因为它尚未合并,本文只把它当作方向性公开材料,不写成 CrewAI 已交付能力。

这两条外部材料和 R2 的关系很窄,但很有启发性:

过程中的每一段都需要自己的证据。创建请求不等于创建成功;执行轮次不等于 REPORT 已提交;REPORT 已提交也不等于 REVIEW 已接受。

CrewAI 不是 CodeFlowMu 的实现来源,#7115/#7118 也不证明我们的 R2 设计“正确”。它们的价值是作为独立公开参照,说明另一个 Agent 工程项目也在面对同类的过程事件、终态事件与可关联标识不能压成一个“完成”事实的问题。

4. 开发阶段的真实任务校准:把“什么可以比较”收紧到同一语义域

理论进入代码以后,最重要的工作不是“尽快显示更多关联”,而是用真实任务反复检查:哪些字段真的具有可比性,哪些只是上下文信息,哪些状态是当前阶段本来就不要求。

开发阶段的真实任务 TASK-20260827-024 对这套语义起了很大的校准作用。

现场检查让我们明确了几条规则。

第一,不同语义域的修订不能直接比较。 当前文件摘要可以用于缓存和变化检测,但不能自动等价于 attempt 当时记录的业务修订。

第二,协作关系不能替代所有权。 子任务 REPORT 可以包含父任务、关联任务或引用信息,但这些字段不能自动变成 REPORT 的直属归属。

第三,还没有在某个存储层物化,不等于执行不存在。 如果 attempt 已经有正式 session_id,Runtime 事件和回执也能提供同一执行事实,就不能仅因为某个持久化视图尚未落盘而轻率下结论。

第四,同一任务同时存在进度报告和最终报告时,必须使用正式锚点。 V2.0.4 使用任务声明的 current_final_report_id 来确定当前正式 REPORT,再与对应 REVIEW 核对。

这些不是“修补误报”的故事,而是一个新诊断能力在开发过程中必需的语义收敛:定义清楚什么有资格成为证据,什么有资格成为冲突,什么只能保持未知或不适用。

5. V2.0.4 正式发版后的两张实机截图,证明它已经不是静态展示

V2.0.4 功能完成并正式发版后,我们用同一张真实 QA 任务做了前后观察:

TASK-20260827-030-PM-to-QA

第一张截图时,任务处于 active;第二张截图时,同一任务已经进入 review

这两张图最有价值的地方,不是界面多了一块卡片,而是同一张任务随着生命周期变化,诊断关系自动变化,而且变化与真实流程一致。

下面两张原始页面截图记录的是同一张任务,而不是两份静态示例。第一张展示 active 阶段;第二张展示它进入 review 后的同一块诊断面板。它们是本文的一手界面证据。

阶段 A:active —— 没有 REPORT,所以“不适用”才是正确答案

第一张截图中,诊断摘要显示:

  • 已关联:4
  • 缺失:0
  • 冲突:0
  • 仅旁观:0

已经能够确认的链路包括:

  • 任务修订 → attempt:已关联
  • attempt → lease:已关联
  • attempt → 执行:已关联
  • 执行 → 工具证据:已关联

这时任务还在执行阶段,正式 REPORT 尚未产生,所以:

  • REPORT → Task当前阶段不适用
  • REPORT → REVIEW当前阶段不适用

这不是“缺少证据”,而是当前阶段本来就不要求这份证据

因此第一张截图里最重要的不是四条绿色关联,而是:

missing = 0conflict = 0

如果系统在 active 阶段因为没有 REPORT 就报“缺失”,那才是不准确。V2.0.4 在这里正确地区分了“不适用”和“缺失”。

同一张 QA 任务处于 active 阶段时的证据关联诊断:四条执行链已关联,REPORT 关系显示当前阶段不适用

图 1:同一张 QA 任务仍在 active。任务修订、attempt、lease、执行和工具证据已能关联;正式 REPORT 尚未产生,因此 REPORT 关系显示“当前阶段不适用”,而不是“缺失”。

阶段 B:review —— REPORT 与 REVIEW 出现后,关系自动转为已关联

同一张任务进入 review 后,第二张截图显示:

  • attempt → lease:已关联
  • attempt → 执行:已关联
  • 执行 → 工具证据:已关联
  • REPORT → Task:已关联
  • REPORT → REVIEW:已关联

这说明正式 REPORT 和 REVIEW 出现以后,诊断器重新读取当前事实,并把原来“不适用”的关系准确转成“已关联”。

与此同时:

  • EVAL → REVIEW当前阶段不适用 · eval_not_present

这也是正确结果。

因为这是一张 QA 任务。当前工作流里 EVAL 出现在 PM 路径,这张 QA 任务本来就不要求 EVAL 报告。因此 eval_not_present 在这里不是异常,也不是“少了一份材料”,而是角色/流程语义上的正常不适用。

同一张 QA 任务进入 review 阶段后的证据关联诊断:REPORT 到 Task 和 REVIEW 均已关联,EVAL 到 REVIEW 显示当前阶段不适用

图 2:同一任务进入 review 后,诊断重算当前正式事实。REPORT → Task 与 REPORT → REVIEW 从先前的不适用变为已关联;EVAL 仍因这条 QA 路径不要求而显示不适用。

所以两张截图合起来证明的是一个很具体的能力:

同一任务的证据要求会随着生命周期和角色变化;诊断也随正式事实变化,并且能够区分“已关联”“缺失/冲突”和“当前阶段不适用”。

6. “不适用”不是弱化版的“缺失”,而是必须单独存在的状态

很多诊断系统只有“正常 / 异常”。这对 Agent Runtime 不够。

在长任务系统里,证据要求本身具有阶段性和角色性:

  • active 阶段没有最终 REPORT,可以完全正常;
  • 进入 review 后,REPORT 和 REVIEW 才成为当前证据链的一部分;
  • QA 任务没有 PM 路径的 EVAL,也可以完全正常。

因此至少需要区分:

  • linked:明确稳定键可以证明关系;
  • missing:当前阶段应该存在,但确实没有找到;
  • conflict:两个可比较的明确事实互相矛盾;
  • not_applicable:当前阶段或当前角色本来就不要求;
  • observer_only:存在旁观核查,但它没有生命周期裁决权。

这不是 UI 配色问题,而是降低误判成本的语义合同。

7. 最重要的一句话:证据关联成立,不等于任务已交付

V2.0.4 的诊断区域明确写着:

此结论只描述证据关系,不表示任务已交付或验证通过。

这句话非常重要。

REPORT → REVIEW = 已关联 只证明当前正式 REPORT 和 REVIEW 的稳定键能够对应。

它不证明:

  • REPORT 内容一定真实;
  • REVIEW 结论一定正确;
  • QA 已经通过;
  • ADMIN 已经接受交付;
  • 任务已经具备进入 done 的条件。

也就是说:

证据关系是观察事实;交付与验收是另一层裁决。

这也是 CodeFlowMu 一直坚持的证据、执行与裁决分离。

8. 两个实际操作,让诊断真正进入工程使用

第二张截图里还能看到两个很实用的动作:

  • 复制对账摘要
  • 重新检查证据关联

“复制对账摘要”让 PM 或管理员可以把当前关联结果直接带入后续复核,而不需要重新从日志里拼关系。

“重新检查证据关联”则意味着诊断不是一次性静态快照。它会重新读取当前正式事实并重新计算,而不是把旧缓存当成永远正确的答案。

更关键的是,这两个动作仍然不修改正式任务状态。

因此 V2.0.4 新增的并不是普通“任务详情”,而是一块真正可操作的证据关联诊断面板

9. 为什么这是一个真实的“研究转工程”案例

这项工作的价值不只是 CodeFlowMu 多了一个功能,而是完整保留了研究进入工程的过程:

第一步:从历史数据发现问题。 10 条 REPORT 得到 4 linked / 4 missing / 2 conflict,提出“位置不是归属证明”。

第二步:把判断转成工程合同。 把 TASK、attempt、lease、execution、action、REPORT、REVIEW、EVAL 拆成独立关系边。

第三步:在开发阶段用真实任务校准语义。 明确哪些 revision 可比较、REPORT ownership 应认哪些稳定键、未物化执行如何读取、最终 REPORT 如何锚定。

第四步:完成 V2.0.4 工程实现并正式发版。 诊断能力进入实际产品界面。

第五步:用同一真实 QA 任务做生命周期前后验证。 active 时 REPORT 关系正确“不适用”;进入 review 后 REPORT → Task / REVIEW 自动变成已关联;EVAL 因 QA 路径本来不要求而继续保持“不适用”。

这条链最值得保留的地方是:理论不是写完就结束,工程也不是简单翻译理论。研究结论必须经过真实系统的字段、生命周期、角色和状态语义,最终才能变成可靠的产品能力。

10. 公开复核:研究样本与 V2.0.4 动态诊断分层保存

完整的 R2 → CodeFlowMu V2.0.4 工程化证据包 已单独公开。

历史研究证据仍然保留:

V2.0.4 动态现场还提供结构化转录:

本文已嵌入同任务的两张原始页面截图;结构化材料的作用是让截图中可见的阶段、关系状态和 reason code 可以被单独检查。

结论:真正完成的不是一张诊断卡,而是一条从研究结论到运行能力的链

R2 一开始只想回答:“REPORT 会不会串账?”

到了 V2.0.4,问题已经变成:

系统能不能在任务生命周期变化时,持续准确回答当前有哪些证据关系成立、哪些尚未形成、哪些本来就不适用?

两张同任务的实机截图给出了非常直观的答案:

  • active 阶段没有 REPORT,诊断正确显示“不适用”;
  • 进入 review 后,REPORT → Task 和 REPORT → REVIEW 自动变成已关联;
  • QA 任务本来不要求 EVAL,因此 EVAL 继续正确显示“不适用”;
  • 整个诊断只描述证据关系,不越权替交付和验收签字。

证据诊断不是给任务贴一个静态标签,而是随着正式事实变化,持续回答“现在有哪些关系能够被证明”。

这就是这项研究最终变成的工程能力。


来源与证据边界

  • CrewAI #7115 已于 2026-08-27 合并。本文只用它作为“creation attempt 与 confirmed creation 必须分开记录”的独立公开工程参照;PR 中的 76,015 条事件与 0 UUID 覆盖率属于来源方报告,本文未独立复现。
  • CrewAI #7118 截至本文复核时仍开放。本文只把它作为“独立终态记录”方向的公开材料,不写成已合并或已交付能力。
  • CrewAI 与 CodeFlowMu 没有本文所主张的实现继承关系;CrewAI 资料不能证明 R2 正确,R2 也不用于评价 CrewAI 产品质量。
  • R2 的历史 4 / 4 / 2 只来自固定的 10 条脱敏 REPORT 样本,不是故障率、总体质量指标或统计结论。
  • TASK-20260827-024 只用于记录开发阶段对证据语义和正式锚点的现场校准,不把正常开发过程描述成产品故障。
  • TASK-20260827-030-PM-to-QA 的 active / review 对照来自 V2.0.4 正式版本的同任务本地实机观察,用于说明阶段与角色相关的动态诊断行为。
  • 本文只在已披露的任务、关系边和可见状态范围内描述能力,不外推为所有任务、所有生命周期组合或全部桌面端 / PWA 路径都已认证。

Last updated: