openworker 内置 Test Worker 角色解析:基于验收标准的独立验证与 PASS/FAIL 判决机制
2026/9/21 18:52:17 网站建设 项目流程
  • 人工智能
  • AI Agent
  • AI 应用
  • 交互助手
  • 本地部署
  • 桌面应用
  • MCP Clients

【免费下载链接】openworker

项目地址:https://gitcode.com/gh_mirrors/op/openworker
点击查看免费下载

openworker 在团队协作模式下内置了 Test Worker(验证型 worker 角色),其 manifest.md 定义了“构建者不得给自己的作品打分”这一核心原则:当 SWE Lead 将实现类条目推进到 review 状态时,Test Worker 会接收一条链接的验证条目,独立地逐条核对验收标准,最终给出带证据指针的 PASS/FAIL 判决。本文将以该 manifest 为主干,结合 teams 的板面状态机、工具注册、journal 存储与测试用例,完整拆解 Test Worker 的角色定位、验证方法论、工具集、判决契约及其底层实现。

1. Test Worker 是什么:团队中的独立验证者

1.1 角色定位与核心原则

在 openworker 的 agent 团队模型中,worker 被分为两类:构建者(如 swe-worker)负责实现条目,验证者(即 Test Worker)负责独立检验构建者交付的成果是否符合条目的验收标准。

Test Worker 的角色定义明确写在 manifest 中:

You are the team's verifier. A builder coworker finished an item; the lead assigned you a linked verification item. Your job: independently establish whether the work MEETS ITS ACCEPTANCE CRITERIA — assume it doesn't until the evidence says otherwise.

这句 prompt 蕴含三条关键原则:

  • 独立验证:Test Worker 必须假设成果不达标,直到证据证明其达标。这与 SWE Lead manifest 中 "a builder never grades its own work" 的验证策略完全一致(见 swe-lead/manifest.md 第 5 条 VERIFY 规则:当团队中有 test worker 时,实现类条目应由 test worker 验证——先创建一条链接的验证条目并分配给验证者,Lead 依据验证者的判决来裁决)。
  • 对标准负责:验收标准(acceptance criteria)是唯一的检查清单,逐条核对,不凭 diff 阅读作判断。
  • 面向 Lead 交付:Test Worker 的沟通对象是 Lead 而非终端用户,因此不使用 ask_user;疑问转化为条目评论,或当启用团队聊天时通过 post_chat 提及@lead

1.2 manifest 的结构化声明

Test Worker 的 manifest 采用 YAML frontmatter + Markdown body 的标准结构(与 SKILL.md 同构),frontmatter 部分完整声明如下:

--- ships: false id: test-worker name: Test Worker icon: check tagline: Verifies teammates' work against acceptance criteria requires_folder: true subagents: true version: "1" team: worker tools: [code_files, git, search, shell, todo] # What this worker COULD use (spec §11.6): the consent ceiling for the staffing # card and grant_connector. Workers start with nothing on; the human ticks. connectors: [github] models: [anthropic:claude-opus-4-8] default_permission_mode: interactive description: A verification coworker for teams — it independently tests what a builder coworker handed to review, against the item's acceptance criteria, and delivers a pass/fail verdict with evidence. The builder never grades its own work. ---

各字段含义与底层影响如下(字段解析实现见 coworker/personas/manifest.py 的parse_manifest):

字段说明
idtest-worker角色唯一标识,会作为目录名与注册键,必须符合^[a-z0-9][a-z0-9_-]{0,63}$的文件系统安全 slug 约束
teamworker团队身份声明,取值为lead/workerworker意味着该角色是专为在 Lead 指挥下工作而设计的板面 worker
tools[code_files, git, search, shell, todo]声明的能力清单,经 catalog.py 的CATALOG校验并展开为实际工具(详见 §3)
connectors[github]连接器授权 allowlist(OPE-93 机制)。关键语义:worker 默认“什么连接器都没有”,该列表只是 staffing 卡片与grant_connector同意上限(consent ceiling),由人工勾选后才真正启用;未声明 = 缺失,不会泄漏未声明工具
models[anthropic:claude-opus-4-8]有序模型白名单,第一项为默认模型;运行机器上无法跑第一项时顺延到可跑的第一项
requires_foldertrue要求用户指定主工作文件夹,composer/engine 据此做门控
subagentstrue允许探索式 fan-out 子代理
default_permission_modeinteractive默认权限模式,合法值见VALID_MODES(discuss/plan/interactive/custom/auto/bypass-approvals/auto-approve)
shipsfalse分发决定而非成熟度声明:该角色存在于代码库但不进入发布构建,内部构建通过OPENWORKER_UNSHIPPED=1选入
version"1"版本串,仅作来源信息,驱动重装时的 “replaces vN” 提示

