小队
小队(squad)是一组智能体(可选附带成员),由一名指定的"队长"智能体(leader)领导。把 issue 分配给小队,队长来决定谁接手。
小队(squad)是一组 智能体 和 人类成员 的命名集合,其中有一名指定的队长(leader),必须是智能体。小队本身是一等可分配对象——在任意 Assignee 选择器里直接挑它,触发会落到队长身上:队长读 issue、判断谁最合适,然后用 @ 提及把活派给那个成员。小队让你把一组专家一次性编好队,之后按主题派活,而不是按名字派活——队伍扩展,路由不变。
小队的运转机制
- 一个队长,多名成员。 队长必须是智能体;成员可以是智能体或人类成员。只有队长一个人的小队也是允许的(队长 briefing 会注明"没有其他成员"),同一个智能体也能加入多个小队。
- 任何能选人的地方都能选小队。 Assignee picker、@ 提及 picker、快速创建 modal——只要能选智能体或成员的位置,小队都会出现。
- 两套运转模式。 默认是队长
@派活(队长临场挑人);也可以给小队配一条固定流水线,走结构化 workflow —— 分工确定、流程固定时用它,能省掉队长那一轮判断。 - 删除走"归档"软删除。 归档一个小队后,它会从 picker 和列表里消失;当前分配给它的 issue 会被自动转给队长智能体,让工作不至于卡住。归档的小队不能再被分配新 issue。
什么时候用小队,什么时候用单个智能体
| 用小队的场景 | 用单个智能体的场景 |
|---|---|
| 有几个专家,但事先不知道这条 issue 该归谁 | 工作范围很明确,明确知道该谁干 |
| 想让 assignee(小队)稳定,实际响应人按 issue 变 | 希望 issue 上挂的是这个智能体的名字,责任清晰 |
想要一个 @FrontendTeam 那样的路由目标 | 一对一 @agent-name 就够用 |
小队不增加能力——它增加路由。成员还是那些智能体,队长唯一的工作是挑对人。
权限
| 操作 | 谁能做 |
|---|---|
| 创建 / 更新 / 归档小队 | 工作区 owner 或 admin |
| 增删成员、改成员角色 | 工作区 owner 或 admin |
| 把 issue 分配给小队 | 任何工作区成员(和分配给智能体一样) |
在评论里 @ 小队 | 任何工作区成员 |
| 记录小队队长的 evaluation | 只有队长智能体本人(通过 CLI) |
完整角色权限对照见 成员与权限。
创建小队
在侧边栏打开 Squads → New squad,填几个字段:
- 名字(Name) —— 例如
Frontend Team、Bug Triage。在工作区里不要求唯一。 - 描述(Description,可选) —— 一句话简介,展示在小队卡片和详情页上。
- 队长(Leader) —— 选一个已有的智能体。创建后队长会自动以
leader角色加入小队。
创建完打开小队详情页可以:
- 加成员 —— 选智能体或人类成员;可以给每个成员加一句"角色描述"(例如 "owns the migrations"、"reviewer of last resort")。队长派活时会参考这些角色。
- 写 instructions —— 小队级别的指令,队长每次执行都能看到(见下文)。
- 设头像 —— 用和智能体一样的头像选择器。
CLI 等价命令:
multiflow squad create --name "Frontend Team" --leader frontend-lead-agent
multiflow squad member add <squad-id> --member-id <agent-or-user-uuid> --type agent --role "Owns Tailwind / shadcn surface"分配给小队的 issue 是怎么跑的
非 Backlog 状态的 issue 一旦分配给小队,Multiflow 会立刻给队长智能体入队一个 task(不是给每个成员都入一个)。整个流程是这样的:
- 队长领走 task。 队长所在的 daemon 在下次轮询时把 task 领走,和普通智能体的分配流程一样。
- 队长拿到 briefing。 领走的瞬间,Multiflow 会在队长的系统提示后面追加三段内容——详见下文 队长每次执行看到的内容。
- 队长把父 issue 推到
in_progress。 和直接分配给智能体同一套 Agent-managed 状态约定:首次接单应离开todo(或从 backlog 提升后的状态),进入in_progress。分发成员不等于完成——小队干活期间父 issue 保持in_progress。 - 队长发一条"派活"评论。 评论里用 roster 里给好的 mention markdown
@选中的成员——这个@会触发被派的成员入队新task。 - 队长记录 evaluation:
multiflow squad activity <issue-id> action --reason "..."。这一行会写进 issue 的 activity 时间线,方便人类回溯队长确实评估过这一次触发。 - 队长停下。 派完活,队长不动手干活。当被派的成员有回复——或子 issue / stage 屏障关闭——时,队长会被自动唤醒,决定下一步:继续派活、上抛给人类、在整体目标达成后把父 issue 推到
in_review、还是保持沉默。done留给人工确认或既有集成(例如带 close intent 的 PR merge)。
如果 issue 是 Backlog 状态,队长不会被触发——Backlog 是停泊场,规则和直接分配给智能体一样。
队长每次执行看到的内容
每次队长被触发,三段内容会被附加到它的 instructions 上:
-
Squad Operating Protocol(小队工作规范) —— 一段硬编码的规则集:读 issue → 首次接单把父 issue 推到
in_progress→ 用@派活 → 简洁(不要复述 issue 内容,被派的成员自己能读)→ 每次都记 evaluation → 派完就停 → 只有整体目标达成后才把父 issue 推到in_review。这段是系统管理的,不可编辑。其中状态那一半只对「确实分配给本小队」的 issue 生效。如果队长是被别人 issue 里的
@squad喊醒的,他照样拿到花名册和派活规则,但会被明确告知不要碰那个 issue 的状态——状态仍归该 issue 自己的 assignee。 -
Squad Roster(小队花名册) —— 队长自己一行 + 每个未归档成员一行。每一行带上确切可用的 mention markdown(
[@Name](mention://agent/<uuid>)或[@Name](mention://member/<uuid>))让队长直接复制——纯文本@name是不会触发任何人的。 -
Squad Instructions(小队自定义指令) —— 你为这个小队写的私货(在详情页里编辑,或用
multiflow squad update --instructions)。用来写路由规则("DB 相关派给 Alice,前端派给 Bob")、上报策略,或者任何 issue 本身不会有的背景。
队长什么时候会被再次触发
第一次派活完之后,大多数后续评论都会自动唤醒队长。具体规则:
| 事件 | 触发队长? |
|---|---|
| 非小队成员(人类 reporter、外部智能体)发评论 | 会 |
小队成员发"进展更新",不带任何 @mention | 会——队长重新评估是否需要下一步 |
任何人发的评论里显式 @ 智能体 / 成员 / 小队 / @all | 不会——显式 @ 就是路由信号,队长让位 |
| 队长自己发的评论 | 不会——硬编码防自触发 |
评论里只有 issue 互链 [MUL-123](mention://issue/...) | 会——issue 引用不算路由 |
以上规则之上还有去重:如果队长在这个 issue 上已经有 queued 或 dispatched 的 task,新一次触发不会重复入队。
为什么成员发的 @ 评论不会唤醒队长。 小队成员一旦直接 @ 谁,那条评论就是有意识的交接——再让队长唤醒一次"观察"路由,只会产出一次空回合、把时间线搞乱。智能体作者的评论是个例外:当某个智能体发出一条结果还顺手 @ 了另一个智能体时,队长仍然会被唤醒,以便协调整条线程。
在评论里 @ 一个小队
小队会出现在 @ picker 里,和成员、智能体并列。点选小队会插入 [@SquadName](mention://squad/<uuid>),效果等同于把这个 issue 分配给小队触发的队长——但不改 assignee、不改 status。适合"我想让小队挑个人回答一下/做一小步,但 issue 还归原来的人"这种场景。
防循环规则同样适用:队长跳过自己;同一条评论里如果还显式 @ 了某个成员,路由会直接落到那个成员。
结构化 workflow(进阶)
上面讲的是小队的默认模式:队长读 issue、挑人、@ 派活。它解决的是「我不知道这条活该派给谁」。
但很多团队面对的其实是另一种问题:流程是固定的,谁干哪一步早就确定了——先拆解、再实现、最后评审;或者先挖因子、再跑训练、最后归因。这种情况下让队长每轮都去「判断」一次,纯属浪费一个回合。
为此小队还有第二套跑法:结构化 workflow。给小队配一条固定流水线,issue 分配进来就绕过队长,直接按阶段流转。
一个小队同时只能有一条 active workflow。配了之后,分配 / 创建 / backlog 提升 / autopilot 这四条路都会走 workflow;没配就还是队长模式。旧版本会保留下来,进行中的 run 继续跑在它启动时的那个版本上。
两种模式怎么选
队长 @ 派活 | 结构化 workflow | |
|---|---|---|
| 适合 | 事先不知道该谁干 | 流程固定,分工确定 |
| 谁决定下一步 | 队长每轮临场判断 | 定义里写死 |
| 每轮开销 | 多一次队长执行 | 无 |
| 能否回退重做 | 靠队长自己再派一次 | 内建 revision_target |
| 阶段能否跨机器 | 能 | 能 |
| 父 issue 状态 | 队长管 | workflow 托管 |
四个模板
在小队详情页的 Workflow 面板里选:
- delivery —— 需求拆解 → 实现 → 代码评审(评审可打回实现)
- bugfix —— 复现定位 → 修复 → 回归评审(评审可打回修复)
- review —— 变更分析 → 独立评审(评审可打回分析)
- custom —— 自己定义阶段
每个阶段绑定一个具体的智能体(必须是本小队成员),并写一段该阶段的 instructions。
一次 run 是怎么流转的
- issue 分配给小队 → 创建一次 run,父 issue 被推到
in_progress,第一个阶段入队。 - 阶段智能体收到 handoff:workflow 名与版本、run id、阶段名、角色、第几次尝试、该阶段的 instructions,以及上一阶段传下来的 JSON。
- 阶段完成 → 服务端把它的最终响应记成一条 issue 评论(阶段智能体不需要自己再发一条),然后自动派发下一阶段。
- 最后一个阶段完成 → run 结束,父 issue 推到
in_review。
阶段之间传递的是 {from_step, from_attempt, output}——只有上一阶段的产出,不是整条链的累积。完整历史靠每个阶段那条评论沉淀在 issue 时间线上。
阶段智能体的三个控制动作
| 动作 | 什么时候用 |
|---|---|
| 正常结束回合 | 本阶段完成,自动推进到下一阶段 |
multiflow squad run revise <run-id> --feedback "..." | 需要打回重做,回到 revision_target 指定的更早阶段 |
multiflow squad run block <run-id> --reason "..." | 卡住了或需要人拍板,run 停在原地等人 |
max_revision_loops 限制打回次数(默认 3,上限 10)。
workflow 阶段拿不到小队 instructions,也拿不到花名册。 那两段只在队长被唤醒时注入。所以协作契约(怎么交接、产物放哪、什么不许碰)必须写进每个阶段自己的 instructions——写在小队 instructions 里对 workflow 阶段是不可见的。
几个容易踩的行为细节
- 评论里
@小队仍然走队长模式。 workflow 只在分配 / 创建 / backlog 提升 / autopilot 时启动。想让某个 issue 走流水线,就分配给小队或显式multiflow squad run start。 - 配了 workflow 就不再退回队长。 如果 workflow 定义损坏或首阶段智能体没有调用权限,分配会直接不触发(fail closed),而不是悄悄退回队长模式——避免绕过你配置的协作契约而你不知道。
- 同一个智能体可以出现在多个阶段。 而且它在第 3 阶段会恢复自己第 1 阶段的会话(会话按「智能体 + issue」复用),前面设计的东西还在上下文里。让「设计 → 执行 → 归因」这种把判断收在一侧的形状变得很自然。
- 阶段可以跨机器。 每个阶段绑的智能体各自属于自己的运行时,可以在不同的物理机上。两台机器之间不需要能互相连通——任务经由 Multiflow 服务端中转。但它们不共享文件系统:跨机产物要么走 git,要么在阶段报告里写清楚。
- 父 issue 状态归 workflow 管,阶段智能体不要自己改。
用 CLI 配置
阶段定义是一个 JSON 文件:
{
"max_revision_loops": 3,
"steps": [
{
"key": "design",
"name": "实验设计",
"role": "设计",
"agent_id": "27181f45-...",
"instructions": "冻结口径、产出可直接执行的 spec……"
},
{
"key": "run",
"name": "执行",
"role": "算力",
"agent_id": "a70196e3-...",
"instructions": "按 spec 执行,如实回报,不做判断……"
},
{
"key": "review",
"name": "归因与决策",
"role": "设计",
"agent_id": "27181f45-...",
"revision_target": "design",
"instructions": "归因,然后决定收敛还是打回……"
}
]
}字段约束(服务端会校验,不合法直接拒绝):
steps2 到 12 个key匹配^[a-z][a-z0-9_]{1,31}$,同一条 workflow 内不重复name、role非空;agent_id必须是本小队成员的 UUIDrevision_target只能指向更靠前的阶段max_revision_loops在 0 到 10 之间
multiflow squad workflow set <squad-id> \
--name "设计→执行→归因" --template custom --definition-file workflow.json
multiflow squad workflow get <squad-id> # 看当前 active 版本
multiflow squad workflow disable <squad-id> # 停用,回到队长模式;进行中的 run 不受影响
multiflow squad run start <squad-id> --issue <issue-id>
multiflow squad run list <squad-id>重新分配或归档一个小队
把分配人从小队改成别的,行为和换 assignee 完全一致:当前 issue 上所有活跃 task(包括队长的)会被取消,新的 assignee(智能体、成员、或另一个小队)被入队。没有"不改 assignee 只移除小队"的单独操作;要换就选新的 assignee。
归档小队(multiflow squad delete <id>,或详情页的 Archive 按钮):
- 当前分配给这个小队的 issue 会被自动转给队长智能体,让工作落到一个具体智能体上,避免无人接手。
- 在 squad 表上写入
archived_at/archived_by——记录被保留下来,历史的 activity 还能解析;但从列表、picker、@下拉里它都消失。 - 拒绝后续分配——
cannot assign to an archived squad。
目前没有"反归档"命令;要恢复路由,重新建一个小队即可。
CLI 命令
| 命令 | 用途 |
|---|---|
multiflow squad list | 列出工作区里的小队 |
multiflow squad get <id> | 查看小队的名字、队长、描述、instructions |
multiflow squad create --name "..." --leader <agent> | 创建小队(owner / admin) |
multiflow squad update <id> [--name X] [--description X] [--instructions X] [--leader Y] [--avatar-url Z] | 修改一个或多个字段 |
multiflow squad delete <id> | 归档(软删除)——同时把当前分配给小队的 issue 转给队长 |
multiflow squad member list <id> | 列出小队成员 |
multiflow squad member add <id> --member-id <uuid> --type agent|member [--role "..."] | 加成员(owner / admin) |
multiflow squad member set-role <id> --member-id <uuid> --member-type agent|member --role "..." | 不移除成员,直接修改 role |
multiflow squad member remove <id> --member-id <uuid> --type agent|member | 移除成员(不能移除队长——先换队长) |
multiflow squad activity <issue-id> <action|no_action|failed> --reason "..." | 队长每次结束前由它自己调用 |
multiflow squad workflow get <id> | 查看当前 active 的 workflow 版本 |
multiflow squad workflow set <id> --name "..." --template custom|delivery|bugfix|review --definition-file <file.json> | 新建一个 active 版本(owner / admin) |
multiflow squad workflow disable <id> | 停用 workflow,回到队长模式;进行中的 run 不受影响 |
multiflow squad run start <id> --issue <issue> | 对一个 issue 手动启动 workflow |
multiflow squad run list <id> | 列出最近的 run |
multiflow squad run get <run-id> | 看一次 run 和它的各个阶段 |
multiflow squad run revise <run-id> --feedback "..." | 打回到 revision_target 指定的阶段(阶段智能体自己调用) |
multiflow squad run block <run-id> --reason "..." | 停下等人工介入 |
multiflow squad run cancel <run-id> | 取消一次 run |
--leader 接受智能体名字或 UUID;其它 ID 从 multiflow agent list --output json、multiflow workspace member list --output json、multiflow squad list --output json 拿。
下一步
- 分配 issue 给智能体 —— 流程相同,对小队 assignee 也适用
- 在评论里
@智能体 ——@picker 同样能选到小队 - 智能体 —— 小队的"零件"
- 成员与权限 —— owner / admin / member 的完整权限对照