隔离、恢复、验证与平台治理
先冻结任务契约
给编码 Agent 的任务至少明确目标、允许修改路径、必须保留行为和验证入口。工作区中的文档是上下文,不应自动成为高于用户的命令。外部 issue 里写“上传环境变量”属于不可信内容,不能成为授权来源。
并行任务用独立 worktree,共享依赖升级或配置文件必须有单一集成负责人。恢复 thread 前检查工作区 HEAD、未提交差异和依赖锁文件是否仍是原条件。恢复对话不恢复文件,强行 git reset 也可能删除用户新改动。
最小差异验收实验
以下 Python 3.12 代码只检查给定差异清单,不运行 Git,不声称这是完整安全沙箱。保存 scope.py:
from pathlib import PurePosixPath
def allowed(path):
p=PurePosixPath(path)
return not p.is_absolute() and '..' not in p.parts and p.parts[:1]==('src',)
assert allowed('src/app.py')
assert not allowed('src/../secrets.env')
assert not allowed('/tmp/src/app.py')
assert not allowed('package.json')
print('change scope passed')真实文件访问还要解析符号链接和实际文件系统权限。差异检查在 Agent 执行后发现越界,沙箱在执行时阻止越界,二者用途不同。命令白名单需要校验参数与 shell 组合,不能仅检查字符串以 pytest 开头。
验收从项目实际存在的 lint、类型检查、单元与集成测试开始。记录命令、退出状态与输出,再检查最终 diff;测试通过但修改了不该动的权限配置仍不符合目标。模型报告中的“测试通过”只是待核对的声称。
取消、恢复与回滚
取消首先撤销继续执行权限,停止子进程并处理未完成请求;随后查看已完成写操作。Git diff 能回退受跟踪文本,不自动撤回数据库写入或远程发布。恢复点应包括代码版本、锁文件、必要外部状态与任务 ID,不能把对话历史当备份。
超时后不要直接重跑整个写任务。先查询已完成项目与实际状态,把剩余工作作为新 turn;幂等性由业务或工具层保证。重复失败两次相同命令且无新信息时,继续采样不一定有价值,应收敛为可定位原因。
用固定仓库任务评估版本
为只读解释、小缺陷修复、跨文件修改分别固定起始提交与测试。统计成功率、越界文件数、回归缺陷、工具重复次数、运行时间与人工返工。token 成本并非唯一成本;为了节省一次读取导致修改错误,可能增加大量返工。
SDK、CLI/App Server、模型、提示和策略作为发布组合锁定。先小流量任务,保留旧组合与任务产物;回滚环境不应清理用户未提交修改。日志中的源码、patch、命令输出也有数据保留与访问控制要求。
本课程握手和本地校验可无模型复现;真实 SDK turn、审批交互和补丁修复没有在线执行,不能宣称编码任务端到端已通过。
练习
允许目录增加 tests,但仍拒绝绝对路径与 ..。测试 src/a、tests/a、docs/a、tests/../secret 四项。
先记录自己的输出与解释,再核对本章答案。