关于 dispatch-spawn
dispatch-spawn 是用于启动受隔离约束的工作进程并接收其工作树的技能,供协调 Agent 调度开发任务。它拒绝在无法建立隔离时降级运行,并通过导入门禁与验证流程处理结果。
主要功能
- 01探测隔离能力并失败关闭
- 02派生未绑定的工作分支
- 03在隔离环境中运行工作进程
- 04导入工作树差异并执行范围检查
- 05验证后记录阶段并清理分支
适用场景
- 01在隔离工作树中委派开发任务
- 02检查并导入工作进程产生的代码差异
- 03在协调分支上验证已导入的更改
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davidlee/ doctrine --skill dispatch-spawn安装后在 Claude Code 中输入/dispatch-spawn确认已加载。
详细介绍
Dispatch — 启动受限工作进程
适用于所有执行框架的一种启动形式。驱动节奏由
/dispatch 路由器定义;本技能涵盖启动调用和
落地机制。
参见 lib:reference/dispatch-mechanics.md § 工作进程返回的是工作树,
而非提交。
启动
scripts/spawn-confined.sh <harness> <B> <BRANCH> <DIR> <PROMPT_FILE> [BACKSTOP_SECS]
<harness> 为 pi 或 claude。脚本会自行完成整个启动前流程——无需
单独派生分支:
- 能力探测。 Linux 会断言存在
bwrap,并在派生分支之前拒绝bwrap-unavailable;macOS 则通过doctrine worktree jail-prefix给出 明确的拒绝结果,该命令会以失败关闭,并且不写入前缀。 绝不回退到不受限模式——无法解析隔离环境时会中止启动,而非降级 (空前缀会被自身的守卫捕获)。 - 派生分支。
doctrine worktree fork --base <B> --branch <BRANCH> --dir <DIR> --worker,按编排器类别运行,并在任何隔离之前从项目根目录执行。此派生分支 刻意保持未绑定——不使用--slice/--phase(见下文 漏斗)。 - 隔离并执行。
timeout <BACKSTOP> <jail prefix> <harness exec>, 将<PROMPT_FILE>交给工作进程(claude使用标准输入;pi使用一行精简 RPC), 并捕获交互记录。隔离环境会以读写方式绑定派生目录和执行框架配置目录,以只读方式绑定 其余内容,并在命名空间内设置DOCTRINE_WORKER=1。 - 交还。
claude -p会在轮次结束时退出——进程退出就是完成信号。pi --mode rpc不会自行退出,因此只有该配置会通过 fifo 保持标准输入开启, 并轮询其带类型的结束事件。除此之外,两个执行框架唯一的差异是配置目录和执行 命令行。
关于提示词围栏规则(干净检出、禁止使用特定动词、红色证明时须编辑而非丢弃),
参见 lib:reference/dispatch-mechanics.md § 工作进程可能会悄悄丢弃自己的
工作。
切勿相信工作进程自述的成功结果。工作树才是事实依据。
落地
差异是一棵未提交的工作树,进程退出后仍会保留——不会自动回收。
- 导入。
doctrine worktree import --base <B> --from-worktree <DIR> --slice <N>——收集已跟踪和未跟踪的差异,按照lib:reference/dispatch-mechanics.md执行classify_import作用域检查和拒绝并停止的证明门槛——若差异未通过检查, 会暂存并停止,不会自动修复(要么落地,要么拒绝,绝不重写)。任何拒绝都必须 报告并停止——绝不可绕过它继续导入。 - 在协调分支上只提交一次——这是编排器自身的操作,也是导入不提交的原因。
- 记录边界。
doctrine slice record-delta <N> PHASE-NN --commit <S>,其中S必须固定为代码提交,不能在记录时从HEAD读取。 知识提交会晚于代码提交,因此HEAD可能已经移动;--commit会精确记录S自身的补丁,按设计排除后续知识和任何刷新基线合并。 这项写入不可跳过——若已完成的阶段没有登记表行,dispatch sync --prepare-review的完整性检查会停止。 - 验证并结束。 在协调工作树上运行该阶段的验证(工作进程自己的报告仅供参考),
然后更新状态表:
doctrine slice phase --status completed <N> PHASE-NN。 - 回收已用完的派生分支:
doctrine worktree gc --fork <BRANCH>——其补丁 ID 判定器专门针对未纳入漏斗的派生分支情形,并且可幂等执行。 绝不可对尚未导入的工作树运行git worktree remove --force:这会删除差异的唯一副本。--dry-run只输出判定结果,不会销毁任何内容。
漏斗:绑定派生分支的机制,不适用于此路径
参见 lib:reference/dispatch-mechanics.md § 漏斗记录;了解它何时作为驱动器使用——
此路径会派生未绑定的分支,因此不会写入任何记录行,next 会停留在
spawn。
危险信号
绝不要: 指示或期望工作进程提交更改(其 .git 为只读,无法自行提交);在脚本外启动工作进程(手动编写的 exec 会导致工作进程不受约束);省略兜底超时;对提示词使用 eval;对 pi 配置文件的 RPC 标准输入使用 here-doc(EOF 会将其终止);绕过范围限制或 prove-gate 拒绝继续导入(拒绝意味着存在缺陷或必须停止,绝不能绕道);将红色差异自动修复后再导入;在分支的差异尚未落地前强制删除分支;相信工作进程自己标记的成功或失败;把 dispatch next 给出的 spawn 指令当成卡住的流程。
始终: 遇到非零 spawn 结果时停止(默认拒绝是整个流程的原则——无法确立隔离就不启动工作进程);传入预先提炼且独立完整的提示词;使用 --slice 导入,以便范围保护机制检查选择器;在记录边界前,将 S 固定在代码提交上;返回路由器,按既定节奏推进。