模型的停止提议须经验证才成为完成。
对于可交付的停止,模型即使请求停止,仍要经过完成验证。结果分为完成、在预算内继续、等待审查;执行上限、取消和错误以单独的停止状态结束。
验证 → 完成
只有可交付的停止会经过 PreVerify → 判断 → PostVerify → Stop。模型的停止提议与 hook 指令本身都不等于完成。
arun · 模型轮次
loop/agent_loop.py数据: 停止提议可交付的停止 · natural 等loop/_guards.py · models.py模型不调用工具、直接以文本作答时,该轮次成为 natural 停止候选(在最后允许的回合为 forced_text)。模型的停止提议尚不等于完成。
可交付的停止 · natural 等
loop/_guards.py · models.py数据: 完成候选finalize_and_return_asyncloop/_lifecycle.py只有 natural、forced_text、actionable_partial 是可交付的停止,也只有它们进入公开验证。
finalize_and_return_async
loop/_lifecycle.py执行 · 判定: PreVerifyPreVerify · STRENGTHENcore/hooks/public.pyPreVerify hook 通过 STRENGTHEN 只能增加要求与缺失代码。它只能让判定更严格,不能使其通过。
finalize_and_return_async
loop/_lifecycle.py执行 · 判定: verify_turn_async结构检查 · empty_turncore/agent/verify.py先进行结构检查(空轮次、model_action_required);无法修复的结构失败会跳过语义判断。off、rule_based 等旧设置会解析为 llm_judge,无法关闭判定。
语义判断 · LLM 或 Jev
core/agent/verify.py数据: 判断请求评判模型所选评判模型(默认 LLM judge,选用时为 Jev Choice)在不带工具的情况下调用一次,最长 120 秒,且不超过剩余的时间预算。可能带有个人观测信息的候选不会发送给辅助评判模型。
语义判断 · LLM 或 Jev
core/agent/verify.py数据: passed · rubric_missespolicy_action · 解读判定loop/_lifecycle.py判定包含是否通过、缺失代码、供下一次尝试使用的反思,以及重试是否有用。语义判断通过不能掩盖结构检查的失败。
policy_action · 解读判定
loop/_lifecycle.py执行 · 判定: PostVerify 决策PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyPostVerify hook 决定 ACCEPT、REVISE 或 ESCALATE。对验证失败的候选给出 ACCEPT,会改为 escalate。没有决策时采用运行时默认值(通过 → accept,可重试 → revise,其余 → escalate)。
policy_action · 解读判定
loop/_lifecycle.py执行 · 判定: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py只有在不 escalate 时,Stop hook 的 CONTINUE 指令才能请求续接修复。hook 指令是下一次尝试的输入,而非权限。
policy_action · 解读判定
loop/_lifecycle.py数据: completed · 已保存检查点 · 会话状态memory · observability通过并 accept 后,合并续接的尝试,保存结果,并将会话记为 completed。
finalize_and_return_async
loop/_lifecycle.py数据: 响应IPC · CLI 调用方完成时返回最终答复;等待审查时返回空答复与 EXTERNAL_VERIFICATION_REQUIRED;不经验证的停止则返回停止原因。
预算内修复
可修复的失败会继续同一请求。默认预算为 2 次尝试;用尽后,候选进入等待审查。
语义判断 · LLM 或 Jev
core/agent/verify.py数据: passed · rubric_missespolicy_action · 解读判定loop/_lifecycle.py判定包含是否通过、缺失代码、供下一次尝试使用的反思,以及重试是否有用。语义判断通过不能掩盖结构检查的失败。
policy_action · 解读判定
loop/_lifecycle.py执行 · 判定: PostVerify 决策PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyPostVerify hook 决定 ACCEPT、REVISE 或 ESCALATE。对验证失败的候选给出 ACCEPT,会改为 escalate。没有决策时采用运行时默认值(通过 → accept,可重试 → revise,其余 → escalate)。
policy_action · 解读判定
loop/_lifecycle.py执行 · 判定: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py只有在不 escalate 时,Stop hook 的 CONTINUE 指令才能请求续接修复。hook 指令是下一次尝试的输入,而非权限。
续接预算 · 默认 2 次
loop/_lifecycle.py执行 · 判定: 修复 · 尝试 +1_arun_once · 续接修复loop/agent_loop.py只有存在修复指令,且本次尝试编号小于预算(默认 2 次)时,才会继续同一请求。达到预算即成为 escalate_budget_exhausted,进入等待审查。
等待审查
判定无法使用、试图将失败改为通过,或预算耗尽时,扣留候选并暂停会话。
verification_error · 失败即关闭
core/agent/verify.py失败 · 无判定: verification_errorpolicy_action · 解读判定loop/_lifecycle.py评判模型缺失、超时或响应无效时,记为 verification_error:既不算通过,也不是修复信号。无法使用的判定从不代替成功。
policy_action · 解读判定
loop/_lifecycle.py执行 · 判定: PostVerify 决策PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyPostVerify hook 决定 ACCEPT、REVISE 或 ESCALATE。对验证失败的候选给出 ACCEPT,会改为 escalate。没有决策时采用运行时默认值(通过 → accept,可重试 → revise,其余 → escalate)。
policy_action · 解读判定
loop/_lifecycle.py执行 · 判定: ESCALATE · pending外部审查者候选保留为 pending_text,不出现在普通响应中;保存检查点并暂停会话。不会自动联系外部审查者。
policy_action · 解读判定
loop/_lifecycle.py记录 · 观测: 判定 · 证据行timeline · ledger 判定行memory · observabilitytimeline 写入决策、证据与 pending 行,evidence ledger 写入 verification_policy 行。这些是尽力而为的记录,不能证明外部效果。
不经验证的停止
取消、上限和基础设施类停止,以及 control workflow 运行,不经公开验证直接保存。
arun · 模型轮次
loop/agent_loop.py执行 · 判定: 守卫 · 上限失败 · 上限 · 取消停止loop/_guards.py · models.py回合、时间、成本与上下文上限,取消,重复失败检测等守卫,以封闭的 TerminationReason 集合中的一项结束轮次。配置中关闭的上限不一定会被强制执行。
失败 · 上限 · 取消停止
loop/_guards.py · models.py失败 · 无判定: 失败 · 取消停止finalize_and_return_asyncloop/_lifecycle.py取消、基础设施和上限类停止没有可验证的候选,因此不经公开验证直接保存。
control workflow · 跳过公开验证
ipc_server/poller.py执行 · 判定: 跳过公开验证finalize_and_return_asyncloop/_lifecycle.py当 IPC 调用要求跳过公开验证,或有进行中的 control workflow 时,仅在该次运行期间关闭公开验证,结束后恢复原值。
finalize_and_return_async
loop/_lifecycle.py数据: 仅保存 · 不验证检查点 · 会话状态memory · observability不经验证的停止仍会保存结果与检查点,并发出会话结束事件。
finalize_and_return_async
loop/_lifecycle.py数据: 响应IPC · CLI 调用方完成时返回最终答复;等待审查时返回空答复与 EXTERNAL_VERIFICATION_REQUIRED;不经验证的停止则返回停止原因。
所有连接以相同粗细显示。选择一个流程,即只突出显示其路径,并标出步骤编号。
- 实线 · 请求、候选与结果的流向
- 虚线 · 执行、判定、授权、配置
- 长点划线 · 记录与观测,与判定分离
- 短虚线 · 失败或无法使用的判定
- 粗黑线 · 所选流程;数字表示顺序
- 方框 · 代码或记录的边界,顶部标注路径
- 内层小框 · 该边界内的组件
- 虚线框 · 该边界之外
- 循环 · 收尾
- 停止 · hook · 判定
- 保存 · 记录
- IPC 入口
只画出固定提交 9e2c041 中的调用路径。评判模型的通过与外部基准测试验证器的成功是两回事;这里的完成是运行时内部的决策。
- 评判引擎
- 默认使用 LLM judge;只有 judgment_engine 设为 jev 时才由 Jev Choice 评判。无论哪种,评判不可用时都给出 verification_error,绝不算成功。
- hook 能做什么
- PreVerify 只能让判定更严格,PostVerify 不能让失败的候选通过,Stop 只有在不 escalate 时才能请求续接。
- 等待审查
- 等待审查记录的是需要外部决定这一状态。它不会通知任何人,也不表示结果已获批准。