loop(bro)是一个策略型技能,全部执行机制位于 bro CLI 中。它的用途是让智能体无人值守地把 backlog 从头到尾处理完,适用触发场景包括“run the backlog”“bro flow loop”,以及对开放的 beads 执行 hands-off 的 /goal。与 /next 只调度一个 bead 不同,bro flow loop 会运行队列直至耗尽,流程为:claim → worktree → agent → 推入 gate stack → 重复,不再逐项询问“是否继续”,即 backlog 的存在本身就是批准。
主要能力
- 智能体配置:可通过 providers 注册表配置,例如 type 为 acp、command 为
kilo --acp的条目,并以loop.provider指定;acp 条目会生成bro acp-worker(由协议驱动的 stdio ACP 服务器,天然无头)。cli 条目则用其命令替代模板。选择优先级为:--provider/--agent <name>标志 → fleet.profiles 预设(--profile、loop.profile)→loop.provider→agents.native.provider;--model与--auto-approve用于调节该通道。 - 按 bead 路由:声明
fleet.routing后,每个被领取 bead 的类别会选择各自的 provider 链;class:<name>标签优先,无类别走 default,--class <name>可把整轮固定到某一类别。解析出的类别会作为来源记录在BRO_AGENT_CLASS。解析出的类别若不在表中属于配置错误;default 会在首次 claim 前预检,错误的class:标签会将该 bead 挂起而非静默降级。fleet.router(shadow/enforce)按判定结果给无类别 bead 分类。 - 原始模板:
loop.agent(或未命名任何 provider 的--agent值)是逃生口,例如devin --prompt-file {promptFile} -p;{promptFile}会替换为 bro 写入新 worktree 的工单文件路径,无占位符则把路径追加为最后一个参数。进程环境会携带BRO_BEAD_ID、BRO_BEAD_TITLE、BRO_PROMPT_FILE(provider 通道还会固定BRO_AGENT_PROVIDER、BRO_AGENT_MODEL)。模板--agent优先于配置的loop.provider,且完全绕过fleet.routing(会有警告行)。 - 其他 loop 键:
bootstrap(每个 worktree 运行一次)、stallMin(检查点输出静默的提示标志,绝不作为 kill)、mergeTimeoutMin、fixRounds、maxItems、maxOpen(gate stack 的开放 PR 上限,默认 3)、worktreeMb/diskMinSlots(磁盘下限)、batch/batchMinPriority(批量参数)。
使用方式
常用命令包括:bro flow loop(运行队列直到空闲或受门禁阻塞)、--max N(本轮最多 N 个 bead)、--max-open N(限制开放 PR 数)、--disk-min-slots N(磁盘下限,默认 2,0 禁用)、--dry-run(只打印顶部条目计划,不做改动)、--agent '<tpl>'(一次性覆盖)、--provider <name>、--class <name>、--label a,b(限定可领取范围)、--batch N(批量领取同亲和 bead)、--merge-timeout MIN、--interval SEC。
每个 bead 的处理过程:claim 取 bd ready 顶部条目(HUMAN GATE bead、epic、molecule 步骤不会被自动领取);在 origin/main 上建立分支 loop/<id> 的兄弟 worktree <repo>--<bead-id>,并执行一次 bootstrap;把工单提示写入 worktree 后运行智能体至完成(无逐智能体墙钟,stdout/stderr 追加到 <git-common>/bro/loop/<slug>.log,<slug>.json 记录固定 pid);PR 通过 gh pr list --head 发现并加入 gate stack,不阻塞队列;每个 tick 从最旧的 gate 开始处理,再在 loop.maxOpen 有空位时推入下一个 bead。绿了则 bro review act merge,有讨论线程则带线程列表重启智能体,CONFLICTING 则对 PR base 发起 rebase,BEHIND 作为唯一阻塞则 update-branch。合并后 bd close <id> --reason "landed via PR #N",删除 worktree 和分支。
适用场景与限制
适用于在可信机器和仓库上无人值守地批量处理 bd 就绪任务,支持限定标签范围(如“只跑债务 bead”)、批量聚合、按类别路由。限制与注意事项:自由权限标志(如 devin 的 --permission-mode dangerous --respect-workspace-trust false)会跳过人工确认并赋予智能体完全自主权,应仅在信任环境使用;每个仓库只应运行一个 bro flow loop,否则会竞争同一批顶部 bead(claim 原子,输者只取下一个,属浪费);开放 PR 集合受 loop.maxOpen 限制,独立分支在共享文件上漂移快,建议保持上限紧凑或使用 --stack;推送还受磁盘下限限制,低于阈值时暂停;同一轮内不会重复领取已尝试的 bead;loop 在 idle、gated 或达到 --max N 时结束并报告原因;失败会以 loop: 注记可见呈现,停滞的 PR 会把 bead 挂起并进入 deferred snooze(默认 2 小时,0 表示直到 bd undefer),worktree 保留作恢复缓存;每次退出(idle、gated、error)会自审并列出所有遗留尾部(开放 PR、保留的 worktree 与分支、仍为 in_progress 的 bead、清理失败),干净运行会打印 clean。在新仓库上建议先 --dry-run 验证智能体模板与 worktree 路径。