The PRD contract — specs/requirements/prd.md
The PRD speaks product language: what the system does and for whom, never
how it is built. Engineering altitude begins at specs/design/.
Sections, in order
# <project name> — PRD
## Problem Statement
<who hurts, how, and what today's workaround costs — a short paragraph>
## Solution
<what this product is, in one paragraph a stakeholder can repeat>
## Actors
<one bullet per actor: name + what they can broadly see/do, product-level.
Every actor cited by a story is defined here first.>
## User Stories
<a single numbered list, the spine of the document:>
1. As a <actor>, I want <feature>, so that <benefit>.
2. …
## Product Decisions
<policy choices at product altitude: sign-in approach, notification channels,
which external services the product depends on. An external service is named
by capability ("transactional email"); a concrete provider appears here ONLY
as a given the business already holds — a Registered External resource of the
org (an org default, written without asking) or a service the user said they
already use or must use ("Payments: Stripe — finance has the account"). With
no such given the line stays capability-only; the agent never proposes a
provider here, and a provider line is never tagged `*assumed*` — choosing a
service is the user's, on the dependency's definition at design.
Decisions taken from an org default are ordinary entries; a decision the agent
made itself, because the user has not answered it yet, ends with the literal
tag `*assumed*` — that exact emphasised word, no parentheses or brackets around
it. The console reads the tag to count what is unsettled and to draw the
Settle control on the line, so a decorated variant costs the user the ability
to challenge the judgment. The tag lives exactly as long as the user has not
answered: the moment they do — even by confirming what was assumed — the tag
comes off and the line stays as a settled decision.>
## Out of Scope
<what this project deliberately does not do>
## Open Questions
<numbered; each is a fact only the user holds — marked, never guessed. It is
resolved when its answer moves to the section it belongs in and the entry
leaves this list. An entry the user has declined for now is marked
"deferred — the user will decide later", which tells you to stop raising it.
Open questions gate nothing: the document is readable, designable and
buildable with them outstanding.>
## Further Notes
<anything real that fits nowhere above; omit the section when empty>
Rules
- Story numbers are permanent. New stories append with fresh numbers;
numbers are never reused or renumbered — designs, criteria, and tasks cite
them.
- Every statement lands. Everything the user said in the brief or the
interview appears somewhere above — as a story, a decision, an
out-of-scope line, or an open question. A user statement with no home is a
defect.
- Actors before citation. A story only names actors the Actors section
defines.
- The story list is total. Every story the PRD defines ships. Work that
should come later is an Out of Scope line, or it is not a story yet.
- No acceptance criteria. Validation criteria live in
specs/validation/validation-criteria.json — the single acceptance oracle.
The PRD never duplicates them.
- Depth lives in feature files, and the PRD links to it. When a feature
needs more than its stories can carry, write
specs/requirements/features/<slug>.md and keep the PRD body lean; the
feature file elaborates, it never contradicts. Name it from the PRD as a
markdown link on the story it deepens — [<feature name>](features/<slug>.md)
— so a reader following the document arrives at the depth instead of being
told it exists somewhere. The link text is the feature's NAME, never the
path: the console renders the PRD, and it opens the file in place.
1---2name: prd-contract3description: The shape of specs/requirements/prd.md — its sections in order, the story-numbering rules, and what the PRD deliberately excludes. Use whenever writing or amending the PRD.4---56# The PRD contract — specs/requirements/prd.md78The PRD speaks **product language**: what the system does and for whom, never9how it is built. Engineering altitude begins at `specs/design/`.1011## Sections, in order1213```markdown14# <project name> — PRD1516## Problem Statement17<who hurts, how, and what today's workaround costs — a short paragraph>1819## Solution20<what this product is, in one paragraph a stakeholder can repeat>2122## Actors23<one bullet per actor: name + what they can broadly see/do, product-level.24Every actor cited by a story is defined here first.>2526## User Stories27<a single numbered list, the spine of the document:>281. As a <actor>, I want <feature>, so that <benefit>.292. …3031## Product Decisions32<policy choices at product altitude: sign-in approach, notification channels,33which external services the product depends on. An external service is named34by capability ("transactional email"); a concrete provider appears here ONLY35as a given the business already holds — a Registered External resource of the36org (an org default, written without asking) or a service the user said they37already use or must use ("Payments: Stripe — finance has the account"). With38no such given the line stays capability-only; the agent never proposes a39provider here, and a provider line is never tagged `*assumed*` — choosing a40service is the user's, on the dependency's definition at design.41Decisions taken from an org default are ordinary entries; a decision the agent42made itself, because the user has not answered it yet, ends with the literal43tag `*assumed*` — that exact emphasised word, no parentheses or brackets around44it. The console reads the tag to count what is unsettled and to draw the45Settle control on the line, so a decorated variant costs the user the ability46to challenge the judgment. The tag lives exactly as long as the user has not47answered: the moment they do — even by confirming what was assumed — the tag48comes off and the line stays as a settled decision.>4950## Out of Scope51<what this project deliberately does not do>5253## Open Questions54<numbered; each is a fact only the user holds — marked, never guessed. It is55resolved when its answer moves to the section it belongs in and the entry56leaves this list. An entry the user has declined for now is marked57"deferred — the user will decide later", which tells you to stop raising it.58Open questions gate nothing: the document is readable, designable and59buildable with them outstanding.>6061## Further Notes62<anything real that fits nowhere above; omit the section when empty>63```6465## Rules6667- **Story numbers are permanent.** New stories append with fresh numbers;68 numbers are never reused or renumbered — designs, criteria, and tasks cite69 them.70- **Every statement lands.** Everything the user said in the brief or the71 interview appears somewhere above — as a story, a decision, an72 out-of-scope line, or an open question. A user statement with no home is a73 defect.74- **Actors before citation.** A story only names actors the Actors section75 defines.76- **The story list is total.** Every story the PRD defines ships. Work that77 should come later is an Out of Scope line, or it is not a story yet.78- **No acceptance criteria.** Validation criteria live in79 `specs/validation/validation-criteria.json` — the single acceptance oracle.80 The PRD never duplicates them.81- **Depth lives in feature files, and the PRD links to it.** When a feature82 needs more than its stories can carry, write83 `specs/requirements/features/<slug>.md` and keep the PRD body lean; the84 feature file elaborates, it never contradicts. Name it from the PRD as a85 markdown link on the story it deepens — `[<feature name>](features/<slug>.md)`86 — so a reader following the document arrives at the depth instead of being87 told it exists somewhere. The link text is the feature's NAME, never the88 path: the console renders the PRD, and it opens the file in place.