---
name: agent-dispatch
description: >-
  User-invoked only: run it when the user explicitly asks to hand work to an external agent CLI,
  never on your own initiative. On enable it probes the machine first — which agent CLIs are on
  PATH, and which LLM each one runs, read from that CLI's own --help / --list-models, never from
  memory or this file — then asks the user, one question at a time, to pick the agents, their
  model modes, and whether to append. It drives the loop after that: a task brief carrying only checked-in artifact paths
  plus an output format, an isolated worktree, a background run, and admission only after the
  calling project's own gates pass. Four rules hold whoever is picked: no self-review, outputs gated
  before merge, briefs carry no secrets or handoff stores, and the current driver may do work but
  never audits this session's output. Use for 派给外部 agent / 换个模型来审 / 调遣 agent. NOT for: doing the work
  yourself, or accepting the output (that stays with the caller), or dispatching where no gates
  were declared — ask first.
slug: agent-dispatch
version: 1.5.6
displayName: agent-dispatch
disable-model-invocation: true
---

# Agent Dispatch（异构 agent 调遣）

外部 agent 是**被调遣的，不是裁定者**：合并权与闸责任始终在主会话。
本仓若另有约束本机制的决策记录（ADR 一类）⇒ **以该仓的决策记录为准**；与本件正文冲突时报用户裁决，不自行取舍。

## 第 0 步：探测本机可支配的 agent（启用即跑）

**每次启用都重探，不缓存上一轮结论**——工具升级会让旗标和模型都变，而规则 12 要求判据输入是当场落盘的命令输出，不是「谁记得」。

1. 探测起点（是搜索名单，不是事实清单）：
   `mcode` `command-code` `pi` `qodercn` `claude` `codex` `gemini` `cursor-agent` `aider`。
2. 逐个 `command -v <cli>`；对存在者跑 `<cli> --help`（或 `-h`）。模型面按这个梯子往下试，**试到底再判「未知」**：
   `--list-models`／`--models` → 模型或 provider 子命令（`models`／`provider list`，能出 JSON 的加 `--json`）→
   该 CLI 自己在用户目录下的**缓存目录文件**（如 `~/.<tool>/cache/*models*.json`，看它的 `source` 与 `updatedAt`）。
   只试一条就下「未知」结论＝探测偷懒（2026-10-05 实测：`mcode` 两条旗标都不支持，但它的缓存 catalog 里模型齐全）。
3. **模型归属只认该 CLI 自己打印出来的**。打印不出、或打印的是别名而不是模型名 ⇒ 表里写「模型未知，须问用户」，
   不得凭记忆、不得拿本文件或其他仓的记录当证据（那正是「二手摘要当依据」的形状）。
4. 非交互调用形同样现场复核：`-p` / `--print` / `exec` 一类，外加限轮、免落盘、结构化输出这些关键开关。
5. 判存活与判死要分清楚：无头模式常以 `node` 为进程名，按进程名 `pgrep -c` 匹配不到，须 `pgrep -f '<cli> -p'`。
6. 探测表**默认不打印**——它是过程产物，不是结论。命令必须真跑、输出真看过，
   但只把结论用于 Q1 候选与注入文本；用户要核、或探测出现自相矛盾时才把表摊开。
   摆出来等点将时：

   | agent | LLM 模型 | 模型来源 | 非交互调用形 | 已知限制 |
   |---|---|---|---|---|

   「模型来源」只允许四种值：**现场打印**（`--help`／`--list-models`／子命令 JSON／该 CLI 的缓存目录文件，四者都算现场）／
   **用户口述**（须这样标，不得冒充现场输出）／ `未知` ／ `清单≠默认`——**清单里有某个模型 ≠ 该 CLI 默认跑它**；
   填 `auto` 或宣称默认值，必须有 current／default 标记作据，否则只能 `固定`（有名）或 `现选`。
   凭记忆、凭上一轮、凭别的仓的记录填模型，仍然一律禁止。
   **表里不设「可用性／能不能审计」这类列**：那是 Q1 选完 agent、Q2 定完模型**之后**才做的判断（见第 1 步末），
   探测阶段只能报事实（有旗标吗、模型自报了吗、清单里有没有默认标记）。提前下结论＝替用户裁决。

7. 探测阶段**不判审计资格**。资格在 Q2 之后判（第 1 步末）。

## 第 1 步：三问定池（一问一答，不合并成一屏），Q2 之后判资格

