Claude Code skill set · model-tiered

/ship-issue — issue-to-merge pipeline

One 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.

9pipeline stages
2human gates
3model tiers
5pinned-model agents
1orchestrator skill

01The flow

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.

Fable 5 — plan · orchestrate · merge-gate review Opus 4.8 — implement (TDD) Sonnet 4.6 — staging E2E · logs external — CI · cloud review · deploy human gate
FIX → fresh Opus 4.8 task review · ci · cloud_review e2e · logs all loop here reject → regen preflight Fable 5 plan issue-planner → AC + E2E scenarios Fable 5 ◆ GATE 1 — approve the plan (human) implement tdd-implementer · tests-first · opens PR Opus 4.8 review merge-gate · APPROVE / FIX (max 3) Fable 5 ci wait on GitHub checks · fail → fix external cloud_review trigger + poll · timeout → ship-or-fix external deploy ECS / command → staging · wait stable external e2e staging-e2e-verifier · Playwright Sonnet 4.6 logs staging-log-verifier · clean / errors Sonnet 4.6 ◆ GATE 2 — merge brief + confirm (human) ✓ merge · run_completed
Run state lives in files (.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.

02The skill & its agents

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 orchestrator

Fable 5

The 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.

skills/ship-issue/SKILL.md

issue-planner

Fable 5

Turns the GitHub issue + codebase into the plan shown at Gate 1: problem statement, acceptance criteria, staging E2E scenarios, and log-verification expectations.

agents/issue-planner.md · claude-fable-5

merge-gate-reviewer

Fable 5

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.

agents/merge-gate-reviewer.md · claude-fable-5

tdd-implementer

Opus 4.8

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.

agents/tdd-implementer.md · claude-opus-4-8

staging-e2e-verifier

Sonnet 4.6

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.

agents/staging-e2e-verifier.md · claude-sonnet-4-6

staging-log-verifier

Sonnet 4.6

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.

agents/staging-log-verifier.md · claude-sonnet-4-6

dashboard

read-only

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.

skills/ship-issue/scripts/dashboard.py

03The rules that make it hold

Exactly two human gates

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.

No mid-task model switch

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.

Outcome prompts for Fable 5

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.

File-based run state → lossless resume

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.

Per-stage time tracking

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.

Plain config, no magic

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.

04Running it

# take issue 142 the whole distance
/ship-issue 142
# …or a full URL
/ship-issue https://github.com/acme/widgets/issues/142

# watch every run live (separate terminal)
python3 skills/ship-issue/scripts/dashboard.py --dir .ship-issue/runs --port 8770