---
name: generic-mapreduce
description: '把一件“要读很多东西”的事拆成几块，并行派给只读的子 agent（mapper），各交一份带出处的摘要，再由你汇总。贵，慎用。只在用户明确输入 /generic-mapreduce 时使用，agent 不要自己调用。关键词：mapreduce、并行、分块阅读、调研、分散 RCA、读代码、读知识库、头脑风暴。'
argument-hint: '要并行读或调研的问题'
disable-model-invocation: true
type: workflow
specificTo: generic
---

# MapReduce：并行分块阅读

你拆任务、派发、收摘要、汇总。一批只读的子 agent（`mapper`）各读一块。它换来的是并行和干净的上下文，代价是用量：经验上是自己做的几倍。

## When to Use This Skill

**只有用户输入 `/generic-mapreduce` 才用。** 你不能自己调用它。你觉得值得并行时，可以告诉用户“这件事适合 `/generic-mapreduce`，大概多花几倍用量”，由用户决定。

只做“读”的事：

- 调研：几个互不相关的方向各查一遍。
- 分散的 RCA：几个可能的原因，各看各的日志和代码。
- 分散地读代码或知识库：几个模块、几个 domain，各出一份摘要。
- 头脑风暴：同一个问题，几个不同的角度各想一遍。

**不做“写”的事。** mapper 没有编辑工具，也没有终端。要并行改文件，不用这个技能。

## Prerequisites

- 用户这一条提示输入了 `/generic-mapreduce`。hook 靠它放行；没有它，调用 `mapper` 会被拒绝。
- 一次最多派几个 mapper，由 `.harness/policies/task.json` 的 `mapreduce.max_agents` 定。hook 会数，超了就拒绝。
- 不需要先开任务。接着任务时，汇总可以写进任务目录。

## Step-by-Step Workflows

### 1. 先判断值不值

照 [值不值](references/worth-it.md) 里的表判断。三条都满足才值：

- 各块之间不需要对方的结论。
- 每一块都要读很多东西。
- 你只需要每块的摘要，不需要原文。

不值，就直说原因，建议你自己顺序做，然后停下等用户决定。不要为了用上这个技能硬拆。

### 2. 告诉用户要花多少，等他同意

值的话，给用户看这三样，然后**停下等他回答**：

- 拆成哪几块（每块一句话：问题、范围）。不超过上限。
- 这很贵：每个 mapper 是一个独立会话，要重新读一遍材料。总用量大约是你自己做的几倍。
- 你建议派几个。能少就少。

用户说可以，再往下。用户改了拆法，照他的来。

### 3. 派发

- 在**同一条回复里**一次调用全部 mapper，它们才会并行。
- 每个调用消息照 [简报模板](templates/brief.md) 写：问题、范围、要交的。mapper 看不到你的对话，简报要写全。
- 各块的范围不要重叠。
- 调用被 hook 拒绝：照拒绝理由做，不要换别的子 agent 重试。

### 4. 汇总

- 读每份摘要。结论要带出处（文件路径和行号）；没有出处的，标成“未核实”。
- 摘要之间有矛盾：把两边都写出来，自己去读那几行原文再判断。不要挑一个顺眼的。
- 有 mapper 说“简报缺”或“没查到”：告诉用户缺哪块，由用户决定要不要再来一次。不要自己再派。
- 给用户的汇总：先结论，再每块的要点和出处，最后是没查到的和不确定的。
- 接着任务时：把汇总写进任务目录（例如 `RESEARCH.md`），并更新 `TASK.md`。

## Gotchas

- **不要自己调用这个技能，也不要在没有它的时候调用 `mapper`。** hook 会拒绝，理由里写着怎么办。
- **不要把要“共用一份理解”的事拆开。** 例如改一个设计的三个部分：各块会各想各的，合不到一起。
- **不要派去读你自己读得完的东西。** 三五个文件自己读更快、更便宜。
- **不要让 mapper 下最终结论。** 它只看到一块。结论由你汇总后下。
- **不要超过上限，也不要分几轮绕过上限。** 用完了就用已有的摘要完成。
- **mapper 的摘要不是事实。** 关键结论要自己核对出处的那几行。
- **派出去之后，不要自己再把同一批文件读一遍。** 那是花两份钱。等摘要回来，只读要核对的那几行。

## Troubleshooting

| 问题 | 处理方式 |
| --- | --- |
| 调用 `mapper` 被拒，理由是用户没有输入 `/generic-mapreduce` | 你不能自己开。告诉用户可以输入它 |
| 被拒，理由是次数用完 | 用已有的摘要完成；不够就告诉用户缺什么 |
| mapper 没有并行，一个接一个跑 | 要在同一条回复里一次发出全部调用 |
| mapper 没运行，也没有报错 | 它的模型比主模型贵一档时平台不运行它。告诉用户，换主模型或改 `mapper.agent.md` 的 `model` |
| 摘要太长，占满上下文 | 简报里写明行数上限；下次拆得更细 |
