关于 dispatch-subprocess
这项技能在隔离的 Doctrine worktree 中派发 codex 或 pi 工作进程,并将控制权交回 dispatch 路由器。它还规定提交边界记录方式,以及工作进程和 RPC 流程的防护措施。
主要功能
- 01创建隔离的工作进程 worktree
- 02启动 codex 或 pi 子进程
- 03用 FIFO 保持 pi RPC 输入开启
- 04记录阶段提交边界
- 05执行 dispatch 完成检查
适用场景
- 01在独立分支和目录运行工作进程
- 02在工作进程运行期间保持 pi RPC 输入开启
- 03在知识提交前记录已落地阶段
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davidlee/ doctrine --skill dispatch-subprocess安装后在 Claude Code 中输入/dispatch-subprocess确认已加载。
详细介绍
Dispatch — codex/pi arm
通过 doctrine worktree fork --worker + 子进程生成来启动工作者。
驱动循环位于 /dispatch 路由器。
启动 — codex arm
doctrine worktree fork --base "$B" --branch "$BR" --dir "$D" --worker \
|| { echo "fork failed: $?" >&2; exit 1; }
env -C "$D" DOCTRINE_WORKER=1 codex exec "<pre-distilled prompt>"
在受限环境(bwrap)中运行 fork,检查 $?,然后启动。工作者会继承
当前环境,并在自己的树内 $D/target 中编译(无环境变量约定)。
启动 — pi arm(RPC 模式)
doctrine worktree fork --base "$B" --branch "$BR" --dir "$D" --worker \
|| { echo "fork failed: $?" >&2; exit 1; }
cp AGENTS.md "$D/" \
|| { echo "AGENTS.md copy failed: $?" >&2; exit 1; }
PI_FIFO=$(mktemp -u) && mkfifo "$PI_FIFO"
{ printf '%s\n' \
'{"type":"set_auto_retry","enabled":false}' \
'{"type":"prompt","message":"<pre-distilled prompt>"}'
sleep 300
} > "$PI_FIFO" &
timeout 300 env -C "$D" DOCTRINE_WORKER=1 \
pi --mode rpc --thinking off --session-dir "$D/.pi-session" \
--no-extensions --no-skills --no-themes \
--offline --approve --tools read,bash,edit,write,grep,find,ls \
< "$PI_FIFO"
rm -f "$PI_FIFO"
与 codex arm 的隔离方式相同;fifo 会保持 stdin 打开(pi RPC 遇到 EOF 时会退出)。
使用 sleep 300 保持连接,agent_end 会提供类型化完成信息。忽略已安装软件包发出的
extension_ui_request 小组件事件。
边界记录
在 conclude 指令(doctrine dispatch next --slice <N>)中,代码提交之后运行:doctrine slice record-delta <SL> PHASE-NN --commit <S> — 安全默认的单提交模式。它会推导 [S^, S],并将每个阶段的边界写入主树合规注册表(F-5 从 coord 树解析;F-6 守卫;upsert)。
在代码提交时固定 S;记录时绝不读取 HEAD。 知识提交会跟在代码提交之后,因此记录时的 HEAD 可能已不再是代码提交。代码提交落地后立即捕获 S=$(git rev-parse HEAD),并在后续知识提交之前记录 --commit "$S"(或者无论顺序如何,都使用固定的 oid)。git diff S^..S 精确对应 S 自身的补丁——后续知识以及任何 refresh-base 合并(位于 S^)都会被自然排除;这正是旧的 --start/--end 范围做不到的。
此 arm 没有 record-boundary,而 codex/pi 对称账本推导已延期(D6/IMP-171),因此此处的 record-delta 就是该 arm 的注册表写入——每个落地阶段都必须保留,并由编排器发起。现在不能再跳过:如果已完成阶段缺少注册表行,dispatch sync --prepare-review 的完整性检查会触发 bail!,因此遗忘写入会使预审计 conclude 节拍停止,而不是悄然通过(ISS-052 故障模式)。同一动词仍兼作手动逃生通道——--start/--end 仍适用于范围或引导操作。其传入的 Manual 会保留溯源信息——绝不会清除现有的 funnel/legacy 阻断(D12)。
危险信号
**绝不:**使用 eval;在 env -C "$D" 之外启动进程;省略 timeout;在 RPC 模式下使用 heredoc(stdin EOF 会终止 pi);凭记忆手动安排 funnel 顺序(询问 doctrine dispatch next --slice <N>)。
**始终:**fork 失败时停止;传递 DOCTRINE_WORKER=1;为 RPC stdin 使用 fifo;退出后运行 rm -f 删除 fifo;返回路由器以遵循 funnel 节奏。