agent-dispatch · v1.5.6 · 2026-10-05 · sha256 5ef24b0fff7c0d7b

agent-dispatch v1.5.6A

Immutable. This exact content never changes and is served at /api/v1/blob/5ef24b0fff7c0d7b.

---
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 步现场探测为准,模型与旗标都不从那里抄。