母工作流 Checker 生成子系统二次开发¶
本篇说明如何修改母工作流的 Checker 规划、生成、模板、fixture 和注册系统,使后续生成的业务工作流拥有正确 Checker。读者是维护 tools/workflow_checker_generator/、Builder 中心 spec 和母阶段验收的开发者,不是被 Checker检查的子 Agent。
Checker 决定母阶段或生成业务阶段是否满足契约。二次开发时要区分两类:根 config 注册的母 Checker验证 wfgen/ 和构建进度;workflow_build.yaml 规划的业务 Checker由生成器物化到 workflow/。两类都继承 UCAgent Checker 协议,但修改源和交付位置不同。
二次开发目标¶
典型任务包括新增通用 rule type、增强 AST/docstring 校验、改变自动 fixture、修复注册参数、增加路径规范化或完善 Checker direct runner。业务专属判定优先由中心 spec 内联 source 表达,只有多个业务共享且规则稳定时才进入公共模板。
母工作流修改入口¶
tools/workflow_checker_generator/core.py:spec、源码、fixture、注册和报告。tools/workflow_checker_generator/templates.py:通用规则 renderer。tools/workflow_builder/core.py:从中心 workflow spec 直接物化业务 Checker。- 根
config.yaml和母 Checker模块:母阶段自身验收。 Guide_Doc/stage_check_guide.md与阶段 GuideDoc:失败说明和修复方向。regression/run_checker_description_regression.py及 delivery contract:协议回归。
真实生成链路¶
Checker 的中心规划位于 workflow_build.yaml 的 workflow spec。构建阶段应直接从该设计生成 Checker 源码、fixture 和注册,避免等到后期再猜每个阶段需要什么检查。相关实现主要位于 tools/workflow_checker_generator/、tools/workflow_builder/core.py 和 tools/workflow_evaluation_control/uc_checkers.py。
docstring 和构造参数¶
UCAgent 会读取 Checker 描述,因此 Checker 类必须提供非空、具体的 docstring。"Check output" 这类描述不能解释检查对象。docstring 应说明读取哪些文件或字段、核心通过条件和失败意义。
配置注册中的参数名、必选性和默认值必须与 Python 构造函数一致。多一个参数会在实例化时失败,漏掉必需参数也会令阶段无法运行。目录参数只有在 Checker 设计明确支持目录遍历时才合理;工作流阶段的 reference_files 仍必须是具体文件。
判定语义¶
Checker 应区分:
- 文件不存在或不可解析。
- 结构字段缺失或类型错误。
- 结构正确但业务语义不满足。
- 依赖条件尚未成立,例如未来章节或可选输出尚不存在。
- Checker 自己遇到异常。
可选输入不能在早期阶段被当成强制文件。版本或进度检查要基于当前阶段真实语义,例如“最新快照章节等于当前章节时版本必须一致”,不能用始终成立不了的全局等式制造误报。
关键业务代码分析要求¶
生成的 docs/05开发者文档-checkers.md 必须对每个 Checker 提供真实源码和分析:
- 类定义、构造函数和
check/调用入口。 - 输入路径、字段及规范化规则。
- 主要条件分支和错误码对应关系。
- 为什么这些条件能证明用户需求,而不是只证明格式存在。
- 正向 fixture、单一错误负向 fixture 和边界 fixture。
- config 中的注册片段及参数映射。
- 修改阈值、字段或依赖后必须同步调整的阶段和测试。
片段必须来自最终生成的真实文件,标注相对路径和关键行附近的符号。分析应指出业务规则的来源;若需求没有规定,必须说明这是首阶段计划补充的设计决策。
防止误报和漏报¶
最小 fixture 只改变一个条件,使失败原因可定位。一个负向 fixture 同时破坏五个字段,会让开发者无法知道 Checker 是否验证了目标规则。Checker 不得依赖不稳定时间、随机顺序或绝对路径。路径比较应规范化后比较,不得因为 .//workflow/x 与 workflow/x 字符串不同误判。
严重程度不是 Checker 自己随意决定的装饰。会阻止 UCAgent 启动、导致无限重试、破坏正式文件或错误宣称完成的缺陷最危险;文档措辞、非关键提示和可选优化不应升级为阻断阶段的问题。
修改清单¶
- 同步更新中心 checker spec、生成模板、注册和阶段参数。
- 保证 docstring 解释真实检查内容。
- 增加实例化测试和参数注册一致性测试。
- 为每项业务规则提供正反证据。
- 验证 Checker 自身异常不会伪装成业务失败。
- 运行 Checker 生成回归和相关完整流程检查。
Checker spec 的中心地位¶
Checker spec 是判定实现、fixture、测试与阶段注册的共同来源。workflow_build.yaml 中每个 Checker 应完整携带名称、描述、入口、规则或源码、fixture、tests 和 register。Builder 先把中心定义写成 .workflow/checker_specs/<name>.yaml,再调用 checker generator 物化,避免阶段 config、Python 文件和测试由不同步骤各写一套事实。
Checker 描述要说明“什么证据证明什么业务条件”。例如“检查报告”没有对象、字段和失败意义;“读取 validation_report.json 的 status、missing_assets 和 output_sha256,确认 DOCX 可解析且没有缺失必需素材”才足以指导 Agent和评估者。
spec 结构校验代码分析¶
源码位置:tools/workflow_checker_generator/core.py,符号 _validate_spec()。
该函数先确认顶层 mapping、名称、详细描述和 entry,再验证 rule type、register、fixture 与 tests。路径必须经过 _safe_resolve(),测试参数必须是 mapping,expected_pass 必须是布尔值。重复或缺失字段应在生成源码之前失败,防止留下半套 Checker。
如果 spec 提供 source,验证器不能因为“用户已经写了代码”就跳过结构检查。source 和 entry 仍要一致,测试仍然必需,注册参数仍需验证。规则模板和内联源码只是产生实现的两种方式,不代表不同质量标准。
AST 与 docstring 校验¶
源码位置:tools/workflow_checker_generator/core.py,符号 _validate_inline_source()。
AST 校验比文本搜索可靠:注释中的类名不会被误认为实现,别名或属性基类可以显式处理,方法 docstring 能通过语法树取得。它仍不是运行测试,不能证明 import 依赖存在、构造参数匹配或检查逻辑正确,所以后面还需要 static checker 和 direct runner。
当前验证要求检查方法具有 docstring,是因为 UCAgent 和诊断工具需要说明。类级 description 与方法 docstring责任不同:description 面向阶段和用户解释业务检查,方法 docstring 面向维护者说明调用和返回。二者都不能为空。
自动 fixture 生成分析¶
源码位置:tools/workflow_checker_generator/core.py,符号 _materialize_auto_tests()。
自动测试为通用规则建立最小正反样例。required keys 的负向样例只删除最后一个键,因此失败原因单一;numeric range 的负向值只越过上界;file exists 创建一个文件并保证另一路径不存在;command exit code 使用允许命令产生 0 与非 0。
自动 fixture 适合证明模板基本行为,不能替代业务 fixture。一个“字段存在” Checker 可能还需要验证字段间语义,这时应提供显式 fixture 或内联 Checker。不要不断给通用模板增加业务特例,否则模板难以理解且所有工作流都承担额外复杂度。
模板代码分析:JSON 必需字段¶
源码位置:tools/workflow_checker_generator/templates.py,符号 _render_json_required_keys()。
这里把不存在、解析/类型和字段缺失分成不同错误码,使 Agent 能采取不同修复。_resolve() 把 path 限制在 workspace 内,防止 Checker 借阶段参数读取任意系统文件。返回值是 (passed, evidence),evidence 中保留 path 和 missing keys,而不是只返回 False。
注意“键存在”不验证值类型或含义。若业务要求 status == completed 或哈希非空,必须选择更合适规则或写业务 Checker。把所有条件塞进 required keys 的描述会形成文档与实现不一致。
模板代码分析:数值范围与命令¶
numeric range 模板显式排除 bool,因为 Python 中 bool 是 int 子类。上下界为闭区间,修改为开区间会改变业务语义,必须同步 spec 和 fixture。字段不存在与非数字当前共用同一错误分支;若 Agent 修复需要区分,可以新增错误码和单一负向案例。
command exit code 模板只允许 self.command[0] 出现在 allowed_commands,使用参数数组调用 subprocess.run(),设置 cwd、capture、text 和 timeout。它不通过 shell 拼接,因此用户参数不会变成管道或重定向。stdout/stderr 被截断到尾部,避免 Checker 返回巨大上下文。
命令白名单需要精确到可执行程序,但仅验证程序名仍可能允许危险参数。适合 python -m py_compile、特定 make check 等可控命令;处理用户可控任意参数时应增加参数模式、工作目录和输出路径限制。
注册代码分析¶
源码位置:tools/workflow_checker_generator/core.py,符号 _register_checker()。
UCAgent 配置字段使用 clss,不是通常拼写的 class。生成器负责从文件路径去掉 .py、把斜杠转为点,再拼接类名。手工注册很容易漏掉这一细节。已有同名项被更新而不是重复追加,保证阶段调用顺序稳定。
注册前查找目标 stage;stage 不存在必须失败,不能退回第一个阶段。args 需要与 Checker __init__ 一致。评估流程应 import 类、检查签名并尝试实例化,才能发现 config 多传或少传参数。
Checker 物化主链¶
源码位置:tools/workflow_checker_generator/core.py,符号 generate_checkers_from_specs()。
主链依次解析每份 spec、结构校验、生成自动测试、写显式 fixture、选择内联 source 或模板 renderer、写 Checker 源码,最后可选注册。每个动作更新 CheckerGenerationReport。任何一步失败都应指出当前 spec,避免批量生成时不知道哪项出错。
Builder 调用时通常设置 update_config=False,因为中心阶段契约之后由 config generator统一注入;独立维护工具则可以注册。开发者修改该开关语义时要检查是否产生重复注册或缺失注册。
二次开发案例:扩展业务 Checker 生成能力¶
DOCX 工作流的 DocumentIntegrityChecker 需要证明输出不是仅有 .docx 后缀的空壳。构造参数包括 workflow-relative 文档路径、必需章节清单和最少图片数。检查方法使用 zipfile 或 python-docx 解析文件,验证 ZIP 完整性、正文段落、标题、关系文件和图片引用,并返回每项证据。
正向 fixture 是最小合法 DOCX;负向 fixture 分开覆盖损坏 ZIP、缺章节、图片关系丢失和文档路径逃逸。spec 注册到生成文档后的阶段,reference 指向具体 DOCX 和结构化报告。开发者文档引用真实解析代码,说明为什么不能只检查文件存在和大小。
若后续增加“页眉必须包含版本”,应更新需求引用、Checker 构造参数或规则、fixture、阶段任务、开发文档和 eval_checkers 业务覆盖。不能只在描述中加一句而不改代码。
误报诊断方法¶
遇到阶段连续失败时,先用 Checker 注册参数在独立 direct runner 中复现。然后依次检查:输入是否在当前阶段已经生成;路径规范化后是否相同;可选文件是否被强制;fixture 是否代表当前 schema;Checker 自己是否捕获了 import/解析异常;失败证据是否对应实际分支。
曾出现 .//workflow/x 与 workflow/x 按字符串比较误判,这类问题应在路径生成和比较层规范化,而不是要求 Agent按某个奇怪字符串读取。也曾出现“最新快照版本必须总等于当前版本”在批内更新阶段误报,应把条件限定为相同章节或相同检查点语义。
扩展点、修改影响与回归矩阵¶
| 修改 | 同步范围 |
|---|---|
| 新 rule type | spec 校验、renderer、自动 fixture、文档和回归 |
| 修改构造参数 | template、register args、config、实例化测试 |
| 修改路径规则 | _safe_resolve、模板 _resolve、符号链接和越界 fixture |
| 修改错误码 | FAQ、阶段修复提示、评估证据和负向测试 |
修改 clss 注册 | UCAgent 加载、配置生成、静态 import 回归 |
| 修改业务语义 | 用户需求、中心 spec、正反 fixture、阶段和开发文档 |
Checker 回归必须同时证明该通过的通过、该失败的失败。只跑正向样例会让无条件 return True 的错误实现通过全部测试。
母构建 Checker 完整索引¶
以下类定义在 tools/workflow_builder/uc_checkers.py。大部分类继承 WorkflowBuildConfigChecker,共享 workspace 路径规范化、YAML/JSON 读取和证据结构,但每个类的业务证明对象不同。
| Checker 类 | 检查对象 | 主要失败意义 | 二次开发注意 |
|---|---|---|---|
WorkflowBuildConfigChecker | workflow_build.yaml 的基本结构、路径与核心契约 | 中心设计不可解析或无法驱动后续生成 | 是共享基类,修改通用路径/读取行为会影响几乎全部母 Checker。 |
WorkflowInputExampleManifestChecker | input_example_manifest.yaml 的用户样例清单、文件存在性和归类 | 输入契约对真实样例认知不完整 | 新增样例类型要保持未知/可选分类可表达,不要把特定业务扩展名硬编码。 |
WorkflowBuildOutputChecker | Builder 初始产物、目录与报告 | Builder 返回成功但固定交付物缺失 | 新交付物需同步 BuildReport 和 delivery regression。 |
WorkflowMinimalInitChecker | 烟雾工作流的最小可运行骨架 | 尚未到完整实现就无法进行生成闭环 | 最小不等于空壳,应只检查本阶段已承诺的文件。 |
WorkflowEnvironmentSetupChecker | 生成的 Makefile、ucagent_setup.sh、setup.py、schema 和 requirements | 子工作流不可移植或配置无法生效 | 要区分 Python 依赖与非 Python 注释安装说明,测试 dry-run 与重复执行。 |
WorkflowMCPToolIntegrationChecker | 工具源码、config 注册、import、参数和直接/MCP 调用 | 工具文件存在但 UCAgent 不可用 | 新返回结构或 adapter 必须同时改 direct 和 MCP 证据。 |
WorkflowGeneratedCheckerChecker | 生成 Checker 源码、docstring、fixture、注册和正反运行 | Checker 无法加载、参数错或判定无效 | 必须防止无条件通过,同时不用未来产物误报当前阶段。 |
WorkflowGeneratedConfigChecker | 生成 config/inc 的语法、必需字段与基本注册 | 运行配置不可加载 | 新 schema 字段需先定义兼容默认,再改生成器和此 Checker。 |
WorkflowRuntimeConfigAuditChecker | 阶段 reference/output 具体文件、可达性、占位符、Tool/Checker/GuideDoc 闭包 | 配置能解析却会在运行时卡死或读不到文件 | 路径比较要规范化;reference/output 禁止目录;不得只为某个 {INPUT} 表象写特例。 |
WorkflowGeneratedGuideDocChecker | 生成 GuideDoc 的语义章节、操作证据、注册与详细度 | Agent 虽能读文档却无法依步骤执行 | 标题多语言应通过稳定 section id 处理,不要硬编码中文标题。 |
WorkflowMigrationPackageChecker | 迁移包文件清单、相对路径、哈希、可解压与迁移后检查 | 开发机成功但交付到新系统失败 | 必须在新临时根验证,不可因绝对路径偶然存在而通过。 |
WorkflowToolGenerationChecker | tool spec、生成状态、基础源码/测试结构 | 生成闭环未建立 | 是工具类 Checker 基类,通用规则不应包含某业务文件名。 |
WorkflowGeneratedToolChecker | 单个烟雾业务 Tool 的源码、spec、fixture 与运行结果 | 代表性 Tool 不可用,后续批量生成不可信 | 检查参数应由当前 spec 提供,不假设 diag_checker*.py 等偶然文件。 |
WorkflowBusinessToolGenerationChecker | 全部规划业务 Tool 的数量、生成、注册、测试与需求覆盖 | 只有烟雾 Tool,业务能力交付不完整 | 允许后续新增 Tool,但每个必须回到 manifest/spec 和测试证据。 |
WorkflowGuideDocSpecChecker | 文档 spec 的目标路径、类型、section id、详细度与注册计划 | 未经规划就批量生成文档 | 要区分 GuideDoc 和 human docs,字数规则不能靠代码块灌水绕过。 |
WorkflowRequirementCoverageChecker | requirements manifest 中需求到 Tool、Checker、config、GuideDoc、docs 的可追踪映射 | 产物形式完整但偏离用户需求 | 同一类以多个 alias 在不同时间点使用,阈值应随阶段递进而非一开始要求最终产物。 |
WorkflowImplementationPlanChecker | 初始实施计划的阶段、Tool、Checker、GuideDoc、产物和作用描述 | 母 Agent 未先建立可执行蓝图 | 类/方法 docstring 与计划正文详细度都要测;最小示例要标明不满足正文字数。 |
WorkflowLivingPlanChecker | 每阶段标记、追加内容和前序保留 | 后续阶段与前序设计断联或覆盖历史 | 修改 marker 后同步 appender、FAQ、UI 解析和 living-plan regression。 |
WorkflowUserDocsChecker | README、01–05 用户/开发文档、目录、字数、真实源码分析 | 生成工作流无法被人使用或继续开发 | 格式要求要保持内容自由度;源码片段必须来自真实生成文件。 |
WorkflowDependencyChecker | requirements.txt 的 Python 依赖、非 Python 工具注释与安装方法 | 用户无法还原运行环境 | 不得伪造未验证版本;可选系统工具需说明降级行为。 |
评估与增量 Checker 完整索引¶
以下类定义在 tools/workflow_evaluation_control/uc_checkers.py。它们不判断某个业务文件“好不好”,而是判断评估/增量报告是否按契约收集证据、是否受批准约束以及是否真正完成部署回归。
| Checker 类 | 作用 | 二次开发重点 |
|---|---|---|
EvaluationJsonReportChecker | 验证指定 eval 报告 run 的 schema、status、checks、findings、metrics 与本轮身份 | 新增字段必须为旧 run 提供兼容默认,不能只查 JSON 可解析。 |
EvaluationGuideCoverageChecker | 验证评估/增量 GuideDoc 是否覆盖必需规则、严重度和执行约束 | 新 check id 需同步 GuideDoc 和 coverage 清单,但不应要求每阶段读取全部长文。 |
StaticAuditCoverageChecker | 确认静态审计覆盖本评估域所有必需规则 | 应对比 rule id 和实际 evidence,不能用一个“审计成功”布尔值代替。 |
IncrementalAuditCoverageChecker | 确认增量阶段已做批准新鲜度、候选、边界、部署与回归审计 | 修改状态机后必须同步审计规则,防止正式文件已替换却等待再批准。 |
IncrementalContextReportChecker | 验证当前 inc run 的认知清单、目标批准、索引与阅读预算 | “初步了解”不应被实现为全量文件阅读打卡,要检查导航性而非字节总量。 |
IncrementalApprovalChecker | 验批准/建议的 source、run、fingerprint、decision 及 current 状态 | Agent 不得自批;来源 finding 改变后旧批准必须失效。 |
EvaluationStageGateChecker | 检查评估阶段是否只执行允许操作、写入正确报告并满足完成门槛 | 更改 eval 职责拆分时同步 gate,避免 eval_tools 越界评估环境或启动子流程。 |
EvaluationEvidenceChecker | 检查 finding/check 的证据是否指向具体文件、符号、命令或结果 | 没有证据的判断不能用于欺骗用户“已满足需求”;证据路径必须可追踪且不越界。 |
IncrementalApplicationChecker | 验证 approved target 到 candidate mapping、部署记录、哈希、备份和未完成项映射 | 只生成候选计划不等于已修复;必须核对正式文件结果。 |
IncrementalRegressionChecker | 在 application 证据上额外要求正式 make check 及相关目标成功 | 回归失败时不得因已部署而转 pending;应继续在原批准范围修复或回滚。 |
配置 alias 与实现类映射¶
配置中的 Checker name 是阶段语义 alias,clss 才是 Python 实现。同一类可在多个阶段使用不同 args 和 alias。开发者调整类签名时必须查找以下全部映射,不能只修第一个搜索结果。
| 实现类 | 当前主配置 alias |
|---|---|
WorkflowLivingPlanChecker | living_plan_update_check |
WorkflowRequirementCoverageChecker | requirements_manifest_check、initial_build_requirement_coverage、initial_template_requirement_coverage、smoke_manifest_check、final_requirement_coverage |
WorkflowImplementationPlanChecker | workflow_implementation_plan_check |
WorkflowInputExampleManifestChecker | input_example_manifest_check |
WorkflowBuildConfigChecker | workflow_build_config_check |
WorkflowBuildOutputChecker | workflow_builder_output_check |
WorkflowToolGenerationChecker | workflow_tool_generation_check |
WorkflowGeneratedToolChecker | workflow_business_tool_spec_check、workflow_generated_tool_check、workflow_generated_tool_strengthened_check |
WorkflowMinimalInitChecker | workflow_minimal_init_check |
WorkflowEnvironmentSetupChecker | workflow_environment_setup_check |
WorkflowMCPToolIntegrationChecker | workflow_mcp_tool_integration_check、full_mcp_tool_integration_check |
WorkflowRuntimeConfigAuditChecker | runtime_config_reference_audit |
WorkflowGuideDocSpecChecker | guidedoc_spec_check |
WorkflowGeneratedGuideDocChecker | generated_guidedoc_check |
WorkflowUserDocsChecker | generated_user_docs_check |
WorkflowDependencyChecker | generated_dependency_check |
WorkflowMigrationPackageChecker | generated_migration_package_check、final_migration_package_check |
inc.yaml 中,generated_workflow_context_complete 映射 IncrementalContextReportChecker;approved_changes_deployed 映射 IncrementalApplicationChecker;applied_changes_have_approval 和 all_current_approvals_deployed 映射 IncrementalApprovalChecker;incremental_report_complete 映射 EvaluationJsonReportChecker;incremental_guide_complete 映射 EvaluationGuideCoverageChecker;incremental_static_audit_covered 映射 IncrementalAuditCoverageChecker;incremental_make_check_passed 映射 IncrementalRegressionChecker。
各 eval_*.yaml 的报告 alias tools_report_complete、checkers_report_complete、flow_report_complete、env_report_complete、run_report_complete 映射 EvaluationJsonReportChecker;指导 alias tools_guide_complete、checkers_guide_complete、flow_guide_complete、env_guide_complete、run_guide_complete 及 evaluation_contract_complete 映射 EvaluationGuideCoverageChecker;deterministic_audit_covered 映射 StaticAuditCoverageChecker。EvaluationStageGateChecker 与 EvaluationEvidenceChecker 属于可组合门禁能力;若在配置中新注册,必须补充 alias、args 实例化和阶段证据回归。
修改 Checker 的标准步骤¶
- 先用一句可证明命题写清“它通过时究竟证明什么”,再确定这是母构建、评估增量还是生成的业务 Checker。
- 列出本阶段已经存在的具体文件和字段,将未来输出设为后阶段检查或明确可选,禁止用目录代替 reference 文件。
- 实现稳定 docstring、构造参数、路径规范化、分支错误码和有意义 evidence;不捕获所有异常后伪装成业务失败。
- 从所有 YAML 搜索对应
clss和 alias,验证 args 名称、类型、必选性和默认值与签名一致。 - 添加最小正向 fixture、每次只破坏一个条件的负向 fixture、边界 fixture、import/实例化测试和配置集成测试。
继续阅读¶
Checker 告诉 Agent “什么算完成”,GuideDoc 则告诉 Agent “怎样可重复地做到”。请继续阅读指导文档简介,了解阶段指导、FAQ、最小样例与 Checker 语义如何保持一致。