Topic: adr vs rfc

ADR vs RFC: What's the Difference and When Should You Use Each?

The most common confusion in engineering documentation: you call something a "design doc" or "RFC" and someone else calls the same artifact an "ADR." They're not synonyms. RFC (Request for Comments) is a pre-decision document — a proposal seeking feedback before the decision is made. ADR (Architecture Decision Record) is a post-decision document — a record of what was decided and why. Using the wrong format at the wrong moment is the most reliable way to damage team trust in your documentation practice. Write an ADR when you meant an RFC and you've presented a fait accompli to people who thought you wanted input. Write an RFC and never follow it with an ADR and you've left the decision unrecorded. The two formats are sequential, not competing: RFC opens the conversation, ADR closes it.

TL;DR

RFC = pre-decision, open, seeking input. Write an RFC when you have a proposal and want feedback before committing. The RFC can be revised, debated, withdrawn, or accepted. ADR = post-decision, closed, preserving rationale. Write an ADR when the decision is made and you need a durable record of what was decided, why, and what was rejected. The ideal workflow: RFC during the proposal phase → decision reached → ADR written from the RFC outcome. Both can coexist for the same decision; neither replaces the other.

The core distinction: timing and state

The single most important difference between an RFC and an ADR is when each is written relative to the decision, and what state it carries.

