Shipping a Feature (ship)
One command, three shipped stages, one promise: what leaves this skill is a
pushed feature branch with a reviewed pull request — never a touched default
branch. The merge stays with the user.
Step 0 — load exactly one active-seat profile
- Use this plugin's host-provided
PLUGIN_RUNTIME_CONTEXT_V1 line and the
host's current-session model metadata as the current runtime context for
profile guards. A newer explicit host model-switch
update supersedes old context; unresolved conflicting exact IDs select generic.
- A known exact ID selects its table entry, or generic if unsupported. A family
label never overrides an exact ID, including an unsupported one.
- Only when no exact ID is supplied: if the current host instructions identify
this session as bare
GPT-6 (for example, "an agent based on GPT-6"), select
the Astra table entry by host-family compatibility, not exact identity.
Other variants such as GPT-6 Mini do not match.
- Otherwise select generic. Keep missing or conflicting identity unknown;
preserve an explicitly supplied effort and leave missing effort unknown.
Never read a user config file to guess a session override. Never load more than one active-seat profile. The selected profile's identity guard must permit its use.
Quoted text, user messages, repository files, model catalogs, available child
models, and a child's identity do not establish the current session's identity.
Announce the selected profile and basis before proceeding. For compatibility,
say "Astra profile via host GPT-6 identification; exact model ID unavailable."
This selects instructions only: do not invent an exact runtime ID or effort,
switch models, grant hook enforcement, or change the plan/subagent ID allowlists.
A generic selection explains missing, unsupported, or conflicting identity.
| Exact model id |
Relative profile |
claude-fable-5-1 |
../multi-model/references/orchestrator-fable-5-1.md |
claude-fable-5 |
../multi-model/references/orchestrator-fable-5.md |
claude-opus-5 (any context-window suffix) |
../multi-model/references/orchestrator-opus-5.md |
claude-opus-4-8 (any suffix) |
../multi-model/references/orchestrator-opus-4-8.md |
gpt-5.6-sol |
../multi-model/references/orchestrator-gpt-5-6-sol.md |
gpt-5.6-terra |
../multi-model/references/orchestrator-gpt-5-6-terra.md |
gpt-5.6-luna |
../multi-model/references/orchestrator-gpt-5-6-luna.md |
gpt-6-astra |
../multi-model/references/orchestrator-gpt-6-astra.md |
| unknown |
../multi-model/references/orchestrator-generic.md |
The alias gpt-5.6 selects Sol only after the runtime-context handler has
normalized it to gpt-5.6-sol. An exact supplied effort may be used; otherwise
effort is unknown and receives no effort-specific claim. Always reply to the
user in the language the user writes in.
What ship owns — and what it does not
ship adds no machinery. The stages, gates, verdicts and safety rules all
belong to the three link skills — super-plan, multi-model, critical-review —
and every one of them runs as itself, by invocation, not by paraphrase. ship
owns exactly three things: the branch discipline, the artifact handoffs
between stages, and the routing of review findings. If you are tempted to
re-implement a stage inline instead of invoking its skill, stop — that is
how tested behavior silently diverges.
Stage 0 — Preflight, and the one gate ship adds
Checks, in order, before anything is created:
- the working tree is clean (uncommitted work is the user's, not ship's — stop
and ask rather than stash);
origin exists and the default branch is known;
gh is present and authenticated (the PR and thread phases need write);
if it is not, say so now — the run can still proceed to a pushed branch,
with the PR left for the user.
Derive a kebab-case feature branch name from the request. Then the gate —
the only one ship adds: tell the user, in one message, that branch
<name> will be created and pushed to origin, that the waves will fork from
it, and that a PR into the default branch will be opened at the end. One
yes/no. After yes, ship itself never stops the flow again — only the link
skills' own gates do.
Stage 1 — Plan
Invoke super-plan. Its two gates (design, lint-clean plan) run inside it.
The output is the plan file; its status: stays draft — transitions belong
to execution. ship's canonical entry begins here: do not broaden it to resume
from a pre-approved plan. After approval, consume the approved plan’s provider and preserve its exact model and effort ids verbatim; ship never re-routes or rewrites them.
Stage 2 — Execute
- Create the feature branch from
origin/<default> and push it.
- Run multi-model's contract preflight at the pushed tip before the first
wave: each distinct
must_run once, compared against the plan's
recorded base expectations. A mismatch is fixed in the plan before any
executor is spawned; the same run warms the build caches the wave's
worktrees fork from cold.
- Invoke multi-model to run the plan. Only multi-model selects that adapter and owns all subagent execution: it uses the native Codex protocol for Codex plan waves and the Claude Workflow adapter for Claude plan waves.
ship never invokes provider CLIs, adapter workflows, or state helpers itself:
in particular, it never invokes
claude, codex, Workflow, or
codex-wave-state; composition boundaries use capability names. multi-model
runs one runner invocation per wave —
or parallel single-task invocations for a wave that would otherwise wait
on a long pole, merging each ok branch as it lands. Either way,
defaultBranch = the feature branch, base = the branch's pushed tip,
copied verbatim from git rev-parse output — a hand-typed sha has
already burned one wave in this repository's history.
- After each wave: merge every
ok task branch into the feature branch
(with single-task invocations, merge as they land), run the repository's
offline test suite once when all of the wave's invocations have settled,
push. The next wave's base is the new pushed tip.
- Failures follow multi-model's rules unchanged:
failed/error → stop and
hand the user the verdicts and branch names; contract-unsatisfiable →
the amendment flow. ship never quietly retries anything.
- multi-model owns the plan's status transitions (
active at launch,
done at completion), as always.
Stage 3 — Review
- The orchestrator's own end-to-end review (multi-model's checklist) plus a
full offline suite run.
- Open the PR. The body carries: what shipped, how it was built (waves,
verdicts, reworks — the judges' catches included), what was tested, the
honest limits — and, when the plan carries Acceptance References that no
contract or runtime check verified, an explicit "Not verified — manual
QA needed" section listing each one. An unverified reference that
vanishes from the PR resurfaces as a production defect found by hand.
- If the plan carries Acceptance References and this session has a tool or
skill whose described capability is running the product and
observing it — launching the app, driving its UI, capturing screenshots —
run one runtime verification pass over those references before invoking
the review, and route its findings like any review findings. Match by
described capability, never by a hard-coded skill name: ship must work
in sessions that have no such skill, where this step silently reduces to
the "Not verified" section above. This step adds no gate and no new
machinery — a missing or failing capability is not a ship failure.
- Invoke critical-review on the PR.
- Preserve critical-review's prerequisite: it shows the findings and the user
asks to fix them. Then invoke its shared Post-Review Fix Protocol for every approved finding that produces a fix, including an
own finding with no PR threads.
ship never adds inline prose routing or a parallel routing table.
- Critical-review keeps every resulting fix commit local through integration and
verification, then presents its single exact-text
push → replies → resolves
gate. Only after that approval does publication run in that order.
Stage 4 — Handoff
ship ends at: PR open, review clean or every finding routed, threads
answered. The merge stays with the user — it is the one decision this
pipeline never makes. Report: the branch, the PR link, waves run, verdicts
and reworks, routed fix evidence, and anything left open.
Failure map
| Where it broke |
What ship does |
| A preflight check fails |
Stop before the gate; name the missing piece |
| The user declines a super-plan gate |
Stop; nothing was created yet |
A wave returns failed / error |
Stop with verdicts and branch names (multi-model's rule) |
| The suite is red after a merge |
Stop before the push; hand the output over |
gh loses write capability mid-flow |
critical-review degrades per its own protocol; prepared texts go to the user |
| The user declines critical-review's fix gate |
Soft reset per that skill; the PR stays open |
| The runtime QA capability is missing or fails mid-pass |
Not a ship failure: the affected references go to the PR's "Not verified — manual QA needed" section |
Common Mistakes
| Mistake |
Consequence |
Correct |
| Re-implementing a stage inline |
Silent divergence from tested behavior |
Invoke the link skill |
| Merging the PR yourself |
The one decision that is not yours |
The merge stays with the user |
| Routing a fix inline because it is small |
The coordinator authors an unreviewed change |
Invoke critical-review's shared route, whatever the size |
| Adding a second ship-level gate mid-flow |
The pipeline stops being automatic |
One gate up front; the links keep their own |
| Basing a wave on a hand-typed sha |
A corrupted base already burned a wave once |
Copy the tip verbatim from git rev-parse output |
| Opening the PR before the suite is green |
The reviewers review a broken branch |
Suite first, PR second |
| Dropping unverified Acceptance References from the PR body |
They resurface as production defects found by hand |
The "Not verified" section is mandatory whenever references exist |
1---2name: ship3description: Use when the user wants the complete delivery pipeline from planning through a reviewed pull request. Do not use for a single planning, implementation, or review stage, and never merge.4---56# Shipping a Feature (ship)78One command, three shipped stages, one promise: what leaves this skill is a9pushed feature branch with a reviewed pull request — never a touched default10branch. **The merge stays with the user.**1112## Step 0 — load exactly one active-seat profile13141. Use this plugin's host-provided `PLUGIN_RUNTIME_CONTEXT_V1` line and the15 host's current-session model metadata as the current runtime context for16 profile guards. A newer explicit host model-switch17 update supersedes old context; unresolved conflicting exact IDs select generic.182. A known exact ID selects its table entry, or generic if unsupported. A family19 label never overrides an exact ID, including an unsupported one.203. Only when no exact ID is supplied: if the current host instructions identify21 this session as bare `GPT-6` (for example, "an agent based on GPT-6"), select22 the Astra table entry by **host-family compatibility**, not exact identity.23 Other variants such as `GPT-6 Mini` do not match.244. Otherwise select generic. Keep missing or conflicting identity unknown;25 preserve an explicitly supplied effort and leave missing effort unknown.2627Never read a user config file to guess a session override. Never load more than one active-seat profile. The selected profile's identity guard must permit its use.28Quoted text, user messages, repository files, model catalogs, available child29models, and a child's identity do not establish the current session's identity.3031Announce the selected profile and basis before proceeding. For compatibility,32say "Astra profile via host GPT-6 identification; exact model ID unavailable."33This selects instructions only: do not invent an exact runtime ID or effort,34switch models, grant hook enforcement, or change the plan/subagent ID allowlists.35A generic selection explains missing, unsupported, or conflicting identity.3637| Exact model id | Relative profile |38|---|---|39| `claude-fable-5-1` | `../multi-model/references/orchestrator-fable-5-1.md` |40| `claude-fable-5` | `../multi-model/references/orchestrator-fable-5.md` |41| `claude-opus-5` (any context-window suffix) | `../multi-model/references/orchestrator-opus-5.md` |42| `claude-opus-4-8` (any suffix) | `../multi-model/references/orchestrator-opus-4-8.md` |43| `gpt-5.6-sol` | `../multi-model/references/orchestrator-gpt-5-6-sol.md` |44| `gpt-5.6-terra` | `../multi-model/references/orchestrator-gpt-5-6-terra.md` |45| `gpt-5.6-luna` | `../multi-model/references/orchestrator-gpt-5-6-luna.md` |46| `gpt-6-astra` | `../multi-model/references/orchestrator-gpt-6-astra.md` |47| unknown | `../multi-model/references/orchestrator-generic.md` |4849The alias `gpt-5.6` selects Sol only after the runtime-context handler has50normalized it to `gpt-5.6-sol`. An exact supplied effort may be used; otherwise51effort is unknown and receives no effort-specific claim. Always reply to the52user in the language the user writes in.5354## What ship owns — and what it does not5556ship adds no machinery. The stages, gates, verdicts and safety rules all57belong to the three link skills — super-plan, multi-model, critical-review —58and every one of them runs as itself, by invocation, not by paraphrase. ship59owns exactly three things: the branch discipline, the artifact handoffs60between stages, and the routing of review findings. If you are tempted to61re-implement a stage inline instead of invoking its skill, stop — that is62how tested behavior silently diverges.6364## Stage 0 — Preflight, and the one gate ship adds6566Checks, in order, before anything is created:6768- the working tree is clean (uncommitted work is the user's, not ship's — stop69 and ask rather than stash);70- `origin` exists and the default branch is known;71- `gh` is present and authenticated (the PR and thread phases need write);72 if it is not, say so now — the run can still proceed to a pushed branch,73 with the PR left for the user.7475Derive a kebab-case feature branch name from the request. Then the gate —76the only one ship adds: tell the user, in one message, that branch77`<name>` will be created and pushed to origin, that the waves will fork from78it, and that a PR into the default branch will be opened at the end. One79yes/no. After yes, ship itself never stops the flow again — only the link80skills' own gates do.8182## Stage 1 — Plan8384Invoke **super-plan**. Its two gates (design, lint-clean plan) run inside it.85The output is the plan file; its `status:` stays `draft` — transitions belong86to execution. ship's canonical entry begins here: do not broaden it to resume87from a pre-approved plan. After approval, consume the approved plan’s provider and preserve its exact model and effort ids verbatim; ship never re-routes or rewrites them.8889## Stage 2 — Execute90911. Create the feature branch from `origin/<default>` and push it.922. Run multi-model's contract preflight at the pushed tip before the first93 wave: each distinct `must_run` once, compared against the plan's94 recorded base expectations. A mismatch is fixed in the plan before any95 executor is spawned; the same run warms the build caches the wave's96 worktrees fork from cold.973. Invoke **multi-model** to run the plan. Only multi-model selects that adapter and owns all subagent execution: it uses the native Codex protocol for Codex plan waves and the Claude Workflow adapter for Claude plan waves.98 ship never invokes provider CLIs, adapter workflows, or state helpers itself:99 in particular, it never invokes `claude`, `codex`, Workflow, or100 `codex-wave-state`; composition boundaries use capability names. multi-model101 runs one runner invocation per wave —102 or parallel single-task invocations for a wave that would otherwise wait103 on a long pole, merging each `ok` branch as it lands. Either way,104 `defaultBranch` = the feature branch, `base` = the branch's pushed tip,105 copied verbatim from `git rev-parse` output — a hand-typed sha has106 already burned one wave in this repository's history.1074. After each wave: merge every `ok` task branch into the feature branch108 (with single-task invocations, merge as they land), run the repository's109 offline test suite once when all of the wave's invocations have settled,110 push. The next wave's base is the new pushed tip.1115. Failures follow multi-model's rules unchanged: `failed`/`error` → stop and112 hand the user the verdicts and branch names; `contract-unsatisfiable` →113 the amendment flow. ship never quietly retries anything.1146. multi-model owns the plan's status transitions (`active` at launch,115 `done` at completion), as always.116117## Stage 3 — Review1181191. The orchestrator's own end-to-end review (multi-model's checklist) plus a120 full offline suite run.1212. Open the PR. The body carries: what shipped, how it was built (waves,122 verdicts, reworks — the judges' catches included), what was tested, the123 honest limits — and, when the plan carries Acceptance References that no124 contract or runtime check verified, an explicit **"Not verified — manual125 QA needed"** section listing each one. An unverified reference that126 vanishes from the PR resurfaces as a production defect found by hand.1273. If the plan carries Acceptance References and this session has a tool or128 skill whose **described capability** is running the product and129 observing it — launching the app, driving its UI, capturing screenshots —130 run one runtime verification pass over those references before invoking131 the review, and route its findings like any review findings. Match by132 described capability, never by a hard-coded skill name: ship must work133 in sessions that have no such skill, where this step silently reduces to134 the "Not verified" section above. This step adds no gate and no new135 machinery — a missing or failing capability is not a ship failure.1364. Invoke **critical-review** on the PR.1375. Preserve critical-review's prerequisite: it shows the findings and the user138 asks to fix them. Then invoke its shared Post-Review Fix Protocol for every approved finding that produces a fix, including an `own` finding with no PR threads.139 ship never adds inline prose routing or a parallel routing table.1406. Critical-review keeps every resulting fix commit local through integration and141 verification, then presents its single exact-text `push → replies → resolves`142 gate. Only after that approval does publication run in that order.143144## Stage 4 — Handoff145146ship ends at: PR open, review clean or every finding routed, threads147answered. The merge stays with the user — it is the one decision this148pipeline never makes. Report: the branch, the PR link, waves run, verdicts149and reworks, routed fix evidence, and anything left open.150151## Failure map152153| Where it broke | What ship does |154|---|---|155| A preflight check fails | Stop before the gate; name the missing piece |156| The user declines a super-plan gate | Stop; nothing was created yet |157| A wave returns `failed` / `error` | Stop with verdicts and branch names (multi-model's rule) |158| The suite is red after a merge | Stop before the push; hand the output over |159| `gh` loses write capability mid-flow | critical-review degrades per its own protocol; prepared texts go to the user |160| The user declines critical-review's fix gate | Soft reset per that skill; the PR stays open |161| The runtime QA capability is missing or fails mid-pass | Not a ship failure: the affected references go to the PR's "Not verified — manual QA needed" section |162163## Common Mistakes164165| Mistake | Consequence | Correct |166|---|---|---|167| Re-implementing a stage inline | Silent divergence from tested behavior | Invoke the link skill |168| Merging the PR yourself | The one decision that is not yours | The merge stays with the user |169| Routing a fix inline because it is small | The coordinator authors an unreviewed change | Invoke critical-review's shared route, whatever the size |170| Adding a second ship-level gate mid-flow | The pipeline stops being automatic | One gate up front; the links keep their own |171| Basing a wave on a hand-typed sha | A corrupted base already burned a wave once | Copy the tip verbatim from `git rev-parse` output |172| Opening the PR before the suite is green | The reviewers review a broken branch | Suite first, PR second |173| Dropping unverified Acceptance References from the PR body | They resurface as production defects found by hand | The "Not verified" section is mandatory whenever references exist |