三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

ChatGPT、Codex方法论:任务分层之后,为什么还要建立Agent Task Contract?

ChatGPT、Codex方法论:任务分层之后,为什么还要建立Agent Task Contract?

很多团队开始使用Codex之后,很快就学会了任务拆分。

一个复杂需求不再直接交给单个Agent从头做到尾,而是拆成代码探索、方案设计、功能实现、测试验证和代码审查。不同任务还可以交给不同Agent并行执行。

但真正运行一段时间后,新的问题会出现:

  • 探索Agent找到的问题,没有完整传给实现Agent;

  • 实现Agent修改了计划之外的目录;

  • 测试Agent不知道应该验证哪些业务场景;

  • 审查Agent指出风险,却没人决定是否允许合并;

  • 每个Agent都完成了自己的任务,最终结果却无法交付。

这说明,仅仅把任务拆开还不够。

多Agent系统还需要一种机制,明确每个任务的目标、输入、边界、依赖、证据和停止条件。

这就是Agent Task Contract,也就是Agent任务契约。

它解决的不是“怎样让Agent开始工作”,而是:

怎样让不同Agent围绕同一套交付标准协作,并且让每个结果都能被检查、传递和验收。

一、为什么任务已经拆分,Agent仍然会跑偏?

任务拆分主要解决工作量问题。

例如一个支付状态异常,可以拆成:

  1. 调查支付回调;

  2. 检查订单状态更新;

  3. 修改后端逻辑;

  4. 补充测试;

  5. 审查最终Diff。

从表面看,职责已经很清楚。

但每个任务仍然可能存在大量未说明的信息。

调查Agent不知道应该只看测试环境,还是也可以读取生产日志;实现Agent不知道能不能修改数据库结构;测试Agent不知道“测试通过”是只跑单元测试,还是必须验证完整支付流程。

这些没有写清的地方,最后都需要Agent自己猜。

任务越复杂,猜测越多;参与的Agent越多,猜测之间越容易冲突。

所以真正的问题不是任务有没有拆开,而是每个任务是否具备一份可以执行和验收的契约。

二、Agent Task Contract到底是什么?

Agent Task Contract不是法律合同,也不是一篇很长的需求文档。

它是一份结构化任务说明,用来约定:

  • Agent要实现什么结果;

  • 可以使用哪些输入;

  • 允许读取和修改什么;

  • 开始前需要满足哪些条件;

  • 必须提交什么证据;

  • 哪些情况需要暂停;

  • 哪些操作需要人工批准;

  • 最终怎样判断完成。

可以把它理解为三个角色之间的协议:

任务系统负责定义要求;
Agent负责执行并提交证据;
人类或下游Agent负责验收结果。

普通提示词关注“请做什么”。

任务契约还要回答:

做到什么程度?
在什么范围内做?
出现什么情况不能继续?
用什么证据证明已经完成?

三、一份任务契约需要包含哪些字段?

完整的Agent Task Contract可以包含八个核心部分。

1. Objective:目标

说明任务最终要解决什么问题。

错误写法:

优化支付模块。

更好的写法:

修复支付回调重复到达时,订单状态被重复更新的问题,保证同一回调被多次处理后,订单和账务结果保持一致。

目标应该具体、可观察,并且只解决一个主要问题。

2. Inputs:输入

列出Agent可以依赖的信息:

  • Issue描述;

  • 错误日志;

  • 相关文件;

  • 接口文档;

  • 测试数据;

  • 上游Agent的调查结论。

如果关键输入缺失,Agent应当暂停,而不是自行编造。

3. Scope:范围

明确允许读取、修改和禁止触碰的范围。

例如:

可以读取services/paymentservices/order
只允许修改支付回调处理器和相关测试;
不修改数据库表结构;
不更换消息队列;
不升级第三方依赖。

Scope是防止小任务扩展成大重构的主要边界。

4. Dependencies:依赖

说明任务开始前必须满足什么条件。

例如:

  • 根因调查已经完成;

  • 支付回调协议已经确认;

  • 测试环境能够接收模拟回调;

  • 上游接口没有同时进行不兼容修改。

依赖未满足时,任务状态应该是“阻塞”,而不是“执行失败”。

5. Evidence:证据

规定Agent交付时必须提供什么:

  • 修改文件列表;

  • 关键Diff说明;

  • 测试命令;

  • 测试输出;

  • 复现前后对比;

  • 未验证风险;

  • 回退方式。

没有证据的“已完成”,只是Agent的自我判断。

6. Stop Conditions:停止条件

说明什么时候必须暂停执行。

例如:

  • 需要修改计划外目录;

  • 发现问题根因与任务假设不同;

  • 测试环境不可用;

  • 连续两次修复仍然失败;

  • 需要访问生产数据;

  • 预计修改公共接口。

停止不是任务失败,而是把重大决策交还给人类。

7. Approval:审批节点

规定哪些动作必须得到人工确认:

  • 新增生产依赖;

  • 修改数据库;

  • 删除数据;

  • 更改权限规则;

  • 访问外部网络;

  • 合并或部署;

  • 扩大任务范围。

