PEV 循环
围绕一个持久目标运行无状态规划器-执行器-验证器循环。将主智能体保持为薄控制器:维护规范状态、分派隔离角色、强制执行限制并报告结果,而不规划、实施或评估产品本身。
不可协商的保证
- 要求显式调用
$pev。将此次调用视为创建或重用匹配本地目标以及分派 P、E 和 V 子智能体的授权。 - 让控制器远离产品工作。不得在主上下文中检查源文件主体、实施更改、解释原始测试日志或决定标准满足情况。
- 使用全新上下文创建每个 P、E 和 V 智能体。使用
fork_turns="none"或运行时的最强等效项。 - 绝不让智能体评估自己的工作。
- 对验证器隐藏规划器和执行器的推理、摘要和预期结果。
- 仅允许验证器证据更改标准的满足状态。
- 将所有运行状态存储在一个唯一命名的操作系统临时目录中。绝不要在仓库、工作区、主目录或技能目录下创建运行状态。
- 运行结束时保留确切的临时目录。不要将其中内容暂存、提交、推送、发布或复制到持久的项目文件中。
- 将 PEV 机制排除在产品标准之外。通过控制器的机械审计强制执行迭代限制、模型路由、角色隔离和仅临时状态。
- 不要仅仅为了获得通过而删除、跳过、削弱或重写现有测试。仅当用户目标要求时才允许合理的测试更改,然后让验证器对其进行仔细审查。
- 绝不要绕过最终的全标准验证。
解析调用
接受 $pev 之后的目标以及这些可选控制参数:
max=N或--max N:允许1..10;默认为6。using=$skill-name:在相关每个角色中独立加载指定技能。在标准中将其要求包含在内,要求执行器遵循它,并要求验证器独立评估它。
如果调用省略了目标,则读取活动的本地目标。如果两者都不存在,则询问目标并停止。
当本地目标工具可用时:
- 在创建目标之前读取当前目标。
- 仅当活动目标与请求的目标匹配时才重用。
- 当没有目标时创建一个。除非用户显式提供,否则不设置代币预算。
- 如果存在不同的未完成目标,则停止并要求用户解决它,而不是替换它。
当本地目标工具不可用时,作为有界 PEV 运行继续,并说明自动延续不可用。
引导临时状态
运行:
python3 <skill-directory>/scripts/init_run.py --max-iterations <N>
在线程中记录返回的绝对 run_dir 并将其显式传递给每个子智能体。在首次分派之前阅读 references/contracts.md。
使用准确的目标和约束填充 goal.json。分派一个全新的规范规划器来创建不可更改的完成定义。要求每个标准项:
- 从未满足状态开始;
- 描述可观察的结果而非活动;
- 命名可接受的证据;
- 保留用户和仓库约束;并且
- 可独立验证。
将内部 PEV 机制(如迭代计数、智能体选择、上下文隔离、临时路径和控制器簿记)排除在产品标准之外。当它们约束请求的结果时,保留用户可见的工作区不变性,例如“不要提交”、“不要推送”或“不要修改测试”。
在控制器的机械模式门控之后冻结 rubric.json。仅将可变满足状态和证据存储在 progress.json 中。
控制器拥有每个状态文件。P、E 和 V 智能体必须返回紧凑的 JSON 响应,并且不得修改临时状态。
运行循环
对于从 1 到 max_iterations 的每次迭代,按顺序执行以下阶段。
1. 分派全新的规划器
启动一个全新的只读 Sol 规划器。只给它:
- 工作区路径;
goal.json、rubric.json和progress.json;- 之前的验证器裁决(如果存在);
- 迭代编号和剩余预算;以及
- 显式请求的
using=技能。
允许规划器检查产品和仓库说明。不要给它之前的规划器或执行器推理。
要求一个与合同匹配的有界 task_packet。仅当没有有用的工作单元剩余时才允许 DONE_CANDIDATE;绝不要将其视为完成的证明。
机械地拒绝以下计划:
- 未解决任何未满足的标准项;
- 省略了范围、约束或验证目标;
- 重复失败的工作单元而没有回应验证器证据;
- 请求测试削弱或未经授权的破坏性操作;或
- 无法适应一个执行器分配。
对于高风险的安全、迁移、权限、财务或不可逆工作,在执行前插入一个全新的只读计划审查员。给它目标、标准和任务包,但不给规划器推理。
在接受任务包后写入 plan.json,然后再分派执行器。不要将控制器状态更新推迟到验证之后。
2. 分派全新的执行器
启动一个全新的 Sol 工作进程,只拥有任务包文件的所属权和责任。告知它代码库中可能存在其他工作,并且它必须保留不相关的更改。
给它:
- 确切的任务包;
- 工作区路径和适用的仓库说明;
- 避免范围漂移所需的原始约束;以及
- 显式请求的
using=技能。
不要给它验证器权限。要求它实施一个有意义的工作单元,运行相应的检查,并仅返回执行器收据。不要让它更新标准或临时状态。
防止验证和构建命令在目标工作区中留下意外的缓存、日志、覆盖率输出或其他非产品工件。当支持时,将可丢弃的输出路由到独立创建的操作系统临时位置。否则,仅删除由该分配创建的、来源确定的确切可丢弃工件;绝不要删除预先存在的或模糊的路径。
当运行时支持模型覆盖时,按如下方式路由推理努力:
- 机械的、范围狭窄的执行:
gpt-5.6-sol配合低; - 普通实施:
gpt-5.6-sol配合中; - 交叉或高风险实施:
gpt-5.6-sol配合高。
除非目标显式请求这些操作,否则不要提交或推送。
3. 分派全新的盲验证器
启动一个全新的只读 Sol 验证器,使用 高 推理;对于关键安全、迁移、权限或不可逆工作,使用 极高。
只给它:
- 准确原始目标和冻结的标准;
- 工作区或已产生的工件;
- 适用的仓库说明;
- 用户强制要求的验证命令;以及
- 显式请求的
using=技能。
不要给它控制器运行目录、任务包、规划器输出、执行器收据、实施摘要、预期结果、先前裁决理由或 P/E 对话历史。如果验证器的工具需要可丢弃的输出,则为其提供一个单独的操作系统临时暂存目录。
要求验证器独立检查当前产品,运行相关检查,检查测试更改以防范奖励黑客攻击,并返回裁决合同。验证器不得修改产品、测试、运行状态或外部系统。
4. 更新规范状态
让控制器验证响应形状,将完整响应写入迭代的裁决文件,并在任何下一次分派之前将验证器支持的状态和证据复制到 progress.json 中。不要将弱证据重新解释为通过。
- 在
NEEDS_WORK上,使用新的规划器开始下一次迭代。 - 在
PASS上,分派一个额外的全新最终验证器,不带先前的满足状态。要求它从头评估每个标准项。 - 在最终
PASS上,运行控制器的机械审计,检查角色隔离、迭代计数、仅临时状态和授权边界。仅当两个门控都通过时,才将本地目标标记为完成。 - 在最终失败时,如果还有迭代剩余,则继续。
停止条件
仅在新最终验证器证明每个标准项后成功停止。
将产品验证和编排完整性视为单独的门控:
- 产品门控: 一个新的盲最终验证器证明冻结的标准。
- 控制器门控: 机器可检查的记录证明迭代限制、全新角色分派、仅临时状态以及没有未经授权的提交、推送、发布、部署或破坏性操作。
不要将控制器簿记失败发送回产品验证器或将其转化为产品标准项。在可能时立即修复安全的簿记;否则报告控制器门控失败而不声称完成。
在迭代限制处:
- 不要声称成功;
- 不要仅仅因为达到限制而将目标标记为完成或阻塞;
- 报告已满足的项、剩余项、决定性证据和确切的临时路径;以及
- 保持目标活动以进行显式延续。
仅当运行时的重复阻塞器阈值真正满足时,才将目标标记为阻塞。当授权、重大产品决策、缺少凭据或不可用的外部依赖项阻止安全进展时,暂停等待用户输入。
恢复
如果临时目录消失,则创建一个新目录,并根据活动线程目标和对话重建目标及其冻结的标准。将所有先前的满足视为未证明,然后在继续之前运行全新的完整验证器。
如果子智能体失败:
- 使用相同的隔离边界重试关键 P、E 或 V 角色一次;
- 绝不要用控制器判断替换缺失的验证器裁决;
- 通过新的规划器缩小过大的工作单元;
- 保留不相关的工作区更改;以及
- 当迭代限制阻止恢复时,诚实地报告差距。
最终质量门控
在返回成功之前,确认:
- 主智能体仅充当控制器;
- 每个角色使用全新的隔离上下文;
- 没有智能体评估自己的输出;
- 验证器未看到 P/E 推理或预期结果;
- 每个标准项都有来自最终验证器的当前、直接证据;
- 现有测试未被削弱以制造成功;
- 由工作流创建的意外命令工件未保留在目标工作区中;
- 运行状态仅存在于记录的操作系统临时目录下;
- 没有运行状态被提交或复制到项目中;以及
- 仅在最终
PASS之后,本地目标(如果可用)才被标记为完成。