值得注意的细节:Test Worker 的models只声明了一个模型,而 swe-worker 声明了[anthropic:claude-opus-4-8, openai:gpt-5.6-sol]两个;从源码看_models()会按序去重,并拒绝models与旧别名recommended_models冲突的 manifest。而connectors的解析(_connectors函数)则强调fail closed:列表之外的连接器一概拒绝,第三方 bundle 声明connectors: all会被直接抛ManifestError——这是防信任滥用的安全设计。

2. 验证方法论:如何独立判定“达标”

manifest 正文给 Test Worker 规定了五步验证纪律,这是整份文档的实操核心:

2.1 从验收标准出发,验证真实行为

  • 以被验证条目的验收标准为逐条检查清单;
  • 测试真实行为——运行应用、运行测试、实际操练改动,绝不只靠阅读 diff 来判断。

这对应 SWE Lead 侧的要求:验收标准是“Done when:”形式的 1~3 条简短、可独立检查的陈述(机制性内容放进 description 而不是 criteria),因为“一个验证者能对三条检查判 PASS/FAIL,却无法对一篇论文判 PASS/FAIL”——标准写得越差,验证越无从下手。

2.2 缺测试工具的降级策略:先项目本地安装,再 request_tool

缺少测试工具时的处理优先级:

  1. 优先项目本地安装:在 workspace 内安装,像普通开发者一样——npm i -D playwrightpip install pytest
  2. request_tool 仅用于系统级二进制:项目自身无法携带的才申请(该能力由 tools/connreq.py 支撑);
  3. 两者都不可行时:验证能验证的部分,并明确说出哪些检查无法执行。这与 swe-worker 的 “no silent skips” 纪律同构。

2.3 媒体密集型验证:截图、输出、渲染 diff

验证过程刻意偏向多媒体证据:截图、捕获输出、渲染对比。这些成本计入验证者自己的上下文,从而保住构建者上下文用于构建。证据要以文件形式保存在 workspace 并通过路径引用,绝不凭记忆描述像素。

2.4 证据日志化:journal_append(kind=evidence)

边验证边记录:运行了什么、看到了什么、捕获文件的引用、file:line 位置。底层由 teams/journal.py 的JournalStore.append实现,其关键约束包括:

  • kind取值限定为finding/evidence/decision/note/raw(见 teams/model.py 的JOURNAL_KINDS);
  • 条目正文上限JOURNAL_BODY_LIMIT = 16_000字符——大体积捕获应存为文件,日志只记引用它的摘要(“raw” 类型的捕获默认不会被读取,除非显式要求,避免 dump 淹没信号条目);
  • 日志按 case 哈希链存储(_HASHED_FIELDSprev_hash),append-only、带 actor 归属与 taint 标记,可verify_chain校验完整性。

从 teams/tools.py 的journal_append工具 schema 可见,它还支持entities(具体事物:文件路径、资源名、CVE id,用于后续召回)与refs(file:line、commit、url 指针)两个元数据参数——这正是“证据指针”的落点。

2.5 交付物是判决:hand-off 评论中的 PASS/FAIL

当验证条目被移动到 review 状态时,Test Worker 以 hand-off 评论交付判决:

  • 每条验收标准一个 PASS 或 FAIL,并附证据指针
  • 结论要精炼(“The lead reads conclusions, not pixels”),证据要可链接;
  • FAIL 在真实时是好结果:精确的失败判决(哪里坏了、如何复现、证据在哪)正是团队所需;绝不软化失败,绝不“凭感觉通过”。

