RFC / Design Document
A design doc (a.k.a. RFC) is the artifact you write before building something
non-trivial. Its real value is the process: forcing yourself to think through
the problem, surfacing alternatives, and getting review from people who'll catch
issues while they're still cheap. The document is the medium; the design and the
shared understanding are the product.
When to use it
Write one when the work is large, risky, cross-team, hard to reverse, or
controversial — anything where being wrong is expensive and a few engineers'
review is worth a day of writing. Skip it for small, obvious, or easily reversed
changes; a good PR description is enough there.
This skill is for the proposal. Once the design is agreed and a specific
architectural decision falls out of it, capture that decision compactly with the
adr skill and link the two.
Canonical structure
Based on "Design Docs at Google", with proposal elements from the Rust RFC
process. Adapt — not every doc needs every section — but justify omissions.
- Title / metadata — title, author(s), reviewers, status, date.
- Context & Scope — the landscape and the problem. What exists today, why
it's a problem now, and the boundaries of what this doc addresses. Neutral and
brief; orient the reader, don't argue yet.
- Goals — what success looks like, ideally measurable.
- Non-Goals — what you are explicitly not solving. This is one of the most
valuable sections: it scopes the review and pre-empts "but what about…".
- Design / Proposed Solution — the actual proposal, in enough detail to
evaluate: data model, APIs/interfaces, request flow, key components, failure
handling. Diagrams where they help. This is the bulk of the doc.
- Alternatives Considered — the other serious options and why you rejected
them. At least one or two, with honest trade-offs. A design with no
alternatives reads as unexamined.
- Cross-Cutting Concerns — security, privacy, data handling, performance &
scale, observability, cost, backwards compatibility, operability. Call out the
ones that apply; state "N/A — because…" for the ones that don't.
- Drawbacks — why we might choose not to do this at all.
- Rollout Plan — how it ships safely: phasing, flags, migration, fallback,
what you'll monitor.
- Unresolved Questions — open issues you want reviewers to weigh in on.
Naming them builds trust; pretending certainty erodes it.
Review workflow
The doc is meant to be commented on. Share it for a defined review window
(typically ~1 week), gather feedback inline, iterate, and reach an explicit
decision (accepted / rejected / deferred) from the responsible decision-maker(s).
Once accepted it becomes the source of truth for implementation; record any hard
architectural decision it produced as an ADR.
Quality rubric
A strong design doc:
- Leads with the problem, not the solution — Context & Scope makes the reader
care before the proposal appears.
- Has real Non-Goals — scope is bounded explicitly, not left implicit.
- Considers ≥2 serious alternatives with honest trade-offs, including the
status quo / "do nothing" where relevant.
- Engages the cross-cutting concerns that actually apply, and says so for the
ones that don't.
- Is honest about uncertainty — Drawbacks and Unresolved Questions are
populated, not empty.
- Is right-sized — long enough to evaluate the design, short enough that busy
reviewers actually read it. Detail belongs in proportion to risk.
Common pitfalls
- Jumping straight to the solution with no framing of the problem.
- Empty or trivial Non-Goals / Alternatives — the sections that prove you thought.
- Hand-waving the cross-cutting concerns (security, rollback, observability).
- A wall of low-level detail no reviewer can hold in their head — summarise,
link the deep specifics.
- Writing it after the code is built — then it's documentation, not design.
Naming & storage
- Directory:
docs/rfc/ (or docs/design/).
- Filename:
NNNN-kebab-case-title.md, zero-padded sequence.
- Track status in the metadata header:
Draft → In Review → Accepted /
Rejected / Superseded.
Template
Copy templates/design-doc.md and fill it in.
Sources
1---2name: rfc3description: Write or improve an RFC / design document for a non-trivial change before building it. Use when the user wants a design doc, technical proposal, RFC, or to think through and socialise an approach with goals, alternatives, and trade-offs. For recording a decision that has already been made, use the adr skill; for incident analysis, use the rca skill.4---56# RFC / Design Document78A design doc (a.k.a. RFC) is the artifact you write **before** building something9non-trivial. Its real value is the *process*: forcing yourself to think through10the problem, surfacing alternatives, and getting review from people who'll catch11issues while they're still cheap. The document is the medium; the design and the12shared understanding are the product.1314## When to use it1516Write one when the work is large, risky, cross-team, hard to reverse, or17controversial — anything where being wrong is expensive and a few engineers'18review is worth a day of writing. Skip it for small, obvious, or easily reversed19changes; a good PR description is enough there.2021This skill is for the **proposal**. Once the design is agreed and a specific22architectural decision falls out of it, capture that decision compactly with the23**adr** skill and link the two.2425## Canonical structure2627Based on "Design Docs at Google", with proposal elements from the Rust RFC28process. Adapt — not every doc needs every section — but justify omissions.29301. **Title / metadata** — title, author(s), reviewers, status, date.312. **Context & Scope** — the landscape and the problem. What exists today, why32 it's a problem now, and the boundaries of what this doc addresses. Neutral and33 brief; orient the reader, don't argue yet.343. **Goals** — what success looks like, ideally measurable.354. **Non-Goals** — what you are explicitly *not* solving. This is one of the most36 valuable sections: it scopes the review and pre-empts "but what about…".375. **Design / Proposed Solution** — the actual proposal, in enough detail to38 evaluate: data model, APIs/interfaces, request flow, key components, failure39 handling. Diagrams where they help. This is the bulk of the doc.406. **Alternatives Considered** — the other serious options and *why you rejected41 them*. At least one or two, with honest trade-offs. A design with no42 alternatives reads as unexamined.437. **Cross-Cutting Concerns** — security, privacy, data handling, performance &44 scale, observability, cost, backwards compatibility, operability. Call out the45 ones that apply; state "N/A — because…" for the ones that don't.468. **Drawbacks** — why we might choose *not* to do this at all.479. **Rollout Plan** — how it ships safely: phasing, flags, migration, fallback,48 what you'll monitor.4910. **Unresolved Questions** — open issues you want reviewers to weigh in on.50 Naming them builds trust; pretending certainty erodes it.5152## Review workflow5354The doc is meant to be commented on. Share it for a defined review window55(typically ~1 week), gather feedback inline, iterate, and reach an explicit56decision (accepted / rejected / deferred) from the responsible decision-maker(s).57Once accepted it becomes the source of truth for implementation; record any hard58architectural decision it produced as an ADR.5960## Quality rubric6162A strong design doc:6364- **Leads with the problem, not the solution** — Context & Scope makes the reader65 care before the proposal appears.66- **Has real Non-Goals** — scope is bounded explicitly, not left implicit.67- **Considers ≥2 serious alternatives** with honest trade-offs, including the68 status quo / "do nothing" where relevant.69- **Engages the cross-cutting concerns** that actually apply, and says so for the70 ones that don't.71- **Is honest about uncertainty** — Drawbacks and Unresolved Questions are72 populated, not empty.73- **Is right-sized** — long enough to evaluate the design, short enough that busy74 reviewers actually read it. Detail belongs in proportion to risk.7576## Common pitfalls7778- Jumping straight to the solution with no framing of the problem.79- Empty or trivial Non-Goals / Alternatives — the sections that prove you thought.80- Hand-waving the cross-cutting concerns (security, rollback, observability).81- A wall of low-level detail no reviewer can hold in their head — summarise,82 link the deep specifics.83- Writing it after the code is built — then it's documentation, not design.8485## Naming & storage8687- Directory: `docs/rfc/` (or `docs/design/`).88- Filename: `NNNN-kebab-case-title.md`, zero-padded sequence.89- Track status in the metadata header: `Draft` → `In Review` → `Accepted` /90 `Rejected` / `Superseded`.9192## Template9394Copy `templates/design-doc.md` and fill it in.9596## Sources9798- Malte Ubl, "Design Docs at Google" — https://www.industrialempathy.com/posts/design-docs-at-google/99- Rust RFC process & template — https://github.com/rust-lang/rfcs100- Oxide RFD process — https://rfd.shared.oxide.computer/rfd/0001