探测**结论**先出（默认不打印全表，见第 0 步第 6 条），再问。三问各是一次独立询问——合在一屏里问，用户答完第二问就忘了第一问挑了谁。

1. **Q1 选 agent**：多选，候选＝探测命中的那些（每项括号里带上模型与非交互形是否已验）。本技能不替用户挑，也不因为某个「通常更强」就预选它。
2. **Q2 定模型**：对 Q1 选中的每一个 agent 问一次口径，答案空间**三档**（答完直接落成注入文本的模式位 `固定`／`auto`／`现选`）——
   - **固定某模型**：绑死一个；
   - **该 CLI 自己 auto**：由工具内部路由（它 `--list-models` 里标了 current default 才算得）；
   - **多模型皆支持、派单时按任务现选**：列出支持的几个，本件不替它挑，**每次派单前现定**。
   该 CLI 自报过默认值或可列清单 ⇒ 把真实候选写进选项，不要凭空列；答「固定」的模型若 CLI 自己不披露，来源记 **用户口述**，不冒充 CLI 输出。
3. **Q2 末了判资格**：agent＋模型都定了，才对每个说得出「可派活」还是「可当审计者」——
   审计资格两条：① 模型够强（按用户当场认的算，未知即不合格）；② **不审自己那份产出**——含「当前主不审本会话亲笔的产出」
   （同源偏见），但这只关掉「审主会话写的东西」一路，当前主仍可审其他 agent 的产出。
   判完若池里没有够格的审计者，先明说，再问是否收回主会话自做——不悄悄降级去审。判定结果按「谁能审谁」给出，不是一刀切名单。
4. **Q3 定追加**：**先把前缀原样展示给用户**（就是第 2 步那行，尖括号已按实测填好），再问「方括号里要追加什么，还是不追加」。不追加 ⇒ 输出的那行**删掉整个方括号**，不留 `[<用户追加位>]` 空壳。

## 四条硬约束（选谁都成立）

1. **不自审**：干活者与审其产出者必须是不同 agent。合法链示例：A 实现 → B 审计；C 定位 → D 修复 → A 审计。
2. **产出过闸才入库**：
   - 代码类：在隔离 worktree／分支生成（`git worktree add`），主会话复核 diff ＋ 跑**调用方自己声明的门禁命令**，绿了才合入；
   - 报告类：落调用方的草稿位或审计位（见「落点与记账」），主会话署名采纳后才算数；
   - 任何产出**不得由外部 agent 直接 commit 到工作分支**。
   - 调用方没声明过门禁命令 ⇒ **问，不猜**；问不到就把「无法验」当成不收的理由，而不是当成通过。
3. **审计须强模型**：「强」按用户当场认的算，未知即不当审计者。同源风险另计：
   不派「与主会话同一模型／同一渠道」的 agent 来审主会话亲笔的产出（同源偏见）。
   审计已派出后才发现该 agent 不合资格 ⇒ 产出作废不入账，换合格者重派。
4. **同源不审亲笔**：当前主可以接普通产出／定位／扫描任务，也可以审别的 agent 的产出，**唯一不做的是审主会话
   亲笔写出的东西**（同源偏见，硬约束 1 的延伸）。为此起后台前须知道两件事：`currentTool`（当前 CLI）与
   `currentModel`（其模型）；调用方未传 ⇒ 起跑前必问「当前主是？」，未答不得起。


## 任务书格式（＝冻结工件＋产出格式，不给会话上下文）

```
角色：<实现者|定位者|修复者|审计者|扫描员|调研员>
仓库：<仓库根路径，派单时现场填>（分支/worktree：<路径>）
当前主：currentTool＝<X> / currentModel＝<Y>   # 让接单的 agent 知道自己的角色边界
输入工件（只读这些，全部已入库）：
  - <路径1>（作用：<一句话>）
  - <路径2>
任务：<一段话，单一目标>
产出要求：<文件路径＋格式；定位/审计类＝发现清单（位置/证据/影响/建议），不改码>
禁止：改输入工件；引用未列出的文件作依据；commit/push。
```

长任务书一律先写入临时文件再引用／传入，防 shell 引号与反引号被吃掉。

## 落点与记账（照调用方仓的约定，不自造）

草稿位／审计位／记账位三处：调用方有约定就照它，没有就问一句。
不自建目录、不把「本仓恰好这么用」当成通用规范、不静默不落账。

## 安全约定

