Saphan StudioDocs
Reference/Command reference

saphan dispatch

Generate an executor-MD (five dispatch rules as refusing format invariants)

saphan dispatch

Generate an executor-MD (five dispatch rules as refusing format invariants)

saphan dispatch [flags]

Render an executor-MD from a dispatch-template manifest (§4.4) and validate it against the five dispatch rules as format invariants (§4.1): ROLE-LOCK preamble · bare-slug H1 · anti-cross-wire clause · 1-session-1-task marking + CLOSE-SIGNAL section · absolute worktree path.

An MD failing ANY invariant is unrepresentable output, not a warning: the verb exits 2 (STOP) naming the failed invariants. The [CONTINUATION] vs [FRESH off base] marking is a required input (§4.2) — exactly one of --continuation / --fresh; its absence is the same refusal.

The absolute worktree path is composed from the resolved workspace layout (§4.3): --worktrees-dir > SAPHAN_WORKTREES_DIR > project config > the library default "worktrees/" (conventions/workspace-layout.md). The MD is written to stdout, or to --out.

Subcommands

SubcommandWhat it does
saphan dispatch commandCompose the saphan run command for a stream (the engine owns every composed sentence)

Options

OptionTypeDefaultDescription
--anchorstringArray[]verified recon anchor line (repeatable)
--basestringunsetbase branch/ref the worktree forked from
--branchstringunsetwork branch (default feature/<slug>)
--commit-tagstringunsetthe [<commit-tag>] of the commit format (default <slug>)
--continuationboolfalsefix into a live stream (paste into THAT session)
--freshboolfalsenew change off the base branch (fresh worktree+branch)
--outstringunsetwrite the MD to this file instead of stdout
--repostringunsetwhich code repo the worktree checks out
--slugstringunsetstream slug == task-file name (kebab-case; the bare-slug H1)
--taskstringunsetthe one-line task scope
--templatestringunsetpath to the dispatch-template manifest
--worktrees-dirstringunsetworktrees directory under the workspace root (§4.3 layout)

saphan dispatch command

Compose the saphan run command for a stream (the engine owns every composed sentence)

saphan dispatch command [flags]

Compose the complete, pasteable saphan run sentence for one stream from the RECORD instead of from a master's memory (composed-commands law).

Master inputs are only: --stream · --order · --machine · --identity/--slot · --model · --role · --cost-estimate-usd. Everything else is DERIVED: the backend and the seat's profile home from the machine registry, --binary from that machine's per-backend registered path, --env from the backend adapter's own baseline, --laws from config-v1 run.laws, --workspace from the canonical root, --brief/--workdir from the workspace layout (for a transport=ssh machine the --workdir is DERIVED instead as <worktrees_root>/wt-<stream> from that machine's registered layout, which --remote-workdir may override), and --budget-usd from the declared quote (2x, cap-is-derived-not-chosen).

For a transport=ssh machine the verb first DIALS the four facts a master otherwise probes by hand — far $HOME, the seat's profile home, the binary (present, absolute, digest) and the workdir — and any absence is a NAMED refusal that PRINTS THE COMMAND WHICH REPAIRS IT. Nothing is ever spawned or materialized here: this verb prints, the owner pastes.

Options

OptionTypeDefaultDescription
--cost-estimate-usdfloat640the declared quote; --budget-usd is DERIVED from it as 2x (required)
--effortstringunsetmandate.effort — mirror --model, OPTIONAL and NEVER guessed: absent means the composed sentence carries no --effort at all (honest-unknown; saphan run itself records the absence as a fact)
--identitystringunsetexecutor identity seated on --machine (omit only when the machine carries exactly one seat)
--machinestringunsetadmitted machine id this dispatch runs on (required — backend, binary and transport are derived from its record, never guessed); "auto" (order machine-auto-placement, Q1) resolves the seat through dispatch.Resolve instead — a READ-ONLY preview (scoped to claude-code seats, since this verb carries no --backend flag), never a reservation: this verb still only prints, the owner still pastes, and the paste is what reserves
--modelstringunsetmandate.model for this dispatch — an economic decision, never a session default (omit ONLY when --role carries a configured dispatch.model default; the composed sentence records which source answered)
--no-preflightboolfalsedo NOT dial the four §(b) facts (the checklist says so loudly — an undialled host is never reported as proven)
--orderstringunsetpath to the stream's order/brief (default: <worktree>/_MASTER_ORDER.md)
--profilestringexecutecapability profile of the composed run
--provisionstringArray[]explicit provisioning passthrough <source>=<dest> (repeatable, dispatch-verb order §(D)3), composed alongside config-v1 run.grant (if any) in the order given
--remote-workdirstringunsetabsolute workdir ON THE FAR HOST (transport=ssh only) — an OVERRIDE: the workdir is normally DERIVED as <worktrees_root>/wt-<stream> from the machine record, and this flag wins over that derivation
--reviewedstringunsetthe slug of the stream a --role review dispatch REVIEWS — the stream whose verdict this round discharges: carry its -rN suffix when the merging round is numbered, never the reviewer's own -review suffix; required with --role review, refused with any other (R52 at the spawn door); it is substituted into the review leg's injected _REVIEW_STATUS.md H1 rule
--roleroleunsetfleet role whose configured dispatch defaults apply (master | executor | review | design | scribe | advisor)
--slotint0slot index to state explicitly (omitted = saphan run derives it from the identity's own seat)
--streamstringunsetstream slug to dispatch (required)
--wall-clockstring90mwall-clock ceiling of the composed run (generous: a tight one fabricates killed-timeout)

On this page