/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)¶
- 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. - Merge ONCE:
git merge --no-ff <branch> -m "merge: <summary>"into main (repo convention, integrator model per reference_creatortrack_parallel_dev). - Migrations gate (only if migrations changed; BEFORE deploy):
WORKSPACE_MIGRATIONS_DIR=db/migrations python3 forge/scripts/forge_workspace_migrate.pyagainst livelifeos, then--statusto confirm nothing pending. Prod'sdeploy_prod.shruns NO migrations by design (two prod breakages on record), so /ship applies them explicitly, code-after-schema. - 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). - Post-verify:
systemctl is-active,curl /login, warm_prod exit 0, plus two authenticated round-trips viaforge_creatortrack_client.py(queue,list --status "In Review") which hit local prod :3070 with the client's canonical auth (never a hand-rolled cookie). - Mark task Deployed: structured deploy note (
append) +status <id> "Deployed". Never Done (Justin's call). - 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-runruns 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.
Related¶
- Skill:
.claude/skills/ship/SKILL.md. Upstream:/dev-queue(builds tasks -> In Review). - reference_creatortrack_client, reference_creatortrack_deploy_oom_typecheck (heap cap rationale).