/ship-issue — issue-to-merge pipelineOne command takes a GitHub issue the whole distance — plan, TDD implementation, review cycles, CI, cloud review, staging deploy, live E2E, log checks, and merge — pausing for a human exactly twice. Each phase runs on the model tier where its quality compounds, and every agent pins its model so a prompt cache is never silently re-read mid-task.
Top to bottom is the happy path. A failed verification stage never advances the run — it dispatches a fresh fix task and re-enters at review. The two amber bars are the only places a human is asked anything.
.ship-issue/runs/<id>/state.json + events.jsonl), so a crashed or interrupted run resumes losslessly. The dashed amber arcs are the only backward edges: a rejected plan regenerates, and any failed verification dispatches a fresh Opus fix task that re-enters at review.The orchestrator runs in the Fable 5 main session and is the single writer of run state. It dispatches each stage to a pinned-model agent and consolidates the results.
ship-issue orchestratorThe skill itself. Owns routing, the two gates, conflicting-evidence ship-or-fix rulings, the merge brief, and every run-state write. Outcome-prompted — it is told the goal and constraints, never a step-by-step script.
Turns the GitHub issue + codebase into the plan shown at Gate 1: problem statement, acceptance criteria, staging E2E scenarios, and log-verification expectations.
The last line of defence on the full PR diff. Returns exactly one verdict — APPROVE, or FIX with itemized blockers. The loop is bounded at three cycles; exhausting it is a BLOCKED error exit, never a third gate.
Writes failing tests from the acceptance criteria first, then the implementation to green — UI components, API routes, the lot. Every fix cycle is a fresh task on this same tier, carrying the reviewer/CI/E2E blockers verbatim.
Runs the plan's E2E scenarios against the live staging URL via Playwright MCP, mapping each acceptance criterion to at least one scenario. Returns PASS / FAIL / FLAKY / BLOCKED with screenshot evidence.
Scans staging service logs over the deploy window for errors and regression signatures. Returns CLEAN or ERRORS_FOUND with the offending lines cited — a passing verdict is earned only over logs actually fetched.
A single stdlib Python file that reads run state and serves a live view: per-stage status, model tier, and duration; gate states; run totals; and live-elapsed for the in-flight stage. It only reads — the orchestrator stays the single writer.
Plan approval and merge confirmation — nothing else asks for input. A cloud-review timeout or an exhausted review loop is a recorded decision or a BLOCKED exit, never a third gate.
Prompt caches are model-scoped; one switch re-reads the whole context at full price. Each agent pins a full model ID, and a fix is always a fresh task on the same tier — never a resumed task on a different model.
Fable-tier agents are given the goal, constraints, inputs, and output contract — not a numbered procedure. Prescriptive step-lists (great for the Sonnet verifiers) measurably degrade Fable 5, so the planner and reviewer never get them.
Every transition is written to state.json + events.jsonl before anything else happens. Re-invoking /ship-issue on an interrupted run resumes at the last incomplete stage; nothing lives only in conversation memory.
Work, gate-wait, and crash-gap windows are tracked disjointly (mirroring tasktracker's pause semantics). The Gate 2 merge brief embeds a per-stage / total / per-model-tier rollup, and the dashboard shows it live.
Markdown skill + agent files, Python stdlib scripts, and one per-repo .claude/ship-issue.config.json (staging URL, deploy mechanism, log source, cloud-review settings). Preflight BLOCKs naming any missing key before a plan is ever made.