mcpField
D
dispatch-subprocess

dispatch-subprocess

github.com/davidleeAgent workflows282 installsUpdated 3d ago
Repository

About dispatch-subprocess

A skill for dispatching codex or pi workers in isolated Doctrine worktrees and returning control to the dispatch router. It also specifies commit-boundary recording and safeguards for the worker and RPC flows.

Key features

  1. 01Forks isolated worker worktrees
  2. 02Spawns codex or pi subprocesses
  3. 03Uses FIFO for pi RPC input
  4. 04Records phase commit boundaries
  5. 05Enforces dispatch completion checks

Use cases

  1. 01Running a worker on a separate branch and directory
  2. 02Keeping pi RPC input open during a worker run
  3. 03Recording a landed phase before knowledge commits

Install

Copy the command and run it in a terminal.

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

After installing, type/dispatch-subprocessin Claude Code to confirm it loaded.

Details

From the project README

Dispatch — codex/pi arm

Spawn a worker via doctrine worktree fork --worker + subprocess spawn. Drive loop lives in the /dispatch router.

Spawn — 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>"

Confined (bwrap); run the fork, check $?, then spawn. The worker inherits the ambient env and compiles into its own in-tree $D/target (no env contract).

Spawn — pi arm (RPC mode)

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"

Same confinement as codex arm; fifo keeps stdin open (pi RPC exits on EOF). sleep 300 keepalive, agent_end gives typed completion. Ignore extension_ui_request widget events from installed packages.

Boundary recording

At the conclude prescription (doctrine dispatch next --slice <N>), after the code commit: doctrine slice record-delta <SL> PHASE-NN --commit <S> — the safe-default single-commit mode. It derives [S^, S] and writes the per-phase boundary into the primary-tree conformance registry (F-5 resolves it from the coord tree; F-6 guard; upsert).

Pin S at the code commit; never read HEAD at record time. Knowledge commits trail the code commit, so by the time you record, HEAD may no longer be the code commit. Capture S=$(git rev-parse HEAD) immediately after the code commit lands and record --commit "$S" before trailing knowledge (or with the pinned oid regardless of order). git diff S^..S is exactly S's own patch — trailed knowledge and any refresh-base merge (which sits in S^) are excluded by construction; this is what the old --start/--end range failed to do.

This arm has no record-boundary and the codex/pi symmetric ledger derive is deferred (D6/IMP-171), so this record-delta is the arm's registry write — RETAINED, every landed phase, orchestrator-issued. It is no longer skippable: dispatch sync --prepare-review's completeness gate bail!s if a completed phase lacks a registry row, so a forgotten write halts the pre-audit conclude beat instead of silently passing (the ISS-052 failure mode). The same verb still doubles as the manual escape hatch — --start/--end remains for a range / bootstrap. Its incoming Manual is provenance-preserving — it never clears an existing funnel/legacy halt (D12).

Red Flags

Never: eval; spawn outside env -C "$D"; omit timeout; use a heredoc for RPC mode (stdin EOF kills pi); hand-sequence the funnel from memory (ask doctrine dispatch next --slice <N>). Always: halt on fork failure; carry DOCTRINE_WORKER=1; use a fifo for RPC stdin; rm -f the fifo after exit; return to the router for the funnel cadence.

Comments

Markdown supported