loop 循环任务与 Goal 模式
2026年6月26日 下午7:14:06
/loop 是 SolonCode 的循环任务与目标驱动引擎,支持两种运行模式:定时心跳(HEARTBEAT) 和 目标驱动(GOAL)。它是 SolonCode 实现自主持续运行的核心能力。
1、两种任务类型
| 类型 | 命令 | 执行方式 | 适用场景 |
|---|---|---|---|
| HEARTBEAT | /loop 5m check CI | 按固定间隔或 cron 周期触发 | 定时检查、轮询、监控 |
| GOAL | /loop goal fix auth | 事件驱动持续推进,直至目标达成 | 代码重构、文档编写、Bug 修复等需要多轮自主完成的任务 |
2、命令参考
2.1 管理命令
| 子命令 | 说明 |
|---|---|
/loop | 列出当前会话所有活跃任务 |
/loop ls | 同上 |
/loop stop <id> | 停止指定任务 |
/loop stop-all | 停止当前会话所有任务 |
/loop pause <id> | 暂停一个 Goal 任务(仅 GOAL 类型) |
/loop resume <id> | 恢复一个暂停/阻塞的 Goal 任务 |
2.2 创建心跳任务
/loop 5m check if deployment finished ← 每 5 分钟执行一次
/loop 30s check CI status ← 每 30 秒(自动向上取整为 1 分钟)
/loop check CI status ← 默认 5 分钟
/loop cron:"0 */5 * * * ?" check status ← 使用 cron 表达式
/loop 5m --now check status ← 立即执行首次(--now 标志)
2.3 创建 Goal 任务
/loop goal fix auth module ← 简化 Goal 模式,立即执行
/loop goal write a readme.md ← 编写文档
/loop goal --max-tokens:50000 refactor ← 限制 Token 预算
/loop goal --max-duration:30 fix tests ← 限制时间预算(单位:分钟)
注意:每个会话同一时间只能有一个活跃的 Goal。需先
/loop stop <id>才能创建新 Goal。
3、Goal 状态机
Goal 模式拥有完整的 5 态状态机,实现可中断、可恢复的自主推进:
PURSUING ⇄ PAUSED → ACHIEVED | BUDGET_LIMITED
↓
BLOCKED → (resume) → PURSUING
| 状态 | 说明 | 可恢复 |
|---|---|---|
| PURSUING | 正在推进中,AI 持续执行 | — |
| PAUSED | 用户手动暂停(/loop pause) | 是 |
| BLOCKED | AI 主动声明阻塞(通过 goal_update(blocked)) | 是 |
| ACHIEVED | AI 调用 goal_update(complete) 标记完成 | 否(终态) |
| BUDGET_LIMITED | Token/时间预算耗尽 | 可通过扩容恢复 |
状态变更方法:
| 操作 | 方式 | 前置状态 |
|---|---|---|
| 创建 | /loop goal <objective> | — |
| 暂停 | /loop pause <id> | PURSUING |
| 恢复 | /loop resume <id> | PAUSED / BLOCKED |
| 完成 | goal_update(complete) — AI 工具调用 | PURSUING |
| 声明阻塞 | goal_update(blocked) — AI 工具调用 | PURSUING |
| 预算耗尽 | 系统自动标记 | PURSUING |
| 扩容恢复 | goal_update(extend_budget) — AI 工具调用 | BUDGET_LIMITED |
4、Goal 模式深入
4.1 AI 侧工具
Goal 模式下,系统会向 AI 暴露两个工具(仅在存在活跃 Goal 时动态加载,无 Goal 时不出现):
| 工具 | 说明 | 调用者 |
|---|---|---|
goal_get | 查询当前 Goal 状态(目标、进度、预算消耗、耗时) | AI |
goal_update | 更新目标状态:complete(标记完成)或 blocked(声明阻塞) | AI |
goal_get 返回值示例:
{
"goal": {
"taskId": "a1b2c3d4",
"objective": "fix auth module",
"status": "pursuing",
"iteration": 3,
"elapsedSeconds": 120,
"consumedTokens": 15000,
"maxTokens": 50000,
"budgetExceeded": false,
"maxDurationMs": 1800000,
"remainingDurationSeconds": 1680
},
"remaining_tokens": 35000,
"completionBudgetReport": null
}
4.2 Budget 预算管理
Goal 模式支持 Token 和时间双重预算控制:
| 配置方式 | 说明 | 默认值 |
|---|---|---|
--max-tokens:<N> | Token 预算上限 | settings.json 中配置 |
--max-duration:<N> | 时间预算上限(分钟) | settings.json 中配置 |
settings.json → loop | 全局默认预算 | 0(不限制) |
预算阈值体系: - 警告阈值(默认 70%):引导词中提示 AI 调整策略 - 紧急阈值(默认 85%):引导词中增加紧急提示 - 预算耗尽:触发 wrap-up 收尾回合,AI 总结进展后状态转为 BUDGET_LIMITED
预算感知引导词(Budget-Aware Prompting):
| 剩余预算 | 引导词模式 | 章节数 |
|---|---|---|
| ≥ 30% | 完整模式 | 7 章节(证据驱动、忠于目标、审计完成、阻塞审计等) |
| 15% ~ 30% | 精简模式 | 3 章节(目标延续、审计完成、上一轮摘要) |
| < 15% | 极简模式 | 单段落 |
4.3 运行时兜底机制
| 机制 | 说明 | 阈值 |
|---|---|---|
| 无进展检测 | 通过指纹对比(工具调用 + 结果长度桶 + 行数桶)检测停滞 | 连续 3 轮(可配置) |
| 连续异常重试 | 异常时递增延迟重试(5s → 10s → 15s...) | 连续 3 次后标记 BLOCKED |
| CAS 防重入 | tryStart() CAS 语义防止同一任务重叠执行 | — |
| BusyChecker | 会话繁忙时跳过本轮执行 | 由注册的检查器决定 |
| 事件驱动续行 | Goal 每轮执行完成后自动调度下一轮(1s 冷却间隙) | 仅 PURSUING 且非繁忙时 |
| ShutdownHook | JVM 关闭时自动暂停所有活跃 Goal | — |
| 崩溃恢复 | 进程重启后自动恢复未过期任务,自动 resume 暂停/阻塞的 Goal | 持久化到 loop-tasks.json |
5、配置参考(settings.json)
在 settings.json 的 loop 节点下配置:
{
"loop": {
"budgetWarningPercent": 70,
"budgetCriticalPercent": 85,
"defaultMaxTokens": 100000,
"defaultMaxDurationMinutes": 60,
"stagnationThreshold": 3,
"maxConsecutiveErrors": 3,
"validatorEnabled": true
}
}
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
budgetWarningPercent | int | 70 | Token 预算警告阈值(%) |
budgetCriticalPercent | int | 85 | Token 预算紧急阈值(%) |
defaultMaxTokens | long | 0(不限制) | Goal 默认 Token 预算上限 |
defaultMaxDurationMinutes | int | 0(不限制) | Goal 默认时间预算上限(分钟) |
stagnationThreshold | int | 3 | 连续无进展轮次阈值 |
maxConsecutiveErrors | int | 3 | 连续异常阈值(超过后标记 BLOCKED) |
validatorEnabled | bool | true | 是否启用目标验证器 |

