generic-mapreduce · git:20261011.db52efe · 2026-10-11 · sha256 c7d9fd6b22ffe732

generic-mapreduce git:20261011.db52efeA

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

---
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` |
| 摘要太长,占满上下文 | 简报里写明行数上限;下次拆得更细 |