Workflow Builder 母工作流二次开发总述¶
本组文档面向准备对当前 examples/workflow_builder/ 母工作流进行二次开发的用户。目标是帮助开发者修改母流程阶段、生成器、评估控制、增量部署、控制台和交付契约,而不是指导某次子工作流 Agent怎样完成业务任务。文中出现的生成工作流、业务 Tool、业务 Checker 和 GuideDoc 都是母工作流代码的输出对象,用于解释一次母代码修改会影响什么。
二次开发目标¶
开发者阅读本组文档后,应能从一个需求或缺陷定位到母工作流中的真实修改入口,理解模块接口和调用关系,设计向后兼容的数据结构,补充确定性回归,并用独立业务验证生成效果。一次业务生成失败可能来自需求、母阶段描述、GuideDoc、生成器、Checker、UCAgent 运行时或外部服务;只有确认责任域后才修改母代码,不能用修改 UCAgent 核心或手工补子产物掩盖问题。
这里不重复 Usage 中的日常启动步骤,也不把阶段提示词当作开发者教程。开发者关心的是:阶段由哪个 YAML 定义、工具由哪个 UCTool 暴露、核心函数如何写文件、哪些 schema 和回归必须同步,以及如何让下一次任意业务都获得修复。
阅读顺序¶
- 工作流程简介:理解构建、评估、增量和控制台的数据流。
- Tool 简介:理解工具注册、调用、返回结构和写入边界。
- Checker 简介:理解阶段验收、参数注入和证据语义。
- 指导文档简介:理解 GuideDoc 模板、阶段 FAQ 和最小示例。
- 评估与增量控制:理解审批、候选、部署和版本历史。
- 测试与回归:确定修改后必须运行哪些确定性检查。
- 工作流产物二次开发指南:理解生成子工作流的组件、所有权、扩展顺序与回流母生成器的判断标准。
母工作流修改入口¶
二次开发通常从四类入口开始。流程行为修改 config.yaml、inc.yaml、eval_*.yaml 及其 Guide_Doc/;产物生成能力修改 tools/workflow_builder/ 和四个 generator;评估、审批、部署或 UI 修改 tools/workflow_evaluation_control/;运行和环境入口修改根 Makefile 与 setup。确定入口后再阅读对应源码分析,不要先编辑某个历史 workspace_x/workflow/。
主要源码区域¶
| 区域 | 责任 |
|---|---|
tools/workflow_builder/ | 读取构建设计、创建骨架、环境设施、配置和内联 Checker |
tools/workflow_tool_generator/ | 按 tool spec 生成并注册工具 |
tools/workflow_checker_generator/ | 生成 Checker 源码、fixture 和注册信息 |
tools/workflow_config_generator/ | 生成主配置和增量配置,注入阶段契约 |
tools/workflow_guidedoc_generator/ | 生成并注册 GuideDoc |
tools/workflow_evaluation_control/ | 结构化报告、审批、增量 run、部署历史和控制台 |
Guide_Doc/ | 母工作流各阶段执行规则、FAQ 和评估规则 |
regression/ | 不依赖模型的协议、边界和回归测试 |
开发边界¶
- 优先修改
examples/workflow_builder/内的母工作流,不修改 UCAgent 核心来掩盖生成器问题。 - 业务特定文件名不能写入通用 GuideDoc,除非它只是明确标注的示例。
- 新增工具或 Checker 必须同步更新 spec、注册、测试、配置和生成文档。
reference_files与output_files只能列文件,不能列目录;引用文件必须在该阶段执行前确实存在。- 所有临时文件进入工作区
tmp/;评估报告进入eval/;用户专业知识进入res/。 - 长文档要使用索引和按需读取策略,不能为了“建立认识”要求 Agent 每轮全文读取全部资料。
修改前的问题陈述¶
建议先写清可观察症状、最小复现命令、失败阶段、Checker 消息、相关产物和预期行为。对于性能问题,还要记录阶段开始时间、实际工具调用、产物时间戳是否变化以及是否发生上下文压缩。这样才能区分真实计算、模型等待和无状态空转。
完成定义¶
开发修改只有同时满足以下条件才算完成:代码实现与文档一致;目标回归通过;未破坏其他生成器;新字段具有兼容策略;生成产物可以由 make check 验收;真实工作区验证时没有由母 Agent 代替子工作流手写产物。
从命令到源码的入口地图¶
开发者首先要明确自己运行的是哪一层入口。根 Makefile 的 run、run_eval_* 和 run_inc 都在业务构建工作区中启动 UCAgent,但加载的配置分别来自 Workflow Builder 根目录的 config.yaml、评估配置和 inc.yaml。Makefile 负责准备工作区、复制公共输入、选择输出根、设置 PYTHONPATH、启动权限守护以及传递 TUI/loop 参数。UCAgent 随后按照配置中的阶段调用本目录注册的 UCTool;这些工具再进入各生成器或评估控制模块。
关键入口可以按下表定位:
| 用户动作 | Make 入口 | Python 入口 | 主要持久化结果 |
|---|---|---|---|
| 生成业务工作流 | run | workflow_builder.core.build_workflow 及各 UCTool | wfgen/、workflow/ |
| 生成业务 Tool | 构建阶段内部调用 | workflow_tool_generator.core.generate_tools_from_specs | workflow/tools/、工具注册 |
| 生成业务 Checker | 构建阶段内部调用 | workflow_checker_generator.core.generate_checkers_from_specs | Checker、fixture、stage 注册 |
| 生成配置 | 构建阶段内部调用 | workflow_config_generator.core.generate_config | workflow/config.yaml、config/inc.yaml |
| 生成 GuideDoc | 构建阶段内部调用 | workflow_guidedoc_generator.core.generate_guidedocs | workflow/Guide_Doc/、注册 |
| 写评估报告 | run_eval_* | StructuredJsonStore、json_store.mutate_document | eval/*.json |
| 增量部署 | run_inc | incremental.deploy_incremental_changes | workflow/、tmp/change_history/ |
| 控制台 | eval-ui | review_server.serve | 通过 API 更新审批、建议和结构化设计 |
如果问题发生在生成产物中,仍要沿这张表向上追溯:产物文件是哪个模板或 spec 生成的,spec 又由哪个母阶段写出,哪个 Checker 本应更早拦截。只在最后生成文件中修一行虽然可能让当前工作区通过,却不能改善下一个业务。
核心数据对象代码分析¶
源码位置:tools/workflow_builder/core.py,符号 WorkflowBuildError 与 BuildReport。
这两个类型体现了生成器的错误和结果边界。WorkflowBuildError 使用稳定错误码把“配置无法解析”“路径越界”“Checker 生成失败”等问题与普通 Python 堆栈区分开。调用者可以把 code 写入 UCTool 的结构化错误,让阶段任务获得可行动原因,而不必解析自然语言。新增验证规则时应选择与责任域一致的错误码前缀,并保持一个错误码只代表一类修复动作。
BuildReport 不是最终业务报告,而是一次物化操作的变更清单。created_files 与 skipped_files 支持判断 overwrite 策略是否生效,warnings 用于记录不阻断但需要开发者处理的问题。新增生成步骤时必须把实际写入追加到 report,否则 UCTool 虽然返回成功,Agent 和回归却无法确认产生了什么。反过来,也不能在文件写入失败前预先登记成功。
环境配置调用分析¶
Workflow Builder 根目录的 setup.py 只生成 .workflow_builder/local.mk。Makefile 在默认变量定义前可选加载它,因此保存值可以成为本机默认值,而命令行 make WS=... 仍具有更高优先级。该配置面向“如何启动母工作流”,包含 UCAgent 源码、虚拟环境、默认工作区、MCP/控制台端口和可选代理。
生成业务工作流中的 workflow/setup.py 来自 tools/workflow_builder/core.py 的 WORKFLOW_ENVIRONMENT_SETUP 模板。它读取业务工作流自己的 config/environment.schema.yaml,保存 .workflow/local/environment.yaml,并更新生成产物 Makefile 与 ucagent_setup.sh 的受控区块。两者名称相同但状态目录、schema 和修改对象完全不同。开发文档、测试和报错必须使用“Workflow Builder 根 setup”或“生成工作流 setup”这样的限定词。
环境配置的修改风险集中在三个方面:第一,Make 的变量优先级是否改变;第二,敏感值是否被写入可提交文件;第三,配置失败时是否留下半个受控区块。任何修改都应测试首次写入、重复执行、dry-run、非法输入、命令行覆盖和原子替换。
源码位置:根 Makefile,本地配置加载入口。
先计算 Makefile 自身目录,而不是依赖调用者 cwd,因此从业务工作区用 make -f ... 启动仍能找到本地配置。-include 允许首次使用时文件不存在;配置中的普通赋值会覆盖后面的 ?= 默认值,而命令行变量仍由 GNU Make保持最高优先级。修改这段顺序会直接影响跨工作区启动,必须通过无配置、有配置和命令行覆盖三种 dry-run 验证。
数据所有权与写入边界¶
input/ 是用户需求来源,母 Agent只能复制和读取;wfgen/ 是中心设计,构建阶段按职责追加;workflow/ 是公开业务工作流;eval/ 只能通过结构化存储更新;res/ 是用户专业知识;tmp/ 保存临时案例、增量候选和历史版本。写入边界不是文档建议,而是防止评估 Agent修改被评估对象、增量 Agent越过审批范围以及临时文件污染正式交付的安全契约。
开发新工具时,应先确定它属于哪一种所有者。普通评估命令执行器不能写 workflow/;候选 stager 可以从正式文件复制到当前 run 目录,但不能反向部署;只有 deployer 在验证批准来源和候选映射后才能替换正式文件。将这些动作合并为一个“万能文件工具”会使审批、审计和回滚失去意义。
一次缺陷的完整定位示例¶
假设生成的 config.yaml 在第一阶段引用不存在的 {INPUT}。不要只把它改成某个绝对路径。首先在生成工作区读取 wfgen/workflow_build.yaml,确认变量是否在 runtime contract 或模板覆盖中声明;然后检查 workflow_config_generator.core._find_unknown_runtime_placeholders() 和 _inject_planned_stage_contracts() 是否应拦截;再检查母阶段 GuideDoc 是否要求生成后自审;最后为 config generator 增加一个包含未定义占位符的负向 fixture。
正确修复应让未来所有未知占位符在生成阶段失败,并给出字段位置。当前工作区可以通过重新运行相应阶段或增量流程获得新配置。验收不仅是 YAML 可解析,还包括 config generator 回归、delivery contract、实际 make check 和新业务构建。这个过程说明:开发者修复的是产生错误的机制和缺失的防线,而不是历史文件中的一个字符串。
兼容性和变更评审¶
修改公开 spec 字段时,要回答旧工作区能否继续读取。可选新字段应有明确默认值;必选字段应在 schema、最小示例和迁移说明中同时出现。重命名字段必须提供兼容读取或明确的版本门,不能只更新生成器而让控制台、Checker 和回归读取旧名字。
评审时至少检查:输入 schema、生成文件、配置注册、用户文档、开发文档、错误码、回归 fixture 和增量兼容。代码行数很少并不代表影响范围小,例如改变 reference_files 的路径规则会同时影响 config 生成、UCAgent 引用追踪、评估和控制台解析。
扩展点汇总¶
本系统优先通过中心 schema、模板 renderer、UCTool 包装、结构化存储 API 和控制台 editor schema 扩展。新增能力应选择最窄的正确扩展点:业务渲染进入对应生成器,跨组件不变量进入中心校验,人工审批进入评估控制,不能把所有逻辑堆入 tools/workflow_builder/core.py 或任意 shell。