Skip to content

Request for Changes (RFC) Process

Overview

A Request for Changes (RFC) is a structured proposal process used to introduce, discuss, and approve significant technical or architectural changes in a project or organization. The RFC process provides a transparent, reviewable, and documented path for evolving systems, APIs, or policies while ensuring stakeholder alignment and technical rigor.

RFC processes are commonly used in open-source projects, platform teams, and large engineering organizations to coordinate changes that affect multiple components, contributors, or external users.

Typical use cases include:

(1) Introducing new features or APIs (2) Changing architecture or core abstractions (3) Deprecating or removing existing functionality (4) Defining policies, conventions, or technical standards

The scope of an RFC process is generally project-wide or organization-wide and is applicable to any change that requires consensus, documentation, or long-term maintainability.

Core Concepts and Components

RFC Roles and Responsibilities

Component Description Typical Owner
Author Proposes the change and writes the RFC document Engineer or team proposing the change
Reviewer Provides technical feedback and evaluates the proposal Maintainers or domain experts
Maintainer Oversees the process and makes final decisions Core team or project leads
Stakeholders Affected teams or users who provide input Internal teams or community members

RFC Document Structure

While the exact structure varies by project, most RFCs contain the following sections:

Section Purpose
Summary Short description of the proposed change
Motivation Problem being solved and why the change is needed
Detailed Design Technical specification of the solution
Drawbacks Trade-offs and potential disadvantages
Alternatives Other approaches considered
Unresolved Questions Open issues requiring further discussion

Change Types Typically Requiring an RFC

This section lists common categories of changes that typically require an RFC. These changes usually have cross-team impact, long-term architectural consequences, or affect public interfaces.

Change Type Requires RFC Reason
Public API changes Yes Affects external users and compatibility
Core architecture modifications Yes Impacts multiple components
Tool or package promotion or replacement Yes Changes standard dependencies, workflows, or development conventions across teams
Internal refactoring Usually no Limited scope and low external impact
Bug fixes No Restores intended behavior
Experimental features Sometimes Depends on scope and stability goals

Execution Flow

The RFC workflow defines how a proposal moves from idea to accepted or rejected change. This flow is triggered when a contributor identifies a change that affects public interfaces, architecture, or project policies, and it results in a documented decision and implementation plan.

(1) Identify the need for a change

  • Author determines that the change is significant enough to require formal review.

(2) Draft the RFC document

  • Author prepares the proposal using the project’s RFC template.
  • The document includes motivation, design, and trade-offs.

(3) Submit the RFC for review

  • The proposal is opened as a pull request or similar review artifact.
  • Reviewers and stakeholders provide feedback.

(4) Discussion and iteration

  • Author updates the RFC based on comments and technical concerns.
  • Design alternatives may be explored.

(5) Decision by maintainers

  • Maintainers approve, request further changes, or reject the proposal.
  • The decision is documented in the RFC thread.

(6) Merge or close the RFC

  • Accepted RFCs are merged into the repository.
  • Rejected RFCs are closed with documented reasoning.

(7) Implementation phase

  • Author or assigned contributors implement the approved design.
  • Implementation typically references the accepted RFC.

Practical Usage Guidelines

When to Create an RFC

Use the RFC process when:

(1) The change modifies public APIs or protocols (2) Multiple teams or subsystems are affected (3) The decision has long-term architectural impact (4) The change introduces new abstractions or conventions (5) A standard tool or package is being promoted, replaced, or deprecated across the organization

Decision checkpoint: Is an RFC required?

If the impact of a change is unclear, perform the following checks:

(1) Determine whether the change affects public or shared interfaces.
(2) Evaluate whether rollback would be difficult after deployment.
(3) Check if multiple teams or components depend on the behavior.
(4) If any condition is true, create an RFC before implementation.

Author Responsibilities

(1) Clearly define the problem and motivation (2) Provide a technically feasible design (3) Document trade-offs and alternatives (4) Respond to reviewer feedback promptly

Author readiness checklist

Before submitting an RFC:

(1) Confirm the problem statement is precise and measurable.
(2) Ensure the design is implementable with current constraints.
(3) Document at least one alternative approach.
(4) Identify affected components and stakeholders.

Maintainer Responsibilities

(1) Ensure proposals align with project goals (2) Facilitate constructive discussion (3) Make timely decisions to avoid process stalls (4) Document acceptance or rejection reasons

Inspiration

The RFC model is inspired by engineering practices used in large technology organizations and mature open-source communities. These organizations use RFC-style processes to provide a centralized, transparent, and reviewable mechanism for making technical decisions that affect multiple teams or long-term architecture.

Common characteristics of these processes include:

(1) A single repository or directory that stores all accepted proposals (2) Public discussion threads for technical review and feedback (3) Documented decision history for future reference (4) Clear ownership and approval mechanisms

Examples of organizations and projects using RFC-style processes:

(1) Rust language project — uses RFCs to evolve the language and standard library (2) PyTorch — uses RFCs for core framework changes and APIs (3) Kubernetes — uses KEPs (Kubernetes Enhancement Proposals) as a similar model (4) React — uses RFCs for major API and architectural decisions

Adopting an RFC process

When introducing an RFC process in an organization:

(1) Define what types of changes require an RFC.
(2) Create a standard RFC template.
(3) Establish clear maintainer or decision authority.
(4) Store all RFCs in a centralized, version-controlled repository.

Limitations and Edge Cases

(1) Process overhead

  • RFCs introduce review cycles that may slow small or urgent changes.

(2) Ambiguous scope

  • Teams may disagree on whether a change requires an RFC.

(3) Stalled proposals

  • Without clear ownership, RFCs may remain unresolved.

(4) Implementation drift

  • Approved RFCs may diverge from the final implementation if not enforced.

(5) Consensus vs. decision authority

  • Projects must define whether decisions are consensus-based or maintainer-driven.

Avoid using RFCs for trivial changes

Do not create RFCs for:

(1) Minor bug fixes
(2) Localized refactoring
(3) Changes with no external impact

Excessive RFC usage can slow development without improving decision quality.

Reference

(1) https://github.com/pytorch/rfcs (2) https://github.com/rust-lang/rfcs