Turn a PRD into a plan and tasks in Cursor
PLThe PRD workflow in Cursor turns a product requirements document into committed work: spec.md with numbered acceptance criteria, plan.md drafted in Plan Mode with a task list, and one commit per task with test evidence. Each task runs in a fresh chat that reads plan.md, so the work survives closed chats and stays checkable against the criteria.
Your product manager posts a two-page PRD for a notification system: email and push, per-type preferences, delivery tracking. You ask Cursor’s agent to build it, and after an afternoon you have half an email service, a schema nobody agreed to, and no way to say which requirement each change serves. This page is for developers who have project rules in place and now face a feature too big for one chat, and for tech leads who want the plan reviewed before the code exists.
What you get from the PRD workflow in Cursor
Section titled “What you get from the PRD workflow in Cursor”- A prompt that reads the PRD for gaps and writes
spec.mdwith numbered, testable acceptance criteria. - A Plan Mode prompt that produces a task list in which every task names its files, its criteria, and the command that proves it.
- A per-task prompt that runs one task in a clean chat, so long conversations stop drifting away from the plan.
- A traceability check that proves each criterion has a test that can fail, which replaces reading the whole diff.
- A way to change the plan halfway through without losing the record of why.
When is a PRD worth its own workflow?
Section titled “When is a PRD worth its own workflow?”Use this page when the feature is too big to hold in one chat. For a feature you can describe in five acceptance criteria and finish in one sitting, the shorter loop in build your first AI-assisted feature is enough.
| Signal | One-chat loop | PRD workflow |
|---|---|---|
| Acceptance criteria | Up to about five, written by you | More than you can hold in your head, or written by someone else |
| Sessions | One sitting | Several days, or several people |
| Plan lives in | The chat | plan.md, committed and reviewed |
| Who signs off the plan | You | You, plus the product owner for the criteria and a tech lead for higher-risk changes |
The file names follow the site’s artifact chain: the PRD plays the role of intent.md, the acceptance criteria become spec.md, and the plan with its tasks becomes plan.md. You do not need the whole chain to use this page. You need the last two files.
Prepare the repository before you paste the PRD
Section titled “Prepare the repository before you paste the PRD”-
Start from a clean tree on a feature branch, with one folder for the feature’s documents. In a terminal:
Terminal window git status --short # must print nothinggit switch -c feat/notificationsmkdir -p docs/features/notifications -
Save the PRD as
docs/features/notifications/prd.md. If the PRD lives in a GitHub issue, the agent can read it through the GitHub MCP server instead. Add it to~/.cursor/mcp.json, the user-level file that you never commit, keep the token in an environment variable, and set it to read-only, because reading the PRD needs no write tools:{"mcpServers": {"github": {"url": "https://api.githubcopilot.com/mcp/","headers": {"Authorization": "Bearer ${env:GITHUB_PAT}","X-MCP-Toolsets": "context,repos,issues","X-MCP-Readonly": "true"}}}}If your Cursor version does not expand
${env:GITHUB_PAT}(this page checked that interpolation only against a docs excerpt), paste the token instead and keep~/.cursor/mcp.jsonout of any repository.The GitHub MCP server guide covers token scopes and read-only settings, and MCP setup in Cursor covers the other servers.
-
Confirm that tests, type checks, and lint each run from one command. This example uses
npm test,npm run typecheck, andnpm run lint. Every task in the plan ends with one of these commands, so a missing one blocks the whole workflow; see making a codebase agent-ready.
Phase 1: Turn the PRD into acceptance criteria
Section titled “Phase 1: Turn the PRD into acceptance criteria”A PRD describes what the product owner wants. An agent needs statements it can test. The first prompt converts one into the other and lists what the PRD leaves open, instead of letting the agent guess. Run it in a new, normal agent chat rather than Plan Mode, so the agent writes spec.md directly.
Read spec.md closely. It is the one document in this workflow that you read line by line, because every later check is measured against it. Look for three defects:
- Vague criteria. “Users manage preferences” cannot fail a test. “A user can turn email off for the
commenttype, and no email of that type is queued afterwards” can. - Missing error paths. The PRD rarely says what happens when the email provider times out. Add a criterion for it or list it under Open questions.
- Criteria with no PRD source. The agent added a requirement nobody asked for. Delete it or get the product owner to accept it.
Send the product owner spec.md, not the chat. Their acceptance of the criteria is the first sign-off. Then commit it:
git add docs/features/notifications && git commit -m "docs: notifications spec (AC1-AC9)"Writing acceptance criteria an agent cannot misread has the full method.
Phase 2: Draft the plan in Plan Mode
Section titled “Phase 2: Draft the plan in Plan Mode”Start a new chat and switch the agent to Plan Mode (Shift+Tab cycles through the modes), which creates an implementation plan before it writes any code. A new chat matters: the Phase 1 conversation holds your answers as chat history, and spec.md holds them as a file. Plan from the file.
Review the plan against this checklist before you accept it:
- Every criterion from
spec.mdmaps to at least one task and one named test. A criterion with no task is a requirement that will not ship. - Each task names its files. A task that says “update the relevant services” has no scope you can check with
git diff --stat. - The first task produces something testable on its own, such as a migration and its test, not a skeleton of every layer.
- New files follow patterns the agent says it read. A new queue library or a second HTTP client is a question to answer now, not after it is installed.
Correct the plan in the same chat (“Use the existing jobs/ runner, not a new queue”) until the checklist passes. A correction here costs one sentence. The same correction after three tasks costs a rewrite.
Save the plan where reviewers and later chats can read it
Section titled “Save the plan where reviewers and later chats can read it”A plan that exists only in a chat, or only on your machine, is gone for the next session and invisible to the reviewer. Once you accept the plan, ask the agent to write the final version as docs/features/notifications/plan.md, next to spec.md, before you switch modes: switching starts a fresh context window (Cursor’s help, checked 2026-10-12), so a plan that lives only in the chat does not follow you. Then commit it. The committed file should look like this:
# Plan: notifications (spec: ./spec.md)
## Tasks- [ ] T1 Migration: notification_preferences table. Files: db/migrations/0042_notification_prefs.sql, db/prefs.test.ts Covers: AC2 · Proof: npm test -- db/prefs.test.ts- [ ] T2 Preferences API: GET/PUT /api/notification-preferences. Files: src/api/preferences.ts, src/api/preferences.test.ts Covers: AC1, AC2 · Needs: T1 · Proof: npm test -- src/api/preferences.test.ts
## Proofnpm test && npm run typecheck && npm run lintFor a higher-risk feature, open a draft pull request that contains only spec.md and plan.md and ask a tech lead to review it. A reviewer who accepts the plan before the code exists reviews against an agreed list later, not against their own guess of what you meant.
Phase 3: Build one task per chat
Section titled “Phase 3: Build one task per chat”Run the tasks in order, outside Plan Mode. Each task gets a new chat that starts from plan.md, so the agent works from the agreed plan instead of the tail of a long conversation.
After each task, check the scope and commit before the next chat:
git diff --stat # only the files the task lists, plus plan.mdgit add -A && git commit -m "feat(notifications): T2 preferences API (AC1, AC2)"The commit is your restore point. If the agent strays, run git restore . and git clean -fd to return to it, then repeat the prompt with the file list spelled out. When tasks do not share files, you can run them in parallel on separate worktrees. Do that only after the one-task loop feels routine.
Prove the feature meets the spec without reading every line
Section titled “Prove the feature meets the spec without reading every line”Passing tests the agent wrote prove only that the code agrees with those tests. Before you open the pull request, make the agent show that each criterion has a test that fails when the behaviour breaks.
A no in that column is a real finding: the criterion has no test that can fail. Ask for one and rerun the audit. Then collect the rest of the evidence yourself:
-
Run the plan’s Proof section in a terminal and confirm it passes on a clean checkout:
Terminal window npm test && npm run typecheck && npm run lint -
Compare the scope with the plan. Every file in this list should appear in some task:
Terminal window git diff --stat main...HEAD -
Check that no test was weakened on the way:
Terminal window git diff main...HEAD -- '*.test.ts' | grep -E '^-.*expect\(|^\+.*\.(skip|only)\('An empty result is what you want. Protect the test oracle shows how to enforce this in CI instead of by hand.
-
Open the pull request with
spec.md,plan.md, and the coverage table linked in the description. If your team runs Bugbot, it reviews the pull request for bugs, security issues, and code quality problems; treat its findings as input for the reviewer, not as the gate.
Who signs off: the product owner accepted the criteria in Phase 1, and the reviewer accepts three things now: every criterion has a test that failed when broken, the scope matches the plan, and the gates pass. Code reading is kept for what the evidence cannot cover, such as authorisation checks on the preferences API. Reading evidence instead of diffs explains where that line sits.
Change the plan when the PRD changes mid-build
Section titled “Change the plan when the PRD changes mid-build”Product owners change their minds after T3. Do not patch the code first. Change the spec, then the plan, then the code, so the record stays true.
Commit the spec and plan change on its own, with the reason in the message. Then continue with the per-task prompt. A reviewer can now see why T5 disappeared, which a code diff alone never shows. For a longer treatment of keeping the spec authoritative, see spec-driven development.
What breaks in the PRD workflow, and how to recover
Section titled “What breaks in the PRD workflow, and how to recover”| Symptom | Likely cause | Recovery |
|---|---|---|
| The plan is generic: “set up the service layer”, “add tests” | spec.md has vague criteria, or the plan prompt did not demand files and proof per task | Tighten the criteria in spec.md, then rerun the plan prompt in a new chat |
| The agent works on two tasks at once | The prompt did not say “first unchecked task only”, or the chat is long | git restore . to the last commit, open a new chat, and use the per-task prompt as written |
| The plan invents a queue, client, or table you already have | The agent did not read your code, or your rules do not state the convention | Ask it to list the files it read; correct the plan; add the convention to a project rule |
Checkboxes in plan.md say done, but the Proof command fails | The agent ticked the box before the test passed | Untick it, run the Proof command yourself, and treat only your own terminal output as evidence |
| An open question gets answered in code | Nobody put the answer in spec.md | Stop, record the answer in spec.md with the product owner, and check the affected task against it |
| The agent loops on one failing test | Failed attempts in the chat pull the next attempt toward them | Reset to the last commit and start a new chat with your own diagnosis; see error recovery in Cursor |
Where to go next with PRD-driven work in Cursor
Section titled “Where to go next with PRD-driven work in Cursor”Using another agent as well? The same PRD-to-plan workflow in the terminal is on the Claude Code PRD workflow page, and Codex’s version of the plan-then-build loop is in your first Codex task. The team-level procedure for each file is on the Design and Build stage pages.
Did this guide help you?
One tap, no sign-in.
What will you do with it?
How did it read?
What got in the way? Pick any that apply
Your role?
Thanks. I read every answer. Michał Jaskólski
Did this guide help?
One tap each. Close whenever you like.
no sign-in