AI渐进编程之八:作为甲方,如何和 Agent 签一份好合同?

前面几篇我们已经把项目地图、状态机和 SIADOS 讲清楚了。
这一篇要继续往下走,回答一个非常实际的问题:

当前这一轮任务,到底应该怎么写,AI 才能看得懂、做得对、不会越界?

本书把这个问题交给 current_task.md

它不是聊天记录,
也不是随手写的一句口头要求,
而是一份短期有效、可以验收、可以回写状态的任务契约。


1. 为什么还要有 current_task.md

很多时候,人类给 AI 的任务本来是模糊的。

比如你可能会说:

  • “把这个 Bug 修一下”
  • “顺便把相关测试补上”
  • “改完以后尽量别影响其他部分”
  • “如果有兼容性风险,先记下来”

这些话人能听懂一点,但对系统来说并不够清楚。
因为它没有把下面几件事明确写出来:

  • 这轮的目标到底是什么
  • 这轮允许改哪里
  • 这轮禁止碰哪里
  • 什么结果算通过
  • 哪些歧义需要先确认

所以本书把这类信息收敛到 current_task.md 里。
它的作用就是把“当前这一轮要做什么”固定下来。


2. 为什么要先有一个主任务?

current_task.md 最重要的原则,是单一主任务原则

“完成项目修复”“继续开发项目”这种说法,只能算长期方向。
真正的一轮任务,还必须具体到一件可做、可验收的事。

比如:

  • 只修一个函数
  • 只补一处测试
  • 只修一个接口返回
  • 只更新一个问题记录

为什么要这样做?

因为如果一轮任务太散,AI 很容易把很多相关事情一起做掉。
看起来像“顺手优化”,实际上可能会:

  • 扩大修改范围
  • 混淆任务目标
  • 把局部动作变成全局改动

所以,一轮任务最好只有一个主目标,其他事情如果重要,就写进 open_issues.md 或后续任务,而不是塞进当前轮里。


3. current_task.md 应该写什么?

一份可执行的 current_task.md,最少要包含这些部分:

  • 任务是什么
  • 目标是什么
  • 允许做什么
  • 禁止做什么
  • 验收条件是什么
  • 哪些不确定性需要保留

可以先把它理解成这样:

# Current Task

## Task
Fix the empty-cart checkout path in `checkout/service.py`.

## Goal
Return a safe error when the cart is empty,
while preserving normal checkout behavior.

## Allowed
- `checkout/service.py`
- `tests/test_checkout.py`
- `revision_log.md`
- `open_issues.md`

## Forbidden
- `auth/*`
- `payment_gateway/*`
- `docs/*`
- unrelated modules

## Constraint
- preserve normal checkout
- keep changed files within allowlist

## Acceptance
1. Empty-cart checkout is handled safely.
2. Normal checkout still passes.
3. Only allowed files changed.
4. Unresolved compatibility concerns are recorded.

这份任务契约的重点,不在于格式多漂亮,
而在于它把模糊请求变成了可检查的动作范围。

6. 从自然语言到任务契约

这一章很重要的一点,是把自然语言输入“编译”成任务契约。

比如人说:

“把这个 Bug 修一下,顺便保证不影响其他模块。”

这句话本身并不适合直接执行。
因为它包含了两个问题:

  • “修一下”不够具体
  • “不影响其他模块”可能会诱导越界修改

所以系统不能直接照着做,
而要把它编译成一份结构化任务:

  • 目标:修复空购物车结算
  • 允许:checkout/service.py、tests/test_checkout.py
  • 禁止:auth/、payment_gateway/、docs/*
  • 一致性问题:记录,不执行
  • 验收:只检查结算路径和回归测试

这样,AI 就不会把“顺便保证不影响其他模块”理解成“可以把别的模块也一起改”。

7. 为什么 current_task.md 是人和 AI 共同签署的?

current_task.md 不是单方面命令,
它更像是一份双向契约。

人的作用

人负责:

  • 定义方向
  • 确认范围
  • 决定哪些歧义不能直接执行
  • 判断是否要扩张任务

AI 的作用

AI 负责:

  • 理解当前任务
  • 在允许范围内推进
  • 把发现的问题写入候选状态
  • 在不越界的前提下完成修改

所以当任务目标变化时,正确做法不是让 AI 在原任务里硬改,
而是先结束或暂停当前转移,再创建新的任务契约。

这能避免系统一边跑一边换目标,最后变成失控扩散。

8. 冲突怎么处理?

任务里经常会出现冲突。
本书把冲突处理分成优先级:

  • 系统与安全边界
  • 当前任务的明确禁止项
  • 当前任务的目标与验收
  • 补充偏好和软性措辞

这个顺序很重要。
因为很多问题不是“怎么改得更好”,
而是“能不能改”。

例子

如果当前任务要求只改结算逻辑,
那“顺便统一认证模块”的建议就不能直接执行。
它可能是合理的后续工作,
但不是当前轮的授权范围。

所以 current_task.md 的作用之一,就是把这些优先级固定下来,避免模型把软性建议当成硬性命令。

9. 任务编译器做什么?

如果把任务契约生成过程抽象出来,可以把它看成一个任务编译器。

它接收:

  • 用户输入
  • 项目状态
  • 当前阶段

输出:

  • 结构化任务契约

这个过程通常可以拆成六步:

  • 提取目标对象
  • 识别目标变化
  • 计算最小必要动作
  • 继承长期不变量
  • 生成验收条件
  • 标记需要确认的歧义

这样,任务就不是“看起来差不多”,
而是变成了一个可以执行、可以验证、可以回写的结构。

10. 为什么验收条件要写得可观察?

如果验收条件还是“尽量写好一点”“提高质量”“写得更专业”,那系统其实没法判断到底算不算完成。

所以验收最好是可观察的:

  • 修改范围是否正确
  • 行为是否恢复正常
  • 是否保留了必要的限制说明
  • 是否记录了未决问题

比如:

  • “空购物车返回安全错误”
  • “正常结算路径不受影响”
  • “只改允许文件”
  • “不新增无关修改”

这类条件可以检查,
而“写得更好”不行。

11. 三类任务契约

不同类型的任务,契约内容也不完全一样。
本书里可以粗略分成三类:

11.1 代码修复

关注:

  • 可复现故障
  • 修改范围
  • 回归测试
  • diff 是否越界

11.2 程序整理

关注:

  • 目录结构
  • 入口文件
  • 依赖关系
  • 状态文件更新

11.3 资料研究

关注:

  • 研究问题
  • 来源范围
  • 时间窗口
  • 不确定性记录

它们的格式可以统一,
但字段的重点不同。

12. 本章小结

这一章想讲清楚的核心是:

current_task.md 的作用,是把自然语言要求变成一份可执行、可验收、可回写的任务契约。

它让 AI 知道:

  • 这一轮到底做什么
  • 哪些地方能动
  • 哪些地方不能碰
  • 什么结果算通过
  • 哪些歧义要留下来

有了它,AI 才不会每轮都重新猜任务,
而是能在一个明确边界里推进。

下一章,我会继续讲:修改日志 revision_log.md 为什么能帮系统收敛,以及它和 Git 的分工到底是什么。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值