Skip to content

/ship skill

URL: https://mkdocs.justinsforge.com/memory/general/reference_ship_skill/

Orchestrator skill at .claude/skills/ship/SKILL.md. Takes a reviewed CreatorTrack branch from In Review to live prod in one command. Trigger /ship <task-id|branch>; Fable or Justin only, never auto-run. Built 2026-07-13 (plan forge-ship-warm-slots-devqueue-2026-07-13, Task 1.2).

What it chains (owns only the sequence + gates)

  1. Preflight (all must pass first): task is In Review, branch pushed and local==origin, branch worktree clean, main clean + ff-pulled, detect whether db/migrations/ changed.
  2. Merge ONCE: git merge --no-ff <branch> -m "merge: <summary>" into main (repo convention, integrator model per reference_creatortrack_parallel_dev).
  3. Migrations gate (only if migrations changed; BEFORE deploy): WORKSPACE_MIGRATIONS_DIR=db/migrations python3 forge/scripts/forge_workspace_migrate.py against live lifeos, then --status to confirm nothing pending. Prod's deploy_prod.sh runs NO migrations by design (two prod breakages on record), so /ship applies them explicitly, code-after-schema.
  4. Deploy foreground: creatortrack/scripts/deploy_prod.sh, never backgrounded, never interrupted, never concurrent (no atomic swap yet, known debt). The script self-guards clean-main + caps the Node heap (6144MB) + confirms the unit is active (Task 1.1, commit on creatortrack main).
  5. Post-verify: systemctl is-active, curl /login, warm_prod exit 0, plus two authenticated round-trips via forge_creatortrack_client.py (queue, list --status "In Review") which hit local prod :3070 with the client's canonical auth (never a hand-rolled cookie).
  6. Mark task Deployed: structured deploy note (append) + status <id> "Deployed". Never Done (Justin's call).
  7. Release dev slot: forge_creatortrack_agent_teardown.sh <branch> (branch-derived; preserves a dirty worktree by default).

Regression loop (REQUIRED in the deploy note)

"Deployed" is NOT terminal. To re-open a shipped task for another dev pass, Justin drags it back to Send to Forge and adds notes; the dev-queue engine re-pulls it like any queued task, full history intact. The /ship deploy note must spell this out so the loop is discoverable from the task itself.

Runtime executor

The sequence is mechanical once preflight passes, so the actual Steps 0-6 run as a sonnet worker (Task tool / /spawn-headless-agent sonnet); Fable supervises and reports. Cost-aware (feedback_subscription_over_api_for_automation, feedback_wda_model_tiering).

Gotchas

  • --dry-run runs preflight only and reports branch / migrations-detected / target slot, then STOPS before merge. Use for the first ship of a session and no-op smoke tests.
  • Fail loud, stop at the first failed gate; never skip ahead. Do NOT mark Deployed on a failed post-verify.
  • Idempotent-ish: a re-run after a completed ship no-ops (merge already on main, migrations already applied, status already Deployed). A mid-sequence death resumes from the first incomplete step, not a blind restart.