1. 范围与比较口径
一个系统只有在保存目标状态,并能在普通 agent turn 结束后根据该状态决定是否自动开始下一轮时,本文才把它记为“原生 Goal”。Todo、Plan、Task、Cron 可以参与 Goal,但单独存在时不等于 Goal。
比较对象 OpenProgram、Codex、Claude Code、Hermes Agent;OpenCode 与 OpenClaw 作为相邻实现;OpenAI Agents SDK、LangGraph、AutoGen、CrewAI 作为通用框架基线。
固定观察维度 入口、状态结构、循环触发、完成判定、预算、等待、人工介入、持久化、恢复、并发控制、事件与 UI。
证据优先级 公开源码与本仓库源码优先;官方运行文档用于闭源实现;产品表象只用于说明接口,不用于推断内部数据结构。
Claude Code 的实现源码不公开。本文对它只记录官方文档明确给出的控制合同:/goal 是 session-scoped prompt Stop hook、判定器输入、三种 verdict、恢复和后台任务等待规则;不推断它的数据库表或内部类名。
兼容 Python Workflow 的控制流程
本节描述保留的 Python goal() Workflow;普通聊天使用页首的聊天 Goal 合同,不经过以下 refine/work/judge 循环。
四个原生实现都包含“工作完成后决定是否再开一轮”,差别集中在状态由谁保存、完成由谁判断,以及等待是否会暂停执行。
一个 Goal 从输入到终止的最小闭环 实线是当前工作路径;虚线表示未完成或外部条件变化后的再次执行。
工作 判定 等待 停止
OpenProgram Goal 控制流程
由 Archify 生成的工作流图。
01 / Web / TUI
02 / Goal Controller
03 / Agent Roles
04 / Evidence & State
EX / Wait / Stop
定义与恢复
执行与判定
继续或终止
Goal 输入 · 创建 / 编辑 / 继续 · Web / TUI › 定义与恢复
Goal 输入
创建 / 编辑 / 继续
持久化状态 · goal_id · version · checkpoint · Goal Controller › 定义与恢复
持久化状态
goal_id · version · checkpoint
原子状态转移 · CAS version + event · Goal Controller › 继续或终止
原子状态转移
CAS version + event
Working Agent · 调用工具并推进任务 · Agent Roles › 执行与判定
Working Agent
调用工具并推进任务
确定性 Gate · 命令 · 文件 · 计数 · 权限 · Agent Roles › 执行与判定
确定性 Gate
命令 · 文件 · 计数 · 权限
Judge Agent · 只读检查与语义判定 · Agent Roles › 继续或终止
Judge Agent
只读检查与语义判定
证据与用量 · 结果 · 文件 · token · 时间 · Evidence & State › 执行与判定
证据与用量
结果 · 文件 · token · 时间
异步问题队列 · 累计 · 去重 · 稍后回答 · Wait / Stop › 执行与判定
异步问题队列
累计 · 去重 · 稍后回答
等待边界 · 无独立工作 / 外部事件 · Wait / Stop › 执行与判定
等待边界
无独立工作 / 外部事件
停止并保留证据 · blocked · stalled · failed · Wait / Stop › 继续或终止
停止并保留证据
blocked · stalled · failed
unmet → next round
terminal verdict
可验证条件
gate result
create / edit / resume
typed verdict
needs_user
waiting_external
无独立工作
可继续 → 独立工作
lease + checkpoint
结果 + 工具证据
图例
用户界面
Agent 逻辑
策略
工具操作
上下文 / 追踪
外部系统
判断一套 Goal 是否完整,主要看黄色等待分支能否真正暂停、红色停止分支能否区分原因,以及控制状态能否跨 turn 和进程恢复。只实现中间的工作—判定循环还不够。
五类实现模型
层级
输入
进度
终止
跨 turn
代表系统
Task input
用户消息 作为本轮任务
无要求
模型停止
否
普通 agent turn
Progress ledger
任务 + items
Todo / Task 供提示和 UI 使用
不参与总体终止
不自动续轮
OpenCode Todo
Graph termination
graph state
应用自定义
edge / condition
由应用实现
LangGraph · AutoGen
持久化控制器
objective
usage / status
agent 声明
idle 时自动续轮
Codex
Evaluator loop
Goal spec
evidence
独立 evaluator
未完成则续轮
OpenProgram · Claude · Hermes
D 与 E 可以组合。Codex把完成声明交给工作 agent 自身,但控制面负责生命周期和预算;另外三个实现把完成判定交给独立 evaluator。
四种原生 Goal 架构放在同一张图里
每一行都是一个完整实现。横向阅读可以直接看到它们把状态、工作、判定和续轮分别放在哪里。
原生 Goal 的状态所有权和判定路径 青色表示独立判定器,蓝色表示工作 agent,黄色表示等待或受限状态。
四种原生 Goal 的控制结构
由 Archify 生成的工作流图。
01 / OpenProgram
02 / Codex
03 / Claude Code
04 / Hermes Agent
状态所有权
工作与判定
续轮与等待
Versioned Goal snapshot · goal/run ID · CAS · OpenProgram › 状态所有权
版本化 Goal 快照
goal/run ID · CAS
Working Agent → Judge · 独立且可只读检查 · OpenProgram › 工作与判定
Working Agent → Judge
独立且可只读检查
Controller / Wait · 异步问题 · 重启恢复 · OpenProgram › 续轮与等待
Controller / Wait
异步问题 · 重启恢复
SQLite ThreadGoal · typed status · usage · Codex › 状态所有权
SQLite ThreadGoal
typed status · usage
Working Agent 自报 · update_goal · Codex › 工作与判定
Working Agent 自报
update_goal
Idle Controller · pause · resume · limits · Codex › 续轮与等待
Idle Controller
pause · resume · limits
Session Goal Prompt · resume 保留 · Claude Code › 状态所有权
Session Goal Prompt
resume 保留
Stop Hook Evaluator · 小模型 · 无工具 · Claude Code › 工作与判定
Stop Hook Evaluator
小模型 · 无工具
阻止停止或清除 · 后台任务 defer · Claude Code › 续轮与等待
阻止停止或清除
后台任务 defer
GoalState + Contract · gates · waits · Hermes Agent › 状态所有权
GoalState + Contract
gates · waits
Gate → Judge · 机械检查优先 · Hermes Agent › 工作与判定
Gate → Judge
机械检查优先
Queue / Wait Barrier · 事件唤醒 · Hermes Agent › 续轮与等待
Queue / Wait Barrier
事件唤醒
three verdicts
on Stop
self-report
run turn
done / blocked / wait
turn result
verdict
work + evidence
图例
Agent 逻辑
策略
工具操作
上下文 / 追踪
横向实现矩阵
图用于理解控制结构;表保留精确字段和边界,供设计核对。
查看完整横向矩阵
系统 Goal 表示 下一轮触发 完成判定 预算 等待 / 人工介入 持久化与恢复 关键性质
OpenProgram Python Workflow 兼容路径 session extra_meta.goal 版本化快照;含 goal/run ID、spec、checklist、问题队列和 checkpoint goal() controller 在边界提交状态后启动下一次 agent()独立、可使用只读检查工具的 judge;typed verdict 与 can_continue 默认不限制轮数;可设 round/token/active-time/cost 总预算,resume 后累计 问题异步累积;继续独立工作;仅剩依赖答案的工作时进入 waiting_user CAS 写入 session;页面重载保持状态;worker 重启把执行中状态转为 paused_recoverable 完成判定、停止、恢复和 UI 已统一;外部自动唤醒与多 worker lease 尚缺
Codex SQLite ThreadGoal;有 goal_id 和 typed status thread idle 生命周期读取 active Goal 并启动 turn 工作 agent 调 update_goal(complete|blocked) 自报;无独立 judge 可选 token budget;累计 tokens 与 elapsed time pause/resume/usage-limit 由用户或系统控制;blocked 有三轮审计规则 SQLite 持久化;resume 恢复 active controller 控制面和数据模型最完整
Claude Code 每 session 一个 completion condition prompt-based Stop hook 阻止停止并把 reason 作为下一轮指导 small fast model:not met / met / impossible;无工具 Goal 自身无结构化预算;条件可写停止条款;外层另有 max turns / USD 后台任务在运行时延后判定;idle check-in 退避且有限次 resume 恢复 active condition,但重置轮次、计时和 token 基线 复用通用 Hook 协议,表面最小
Hermes Agent GoalState + contract + subgoals + gates + wait barrierCLI/gateway 在 turn 后排入普通 user-role continuation 先执行 deterministic gates,再由 auxiliary judge 判定 done/blocked/continue/wait 默认 20 个 Goal turn;gate 各自 timeout/retry 可等待 PID、process session 或时长;用户消息优先 SessionDB.state_meta;resume 与 compression session migration完成合同、确定性 gate 与 async wait 组合最完整
OpenCode 用户 task + SQLite Todo rows 同一 turn 内按 tool-call finish reason 继续 模型停止调用工具即结束;Todo 完成不控制总循环 agent steps 上限;默认无限 question/permission 属于 turn;没有 Goal pause/resume session、message、todo 持久化;没有 active Goal controller 可靠的进度账本,不是 Goal
OpenClaw automation job、heartbeat scratch、commitment、background task 分开建模 scheduler、事件或任务完成唤醒 session run 成功/失败、脚本 exit code或模型本轮停止;无开放式 Goal evaluator 按 automation run 的 timeout/tool budget;非 Goal 总预算 天然支持定时等待、事件唤醒、delivery 与退避 调度定义、运行状态与历史持久化;可跨 gateway restart 适合长期调度,不负责开放式目标收敛
任务无法完成时,控制器如何停止
原生 Goal 会在普通 agent turn 结束后自动决定是否继续,因此必须同时处理“暂时没有完成”“缺少外部条件”“目标不可实现”和“持续没有有效进展”。只有轮数上限不能识别这些原因,只能限制最坏情况下的执行长度。
困难任务的状态机 绿色是成功;黄色状态必须停止自动工作并等待明确事件;红色状态需要修改目标、预算或运行环境后才能继续。
判断 暂停 终止
OpenProgram Goal 生命周期
由 Archify 生成的生命周期图。
01 / 主生命周期
02 / 可恢复等待 + 困难任务分类
03 / 终态
Draft · 目标已保存 · 主生命周期
01
Draft
目标已保存
Refining · 形成 spec 与 checklist · 主生命周期
02
Refining
形成 spec 与 checklist
Running · 独立工作继续,问题可累计 · 主生命周期
03
Running
独立工作继续,问题可累计
Evaluating · Gate + Judge · 主生命周期
04
Evaluating
Gate + Judge
Achieved · 证据满足完成合同 · 主生命周期
05
Achieved
证据满足完成合同
Paused · 用户暂停或重启恢复 · 可恢复等待 · recoverable
Paused
用户暂停或重启恢复
recoverable
Waiting User · 仅剩依赖回答的工作 · 可恢复等待 · event
Waiting User
仅剩依赖回答的工作
event
Waiting External · 等待作业或外部状态 · 可恢复等待 · event
Waiting External
等待作业或外部状态
event
Blocked · 缺少权限、依赖或输入 · 困难任务分类 · recoverable
Blocked
缺少权限、依赖或输入
recoverable
Stalled · 连续无有效进展 · 困难任务分类 · recoverable
Stalled
连续无有效进展
recoverable
Budget Exhausted · turn · token · time · cost · 困难任务分类 · recoverable
Budget Exhausted
turn · token · time · cost
recoverable
Impossible · 当前合同内无法满足 · 终态 · terminal
Impossible
当前合同内无法满足
terminal
Failed · 不可恢复执行错误 · 终态 · terminal
Failed
不可恢复执行错误
terminal
Cancelled · 用户明确终止 · 终态 · terminal
Cancelled
用户明确终止
terminal
图例
开始
活动状态
等待
决策
成功终态
失败 / 退出
外部状态
查看各框架的困难任务停止机制
系统 无法完成时的结果 确定性停止机制 是否仍可能长时间循环 主要缺口
OpenProgram Python Workflow 兼容路径 typed verdict 区分 blocked、impossible、waiting_external、needs_user、stalled、budget_exhausted 与 failed 兼容 Workflow 默认不限制轮数;可设 token/active-time/cost 预算;连续 judge 失败 3 次;checklist 停滞 3 次;连续 2 轮没有工具且仍未完成 未设置预算时没有固定轮数上限;当前停滞证据主要是 checklist 增量与工具使用 尚无通用 deterministic gate executor;waiting_external 没有自动事件唤醒
Codex 工作 agent 可声明 blocked;控制面可进入 paused、usage_limited、budget_limited 或 complete 可选 token budget;同一阻塞条件需要连续三轮审计后才能认定 blocked;用户和系统可暂停 会。没有配置 token budget 且 agent 不声明 blocked/complete 时,Goal controller 仍会续轮 完成和阻塞依赖工作 agent 自报,没有独立 evaluator 验证是否真的没有进展
Claude Code evaluator 返回 impossible 时清除 Goal;连续没有工具进展时停止续轮但保留 Goal 通用 Stop hook 连续阻止停止 8 次后强制结束;后台 idle check-in 最多 3 次;外层可设置 max turns 和 USD budget 会。Goal 自身没有结构化硬预算;持续产生工具行为且 evaluator 一直返回 not met 时依赖外层限制 判定器没有工具,无法直接验证文件、测试和外部状态;Goal 预算与 runner 预算分离
Hermes Agent judge 可返回 blocked 或 wait;达到 Goal turn 上限后不再继续 默认最多 20 个 Goal turn;gate 有 timeout/retry;相同 workspace fingerprint 下不会重复执行同一个已失败 gate;等待不消耗工作轮次 不会无限续轮,但可能在 20 轮内重复低价值工作 缺少已确认的 Goal 级 token/cost 总预算;语义 judge 仍可能连续返回 continue
OpenCode 模型停止调用工具后结束当前 turn;Todo 未完成不会自动开始下一轮 可配置 agent steps 上限 单个 turn 可能很长,因为 steps 默认可为无限;但 Todo 不形成跨 turn Goal 循环 没有跨 turn 的 stalled、blocked、budget 和恢复合同
OpenClaw 单次 automation 成功、失败或超时;之后是否再运行由显式 schedule 决定 每次 run 的 timeout/tool budget、调度退避和持久化 run state 不会因“目标未完成”自动无限续轮;Cron 可以按用户配置永久重复 没有开放式 Goal evaluator,不能判断一个长期目标是否已经实现或不可实现
为什么“调用了工具”不是进展
工具调用只能证明 agent 执行了动作,不能证明验收条件更接近满足。停滞检测应比较连续轮次新增的 evidence refs、通过的 deterministic gates、未完成 checklist 项和外部状态变化。相同证据反复出现时,应进入 stalled,而不是重置停滞计数。
等待不能占用工作轮次
问题先进入持久化异步队列;只要还有不依赖答案的安全工作,controller 就继续执行。仅当全部剩余工作依赖答案时才进入 waiting_user。CI、后台进程、时间或外部事件进入 waiting_external;当前需要显式 resume。
结论: 这些实现都不能仅凭语义 evaluator 保证收敛。可靠的控制器需要硬预算、基于证据的停滞检测、明确的 blocked/impossible/waiting 分类,以及只有外部事件才能解除的等待状态。
原生 Goal 实现细节
OpenProgram 一个公开 Workflow 同时承担 Goal 执行、判定循环和 session 状态投影。
原生 Goal · 开源源码
Entry goal(prompt, ...)
State owner session extra_meta.goal
Completion tool-capable judge
Resume checkpoint 保留,新 execution 继续
写 active 先持久化最小 GoalState,允许 status/clear 立即看到
refine 独立 inspection turn 生成 spec 与固定 checklist
work 公开 agent() 执行一个完整工具循环
collect 记录工具使用信号与本轮结果,更新 turns
judge 独立 sub-agent 读取证据,并可用 bash/read/grep 等检查
transition typed verdict、异步问题、预算与停滞检查
repeat 继续独立工作,或写 waiting / achieved / stopped state
数据与判定 入口只有一段 prompt;同一文本交给工作 agent,并由 refinement 生成完成规格与 checklist。 schema v3 快照包含 goal/run ID、revision/version、typed status、预算/用量、checkpoint、问题队列和待消费答案。 session 入口把 refinement 与 judge 作为不推进主线的独立 agent turn;无 session 的 programs run goal 也在当前 runtime 中执行带只读工具约束的独立 refinement/judge turn。 judge 不只阅读工作 agent 的声明,还能检查文件、命令输出和清单项;严格 JSON 解析失败会重试一次,连续 3 轮判定失败进入 failed。
停机与恢复 兼容 Workflow 默认不限制工作轮数,并支持 token、active-time 与 cost 总预算;清单停滞和连续无工具轮次会进入 stalled。 /goal clear 写 cancelled,取消旧 execution;CAS version 防止旧 controller 覆盖新操作。needs_user + can_continue 把问题加入队列并继续独立工作;没有独立工作时才进入真正的 waiting_user。worker 重启时执行中 Goal 进入 paused_recoverable;目标、checklist、用量、问题和 checkpoint 保留,resume 创建新 run。
实现判断:OpenProgram 已具备独立 tool-capable judge、typed states、版本化持久快照、异步问题、硬预算和重启后显式恢复。仍未实现通用 deterministic gate executor、外部事件自动唤醒与独立 evidence repository;同机 multi-worker 由 OS 文件锁提供独占 ownership。
Codex Goal 是 thread 上的持久控制实体;工作 agent 通过工具声明完成或阻塞。
原生 Goal · 开源源码
Entry UI/API + create_goal
State owner SQLite ThreadGoal
Completion Agent 自报工具
Resume idle lifecycle 恢复
create/set 校验 objective 与可选 token budget;一条 thread 仅有一个未完成 Goal
persist 写 goal_id、status、usage 与时间字段
start turn Goal active 且 thread idle 时注入 continuation steering
work 普通 Codex turn 使用现有工具、计划和上下文
account turn 结束按基线累计 token 与 elapsed seconds
declare agent 只可调用 update_goal(complete|blocked)
idle again 仍为 active 就继续;外部控制可 pause/resume/clear
数据与权限分离 ThreadGoal 是 typed record:thread_id、goal_id、objective、status、token budget、tokens used、time used、created/updated。status 为 active、paused、blocked、usage_limited、budget_limited、complete。 模型工具只允许创建、读取以及把状态改为 complete/blocked;pause、resume、budget/usage limited 由用户或系统控制。 外部 app-server 提供 thread/goal/set|get|clear 与 updated/cleared 通知。
并发与完成语义 Goal mutation 与 idle continuation 共用 semaphore,写入使用 expected_goal_id 避免旧 turn 更新新 Goal。 resume 读取持久 Goal;只有 active 才重新登记 idle continuation。 completion audit 写在 continuation prompt 中,由同一个工作 agent 基于实际证据决定是否调用 update_goal,没有独立模型复核。 blocked 要求同一阻塞连续出现至少 3 个 Goal turn;token budget 耗尽由系统转为 budget_limited。
实现判断:Codex 的优势是 first-class state、权限边界、CAS 式更新、资源核算和 resume;风险是完成判断与执行者相同,主要依赖 prompt 约束和工具调用纪律。它累计 elapsed time,但当前结构没有 time budget,也没有等待外部进程的专门状态。
Claude Code /goal 是通用 Stop hook 机制的 session-scoped prompt evaluator 配置。
原生 Goal · 官方运行合同
Entry /goal <condition>
State owner 会话范围条件
Completion small fast model
Resume 恢复 condition,重置计量基线
set 每个 session 一个 condition;新值替换旧值并立即开始 turn
work 普通 Claude Code turn;Goal 不改变 permission mode
Stop event 主 agent 准备结束时触发 session-scoped prompt hook
defer 若 background task 仍在运行,本轮跳过 evaluator
evaluate condition + conversation 交给 small fast model;不能调用工具
verdict not met / met / impossible,均带 reason
continue/clear not met 把 reason 反馈给下一轮;另两种清除 active Goal
复用 Hook 协议 普通 Stop hook 可返回 decision:"block" 和 reason;reason 进入 Claude 的下一轮上下文。 prompt hook 可由模型返回 ok、reason、impossible。/goal 在这一通用机制上增加 condition、状态显示和恢复。 stop_hook_active 防止扩展脚本无条件递归;通用 Stop hook 连续阻止 8 次后由运行时强制结束。Goal evaluator 只看对话中已经出现的证据,不读取文件或运行测试。
等待、错误与预算 后台 shell/subagent 运行时不判定;完成结果会触发新 turn。长时间等待使用退避 check-in,交互会话每次用户输入之间最多自动发起 3 次 idle check-in。 连续多轮无工具进展时停止自动循环,但保留 Goal,等待下一次用户 prompt 后继续评估。 不可恢复的 auth、余额、无法压缩的 context overflow、模型不可用会清除 Goal;瞬时错误保留 Goal。 Goal 没有独立 typed budget;可把 turn/time 终止条件写进 condition。外层 print mode 另有 --max-turns 和 --max-budget-usd。
实现判断:Claude Code 证明了 Goal 可以作为通用“停止拦截器”的特化,而不需要独立执行器。它对 background work 的 defer/check-in 处理完整,但 evaluator 无工具,可靠性依赖工作 agent 把验证证据写入 transcript。
Hermes Agent GoalManager 把自由文本目标、结构化完成合同、确定性 gate 和异步等待统一到 turn 边界。
原生 Goal · 开源源码
Entry /goal / /subgoal
State owner GoalState in SessionDB
Completion 确定性检查 → 辅助判定器
Resume 会话恢复 + 解除等待
set/draft 自由文本或 completion contract;可追加 subgoal
work 用普通 run_conversation 完成一轮
gate 先运行有 timeout/retry 的 shell quality gates
judge auxiliary model 判定 done/blocked/continue/wait
wait 可绑定 PID、process session 或 deadline;等待不消耗 Goal turn
enqueue continue 作为普通 user-role message 进入 CLI/gateway 队列
persist 每次转移写 state_meta[goal:session]
完成合同与 gate GoalContract 把 outcome、verification、constraints、boundaries、stop_when 分开保存,并同时注入工作 prompt 与 judge prompt。GoalGate 在 LLM judge 之前执行;失败时跳过 judge,限制输出尾部并把失败证据作为 continuation。gate 记录 attempts、exit code、output tail 和 workspace fingerprint;工作区未变化时复用失败结果,避免重复运行同一检查。 subgoal 是用户追加的验收条件,不重启主 Goal,也不重置原始目标。
状态、等待和适配层 GoalState 保存 status、turn budget、judge failure counters、subgoals、wait barrier、contract 与 gates。judge 输出 done、blocked、continue 或 wait;wait 可指定 PID、process session 或秒数。 CLI 与 gateway 共用 GoalManager,但各自负责把 continuation 排进现有消息队列;不修改 system prompt 和 toolset。 Goal 状态随 session resume 恢复;context compression 造成 session id 轮换时迁移 Goal 并清理旧记录。
实现判断:Hermes 当前方案把“可验证完成”和“外部工作尚未结束”分开:确定性 gate 对验证结果负责,judge 对开放式语义负责,wait barrier 对异步依赖负责。默认仍是单 session 单 Goal 与 turn budget;总 token/cost budget 不属于已确认的 GoalState 合同。
没有原生 Goal 的相邻实现
这两套系统提供了 Goal 所需的部分构件,但没有“一个开放式完成条件持续控制多个 turn,直到被独立判定为完成”的完整合同。
OpenCode 持久 Todo + 单 turn agent loop;Todo 是进度记录,不是循环终止条件。
相邻机制 · 开源源码
Task source latest user message
Progress state SQLite Todo rows
Loop stop 提供商结束原因
Bound agent.steps
实现方式 SessionPrompt.run 循环读取最新消息;assistant 有非 tool-call finish reason 且不存在未处理 tool call 时退出。每轮解析 agent profile,解析工具,处理 compaction/subtask,然后调用 provider。agent.steps 默认无限;最后一步把 max-steps 提示加入模型消息。 Plan 是一个 primary agent profile:主要通过 permission 禁止 edit,只允许写特定 plan 文件;它不是 Goal 状态。
Todo 的边界 Todo item 只有 content、status、priority;按 session ID 存 SQLite,并发布 todo.updated。 todowrite 每次替换完整列表,UI 展示 completed/total;subagent 默认禁用。Todo 是否全部 completed 不参与 SessionPrompt.run 的退出判断,也不会在 session idle 后自动启动新 turn。 因此它适合成为 Goal 的 progress projection,但不能单独承担 Goal controller。
OpenClaw 把持久工作拆成 scheduler、background task、heartbeat、standing instruction 与 commitment,而不是提供通用 Goal evaluator。
相邻机制 · 开源源码
Persistent intent 自动化 / 长期指令
Wake owner Gateway scheduler
Execution Agent 轮次 / 命令 / 脚本
Completion per-run outcome
调度与状态 Automation job 保存 id、name、enabled、schedule、session target、wake mode、typed payload、delivery、failure alert 和 run state。 payload 分为 system event、agent turn、command、script;session target 可为 main、current、isolated 或命名 session。 运行结果区分 execution 与 delivery;持久化 job、运行状态和历史,gateway restart 后继续调度。 脚本与 command 可以用 exit code 提供确定性成功,但这只判定一次 run,不判定开放式目标。
Heartbeat 与 commitment Heartbeat 是系统拥有的 monitor automation;读取 scratch 或 HEARTBEAT.md,无到期任务时跳过模型调用。 结构化 heartbeat task 只有 name、interval、prompt,按各自周期进入下一次 monitor turn。 Commitment 记录 agent promise 或从用户上下文推断的后续联系,包含 due window、confidence、status、attempts 与 delivery scope。 这些机制擅长“何时再次执行/通知”,但没有 met/unmet evaluator,也不会把多个 run 约束为同一个完成条件。
实现判断:OpenClaw 最适合作为 Goal 的外部等待和调度参考。把它直接称为 Goal 会丢失完成判定语义;更合适的组合是 Goal controller 在需要未来时间或外部事件时创建/绑定 automation,收到事件后再恢复 Goal。
Python Workflow 的独立判定与兼容约束
以下独立 work/judge 合同仅属于 Python Workflow;聊天模式采用上方方案:普通工作轮次不运行 judge,仅在完成候选出现时作独立验收。
已经采用
Codex 的控制面数据模型 当前快照已有稳定 goal_id、每次执行独立的 run_id、typed status、budget/usage、时间字段和 CAS version;用户操作负责 pause/resume/edit/answer/limit/clear,judge 只提交候选 verdict。
直接采用
Hermes 的三段判定 completion contract 明确定义 outcome/verification/constraints/boundaries/stop_when;确定性 gate 先执行;只有 gate 通过后才使用语义 judge。异步依赖进入 wait barrier,不重复启动工作 turn。
直接采用
Claude Code 的后台任务 defer 工作 turn 结束但存在 background task 时,不立即判定完成,也不立即续轮。由完成事件恢复;长期等待时使用有上限的退避 check-in,并把运行中任务列表交给 controller。
已经保留
OpenProgram 的 tool-capable judge 独立 judge 使用只读检查工具直接验证文件和命令结果,并返回 typed verdict。deterministic gate executor 仍是后续工作。
组合使用
OpenCode Todo 作为进度投影 Goal checklist 应有独立 typed item 表和事件,UI 可稳定显示。但 checklist 的 completed 状态只是 evidence,不应直接等价于整个 Goal complete,也不应由 UI 状态驱动 controller。
按需组合
OpenClaw 调度作为等待适配器 未来时间、CI、外部事件或后台作业不应消耗 Goal turn。GoalRun 保存 wait handle;scheduler/task subsystem 负责唤醒;Goal controller 收到事件后重新判定或继续。
不采用
仅依据工作 agent 的完成声明 Codex 的 self-report 适合低成本通用控制面,但 OpenProgram 已有独立判定器,不应退回到仅靠 update_goal(complete)。该工具可作为候选信号,最终状态仍由 evaluator/controller 提交。
当前边界
版本化 session 快照 extra_meta.goal 已有 schema version、实体 ID、CAS 写入与迁移读取,足以承担当前单 session controller。它仍不是 append-only evidence repository;需要审计级证据历史时再拆分独立存储。
不采用
把 Todo、Plan 或 Cron 命名为 Goal 三者分别解决分解、变更权限和时序触发,不包含“完成条件 + 判定 + 自动续轮”的完整语义。API 与 UI 应保留这些边界。
兼容 Python Workflow 的合同与剩余扩展
本节的独立判定器、角色配置和恢复检查点属于 Python Workflow。聊天入口使用同一状态存储及预算控制,但不调用此控制器。
Goal 不新增第二套 agent loop。当前 controller 位于现有 session/dispatcher 之上,工作仍通过公开 agent() 执行;图中 implemented 是当前代码,target 是尚未实现的扩展。
OpenProgram Goal:当前控制器与剩余扩展
由 Archify 生成的架构图。
Goal entry · Programs / API / /goal · 架构组件
Goal entry
Programs / API / /goal
GoalSpec · objective · contract · scope · 架构组件 · target
GoalSpec
目标 · 合同 · 范围
target
GoalController · 唯一状态转移所有者 · 架构组件 · target
GoalController
唯一状态转移所有者
target
Working agent · agent() / turn dispatcher · 架构组件
Working agent
agent() / 轮次派发器
Deterministic gates · tests · commands · typed checks · 架构组件 · target
确定性检查
测试 · 命令 · 类型检查
target
GoalEvaluator · inspection judge + evidence refs · 架构组件
GoalEvaluator
检查判定器 + 证据引用
Terminal state · achieved · blocked · failed · 架构组件
Terminal state
achieved · blocked · failed
Async question queue · pending · answered · dependency · 架构组件 · implemented
异步问题队列
待答 · 已答 · 依赖
implemented
External wake adapter · job · timer · event · 架构组件 · target
外部唤醒适配器
job · timer · event
target
Session Goal snapshot · version · checkpoint · usage · 架构组件 · implemented
会话 Goal 快照
版本 · 检查点 · 用量
implemented
Goal projection · UI · goal.updated · 架构组件
Goal projection
UI · goal.updated
create / resume / clear
完成合同
启动一个工作轮次
new evidence
verified results
类型化判定 + 证据引用
needs_user + can_continue
回答 / 安全续接
已接受终态判定
CAS version + usage
匹配的外部事件
版本化投影
图例
前端
后端
数据库
安全
消息总线
外部系统
Archify architecture · showcase 结构验证 9/9,0 errors,0 warnings。图中直接嵌入可缩放 SVG;typed source 与本文档同目录保存。紫色虚线表示等待与恢复路径。
Spec 与 run 保存在一个版本化快照中。 goal_id 跨 resume 保持稳定,run_id 标识一次 execution;编辑生成新 revision,并重新完善 spec/checklist。refinement 只转述用户要求与必要正确性检查,保留“约”等近似约束,不自行增加格式比例、基准名、数量门槛或参考作品比较;重要歧义作为待确认问题保留。
Stop policy 在阶段边界检查累计预算。 rounds、tokens、active elapsed time 和 cost 在 resume 后累计;等待和暂停不消耗 active-time 预算。工作轮次默认限时 300 秒,provider 静默流受整个调用的截止时间约束;累计预算不是对当前阶段的精确抢占上限。
Controller 是状态转移提交者。 每个阶段保存 checkpoint;pause/edit/answer/cancel 与旧 controller 使用 CAS version 竞争,旧执行不能覆盖新状态。
Evaluator 是独立 inspection agent。 它输出 met、unmet、blocked、impossible、waiting_external、needs_user 和 can_continue。本地检查之外提供 web_fetch、web_search,沿用现有 URL 与网络权限检查;网页工具的失败通过结构化 is_error 回执传递。一次判定含失败的工具检查回执时,controller 不接受 met,先重新判定;持续失败报告 judge failure。该规则保守地要求一次无检查错误的验收,不证明成功回执本身足以满足全部语义要求;通用确定性 gate executor 尚未实现。
异步问题队列不阻塞无关工作。 问题可以累积并逐项回答;active execution 在下一个边界消费答案,只有所有剩余工作都依赖答案时才进入 waiting_user。问题只占用 Goal 详情面板,不替换或禁用普通 composer。
重启恢复采用显式新 execution。 启动 reconciliation 把遗留执行状态改成 paused_recoverable;恢复沿用快照而不尝试复活旧调用栈。
外部 scheduler 是目标扩展。 waiting_external 已有状态,但 job/timer/event 的自动 wake handle 尚未实现。同机共享 session store 的 Goal controller 使用独立 OS 文件锁,启动恢复持相同锁,避免改写 live sibling 的状态。
查看目标状态的完整转移表
状态 进入者 允许离开方式 是否自动运行 说明
active / running / evaluating创建/恢复;控制器 waiting_user / waiting_external / paused / blocked / impossible / stalled / achieved / budget_exhausted / failed / cancelled 是 单个 controller 顺序启动工作 turn 与 judge;每个边界保存状态。
waiting_user判定器/控制器 任意新答案触发 resume,或 edit/cancel 否 仅表示剩余工作全部依赖答案;部分答案可以解除部分依赖,其他问题保留。
waiting_externalevaluator 显式 resume / edit / cancel 否 当前没有自动 wake handle;外部依赖变化后由用户恢复。
paused / paused_recoverable用户 / startup reconciliation resume / edit / cancel 否 保留预算、问题、checklist 和 checkpoint;等待时间不计入 active time。
blockedevaluator 依赖变化后 resume、edit 或 cancel 否 不是成功;reason 记录当前阻塞事实。
impossibleevaluator 只读终态;可创建新 Goal 否 当前目标与固定约束不能同时满足。
stalledcontroller resume / edit / cancel 否 checklist 连续不增长或连续无工具工作达到阈值。
achievedcontroller 接受 evaluator 结果 只读;新目标创建新 run 否 保存 evidence refs、gate results 和最终 usage。
budget_exhausted / failedcontroller / runtime 调整预算后 resume,或 edit/cancel 否 预算耗尽与执行/判定错误分开记录。
Goal 控制界面与 Workflow 兼容字段
Web 与 TUI 的开始、恢复均提交普通聊天。下方角色字段仅用于兼容 Workflow 记录;聊天 Goal 隐藏角色配置,使用当前会话模型。
底部 Goal 状态条是详情入口,不是静态标签。重载页面或 worker 重启后,它从持久化 projection 恢复目标文本、状态、checklist、用量与最后原因;若先前 execution 已丢失,则显示 paused_recoverable,不显示为仍在运行。
Goal 在 Web 与 TUI 的一致交互
由 Archify 生成的工作流图。
01 / Web
02 / TUI
03 / Shared Goal Actions
04 / Durable State
底部 Goal 状态条 · 状态 · 进度 · 用量 · Web
底部 Goal 状态条
状态 · 进度 · 用量
Goal 详情面板 · prompt · checklist · 问题队列 · Web
Goal 详情面板
prompt · checklist · 问题队列
/goal status · 完整状态与原因 · TUI
/goal status
完整状态与原因
/goal action · 编辑 · 回答 · 恢复 · 清除 · TUI
/goal action
编辑 · 回答 · 恢复 · 清除
Goal Action API · 同一校验与错误合同 · Shared Goal Actions
Goal Action API
同一校验与错误合同
版本化转移 · expected_version · lease · Shared Goal Actions
版本化转移
expected_version · lease
Goal 快照 · 检查点 + 问题队列 · 持久状态
Goal Snapshot
检查点 + 问题队列
Goal 投影 · 恢复 + goal_update · 持久状态
Goal Projection
hydrate + goal_update
validate
click / keyboard
typed action
reload / live update
committed state
atomic save
same action
图例
用户界面
Agent 逻辑
策略
工具操作
上下文 / 追踪
Web 面板和 TUI 命令都调用版本化 Goal Action API;状态迁移、并发检查和恢复规则不在界面层重复实现。
◎ Goal · 重启后暂停 · 4/9
调研并完成一篇大模型知识综述 goal_7f2a · run 2 · version 18
状态 可恢复暂停:worker 重启中断了上一轮
进度 清单 4 / 9 · 7 轮 · 38k tokens
最近证据 新增 12 篇来源;方法分类 gate 已通过
恢复位置 从已保存 spec、checklist 与 session evidence 创建新 execution
待答问题 2 项;可以稍后逐项回答,不影响独立的来源核查
继续 编辑目标 调整预算 终止
$ /goal status
Goal [paused_recoverable]
调研并完成一篇大模型知识综述
progress 4/9
usage 7 rounds · 38k tokens
reason worker restarted during round 8
$ /goal resume
Goal resumed as execution goal-exec-02.
$ /goal edit 收窄到知识编辑与持续学习
Goal revision 3 saved; prior evidence retained.
$ /goal pause
Goal paused.
$ /goal
pending questions: 2
[?] scope: 是否纳入知识编辑?
[?] date: 文献截止日期是什么?
$ /goal answer scope 纳入
Goal answer saved; resuming from the latest checkpoint.
编辑 Goal 增加 revision,并重新生成当前 spec/checklist;旧 revision 的未答问题保留为 superseded 审计记录,不再阻塞新 revision。继续操作保留 goal_id、累计用量和问题历史,同时创建新的 run_id。暂停、等待和重启恢复不重置已消耗预算;等待时间不计入 active-time 限制。
实现与验收合同
独立规格审查要求保证两项合同:真实人类依赖转入等待,不能被普通无进展计数覆盖;Web 操作成功后的 HTTP 快照立即更新可见状态与共享缓存,旧版本事件不能回退新状态。修复限定在 Goal 状态转换及前端投影,不改其他工作流。验收分别使用公开 Goal → 回答命令的回归测试,以及无 WebSocket 广播的操作响应与重新挂载测试;修复后需要原审查者复核,再做独立质量审查。
真实人类依赖不会被无进展计数错误覆盖,预算判断仍独立执行。前端通过共用 updateSessionGoal 按 session version 应用 HTTP、WebSocket 与 hydration 快照;无广播暂停、重新挂载、乱序消息、后台会话及迟到加载由 4 项组件测试覆盖。Web 测试合计 229 项通过,TypeScript、静态检查和 32 页生产构建通过;等待状态与前端修复的独立规格复核均通过。构建仍有既有 Next SWC lockfile 修复警告,未改依赖锁文件。
控制器保存使用 CAS;发生同运行并发更新时,以最近确认快照、本轮状态和磁盘最新状态合并,并在 session 写锁内提交,不执行无界重试。合并仅允许相同 goal_id/run_id 且最新状态仍在执行的情况;预算和新答案保留,本轮进度与已消费答案也保留。暂停、取消、替换运行仍拒绝旧控制器写入。终止保存共用此路径;新答案使旧终止判定失效,保存为 paused_recoverable / answer_received,用户可继续处理,不能误报 achieved。分批消费的答案共同进入后续工作提示;再次恢复时从当前 revision 的持久问题记录重建已确认决定,并恢复有长度上限的 evidence window。编辑目标隔离旧 revision 的决定和证据。
并发修复的独立质量复核为 PASS,覆盖原有“修改预算导致控制器退出但仍显示运行中”的复现。审查者独立执行 9 项针对性回归通过:预算/答案在 evaluating/terminal 的竞争、暂停/取消/替换运行、消费期间收到新答案及旧 CAS 拒绝。集成后的 Goal、存储和 Web API 相关测试通过,完整统计见下方全量验证。该结论限于已审修复,不能代替修复后全量验证、尚未实现的设计能力或默认 App 可视验收。
以下条目把设计要求绑定到公开入口和可观察结果。局部源码、测试及独立修复审查不代表完整验收:最终集成代码的全量测试已通过,默认 App 的刷新与可视验收单独记录。下表中的实现描述仅指工作树内已有代码,不表示已发布或已完成全部要求。
要求 公开入口 / 证据 可观察结果 当前状态
单 prompt Goal,工作与判定分离 goal(prompt, ...);judge_goal()Working Agent 执行;inspection judge 独立验证并返回 typed verdict 已实现,单元测试覆盖
困难任务不会无限续轮 round/token/active-time/cost budget;active-run usage cursor;stall 与 judge failure guards 分别进入 budget_exhausted、stalled、failed、blocked 或 impossible;等待期间其他 session 用量不计入 Goal 已实现,边界测试覆盖
无人值守时不打断,继续独立工作 judge 的 needs_user + can_continue;持久 questions[] 问题累积;依赖答案的事项不执行;安全独立工作继续;全部受阻后才等待 已实现,队列与续轮测试覆盖
异步回答与并发安全 Goal Action API;SessionStore CAS 版本 active run 在边界消费答案;部分回答允许部分工作恢复;用户主动暂停保持暂停;旧 controller 不能覆盖新状态 已实现,竞争路径测试覆盖
重载与 worker 重启可恢复 会话恢复;启动核对;/goal resume 重载后恢复完整投影;重启中断状态变为 paused_recoverable;resume 创建新 run 组件测试通过;默认 App 已验证重启恢复状态、编辑重载及 Resume 实际执行
Web 与 TUI 控制一致 Goal dialog;/goal 命令;同一 Action API 查看目标、checklist、用量、问题;编辑、暂停、回答、预算、继续、终止 类型检查与自动测试通过;默认 App 已验证编辑、预算、暂停、恢复和完成判定;异步回答完整界面流程尚未验收
外部事件自动唤醒 目标:持久 wait handle + scheduler event CI/job/timer 完成后幂等恢复,无需用户 resume 未实现
共享状态目录多 worker ownership ownership.goal_owner();独立非阻塞 OS 文件锁同机同 store 独占 controller;startup reconciliation 跳过 live sibling;崩溃释放锁 跨进程与异常退出测试覆盖;不支持跨主机分布式 lease
Deterministic gates 与独立证据仓库 目标:gate runner + evidence refs/repository 可复用命令检查先于 judge,完整证据不依赖 session 快照 未实现
当前验证命令
python -m pytest tests/unit/agent/workflows/test_goal_loop.py tests/unit/agent/workflows/test_goal_functions.py tests/unit/agent/workflows/test_agentic_programming_goal.py tests/unit/agent/workflows/test_goal_single_workflow.py tests/component/webui/execution/test_goal_command_workflow.py -q
cd apps/web && npx tsc --noEmit
python -m scripts.docs_site.build,随后 python -m scripts.docs_site.checklinks
网页核查:judge 具有网页读取和检索工具,失败回执标记为 is_error=true。已有真实模型检查受到 arXiv 的 NON_GLOBAL_ADDRESS 拒绝与 Tavily 缺少凭据的限制;没有绕过网络策略,不能把这次研究产物视为来源已核验的综述。
集成代码执行 python -m pytest -q -n 4:7015 项通过、18 项跳过、1 项预期失败,包含暂停的执行身份和 Runtime 内检查路径修复。全量发现的 Goal 包装函数源码定位问题已修复;两组 agent 合同测试的执行数据库已按测试隔离,避免启动恢复读取其他测试的记录。TUI 测试 148 项通过、2 项跳过,类型检查通过。默认 App 的实际运行证据与自动测试分开记录。
真实模型验证:通过公开 programs run goal 入口,MiniMax-M3 完成约 300 字中文文章写作、文件读取核对与判定,命令正常退出;产物内容已另行读取检查确认。此例仅使用给定事实,不调用网络,不能替代来源核验。已有综述尝试受到外部来源访问和检索凭据限制,仍不能作为已核验的综述交付。失败回执防护会阻止包含错误检查回执的 met,不证明全部语义判定可靠。
默认 App 已验证测试 Goal 的重启恢复状态、编辑保存、页面重载、预算修改、暂停和恢复。暂停使对应 canonical execution 进入 cancelling,随后以 cancelled / cancel.user 停止,Goal 保持可恢复的暂停状态。再次恢复后,判定先因多余输出拒绝达成,再接受修正后的输出;最终 Goal 显示 achieved、checklist 4/4,判定解析错误计数为 0。这是短文本任务的实际运行验收,不代表外部研究或全部任务类型均已验证。
Goal 在已有 Runtime 中的 refiner/judge 使用公共 agent():各自保持工具、模型与阶段标签,共享当前执行所有者,不创建独立 Job,避免首次初始化 JobRunner 的全局启动恢复误判外层活跃执行。无 Runtime 的独立 session helper 保留原路径。该局部修复不解决其他进程调用全局恢复的风险。执行树摘要仍有字段映射缺陷:已持久化的 LLM 回复位于 raw_reply,摘要却读取 output;空输入参数不代表回复丢失。另有函数结果行显示 Completed、canonical execution 已 cancelled 的展示不一致,不能用该摘要标签证明执行成功。
完成验收还发现通用执行结束记录未一致收敛:Goal 为 achieved,但对应 canonical execution 的 completed 写入连续重试后留下 finish_repair_stalled,状态仍为 running。该未解决项不否定已生成的工作输出与 Goal 判定,但阻止“完整执行生命周期全部验收通过”的结论。