RFC (Request for Comments) ADR (Architecture Decision Record)
Timing Before or during the decision — written when the outcome is still open After the decision — written when the outcome is settled
Status Open: can be revised, debated, rejected, or withdrawn Accepted (or Rejected): body is immutable after acceptance
Primary purpose Solicit input and surface alternatives before committing Record rationale and rejected alternatives for future readers
Audience Reviewers who will comment and influence the decision Future engineers who need to understand a past decision
Outcome of disagreement Revision of the proposal, or escalation to a decision-maker A new ADR that supersedes the old one (not an edit)
Format Flexible (PR, Google Doc, Notion page, GitHub issue) Standardized template (Nygard, MADR, or team variant)
Storage location Design docs repository, PR description, wiki, shared drive doc/decisions/ in the main repository (or team's ADR store)
Lifecycle DRAFT → OPEN → ACCEPTED / REJECTED / WITHDRAWN PROPOSED → ACCEPTED → SUPERSEDED / DEPRECATED

What "RFC" actually means in an engineering team context

The term "RFC" comes from the IETF (Internet Engineering Task Force), where it means a formally published document that has already been approved — IETF RFCs are not actually "requests for comments" in the literal sense by the time they're numbered; they're published standards. In engineering team usage, "RFC" means something different: a design proposal circulated for feedback before a decision is made. This is closer to what IETF calls an "Internet Draft."

In engineering teams, RFC is a shorthand for "here is our proposed approach, please comment before we commit." Well-known examples of formal RFC processes:

The key property that makes an RFC an RFC (in the team context) rather than an ADR is that it is written when the author does not yet have authority or consensus to close the decision — the document exists to build that consensus.

The RFC → ADR handoff pattern

For significant architectural decisions, the best-practice workflow sequences RFC and ADR rather than choosing one:

  1. Write the RFC. Document the proposed approach, the alternatives considered, the trade-offs, and the open questions. Be explicit that this is a proposal, not a decision. Share with stakeholders and set a feedback window (typically one to two weeks for non-urgent decisions).
  2. Collect feedback. Reviewers comment, raise alternatives, identify risks. The RFC author updates the proposal in response, or acknowledges feedback that won't change the recommendation. The RFC thread is the record of the deliberation.
  3. Reach a decision. Either through consensus, a decision-maker call, or an explicit vote. The decision should be announced in the RFC thread so all participants know the outcome and its basis.
  4. Write the ADR. The ADR is written from the RFC outcome. The ADR's Context section synthesizes the constraints and alternatives surfaced in the RFC thread. The Decision section states the chosen approach. The Consequences section captures the trade-offs that the RFC feedback highlighted. The ADR should stand alone — a reader with no access to the RFC should be able to understand the decision from the ADR alone.
  5. Close the RFC. Mark the RFC as ACCEPTED (or REJECTED) with a reference to the ADR: "ACCEPTED — see ADR-0042." Merge or archive the RFC document. Do not delete it — the feedback thread is evidence.

The RFC thread is raw material for the ADR's Context section. This is the most underused aspect of the RFC → ADR handoff. The RFC discussion often surfaces the alternatives that reviewers raised, the constraints that ruled them out, and the organizational pressures that made the decision urgent. All of that belongs in the ADR's Context section. Teams that write ADRs without referring to the RFC thread write thin Context sections that omit the real reasons the decision went the way it did.

The two mistakes that damage team trust

Mistake 1: Writing an ADR when you meant an RFC

The symptom: you write an ADR titled "ADR-0042: We will use Kafka for the event bus" and share it for "feedback." Your colleagues comment with objections, alternatives, and concerns. You incorporate none of them and merge the ADR. The next time you share an ADR for feedback, nobody comments — they've learned that the feedback window is cosmetic.

The root cause: you had already decided before you shared the document. The document was framed as an ADR (past-tense, closed) but functioned as an RFC (seeking input). The mismatch between the framing and the reality created the trust problem.

The fix: Be honest about the decision state. If you want input before committing, write "RFC: Proposed approach for the event bus" — even if you strongly prefer one approach. An RFC can have a clear recommendation; it just makes clear that the recommendation is open to revision. If you've already decided, write an ADR but don't solicit "feedback" — share it as a record and invite questions instead.

Mistake 2: Writing an RFC and never writing the ADR

The symptom: the RFC gets feedback, reaches a decision in the thread, and is marked ACCEPTED. Six months later, a new engineer asks why the event bus is Kafka. Nobody can find the decision. The RFC exists but it's buried in a 60-comment PR thread in a design docs repository that nobody knows about. The decision is effectively unrecorded.

The root cause: the RFC closed the proposal process but didn't produce a durable record. The RFC thread has the rationale, but RFC threads are hard to find and hard to read — they're chronological discussions, not structured records.

The fix: Make the ADR a required output of the RFC process. When the RFC is marked ACCEPTED, the author is responsible for writing an ADR in doc/decisions/ before the RFC PR is merged. The ADR GitHub Action can enforce this: if an RFC PR contains changes to the RFC file, it can require a corresponding ADR file to be present in the same PR.

When to skip the RFC and write the ADR directly

Not every decision needs an RFC. The RFC process adds value when:

Skip the RFC (write the ADR directly) when:

The four-question threshold from the when-to-write-an-adr guide tells you whether a decision warrants an ADR at all. The RFC question is a separate test: given that this decision warrants documentation, does it also warrant a pre-decision feedback phase? Many ADRs don't — they're intra-team calls where the lead can decide and record without a formal RFC cycle.

Teams with existing RFC cultures: integrating ADRs without conflict

Some organizations (particularly those that grew up with Google's design doc culture or Rust-style RFC processes) have strong RFC habits but no ADR practice. When these teams adopt ADRs, the most common failure mode is treating the RFC as the ADR — keeping the decision in the RFC thread and never writing a structured record.

The integration approach that works without creating conflict:

Format note: the RFC template vs the ADR template

There is no universally standardized RFC format for engineering teams the way there is for ADRs (Nygard, MADR, arc42). Most teams use something like:

# RFC-NNN: [Proposed change or feature]

**Author:** [Name]
**Created:** [Date]
**Status:** DRAFT | OPEN | ACCEPTED | REJECTED | WITHDRAWN
**Decision:** [leave blank until decision is reached]

## Problem
[What problem is this solving?]

## Proposed solution
[The recommended approach, with enough detail to evaluate it]

## Alternatives considered
[Other approaches evaluated; why they were not recommended]

## Open questions
[What remains unclear or contested; where reviewers should focus]

## Decision rationale
[Filled in when closed: why the final decision went the way it did]

Compare with the Nygard ADR template:

# ADR-NNNN: [Decision statement title — past-tense action, e.g. "Use Kafka for the event bus"]

## Status
Accepted

## Context
[The constraints, organizational pressures, and background that made this decision necessary]

## Decision
[What was decided, in authoritative terms]

## Consequences
[Upsides and downsides of the decision as implemented]

The structural difference reflects the functional difference: the RFC template has "Proposed solution" (uncertain, open to revision) and "Open questions" (signaling that review is requested). The ADR template has "Context" (retrospective framing), "Decision" (authoritative, not proposed), and "Consequences" (stating trade-offs as facts about the chosen path, not as questions about it).

How WhyChose fits in

When a significant decision is being explored with AI assistance — thinking through trade-offs in a Claude or ChatGPT conversation — that conversation is the pre-RFC deliberation. It contains the alternatives considered, the constraints that ruled them out, and the reasoning that led to a preliminary recommendation. That reasoning is exactly what the RFC's "Alternatives considered" section and the ADR's "Context" section need.

The WhyChose extractor surfaces decision-shaped conversations from your ChatGPT or Claude export, recovering that reasoning even when the conversation happened months ago. For the RFC → ADR handoff, the extractor output maps directly: the AI chat where the approach was worked through provides the raw material for the RFC's recommended approach and the ADR's Context section. The result is a more accurate Context than memory reconstruction alone — especially for retrospective ADRs being written long after the decision was implemented.

Get early access

Related questions

What is the difference between an ADR and an RFC?

An RFC is a pre-decision document: a proposal written when the outcome is still open, seeking feedback before committing. An ADR is a post-decision document: a record written after the decision is made, preserving the rationale for future readers. RFC is open and mutable (can be revised based on feedback); ADR is closed and immutable (body doesn't change after Accepted — new decisions create new ADRs that supersede old ones). The two are sequential: RFC → decision → ADR is the ideal workflow for significant architectural calls.

Should I write an RFC or an ADR first?

Write an RFC first if: the decision is cross-team, contested, high-stakes, or you genuinely need input before you can reach a conclusion. Write an ADR directly (skipping the RFC) if: the decision is within your team's authority, the trade-offs are clear to the decision-maker, or you're documenting a decision that's already been implemented. The test: are you proposing something (RFC) or recording something (ADR)? The most costly mistake is writing an ADR when you meant an RFC — presenting a done deal to people who expected to have input.

Can you have both an RFC and an ADR for the same decision?

Yes, and this is best practice for significant decisions. The RFC documents the proposal and the feedback thread; the ADR records the final decision with rationale synthesized from that thread. Once the ADR is Accepted, the RFC is marked CLOSED with a reference to the ADR number. The ADR becomes the canonical record; the RFC thread becomes archival evidence. The ADR's Context section should synthesize what the RFC thread contained — the alternatives raised by reviewers, the constraints that ruled them out, and the reasoning that shaped the final call.

What happens to the RFC once the ADR is written?

Mark the RFC closed with a reference to the ADR: "Status: ACCEPTED — see ADR-0042." If the RFC was a PR, add the ADR number to the PR description before merging. If it was a Google Doc or Notion page, update the status header. Do not delete the RFC — the feedback thread contains the deliberation history that explains why the ADR reads the way it does. Teams that delete RFCs after writing ADRs lose the evidence of why alternatives were rejected, making the ADR's Context section harder to audit and harder to extend when the decision needs re-evaluation.

Further reading