6、Goal 验证器
当 AI 调用 goal_update(complete) 标记目标完成时,系统会先执行客观验证:
- 默认验证器(NoopValidator):始终返回通过
- 自定义验证器:可注册实现
GoalValidator接口的验证器,执行如运行测试套件、检查文件存在等客观校验 - 插件化:通过
ValidatorFactory根据目标条件自动匹配验证器
验证失败时,系统会返回错误信息,AI 继续改进后重新提交。
7、持久化与恢复
- 所有 Loop 任务持久化在会话目录的
loop-tasks.json文件中 - 使用原子写入(先写
.tmp再atomicMove),防止写入中断导致数据损坏 - 进程重启后自动:
- 加载
loop-tasks.json恢复未取消的任务 - 重新注册调度
- 自动 resume 暂停/阻塞状态的 Goal(从 SIGINT 中断恢复)
- 加载
- 每轮执行后实时持久化状态
8、完整示例
定时检查 + Goal 修复
# 每隔 5 分钟检查构建状态
/loop 5m check if the CI build passed
# 查看所有任务
/loop ls
# 发现构建失败,创建 Goal 任务修复
/loop goal --max-tokens:50000 fix the CI build failure
# 查看 Goal 进展
/loop ls
# 临时暂停 Goal
/loop pause a1b2c3d4
# 恢复 Goal
/loop resume a1b2c3d4
# Goal 完成后,停止定时检查
/loop stop b2c3d4e5
带有预算控制的 Goal
# 重构代码库,限制在 50000 Token 和 30 分钟内
/loop goal --max-tokens:50000 --max-duration:30 refactor the payment module
# 查看任务状态
/loop ls
9、与 /continue 的关系
| 特性 | /loop goal | /continue |
|---|---|---|
| 驱动方式 | 事件驱动,自动持续推进 | 手动触发 |
| 状态管理 | 完整状态机(暂停/恢复/完成/预算) | 无状态管理 |
| 预算控制 | Token + 时间预算 | 无预算 |
| 持久化 | 自动持久化,进程重启可恢复 | 仅恢复会话历史 |
| 适用场景 | 需要多轮自主完成的复杂任务 | 从上一次中断处继续聊天 |
提示:如果只是想从上一次对话继续,使用
/continue。如果需要 AI 自主推进一个目标直到完成,使用/loop goal。