If you’ve ever tried to go from “here’s the idea” to “here are the tasks” with a small team, you know the pain:
- requirements are vague
- assumptions are hidden
- edge cases show up mid-sprint
- nobody agrees on what “done” means
LLMs can help here—but only if you treat them like a planning assistant, not an oracle.
This is the workflow I use to turn a rough PRD (or even a messy Slack thread) into:
- clarified requirements
- a scoped implementation plan
- a task breakdown you can paste into Jira/Linear/GitHub
Step 0: collect the inputs (don’t wing it)
Before prompting, gather:
- the PRD / notes
- the target platform (web, mobile, backend)
- constraints (deadlines, “no new deps”, compliance)
- existing system context (APIs, data models)
Then paste them as raw inputs.
Step 1: force clarification (copy/paste)
This is the prompt that saves the most time.
You are a senior engineer and product-minded technical lead.
Input: a rough PRD.
Task:
1) Extract requirements as bullet points.
2) List assumptions you had to make.
3) Ask up to 10 clarifying questions, ordered by impact.
Constraints:
- Be concise.
- If a requirement is ambiguous, call it out.
- Do not propose solutions yet.
PRD:
<PASTE>
The output becomes your “planning checklist” for the next prompt.
Step 2: generate an implementation plan (with guardrails)
Once you answer the questions (or decide on assumptions), generate a plan.
You are a senior engineer writing an implementation plan.
Context:
- Stack: <e.g. Node.js + Postgres + React>
- Non-goals: <what we will NOT build>
- Constraints: <deadlines, performance, security>
Task:
Write an implementation plan with:
- Overview
- Architecture (components + data flow)
- Data model changes
- API changes
- Rollout plan (feature flag, migrations)
- Risks + mitigations
Constraints:
- Prefer minimal changes.
- Call out tradeoffs.
- If something is risky, propose a safer alternative.
PRD + clarifications:
<PASTE>
This produces something that reads like an internal design doc.
Step 3: break it into tasks as JSON (so it’s usable)
Now convert the plan into structured tasks. This is where JSON-first prompting shines.
Output ONLY valid JSON.
Schema:
{
"epics": [
{
"name": string,
"tasks": [
{
"title": string,
"description": string,
"owner": "backend" | "frontend" | "infra" | "qa",
"estimate_points": 1 | 2 | 3 | 5 | 8,
"acceptance_criteria": string[],
"depends_on": string[]
}
]
}
]
}
Rules:
- No extra keys.
- Each task must have 2–5 acceptance criteria.
- Prefer smaller tasks (1–3 points) over big 8s.
Plan:
<PASTE IMPLEMENTATION PLAN>
Now you can paste the JSON into a script that creates tickets.
Bonus: a tiny script to turn task JSON into markdown
If your tool doesn’t accept JSON imports, convert it to markdown.
// tasks-to-md.js
import fs from "node:fs";
const data = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
let out = [];
for (const epic of data.epics) {
out.push(`## ${epic.name}`);
for (const t of epic.tasks) {
out.push(`- **${t.title}** (${t.owner}, ${t.estimate_points}pt)`);
out.push(` - ${t.description}`);
for (const ac of t.acceptance_criteria) out.push(` - [ ] ${ac}`);
if (t.depends_on?.length) out.push(` - Depends on: ${t.depends_on.join(", ")}`);
}
out.push("");
}
console.log(out.join("\n"));
Usage:
node tasks-to-md.js plan.json > tasks.md
What this workflow prevents
- Fake certainty: assumptions are explicit.
- Scope creep: non-goals are written down.
- Hidden risk: rollout + migrations are considered early.
- Unshippable plans: tasks include acceptance criteria.
It’s not magic. It’s just a structured way to think.
Want the exact prompt templates?
I keep a library of the templates I use for planning, code review, debugging, and writing in my Prompt Engineering Cheatsheet.
- Free sample: https://getnovapress.gumroad.com/l/prompt-sample
- Full shop (Cheatsheet $9+): https://getnovapress.gumroad.com
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.