提示词中的“请谨慎”不能代替真正的权限边界。

8. Done:完成标准

Done用于定义任务什么时候可以结束。

例如:

  • 原问题能够稳定复现;

  • 修复后相同场景通过;

  • 重复回调不会产生重复结果;

  • 相关测试和类型检查通过;

  • 没有无关Diff;

  • 剩余风险已经明确记录。

四、任务契约和提示词有什么区别?

提示词通常服务于一次对话。

任务契约服务于完整任务生命周期。

一个Agent可能先接收提示词,执行一段时间后交给测试Agent,测试失败后再返回实现Agent。如果只有最初那段自然语言提示,信息在多次传递后很容易丢失。

任务契约则应该始终跟随任务。

无论任务交给哪个Agent,它们看到的都应该是同一份:

  • 目标;

  • 边界;

  • 当前状态;

  • 已有证据;

  • 剩余要求。

提示词是交互入口。

Task Contract才是跨Agent、跨线程和跨阶段传递的任务对象。

五、Task Contract、AGENTS.md和Skill怎样分工?

这三个概念不能混在一起。

AGENTS.md:保存长期规则

适合记录仓库长期有效的约束,例如:

  • 修改JavaScript后必须运行什么测试;

  • 支付金额禁止使用浮点数;

  • 不得擅自增加生产依赖;

  • 公共接口变化必须说明兼容性。

这些规则不属于某个具体任务,而是每次工作都要遵守。

Skill:保存重复流程

适合封装稳定工作方法,例如:

  • 创建规范Bug Issue;

  • 执行版本发布检查;

  • 生成迁移报告;

  • 运行安全审查;

  • 整理CI失败结果。

Skill回答的是“这类任务通常怎么做”。

Agent Task Contract:描述当前任务

它记录本次任务的具体目标、输入、范围、依赖和完成状态。

可以记成一句话:

AGENTS.md规定长期不能违反什么;
Skill规定一类工作应该怎么执行;
Task Contract规定这一次到底要交付什么。

六、为什么停止条件比完成条件更重要?

很多任务只写Done,却没有Stop Conditions。

这会让Agent形成一种错误倾向:

只要还没达到完成条件,就继续尝试。

假设Agent修复支付Bug时发现,需要修改共享订单状态机。

如果没有停止条件,它可能直接扩大范围,因为这是完成目标的一条可行路径。

但共享状态机可能同时被退款、发货和售后系统使用。一次未经审批的修改,风险远高于当前Bug。

合理契约应该明确:

如果需要修改共享状态机,立即暂停;
输出影响模块、推荐方案和替代方案;
等待人工批准后再继续。

高质量Agent系统,不是让Agent永远不停地工作,而是让它知道什么时候必须停下来。

七、完整案例:支付状态Bug怎样进入任务契约?

假设线上出现一个问题:

用户完成支付后,订单偶尔仍显示“处理中”。

如果直接交给Codex:

修复支付状态不同步问题。

Agent可能同时检查前端轮询、订单服务、支付回调、缓存和数据库,最后产生一个很大的Diff。

采用任务契约后,可以先建立主任务。

任务名称: 修复支付完成后订单状态未及时更新的问题 Objective: 确认支付回调到订单状态更新之间的失败点, 修复后确保支付成功订单能够稳定进入“已支付”状态。 Inputs: - Bug Issue - 测试环境日志 - 支付回调协议 - 最近七天相关提交 - 当前订单状态机说明 Scope: 允许读取payment、order和相关测试目录。 调查阶段禁止修改代码。 实现阶段只允许修改已经确认存在问题的模块。 禁止修改数据库结构、支付协议和公共接口。 Dependencies: 测试环境能够模拟支付回调。 产品已确认正确状态流转规则。 Evidence: 根因说明、调用链、修改文件、测试命令、 测试结果、剩余风险和回退方式。 Stop Conditions: 需要读取生产敏感数据; 需要修改公共状态机; 根因与原假设不一致; 连续两次修复后测试仍失败。 Approval: 数据库修改、公共接口变更、生产发布必须人工批准。 Done: 支付成功场景通过; 重复回调场景通过; 回调延迟场景通过; 相关单元和集成测试通过; 不存在无关Diff。

这份主契约还可以继续拆成多个子契约。

八、多个Agent怎样围绕同一份契约协作?

第一阶段:探索Agent

任务:

  • 复现问题;

  • 绘制支付回调到订单状态的调用链;

  • 比较正常请求和异常请求;

  • 输出根因候选。

它没有修改代码的权限。

交付格式固定为:

已确认事实: 根因候选: 相关文件: 未确认问题: 推荐下一步:

第二阶段:实现Agent

只有在探索结论被接受后才开始。

输入包括:

  • 主任务契约;

  • 探索Agent报告;

  • 被批准的修改方案。

它不能重新定义业务规则,也不能自行扩大范围。

第三阶段:测试Agent

