implement-tickets
What it does
implement-tickets closes the gap implement's own docs name explicitly: implement builds exactly one ticket per invocation, on purpose, and has no batch mode. implement-tickets is the thin loop on top: point it at a parent issue whose children were already ticketed by to-tickets, and it repeatedly computes the frontier — every child whose blockers are satisfied — and drives /implement on each, one at a time, until the whole batch is built.
It does not reimplement TDD, review, or commit logic. All of that stays inside /implement. This skill's entire job is sequencing: working out which ticket can go next, and what to branch it off.
The stacking decision
The obvious way to sequence a dependency chain is to wait for each ticket's PR to actually merge before starting the next one. This skill deliberately does not do that. Waiting for a human to click merge between every single ticket defeats the point of running a batch unattended — so a ticket counts as "done enough to unblock its dependents" once /implement has produced a PR, not once that PR is merged. The next ticket branches directly off the still-open PR's branch: an intentional stack.
This is a real tradeoff, not a free lunch. create-pr's own branch-hygiene check treats any stacked branch as the fastest path to a PR review-debt snowball, and normally halts to ask whether the stack is intentional. implement-tickets already knows the answer for branches it created itself within the same batch, so it answers that check automatically instead of stopping to ask nobody. A stack against something outside the current batch's known branches still halts — that would mean something unexpected happened.
The output, at the end, is an ordered stack of unmerged PRs. Nothing gets merged by this skill. Merging stays a human decision, in dependency order, same as everywhere else in this ecosystem.
When to reach for it
You invoke this by typing /implement-tickets yourself — it ships with disable-model-invocation: true, the same as implement and to-tickets, so nothing reaches for it on your behalf.
| The work is… | Reach for |
|---|---|
| One ticket | /implement #42 directly |
| A parent issue with several GitHub-native sub-issues, ready to build end to end | /implement-tickets <parent> |
| Not yet split into tickets | to-tickets first |
| On a tracker other than GitHub issues, or the sub-issues aren't GitHub-native | Not supported yet — v1 is GitHub-native sub-issues only |
Prerequisites
- The parent issue's children must already exist as GitHub-native sub-issues (what
to-ticketsproduces when publishing to a real tracker), each with a "Blocked by" section naming the issues that gate it. - Every blocker outside the parent's own child set must already be closed before starting — this skill will not implement work belonging to a different batch, and stops to tell you which child is waiting on what if one isn't.
What one run does
- Fetch the parent's sub-issues and read each child's declared blockers, split into in-batch and external.
- Verify every external blocker is already closed. Stop if not.
- Loop: compute the frontier (children whose blockers are all satisfied), then for each ticket in it — one at a time, never in parallel, for the same reasons
implementitself refuses to run concurrently in one checkout — branch off the right base (default branch, or the most recent in-batch blocker's branch if stacking), run/implement, then/create-pr skip-hygiene auto-approveto open the PR. - Repeat until every child has a PR.
- Report the full ticket → branch → PR chain, and that nothing is merged yet.
Pass --board to also publish (and keep updating) an HTML status-board artifact tracking each ticket through Blocked → Ready → In Progress → Done, styled to match this project's prior "Closure Sprint" boards.
What it does not do
- Merge anything, ever.
- Close or modify the parent issue. Its sub-issue tracking reflects completion automatically once the human merges the stack and runs
/pr-mergedon each PR; closing the parent itself is still a human call. - Support non-GitHub trackers, or stacking across two separate
/implement-ticketsruns (two sibling parent specs each get their own run, their own stack).
Where it fits
implement-tickets sits directly next to implement in the main chain, as an optional batch wrapper:
grill-with-docs → to-spec → to-tickets → implement → review-pr
↳ implement-tickets (loops implement across a whole parent's children)
It trusts to-tickets' blocking edges the same way implement trusts the shape of a single ticket — a badly-ordered dependency graph gets built in whatever order it declares, not re-validated.