Installs into .claude/skills of the current project.
Sponsors
SSkills DirectorySkills Directory
Know which skills are safe — weekly.
SSkills DirectorySkills Directory
Is that skill safe to install?
Are you the author of Ship?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/morgankryze-ship)
---
name: ship
description: "Ship a GTM branch: gate, PR text, then push, merge, tag or release only on the human's go. Use when /gtm:deliver is ready."
argument-hint: "[branch or slug]"
---
# Ship (checkpoint 3: the go)
Ground rules: as in the `gtm` skill §0. Nothing is pushed, merged, tagged or released without the
human's explicit go **in this conversation**, for that exact action.
## 1. Check
The final review says ready, or the last `run` line a delivery wrote for this slug holds
`final review skipped: one task, clean at 0 fix rounds` or `Fix: CLEAN, no final review`
(read anywhere else, neither counts); the working tree is clean; the gate passes once more
(run it, quote the result). Commit messages carry nothing from `git.forbid` (check with
`git log --format=%B`).
## 2. Write the PR text
`<root>/reports/<slug>/pr.md`, written as `<root>/guidelines/voice.md` says: a Conventional title; a body with the Summary, what changed
for the user, how it was proven (tests, gate, review verdicts), the decisions made for you, the deferred minors.
Never name anything in `git.never_name`. With `stealth: on`, the body takes the shape of the
project's own recent PRs, with none of GTM's section names (Summary, decisions made for you, deferred minors).
With humanize `on` in `<root>/team.md` and present, run its audit on `pr.md` as
`${CLAUDE_PLUGIN_ROOT}/templates/companions.md` says (humanize), before §2b, and give its one
briefing line.
## 2b. Footprint check (stealth on only)
Run, and quote the result:
`node ${CLAUDE_PLUGIN_ROOT}/scripts/footprint-check.mjs --config <root>/config.yml --base <git.base> --pr <root>/reports/<slug>/pr.md`
Any hit stops the ship. Show each hit with its location, then fix: files in a new commit, the PR
text in place, commit messages by rewording the unpushed commits (a decision card: it rewrites
local history). A false positive goes to `footprint.allow` only with the human's answer. Rerun
until it reports no hit. Notes (lists of three, short bullet runs) do not stop it: reread those
lines against `guidelines/voice.md`.
## 3. Ask the go (one decision card)
**Decision: what to do with <branch>**
| Option | What it means |
| --- | --- |
| **A** push | push and open the PR |
| **B** merge | merge locally into <base> (merge commit) |
| **C** wait | nothing leaves the machine |
**I recommend: <letter>**, <why>. **Cost if wrong:** <one line>.
Execute exactly what was approved. Merge as `git.merge` says; never squash or rewrite history
unless the config says so. Tag and release only when asked: release notes from the CHANGELOG or
the commits since the last tag, grouped by type, in the project's voice (`guidelines/voice.md`);
the same humanize pass runs on the notes, then with `stealth: on` §2b's command with `--pr <notes
file>`, and the notes are shown to the human with the release go.
## 4. After the human deploys
If `qa.live_url` is set, offer one line: run `gtm:release-qa` on the live instance. Report per the
briefing format; a bug becomes a Fix or a Feature through `/gtm:gtm`.
Once merged, mark the story done in `<root>/backlog.md` (definition of done: `guidelines/work.md`).
Then suggest `/gtm:retro` in one line.