dispatch-spawn について
dispatch-spawnは、隔離されたワーカーを起動し、その作業ツリーを受け取るためのスキルです。隔離を確立できない場合は実行を中止し、インポートゲートと検証を通じて成果を扱います。
主な機能
- 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 § The worker returns a working tree,
not a commit。
起動
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には 1 行のコンパクトな RPC で渡します)。トランスクリプトも取得します。 隔離環境ではフォークのディレクトリとハーネスの設定ディレクトリを読み書き 可能としてバインドし、それ以外を読み取り専用でバインドしたうえで、 名前空間内にDOCTRINE_WORKER=1を設定します。 - 引き渡し。
claude -pはターンが終わると終了します。プロセスの終了が 完了シグナルです。pi --mode rpcは自動終了しないため、このプロファイル のみ FIFO で標準入力を開いたままにし、型付きの完了イベントをポーリング します。設定ディレクトリと実行行以外での違いは、この非対称性だけです。
プロンプトのフェンシング規則(クリーンなチェックアウト、禁止動詞、赤い証明の
場合は破棄せず編集すること)については、
lib:reference/dispatch-mechanics.md § Workers can silently discard their
own work を参照してください。
ワーカーの自己申告による成功を決して信頼しないでください。真実を示すのは 作業ツリーです。
取り込み
差分は、プロセス終了後も保持される未コミットの作業ツリーです。自動的に 削除されることはありません。
- 取り込み。
doctrine worktree import --base <B> --from-worktree <DIR> --slice <N>を実行します。追跡対象と未追跡の差分を収集し、lib:reference/dispatch-mechanics.mdに定められたclassify_importの スコープベルトと、拒否して停止する証明ゲートを実行します。赤い差分は ステージ済みの状態で停止し、自動修正はしません(取り込むか拒否するかであり、 書き換えはしません)。拒否された場合は報告して停止し、回避して取り込むことは ありません。 - 調整用ブランチでコミットを 1 つ作成します。これはオーケストレーター 自身の作業であり、取り込み処理がコミットしない理由です。
- 境界を記録します。
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 § The funnel record、およびそれを駆動する
場合について参照してください。この経路ではフォークは未バインドのため、行は
作成されず、next は spawn のままです。
要注意すべき兆候
絶対にしてはいけないこと: ワーカーにコミットするよう指示したり、期待したりすること(.git は読み取り専用であり、独自にコミットする方法はありません)。スクリプトの外で起動すること(独自に作成した exec は隔離されていないワーカーです)。バックストップタイムアウトを省略すること。プロンプトを eval すること。pi プロファイルの RPC 標準入力に heredoc を使うこと(EOF によって停止します)。スコープまたは prove-gate の拒否を回避してインポートすること(拒否は不具合か停止を意味し、決して迂回してはいけません)。赤の差分を自動修正してインポートに含めること。差分が取り込まれる前にフォークを強制削除すること。ワーカー自身の成功/失敗ラベルを信頼すること。dispatch next の spawn 指示を、行き詰まったファネルとして扱うこと。
必ず行うこと: spawn がゼロ以外の値を返したら停止すること(フェイルクローズが基本方針です。隔離を確立できなければ、ワーカーを起動しません)。事前に整理された、自己完結型のプロンプトを渡すこと。スコープベルトが確認するセレクターを用意できるよう、--slice を指定してインポートすること。境界を記録する前に、コードコミット時点で S を固定すること。ドライブの手順に戻るため、ルーターに戻ること。