/handoff
Ship completed work: verify locally, commit related changes, push, create or update the PR, watch CI/reviews, and fix until merge-ready or escalated. Use for "ship it", "create PR", "handoff", or finished code needing delivery.
$ npx -y skills add heliohq/ship --skill handoff --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/handoff
Context preview
The summary Claude sees to decide when to auto-load this skill.
Ship completed work: verify locally, commit related changes, push, create or update the PR, watch CI/reviews, and fix until merge-ready or escalated. Use for "ship it", "create PR", "handoff", or finished code needing delivery.
SKILL.md
handoff.SKILL.mdname: handoff
version: 0.5.0
description: >
Ship completed work: verify locally, commit related changes, push, create or
update the PR, watch CI/reviews, and fix until merge-ready or escalated. Use
for "ship it", "create PR", "handoff", or finished code needing delivery.
allowed-tools:
- Bash
- Read
- Write
- Edit
- Grep
- Glob
- Agent
- AskUserQuestion
- Monitor
- TaskStop
- mcp__codex__codex
- mcp__codex__codex-reply
Ship: Handoff
Do not stop when the PR is created. Do not stop while any GitHub check is pending. If any GitHub check fails, fix the problem, push again, and wait again. If the PR is not merge-ready, sync with base or resolve conflicts inside the same fix loop.
This is a goal-directed loop, not a counted one. Keep looping while each round makes progress toward the completion conditions; escalate on evidence, never on a round counter — the specific evidence classes are in [Loop Governance](#loop-governance). Done means every condition in [Completion](#completion) is satisfied.
Process Flow
Phase index — the phases below own the detail:
1. Pre-flight (resolve branch, base, and scope) 2. Verify locally 3. Update changelog / directly affected docs 4. Push and create/update the PR 5. Wait for GitHub checks 6. Fix loop — governed by the round ledger, not a counter
Red Flag
**Never:**
- **Stop when the PR is created** — #1 failure mode
- Push code changes without re-running relevant local verification
- Force push without `--force-with-lease`
- Rewrite an already-pushed PR branch when there are human review,
approval, or shared-branch signals
- Treat `pending` checks as "good enough"
- Treat green checks as sufficient when `mergeStateStatus` is still blocked
- Create the PR before local verification runs
- Use `git add -A` when unrelated local changes are present
- Forget to stage and commit changelog or doc edits before the first push
- Mark a thread or comment as resolved before the fix is actually pushed
- Resolve comments that still need product, security, or architecture judgment
- Silently ignore a comment — a decline is a visible reply with a reason
- Apply "further fixes add no value" to CI or merge-readiness — that
judgment exists only for the comment decline classes
- Fix failures without reading the actual check logs or review comments
- Sync with base preemptively — only when drift, conflicts, or repo policy require it
- Re-attempt a fix for a failure signature that already survived a fix
aimed at it — the second identical outcome is evidence the approach is wrong; escalate with the ledger instead of iterating on hope
- Count rounds as a stopping condition — progress, judgment, and external
blockers are the only reasons to stop looping
- Leave doc debt implicit — carry it into the PR
---
Loop Governance
Modern harnesses run goal-directed loops natively — a fixed retry cap abandons hard-but-progressing PRs while adding no safety that progress detection doesn't provide better. The loop is governed by three things:
**1. Progress detection (the round ledger).** Every fix round appends one block to `<task_dir>/handoff.md` (or tracks inline when no task dir):
Round <i>: trigger=<check name + error class, or "conflict"/"review">
action=<what was changed, one line>
result=<next terminal state: new signature | same signature | green>
Before starting a round, compare the current failure to the ledger:
- **New failure signature** (different check, or same check failing
differently) → progress; loop.
- **Same signature after a fix aimed at it** → the approach is wrong.
Escalate with the ledger as evidence — do not iterate on hope.
- The ledger survives context compaction; after a compaction, trust it
over recollection.
**2. Judgment boundaries.** Product/security/architecture review comments, conflicts you cannot resolve confidently, and rebase-policy dead ends escalate immediately regardless of progress. A fix that would change the shipped behavior (not just repair its delivery) is scope drift — escalate; the fix loop repairs delivery, it does not redesign.
**3. The harness's own goal net.** Under `/ship:auto`, the stop gate already blocks session exit until the PR is merge-ready. In a standalone run on a harness with a native goal condition (e.g. Claude Code's `/goal`), suggest the user arm one at the start — `PR checks green and merge-ready, or stop after 25 turns` — as the outer bound; the harness's turn bound replaces any hand-rolled cap.
Progress Tracking
Track your progress with the harness's task/todo list. Create the items at the start based on what the repo actually needs. Not every repo has a CHANGELOG, CI, or docs to update — only include items for work that will actually happen.
**Principle**: one item per phase the user would wait on. Fix rounds are dynamic — add them only when a check fails.
---
Phase 1: Pre-flight
Resolve only the context needed to ship the PR:
1. Determine the current branch.
- If HEAD is detached, create a feature branch before continuing.
2. Determine the base branch:
- use the existing PR base if a PR already exists
- otherwise use the repo default branch
3. If the current branch is the base branch, create a feature branch before continuing. 4. Inspect the current scope with `git status --short`, `git diff <base>...HEAD --stat`, `git diff --cached --stat`, and `git diff --stat`. 5. Decide which local changes belong to this handoff. 6. Do not use `git add -A` unless every dirty file belongs to this handoff. 7. If unrelated local changes cannot be separated safely, stop and escalate instead of guessing. 8. If the caller already provides `task_dir`, use it. Otherwise do not guess one here; resolve it only if a later phase needs to write artifacts.
Output a short start summary with the branch, base branch, and scope being shipped.
Phase 2: Verify Before PR
Before the first push in handoff, run the most relevant local verificatio
Read more
name: handoff version: 0.5.0 description: > Ship completed work: verify locally, commit related changes, push, create or update the PR, watch CI/reviews, and fix until merge-ready or escalated. Use for "ship it", "create PR", "handoff", or finished code needing delivery. allowed-tools: - Bash - Read - Write - Edit - Grep - Glob - Agent - AskUserQuestion - Monitor - TaskStop - mcp__codex__codex - mcp__codex__codex-reply
Ship: Handoff
Do not stop when the PR is created. Do not stop while any GitHub check is pending. If any GitHub check fails, fix the problem, push again, and wait again. If the PR is not merge-ready, sync with base or resolve conflicts inside the same fix loop.
This is a goal-directed loop, not a counted one. Keep looping while each round makes progress toward the completion conditions; escalate on evidence, never on a round counter — the specific evidence classes are in [Loop Governance](#loop-governance). Done means every condition in [Completion](#completion) is satisfied.
Process Flow
Phase index — the phases below own the detail:
1. Pre-flight (resolve branch, base, and scope) 2. Verify locally 3. Update changelog / directly affected docs 4. Push and create/update the PR 5. Wait for GitHub checks 6. Fix loop — governed by the round ledger, not a counter
Red Flag
**Never:**
- **Stop when the PR is created** — #1 failure mode
- Push code changes without re-running relevant local verification
- Force push without `--force-with-lease`
- Rewrite an already-pushed PR branch when there are human review,
approval, or shared-branch signals
- Treat `pending` checks as "good enough"
- Treat green checks as sufficient when `mergeStateStatus` is still blocked
- Create the PR before local verification runs
- Use `git add -A` when unrelated local changes are present
- Forget to stage and commit changelog or doc edits before the first push
- Mark a thread or comment as resolved before the fix is actually pushed
- Resolve comments that still need product, security, or architecture judgment
- Silently ignore a comment — a decline is a visible reply with a reason
- Apply "further fixes add no value" to CI or merge-readiness — that
judgment exists only for the comment decline classes
- Fix failures without reading the actual check logs or review comments
- Sync with base preemptively — only when drift, conflicts, or repo policy require it
- Re-attempt a fix for a failure signature that already survived a fix
aimed at it — the second identical outcome is evidence the approach is wrong; escalate with the ledger instead of iterating on hope
- Count rounds as a stopping condition — progress, judgment, and external
blockers are the only reasons to stop looping
- Leave doc debt implicit — carry it into the PR
---
Loop Governance
Modern harnesses run goal-directed loops natively — a fixed retry cap abandons hard-but-progressing PRs while adding no safety that progress detection doesn't provide better. The loop is governed by three things:
**1. Progress detection (the round ledger).** Every fix round appends one block to `<task_dir>/handoff.md` (or tracks inline when no task dir):
Round <i>: trigger=<check name + error class, or "conflict"/"review"> action=<what was changed, one line> result=<next terminal state: new signature | same signature | green>
Before starting a round, compare the current failure to the ledger:
- **New failure signature** (different check, or same check failing
differently) → progress; loop.
- **Same signature after a fix aimed at it** → the approach is wrong.
Escalate with the ledger as evidence — do not iterate on hope.
- The ledger survives context compaction; after a compaction, trust it
over recollection.
**2. Judgment boundaries.** Product/security/architecture review comments, conflicts you cannot resolve confidently, and rebase-policy dead ends escalate immediately regardless of progress. A fix that would change the shipped behavior (not just repair its delivery) is scope drift — escalate; the fix loop repairs delivery, it does not redesign.
**3. The harness's own goal net.** Under `/ship:auto`, the stop gate already blocks session exit until the PR is merge-ready. In a standalone run on a harness with a native goal condition (e.g. Claude Code's `/goal`), suggest the user arm one at the start — `PR checks green and merge-ready, or stop after 25 turns` — as the outer bound; the harness's turn bound replaces any hand-rolled cap.
Progress Tracking
Track your progress with the harness's task/todo list. Create the items at the start based on what the repo actually needs. Not every repo has a CHANGELOG, CI, or docs to update — only include items for work that will actually happen.
**Principle**: one item per phase the user would wait on. Fix rounds are dynamic — add them only when a check fails.
---
Phase 1: Pre-flight
Resolve only the context needed to ship the PR:
1. Determine the current branch.
- If HEAD is detached, create a feature branch before continuing.
2. Determine the base branch:
- use the existing PR base if a PR already exists
- otherwise use the repo default branch
3. If the current branch is the base branch, create a feature branch before continuing. 4. Inspect the current scope with `git status --short`, `git diff <base>...HEAD --stat`, `git diff --cached --stat`, and `git diff --stat`. 5. Decide which local changes belong to this handoff. 6. Do not use `git add -A` unless every dirty file belongs to this handoff. 7. If unrelated local changes cannot be separated safely, stop and escalate instead of guessing. 8. If the caller already provides `task_dir`, use it. Otherwise do not guess one here; resolve it only if a later phase needs to write artifacts.
Output a short start summary with the branch, base branch, and scope being shipped.
Phase 2: Verify Before PR
Before the first push in handoff, run the most relevant local verificatio
Showing the first part of this file.
An agentic development harness for Claude Code & Codex: agent-routed workflows from raw requirement to green PR.
Repo: heliohq/ship
Other skills on ship.
- /arch-design
System-design thinking before any doc or code: goals/non-goals, back-of-envelope numbers, components and contracts, failure modes, operability, security, trade-offs. Use for "design this system", "architecture for X", "trade-offs for X", "how should we architect", "API design",
Open skill - /auto
Run Ship's full production workflow from raw requirement to PR: design, dev, E2E, review, QA, refactor, and handoff. Use only for explicit /ship:auto, auto pipeline requests, or end-to-end delivery.
Open skill - /design
Plan implementation before coding: investigate the repo, write spec and plan, and validate with a peer. Use for "plan", "design approach", "scope", or any coding task needing a plan. Not system-design thinking (/ship:arch-design) or full /ship:auto.
Open skill - /dev
Implement from a spec or plan: extract stories, build in safe waves, test, commit, and get peer review per story. Use for "implement", "build/code this plan", or targeted fix findings. If no plan exists, use /ship:design first.
Open skill - /e2e
Add durable end-to-end tests for user/API-visible behavior. Detect or scaffold the E2E framework, write tests, run the app, and store evidence. Use for E2E, Playwright/Cypress, regression tests, or quality gates. Not exploratory QA.
Open skill - /qa
Runtime QA of a change: start the app, test acceptance criteria and edge cases, and report evidence. Use for "test this", "QA", "does it work", exploratory checks, or post-review runtime verification. Not static code review.
Open skill

