Requirements Scoping
Turn a vague prompt ("design a news feed") into three written lists: what the
system does (functional requirements), the numbers and qualities that shape
it (non-functional constraints), and what is deliberately excluded
(out-of-scope). Skipping this step is the most common way a design goes wrong —
it ends up solving a different problem than the one in front of it, and every
later decision rests on an unchecked assumption. The discipline is not
about being slow; it is about making the problem concrete enough that the design
choices have something to be measured against. Without it, every component is a
guess, and the first hard follow-up question collapses the whole picture.
When to reach for this
At step 1 of any design, before drawing a single box or naming a single tool. Any
time the ask is broad ("design YouTube"), ambiguous ("a real-time system"), or
silent on scale, consistency, or audience. Reach for it again mid-design when a
new constraint appears that may invalidate an earlier assumption — a re-scope is
cheaper than a rebuild. The clearest signal is the reflex to reach for a familiar
architecture before being able to state, in one sentence, what problem it solves
here. That reflex is exactly the trap: applying a remembered solution to a prompt
no one has actually read.
When NOT to
Don't interrogate forever. The goal is enough clarity to choose a first
hypothesis, not a complete spec — three to five sharp questions usually suffice,
with written assumptions for the rest. Don't gold-plate scope: every accepted
feature is one to design and defend, so push the nice-to-haves into out-of-scope
(YAGNI). And don't re-scope on every challenge; distinguish a genuine constraint
change from a clarifying nudge.
Clarify first
The questions that change the design the most, asked in rough priority order:
- Who uses it and how? Audience (consumer/internal/B2B), client (mobile, web,
both), and the one or two core user journeys. This bounds everything else.
- What are the must-have features? Force a ranked shortlist; the long tail is
out-of-scope until the core works.
- What scale? DAU/MAU, growth horizon (3/6/12 months), read:write ratio,
object sizes. These are the inputs
back-of-the-envelope turns into QPS and
storage — capture them here, quantify there.
- What latency and availability targets? A p99 number and a nines target,
tied to the journey (a feed read vs a payment differ).
- How fresh must data be, and how bad is loss? Strong vs eventual consistency
and durability expectations drive the hardest later trade-offs; capture the
requirement (can a read be stale? can a recent write be lost?) here, and leave
the consistency-model theory to
consistency-coordination.
If the user can't answer, state an assumption out loud and move on ("assuming 10M
DAU, read-heavy, eventual consistency is fine") — written assumptions are
revisable; silent ones are landmines. Capture each answer in the actual words used
("up to 5,000 friends", "must survive a region loss"): a stray detail now often
turns out to be the constraint that forces a structural choice later.
The method (recipe)
A repeatable pass from prompt to scoped problem:
- Restate the prompt in one sentence. "A service where users post short
messages and read a reverse-chronological feed of people they follow." This
surfaces hidden assumptions immediately and gets early buy-in.
- List functional requirements as user-visible capabilities, verb-first:
post a message, follow a user, view a feed, search. These answer "what does
the system do" — each is an action an actor can take. Keep them testable and
free of implementation ("store in a DB" is not a requirement; "view a feed"
is).
- Rank and cut to the core. Pick the two or three that define the product.
Explicitly defer the rest — deferral is a decision, not an omission. The core
is what the design lives or dies by; everything else can be a follow-up.
- Derive non-functional constraints from the clarifying answers. Where
functional requirements say what the system does, non-functional ones say how
well it must do it: scale (DAU, QPS inputs), latency (p99), availability
(nines), consistency, durability, and any cost/compliance limits. These are
the numbers a design is measured against, and the ones that force structural
choices (sharding, caching, queues) long before any feature does.
- Write the out-of-scope list explicitly. Name what is not being built
(analytics, ads, moderation, multi-region) so the design stays focused and the
boundary is visible, not accidental.
- Restate the three lists and confirm before designing. This is the contract
the rest of the work is judged against; treat it as a hypothesis to revisit if
constraints change, not a fixed spec.
The output is three short lists, not prose. Hand the non-functional numbers to
back-of-the-envelope next.
Pitfalls / where it misleads
Scoping done badly is worse than skipped, because it manufactures false
confidence. Watch for:
- Solution-shaped requirements. "We need Kafka / a cache / sharding" is an
answer smuggled in as a requirement. Strip it back to the need ("absorb write
bursts", "serve reads fast") and let the design earn the tool later.
- Unquantified non-functionals. "High scale", "low latency", "highly
available" decide nothing. A requirement without a number is a wish — convert
it via
back-of-the-envelope before it shapes a choice.
- Scope creep disguised as thoroughness. Accepting every feature feels
diligent but dilutes the design and burns the clock. The cheapest scope that
meets the goal wins.
- Phantom out-of-scope. Excluding things to dodge hard parts (cutting
consistency because it's hard) hides the real problem. Cut for focus, not to
avoid the difficulty the prompt is actually testing.
- Treating answers as final. Requirements are a hypothesis. When a constraint
changes ("now p99 < 50ms", "now we lose a region"), say which assumptions it
invalidates and re-scope the affected part rather than patching around it.
- Asking low-leverage questions first. Color of the button before
read:write ratio. Lead with the questions that move the architecture; a tidy
list of trivia answered perfectly still leaves the real shape of the system
unknown.
- Monologuing the scope instead of confirming it. Scoping is a dialogue.
Restate the three lists and the assumptions, then pause for correction —
treating a clarifying nudge as an attack on the scope is how a design ends up
defending the wrong problem.
Dos and don'ts
- Do restate the prompt in one sentence and lead with the highest-leverage
questions (audience, core features, scale, latency/availability, freshness).
- Do write the three lists — functional, non-functional, out-of-scope —
and treat each unanswered question as a stated, revisable assumption.
- Do quantify every non-functional ("p99 < 200ms", "10M DAU"), then hand the
raw numbers to
back-of-the-envelope to compute.
- Do re-scope when a genuine constraint changes, naming which assumptions it
invalidates.
- Don't smuggle a solution in as a requirement ("we need Kafka"); state the
need and let the design earn the tool.
- Don't accept every feature; defer the long tail to out-of-scope, and don't
exclude hard parts just to dodge them.
- Don't interrogate forever or monologue the scope — get enough clarity for
a first hypothesis, then confirm and move on.
Numbers that matter
Requirements scoping captures the inputs; it does not compute. Pin down the raw
quantities — DAU/MAU, actions per user per day, read:write ratio, object/payload
sizes, retention, peak factor, p99 latency target, and an availability nines
target — and hand them to back-of-the-envelope, which owns the latency/QPS/
storage tables and the conversion math. Two figures to record verbatim because
they gate the most decisions downstream: the read:write ratio (a 95%-read
system invites caching; a write-burst system invites a queue) and the scale
horizon (a design for 1k QPS and one for 1M QPS are different systems). Keep
units and assumptions written next to each number.
Diagram
Scoping output is three lists, not a picture — keep them as text so they stay the
editable contract everything traces back to. When the scoped requirements justify
a first high-level design, draw that with the in-plugin architecture-diagram
skill; the requirements themselves don't need a diagram.
Related building blocks
back-of-the-envelope — feeds into it: the non-functional numbers captured
here (DAU, ratios, SLAs) become its QPS, storage, and server-count math. The
next step.
scaling-evolution — feeds into it: the growth horizon scoped here defines
the next bottleneck to plan for, and re-scoping mid-design hands it new limits.
api-design and data-storage — feed into them: the functional requirements
and access patterns named here become concrete contracts and schemas there.
consistency-coordination — owned-concept lives there: capture the freshness
and durability requirement here; the consistency-model theory belongs to it.
system-design — called by the orchestrator at step 1, before estimation and
high-level design.
References
references/clarifying-question-catalog.md — the full question bank grouped
by category (functional, scale, latency/availability, consistency/durability,
constraints), a worked vague→concrete example, and a fill-in requirements
template. Read when scoping a real prompt or when the five questions above
aren't enough for an unfamiliar domain.
1---2name: requirements-scoping3description: This skill should be used when the user needs to "clarify requirements", separate "functional vs non-functional requirements", "scope the problem", figure out "what questions should I ask", state the "requirements for <X>", or otherwise pin down a vague design prompt before building. It turns an ambiguous ask into functional requirements, non-functional constraints, and an explicit out-of-scope. Use it whenever a prompt is broad or under-specified ("design Twitter", "build a chat app") even if the user doesn't say "requirements".4---56# Requirements Scoping78Turn a vague prompt ("design a news feed") into three written lists: what the9system *does* (functional requirements), the numbers and qualities that *shape*10it (non-functional constraints), and what is deliberately *excluded*11(out-of-scope). Skipping this step is the most common way a design goes wrong —12it ends up solving a different problem than the one in front of it, and every13later decision rests on an unchecked assumption. The discipline is not14about being slow; it is about making the problem concrete enough that the design15choices have something to be measured against. Without it, every component is a16guess, and the first hard follow-up question collapses the whole picture.1718## When to reach for this19At step 1 of any design, before drawing a single box or naming a single tool. Any20time the ask is broad ("design YouTube"), ambiguous ("a real-time system"), or21silent on scale, consistency, or audience. Reach for it again mid-design when a22new constraint appears that may invalidate an earlier assumption — a re-scope is23cheaper than a rebuild. The clearest signal is the reflex to reach for a familiar24architecture before being able to state, in one sentence, what problem it solves25here. That reflex is exactly the trap: applying a remembered solution to a prompt26no one has actually read.2728## When NOT to29Don't interrogate forever. The goal is *enough* clarity to choose a first30hypothesis, not a complete spec — three to five sharp questions usually suffice,31with written assumptions for the rest. Don't gold-plate scope: every accepted32feature is one to design and defend, so push the nice-to-haves into out-of-scope33(YAGNI). And don't re-scope on every challenge; distinguish a genuine constraint34change from a clarifying nudge.3536## Clarify first37The questions that change the design the most, asked in rough priority order:3839- **Who uses it and how?** Audience (consumer/internal/B2B), client (mobile, web,40 both), and the one or two core user journeys. This bounds everything else.41- **What are the must-have features?** Force a ranked shortlist; the long tail is42 out-of-scope until the core works.43- **What scale?** DAU/MAU, growth horizon (3/6/12 months), read:write ratio,44 object sizes. These are the inputs `back-of-the-envelope` turns into QPS and45 storage — capture them here, quantify there.46- **What latency and availability targets?** A p99 number and a nines target,47 tied to the journey (a feed read vs a payment differ).48- **How fresh must data be, and how bad is loss?** Strong vs eventual consistency49 and durability expectations drive the hardest later trade-offs; capture the50 *requirement* (can a read be stale? can a recent write be lost?) here, and leave51 the consistency-model theory to `consistency-coordination`.5253If the user can't answer, state an assumption out loud and move on ("assuming 10M54DAU, read-heavy, eventual consistency is fine") — written assumptions are55revisable; silent ones are landmines. Capture each answer in the actual words used56("up to 5,000 friends", "must survive a region loss"): a stray detail now often57turns out to be the constraint that forces a structural choice later.5859## The method (recipe)60A repeatable pass from prompt to scoped problem:61621. **Restate the prompt in one sentence.** "A service where users post short63 messages and read a reverse-chronological feed of people they follow." This64 surfaces hidden assumptions immediately and gets early buy-in.652. **List functional requirements** as user-visible capabilities, verb-first:66 *post a message, follow a user, view a feed, search.* These answer "what does67 the system *do*" — each is an action an actor can take. Keep them testable and68 free of implementation ("store in a DB" is not a requirement; "view a feed"69 is).703. **Rank and cut to the core.** Pick the two or three that define the product.71 Explicitly defer the rest — deferral is a decision, not an omission. The core72 is what the design lives or dies by; everything else can be a follow-up.734. **Derive non-functional constraints** from the clarifying answers. Where74 functional requirements say what the system does, non-functional ones say *how75 well* it must do it: scale (DAU, QPS inputs), latency (p99), availability76 (nines), consistency, durability, and any cost/compliance limits. These are77 the numbers a design is measured against, and the ones that force structural78 choices (sharding, caching, queues) long before any feature does.795. **Write the out-of-scope list explicitly.** Name what is *not* being built80 (analytics, ads, moderation, multi-region) so the design stays focused and the81 boundary is visible, not accidental.826. **Restate the three lists and confirm** before designing. This is the contract83 the rest of the work is judged against; treat it as a hypothesis to revisit if84 constraints change, not a fixed spec.8586The output is three short lists, not prose. Hand the non-functional numbers to87`back-of-the-envelope` next.8889## Pitfalls / where it misleads90Scoping done badly is worse than skipped, because it manufactures false91confidence. Watch for:9293- **Solution-shaped requirements.** "We need Kafka / a cache / sharding" is an94 answer smuggled in as a requirement. Strip it back to the need ("absorb write95 bursts", "serve reads fast") and let the design earn the tool later.96- **Unquantified non-functionals.** "High scale", "low latency", "highly97 available" decide nothing. A requirement without a number is a wish — convert98 it via `back-of-the-envelope` before it shapes a choice.99- **Scope creep disguised as thoroughness.** Accepting every feature feels100 diligent but dilutes the design and burns the clock. The cheapest scope that101 meets the goal wins.102- **Phantom out-of-scope.** Excluding things to dodge hard parts (cutting103 consistency because it's hard) hides the real problem. Cut for focus, not to104 avoid the difficulty the prompt is actually testing.105- **Treating answers as final.** Requirements are a hypothesis. When a constraint106 changes ("now p99 < 50ms", "now we lose a region"), say which assumptions it107 invalidates and re-scope the affected part rather than patching around it.108- **Asking low-leverage questions first.** Color of the button before109 read:write ratio. Lead with the questions that move the architecture; a tidy110 list of trivia answered perfectly still leaves the real shape of the system111 unknown.112- **Monologuing the scope instead of confirming it.** Scoping is a dialogue.113 Restate the three lists and the assumptions, then pause for correction —114 treating a clarifying nudge as an attack on the scope is how a design ends up115 defending the wrong problem.116117## Dos and don'ts118- **Do** restate the prompt in one sentence and lead with the highest-leverage119 questions (audience, core features, scale, latency/availability, freshness).120- **Do** write the three lists — functional, non-functional, out-of-scope —121 and treat each unanswered question as a stated, revisable assumption.122- **Do** quantify every non-functional ("p99 < 200ms", "10M DAU"), then hand the123 raw numbers to `back-of-the-envelope` to compute.124- **Do** re-scope when a genuine constraint changes, naming which assumptions it125 invalidates.126- **Don't** smuggle a solution in as a requirement ("we need Kafka"); state the127 need and let the design earn the tool.128- **Don't** accept every feature; defer the long tail to out-of-scope, and don't129 exclude hard parts just to dodge them.130- **Don't** interrogate forever or monologue the scope — get *enough* clarity for131 a first hypothesis, then confirm and move on.132133## Numbers that matter134Requirements scoping *captures* the inputs; it does not compute. Pin down the raw135quantities — DAU/MAU, actions per user per day, read:write ratio, object/payload136sizes, retention, peak factor, p99 latency target, and an availability nines137target — and hand them to `back-of-the-envelope`, which owns the latency/QPS/138storage tables and the conversion math. Two figures to record verbatim because139they gate the most decisions downstream: the **read:write ratio** (a 95%-read140system invites caching; a write-burst system invites a queue) and the **scale141horizon** (a design for 1k QPS and one for 1M QPS are different systems). Keep142units and assumptions written next to each number.143144## Diagram145Scoping output is three lists, not a picture — keep them as text so they stay the146editable contract everything traces back to. When the scoped requirements justify147a first high-level design, draw *that* with the in-plugin `architecture-diagram`148skill; the requirements themselves don't need a diagram.149150## Related building blocks151- `back-of-the-envelope` — *feeds into* it: the non-functional numbers captured152 here (DAU, ratios, SLAs) become its QPS, storage, and server-count math. The153 next step.154- `scaling-evolution` — *feeds into* it: the growth horizon scoped here defines155 the next bottleneck to plan for, and re-scoping mid-design hands it new limits.156- `api-design` and `data-storage` — *feed into* them: the functional requirements157 and access patterns named here become concrete contracts and schemas there.158- `consistency-coordination` — *owned-concept lives there*: capture the freshness159 and durability *requirement* here; the consistency-model theory belongs to it.160- `system-design` — *called by* the orchestrator at step 1, before estimation and161 high-level design.162163## References164- **`references/clarifying-question-catalog.md`** — the full question bank grouped165 by category (functional, scale, latency/availability, consistency/durability,166 constraints), a worked vague→concrete example, and a fill-in requirements167 template. Read when scoping a real prompt or when the five questions above168 aren't enough for an unfamiliar domain.