- 只给已入库或本可公开的工件路径；交接存储、暂存区、凭据文件（含其配置项）一律不给。
- 任务书本身过脱敏心检：不写凭据值、内网地址、带用户名的绝对路径。

## 第 2 步：产出一行「会话注入文本」（三问完成后，去向由用户定）

三问完成后，**照下面模板逐字产出一行**交给用户，让「本会话用哪些 agent」在会话里可见：

```
外部 agent 调遣见技能 agent-dispatch（工具池：<cli>@<model>(<模式>)、<cli>@<model>(<模式>)…；当前主：<cli>@<model>；不自审（审计者≠产出者，当前主不审本会话产出））[<用户追加位>]
```

- **尖括号由本技能生成**：`<cli>` 取第 0 步 `command -v` 命中的；`<model>` 取该 CLI 自己 `--help`／`--list-models` 打印的；打印不出就写 `模型未知`——**不许填空、不许凭记忆补**。
- **`<模式>` 只有三个取值**，来自 Q2 的答案，一一对应：`固定`（绑死一个模型）／ `auto`（该 CLI 自报的 current default，由工具内部路由）／
  `现选`（多模型皆支持，**每次派单前先定用哪个**）。模式位不是旁注，它有两处实际作用：
  ① `现选` 的 agent 派单前须先定模型，否则会被默默取列表第一个；
  ② 硬约束 3 判「够不够格当审计者」要有具体模型名——`现选` 未定之前，它不接审计任务。
- **工具池只列 Q1 里用户选中的 agent**：探到但没被选的**不写**——探测表是候选清单，注入文本是本会话的生效池。把没选的一起列进去，下一个读者就分不清哪些真可用（还会让人误以为没选的也能直接派）。
- **「当前主」是硬约束 4 的输入**：写进注入文本后，本会话后续派单不必再问一遍。
- **前缀固定带「不自审（审计者≠产出者，当前主不审本会话产出）」**：这条每次派单都要守，写进来就不会随对话变长而被忘掉。另外三条（产出过闸才入库／审计须强模型／同源不审亲笔）不塞进这行——它们各有自己的触发点（过闸在主会话、强模型看模式位、当前主已在行内），重复一遍只会让这行变长。
- **注入文本不带来源旁注**：`〔用户口述〕`、`〔现场打印〕` 这类标注留在第 0 步的探测表里（那才是可核的地方），这行只给结论——它是给会话读的，不是给审计读的。
- **`[<用户追加位>]` 是占位不是内容**：用户没写就**整块删掉（含方括号）**，不留空壳；他写了什么，本技能不校核、不改写、不代他决定内容。
- **去向由用户定**：本件**不写任何仓内文件**（`AGENTS.md`、项目配置都不写）。他要把这行长期留下，得他自己搬；只在本会话用，留在对话里就够。
- **换会话即失效**：新会话重新探测、重新产出这行——工具与模型会变（规则 12：判据输入是当场命令输出，不是上一轮记录）。

## 首派流程

1. 探测（第 0 步）→ 摆表。
2. 三问定池（第 1 步）：选 agent → 定模型 → 定追加。
3. 产出注入文本（第 2 步）交用户，去向他自己定。
4. 核 currentTool／currentModel（注入文本里有就直接用，没有先问）。
5. 写任务书到临时文件，含「currentTool＝X / currentModel＝Y」声明。
6. 后台运行（长任务用 `run_in_background`），按第 0 步第 5 条的姿势判存活。
7. 收产出 → 按类型过闸（代码类：diff 复核＋调用方门禁；报告类：主会话署名采纳）。
8. 结果与闸判定按调用方约定记账。
9. 清理 worktree／临时文件。

## 失败兜底

- 非交互旗标失效（工具升级）：`--help` 现场复核，本次改用复核到的调用形，并记坑（若本仓有坑账）。
- 产出不合格：同一 agent 同一任务不重派超过 2 次；第 3 次换一个或收回主会话自做，记坑。
- 外部 agent 越权改动（碰了禁止项）：丢弃产出、复原工作区、记坑。
- 池空（全被排除／全不合资格）：收回主会话自做，并说明为什么没有可用 agent——不得为凑池放宽硬约束。

## 已验证实例

各仓的实际接线形态（工具池、门禁命令、落点）外挂于 `references/verified-instance.md`，按需读、非必需路径。
**只作形状参考**：启用时仍以第 0 步现场探测为准，模型与旗标都不从那里抄。
