Requests for Comments (RFCs)
RFCs are the engineering-owned non-functional specification for architectural decisions, data model changes, security, performance, infrastructure, and process changes. They capture how to build it and why that approach over alternatives — never what to build (that’s a PRD).What is an RFC?
An RFC is a Markdown/MDX document that proposes a non-functional change and walks through the trade-offs:- Summary — 2–3 sentences on what is being proposed
- Motivation — why this change is needed; link to driving PRD if applicable
- Detailed design — architecture, data model, API changes, security, performance
- Alternatives considered — what else was evaluated and why each was rejected
- Migration strategy — how to get from current state to proposed state
- Validation plan — how the proposal will be proven correct
- Open questions and risks
- Decision — filled in after review
accepted, the engineering team has aligned on the approach and the door is open to implementation.
When to write an RFC
| Situation | Write an RFC? |
|---|---|
| New architectural pattern (e.g., introducing a new data store) | ✅ Yes |
| Breaking API change | ✅ Yes |
| Schema change with downstream contract impact | ✅ Yes |
| New security boundary, auth flow, or tenant isolation pattern | ✅ Yes |
| New infrastructure component (e.g., new SaaS dependency) | ✅ Yes |
| Process change (e.g., new review workflow, new gate) | ✅ Yes |
| Anything requiring cross-team or cross-domain alignment | ✅ Yes |
| Functional requirement | ❌ No — write a PRD |
| Implementation detail of an already-accepted approach | ❌ No — write a Cycle doc |
| Single-file refactor | ❌ No — just open a PR |
RFC numbering
- Sequential:
RFC-001,RFC-002,RFC-003, … - Numbers are never reused (even if rejected or superseded)
- Filenames use a descriptive slug:
RFC-003-calendar-api-architecture.mdx
RFC lifecycle
| Status | Meaning |
|---|---|
draft | Author is iterating; not yet ready for review |
review | Open for engineering review on the PR |
accepted | Approved by reviewers; the proposed approach is the team’s plan |
rejected | Reviewers determined this approach is not the right one (rationale in doc) |
superseded | Replaced by a newer RFC (linked in superseded_by) |
How to create an RFC
- Copy
docs/RFCs/_template.mdxtodocs/RFCs/RFC-NNN-slug.mdx - Fill in frontmatter and body
- Commit on a branch like
rfc-NNN-slugand open a PR for review - Reviewers comment in the PR; iterate; merge once
accepted - The accepted RFC may produce an ADR recording the decision (optional but encouraged for architectural decisions)
Review process
| Reviewer | Required When |
|---|---|
| Domain CE (Chief Engineer) | Always — the squad CE owns architectural alignment within their domain |
| Cross-domain CE | Required when the RFC touches multiple domains |
| CTO | Required for any RFC that changes auth, tenant isolation, billing, or platform-wide patterns |
| PM | Required for any RFC that affects user-facing surface or feature timeline |
accepted.
Relationship to ADRs
ADRs (docs/adr/) record the decision and its consequences — short, focused, immutable.
RFCs record the deliberation — the alternatives considered, the trade-offs evaluated, the open questions worked through.
- An accepted RFC may produce an ADR (recommended for architectural decisions)
- ADRs are not required for every RFC; small RFCs (e.g., adding a new infra component) may not need one
- RFCs are mutable while in
draft/review; ADRs are immutable onceaccepted
Tips for good RFCs
- Lead with the recommendation, then defend it — reviewers should know your position in the first paragraph
- Steelman the alternatives — readers should understand why each rejected option was tempting
- Quantify wherever possible — “lower latency” is weak; “p95 from 800 ms to 200 ms” is strong
- Include diagrams — Mermaid renders natively in Mintlify; embed images for anything more complex
- Be explicit about migration — even greenfield additions affect existing code (imports, conventions, CI)
See also
_template.mdx— the RFC template- PRDs README — when to write a PRD instead
- ADR overview — architecture decision records
- Cycle 214 — Spec-driven dev process — the cycle that established this process