/ship
Final shipping gate. PR creation, documentation updates, and merge with human approval.
$ npx -y skills add elb-pr/claudikins-kernel --agent claude-codeShips with claudikins-kernel. Installing the plugin gets this command.
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/ship
Context preview
What this command does when you run it.
Final shipping gate. PR creation, documentation updates, and merge with human approval.
Command definition
ship.mdname: claudikins-kernel:ship
description: Final shipping gate. PR creation, documentation updates, and merge with human approval.
argument-hint: <branch-name> [--target main|develop] [--skip-docs] [--squash|--preserve] [--dry-run]
agent_outputs:
- agent: git-perfectionist
capture_to: .claude/agent-outputs/documentation/
merge_strategy: jq -s 'add'
allowed-tools:
- Read
- Grep
- Glob
- Bash
- Task
- AskUserQuestion
- TodoWrite
- Skill
skills:
- shipping-methodology
output-schema:
type: object
properties:
session_id:
type: string
status:
type: string
enum: [shipped, paused, aborted, dry-run]
source_branch:
type: string
target_branch:
type: string
pr_url:
type: string
merge_strategy:
type: string
enum: [squash, preserve, rebase]
docs_updated:
type: array
items:
type: string
commit_sha:
type: string
required: [session_id, status, source_branch, target_branch]claudikins-kernel:ship Command
You are orchestrating a shipping workflow that takes verified code to production with human approval at every stage.
Flags
| Flag | Effect | | ----------------- | --------------------------------------- | | `--branch NAME` | Ship specific branch (default: current) | | `--target BRANCH` | Target branch for merge (default: main) | | `--skip-docs` | Skip documentation updates (Stage 3) | | `--squash` | Squash commits into single commit | | `--preserve` | Preserve commit history | | `--dry-run` | Preview ship without merging | | `--session-id ID` | Resume previous session by ID | | `--resume` | Resume from last checkpoint | | `--status` | Show current ship status | | `--list-sessions` | Show available sessions for resume |
Merge Strategy
JQ merge - documentation outputs are combined with `jq -s 'add'`.
Philosophy
> "Ship with confidence, not hope." - Shipping philosophy
- claudikins-kernel:ship is the final gate after claudikins-kernel:verify passes
- GRFP-style: section-by-section approval at every stage
- Human decides final merge - no auto-merging
- Code integrity validation ensures we ship what was verified
- Documentation is part of shipping, not optional
State Management
State file: `.claude/ship-state.json`
{
"session_id": "ship-YYYY-MM-DD-HHMM",
"verify_session_id": "verify-YYYY-MM-DD-HHMM",
"verified_commit": "abc123...",
"target": "main",
"started_at": "ISO timestamp",
"status": "initialising|shipping|completed|failed",
"phases": {
"pre_ship_review": { "status": "pending|APPROVED|SKIPPED" },
"commit_strategy": { "status": "pending|APPROVED", "strategy": null },
"documentation": { "status": "pending|COMPLETED|SKIPPED" },
"pr_creation": { "status": "pending|CREATED", "pr_number": null },
"merge": { "status": "pending|MERGED", "sha": null }
},
"unlock_merge": false,
"cleanup": {
"branches_deleted": []
}
}Stage 0: Initialisation
Flag Handling
Check for flags first:
--status → Display current ship status, exit
--resume → Load checkpoint, resume from saved state
--list-sessions → Show available sessions, exit
--dry-run → Run through stages without actual merge
Prerequisite Check (via ship-init.sh hook)
The SessionStart hook validates:
1. verify-state.json exists and unlock_ship is true 2. Code integrity (C-5): verified commit matches current HEAD 3. File integrity (C-7): source file manifest unchanged 4. Creates initial ship-state.json 5. Links to verify session for traceability
**On validation failure:**
ERROR: claudikins-kernel:verify gate check failed
Reason: ${FAILURE_REASON}
[Re-run claudikins-kernel:verify] [Abort]**On code integrity failure (C-5, C-7):**
ERROR: Code has changed since verification
Verified commit: ${VERIFIED_COMMIT}
Current commit: ${CURRENT_COMMIT}
Code must not change between claudikins-kernel:verify and claudikins-kernel:ship.
[Re-run claudikins-kernel:verify] [Abort]Stage 1: Pre-Ship Review
Show what's being shipped. Human confirms ready.
Display Ship Summary
Pre-Ship Review
===============
Verification Session: ${VERIFY_SESSION_ID}
Verified at: ${VERIFY_TIMESTAMP}
Branches to merge:
${BRANCH_LIST}
Changes:
Files changed: ${FILE_COUNT}
Lines added: +${ADDITIONS}
Lines removed: -${DELETIONS}
Evidence from verification:
Screenshots: ${SCREENSHOT_COUNT}
API tests: ${API_TEST_COUNT}
CLI tests: ${CLI_TEST_COUNT}
Ready to proceed?
[Continue to Commit Strategy] [Review Evidence] [Back to Verify] [Abort]Stage 1 Checkpoint
On "Continue":
- Set `phases.pre_ship_review.status = "APPROVED"`
- Proceed to Stage 2
On "Review Evidence":
- Display evidence from `.claude/evidence/`
- Return to checkpoint
On "Back to Verify":
- Set `status = "aborted"`
- Output: "Run `claudikins-kernel:verify` to re-verify"
Stage 2: Commit Strategy
Decide how to commit the changes.
Strategy Selection
Commit Strategy
===============
How should we commit these changes?
[Squash into single commit] (Recommended for features)
[Preserve commit history] (For large multi-part work)
**If --squash flag set:** Auto-select squash **If --preserve flag set:** Auto-select preserve
Commit Message Draft (Squash)
For squash, draft a commit message:
Commit message:
feat(${SCOPE}): ${TITLE}
${BODY}
Closes #${ISSUE_NUMBER}
[Accept] [Revise] [Back]Follow conventional commits format:
- `feat:` for new features
- `fix:` for bug fixes
- `chore:` for maintenance
- `feat!:` or `BREAKING CHANGE:` for breaking changes
Stage 2 Checkpoint
On "Accept":
- Set `phases.commit_strategy.status = "APPROVED"`
- Set `phases.commit_strategy.strategy = "squash|preserve"`
- Record commit message in state
- Procee
Read more
name: claudikins-kernel:ship
description: Final shipping gate. PR creation, documentation updates, and merge with human approval.
argument-hint: <branch-name> [--target main|develop] [--skip-docs] [--squash|--preserve] [--dry-run]
agent_outputs:
- agent: git-perfectionist
capture_to: .claude/agent-outputs/documentation/
merge_strategy: jq -s 'add'
allowed-tools:
- Read
- Grep
- Glob
- Bash
- Task
- AskUserQuestion
- TodoWrite
- Skill
skills:
- shipping-methodology
output-schema:
type: object
properties:
session_id:
type: string
status:
type: string
enum: [shipped, paused, aborted, dry-run]
source_branch:
type: string
target_branch:
type: string
pr_url:
type: string
merge_strategy:
type: string
enum: [squash, preserve, rebase]
docs_updated:
type: array
items:
type: string
commit_sha:
type: string
required: [session_id, status, source_branch, target_branch]claudikins-kernel:ship Command
You are orchestrating a shipping workflow that takes verified code to production with human approval at every stage.
Flags
| Flag | Effect | | ----------------- | --------------------------------------- | | `--branch NAME` | Ship specific branch (default: current) | | `--target BRANCH` | Target branch for merge (default: main) | | `--skip-docs` | Skip documentation updates (Stage 3) | | `--squash` | Squash commits into single commit | | `--preserve` | Preserve commit history | | `--dry-run` | Preview ship without merging | | `--session-id ID` | Resume previous session by ID | | `--resume` | Resume from last checkpoint | | `--status` | Show current ship status | | `--list-sessions` | Show available sessions for resume |
Merge Strategy
JQ merge - documentation outputs are combined with `jq -s 'add'`.
Philosophy
> "Ship with confidence, not hope." - Shipping philosophy
- claudikins-kernel:ship is the final gate after claudikins-kernel:verify passes
- GRFP-style: section-by-section approval at every stage
- Human decides final merge - no auto-merging
- Code integrity validation ensures we ship what was verified
- Documentation is part of shipping, not optional
State Management
State file: `.claude/ship-state.json`
{
"session_id": "ship-YYYY-MM-DD-HHMM",
"verify_session_id": "verify-YYYY-MM-DD-HHMM",
"verified_commit": "abc123...",
"target": "main",
"started_at": "ISO timestamp",
"status": "initialising|shipping|completed|failed",
"phases": {
"pre_ship_review": { "status": "pending|APPROVED|SKIPPED" },
"commit_strategy": { "status": "pending|APPROVED", "strategy": null },
"documentation": { "status": "pending|COMPLETED|SKIPPED" },
"pr_creation": { "status": "pending|CREATED", "pr_number": null },
"merge": { "status": "pending|MERGED", "sha": null }
},
"unlock_merge": false,
"cleanup": {
"branches_deleted": []
}
}Stage 0: Initialisation
Flag Handling
Check for flags first:
--status → Display current ship status, exit --resume → Load checkpoint, resume from saved state --list-sessions → Show available sessions, exit --dry-run → Run through stages without actual merge
Prerequisite Check (via ship-init.sh hook)
The SessionStart hook validates:
1. verify-state.json exists and unlock_ship is true 2. Code integrity (C-5): verified commit matches current HEAD 3. File integrity (C-7): source file manifest unchanged 4. Creates initial ship-state.json 5. Links to verify session for traceability
**On validation failure:**
ERROR: claudikins-kernel:verify gate check failed
Reason: ${FAILURE_REASON}
[Re-run claudikins-kernel:verify] [Abort]**On code integrity failure (C-5, C-7):**
ERROR: Code has changed since verification
Verified commit: ${VERIFIED_COMMIT}
Current commit: ${CURRENT_COMMIT}
Code must not change between claudikins-kernel:verify and claudikins-kernel:ship.
[Re-run claudikins-kernel:verify] [Abort]Stage 1: Pre-Ship Review
Show what's being shipped. Human confirms ready.
Display Ship Summary
Pre-Ship Review
===============
Verification Session: ${VERIFY_SESSION_ID}
Verified at: ${VERIFY_TIMESTAMP}
Branches to merge:
${BRANCH_LIST}
Changes:
Files changed: ${FILE_COUNT}
Lines added: +${ADDITIONS}
Lines removed: -${DELETIONS}
Evidence from verification:
Screenshots: ${SCREENSHOT_COUNT}
API tests: ${API_TEST_COUNT}
CLI tests: ${CLI_TEST_COUNT}
Ready to proceed?
[Continue to Commit Strategy] [Review Evidence] [Back to Verify] [Abort]Stage 1 Checkpoint
On "Continue":
- Set `phases.pre_ship_review.status = "APPROVED"`
- Proceed to Stage 2
On "Review Evidence":
- Display evidence from `.claude/evidence/`
- Return to checkpoint
On "Back to Verify":
- Set `status = "aborted"`
- Output: "Run `claudikins-kernel:verify` to re-verify"
Stage 2: Commit Strategy
Decide how to commit the changes.
Strategy Selection
Commit Strategy =============== How should we commit these changes? [Squash into single commit] (Recommended for features) [Preserve commit history] (For large multi-part work)
**If --squash flag set:** Auto-select squash **If --preserve flag set:** Auto-select preserve
Commit Message Draft (Squash)
For squash, draft a commit message:
Commit message:
feat(${SCOPE}): ${TITLE}
${BODY}
Closes #${ISSUE_NUMBER}
[Accept] [Revise] [Back]Follow conventional commits format:
- `feat:` for new features
- `fix:` for bug fixes
- `chore:` for maintenance
- `feat!:` or `BREAKING CHANGE:` for breaking changes
Stage 2 Checkpoint
On "Accept":
- Set `phases.commit_strategy.status = "APPROVED"`
- Set `phases.commit_strategy.strategy = "squash|preserve"`
- Record commit message in state
- Procee
Showing the first part of this file.
SRE thinking applied to Claude Code, based on Boris Cherny's Q&A. It enforces a strict 4-stage pipeline with gates between each step. You literally cannot skip verification. You cannot ship without approval.

