Specification

Asking Good Questions for Good Specs

A specification is only as good as the questions that produced it. The hard part of writing a Feature isn't the Given/When/Then syntax β€” it's knowing what to ask so the criteria end up complete, unambiguous, and verifiable. Every question you skip becomes an assumption someone else silently codes, and every vague answer becomes a bug you find later.

This guide is for anyone turning a fuzzy request into a spec β€” business analysts, product owners, architects, and AI agents alike. It complements the Idea workflow (where questions begin) and the Acceptance Criteria format (where good answers land).

Why questions come first

Requirements arrive underspecified. "Let users export their data," "make it faster," "add notifications" β€” each hides a dozen decisions. You can resolve those decisions cheaply now, by asking, or expensively later, through rework. Good questioning is the highest-leverage moment in the whole lifecycle: it costs minutes and saves days.

A spec written without questions isn't a spec β€” it's a guess with formatting.

What a good question does

A good question does at least one of these:

If a question does none of these, it's small talk. Cut it.

The spec-shaped question checklist

Walk these categories in roughly this order. Each maps to a part of the resulting spec.

  1. Purpose & value β€” Who is this for? What pain does it remove? Why now? What happens if we don't build it? β†’ feeds the Summary and Problem.
  2. Scope & boundaries β€” What is explicitly not included? Where does this feature end and the next begin? β†’ feeds Not Doing / Out of Scope.
  3. Actors & triggers β€” Who or what initiates the behavior? What must be true before it can happen (preconditions)?
  4. Behavior & rules β€” Walk the happy path first, then the rules that govern it. "Always? Or only when…?"
  5. Inputs & outputs β€” What goes in and comes out β€” shapes, formats, limits, defaults?
  6. Failure & edge cases β€” What can go wrong, and what should happen then? Probe the boundaries: empty, zero, one, many, huge, duplicate, concurrent, malformed, unauthorized.
  7. Observability & acceptance β€” How will we verify each behavior? Every requirement must be observable. β†’ feeds the Acceptance Criteria, later proven by Rehearse.
  8. Non-functionals β€” Performance, security, compatibility, accessibility, internationalization β€” but only the ones that genuinely matter here. Don't ritualistically ask all of them.
  9. Assumptions & unknowns β€” State the assumptions you're making out loud. Convert anything still undecided into an explicit Open Question rather than a silent choice.

You won't ask everything in every session. The checklist is a net, not a script β€” its job is to make sure nothing important falls through.

Techniques that sharpen questions

From answers to a SpecScore spec

Good answers slot directly into the Feature structure:

What you asked about Where the answer lands
Purpose, pain, value Summary and Problem
What's not included Not Doing / Out of Scope
Behavior and rules Behavior (with numbered requirements)
"How would we know?" Acceptance Criteria (Given/When/Then), later verified by Rehearse
Decisions and their rationale Autonomous Decisions, or a Decision (ADR) when weighty
Still-undecided Open Questions

If an answer has nowhere to go in the spec, either the spec is missing a section or the answer wasn't a requirement. Both are worth noticing.

Question smells (anti-patterns)

A worked example

The vague ask: "Let users export their data."

Sharp questions that turn it into a spec:

  1. Which data β€” everything the user can see, or a defined subset? (scope)
  2. What format, and if several, what's the default? (inputs/outputs)
  3. On-demand only, or scheduled/recurring too? (scope boundary β€” likely Not Doing for v1)
  4. Who may trigger it β€” the user only, or an admin on their behalf? (actors)
  5. How large can an export get, and what happens at the limit β€” stream, paginate, refuse? (edge cases + non-functional)
  6. Where does the result go β€” download, email, a link? Does it expire? (behavior)
  7. What must not leak β€” other users' data, secrets, soft-deleted rows? (security)
  8. How will we verify a correct export? (acceptance)

One resulting acceptance criterion:

Given a signed-in user with 3 records, when they request a JSON export, then the response is a file containing exactly those 3 records and no other user's data, and the command exits 0.

That criterion is observable β€” you could write a Rehearse scenario for it today. That's the sign the question behind it was a good one.

The test of a good spec

Read the finished spec back and check:

When all five hold, the questioning did its job β€” and the spec is one worth building from.

View as Markdown