dispatch-subprocess について
隔離された Doctrine worktree で codex または pi のワーカーを起動し、dispatch ルーターに制御を戻すスキルです。コミット境界の記録方法と、ワーカーおよび RPC 処理の安全策も定めています。
主な機能
- 01隔離されたワーカー用 worktree の作成
- 02codex または pi サブプロセスの起動
- 03FIFO による pi RPC 入力の維持
- 04フェーズのコミット境界の記録
- 05dispatch 完了チェックの適用
活用シーン
- 01別ブランチとディレクトリでのワーカー実行
- 02ワーカー実行中の pi RPC 入力の維持
- 03ナレッジのコミット前に完了フェーズを記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davidlee/ doctrine --skill dispatch-subprocessインストール後、Claude Code で/dispatch-subprocessを入力して読み込まれたか確認します。
詳細
ディスパッチ — codex/pi アーム
doctrine worktree fork --worker とサブプロセスの起動を使って、ワーカーを起動します。
駆動ループは/dispatch ルーターにあります。
起動 — codex アーム
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 アーム(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 アームと同じ隔離環境です。fifo は標準入力を開いたままにします(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) で S を取得し、後続のナレッジのコミット前(または順序に関係なく、固定した oid を指定して)に --commit "$S" を記録してください。git diff S^..S は S 自身のパッチのみを対象とします。後続のナレッジと、更新ベースのマージ(S^ に含まれます)は構造上除外されます。これは以前の --start/--end 範囲では実現できなかったことです。
このアームには record-boundary がなく、codex/pi の対称的な台帳導出は延期されています(D6/IMP-171)。そのため、この record-delta がアームのレジストリ書き込みとなり、すべての反映済みフェーズでオーケストレーターが実行する必須処理です。もはや省略できません。dispatch sync --prepare-review の完全性ゲートは、完了済みフェーズにレジストリ行がない場合 bail! するため、書き忘れると事前監査の conclude ビートが停止し、黙って通過することはありません(ISS-052 の障害モード)。同じ動詞は手動のエスケープハッチも兼ねています。範囲指定やブートストラップには引き続き --start/--end を使用できます。入力される Manual は来歴を保持し、既存の funnel/legacy の停止状態を解除することはありません(D12)。
危険信号
禁止事項: eval を使うこと、env -C "$D" の外で起動すること、timeout を省略すること、RPC モードでヒアドキュメントを使うこと(標準入力の EOF で pi が終了します)、記憶だけを頼りに funnel を順番に手動実行すること(doctrine dispatch next --slice <N> に確認してください)。
必須事項: fork に失敗したら停止すること、DOCTRINE_WORKER=1 を引き継ぐこと、RPC の標準入力には fifo を使うこと、終了後に fifo を rm -f で削除すること、funnel の進行に戻るためルーターに戻ること。