Part II · Understanding the problem · Chapter 5
Writing it down
Problem briefs, acceptance criteria a stranger can test, edge cases, and decisions with an owner and a date.
13 min read
A decision that lives only in a meeting is a decision that will be remade, usually by someone who wasn't there. Writing is how an FDE scales beyond the conversations they can attend. This chapter covers the few documents that matter, and how to make each one usable by a stranger.
What you'll take away
- 01The three documents that carry an engagement, and what goes in each.
- 02How to write a criterion that a tester can pass or fail without asking you anything.
- 03Five edge-case categories that turn 'what could go wrong?' into a finishable list.
- 04Why AI features need a spec for the good answer and a spec for when there isn't one.
- 05How to close a review with decisions, owners and dates instead of comments.
Three documents carry an engagement
| Document | Answers | Length |
|---|---|---|
| Problem brief | What is wrong, for whom, what it costs, how we'll know it's fixed | One page |
| Design doc | What we'll build, the options we rejected and why, what it costs to run, how it fails | Three to six pages |
| Spec (or PRD) | Exactly what the system must do, including the unhappy paths, so others can build and test it | As long as the scope needs |
Each is written for a different reader at a different moment. The brief is for the sponsor, early, to confirm you understood. The design doc is for technical owners and reviewers, before building. The spec is for whoever builds and tests, including people who will never meet you.
The problem brief
Write it after two or three discovery conversations, send it to the sponsor and champion, and ask them to correct it. Disagreement at this stage is cheap and valuable. A brief that comes back with edits is working.
- Problem statement. One or two sentences that the sponsor and the people doing the work would both sign.
- Baseline. What it costs today in hours, money, errors, delay or risk. Use their numbers.
- Success measure. The number that will tell the sponsor it worked, and the target.
- Decision-makers. Who approves the solution, who can veto it, and who has to live with it.
- Constraints. Deadlines and why they exist, data that is off limits, systems that can't change, required accuracy.
- Open questions. What you still don't know, and who can answer it.
Criteria a stranger can test
An acceptance criterion is the line that says when one piece of work is finished. Judge it with the stranger test: hand it to a tester who has never met you. If they can write the test without messaging you, it's done. If they would need to ask "which case?", "how fast?" or "what should I see?", it isn't.
Dan North's Given / When / Then format, from behaviour-driven development, is a reliable way to pass the stranger test. Given says where things stand before anything happens. When names the single event. Then says what anyone could check afterwards. Add a number wherever time, size or quantity matters.
Three smells tell you a criterion will fail the stranger test:
- Adjectives. "Quick", "intuitive" and "robust" are opinions. Replace each with something a tester can see or measure.
- Bundles. One sentence covering the normal path, the limits and the failure. Split it, so each outcome gets its own criterion.
- Negatives. "Bookings must never be lost" can't be checked. Say what happens instead: "an unsent booking is kept as a draft and reopened on the next visit".
Edge cases you can finish listing
"What could go wrong?" has no end. A short, fixed set of questions does. Ask each of them of every criterion, and write the expected behaviour for those that apply. They are standard categories from software testing.
| Ask | Freight-portal example | Expected behaviour |
|---|---|---|
| What if there's nothing? | A customer with no saved addresses opens the booking form | The address step opens empty with a search box; Continue stays disabled until one is chosen |
| What if something it depends on fails? | The rates service doesn't answer | After 8 seconds, say rates are unavailable, keep the form filled in, offer an emailed quote |
| What happens exactly at the limit? | Containers are limited to 26,000 kg | Test 25,999, 26,000 and 26,001 kg; the last is refused, with the limit shown |
| What if it happens twice, or at once? | Two colleagues confirm the same draft booking | One booking is created; the second person sees who confirmed it and when |
| What if this person isn't allowed? | A read-only user opens a booking link | The booking shows without edit controls, and any edit attempt is logged |
The "twice" case has a well-known engineering answer. The client attaches a unique key to the request; the server recognises a repeated key and hands back the original result instead of acting again. Payment companies call it an idempotency key. The spec doesn't have to design that mechanism, only promise its effect: one booking, however many times the button is pressed.
Then prune. Keep a case if getting it wrong could hurt someone, cost money or breach a rule; if it will happen in ordinary use; or if two engineers would plausibly handle it differently. A long list of unlikely cases buries the few that matter.
AI features need two specs
When ordinary code fails it usually throws an error someone can catch. When a model fails it usually returns something that looks fine. So an AI feature needs a second spec beside the first: not only what a good result is, but what the person in front of the screen sees at the moments when there isn't one.
Google's People + AI Guidebook has a chapter on errors and graceful failure worth reading before you write this section. Give each behaviour an owner: several are product or policy decisions, not engineering ones.
Specify the good answer, and specify what happens when there isn't one.
Decisions with an owner and a date
Reviews tend to end with a pile of comments and no decisions. Prevent that with a small table near the top of the document: the questions that need settling, who settles each one, and by when. Reviewers told exactly what they own reply faster than reviewers asked for "any thoughts".
| Question to settle | Who decides | By | Status |
|---|---|---|---|
| Can the first release ship within two sprints? | Engineering lead | Fri 9th | Open |
| How long do we keep uploaded customs documents? | Data protection officer | Fri 9th | Decided: 7 years |
| Which trade lanes are in the first release? | Head of operations | Fri 9th | Open |
Bain's RAPID model is a good check on that table: for each decision, someone recommends, some must agree, some give input, someone does the work, and exactly one person decides. If the "decides" column holds two names, the decision will stall.
When requirements arrive late
New requirements always turn up just before a build starts. Accepting every one wrecks the date; refusing them all wrecks the relationship. Sort each into one of three piles, and note the result in the change log.
- In: the release can't meet its goal without it, and you know what it costs. Update the criteria and get them signed again.
- Later: worth doing, not needed for this goal. Into the backlog with a one-line reason.
- Up the chain: it changes the goal, the date or the budget. That is a sponsor's call, not yours.
Try it
Fix a criterion
A municipal permits office is adding an AI assistant that answers residents' questions about building permits. The spec says: "The assistant should answer permit questions accurately and handle unclear questions gracefully."
Rewrite it as at least three testable criteria, add two edge cases, and name the decision someone must own.
Write your answer down first, then reveal the worked answerWorked answer
Criterion 1. Given a resident asks about a permit type covered by the published rules, when they send the question, then the answer cites the specific rule it relies on, within 6 seconds.
Criterion 2. Given a question about a permit type not covered by the published rules, when sent, then the assistant says it cannot answer and links to the contact form. It does not answer from general knowledge.
Criterion 3. Given a question that is ambiguous between two permit types, when sent, then the assistant asks one clarifying question naming both types.
Edge cases. Error: the rules database is unavailable, so the assistant says answers are temporarily unavailable and shows office hours. Permission: a resident asks about someone else's application, so the assistant explains it can only discuss published rules and does not look anything up.
Decision to own. Who decides which rules count as published and current, and how quickly the assistant must reflect a change. Engineers can't settle that one; it needs a named owner in the permits office.
Go deeper
- Introducing BDD · Dan NorthThe origin of Given / When / Then, and why the vocabulary matters more than the template.
- RAPID: Bain's tool to clarify decision accountability · Bain & CompanyA simple way to name who recommends, agrees, decides and does.
- Errors and graceful failure · Google PAIRHow to design what users see when an AI feature has no good answer.