自主连续循环
代理式循环的核心问题是"何时停止、何时继续"。MoAI-ADK 提供 /moai goal 和 /moai loop 两种连续循环原语,Claude Code 自身则提供原生 goal 命令。本页区分这三者,并解释各自的所有权、实现状态和安全护栏。
有些任务在单个回合内完成,但有些需要数十个回合才能收敛 — 例如"直到所有测试 PASS"或"直到诊断工具的问题队列清空"。如果用户每回合都要输入提示,自主性的优势就丧失了。
连续循环原语解决这个问题。声明完成条件,会话就会持续工作直到条件满足或回合限额到达。
连续循环原语共三种 — 其中两种由 MoAI-ADK 拥有,另一种由 Claude Code 自身拥有 — 各有不同的触发语义。
| 原语 | 所有权 | 触发 | 适用场景 |
|---|---|---|---|
/goal | 用户 TUI (HUMAN-ONLY) | 模型评估条件 | “持续直到此条件为真” |
/moai goal | 编排器 (PROGRAMMATIC) | stop-goal Stop-hook 评估 | MoAI 管道内的自主连续 |
/moai loop | Ralph Engine (诊断驱动) | 诊断工具问题队列 | “修复工具找到的所有问题” |
flowchart TD
G["/goal — native Claude Code
HUMAN-ONLY TUI command"]
M["/moai goal — MoAI PROGRAMMATIC
orchestrator-owned (Axis B)"]
L["/moai loop — Ralph Engine
diagnostic-driven preset"]
G -->|相同语义,不同所有权| M
M -->|goal 引擎上的预设| L /goal 是 Claude Code 的原生 TUI 命令。它是用户输入的命令,模型不能代表用户调用。这就是 HUMAN-ONLY 约束。
声明完成条件后,每个回合结束时一个小型快速模型(默认 Haiku)评估条件是否满足。不满足则开始下一回合; 满足则循环结束。
/goal go test ./... exits 0 && lint is clean, or stop after 20 turns条件最多 4,000 字符,可包含回合/时间限额来约束循环。裸 /goal 查看状态; /goal clear 提前终止。
/moai goal 是 MoAI 拥有的编程式重新实现。由于原生 /goal 是 HUMAN-ONLY,这是编排器在管道内注册和武装自主连续循环的唯一路径。
提供四个动词:
moai goal arm "<completion-condition>" # 注册 + 武装条件
moai goal status # 查看当前条件 + 回合/token 消耗
moai goal clear # 删除条件 (结束循环)会话开始时 PruneOrphans 清理孤立 goal。此机制在 SPEC-GOAL-ENGINE-001 (CLOSED)中实现。
/moai loop 是扫描诊断工具找到的问题队列、修复每个问题、重复直到队列清空或诊断干净的确定性循环。它是 goal 引擎上的预设。
/moai loop 不是 /moai run --mode loop 的别名。/moai run --mode loop 是运行时模式分发值; /moai loop 是独立子命令。两者使用相同 goal 引擎,但入口路径和预设行为不同。
/goal <condition> 设置完成条件,Claude 无需提示持续工作直到条件为真。每个回合后,小型快速模型评估条件。
编写有效条件:
- 一个可测量的终态 — 测试结果、构建 exit code、文件数、空队列
- 明确的验证方法 — Claude 应如何证明("
go test ./... exits 0") - 重要约束 — 过程中不应改变的(“禁止修改其他测试文件”)
包含回合限额来约束循环("or stop after 20 turns")。运行 /clear 也会删除活动 goal。用 --resume / --continue 恢复会话时 goal 被还原。
REQ-DA-062 诚实性区分: 三个原语的实现状态明确区分。
-
/goal(原生) — 在 Claude Code 运行时实现(需 v2.1.139+) -
/moai goal(PROGRAMMATIC) — SPEC-GOAL-ENGINE-001 CLOSED,4 动词 CLI 完整实现 -
/moai loop(Ralph Engine) — 以诊断驱动循环实现 - AGENTIC-CORE Epic — 进行中。SPEC-1 (Analyze-First 路由) CLOSED。SPEC-2 (自主/半自主 kickoff REQ)等待用户需求。
所有循环原语的安全护栏不变。
- Implementation Kickoff Approval (plan → run HUMAN GATE) 不能被任何循环绕过。即使
/goal活动,run-phase 进入前的用户批准仍是强制的。 - 安全边界不变 — 即使循环活动,“难以逆转/共享系统操作前确认"边界不会被放宽。goal 评估器仅决定是否继续; 不预批准破坏性操作。
- 与 auto mode 组合 — 将 Claude Code auto mode(每工具自动批准)与
/moai goal(每回合连续)组合可实现无人值守ac_converge循环。auto mode 移除每工具批准提示;/moai goal移除每回合 STOP 提示。Implementation Kickoff Approval 在 run-phase 进入前仍强制。
一个可选的 Stop 钩子为自主循环追加跨模型对抗审查, 让完全自主的 /moai goal 运行获得多模型安全网 (自主性再设计的 Path C)。
选择 audit_model: multi 后, audit_multi MCP 工具把审查并行展开到所有活动后端 — claude 作为会话内锚点, codex 与 GLM 作为次级 (各自按其 audit_gate) — 再按 4 步策略收敛判定。
- 任一必需后端返回
FAIL→overall_verdict = FAIL。 - 所有必需后端返回
PASS→overall_verdict = PASS。 - 必需后端之间出现分裂 → 保守的
FAIL并设disagreement_flag。 - 与仅建议性后端的冲突 →
PASS并设disagreement_flag。
分歧通过 ConvergenceResult 的 disagreement_flag 和 residual_risk_note 显露, 其本身绝不会硬性阻断流程。独立性由结构保证。次级展开 goroutine 只接收 (target, focus, model, effort), 绝不接收 claude_verdict。因此 codex 与 GLM 给出的是不相关的第二意见, 而非被污染的再采样。故障开放双向成立。缺失或未认证的可选后端返回 VerdictInconclusive 并回落到 claude, 永远不会变成硬错误。
多模型审查门 Stop 钩子是可选的 (workflow.multi_review_gate.enabled, 与 workflow.codex.review_gate 同模式的 BranchGuard 兄弟, 默认关闭), 并把 moai 默认的 5 秒钩子超时覆盖为 900 秒。每个代码编辑回合读取最近的 ConvergenceResult (收敛引擎写入 .moai/state/audit-multi/<session>.json) 并发出标准的 ALLOW/BLOCK 契约。
- 所有必需后端 PASS → ALLOW。
- 任一必需后端 FAIL → BLOCK。
- 仅建议性冲突 → ALLOW (分歧仅以建议形式显露, 永不阻断)。
- claude 之外的后端全部 inconclusive → 回落到 claude 判定 (故障开放)。
强制自门让无编辑回合立即 ALLOW。状态汇报、审查结果及其他不编辑的回合永远不会被误拦。
多模型审查门是 Stop 钩子, 不是连续原语。它与 /moai goal (每回合连续) 和 /moai loop (诊断驱动预设) 叠加使用。循环驱动会话向前, 审查门在每个代码编辑边界应用跨模型收敛契约。任何组合下, 进入 run-phase 前的 Implementation Kickoff Approval 仍然必须。