37万星的开源项目这样管 PR:拆解 openclaw 的自动化审查流水线 Caclawphony
37万星的开源项目这样管 PR:拆解 openclaw 的自动化审查流水线 Caclawphony
openclaw 在 GitHub 上有 37.5 万颗星、7.8 万个 fork。每天涌入大量 PR,靠人工逐一审查根本不现实。他们的解决方案是一个叫 Caclawphony 的内部工具——基于 OpenAI 的 Symphony 框架,用 Elixir 写的一条全自动 PR 审查、修复、合并流水线。
本文拆解它的架构设计、流水线状态机、以及人类检查点的精妙平衡。
本文提纲
- 什么是 Caclawphony
- 流水线状态机:8 个阶段,3 个人类检查点
- Symphony:调度引擎的核心抽象
- WORKFLOW.md:把策略版本化
- 关键设计决策
- 对开源维护者的启发
什么是 Caclawphony
Caclawphony 是 openclaw 团队为自己的主仓库 openclaw/openclaw 搭建的 PR 自动化审查系统。它不是通用框架,而是一个维护者工具,专门处理 openclaw 仓库的 PR 生命周期。
整个系统架在三个组件上:
- Linear:项目管理看板,每个 PR 对应一个 Issue
- Symphony(OpenAI 开源):调度框架,轮询 Linear 并分派 Codex Agent
- Codex:OpenAI 的编程 Agent,执行具体的审查、修复、合并操作
用一句话概括:把 PR 变成 Linear Issue,让 Agent 跑完整个审查流程,人类只在关键节点介入。
流水线状态机:8 个阶段,3 个人类检查点
Caclawphony 的核心是一个精心设计的状态机。一个 PR 从进入到关闭,要经过这些状态:
Triage → Todo → Review → Review Complete → Prepare → Prepare Complete → Merge → Done每个状态做什么:
| 状态 | 谁执行 | 做什么 |
|---|---|---|
| Triage | Agent | 轻量级分析:PR 聚类检测、重复识别、基本健康检查。不需要 clone 仓库 |
| Todo | 🧑 人类 | 维护者审查 triage 结果,决定下一步 |
| Review | Agent | 完整的 PR 审查,生成结构化审查报告 |
| Review Complete | 🧑 人类 | 维护者审查 Agent 的审查结果,决定路由 |
| Prepare | Agent | Rebase、修复 BLOCKER/IMPORTANT 级问题、跑测试、推送(同时只允许 1 个) |
| Prepare Complete | 🧑 人类 | 维护者确认修复结果 |
| Merge | Agent | 确定性 squash merge,带署名和 co-author 信息 |
| Done | 终态 | PR 已合并或关闭 |
还有三条旁路:
- Request Changes:Agent 在 GitHub 上发起
request-changes,PR 退回给作者 - Closure:Agent 关闭 PR(重复、过期、无效),附带结构化评论
- Duplicate:标记为重复 PR,附带评估说明哪个是主 PR
graph LR
A[Triage] -->|Agent| B[Todo]
B -->|Human gate| C[Review]
C -->|Agent| D[Review Complete]
D -->|Human gate| E[Prepare]
E -->|Agent| F[Prepare Complete]
F -->|Human gate| G[Merge]
G -->|Agent| H[Done]
D -->|Route| I[Request Changes]
D -->|Route| J[Closure]
I --> K[Backlog]3 个人类检查点(Human Gate)的设计非常克制:不是每一步都让人类签字,而是在 Agent 做完高风险操作后、下一步不可逆之前才介入。这样既保证了安全,又不让维护者变成瓶颈。
Symphony:调度引擎的核心抽象
Symphony(2.47万星,Elixir 写的,Apache 2.0 协议)是 OpenAI 开源的 Agent 调度框架。它的核心思路是:把项目管理看板变成 Agent 调度系统。
Symphony 不关心你的 Agent 具体做什么,它只负责:
- 轮询:每隔 30 秒扫描 Linear 看板,找出处于活跃状态的 Issue
- 隔离:为每个 Issue 创建独立的工作空间(workspace)
- 调度:按配置的并发限制分派 Codex Agent
- 恢复:Agent 崩溃后自动重试,支持指数退避
- 收敛:Issue 状态变了,立即停掉对应的 Agent 运行
系统架构分 6 层:
graph TB
subgraph "Symphony Architecture"
L[Policy Layer - WORKFLOW.md]
C[Config Layer - typed getters]
O[Coordination Layer - orchestrator]
E[Execution Layer - workspace + agent]
I[Integration Layer - Linear adapter]
V[Observability Layer - logs]
end
L --> C --> O --> E
O --> I
O --> V最关键的设计是:Workflow 策略存放在仓库的 WORKFLOW.md 文件里,跟着代码一起版本化管理。团队改 Agent 行为不需要改调度器代码,改 Markdown 就行。
WORKFLOW.md:把策略版本化
Caclawphony 的 WORKFLOW.md 是整个系统的灵魂。它用 YAML frontmatter 定义运行时配置,Markdown body 定义 Agent prompt。举几个关键配置:
并发控制:
agent:
max_concurrent_agents: 4 # 最多 4 个 Agent 并行
max_concurrent_agents_by_state:
prepare: 1 # Prepare 状态同时只跑 1 个(资源限制)
test: 1 # Test 同样限 1 个Workspace Hook(PR 进入工作空间后执行):
hooks:
after_create: |
# Triage 阶段轻量级,不需要 clone 仓库
if [ "$SYMPHONY_ISSUE_STATE" = "Triage" ]; then
copy_skills
echo "Triage enrichment -- skipping repo clone"
exit 0
fi
# 其他阶段才 clone 仓库 + checkout PR 分支
git clone /path/to/openclaw .
PR_NUM=$(echo "$SYMPHONY_ISSUE_TITLE" | grep -oE '#[0-9]+' | head -1 | tr -d '#')
gh pr checkout "$PR_NUM" --force人类检查点(Agent 完成后暂停,通知维护者):
gates:
review_complete:
assignee: "maintainer-user-id"
notify: true
prepare_complete:
assignee: "maintainer-user-id"
notify: true通知(通过 Telegram 推送检查点提醒):
notifications:
telegram:
bot_token: $TELEGRAM_BOT_TOKEN
chat_id: $TELEGRAM_CHAT_ID
gate_states: [Review Complete, Prepare Complete, Pre-merge]这种"配置即代码"的思路意味着:审查策略的每一次变更都有 git 记录,可以 review、回滚、A/B 测试。
关键设计决策
GitHub 是审查状态的唯一真相源
Triage Agent 检查 gh pr reviews 来判断是否已有 CHANGES_REQUESTED 审查,以及作者是否推送了新 commit。这避免了 Agent 重复审查已经解决的问题。
Agent 不主动发言
一个硬性规则:Agent 只有在 Request Changes 状态下才被允许在 GitHub 上评论。其他所有状态,Agent 只在 Linear Issue 里工作。这是对开源社区的基本尊重——维护者的名字挂在项目上,不能让 Agent 乱说话。
重复 PR 要写评估报告
当一个 PR 被标记为重复时,Agent 不会简单关闭了事,而是生成一条结构化评论,解释:
- 为什么判定为重复
- 主 PR 是哪个,优势在哪
- 被关闭的 PR 有哪些独特修复可能丢失
这种细致程度,比很多人类维护者做得都好。
聚类检测用多信号搜索
Triage 阶段的聚类不是简单标题匹配,而是综合多个信号:影响范围、关键词、修改文件、关联 Issue。Agent 会运行 pr-plan --live 刷新 PR 缓存,再用 pr-cluster 逐 PR 搜索。
对开源维护者的启发
Caclawphony 给了一个可复用的模式:大流量开源项目的 PR 管理可以做到"人类只做决策,机器做执行"。
具体来说:
- Symphony 是通用框架,不绑定 openclaw。任何团队都可以用自己的
WORKFLOW.md定义流水线 - Codex 可替换,Symphony 的 Agent Runner 是抽象层,理论上可以换成 Claude Code、Cursor 等其他编程 Agent
- Linear 可替换,当前版本只支持 Linear,但架构设计了 Integration Layer,未来可以适配 GitHub Projects、Jira
- Elixir 的容错能力天然适合长时运行的调度服务——轻量级进程、监督树、热代码升级
当然也有局限:Caclawphony 本身不是通用工具,它硬编码了 openclaw 仓库的 Linear 状态 ID、标签体系、技能文件路径。想用到自己的项目,需要 fork 后改造。但 Symphony 框架本身是通用的,WORKFLOW.md 的规范也是通用的——这才是真正值得关注的底层基础设施。
作者: itech001
来源: 公众号:AI人工智能时代
网站: https://www.theaiera.cn/
每日分享最前沿的AI新闻资讯和技术研究。
本文首发于 AI人工智能时代,转载请注明出处。