{"slug": "jira-backfill-tickets-from-merged-pull-requests", "title": "JIRA: backfill tickets from merged pull requests", "summary": "A developer published a local `/backfill-jira` skill for AI harnesses that reconciles recently merged pull requests against existing JIRA issues before creating any tickets, using a three-phase structure: Phase A gathers and reconciles read-only, Phase B creates backfill tickets, and Phase C confirms. The skill creates one ticket per uncovered \"theme\" rather than per PR, and explicitly instructs leaving genuinely routine PRs (version bumps, dependency bumps, typo fixes) uncovered and listed as \"skipped (routine, no ticket)\" rather than inventing a catch-all ticket. Phase B reads back status and checks sprint assignment after writing because, per the author, neither a successful create response nor an attempted status change proves the final fields stuck.", "body_md": "♠ **Problem statement**: how can I catch up JIRA when pull requests have already\n(been) merged without tickets?\n\nI wrote a local `/backfill-jira` skill for my AI harnesses. It compares recent\nmerged PRs with existing issues before it creates anything. This is its\nstructure; internal projects, repositories, queries, and field IDs are omitted:\n\n```\n% rg -n '^### Phase' ~/.claude/skills/backfill-jira/SKILL.md\n31:### Phase A — gather + reconcile (read-only)\n72:### Phase B — create the backfill tickets\n125:### Phase C — confirm\n```\n\nThe unit of work is a *theme*, not a PR. Several PRs can implement one change;\none PR can also be routine enough to need no ticket. The skill checks PR\nreferences and matching issue summaries before declaring a gap. Existing\nbacklog issues count as coverage.\n\nThe report rule in the skill is explicit:\n\n```\n4. **Report.** Print a table of every PR → (existing ticket | NEW theme-N | skipped-routine) and a\n   separate list of the gap themes to create. The counts must reconcile: covered + new + skipped =\n   total PRs. Don't let \"get every PR to a theme\" pressure you into merging unrelated skipped PRs\n   into a theme just to shrink the skipped list.\n```\n\nPhase B creates one ticket for each uncovered theme, marks work as complete, and reads the status back. It also checks the sprint assignment after writing it. Neither a successful create response nor an attempted status change is proof that the final fields stuck.\n\nThe skill deliberately leaves routine work alone:\n\n```\n- Don't create per-PR tickets by default — one ticket per theme keeps signal high. **Never create a\n  \"grab bag\" / \"catch-all\" / \"hygiene\" ticket that lumps together unrelated PRs** just to get to\n  zero gaps — each ticket must describe one coherent, describable piece of work. If a PR is\n  genuinely routine and not worth tracking on its own (a version bump, a dependency bump, a typo\n  fix) and doesn't fit an existing theme, leave it **uncovered**: list it in the report as *skipped\n  (routine, no ticket)* rather than inventing a ticket to absorb it.\n```\n\nA second pass over the same window checks whether the new tickets now cover the gaps. Zero new gaps matters more than zero skipped PRs. ∎\n\n— § —\n\nReply via [email](<mailto:serendipity@perrotta.dev?subject=Reply to: JIRA: backfill tickets from merged pull requests>)", "url": "https://wpnews.pro/news/jira-backfill-tickets-from-merged-pull-requests", "canonical_source": "https://perrotta.dev/2026/09/jira-backfill-tickets-from-merged-pull-requests/", "published_at": "2026-09-29 09:21:17+00:00", "updated_at": "2026-09-29 10:48:29.746202+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "developer-tools"], "entities": ["JIRA", "Claude"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/jira-backfill-tickets-from-merged-pull-requests", "markdown": "https://wpnews.pro/news/jira-backfill-tickets-from-merged-pull-requests.md", "text": "https://wpnews.pro/news/jira-backfill-tickets-from-merged-pull-requests.txt", "jsonld": "https://wpnews.pro/news/jira-backfill-tickets-from-merged-pull-requests.jsonld"}}