Dispatch one drydock spec for execution. Use when asked "/drydock:dispatch <id>", "dispatch <id>", "run that spec", or after an unblock when immediate re-dispatch is wanted instead of waiting for the orchestrator tick.
Installs into .claude/skills of the current project.
Are you the author of Dispatch?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/phspagiari-dispatch)
---
name: dispatch
description: Dispatch one drydock spec for execution. Use when asked "/drydock:dispatch <id>", "dispatch <id>", "run that spec", or after an unblock when immediate re-dispatch is wanted instead of waiting for the orchestrator tick.
---
# /drydock:dispatch — execute one spec
> **PLUGIN_HOME**: resolve once per invocation as `realpath <this skill's
> base dir>/../..` (the plugin package root — `contracts/`, `board/`,
> `templates/` are its siblings). **STATE_HOME**: `~/.drydock`, or
> `$DRYDOCK_STATE_HOME` if set — the queue, deliverables, archive.
Manual, single-spec version of the orchestrator's dispatch step. The contract
is `<PLUGIN_HOME>/contracts/DISPATCH.md` — re-read it every invocation; this
skill only adds argument handling on top.
## Argument
- `<id>` given → that spec in `<STATE_HOME>/specs/inbox/<id>/`.
- No id and exactly one spec in inbox → that one, after naming it.
- No id and several → list them (id, title, age) and ask which. Never pick.
## Procedure
1. If 2+ executions are already in `<STATE_HOME>/specs/active/`, say so and
get explicit go-ahead before adding a third (the orchestrator's
concurrency cap applies to humans too).
2. Run the `<PLUGIN_HOME>/contracts/DISPATCH.md` preflight, fail closed.
A `marker:` or `chain:` line from `queue_rules.py check` →
`<STATE_HOME>/specs/blocked/<id>/` +
`QUESTION.md`, commit in `<STATE_HOME>` (never pushed), report — do not
execute.
3. Move to `<STATE_HOME>/specs/active/<id>/`, commit `dispatch: <id> -> active`.
4. Worktree per DISPATCH.md, branch `<namespace>/drydock-<id>` (namespace
from `<STATE_HOME>/config`) off the target repo's default branch, from a
freshly fetched base — **unless the spec declares `branch:`**, and then
the worktree is created on that existing branch (`git worktree add <path>
<branch>`, no `-b`) per DISPATCH step 7, once step 5's staleness proof has
passed at preflight.
5. Launch the executor as an independent background session:
`cd <worktree> && claude --bg --model <model> --permission-mode
<permission-mode> "<DISPATCH step-8 prompt>"` — model from the routing
table, permission mode from `<STATE_HOME>/config`, both in
`<PLUGIN_HOME>/contracts/ORCHESTRATOR.md`. DISPATCH step 8 picks the
prompt from RUN.md as it stood before this dispatch: for a new item that
is the plan phase (8a), with `phase: plan` written into RUN.md's header
in the same single write as `base_sha:`.
The gate (8b) and the implement phase (8c) are driven by the
orchestrator's ticks, not by this skill — without an orchestrator
running, a manually dispatched item stops at `PLAN.md`.
6. Verify the session actually started (ListAgents / `claude agents` /
process), then report one line: id, model, worktree, and where to watch
(`claude agents`, `/drydock:board`).
Do NOT wait for the execution to finish — dispatch-and-return. Completion
lands on the board and in notifications (or the orchestrator's next tick
verifies it).