This skill should be used when the user says "ship it", "arness code ship", "create PR", "open pull request", "push and PR", "commit and push", "wrap up", "ship the feature", "ship the fix", "ready to ship", "push changes", "finalize", "finish up", or wants to commit, push, and optionally open a pull request. Guides through branching, staging, committing with meaningful messages, pushing, and PR creation. Works standalone or as the final Arness pipeline step. Do NOT use this for reviewing PRs — use /arn-code-review-pr for that.
84
81%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
Guides through branching, staging, committing, pushing, and optionally opening a pull request. Works standalone or as the final step in the Arness pipeline.
Pipeline position:
arn-code-review-implementation -> arn-code-document-project -> **arn-code-ship**This skill handles the entire shipping workflow: verifying git state, ensuring the user is on the right branch, staging changes safely, generating meaningful commit messages, pushing, and creating a pull request via the GitHub CLI or Bitbucket CLI.
Check ## Arness config in CLAUDE.md for Git: yes. If not present, run runtime check: git rev-parse --is-inside-work-tree.
If Git is not available, inform the user: "This project is not a git repository. /arn-code-ship requires Git." and exit.
Read the Platform field from ## Arness config in CLAUDE.md (values: github, bitbucket, or none). Store this value for use in Step 5. If the Platform field is not present, fall back to legacy detection: check for GitHub: yes and treat as github; otherwise treat as none.
Gather current state:
git branch --show-currentgit status --short (never use -uall)git log main..HEAD --oneline (skip if on main)git rev-parse --abbrev-ref @{upstream} (may fail if no upstream)If no uncommitted changes AND no commits ahead of remote, inform the user: "Nothing to ship — working tree is clean and up to date with remote." and exit.
If on main/master:
feat/websocket-support, fix/checkout-500-error)git checkout -b <branch-name>If on a feature branch:
<branch-name>. Proceeding."git status --short and git diff --stat.env, .env.*credential, secret, token, password, key in their nameid_rsa, *.pem, *.keyLinting: field from CLAUDE.md ## Arness block:
Linting: none or Linting: skip (or the field is missing) — skip this sub-step silently and proceed to staging.Linting: enabled:
Read <code-patterns-dir>/linting.md (the per-service detection produced by arn-code-codebase-analyzer, covering both linters and formatters).
Compute the staged diff scope: git diff --name-only HEAD (or against the base branch if uncommitted changes are not yet staged — fall back gracefully).
For each section in linting.md whose Scope hint intersects the diff, invoke the section's Discovered check command against the changed files within that scope. The discovered command MUST be a check-only invocation per the analyzer contract — never run a mutation/write command as the gate. When the underlying tool supports per-file invocation, narrow accordingly; otherwise run as-is.
Aggregate results across all invocations: total issue count N, broken down by kind (lint vs format) and severity (error/warning/info), and per service.
If N == 0: print a one-line confirmation ("Lint and format clean: 0 issues across <services>.") and proceed to staging.
If N > 0: show the breakdown (per-service counts, lint vs format totals, severity totals). Determine the suggested default:
N <= 20 → suggest Fix nowN > 20 → suggest File a backlog issue
Then ask (using AskUserQuestion):Found N issues across <comma-separated services> (<L> lint, <F> format). Suggested: <Fix now | File a backlog issue>. How would you like to proceed?
- Fix now — pause shipping, address the issues, then return
- File a backlog issue and proceed — record the issues for later, proceed with commit
- Proceed with documented reason — annotate the commit message with rationale, proceed without filing a backlog issue
Apply the choice:
arn-code-ship. Tell the user: "Run your linter or formatter, fix the issues, then re-run /arn-code-ship when ready." Do not commit. (Note: format violations are usually auto-fixable via the project's write-mode formatter command, but this skill never invokes mutation commands itself.)Issue tracker field from ## Arness. For github: gh issue create --title "Lint/format backlog: N issues from <branch>" --body "<output summary including lint vs format breakdown>". For jira: use the Atlassian MCP server to create the issue with the same title and body. For none: warn the user that no issue tracker is configured and fall back to choice (3). Then proceed to staging.N=1, suggested default: Fix now). Do not silently skip the gate on a tool failure.AskUserQuestion:
git add -A## Arness config from CLAUDE.md to get the plans directoryCHANGE_RECORD.json in plans subdirectories: SWIFT_*/CHANGE_RECORD.json, STANDARD_*/CHANGE_RECORD.json, CATCHUP_*/CHANGE_RECORD.json, and */CHANGE_RECORD.jsonceremonyTier field to determine the tier taggit log --oneline -10 and follow it. Default to imperative mood (e.g., "Add feature X", not "Added feature X").[swift], [standard], [thorough], or [catchup] (e.g., [swift] Add rate limiting to /api/users)git diff --staged --stat and file contentgit rev-parse --abbrev-ref @{upstream}git pushgit push -u origin <branch-name>git pull --rebase firstUse the Platform value read in Step 1 to determine the PR creation path.
Deferred Label Check:
If Platform is github: check if Arness labels exist by running gh label list --search "arness-". If fewer than 7 Arness labels are found, create the missing ones using gh label create --force for each label per ${CLAUDE_PLUGIN_ROOT}/skills/arn-code-init/references/platform-labels.md. This is idempotent and safe to run on every invocation.
If Platform is bitbucket or Issue tracker is jira: no label creation needed (Jira labels are implicit, Bitbucket uses different mechanisms).
Ask: "Would you like to create a pull request?"
If no: confirm the push was successful and exit.
If yes, branch based on Platform:
Run runtime check if needed: gh auth status. If GitHub CLI is not available or not authenticated, inform the user and skip this step.
Ceremony: [tier] line (e.g., "Ceremony: swift")specRef (if non-empty): Spec: [specRef]review.verdict (if present): Review: [verdict]filesModified and filesCreated arraysgh pr create --draft) if the user wants feedback before marking it ready for reviewgh pr create --title "..." --body "..." (add --draft if chosen)/arn-code-review-pr after receiving feedback on the pull request."Run runtime check: bkt auth status. If bkt is not available or not authenticated, inform the user and skip this step.
git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'bkt pr create --title "..." --description "..." --source <branch> --destination <default-branch>bkt output/arn-code-review-pr after receiving feedback on the pull request."Skip PR creation. Inform user: "No platform configured for PR creation. Run /arn-shipping to get started."
If a CHANGE_RECORD.json was found in Step 3, update it after the commit and push (regardless of whether a PR was created):
commitHash from git rev-parse HEADcommitMessage from the commit message usednextSteps array (e.g., "PR: [url]")If no CHANGE_RECORD.json was found, skip this step silently.
After pushing (and optionally creating a PR), check for sketch directories in these locations:
arness-sketches/ at the project root (all paradigms)app/arness-sketches/, pages/arness-sketches/, src/routes/arness-sketches/Scan for subdirectories whose names match the shipped feature (by branch name, spec name, or feature ID).
If matching sketch directories are found, read each sketch's sketch-manifest.json to determine the paradigm, previewCommand, and status fields. Include previewCommand in the user-facing message when presenting options: "Preview was available via: [previewCommand]".
Present options based on the manifest status:
If status is "promoted":
"Found sketch directory arness-sketches/<name>/ for this feature. This sketch was already promoted into your codebase."
If status is "kept":
"Found sketch directory arness-sketches/<name>/ for this feature. What would you like to do?"
If status is "draft":
"Found sketch directory arness-sketches/<name>/ for this feature. This sketch was never finalized (draft status)."
If status is "consumed":
"Found sketch directory arness-sketches/<name>/ for this feature. This sketch was fully consumed during implementation -- all components were promoted."
Suggest Delete as the default action. Also offer Keep if the user wants to preserve for reference.
Action handling:
If Delete:
paradigm is web, check the project's framework (from architecture.md or the manifest's framework field) to determine if router cleanup is needed. File-system-routed frameworks (Next.js, SvelteKit, Nuxt) need route entry removal. Config-routed frameworks (React Router, Vue Router) need router config cleanup. Other web frameworks may only need directory deletion. For CLI, TUI, desktop, and mobile paradigms, simple directory deletion is sufficient -- no router cleanup is needed.If Keep: skip silently.
If Promote (only available for "kept" status): inform: "Sketch promotion copies the output files to your project. Review and integrate manually after this step."
If no matching sketch directories are found, skip this step silently.
This step is entirely optional — it activates only when a greenfield feature backlog exists. Projects without greenfield skip this step silently and proceed to the completion summary. It identifies the shipped feature (by branch name, spec, or commits), marks it as done, handles sub-feature parent rollup, and reports newly unblocked features.
Read
${CLAUDE_PLUGIN_ROOT}/skills/arn-code-ship/references/feature-tracker-update.mdfor the full detection chain, update workflow, and sub-feature parent rollup logic.
git pull --rebase, never force-push automatically.gh CLI not authenticated — inform user, skip PR creation, suggest gh auth login.bkt CLI not authenticated — inform user, skip PR creation, suggest bkt auth login.bkt, offer to retry.GitHub: yes detection. If neither found, treat as none./arn-spark-feature-extract to regenerate.1fe948f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.