测试Agent不只执行已有测试,还要对照Done条件检查:

  • 正常支付;

  • 回调重复;

  • 回调延迟;

  • 状态查询失败;

  • 修复后的兼容性。

第四阶段:审查Agent

审查Agent重点回答:

  • 修改是否超出Scope;

  • 是否真正解决根因;

  • 测试证据是否充分;

  • 是否存在安全和兼容风险;

  • 是否夹带无关重构。

第五阶段:人工审批

涉及支付核心流程,最终合并仍由人类决定。

Agent负责准备证据,人类负责接受风险。

九、多Agent任务为什么必须规定返回格式?

只写“请调查这个问题”,不同Agent可能返回完全不同的内容。

有的输出长篇分析,有的只给一句结论,有的直接修改代码。

当主Agent需要汇总多个结果时,大量资源会消耗在重新理解和整理上。

所以子任务契约还应规定返回格式。

例如探索任务统一返回:

结论: 证据: 影响范围: 可信度: 未解决问题: 建议动作:

测试任务统一返回:

测试命令: 覆盖场景: 通过项: 失败项: 未执行项: 风险判断:

返回格式越稳定,Agent之间的衔接成本越低。

十、任务执行过程中,契约能不能修改?

可以,但修改必须留下记录。

软件任务经常随着调查出现新信息。真正的问题不是契约发生变化,而是变化没有被显式管理。

建议为契约增加:

Contract Version:v1.2 Changed By:人工负责人 Change Reason:发现问题来自共享缓存,而非前端轮询 Approved Scope:允许读取cache目录,但暂不允许修改

每次扩大范围、调整完成条件或增加依赖,都应更新版本。

否则测试Agent可能仍按旧标准验证,审查Agent也不知道某项修改是否已经批准。

契约不是静态文档,而是任务状态的可信来源。

十一、最常见的五种契约失败

目标仍然过大

“完成支付系统重构”不适合作为单个契约。

应该继续拆成独立可验收阶段。

范围写得过死

只允许修改一个文件,但真正根因在另一个模块。

正确做法不是让Agent偷偷修改,而是触发停止条件并申请扩大范围。

完成标准只有“测试通过”

测试可能覆盖不完整。

Done还应包含业务行为、修改范围和剩余风险。

没有区分阻塞和失败

等待上游接口不是任务失败。

错误状态会导致无意义重试。

契约只是写出来,没有真正执行

如果任务系统不检查Scope、审批和Evidence,契约就会退化成另一份没人看的文档。

十二、团队怎样建立最小可用版本?

第一阶段不需要开发复杂平台。

可以先在Issue模板中加入七个字段:

Objective: Scope: Inputs: Dependencies: Evidence: Stop Conditions: Done:

高风险任务再增加Approval。

第二步,把长期不变的规则放进AGENTS.md。

第三步,把重复执行的验证流程整理成Skill。

第四步,要求每个Agent结束时更新:

  • 当前状态;

  • 已完成内容;

  • 证据;

  • 阻塞项;

  • 下一步。

第五步,在Pull Request模板中检查:

□ 修改没有超出任务范围 □ 完成标准全部满足 □ 测试证据已经提供 □ 高风险操作已经批准 □ 剩余风险已经记录

团队先连续执行两周,就能看出哪些字段真正有用,哪些需要调整。

Agent Task Contract通用模板

任务名称: 契约版本: Objective: 本次任务需要实现的结果。 Inputs: 允许使用的文档、日志、代码、数据和上游结论。 Scope: 允许读取范围: 允许修改范围: 明确禁止范围: Dependencies: 开始前必须满足的条件。 Execution Plan: 调查、实现、测试和审查阶段。 Evidence: 必须提交的Diff、命令、日志、测试和风险说明。 Stop Conditions: 必须停止并请求人工判断的情况。 Approval: 需要人工批准的操作。 Done: 可验证的完成标准。 Status: 待处理 / 执行中 / 阻塞 / 等待验证 / 等待审批 / 完成 / 失败 Handoff: 下一名Agent需要接收的结论、文件和未解决问题。

结语

任务分层解决的是:

谁来做哪一部分工作。

Agent Task Contract解决的是:

每一部分应该在什么边界内做到什么程度,并用什么证据交付。

当团队只有一个开发者和一个Agent时,很多信息可以留在人的脑子里。

当多个Agent开始并行工作,任务需要跨线程、跨阶段甚至跨团队传递时,隐含信息就会变成返工、冲突和风险。

未来的软件团队不能只管理任务列表,还需要管理任务契约。

真正成熟的Agent系统应该做到:

目标清楚;
输入可信;
范围明确;
依赖可见;
权限受控;
失败可停;
结果有证据;
交付能验收。

AI写代码的能力会继续提高,但决定多Agent工程是否可靠的,不只是模型有多强,而是团队能否把模糊需求转化成一份可执行、可监督、可传递的任务契约。

当团队已经完成任务分层,却仍然频繁遇到Agent跑偏、重复排查、交付不完整和审查困难时,下一步通常不是继续增加Agent,而是先建立Agent Task Contract。

← 返回列表