Stephen 技术博客

AI和数据平台的工程实践

← 返回文章列表
多 AGENT 编排 · ORCHESTRATOR / WORKER

4. Polly 编程模型架构

一个"只动脑不写码"的编排大脑,把任务拆解、分派给独立 worktree 中自治跑到 green 的编码子 Agent,人只做目标确认与 PR 合并

一句话定位:Polly 是一个 Orchestrator / Worker 形态的多 Agent 编程模型。 中央的 Polly Brain 负责拆解、分派、验证、集成,但自己从不写业务代码; 真正的实现由多个编码子 Agent(Workers)完成,每个 worker 在独立的 git worktree 里自治运行, 跑到测试全绿后各自开出 PR。所有派发都要穿过 runner 侧的 Guardrails / tool gate, 而人类只在两端出现:下达目标 / 确认 plan gate审阅并合并 PR——Polly 永远不自己 merge。

Polly 编程模型架构 — Orchestrator / Worker 多 Agent 👤 Human 目标 / plan gate 审阅 & 合并 PR Polly 大脑 (Orchestrator) — harness: claude-sdk · context 1M · 不写代码 🧠 Polly Brain 拆解 · 分派 · 验证 · 集成 文档 / skill 直写 编排工具 sys_session_send sys_read_inbox · sys_cancel_task sys_os_* · gh CLI Skills (可组合) investigate · fanout cross-review .polly/registry.json 任务 / worktree / PR 状态 Dispatch 协议 sys_session_send( title=任务名, args.purpose, args.model) purpose ∈ implement / review / explore / search Guardrails / Policies — runner 侧 tool gate (nessie) blast_radius gate_pushes:false DENY force-push / rm -rf / / hard-reset spawn_bounds max_dispatches _per_turn: 5 purpose_guard allowed: implement / review / explore / search ask_timeout 86400s (1 天审批窗) 编码子 Agent (Workers) — 各自独立 git worktree (.worktrees/<id> · branch polly/<id>) · 自治跑到 green · 各开各的 PR claude_code harness: claude-native bypassPermissions 主力实现:多文件 / 重构 / 测试 codex harness: codex-native 窄而明确的改动 pi (headless) harness: pi · 任意 gateway 模型 评审 / 探索专家 (read-mostly) 跨厂商评审 (cross-review) Claude → codex / pi codex → claude / pi pi → claude / codex 只给 diff + 验收契约, 不指 worktree; reviewer 只报问题不改码 PR (交付物) gates 绿 + 零 blocking → ready 目标 / plan gate 确认 读写状态 dispatch (每 tool_call 过 gate) sys_session_send(purpose, model) 每 worker 一个 worktree inbox 唤醒 (异步·事件驱动·不轮询) sys_read_inbox 收结构化结果 gh pr create (implementer 自开) 人审阅 & merge (Polly 永不 merge)

图 1 · Polly 编程模型全景:人 → Brain → Guardrails → Workers → PR → 人,构成一个事件驱动的闭环

1Polly 大脑(Orchestrator)

只动脑、不落地——负责思考与协调,把动手的事全部外包出去。

🧠 Polly Brain

跑在 claude-sdk harness 上,拥有 1M context,承担四件事:拆解、分派、验证、集成。 它可以直接写文档和 skill,但刻意不写业务代码——业务代码一律交给 worker,避免大脑既当裁判又当选手。

大脑手里握着三类能力:

  • 编排工具:sys_session_send(派发)、sys_read_inbox(收结果)、sys_cancel_task(撤销)、sys_os_*gh CLI。
  • 可组合 Skills:investigate(深挖)、fanout(扇出并行)、cross-review(跨厂商评审)。
  • 状态注册表:.polly/registry.json 持久化记录每个任务、worktree 与 PR 的状态,大脑与 skills 双向读写它作为唯一事实源。

2Dispatch 协议 — 怎么派活

所有分派收敛到一个调用,四个语义化 purpose 覆盖全部工作类型。

sys_session_send(
  title   = 任务名,
  args.purpose = implement | review | explore | search,
  args.model   = <选定模型>
)

implement 实现 review 评审 explore 探索 search 检索

把"派什么活"约束成一组封闭的 purpose,既让大脑的意图显式化,也让下游的 Guardrails 能按 purpose 做策略判断(见下)。

3Guardrails / Policies — runner 侧闸门

每一次 tool_call 都要穿过 runner 侧的 tool gate(nessie),越权即拦。

策略作用效果
blast_radius限制破坏半径gate_pushes:false;DENY force-push / rm -rf / / hard-reset
spawn_bounds限制并发扩散max_dispatches_per_turn: 5,防止一轮炸出过多 worker
purpose_guard限制任务类型仅允许 implement / review / explore / search
ask_timeout审批窗口86400s(1 天),超时即失效
关键点:闸门在 runner 侧而非大脑侧执行——即使大脑或某个 worker "想"越界,策略也会在工具层直接拒绝,安全边界不依赖 agent 的自觉。

4编码子 Agent(Workers)

每个 worker 一个独立 git worktree(.worktrees/<id> · 分支 polly/<id>),自治跑到 green,各开各的 PR、互不干扰。

claude_code — 主力实现

harness: claude-native · bypassPermissions。承担多文件改动、重构、写测试等重活。

codex — 窄改动

harness: codex-native。适合范围窄、边界明确的改动。

pi (headless) — 评审 / 探索专家

harness: pi,可接任意 gateway 模型,以 read-mostly 方式做评审与探索。

5跨厂商评审(cross-review)

让不同厂商的 agent 互相审查,靠异构性发现单一模型的盲区。

评审关系是交叉的:Claude → codex / picodex → claude / pipi → claude / codex。给 reviewer 的只有 diff + 验收契约,不告诉它 worktree 在哪;而且 reviewer 只报问题、绝不改码——实现与评审彻底分离。

6端到端闭环

  1. 人 → 大脑:下达目标,确认 plan gate。
  2. 大脑 → 闸门:sys_session_send(purpose, model) 派发,每个 tool_call 过 gate。
  3. 闸门 → Worker:放行后,每个 worker 分到一个独立 worktree,自治实现直到测试全绿。
  4. Worker → 大脑:通过 inbox 异步唤醒大脑(事件驱动、不轮询),sys_read_inbox 收结构化结果。
  5. Worker → PR:implementer 自己 gh pr create;gates 绿 + 零 blocking → ready。
  6. PR → 人:人审阅并 merge——Polly 永不自己 merge
设计取舍一句话:大脑集中"想",worker 分布式"做",闸门在工具层"守",人只在目标与合并两端把关。隔离(worktree)、异步(inbox)、异构(cross-review)、封闭权限(guardrails)四者叠加,让多 agent 并行既跑得快又不失控。
Polly 编程模型架构 · Orchestrator / Worker 多 Agent · 配图见图 1