-
Locate the repo's RFC convention first. Look for an existing docs/rfc/, rfcs/, or docs/adr/ dir and copy the latest file's structure, numbering, and frontmatter. Match the team's house style over this template. New file: docs/rfc/NNNN-kebab-title.md where NNNN = (highest existing number + 1), zero-padded. If no convention exists, create docs/rfc/0001-<title>.md.
-
Write the metadata header (status drives review): RFC #, Title, Author(s), Status: Draft (lifecycle: Draft → In Review → Accepted / Rejected / Superseded), Created date, Reviewers (named, not "the team"), Related: links to prior RFCs/ADRs/issues.
-
Lead with a TL;DR / Summary (3-5 sentences max): what you're proposing, the one recommended option, and why now (the forcing function — what breaks or gets blocked if we don't). A reviewer who reads only this paragraph should know what they're approving.
-
Motivation — state the concrete problem with evidence (a metric, an incident, a scaling limit, a recurring support load), not "it would be nice." Then Goals and Non-Goals as two explicit bullet lists. Non-Goals is the highest-leverage section for killing scope-creep arguments in review — name what's deliberately out.
-
Proposed Design — the recommended option, in enough detail to estimate and critique:
-
Alternatives Considered — at least 2 real options (one is usually "do nothing / status quo"). For each: a one-line description + why not chosen. Reviewers trust a recommendation more when they see the rejected paths. This is the section that separates an RFC from a spec.
-
Tradeoffs — a comparison table across the live options on the axes that matter here (e.g. complexity, cost, latency, migration effort, blast radius, lock-in). Pick axes specific to this decision; don't ship a generic grid.
-
Migration / Rollout — ordered, runnable steps: feature flag → backfill → dual-write/shadow → cutover → cleanup. State the backout plan (how to revert at each phase) and whether each step is reversible. Note data backfill and any irreversible point-of-no-return explicitly.
-
Risks & Mitigations — table of Risk | Likelihood | Impact | Mitigation. Include the failure that keeps you up at night, not just easy ones.
-
Security & Performance Impact — new attack surface, authz/data-exposure changes, PII handling, new dependencies; expected latency/throughput/cost delta and how you'll measure it. If the change touches auth, input handling, or secrets, say so loudly here so reviewers route it to a security pass.
-
Open Questions — honest unknowns you want input on. An RFC with zero open questions usually means you haven't thought hard enough.
-
Decisions Needed — end with a numbered list of explicit asks: each item = a question + the options + your recommendation, phrased so a reviewer can reply "approve #1, #3; let's discuss #2." This is what unblocks sign-off; don't bury it.