名称: ralph-operations
描述: 用于管理 Ralph 编排循环、分析诊断数据、调试帽子选择、调查背压或进行事后分析
标签: [loops, diagnostics, debugging, analysis]
管理、监控和诊断 Ralph 编排循环。
| 任务 | 命令 |
|---|---|
| 列出活动循环 | ralph loops |
| 列出所有循环(包括已合并的) | ralph loops --all |
| 查看循环变更 | ralph loops diff <id> |
| 查看循环日志 | ralph loops logs <id> |
| 实时跟踪日志 | ralph loops logs <id> -f |
| 停止运行中的循环 | ralph loops stop <id> |
| 合并已完成的循环 | ralph loops merge <id> |
| 重试失败的合并 | ralph loops retry <id> |
| 放弃循环 | ralph loops discard <id> |
| 清理陈旧进程 | ralph loops prune |
循环 ID 格式: 支持部分匹配 - a3f2 可匹配 loop-20250124-143052-a3f2
| 状态 | 颜色 | 含义 |
|---|---|---|
| running | 绿色 | 循环正在主动执行 |
| queued | 蓝色 | 已完成,等待合并 |
| merging | 黄色 | 合并进行中 |
| needs-review | 红色 | 合并失败,需要人工干预 |
| merged | 灰色 | 已成功合并(使用 --all 时显示) |
| discarded | 灰色 | 已放弃(使用 --all 时显示) |
循环通过 ralph run 自动启动:
- 主循环:在主工作区运行,持有 .ralph/loop.lock 文件
- 工作树循环:当主循环运行时创建,隔离在 .worktrees/<loop-id>/ 目录中
ralph loops # 有任何循环在运行吗?
cat .ralph/loop.lock 2>/dev/null # 查看主循环详情
ralph loops stop <id> # 优雅停止
ralph loops stop <id> --force # 立即停止
ralph loops discard <id> # 放弃并清理工作树
ralph loops diff <id> # 查看变更内容
ralph loops logs <id> -f # 实时查看事件日志
ralph loops history <id> # 查看状态变更历史
ralph loops attach <id> # 进入工作树 shell
工作树上下文文件(位于 .worktrees/<loop-id>/):
| 文件 | 内容 |
|---|---|
.ralph/events.jsonl |
事件流:帽子选择、迭代、工具调用 |
.ralph/agent/summary.md |
当前会话摘要 |
.ralph/agent/handoff.md |
下一次迭代的交接上下文 |
.ralph/agent/scratchpad.md |
工作笔记 |
.ralph/agent/tasks.jsonl |
运行时任务状态 |
主循环使用仓库根目录下 .ralph/agent/ 中的相同文件。
流程:Queued → Merging → Merged 或 → NeedsReview → Merging (retry) 或 → Discarded
ralph loops merge <id> # 加入合并队列
ralph loops process # 立即处理待合并项
ralph loops retry <id> # 重试失败的合并
读取状态:
jq -r '.prompt' .ralph/loop.lock 2>/dev/null
tail -20 .ralph/merge-queue.jsonl | jq .
RALPH_DIAGNOSTICS=1 ralph run -p "你的提示词"
禁用时零开销。输出目录:.ralph/diagnostics/<YYYY-MM-DDTHH-MM-SS>/
LATEST=$(ls -t .ralph/diagnostics/ | head -1)
SESSION=".ralph/diagnostics/$LATEST"
| 文件 | 包含内容 | 关键字段 |
|---|---|---|
agent-output.jsonl |
代理文本输出、工具调用、结果 | type, iteration, hat |
orchestration.jsonl |
帽子选择、事件、背压 | event.type, iteration, hat |
performance.jsonl |
计时、延迟、令牌计数 | metric.type, iteration, hat |
errors.jsonl |
解析错误、验证失败 | error_type, message, context |
trace.jsonl |
所有带元数据的追踪日志 | level, target, message |
1. 先看错误:
wc -l "$SESSION/errors.jsonl"
jq '.' "$SESSION/errors.jsonl"
jq -s 'group_by(.error_type) | map({type: .[0].error_type, count: length})' "$SESSION/errors.jsonl"
2. 编排流程:
jq '{iter: .iteration, hat: .hat, event: .event.type}' "$SESSION/orchestration.jsonl"
jq 'select(.event.type == "hat_selected") | {iter: .iteration, hat: .event.hat, reason: .event.reason}' "$SESSION/orchestration.jsonl"
jq 'select(.event.type == "backpressure_triggered") | {iter: .iteration, reason: .event.reason}' "$SESSION/orchestration.jsonl"
3. 代理活动:
jq 'select(.type == "tool_call") | {iter: .iteration, tool: .name}' "$SESSION/agent-output.jsonl"
jq -s '[.[] | select(.type == "tool_call")] | group_by(.iteration) | map({iter: .[0].iteration, tools: [.[].name]})' "$SESSION/agent-output.jsonl"
4. 性能:
jq 'select(.metric.type == "iteration_duration") | {iter: .iteration, ms: .metric.duration_ms}' "$SESSION/performance.jsonl"
jq -s '[.[] | select(.metric.type == "token_count")] | {total_in: (map(.metric.input) | add), total_out: (map(.metric.output) | add)}' "$SESSION/performance.jsonl"
5. 追踪日志:
jq 'select(.level == "ERROR" or .level == "WARN")' "$SESSION/trace.jsonl"
SESSION=".ralph/diagnostics/$(ls -t .ralph/diagnostics/ | head -1)"
echo "=== 会话: $SESSION ==="
echo -e "\n--- 错误 ---"
wc -l < "$SESSION/errors.jsonl" 2>/dev/null || echo "0"
echo -e "\n--- 迭代次数 ---"
jq -s 'map(select(.event.type == "iteration_started")) | length' "$SESSION/orchestration.jsonl"
echo -e "\n--- 使用的帽子 ---"
jq -s '[.[] | select(.event.type == "hat_selected") | .event.hat] | unique' "$SESSION/orchestration.jsonl"
echo -e "\n--- 背压触发次数 ---"
jq -s 'map(select(.event.type == "backpressure_triggered")) | length' "$SESSION/orchestration.jsonl"
echo -e "\n--- 终止原因 ---"
jq 'select(.event.type == "loop_terminated")' "$SESSION/orchestration.jsonl"
ralph loops 显示未运行的循环 → 使用 ralph loops prune
.worktrees/ 目录存在但 ralph loops 未列出 → 使用 ralph loops prune 或 git worktree remove .worktrees/<id> --force
循环卡在 needs-review 状态:
1. ralph loops diff <id> — 查看冲突变更
2. ralph loops attach <id> — 手动解决,提交,重试
3. ralph loops discard <id> — 如果不值得修复则放弃
提示“循环已在运行”但实际没有 → rm .ralph/loop.lock(如果进程已死,此操作安全)
jq -s '[.[] | select(.type == "tool_call")] | group_by(.name) | map({tool: .[0].name, count: length}) | sort_by(-.count)' "$SESSION/agent-output.jsonl"
危险信号:许多迭代但事件很少 = 代理未取得进展。
合并过程中进程死亡。解除阻塞:
echo '{"ts":"'$(date -u +%Y-%m-%dT%H:%M:%S.000000Z)'","loop_id":"<loop-id>","event":{"type":"needs_review","reason":"Merge process died"}}' >> .ralph/merge-queue.jsonl
ralph loops discard <loop-id>
git worktree repair
ralph loops prune
ralph clean --diagnostics # 删除所有诊断会话
ralph clean --diagnostics --dry-run # 预览待删除项