2.6 范围纪律与指挥链

  • 发现标准之外的 bug:作为新条目提交(create_item),不扩张判决范围;
  • 指挥(steering)以[Lead]/[User]标注到达,[User]优先级更高;
  • 团队契约同样约束 Test Worker:开始即in_progress,无法验证(缺凭据、应用无法运行)就带评论进入blocked永远不自己把条目标记为 done

3. 工具集:板面动词 + 工作区能力

3.1 工作区能力(tools 字段的展开)

tools: [code_files, git, search, shell, todo]五项能力经 catalog.py 的CATALOG校验(未知能力会抛ManifestError),展开为具体工具:

能力 id展开内容(源码依据)风险等级
code_files单仓库 workspace 的带行号读写、编辑工具集READ + WRITE_LOCAL
gitgit_status/git_diff/git_log及 git 工具包READ
searchgrep(ripgrep、感知 .gitignore)READ
shellrun_shell+ 后台任务工具EXEC
todotodo_write(驱动 Progress 面板)READ

从 catalog.py 的实现看,这些能力均在 manifest 解析时经_validate_toolsCATALOG对照,确保角色不会引用不存在的工具。

3.2 团队动词:worker 集合的可见性边界

Test Worker 的team: worker身份决定了它获得的板面动词集合。在 teams/tools.py 中:

LEAD_VERBS = ("create_item", "list_items", "transition", "comment", "assign", "link") WORKER_VERBS = ("create_item", "list_items", "transition", "comment", "claim") JOURNAL_VERBS = ("journal_append", "journal_read")

board_tools返回的动词按actor.role过滤——worker 甚至看不到assignlink。且注释明确:权限双重校验——工具层过滤只是便利,store 层每次调用都会重新检查(“the tool layer is convenience, the store is the gate”)。worker 可用的关键动词及语义:

  • create_item:创建新条目(open、未分配)。测试 worker 用它提交范围外的 bug 条目;criteria是必填参数(见_CREATE_ITEM_SCHEMA的 required 字段);
  • transition:仅能把自己的条目移动到in_progress/blocked/review(对应WORKER_TARGETS = {IN_PROGRESS, BLOCKED, REVIEW},见 teams/model.py);
  • comment:给条目加持久、带归属的评论,可附refs指针;
  • claim:认领 open 且未分配的条目(首次认领生效,Lead 可在 digest 中看到并可 reassign);
  • journal_append/journal_read:验证证据的写入与过滤读取。

3.3 板面状态机:review→done 的验证门

状态机定义于 teams/model.py:

open → in_progress / canceled in_progress → blocked / review / canceled blocked → in_progress / canceled review → done / in_progress / canceled done → (无出口) canceled → open

关键设计:review → done是验证门。worker 永远无法把条目移到 done(WORKER_TARGETS不含 DONE,测试test_workers_never_mark_done在 tests/test_team_board.py 中验证了该 AuthorityError);done 是 Lead 在 review 阶段的裁决——当团队有 test worker 时,这个裁决以 test worker 的判决为基础。Test Worker 在blocked时必须以评论说明具体缺什么,绝不能静默停滞。

4. 与团队的协作闭环:一条验证条目的生命周期

将 manifest 与 Lead 侧规则(swe-lead/manifest.md)拼接,可以得到 Test Worker 参与的一次完整验证闭环:

  1. 分配:SWE Lead 将实现条目推进到 review 后,创建一条链接的验证条目(linked verification item,可用linkparent/blocks关联),分配给 Test Worker;
  2. 开始:Test Worker 将验证条目移动到in_progress
  3. 验证:逐条对照验收标准运行真实行为测试,安装项目本地测试工具,截图/捕获输出为文件,用journal_append(kind=evidence)记录运行内容、观察结果与 file:line 引用;同时用todo_write维护可见进度列表;
  4. 交付判决:将验证条目移动到review,在 hand-off 评论中给出逐标准的 PASS/FAIL 与证据指针;
  5. Lead 裁决:Lead 依据判决将原条目标记 done,或带精确评论退回in_progress;Test Worker 自身永不标记 done(板面状态机强制执行,见test_workers_never_mark_done测试);
  6. 异常路径:缺凭据或应用无法运行 → 带说明评论进入blocked;发现范围外 bug →create_item提交新条目(open 且未分配,测试test_workers_file_items_open_and_unassigned验证了该行为:提交后可见但不能自分配,open-claims默认策略下其他 worker 可认领,lead-only策略下则严格切片隔离)。

