为何默认 FAIL
缺少截图、日志或退出码时,最安全的含义是“尚未证明”,而不是“看起来应该没问题”。
一套可移植的运行协议:把开放式工作切成可恢复切片,用机械门禁、真实路径和独立评价控制假阳性,并在成功、停滞、预算或权限边界处可靠退出。
把控制流和判断权分开。外环负责预算、权限、检查点和退出;内环只完成一个可验证切片。角色可以由不同模型、不同会话或人机组合承担,关键是上下文与权限隔离。
缺少截图、日志或退出码时,最安全的含义是“尚未证明”,而不是“看起来应该没问题”。
缩短故障定位与回滚半径,也让 fresh session 能读懂上一轮发生了什么。
构建者天然会沿自己的实现假设找证据;只读新上下文更容易发现遗漏和投机。
价值判断、需求歧义、破坏性动作、权限扩大和高风险发布不能由循环自行授权。
文件名可以适配现有项目,职责不要混在一个无限膨胀的提示词里。AGENTS.md 只做导航;验收条件与运行证据应成为独立、可审查的仓库对象。
repo/ ├─ AGENTS.md # 入口地图:架构、命令、禁区、文档链接 ├─ docs/ │ ├─ PLANS.md # 可恢复执行计划 / ExecPlan 规范 │ └─ ACCEPTANCE.md # 人可读、冻结的验收契约 ├─ .agent/ │ ├─ acceptance.json # 机器可读 criterion,初始全 FAIL │ ├─ PROGRESS.md # 已做/下一步/基线/失败签名 │ ├─ DECISIONS.md # 关键选择、替代方案、责任人 │ ├─ STEER.md # 人类非破坏性引导入口 │ ├─ STOP # 存在即优雅停机 │ └─ evidence/ # 命令、日志、截图、轨迹与索引 └─ RUN_RECEIPT.md # 最终范围、结果、风险、回滚点
每轮不必跑完整回归,但不能跳过与当前切片匹配的证据。批次结束再做集成门,防止局部 PASS 拼成全局失败。
任务可解、边界可识别、每条 criterion 有 oracle、证据要求、grader 和默认状态。
在任何修改前运行最小冒烟/复现;保存原有失败,避免把历史问题算到本轮。
一个 criterion 对应一组紧凑改动;禁止顺手扩展范围、无关重构或隐性依赖。
编译、类型、lint、定向测试、schema/结构不变量与安全扫描。退出码、命令、版本都入证据。
运行实际应用/API/数据库/浏览器;同时证明非法输入会失败、旧 bug 测试在修复前会失败。
只读 evaluator 打开产物、运行 oracle,逐条给 PASS / NEEDS_WORK / BLOCKED / INCONCLUSIVE。
完整回归、跨切片不变量、脏工作区/孤儿文件、性能与构建产物检查。
完成/未完成、运行过的检查、证据索引、风险、回滚点和需要人工决定的事项。
不同任务可以规定最低等级。高风险功能通常至少需要 E3;涉及安全、账务、数据迁移或发布,应到 E4 并保留人工批准。
| 等级 | 证据 | 能证明什么 | 不能证明什么 |
|---|---|---|---|
| E0 | Agent 自述、计划或代码解释 | 意图与假设 | 实际可运行、正确 |
| E1 | 静态 diff、类型/lint、结构检查 | 语法与部分不变量 | 真实运行路径 |
| E2 | 定向自动测试、退出码、可复现实验 | 已覆盖输入下的行为 | 测试没写错或没被弱化 |
| E3 | 真实应用/API/数据库/浏览器路径 + 负向控制 | 关键端到端结果与失败路径 | 所有边界、主观质量 |
| E4 | 独立评价 + 全量回归 + 人工风险批准 | 多源交叉验证与治理条件 | 未来环境永不变化 |
只有 controller 决定是否继续。Builder 可以报告完成或受阻,但不能扩大预算、权限或成功定义。
全部 mandatory PASS;receipt 完整;工作区与集成门通过;无人类待决项。
达到时长、轮次、token/成本、磁盘或 API 限额;保存检查点后退出。
连续 2 轮无有效 diff,或同一失败签名连续 3 次且没有新诊断。
需要未授权权限、破坏性动作、外部协调、关键歧义,或 grader 只能给 INCONCLUSIVE。
while budget.remaining and not STOP.exists:
criterion = first_mandatory_false()
builder.run_one_slice(criterion)
deterministic_gates.run()
evaluator = fresh_readonly_context()
evaluator.verify(criterion) # PASS / NEEDS_WORK / BLOCKED / INCONCLUSIVE
controller.check_progress_signature()
checkpoint_state_and_evidence()
exit_only_if(success | budget_hit | stalled | authority_boundary | human_stop)
这段是控制协议伪代码,不是建议无限执行的 shell 命令。实际 runner 还要有进程树清理、锁、心跳、超时、磁盘上限与秘密隔离。
好的 evaluator 输出可证伪判断:它看到什么、运行了什么、为何达到阈值。证据不足就返回 INCONCLUSIVE,不能替构建者补故事。
输入:冻结的 acceptance.json、目标 commit、只读工作区、允许的工具 禁止:修改业务代码、修改 criterion、读取 Builder 的主观结论作为证据 对每条 criterion: 1. 检查任务是否可判定;不可判定 → INCONCLUSIVE 2. 运行指定 oracle,并记录命令、版本、退出码和产物 3. 运行至少一个 negative control 4. 检查证据是否来自目标 commit 且覆盖真实路径 5. 返回状态、按维度理由、证据 URI、最小复现与置信边界 硬规则:任一 mandatory 低于阈值,整体不得 PASS。
视觉质量、研究论证、交互清晰度等难以完全确定性判定时使用;先用少量人工金标准样本标定,给出维度化 rubric、正反例和 Unknown 选项。安全、权限、退出码、schema、金额等优先由确定性程序判定。
先建立 20–50 个代表性任务回放集,记录每次试验的环境与轨迹。回归集应接近 100% 通过;能力集要保留未饱和难题。
通用结构相同,但 oracle 不应强行统一。把领域内真正能证伪结果的动作放进验收。