The gap between a finished PRD and a workable backlog is an afternoon of mechanical decomposition — and the backlog it lands in is usually a graveyard of duplicates and stale wishes. This playbook decomposes the PRD into stories with traceable links back to source sections, then runs dedupe and stale-flag passes that keep the backlog honest.
Workflow area: Specs & Docs · Tier: Foundation · Hands-on time: ~25 minutes
Decomposition is translation, not creation: every story should trace to a PRD section, and every PRD requirement should land in at least one story. That bidirectional property is exactly what models are good at checking and humans are bad at sustaining. The same mechanical rigor, pointed at your existing backlog, finds the three tickets describing one bug and the eighteen-month-old story referencing a feature you killed.
Number your PRD sections, then decompose with mandatory traceability. Paste the PRD into Claude or ChatGPT:
Decompose this PRD into epics and user stories.
Rules:
- Every story cites the PRD section(s) it implements: [PRD §x.y].
- Story format: title, As-a/I-want/So-that, 2-4 draft acceptance
criteria, source citation.
- Slice vertically (thin end-to-end user value), not by layer —
no "build the API" stories.
- After the stories, output a COVERAGE TABLE: every PRD section →
the story IDs that cover it. List uncovered sections as GAPS.
- List anything you were tempted to add that the PRD does not
actually specify under NOT IN PRD — do not silently include it.
PRD:
[PASTE PRD WITH NUMBERED SECTIONS]
Audit the coverage table before reading the stories. Good output looks like:
COVERAGE
§3.1 Bulk approval flow → ST-01, ST-02, ST-04
§3.2 Notification rules → ST-05
§4.1 Audit log → GAP — no story generated
NOT IN PRD: password-reset changes (implied by §3.1 but never
specified — confirm before adding)
GAPs are either PRD sections that aren't buildable requirements (fine) or missed scope (fix now, not in sprint 3). NOT IN PRD items go back to the PRD as explicit decisions — this is scope creep caught at birth.
Rewrite the judgment stories yourself. Most decomposed stories are mechanical and fine. The handful encoding real decisions — what's in the walking skeleton, where the first release cuts — deserve your hand. Vertical slicing choices are strategy in miniature.
Run the dedupe pass over the destination backlog. Export existing backlog items (ID, title, description) and ask:
Here are new stories [PASTE] and the existing backlog [PASTE CSV].
1. DUPLICATES/OVERLAPS: new stories that materially overlap an
existing item — pair them, say why, and recommend merge or
supersede. Cite both IDs.
2. Cluster existing items that appear to describe the same
underlying request in different words.
Confidence-rank every match; do not force matches.
Review each proposed pair yourself — near-duplicate titles with different scopes are common, and merging them wrongly loses a requirement.
Run the stale-flag pass, then decide by hand. Ask the model to flag backlog items that reference removed features, superseded decisions (give it your decision log from pb-24 if you have one), or haven't been touched in a year — with a one-line reason each. You then close, archive, or defend each flagged item. Fifteen minutes, and the backlog stops lying about your intentions.
Import with links intact. Push stories into Jira or Linear with the PRD citation in each description and the epic structure preserved. The citation is what lets an engineer in week 6 read why without archaeology.
Backlogs and PRDs carry customer commitments and unannounced features — decompose and groom only in your organization's approved AI workspace.
Save the coverage table next to the PRD. When scope is challenged in week 8 — it will be — the table answers "where did this story come from?" and "who cut §4.1?" in ten seconds, with receipts.