mcpField
D
dispatch-subprocess

dispatch-subprocess

github.com/davidleeエージェントワークフロー282 回インストール3 日前に更新
リポジトリ

dispatch-subprocess について

隔離された Doctrine worktree で codex または pi のワーカーを起動し、dispatch ルーターに制御を戻すスキルです。コミット境界の記録方法と、ワーカーおよび RPC 処理の安全策も定めています。

主な機能

  1. 01隔離されたワーカー用 worktree の作成
  2. 02codex または pi サブプロセスの起動
  3. 03FIFO による pi RPC 入力の維持
  4. 04フェーズのコミット境界の記録
  5. 05dispatch 完了チェックの適用

活用シーン

  1. 01別ブランチとディレクトリでのワーカー実行
  2. 02ワーカー実行中の pi RPC 入力の維持
  3. 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 の進行に戻るためルーターに戻ること。

コメント