mcpField
D
dispatch-spawn

dispatch-spawn

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

dispatch-spawn について

dispatch-spawnは、隔離されたワーカーを起動し、その作業ツリーを受け取るためのスキルです。隔離を確立できない場合は実行を中止し、インポートゲートと検証を通じて成果を扱います。

主な機能

  1. 01隔離機能を確認して失敗時に停止
  2. 02未バインドのワーカーブランチを作成
  3. 03隔離環境でワーカーを実行
  4. 04スコープ検査を通して変更をインポート
  5. 05検証・フェーズ記録・フォーク削除

活用シーン

  1. 01隔離された作業ツリーで開発を委任
  2. 02ワーカーのコード変更を確認してインポート
  3. 03調整ブランチ上でインポート内容を検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davidlee/doctrine --skill dispatch-spawn

インストール後、Claude Code で/dispatch-spawnを入力して読み込まれたか確認します。

詳細

Dispatch — 隔離されたワーカーの起動

すべてのハーネスで使う、ひとつの起動形式です。実行の進行方法は /dispatch ルーターにあり、このスキルは起動呼び出しと 結果を受け取る仕組みを扱います。

「ワーカーが返すのはコミットではなく作業ツリー」を参照してください。 lib:reference/dispatch-mechanics.md § The worker returns a working tree, not a commit。

起動

scripts/spawn-confined.sh <harness> <B> <BRANCH> <DIR> <PROMPT_FILE> [BACKSTOP_SECS]

<harness> は pi または claude です。スクリプトが起動前の手順をすべて 実行するため、別途フォークする必要はありません。

  1. 機能の確認。 Linux では bwrap があることを確認し、フォークを作成する 前に bwrap-unavailable を理由に拒否します。macOS では doctrine worktree jail-prefix が名前付きの拒否を返します。このコマンドは フェイルクローズし、プレフィックスを書き込みません。 隔離なしでのフォールバックはありません。解決できない隔離環境では、 性能を落として続行するのではなく、起動を中止します(空のプレフィックスは 専用のガードで検出されます)。
  2. フォーク。 doctrine worktree fork --base <B> --branch <BRANCH> --dir <DIR> --worker をオーケストレータークラスで、隔離の前にプロジェクトのルートから 実行します。フォークは意図的に未バインドです。--slice/--phase は 指定しません(下記の「ファネル」を参照)。
  3. 隔離と実行。 timeout <BACKSTOP> <jail prefix> <harness exec> を実行し、 <PROMPT_FILE> をワーカーに渡します(claude には標準入力で、pi には 1 行のコンパクトな RPC で渡します)。トランスクリプトも取得します。 隔離環境ではフォークのディレクトリとハーネスの設定ディレクトリを読み書き 可能としてバインドし、それ以外を読み取り専用でバインドしたうえで、 名前空間内に DOCTRINE_WORKER=1 を設定します。
  4. 引き渡し。 claude -p はターンが終わると終了します。プロセスの終了が 完了シグナルです。pi --mode rpc は自動終了しないため、このプロファイル のみ FIFO で標準入力を開いたままにし、型付きの完了イベントをポーリング します。設定ディレクトリと実行行以外での違いは、この非対称性だけです。

プロンプトのフェンシング規則(クリーンなチェックアウト、禁止動詞、赤い証明の 場合は破棄せず編集すること)については、 lib:reference/dispatch-mechanics.md § Workers can silently discard their own work を参照してください。

ワーカーの自己申告による成功を決して信頼しないでください。真実を示すのは 作業ツリーです。

取り込み

差分は、プロセス終了後も保持される未コミットの作業ツリーです。自動的に 削除されることはありません。

  1. 取り込み。 doctrine worktree import --base <B> --from-worktree <DIR> --slice <N> を実行します。追跡対象と未追跡の差分を収集し、 lib:reference/dispatch-mechanics.md に定められた classify_import の スコープベルトと、拒否して停止する証明ゲートを実行します。赤い差分は ステージ済みの状態で停止し、自動修正はしません(取り込むか拒否するかであり、 書き換えはしません)。拒否された場合は報告して停止し、回避して取り込むことは ありません。
  2. 調整用ブランチでコミットを 1 つ作成します。これはオーケストレーター 自身の作業であり、取り込み処理がコミットしない理由です。
  3. 境界を記録します。 doctrine slice record-delta <N> PHASE-NN --commit <S> を実行します。S はコードのコミットに固定し、記録時に HEAD から 読み取ってはいけません。ナレッジのコミットはコードのコミットの後に続くため、 HEAD が移動している可能性があります。--commit は S 自身のパッチを 正確に記録するため、後続のナレッジや、更新ベースとのマージは仕組み上含まれ ません。この書き込みは省略できません。完了済みフェーズにレジストリ行が ない場合、dispatch sync --prepare-review の完全性ゲートが停止します。
  4. 検証して完了とする。 調整ツリーでフェーズの検証を実行します(ワーカー 自身の報告は参考情報です)。その後、状態を切り替えます。 doctrine slice phase --status completed <N> PHASE-NN
  5. 使用済みのフォークを回収します。 doctrine worktree gc --fork <BRANCH> を実行します。このコマンドは未バインド フォーク向けに絞り込まれたパッチ ID のオラクルを使い、冪等です。未取り込みの 作業ツリーに git worktree remove --force を実行してはいけません。差分の 唯一のコピーが削除されます。--dry-run は判定結果を表示し、何も削除しません。

ファネル:この経路ではなく、バインド済みフォークの仕組み

lib:reference/dispatch-mechanics.md § The funnel record、およびそれを駆動する 場合について参照してください。この経路ではフォークは未バインドのため、行は 作成されず、next は spawn のままです。

要注意すべき兆候

絶対にしてはいけないこと: ワーカーにコミットするよう指示したり、期待したりすること(.git は読み取り専用であり、独自にコミットする方法はありません)。スクリプトの外で起動すること(独自に作成した exec は隔離されていないワーカーです)。バックストップタイムアウトを省略すること。プロンプトを eval すること。pi プロファイルの RPC 標準入力に heredoc を使うこと(EOF によって停止します)。スコープまたは prove-gate の拒否を回避してインポートすること(拒否は不具合か停止を意味し、決して迂回してはいけません)。赤の差分を自動修正してインポートに含めること。差分が取り込まれる前にフォークを強制削除すること。ワーカー自身の成功/失敗ラベルを信頼すること。dispatch next の spawn 指示を、行き詰まったファネルとして扱うこと。

必ず行うこと: spawn がゼロ以外の値を返したら停止すること(フェイルクローズが基本方針です。隔離を確立できなければ、ワーカーを起動しません)。事前に整理された、自己完結型のプロンプトを渡すこと。スコープベルトが確認するセレクターを用意できるよう、--slice を指定してインポートすること。境界を記録する前に、コードコミット時点で S を固定すること。ドライブの手順に戻るため、ルーターに戻ること。

コメント