Authors the PRD document itself — problem, scope boundaries, EARS acceptance criteria, and verification plan — as one self-contained contract a planning agent consumes without re-elicitation. Ends at the written PRD; slicing it into tracked issues is `prd-task-creator`.
A PRD is the input contract for the planning phase. It must contain enough
context, acceptance criteria, scope boundaries, and verification detail for a
planning agent to produce a plan without re-eliciting requirements.
This skill is platform-agnostic. It assumes a plan → review → verify → ship flow
where a PRD is written first, a planner decomposes it into steps, and a verifier
checks the result against the PRD's acceptance criteria. Adapt the storage and
field mechanics below to whatever tracker you use.
Authorized Scope
Apply this engine only within the user's requested task and existing explicit
authorization. Loading or delegating to it grants no additional authority.
Preserve report-only restrictions and the caller's target, host, provider, and
cost limits. Existing approval satisfies a gate only for the same actions and
scope; obtain approval before expanding them. Forward these limits to delegates.
Contract
Inputs:
Feature requirements and the selected tracker issue or document destination
Known constraints and accepted scope
Outputs:
A PRD with EARS acceptance criteria and a verification plan
Creates/Modifies:
The requested PRD document or approved tracker issue body
No implementation or automatic issue slicing
External Side Effects:
Tracker reads and approved issue-body writes
Confirmation Required:
Confirm the destination and draft before creating or replacing tracker content
when that exact write is not already authorized
Delegates To:
prd-quality-gate to check completeness
Recommend prd-task-creator when the user wants to split the finished PRD
Storage Location
Use the tracker issue body as the default PRD location: one document per work
item, one location. Avoid local sidecar files unless the repo explicitly uses
them as source truth.
Create a PRD by creating an issue whose body is clean PRD markdown.
Edit a PRD by editing that issue's body.
Version history is the tracker's edit history — no manual updated field.
The planner reads the issue body verbatim. What you write in the body is
exactly what the planning agent sees, so it must stand alone.
If there is no connected tracker, decide on the single canonical location for the
PRD before writing — do not draft into a throwaway scratch file that nobody will
find again.
Native Tracker Metadata
Do not put YAML frontmatter at the top of issue bodies. Trackers render
issue-body frontmatter as visible noise and already have native fields for this
metadata.
Use native tracker / project-board fields instead:
Issue type:Feature, Bug, or Task.
Status:Backlog, In Progress, Human Review, Done, or Deferred.
Priority:P0, P1, P2, or P3.
Complexity:Low, Medium, or High.
Blast radius:Contained, Cross-package, Cross-app, or Infra.
Rules:
The PRD body starts with # PRD: <name> and contains only human-readable PRD content.
Put card/list summaries in the issue title, project fields, or a short Executive Summary, not in hidden metadata.
If you cannot estimate complexity, set the field to Medium and explain why in Risks & Open Questions.
Draft is workflow state, not body text. Keep draft PRDs off the runnable board path through status fields, not by editing the body.
Issue Title Style
The issue title is what the board shows most of the time. Keep it at or under
80 characters.
Default to 4-7 words.
Use an imperative verb + object shape: Add pipeline checkpoints, Track CI blockers on issues, Expose model selectors in settings.
Put the detail in the Executive Summary and body, not in the title.
Avoid titles chained together with and / while / during unless the feature is truly one inseparable unit.
Avoid titles that restate the full implementation loop. The title names the work item; the PRD explains it.
Keep the # PRD: name aligned with the final issue title's slugified form. If you shorten the title, shorten the PRD heading too.
Bad:
Open draft PR during execution and ingest PR feedback into stabilization loop
Treat CI failures as blocker state on issue tasks
Better:
Add draft PR feedback loop
Track CI blockers on issues
Required Sections
Every PRD must have these sections, in this order. Missing sections fail quality gate.
# PRD: <name>
## Executive Summary
<2–4 sentences. What is this feature, why now, who wins.>
## Problem Statement
<The concrete pain. Reference real incidents, real users, real metrics where possible.
Avoid "users might want..." — if you can't name the user, you don't have a problem yet.>
## Goals
- <measurable, verifiable goal>
- <measurable, verifiable goal>
## Non-Goals
- <thing this explicitly does NOT do — the more you list, the less scope creep downstream>
## User Stories
- As a <role>, I want <capability> so that <outcome>.
- Each story ends with "**Acceptance:**" followed by 1–3 EARS criteria
(`WHEN <trigger> THE SYSTEM SHALL <response>`) — same syntax as Acceptance Criteria below.
## Functional Requirements
<Numbered list. Each item must be verifiable by reading code or running it.
NO implementation details — "the system must do X", not "use Zustand to do X".>
## Non-Functional Requirements
<Performance, accessibility, error-handling, offline, observability.
Only list the ones that actually matter for this feature.>
## Acceptance Criteria
<The bar the verification phase will check against. Write every bullet in EARS
syntax (Easy Approach to Requirements Syntax) so it parses unambiguously and is
pass/fail without judgement. Each bullet becomes an assertion the verifier checks:
- Event: WHEN <trigger> THE SYSTEM SHALL <response>.
- State: WHILE <state> THE SYSTEM SHALL <response>.
- Unwanted: IF <condition> THEN THE SYSTEM SHALL <response>.
- Optional: WHERE <feature enabled> THE SYSTEM SHALL <response>.
- Always: THE SYSTEM SHALL <invariant>.>
## Out of Scope
<At least one explicit boundary the implementation must not cross.>
## Dependencies
<Other PRDs, packages, external APIs, feature flags. Reference by path or URL.>
## Verification Plan
<How the verifier will know this shipped correctly.
`tests`: list the test files/suites that must exist and pass.
`manual`: list the manual QA steps a human will run post-merge.
`both`: both sections. The clearer this section, the fewer verification retries you burn.>
## Risks & Open Questions
<Unknowns, edge cases, things that could kill the plan mid-execution.
Open questions get tracked here until answered, then deleted.>
Mapping PRD Sections to the Plan
A PRD is read by the planning agent. Every section has a downstream consumer:
PRD section
Feeds
Consumer
Executive Summary
Plan objective
Plan display, PR title, board card
Goals + Functional Requirements
Plan steps
Planner decomposition
Acceptance Criteria
Acceptance criteria (EARS)
Verification phase
Out of Scope
Plan out-of-scope list
Review phase (rejects scope creep)
Complexity field
Estimated complexity
Review rubric, retry budget
Verification Plan
Verification prompt input
Verification phase
Non-Goals + Out of Scope
Review gate
Reviewer rejects patches that violate these
Do not write sections that describe files to change, function names, or implementation choices. Those belong in the plan, not the PRD. If you can't resist writing pseudo-code, put it under "Risks & Open Questions" as "I suspect we'll need to touch X" — not as a requirement.
Quality Gates
Before marking a PRD ready for a planner to consume, every one of these must be true:
No placeholder text (TODO, TBD, <fill this in>) remains in any section.
Goals has at least one measurable bullet.
Acceptance Criteria has at least one bullet, every bullet is written in EARS syntax (WHEN/WHILE/WHERE/IF … THE SYSTEM SHALL …, or a bare THE SYSTEM SHALL …), and each is verifiable without judgement — it either passes or fails. "Feels fast" is not verifiable. "WHEN the issues query runs THE SYSTEM SHALL return p95 latency < 300ms" is.
Out of Scope has at least one bullet. Empty Out of Scope is a tell that the author didn't scope the feature.
User Stories has at least one story with explicit Acceptance bullets.
Every external dependency in Dependencies is named (package, PRD path, or URL), not described vaguely.
Verification Plan names either test file paths, suite names, or concrete manual steps — not "write some tests".
If any gate fails, keep it in draft/on-hold workflow state and do not mark it ready to plan.
Workflow
When the user says "write a PRD for X"
Confirm where the PRD will live. If using a tracker, confirm the target repo/project. If nothing is connected, agree on the single canonical location first — there must be exactly one.
Do not start writing immediately. Run a short elicitation pass first — you need answers before section-filling is meaningful:
What problem does this solve, and for whom specifically?
What does success look like — how would we measure it?
What is explicitly out of scope?
What is the complexity estimate (low/medium/high) and what evidence supports it?
Any hard constraints — deadlines, other projects in flight, package boundaries?
Check for an existing issue. Search the project's tracker by keywords and state. If a matching issue already exists, ask whether to edit it or create a fresh one.
Kebab-case the PRD name. If the proposed name has spaces, camelCase, or punctuation, kebab-case it: "Notification Center" → notification-center. This slug goes in the # PRD: heading.
Compress the issue title before writing the body. Default to a short imperative title, then derive the # PRD: heading from that final title. Put nuance in the Executive Summary, not the title.
Draft the PRD body using the template above, in a scratch buffer. Fill every required section. If you can't fill a section, ask the user — don't hallucinate requirements.
Run the quality gates against the draft. If any fail, keep the issue in draft/on-hold workflow state and tell the user which gates failed. If they all pass, mark it ready through native project state.
Create the issue (with user approval). Show the drafted body first. On approval, create it through the tracker's native issue creation flow, using the PRD markdown as the issue body.
Confirm the outcome to the user with the issue URL and whether the PRD
passed every quality gate. Then suggest the next step: Ready to hand this to the planner? Say: plan issue #N.
When the user says "plan the X PRD"
Fetch the current issue body from the tracker. Read it fully before producing anything.
Verify the issue is ready through native project state — never plan a draft/on-hold issue.
Translate directly: Executive Summary → objective, Acceptance Criteria → acceptance criteria, Out of Scope → out-of-scope, complexity field → estimated complexity.
The plan phase owns file changes and step breakdown — do not copy those out of the PRD (there shouldn't be any).
The resulting plan is posted back as a ## Implementation Plan comment on the same issue (see writing-plans) — it lives on the issue, not in a local file, so it stays in sync with the PRD and reaches the loop.
When the user says "update the X PRD"
Fetch the current issue body (prefer the tracker's live read to guarantee freshness).
Make the requested edit in a scratch buffer.
Write it back through the tracker's native edit flow. The tracker records the edit history automatically.
If the change invalidates an in-flight plan (new acceptance criterion, new out-of-scope item), flag that explicitly — the user may want to kill the thread and re-plan.
Anti-Patterns
Observed failure modes — do not repeat:
PRD full of implementation details. Writing use TanStack Query v5 for caching in Functional Requirements. The PRD describes the what; the plan owns the how. This leaks into review and causes the reviewer to flag the plan for violating the PRD, which the planner then "fixes" by copying the implementation detail verbatim. Dead loop.
Acceptance Criteria written as vibes. "Users should find the flow intuitive." Unverifiable → verification retries forever. Force it into EARS: WHEN the import completes THE SYSTEM SHALL display a success toast within 200ms.
Empty Out of Scope. Always a sign the author is planning to sneak scope in later. Force the listing.
Authoring a PRD with nowhere to put it. If there's no agreed canonical location, the PRD becomes an orphan document that drifts out of sync. Decide the location first.
Editing a cached copy instead of the source. If your tracker caches issue bodies locally, the cache is downstream of the tracker, not upstream. Always edit via the tracker's API/CLI, never the cache.
Creating an issue without running the quality gates first. Half-formed PRDs thrash the planner and burn verification retries. Running gates after the issue is already public is embarrassing and harder to fix than running them first.
Writing a PRD for something you should just ticket. A typo fix does not need a PRD. A dependency bump does not need a PRD. Reserve PRDs for features and architectural changes that will run through plan / review / verify / ship.
Minimal Example
The text below is the exact issue body to publish. Tracker metadata belongs in native fields, not in this body.
# PRD: copy-issue-url-action
## Executive Summary
Users working in the board frequently need to paste an issue URL into chat,
commit messages, or an external ticketing tool. Today the only way to get the
URL is to click into the issue, then copy from the header — three clicks and
a context switch. Add a "Copy URL" action to the card's context menu so it
takes one click.
## Problem Statement
Observed on 2026-04-09: the user mentioned needing to paste an issue URL
into a chat thread five times in a single session, each requiring a detour
through the issue detail view. This is pure friction — the URL is already known.
## Goals
- Right-clicking a board card shows a context menu with "Copy URL".
- Clicking "Copy URL" writes the issue's URL to the clipboard and
shows a toast confirming the copy.
## Non-Goals
- Copying anything other than the URL (title, body, ID — all separate actions
if demand appears).
- A multi-select "copy all URLs" bulk action.
- Keyboard shortcut for copy — mouse-only for v1.
## User Stories
- As a developer pasting issue links into chat, I want to copy an issue's
URL without leaving the board, so that I don't break my flow.
**Acceptance:**
- WHEN a user right-clicks a board card THE SYSTEM SHALL display a context
menu including a "Copy URL" action.
- WHEN a user clicks "Copy URL" THE SYSTEM SHALL write the issue's URL to the
system clipboard.
- WHEN the copy succeeds THE SYSTEM SHALL display a confirmation toast within 200ms.
## Functional Requirements
1. The card component must support a right-click context menu.
2. The context menu must include an action labeled "Copy URL".
3. The URL written to the clipboard must be the canonical issue URL.
4. The toast notification must use the existing UI toast primitive.
## Non-Functional Requirements
- Clipboard write must succeed or fail cleanly — no silent failures. On
permission denial, surface an error toast.
## Acceptance Criteria
- WHEN a user right-clicks any board card THE SYSTEM SHALL open a context menu
containing a "Copy URL" item.
- WHEN a user clicks "Copy URL" THE SYSTEM SHALL place the exact canonical issue
URL on the clipboard.
- WHEN the clipboard write succeeds THE SYSTEM SHALL display a success toast.
- IF the clipboard API rejects the write THEN THE SYSTEM SHALL display an error toast.
## Out of Scope
- Copying other fields (title, body, branch name).
- Bulk selection + copy.
- Keyboard shortcut bindings.
- A "Share" action that opens the URL in the browser.
## Dependencies
- The existing UI toast primitive in the project's component library.
- The issue number and repo identifier for URL construction.
## Verification Plan
- **tests:** add a test that simulates a right-click and asserts the context
menu includes a "Copy URL" item wired to a mocked clipboard write.
- **manual:** right-click three cards from different projects, paste the
clipboard into a browser tab, verify the URL loads the correct issue.
## Risks & Open Questions
- Which clipboard API does the renderer use today? Check the existing
implementation before writing new clipboard code.
- Do we need focus-management so the context menu doesn't fight with
drag-and-drop handlers on the same card?
Note: no created, updated, status, complexity, or blast radius fields in the body — the tracker and project board track those natively. No file path — the PRD lives in the issue body itself.
Related
prd-task-creator — file the finished PRD into a tracker and slice it into sub-issues sized for one PR each.
1---
2name: prd-writer
3description: Authors the PRD document itself — problem, scope boundaries, EARS acceptance criteria, and verification plan — as one self-contained contract a planning agent consumes without re-elicitation. Ends at the written PRD; slicing it into tracked issues is `prd-task-creator`.
4metadata:
5 version: "1.3.0"
6 tags: "prd, planning, requirements, spec, scoping, ears"
7when_to_use: "write a PRD for X, draft a PRD, scope this out, what should X do, formalize this feature, flesh out this issue before planning"
8---
910# PRD Writer
1112A PRD is the input contract for the planning phase. It must contain enough
13context, acceptance criteria, scope boundaries, and verification detail for a
14planning agent to produce a plan without re-eliciting requirements.
1516This skill is platform-agnostic. It assumes a plan → review → verify → ship flow
17where a PRD is written first, a planner decomposes it into steps, and a verifier
18checks the result against the PRD's acceptance criteria. Adapt the storage and
19field mechanics below to whatever tracker you use.
2021## Authorized Scope
2223Apply this engine only within the user's requested task and existing explicit
24authorization. Loading or delegating to it grants no additional authority.
25Preserve report-only restrictions and the caller's target, host, provider, and
26cost limits. Existing approval satisfies a gate only for the same actions and
27scope; obtain approval before expanding them. Forward these limits to delegates.
2829## Contract
3031Inputs:
3233- Feature requirements and the selected tracker issue or document destination
34- Known constraints and accepted scope
3536Outputs:
3738- A PRD with EARS acceptance criteria and a verification plan
3940Creates/Modifies:
4142- The requested PRD document or approved tracker issue body
43- No implementation or automatic issue slicing
4445External Side Effects:
4647- Tracker reads and approved issue-body writes
4849Confirmation Required:
5051- Confirm the destination and draft before creating or replacing tracker content
52 when that exact write is not already authorized
5354Delegates To:
5556- `prd-quality-gate` to check completeness
57- Recommend `prd-task-creator` when the user wants to split the finished PRD
5859## Storage Location
6061Use the tracker issue body as the default PRD location: one document per work
62item, one location. Avoid local sidecar files unless the repo explicitly uses
63them as source truth.
6465- **Create** a PRD by creating an issue whose body is clean PRD markdown.
66- **Edit** a PRD by editing that issue's body.
67- **Version history** is the tracker's edit history — no manual `updated` field.
68- **The planner reads the issue body verbatim.** What you write in the body is
69 exactly what the planning agent sees, so it must stand alone.
7071If there is no connected tracker, decide on the single canonical location for the
72PRD before writing — do not draft into a throwaway scratch file that nobody will
73find again.
7475## Native Tracker Metadata
7677Do not put YAML frontmatter at the top of issue bodies. Trackers render
78issue-body frontmatter as visible noise and already have native fields for this
79metadata.
8081Use native tracker / project-board fields instead:
8283- **Issue type:** `Feature`, `Bug`, or `Task`.
84- **Status:** `Backlog`, `In Progress`, `Human Review`, `Done`, or `Deferred`.
85- **Priority:** `P0`, `P1`, `P2`, or `P3`.
86- **Complexity:** `Low`, `Medium`, or `High`.
87- **Blast radius:** `Contained`, `Cross-package`, `Cross-app`, or `Infra`.
8889Rules:
9091- The PRD body starts with `# PRD: <name>` and contains only human-readable PRD content.
92- Put card/list summaries in the issue title, project fields, or a short Executive Summary, not in hidden metadata.
93- If you cannot estimate complexity, set the field to `Medium` and explain why in Risks & Open Questions.
94- `Draft` is workflow state, not body text. Keep draft PRDs off the runnable board path through status fields, not by editing the body.
9596## Issue Title Style
9798The issue title is what the board shows most of the time. Keep it at or under
9980 characters.
100101- Default to **4-7 words**.
102- Use an **imperative verb + object** shape: `Add pipeline checkpoints`, `Track CI blockers on issues`, `Expose model selectors in settings`.
103- Put the detail in the Executive Summary and body, not in the title.
104- Avoid titles chained together with `and` / `while` / `during` unless the feature is truly one inseparable unit.
105- Avoid titles that restate the full implementation loop. The title names the work item; the PRD explains it.
106- Keep the `# PRD:` name aligned with the final issue title's slugified form. If you shorten the title, shorten the PRD heading too.
107108Bad:
109110- `Open draft PR during execution and ingest PR feedback into stabilization loop`
111- `Treat CI failures as blocker state on issue tasks`
112113Better:
114115- `Add draft PR feedback loop`
116- `Track CI blockers on issues`
117118## Required Sections
119120Every PRD must have these sections, in this order. Missing sections fail quality gate.
121122```markdown
123# PRD: <name>
124125## Executive Summary
126<2–4 sentences. What is this feature, why now, who wins.>
127128## Problem Statement
129<The concrete pain. Reference real incidents, real users, real metrics where possible.
130Avoid "users might want..." — if you can't name the user, you don't have a problem yet.>
131132## Goals
133- <measurable, verifiable goal>
134- <measurable, verifiable goal>
135136## Non-Goals
137- <thing this explicitly does NOT do — the more you list, the less scope creep downstream>
138139## User Stories
140- As a <role>, I want <capability> so that <outcome>.
141- Each story ends with "**Acceptance:**" followed by 1–3 EARS criteria
142 (`WHEN <trigger> THE SYSTEM SHALL <response>`) — same syntax as Acceptance Criteria below.
143144## Functional Requirements
145<Numbered list. Each item must be verifiable by reading code or running it.
146NO implementation details — "the system must do X", not "use Zustand to do X".>
147148## Non-Functional Requirements
149<Performance, accessibility, error-handling, offline, observability.
150Only list the ones that actually matter for this feature.>
151152## Acceptance Criteria
153<The bar the verification phase will check against. Write every bullet in EARS
154syntax (Easy Approach to Requirements Syntax) so it parses unambiguously and is
155pass/fail without judgement. Each bullet becomes an assertion the verifier checks:
156- Event: WHEN <trigger> THE SYSTEM SHALL <response>.
157- State: WHILE <state> THE SYSTEM SHALL <response>.
158- Unwanted: IF <condition> THEN THE SYSTEM SHALL <response>.
159- Optional: WHERE <feature enabled> THE SYSTEM SHALL <response>.
160- Always: THE SYSTEM SHALL <invariant>.>
161162## Out of Scope
163<At least one explicit boundary the implementation must not cross.>
164165## Dependencies
166<Other PRDs, packages, external APIs, feature flags. Reference by path or URL.>
167168## Verification Plan
169<How the verifier will know this shipped correctly.
170`tests`: list the test files/suites that must exist and pass.
171`manual`: list the manual QA steps a human will run post-merge.
172`both`: both sections. The clearer this section, the fewer verification retries you burn.>
173174## Risks & Open Questions
175<Unknowns, edge cases, things that could kill the plan mid-execution.
176Open questions get tracked here until answered, then deleted.>
177```
178179## Mapping PRD Sections to the Plan
180181A PRD is read by the planning agent. Every section has a downstream consumer:
182183| PRD section | Feeds | Consumer |
184|---|---|---|
185| Executive Summary | Plan objective | Plan display, PR title, board card |
186| Goals + Functional Requirements | Plan steps | Planner decomposition |
187| Acceptance Criteria | Acceptance criteria (EARS) | Verification phase |
188| Out of Scope | Plan out-of-scope list | Review phase (rejects scope creep) |
189| Complexity field | Estimated complexity | Review rubric, retry budget |
190| Verification Plan | Verification prompt input | Verification phase |
191| Non-Goals + Out of Scope | Review gate | Reviewer rejects patches that violate these |
192193**Do not write sections that describe files to change, function names, or implementation choices.** Those belong in the plan, not the PRD. If you can't resist writing pseudo-code, put it under "Risks & Open Questions" as "I suspect we'll need to touch X" — not as a requirement.
194195## Quality Gates
196197Before marking a PRD ready for a planner to consume, every one of these must be true:
198199- [ ] No placeholder text (`TODO`, `TBD`, `<fill this in>`) remains in any section.
200- [ ] `Goals` has at least one measurable bullet.
201- [ ] `Acceptance Criteria` has at least one bullet, every bullet is written in **EARS** syntax (`WHEN`/`WHILE`/`WHERE`/`IF … THE SYSTEM SHALL …`, or a bare `THE SYSTEM SHALL …`), and each is **verifiable without judgement** — it either passes or fails. "Feels fast" is not verifiable. "WHEN the issues query runs THE SYSTEM SHALL return p95 latency < 300ms" is.
202- [ ] `Out of Scope` has at least one bullet. Empty `Out of Scope` is a tell that the author didn't scope the feature.
203- [ ] `User Stories` has at least one story with explicit Acceptance bullets.
204- [ ] Every external dependency in `Dependencies` is named (package, PRD path, or URL), not described vaguely.
205- [ ] `Verification Plan` names either test file paths, suite names, or concrete manual steps — not "write some tests".
206207If any gate fails, keep it in draft/on-hold workflow state and do not mark it ready to plan.
208209## Workflow
210211### When the user says "write a PRD for X"
2122131. **Confirm where the PRD will live.** If using a tracker, confirm the target repo/project. If nothing is connected, agree on the single canonical location first — there must be exactly one.
2142152. **Do not start writing immediately.** Run a short elicitation pass first — you need answers before section-filling is meaningful:
216 - What problem does this solve, and for whom specifically?
217 - What does success look like — how would we measure it?
218 - What is explicitly out of scope?
219 - What is the complexity estimate (low/medium/high) and what evidence supports it?
220 - Any hard constraints — deadlines, other projects in flight, package boundaries?
2212223. **Check for an existing issue.** Search the project's tracker by keywords and state. If a matching issue already exists, ask whether to edit it or create a fresh one.
2232244. **Kebab-case the PRD name.** If the proposed name has spaces, camelCase, or punctuation, kebab-case it: `"Notification Center"` → `notification-center`. This slug goes in the `# PRD:` heading.
2252265. **Compress the issue title before writing the body.** Default to a short imperative title, then derive the `# PRD:` heading from that final title. Put nuance in the Executive Summary, not the title.
2272286. **Draft the PRD body** using the template above, in a scratch buffer. Fill every required section. If you can't fill a section, ask the user — don't hallucinate requirements.
2292307. **Run the quality gates** against the draft. If any fail, keep the issue in draft/on-hold workflow state and tell the user which gates failed. If they all pass, mark it ready through native project state.
2312328. **Create the issue (with user approval).** Show the drafted body first. On approval, create it through the tracker's native issue creation flow, using the PRD markdown as the issue body.
2332349. **Confirm the outcome** to the user with the issue URL and whether the PRD
235 passed every quality gate. Then suggest the next step: `Ready to hand this to the planner? Say: plan issue #N`.
236237### When the user says "plan the X PRD"
2382391. Fetch the current issue body from the tracker. Read it fully before producing anything.
2402. Verify the issue is ready through native project state — never plan a draft/on-hold issue.
2413. Translate directly: Executive Summary → objective, Acceptance Criteria → acceptance criteria, Out of Scope → out-of-scope, complexity field → estimated complexity.
2424. The plan phase owns file changes and step breakdown — do not copy those out of the PRD (there shouldn't be any).
2435. The resulting plan is posted back as a `## Implementation Plan` comment on the same issue (see `writing-plans`) — it lives on the issue, not in a local file, so it stays in sync with the PRD and reaches the loop.
244245### When the user says "update the X PRD"
2462471. Fetch the current issue body (prefer the tracker's live read to guarantee freshness).
2482. Make the requested edit in a scratch buffer.
2493. Write it back through the tracker's native edit flow. The tracker records the edit history automatically.
2504. If the change invalidates an in-flight plan (new acceptance criterion, new out-of-scope item), flag that explicitly — the user may want to kill the thread and re-plan.
251252## Anti-Patterns
253254Observed failure modes — do not repeat:
255256- **PRD full of implementation details.** Writing `use TanStack Query v5 for caching` in Functional Requirements. The PRD describes the *what*; the plan owns the *how*. This leaks into review and causes the reviewer to flag the plan for violating the PRD, which the planner then "fixes" by copying the implementation detail verbatim. Dead loop.
257- **Acceptance Criteria written as vibes.** "Users should find the flow intuitive." Unverifiable → verification retries forever. Force it into EARS: `WHEN the import completes THE SYSTEM SHALL display a success toast within 200ms`.
258- **Empty Out of Scope.** Always a sign the author is planning to sneak scope in later. Force the listing.
259- **Authoring a PRD with nowhere to put it.** If there's no agreed canonical location, the PRD becomes an orphan document that drifts out of sync. Decide the location first.
260- **Editing a cached copy instead of the source.** If your tracker caches issue bodies locally, the cache is downstream of the tracker, not upstream. Always edit via the tracker's API/CLI, never the cache.
261- **Creating an issue without running the quality gates first.** Half-formed PRDs thrash the planner and burn verification retries. Running gates after the issue is already public is embarrassing and harder to fix than running them first.
262- **Writing a PRD for something you should just ticket.** A typo fix does not need a PRD. A dependency bump does not need a PRD. Reserve PRDs for features and architectural changes that will run through plan / review / verify / ship.
263264## Minimal Example
265266The text below is the exact issue body to publish. Tracker metadata belongs in native fields, not in this body.
267268```markdown
269# PRD: copy-issue-url-action
270271## Executive Summary
272Users working in the board frequently need to paste an issue URL into chat,
273commit messages, or an external ticketing tool. Today the only way to get the
274URL is to click into the issue, then copy from the header — three clicks and
275a context switch. Add a "Copy URL" action to the card's context menu so it
276takes one click.
277278## Problem Statement
279Observed on 2026-04-09: the user mentioned needing to paste an issue URL
280into a chat thread five times in a single session, each requiring a detour
281through the issue detail view. This is pure friction — the URL is already known.
282283## Goals
284- Right-clicking a board card shows a context menu with "Copy URL".
285- Clicking "Copy URL" writes the issue's URL to the clipboard and
286 shows a toast confirming the copy.
287288## Non-Goals
289- Copying anything other than the URL (title, body, ID — all separate actions
290 if demand appears).
291- A multi-select "copy all URLs" bulk action.
292- Keyboard shortcut for copy — mouse-only for v1.
293294## User Stories
295- As a developer pasting issue links into chat, I want to copy an issue's
296 URL without leaving the board, so that I don't break my flow.
297 **Acceptance:**
298 - WHEN a user right-clicks a board card THE SYSTEM SHALL display a context
299 menu including a "Copy URL" action.
300 - WHEN a user clicks "Copy URL" THE SYSTEM SHALL write the issue's URL to the
301 system clipboard.
302 - WHEN the copy succeeds THE SYSTEM SHALL display a confirmation toast within 200ms.
303304## Functional Requirements
3051. The card component must support a right-click context menu.
3062. The context menu must include an action labeled "Copy URL".
3073. The URL written to the clipboard must be the canonical issue URL.
3084. The toast notification must use the existing UI toast primitive.
309310## Non-Functional Requirements
311- Clipboard write must succeed or fail cleanly — no silent failures. On
312 permission denial, surface an error toast.
313314## Acceptance Criteria
315- WHEN a user right-clicks any board card THE SYSTEM SHALL open a context menu
316 containing a "Copy URL" item.
317- WHEN a user clicks "Copy URL" THE SYSTEM SHALL place the exact canonical issue
318 URL on the clipboard.
319- WHEN the clipboard write succeeds THE SYSTEM SHALL display a success toast.
320- IF the clipboard API rejects the write THEN THE SYSTEM SHALL display an error toast.
321322## Out of Scope
323- Copying other fields (title, body, branch name).
324- Bulk selection + copy.
325- Keyboard shortcut bindings.
326- A "Share" action that opens the URL in the browser.
327328## Dependencies
329- The existing UI toast primitive in the project's component library.
330- The issue number and repo identifier for URL construction.
331332## Verification Plan
333- **tests:** add a test that simulates a right-click and asserts the context
334 menu includes a "Copy URL" item wired to a mocked clipboard write.
335- **manual:** right-click three cards from different projects, paste the
336 clipboard into a browser tab, verify the URL loads the correct issue.
337338## Risks & Open Questions
339- Which clipboard API does the renderer use today? Check the existing
340 implementation before writing new clipboard code.
341- Do we need focus-management so the context menu doesn't fight with
342 drag-and-drop handlers on the same card?
343```
344345Note: no `created`, `updated`, `status`, `complexity`, or `blast radius` fields in the body — the tracker and project board track those natively. No file path — the PRD lives in the issue body itself.
346347## Related
348349- `prd-task-creator` — file the finished PRD into a tracker and slice it into sub-issues sized for one PR each.
Run npx skillmds@latest add shipshitdev/prd-writer in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Authors the PRD document itself — problem, scope boundaries, EARS acceptance criteria, and verification plan — as one self-contained contract a planning agent consumes without re-elicitation. Ends at the written PRD; slicing it into tracked issues is `prd-task-creator`. It is listed under Product & Planning on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Independent scanners report: SkillSpector: CAUTION, Skill Scanner: PASS. Capability flags: makes network calls. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
shipshitdev (@shipshitdev) published this skill. Their other Agent Skills are listed on their SkillMD profile.