Problem statement
Write the problem being solved in one to two sentences — not the solution, the problem. 'Users can't find their boards from two weeks ago' is a problem statement. 'Add a search bar' is a solution. The requirements follow from the problem, not the other way around.
User stories
Write the user stories in standard format: 'As a [user type], I want to [action] so that [outcome].' Write every story that defines the feature's scope. Stories that aren't written don't exist — they become scope creep later.
Acceptance criteria
For each user story: write two to four acceptance criteria. These are the specific, testable conditions that define when the story is done. 'Search results appear within 500ms' is an acceptance criterion. 'Search is fast' is not.
Non-functional requirements
Performance, security, accessibility, platform constraints, and integration requirements. Write the ones that are non-negotiable. If a feature must work offline, write it here — not in a comment on a ticket two weeks into engineering.
Out of scope
Explicit list of what this feature does not include. This section prevents the sprint from expanding. If someone requests something mid-build that's not in the user stories and not in out-of-scope, it should go to the next sprint — not this one.