整个闭环的权限骨架由 tests/test_team_board.py 覆盖:worker 无法展开切片窥探他人条目(test_worker_cannot_expand_its_slice_through_a_hidden_parent)、无法触碰他人条目(test_worker_cannot_touch_someone_elses_item)、无法 assign/link(test_workers_cannot_assign_or_link)、验收标准必填(test_acceptance_criteria_are_required)。

5. 如何在实际团队中启用 Test Worker

结合 manifest 语义与 swe-lead/manifest.md 的 staffing 流程,实际启用步骤如下:

  1. 在 openworker 中创建团队会话并选择 SWE Lead 作为 lead 角色;
  2. Lead 通过propose_team提出 roster,为 Test Worker 指定 persona(test-worker)、短 callname(如checks)、模型与 reason;用户审批后创建 worker 会话;
  3. 连接器决策:Lead 应先调用team_options查看每个 worker 的ready/connectable/not_connected/other_connected连接器状态。Test Worker 的connectors: [github]只是同意上限——worker 默认无连接器,只有用户在 staffing 卡片上勾选后才生效。由于 Test Worker 的工具集含shell,可在工作区内本地安装测试框架,通常无需额外连接器;确实需要时才通过request_connector申请并说明理由;
  4. 条目到达 review 后,Lead 创建链接的验证条目分配给 Test Worker,依据其 PASS/FAIL 判决完成review → done或退回;
  5. 注意ships: false:Test Worker 不随发布构建分发,内部构建需设置OPENWORKER_UNSHIPPED=1才能选入(见 manifest.py 对ships的注释:这是分发决定而非成熟度声明)。

6. 设计亮点与适用边界

设计亮点

  • 职责分离的制度化:验证者与构建者分开,把“谁也不能给自己的作品打分”从口头约定变成角色边界、状态机权限和 verdict 交付格式三层面的硬约束;
  • 证据成本归属:媒体密集型证据(截图、输出、diff 渲染)计入验证者上下文,构建者上下文只用于构建——这是对多 agent 协作中上下文预算的显式管理;
  • 失败是资产:prompt 明确 “Never soften a fail; never pass on vibes”,精确的 FAIL 判决(坏了什么、如何复现、证据在哪)被视为团队最需要的信息;
  • 权限最小化:worker 角色看不到assign/link,无法标记 done,无法访问他人条目切片,无法自授连接器——每次调用 store 层都会复审(双重校验)。

适用边界

  • Test Worker 是ships: false的内部角色,不会出现在公开发行版中;发布构建通过OPENWORKER_UNSHIPPED=1才引入;
  • 它面向团队协作场景team: worker),单独使用(solo)不具备团队资格——manifest 解析中 team 字段缺失时被视为 solo-only,staffing 会 fail closed;
  • 其验证能力依赖requires_folder: true的用户指定主文件夹与interactive默认权限模式;无法执行系统级安装且项目无法携带依赖时,manifest 明确要求降级为“验证能验证的,并说明哪些检查未执行”,因此验证覆盖率受运行环境实际约束。

综上,Test Worker 是 openworker 团队协作验证链条中的专职独立验证者:它以验收标准为唯一清单,以真实行为测试为方法,以 journal 证据为支撑,以逐标准 PASS/FAIL + 证据指针的 verdict 为交付物,从制度上保证了“构建者不给自己打分”的质量防线。其完整定义见 coworker/personas/builtin/test-worker/manifest.md,底层机制可继续阅读 teams/model.py、teams/tools.py、teams/journal.py 与 tests/test_team_board.py。

  • 人工智能
  • AI Agent
  • AI 应用
  • 交互助手
  • 本地部署
  • 桌面应用
  • MCP Clients

【免费下载链接】openworker

项目地址:https://gitcode.com/gh_mirrors/op/openworker
点击查看免费下载

相关推荐

上一篇:Data-Juicer项目数据集配置完全指南
下一篇:Phinx数据库种子(Seeding)功能详解

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询