# Parallel Dispatch

> 并行调度与子分身机制总规则（2026-08-14 用户裁定正式版；2026-08-16 增补 PARALLEL-GATE 门禁与文件数量纲）。只要出现多任务（≥2 个子任务/诉求）即强制触发并行判定并输出 [PARALLEL-GATE] 声明，无触发词依赖；任务拆解产生 ≥2 个无依赖子任务时默认主动并行 spawn 子分身，只评估不执行视为故意串行化。量纲唯一化：任务量只用文件数量评估（禁用小时/体感）。双维决策：规模轴（≤3文件→轻分身 / >3文件或契约耦合→task_breakdown 定档 / >10文件且M/L→引擎级分身）× 数量轴（2~5→subagent 扇出 / 6~9→分组扇出 / ≥10 或批量同类→workflow 编排）。含三槽契约（PRE-SPAWN/RECEIPT/MERGE）、最小探针、母体合并校验、时点分层、禁止清单。

- Skill: `xu-jin-cs/parallel-dispatch` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add xu-jin-cs/parallel-dispatch`
- Raw SKILL.md: https://api.skillmd.com/api/skills/xu-jin-cs/parallel-dispatch/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: xu-jin-cs (https://skillmd.com/u/xu-jin-cs)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/xu-jin-cs/parallel-dispatch

---


# parallel-dispatch — 并行调度与子分身机制总规则

> **定位：** 本规则是所有"多任务并行 / 子分身"决策与执行的唯一权威入口，整合全局调度裁定、`rules/01_workflows.md` 规则 16/17/18/19/20/22/33、retro-pm-124 探针经验，以及 Kimi Code 原生分身能力（Agent / AgentSwarm / 后台任务；历史工具名映射见第 28 行注记）。
> **自动触发：** 命中下方「场景自动匹配表」任一行时，无需用户显式指令，主动按本规则执行。

---

## 一、总则（2026-08-14 用户裁定五条铁律；2026-08-16 增补第 0 条门禁与量纲裁定）

0. **PARALLEL-GATE 强制门禁（2026-08-16 用户裁定，最高优先；2026-08-15 增补单刀双掷开关机械执行）**：**只要出现多任务（≥2 个子任务/诉求，任何来源），首轮规划必须先输出结构化声明，再谈执行**：
   ```
   [PARALLEL-GATE] 子任务数:N | 无依赖:M | 判定:parallel/sequential | 机制:subagent×M / workflow / 串行(依赖链理由)
   ```
   判定 `sequential` 必须写明依赖链理由，留空即违规。**本门禁无触发词依赖**——多任务出现即触发，不要求用户说"并行"；声明同步载于全局 `AGENTS.md` 调度裁定节（每会话在场，不依赖本技能是否被加载）。

   **分身闸定位与 A/B 殊途同归（2026-08-23 用户终裁）**：分身闸（单刀双掷 dispatch_switch）**是并行闸的最后一步程序**，无条件触发、单任务亦扳（开关自判串行/轻量）。闸内强制流程：任务量分析（文件数唯一量纲）→ 依赖链判定 → 分片条件判定（规模轴×数量轴）→ 掷点输出。**不管判 A 还是判 B，符合条件即生成子分身**——掷点 B 仅是串行拓扑（分片照切、分身照生，按依赖链顺序调度执行），不是免分身旁路；串行结论同样是分身判定全程跑完的产物，不是绕过判定的豁免通道。拓扑（依赖决定）与分身生成（分片条件决定）是两个独立维度。
   **触发时点锚定（2026-08-24 用户裁定）**：整个 parallel-dispatch 并行闸**追加在任务步骤方案制定完成之后触发**——核心场景：任务清单/步骤方案创建完毕 → 并行闸逐项分析上游依赖（无依赖、或上游依赖已完成 → 可并行）→ 闸内最后一步扳 `dispatch_switch.py` 掷点。**无论判 A 判 B，哪怕串行，任务量评估（文件数唯一量纲）都必须跑**；符合分片条件的照常切片走子分身。本条锚定的是并行闸的挂载时点，与上方 2026-08-23 终裁（末步程序、A/B 殊途同归）配套：方案未完成不触发，方案一完成即强制触发。
   **单刀双掷开关机械执行（2026-08-15 裁定）**：声明的判定**禁止手写**，必须扳动开关照抄输出：
   ```bash
   python3 scripts/dispatch_switch.py --files <文件数> --units <无依赖单元数> [--coupled [--dep-type contract|artifact]] [--batch] [--force-serial --dep-reason "依赖链理由"] --desc "<任务描述>"
   ```
   开关四态：退出码 `0`=掷点 A（执行并行，照抄声明后立即扇出，禁止只评估不执行）；`2`=掷点 B（合法串行，多任务串行理由已备案留痕）；`3`=CLARIFY（信号不足，禁止扳动，先澄清三要素）；`4`=VIOLATION（多任务判串行却无 `--dep-reason`，或掷点 A 前置缺失，开关拒绝扳动——要么补理由要么改判 A）。多任务想串行的唯一合法通道是 `--force-serial` + `--dep-reason`。
   > **Kimi Code 适配（2026-08-24 迁移）：** 本技能已在 Kimi Code 环境执行。工具名映射：`todo_write`→`TodoList`、`subagent`/`subagent_fork`→`Agent`、`workflow`→`AgentSwarm`。会话日志定位顺序：`--session-log` 显式指定优先 > mtime 活跃启发式；Kimi 日志 `~/.kimi-code/sessions/*/*/agents/main/wire.jsonl`（纯文本）与 旧版 `session.jsonl.zstd` 双格式由 `scripts/session_log_compat.py` 统一解析，子分身日志为同 session 目录 `agents/<id>/wire.jsonl`。
   **掷点 A 机械前置三道闸（2026-08-16 用户裁定"用扳手解决概率触发问题"，N 值按收益拐点量化）**：判 A 时开关自检当前会话日志（权威来源 `--session-log` 显式指定，缺省按 mtime 活跃启发式自动定位），三道闸全过才放行：
   - **闸1 清单登记**：本 turn 必须已存在 todo/write 事件且清单条目数 ≥ 扇出单元数——未登记或覆盖不全即 exit 4 拒扳，须先 `todo_write` 登记全部子任务再重扳。GUI 任务面板/进度展示不再依赖模型自觉。
   - **闸2 基线存在**：有效文件数 ≥4（对齐规模轴 ≤3 免评估）时必须 `--baseline <路径1,路径2>` 携带统一上下文基线文件，且逐个机械核验真实存在且非空——缺失即 exit 4。治"各分身上下文不一致→合并冲突返工"。
   - **闸3 探针实证**：扇出单元 ≥6 时必须存在 30 分钟内已完成往返的扇出类调用实证——缺失即 exit 4，先前台派 1 个极小探针任务再重扳。治 retro-pm-124"通道盲扇出"。**N=6 为收益拐点量化值：净收益 f(N)=p·C·N−c−摩擦(N)，探针成本 c≈0.3 路、通道故障率 p≈5%（retro-pm-124 实证）→ N*=c/p≈6，恰与数量轴 6~9 分组档起点重合，双轴同数。**
   **扇出收尾闸（2026-08-16 用户裁定"概率即扳手"原则）**：凡本 turn 扳过掷点 A 或登记过任务清单，**终答前必须扳收尾闸照抄输出**：
   ```bash
   python3 scripts/fanout_seal.py   # --session-log 显式指定优先，缺省自动定位当前会话
   ```
   三道机械校验：① **真扇出**——本 turn 每次掷点 A 留痕必须有 subagent/subagent_fork/workflow 调用实证，无实证即"只评估不执行"违规；② **全销号**——本 turn 最终 todo/write 清单必须全部 completed，残留 pending/in_progress 逐条列出；③ **基线阅读**——掷点 A 携带的基线文件，本 turn 每个子分身日志必须有其引用，未读分身逐个列出（"上下文脱基线"）。exit `0`=SEAL 方允许终答；`4`=VIOLATION 逐条整改后重扳；`3`=CLARIFY 补 `--session-log`。每次扳动留痕 `~/.agents/logs/dispatch_switch.jsonl`，B/A 比率纳入复盘审计——每月运行 `python3 scripts/dispatch_switch_audit.py`（分布与 B/A 比率/冒烟批剔除/注水嫌疑/ALERT 告警，`--strict` 时有 ALERT 则 exit 1，供月度复盘门禁）。
1. 任务分解产生 **≥2 个无依赖子任务** 时，**默认主动并行 spawn 子分身，无需用户显式指令**；只评估不执行视为故意串行化（对齐规则 33）。
2. 是否用分身只看两条：① 任务量是否值得拆；② 当前场景是否支持分身（Kimi Code 原生支持 Agent 子分身，默认满足）。**任务量量纲唯一化（2026-08-16 裁定）：只用文件数量评估，禁用小时/体感估算**（第三节矩阵）。
3. 扇出前先行 **最小探针** 验证分身通道可用，探针失败直接串行（对齐 retro-pm-124）。
4. **母体职责不可省**：统一上下文基线 + 合并校验（时点分层见第五节）。
5. 合并方向（会话级分身实践 vs 引擎级机制）不设限，以解决问题为准；可机械化的校验成果只沉淀进**技能/规则层**（`~/.agents/skills/`、`~/.agents/rules/`），**禁止下沉进引擎代码/引擎规则层**（2026-08-15 用户裁定：引擎需可对外分发，他人可能使用自己的引擎，私有规则硬编码只会带来冲突——坚持轻量化、通用）。

---

## 二、场景自动匹配触发表

命中任一信号即进入本规则的决策矩阵（第三节），主动触发，不等指令：

| # | 场景信号 | 自动动作 |
|---|---------|---------|
| 1 | `task_breakdown` 拆解后产出 ≥2 个子任务 | 立即做依赖判定，无依赖项默认标记 `parallel` 并立即 spawn（规则 33：评估只是入口，并行才是目的） |
| 2 | 用户一句话内提出多个互不相干的诉求（"顺便把 A、B、C 都…"） | 按无依赖子任务处理，直接扇出 |
| 3 | **`多任务：` 编号清单句式**（"多任务：1干什么 2干什么 3干什么…"，2026-08-17 用户裁定） | **有几个编号就生成几条 todo 清单并直接并行，不再逐项确认**：① `todo_write` 登记 N 条（N=编号数）→ ② 扳 `dispatch_switch.py`（PARALLEL-GATE）→ ③ 同一 assistant 消息内一次性扇出 N 路。用户声明"多任务"即已确认无上游依赖 |
| 4 | 触发词：并行 / 分身 / 子分身 / 扇出 / 批量 / 同时做 / 多任务 / 拆任务 | 加载本规则，走双维决策 |
| 5 | 批量同类操作（N 个文件审计、N 个页面截图解析、N 条数据迁移） | 数量轴判定：≥10 必须切 workflow 编排 |
| 6 | SPM/DPM 产出 PRD + 接口契约后，测试设计 / 前端 / 后端三方可启动 | 按规则 17 三方并行（引擎驱动则禁止手动串行指派） |
| 7 | UI 设计完成的 M/L 档任务 | 按规则 18/22 层级化并行（顶层 3 Agent × 各拆 3 子 Agent，同层 ≤9） |
| 8 | 子任务需要基于当前会话已发生的上下文继续深挖（跟进分析/复审/续作） | 选 `subagent_fork`（继承会话），不选 `subagent` |
| 9 | 用户显式要求 Ralph / fresh-agent 迭代 | 才允许走 `ralph`；其余场景禁止主动启用 |

> **定义边界（2026-08-17 用户裁定）：多任务并行 ≠ 子分身。** **多任务并行**＝N 个**异构独立任务**（如"生成 PPT / 整理数据 / 画图 / 改造框架"，内容完全不同、互不依赖），每个任务一路，直接并行；**子分身**＝母 Agent 把**同一类内容切分**给多个分身执行**相同步骤**（同质批量，内容不同步骤相同）。映射到双维矩阵：异构多任务走数量轴 2~9 的 subagent 扇出；同质内容切分才走"批量同类"轴（≥10 切 workflow）。禁止把异构多任务误当子分身做内容切分，也禁止把同质切分误当异构多任务逐路人肉 spawn。

---

## 三、双维决策矩阵（规模轴 × 数量轴，量纲 = 文件数量）

> 机械探针：`python3 scripts/dispatch_probe.py --files <文件数> --units <无依赖单元数> [--coupled] [--batch]` 离线输出档位/机制/扇出数/拓扑 JSON，并自动生成 `[PARALLEL-GATE]` 声明文本；信号不足时强制输出 `clarify` 澄清提示。**门禁场景请直接用单刀双掷开关 `dispatch_switch.py`**（探针的上层封装：A/B 双掷点 + B 档理由强制 + 留痕），探针本体保留给纯档位评估复用。

### 规模轴（第一分流点，纯文件数判定，2026-08-16 量纲裁定）

| 档位 | 判定标准（数出来的，不是感觉的） | 分身机制 |
|------|---------|---------|
| 免评估 | **≤3 个文件**，且无跨模块契约/状态耦合 | **会话级轻分身**：直接 subagent 扇出 + 探针 + 母体合并，禁止做重评估空耗 |
| 需评估 | **>3 个文件**，或存在契约/状态耦合（**不论文件数**） | 先 `task_breakdown` 定档 → **S 档**：仍走轻分身（或按规则 19 关闭分身，单 Agent 串行）；**M/L 档**：走引擎级分身机制（第七节） |
| 引擎级 | **>10 个文件** 且 task_breakdown 定档 M/L | 引擎级分身机制（第七节），机械校验走 engine |

**单文件特例**：一个文件内部的多修改点**不拆分身**（避免文件级写冲突），按串行处理；同文件多修改点可用规则 24（一条消息内并行多个 Edit）。

### 耦合前置细分：契约先行分片（2026-08-17 用户裁定，REFORM-GATE 判 A 落地，块文件 `~/.agents/logs/reform_gate_block_contract_sharding_20260817.md`）

声明 `--coupled` 之前必须先分耦合类型，禁止笼统"有耦合→串行"：

| 耦合类型 | 定义 | 判定 |
|---|---|---|
| **契约耦合** | 片间只共享 API/接口契约（端点路径、请求响应字段、组件文件名）——典型：后端 API / 前端页面 / 导航接线三片 | **先冻结契约（30 秒写死字段清单），冻约后各片视为无依赖 → 并行扇出**；仅构建/验证等消费前序产物的节点串行收口 |
| **产物耦合** | 后片真实消费前片产出的文件/状态（读前片写的表、改前片创建的文件） | 走原 coupled 路径：task_breakdown 定档 / `--force-serial`+`--dep-reason` |

开关侧：`dispatch_switch.py --coupled --dep-type contract` → 冻约提示 + 按无耦合并行判定；`--dep-type artifact` 或缺省 → 原 coupled 语义不变。实证反例：2026-08-17 ETL 备份前后端集成 6 文件笼统 `--coupled` 判 B 全串行，构建期才暴露存量 tsc WIP 错误——契约耦合误判串行即缺斤短两。

### 数量轴（第二分流点："扇出多少路"，N = 无依赖独立单元数，按文件/按批计数）

| 数量 | 形态 | 机制 |
|------|------|------|
| 2~5 个 | 异构任务 | `subagent` 直接扇出，**同一assistant消息内一次性并行发出**，禁止逐个串行 spawn |
| 6~9 个 | 异构/分组 | subagent 扇出，按角色分组（规则 16：FE 归 FE、BE 归 BE）；同层 >9 须 PM 显式审批 |
| **≥10 个或批量同类** | 同质批量 | **必须切 `workflow` 脚本编排**（一段 JS 管 N 个分身、结构化结果一次回收），禁止逐个人肉 spawn 把主会话卡死在 prompt 开销与通知洪峰上 |

---

## 四、会话级分身机制（原生能力速查，工具名映射见首节注记）

### 4.1 `subagent` —— 独立上下文分身（默认首选）

- **默认后台运行**：调用后立即返回 durable id，主会话继续干独立工作，不阻塞等待。
- **prompt 必须自包含**：子分身看不到本会话，目标、输入文件路径、约束、产出格式、验收标准一次给全。
- **结果回收**：子分身 settle 后运行时会自动送来结果通知；未到齐前禁止忙轮询。
- **续派与中止**：`send_message` 在同一子会话开启新轮次（用于回报后整改续派）；`interrupt_agent` 仅中止当前轮。
- **仅当主会话下一步动作依赖其结果时**才设 `run_in_background: false`。

### 4.2 `subagent_fork` —— 上下文继承分身

- 子分身携带本会话全部已完成轮次（看不到在飞轮），适合跟进分析、复审、在既有结论上续作。
- 其余语义与 `subagent` 相同（默认后台、可续派）。

### 4.3 `workflow` —— 脚本编排（≥10 / 批量同类专用）

- 一段 JS（**非 TypeScript**，无 `export`），顶层 await，`return <JSON 值>` 作为结果。
- 元信息走 `meta` 参数：`name`（kebab-case）+ `description` 必填，`phases` 可选。
- 钩子：
  - `agent(prompt, {schema?, label?, phase?})` — 跑一个分身；带 `schema` 时返回校验后的结构化对象；失败resolve为 `null`（用 `.filter(Boolean)` 过滤）。
  - `pipeline(items, ...stages)` — 每 item 独立走完全部 stage，**无屏障**（多阶段首选）；单 stage 抛错仅丢弃该 item。
  - `parallel(thunks)` — 全并发 + 屏障，仅当后续 stage 确需全部前序结果时才用；抛错的 thunk resolve 为 `null`。
  - `phase(title)` / `log(msg)` — 进度叙事；`args` 读取调用入参。
- schema 仅允许 type/properties/required/additionalProperties/items/enum/const/oneOf（无 pattern/format/数值界）。钩子误用会直接杀死整个脚本，不会降级为单 item null。

### 4.4 `ralph` —— fresh-agent 循环（仅显式指令）

- 每轮开启无会话种子的全新子分身，共享工作区作为长期记忆，轮间仅传递有界结构化报告。
- **仅当用户明确要求 Ralph / fresh-agent 迭代时启用**；普通长任务用 goal 工具，有界委派用 subagent/workflow。

### 4.5 后台 job（长命令）

- `bash run_in_background: true` 返回 job id；`job_output` 收集（仅在真正被阻塞时 `wait: true`）；`job_kill` 终止不再需要的 job。
- 每个后台 job id 必须登记跟踪；终答前收齐所有相关 job，禁止重复起同名 job。

---

## 五、母体职责与时点分层

### 5.1 上下文基线（不可省）

所有并行子分身必须读取同一上下文基线：`pm_plan.json` + `task_slice_plan.json` / `dev_task_breakdown.json` + `.prd.md` + `.ui-proto.json`（按任务类型取适用项）。禁止各自为政。**（已机械固化：dispatch_switch 闸2 强制 `--baseline` 文件真实存在；fanout_seal 校验3 逐个核验子分身日志引用过基线文件，未读即点名违规）**

### 5.2 时点分层（2026-08-14 用户提示）

| 时点 | 动作 |
|------|------|
| 单任务回报时 | 只做**轻量收据**：扫摘要，发现问题才即时 `send_message` 续派整改（早返工可与其他在跑任务并行） |
| 最后一路到齐后 | **一次执行正式合并校验**：文件级冲突 + 契约级冲突 + 数据格式级冲突 + 完整性差集（全域大纲比对） |

禁止逐路重复验收仪式空耗上下文。

### 5.3 探针（扇出前置）

最小探针验证分身通道可用（如先派 1 个极小任务确认回报链路）；探针失败直接转串行执行，并在回报中说明（retro-pm-124）。**（已机械固化：dispatch_switch 闸3，扇出 ≥6 路强制 30 分钟内探针往返实证，N=6 为收益拐点量化值 c/p≈0.3/0.05）**

---

## 六、分身生命周期三槽契约（2026-08-16 新增，协议风格对齐 expert-router slots-protocol）

分身全生命周期固定三个挂载点，**纯规则层契约，不改平台原生代码**；各调用方按协议接入，分身质量不依赖 prompt 临场发挥。

### SLOT-PRE · 任务书槽（扇出前）

每个分身 spawn 前必须按六字段模板组装任务书（自包含，分身看不到母体会话）：

| 字段 | 内容 |
|---|---|
| ① 目标 | 一句话说清要交付什么 |
| ② 输入路径 | 上下文基线文件绝对路径清单（第五节 5.1） |
| ③ 约束 | 禁止触碰的范围、目录安全铁律、依赖边界 |
| ④ 产出格式 | 交付物路径 + 格式要求 |
| ⑤ 验收标准 | 可机械判定的完成条件 |
| ⑥ todo 义务 | 开工先自建 todo 清单并随进展更新（禁止清单 11） |
| ⑦ 结果落盘路径（2026-08-17 用户裁定「结果落盘制」；2026-08-20 增补暂存区路径模板，REFORM-GATE v2 判A） | 母体为每片指定结果文件绝对路径；分身必须将最终结构化回报**同时写入该文件**——返回值/通知仅作信号，母体收编以落盘文件为准。单片失败/取消/中断即弃该片，**禁止连坐丢弃其他分身已落盘成果**（用户原话：部分分身出事很正常，不能同时丢弃其他分身已完成的任务，那些事有价值）。**路径模板（2026-08-20 根源治理，防顶层残渣）：落盘路径必须指向暂存区 `<项目根>/.fanout/<YYYYMMDD-HHMM>/` 或任务指定的 `archive/` 子目录，禁止指定项目顶层**——产物从诞生起不进顶层，收编后暂存区整体一次 mv 入 archive 或删除清场（实证：2026-08-20 治理 fanout 自身 4 个 _gov 文件落顶层，与 7/25 三十三个 _partial_ 同一根源动作） |

### SLOT-RECEIPT · 回报槽（分身回报时）

分身最终汇报必须为结构化 JSON，母体机械校验，不合格即时 `send_message` 续派整改：

```json
{
  "status": "done|partial|blocked",
  "artifacts": ["<产物绝对路径>"],
  "deviation": "<与任务书的偏差说明，无则空串>",
  "blocker": "<阻塞点，无则空串>",
  "todo_final": "<任务清单完成状态：N/M 完成>"
}
```

**机械校验（2026-08-16 REFORM-GATE item2 裁定）：回报是否合格禁止手写判定**，必须扳动校验脚本照抄结论：
```bash
python3 scripts/receipt_check.py --receipt <回报.json>   # 或 stdin 喂入
# 退出码 0=五字段契约全部满足 / 1=违例并逐条列出（status 枚举、artifacts 数组与路径存在性、deviation·blocker·todo_final 字段存在）
```
门禁场景走 gate-switch 包装：`gate_switch.py --spec ~/.agents/skills/receipt_gate/scripts/specs/receipt_gate.json --set receipt=<回报.json>`。判 1 即续派整改，禁止肉眼放行。

**结果落盘核验（2026-08-17 落地）：母体收编每路时先扳 `gate_switch.py --spec ~/.agents/skills/shard_result_gate/scripts/specs/shard_result_gate.json --set result=<任务书⑦路径>`，判 A（结果文件真实存在且非空）才收编；判 B 即该路成果未落盘，按任务书续派补落盘或标记该路损失——其余各路已落盘成果照常收编，不连坐。**

### SLOT-MERGE · 合并槽（最后一路到齐后，一次执行）

四道校验一次性过完，禁止逐路重复验收：① 文件级冲突（两分身改同一文件）② 契约级冲突（接口/Schema 不一致）③ 数据格式级冲突 ④ 完整性差集（全域大纲比对，漏项即补派）。

**机械校验（2026-08-16 REFORM-GATE item2 裁定）：①④两道禁止手写判定**，必须扳动校验脚本照抄结论：
```bash
python3 scripts/merge_check.py --manifest <分身A清单.json> <分身B清单.json> ... --expect <期望产物清单.txt>
# manifest 格式：{"agent":"<分身名>","changed_files":["<绝对路径>",...]}；expect 清单一行一个绝对路径
# 退出码 0=无文件级冲突且产物完整 / 1=违例并列出冲突文件与缺失差集
```
门禁场景走 gate-switch 包装：`gate_switch.py --spec ~/.agents/skills/merge_gate/scripts/specs/merge_gate.json --set manifests="a.json b.json" --set expect=<清单>`。**②契约级与③数据格式级冲突为纯语义判断，留软层由母体人工校验**（自杀开关：纯语义不造门），禁止伪造机械结论。

---

## 七、引擎级分身机制（M/L 档专用）

- 前置：`task_breakdown` 产出 `task_slice_plan.json`，标注估时、验收标准、依赖、技术栈。
- 层级化并行（规则 18）：顶层 3 Agent（测试/前端/后端）× 各拆 3 子 Agent，同层 ≤9，超限须 PM 显式审批。
- 提出并行分叉/汇聚等结构性方案前，必须先读引擎代码确认底层支持（规则 25 教训：引擎 `next_agents[0]` 不支持多数组调度的回滚事故）。

---

## 八、依赖判定与拓扑标记（规则 33 执行细则）

- **完全无依赖** → 标记 `parallel`，必须立即 spawn 并行；不得以任何理由改串行。
- **部分无依赖** → 依赖链串行、无依赖部分并行，形成混合拓扑。
- **全依赖链 / 资源冲突** → 标记 `sequential` 串行，禁止强行并行；必须在 `task_slice_plan.json` 的 `execution_topology` 字段写明依赖链理由。
- 禁止在依赖关系未判明前盲目并行。

---

## 九、禁止清单（违例即视为故意串行化或违规并行）

1. 禁止"只评估不执行"：产出并行评估报告后不触发实际并行。**（已机械固化：fanout_seal.py 收尾闸校验本 turn 掷点 A 留痕必须有真实扇出调用实证，无实证即违规拒答）**
2. 禁止以"先评估看看""等下一轮再并行""稳妥起见串行"为由拖延。
3. 禁止用轻分身扛 M/L 档大需求；禁止对免评估小需求做重评估空耗。
4. 禁止 ≥10 路逐个人肉 spawn（必须 workflow 编排）。
5. 禁止跳过依赖判定盲目并行；禁止全依赖链强行并行。
6. 禁止跳过母体合并校验直接推进下游；禁止子分身绕过母体直接汇报（规则 20）。
7. 禁止引擎离线时静默降级为软执行。
8. 禁止忙轮询后台分身/job（完成自动通知），禁止重复 spawn 已在跑的任务。
9. 禁止无显式指令主动启用 ralph。
10. 禁止把本规则的任何判定逻辑下沉进引擎代码/引擎规则层（2026-08-15 用户裁定：轻量化、通用方向，引擎对外分发不携带私有规则）。
11. 禁止分身进度黑盒（2026-08-14 archmap 项目复盘裁定）：分身任务书必须固定两条——①开工先自建 todo 清单并随进展更新；②最终汇报必须附任务清单完成状态。母体须把各分身子任务拆进自己的 todo，保证母体/分身/用户三方进度透明，禁止只有一个"进行中"黑盒。**母体侧已机械固化（2026-08-16 裁定）：`dispatch_switch.py` 掷点 A 前置强制校验本 turn todo/write 实证（条目数 ≥ 扇出单元数），未登记即拒扳；`fanout_seal.py` 收尾闸强制校验最终清单全部 completed，漏销号逐条列出并拒答。概率触发问题由扳手接管。**
12. **禁止多任务出现时不输出 `[PARALLEL-GATE]` 声明**（2026-08-16 裁定）：≥2 个子任务/诉求即触发，无触发词依赖；判定 `sequential` 而依赖链理由留空，视同违规。
13. **禁止用小时/体感评估任务量**（2026-08-16 量纲裁定）：唯一量纲为文件数量；禁止单文件内多修改点拆分身（文件级写冲突风险）。

---

## 十、规则溯源

| 来源 | 内容 |
|------|------|
| 全局 `AGENTS.md` §多任务并行与子分身默认策略 | 2026-08-14 五条裁定（总则来源） |
| `rules/01_workflows.md` 规则 16 | 依赖判定 / 角色分组 / 上下文基线 / 合并校验 |
| 规则 17 | SPM/DPM 后测试+前后端三方并行（契约先行、引擎驱动） |
| 规则 18 | 层级化 9-Agent 并行与规模控制 |
| 规则 19 | S 档可关分身串行；M/L 档必须 task_breakdown |
| 规则 20 | 任意 Agent 先 task_breakdown，子 Agent 不得绕过母体汇报 |
| 规则 22 | M/L 档前端任务强制并行拆分 |
| 规则 24 | 无依赖修改点一条消息内并行发出多个 Edit |
| 规则 25 | 结构方案前必读引擎代码确认底层能力 |
| 规则 33 | ≥2 子任务即触发并行，评估只是入口 |
| retro-pm-124 | 扇出前最小探针，探针失败直接串行 |
| 2026-08-16 用户裁定 | PARALLEL-GATE 强制门禁（多任务出现即触发）/ 量纲唯一化（只按文件数）/ 三槽契约（PRE-SPAWN·RECEIPT·MERGE） |
| 2026-08-23 用户终裁 | 分身闸=并行闸最后一步程序（无条件触发）；A/B 殊途同归——判 B 仅串行拓扑非免分身，符合条件即生成子分身 |
| 2026-08-15 用户裁定 | 单刀双掷开关（`dispatch_switch.py`）：门禁判定机械执行唯一出口，A/B 双掷点 + B 档理由强制 + `--force-serial` 人工串行备案 + 全程留痕审计 |
| 2026-08-17 用户裁定 | `多任务：` 编号清单句式（触发表 #3）：有几个编号生成几条 todo 并直接并行；定义边界——多任务并行（异构独立任务）≠ 子分身（同质内容切分、相同步骤） |
| 2026-08-17 用户裁定 | 契约先行分片（REFORM-GATE 判 A）：coupled 前置细分契约耦合（冻约+并行）/ 产物耦合（才允许串行），开关侧 `--dep-type contract|artifact` 留痕辅助 |

